Commit 8d4a74f6fd2bb1018bdc03e92dccbdf266a0183a

Authored by wangqian
2 parents 4d9f8fcd 4c89ace6

Merge branch 'master' into dev

urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java
... ... @@ -40,19 +40,26 @@ public class DeviceUserController {
40 40  
41 41 @PostMapping("/create")
42 42 @Operation(summary = "创建设备用户关系")
43   - @PreAuthorize("@ss.hasPermission('garden:device-user:create')")
  43 + // @PreAuthorize("@ss.hasPermission('garden:device-user:create')")
44 44 public CommonResult<Long> createDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO createReqVO) {
45 45 return success(deviceUserService.createDeviceUser(createReqVO));
46 46 }
47 47  
48   - @PutMapping("/update")
  48 + @PutMapping("/update/device")
49 49 @Operation(summary = "更新设备用户关系")
50   - @PreAuthorize("@ss.hasPermission('garden:device-user:update')")
51   - public CommonResult<Boolean> updateDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO updateReqVO) {
52   - deviceUserService.updateDeviceUser(updateReqVO);
  50 + //@PreAuthorize("@ss.hasPermission('garden:device-user:update')")
  51 + public CommonResult<Boolean> updateDevice(@Valid @RequestBody DeviceUserUpdateReqVO updateReqVO) {
  52 + deviceUserService.updateDevice(updateReqVO);
53 53 return success(true);
54 54 }
55 55  
  56 + @GetMapping("/get/device_no")
  57 + @Operation(summary = "通过设备编码获取设备绑定信息")
  58 + public CommonResult<DeviceUserRespVO> getDeviceUserByDeviceNo(@RequestParam("device_no") @NotBlank String deviceNo) {
  59 + DeviceUserRespVO deviceUser = deviceUserService.getDeviceUserByDeviceNo(deviceNo);
  60 + return success(deviceUser);
  61 + }
  62 +
56 63 @DeleteMapping("/delete")
57 64 @Operation(summary = "删除设备用户关系")
58 65 @Parameter(name = "id", description = "编号", required = true)
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java
... ... @@ -50,6 +50,17 @@ public class DeviceDeptTreeRespVO {
50 50 * 节点类型:1部门 3设备
51 51 */
52 52 private Integer nodeType;
  53 +
  54 + /**
  55 + * 节点类型为设备时,该值有值
  56 + * 产品名称
  57 + */
  58 + private String productName;
  59 + /**
  60 + * 节点类型为设备时,该值有值
  61 + * 产品编码
  62 + */
  63 + private String productCode;
53 64 /**
54 65 * 子节点,和当前一样的结构
55 66 */
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java
... ... @@ -35,8 +35,10 @@ public class DeviceUserSaveReqVO {
35 35  
36 36 @Data
37 37 public static class DeviceInfoDO {
  38 +
  39 + private String productCode;
  40 +
38 41 @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
39   - @NotEmpty(message = "产品名称不能为空")
40 42 private String productName;
41 43  
42 44 @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED)
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java 0 → 100644
  1 +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import jakarta.validation.Valid;
  5 +import jakarta.validation.constraints.NotEmpty;
  6 +import jakarta.validation.constraints.NotNull;
  7 +import jakarta.validation.constraints.Size;
  8 +import lombok.Data;
  9 +
  10 +import java.util.List;
  11 +
  12 +@Schema(description = "管理后台 - 设备用户关系新增/修改 Request VO")
  13 +@Data
  14 +public class DeviceUserUpdateReqVO {
  15 +
  16 + @Schema(description = "设备信息")
  17 + @NotNull
  18 + @Size(min = 1, message = "道路信息不能为空")
  19 + @Valid
  20 + private List<DeviceUserSaveReqVO.DeviceInfoDO> deviceInfoList;
  21 +
  22 + @Data
  23 + public static class DeviceInfoDO {
  24 + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
  25 + @NotEmpty(message = "产品名称不能为空")
  26 + private String productName;
  27 +
  28 + @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED)
  29 + @NotEmpty(message = "设备标识不能为空")
  30 + private String deviceNo;
  31 +
  32 + @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
  33 + @NotEmpty(message = "设备名称不能为空")
  34 + private String deviceName;
  35 +
  36 + @Schema(description = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT", requiredMode = Schema.RequiredMode.REQUIRED)
  37 + @NotEmpty(message = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT")
  38 + private String deviceState;
  39 +
  40 + }
  41 +
  42 +}
0 43 \ No newline at end of file
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java
... ... @@ -43,6 +43,8 @@ public class DeviceUserDO extends BaseDO {
43 43 * 提交人用户
44 44 */
45 45 private String userName;
  46 +
  47 + private String productCode;
46 48 /**
47 49 * 产品名称
48 50 */
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java
... ... @@ -5,10 +5,6 @@ import jakarta.validation.*;
5 5 import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.*;
6 6 import com.zteits.urbanops.module.garden.dal.dataobject.deviceuser.DeviceUserDO;
7 7 import com.zteits.urbanops.framework.common.pojo.PageResult;
8   -import com.zteits.urbanops.framework.common.pojo.PageParam;
9   -import jakarta.validation.constraints.NotNull;
10   -import org.springframework.web.bind.annotation.RequestBody;
11   -import org.springframework.web.bind.annotation.RequestParam;
12 8  
13 9 /**
14 10 * 设备用户关系 Service 接口
... ... @@ -78,4 +74,18 @@ public interface DeviceUserService {
78 74 */
79 75 DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO);
80 76  
  77 + /**
  78 + * IOT更新设备信息
  79 + *
  80 + * @param updateReqVO 更新信息
  81 + * @return 更新结果
  82 + */
  83 + Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO);
  84 +
  85 + /**
  86 + * 通过设备编码查询对象
  87 + * @return 设备用户关系树
  88 + */
  89 + DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo);
  90 +
81 91 }
82 92 \ No newline at end of file
... ...
urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java
... ... @@ -3,14 +3,16 @@ package com.zteits.urbanops.module.garden.service.deviceuser;
3 3 import cn.hutool.core.collection.CollectionUtil;
4 4 import com.alibaba.fastjson.JSONArray;
5 5 import com.alibaba.fastjson.JSONObject;
  6 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7 +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
6 8 import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils;
7 9 import com.zteits.urbanops.module.garden.util.DeviceDeptTreeUtils;
8 10 import com.zteits.urbanops.module.garden.util.http.OkHttpClientUtil;
9 11 import org.springframework.beans.factory.annotation.Value;
10 12 import org.springframework.stereotype.Service;
11 13 import jakarta.annotation.Resource;
  14 +import org.springframework.util.StringUtils;
12 15 import org.springframework.validation.annotation.Validated;
13   -import org.springframework.transaction.annotation.Transactional;
14 16  
15 17 import java.time.LocalDateTime;
16 18 import java.util.*;
... ... @@ -49,20 +51,21 @@ public class DeviceUserServiceImpl implements DeviceUserService {
49 51 DeviceUserDO deviceUser = new DeviceUserDO();
50 52 deviceUser.setDeviceNo(deviceInfo.getDeviceNo());
51 53 deviceUser.setDeviceName(deviceInfo.getDeviceName());
  54 + deviceUser.setProductCode(deviceInfo.getProductCode());
52 55 deviceUser.setProductName(deviceInfo.getProductName());
53 56 deviceUser.setCompanyId(createReqVO.getCompanyId());
54 57 deviceUser.setDeptId(createReqVO.getDeptId());
55 58 deviceUser.setUserId(Long.parseLong(userId));
56 59 deviceUser.setUserName(userName);
57   - deviceUser.setCreateTime( now);
  60 + deviceUser.setCreateTime(now);
58 61 deviceUser.setCreator(userId);
59 62 deviceUser.setCreatorName(userName);
60 63 deviceUser.setUpdater(userId);
61   - deviceUser.setUpdateTime( now);
  64 + deviceUser.setUpdateTime(now);
62 65 list.add(deviceUser);
63 66 });
64 67 // 插入
65   - deviceUserMapper.insert( list);
  68 + deviceUserMapper.insert(list);
66 69 return 1L;
67 70 }
68 71  
... ... @@ -84,10 +87,10 @@ public class DeviceUserServiceImpl implements DeviceUserService {
84 87 }
85 88  
86 89 @Override
87   - public void deleteDeviceUserListByIds(List<Long> ids) {
  90 + public void deleteDeviceUserListByIds(List<Long> ids) {
88 91 // 删除
89 92 deviceUserMapper.deleteByIds(ids);
90   - }
  93 + }
91 94  
92 95  
93 96 private void validateDeviceUserExists(Long id) {
... ... @@ -118,19 +121,19 @@ public class DeviceUserServiceImpl implements DeviceUserService {
118 121 params.put("deviceName", reqVO.getDeviceName());
119 122 params.put("deviceDeptName", reqVO.getDeviceDeptName());
120 123 String json = OkHttpClientUtil.doPostJson(iotHost + "/deviceApi/findDeviceDeptTree", params);
121   - JSONObject jsonObject =JSONObject.parseObject(json);
122   - if(!jsonObject.getInteger("code").equals(200)){
  124 + JSONObject jsonObject = JSONObject.parseObject(json);
  125 + if (!jsonObject.getInteger("code").equals(200)) {
123 126 return null;
124 127 }
125 128  
126 129 List<DeviceDeptTreeRespVO> deviceDeptTreeList = JSONArray.parseArray(jsonObject.getString("data"), DeviceDeptTreeRespVO.class);
127   - if(CollectionUtil.isEmpty(deviceDeptTreeList)){
  130 + if (CollectionUtil.isEmpty(deviceDeptTreeList)) {
128 131 return null;
129 132 }
130 133 //获取所有已绑定设备列表
131 134 List<DeviceUserDO> list = deviceUserMapper.selectList();
132   - if(CollectionUtil.isEmpty(list)){
133   - return deviceDeptTreeList.get(0);
  135 + if (CollectionUtil.isEmpty(list)) {
  136 + return deviceDeptTreeList.get(0);
134 137 }
135 138 List<String> deviceNos = list.stream().map(deviceUserDO -> deviceUserDO.getDeviceNo()).collect(Collectors.toList());
136 139 //
... ... @@ -138,4 +141,32 @@ public class DeviceUserServiceImpl implements DeviceUserService {
138 141 return deviceDeptTreeList.get(0);
139 142 }
140 143  
  144 + @Override
  145 + public Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO) {
  146 + updateReqVO.getDeviceInfoList().forEach(deviceInfo -> {
  147 + UpdateWrapper<DeviceUserDO> updateWrapper = new UpdateWrapper<>();
  148 + updateWrapper.lambda().set(!StringUtils.isEmpty(deviceInfo.getProductName()), DeviceUserDO::getProductName, deviceInfo.getProductName())
  149 + .set(!StringUtils.isEmpty(deviceInfo.getDeviceName()), DeviceUserDO::getDeviceName, deviceInfo.getDeviceName())
  150 + .set(!StringUtils.isEmpty(deviceInfo.getDeviceState()), DeviceUserDO::getDeviceState, deviceInfo.getDeviceState())
  151 + .eq(DeviceUserDO::getDeviceNo, deviceInfo.getDeviceNo());
  152 + deviceUserMapper.update(updateWrapper);
  153 + });
  154 +
  155 + return true;
  156 + }
  157 +
  158 + @Override
  159 + public DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo) {
  160 + QueryWrapper<DeviceUserDO> query = new QueryWrapper<>();
  161 + query.lambda().eq(DeviceUserDO::getDeviceNo, deviceNo);
  162 + List<DeviceUserDO> list = deviceUserMapper.selectList(query);
  163 + if (CollectionUtil.isEmpty(list)) {
  164 + return null;
  165 + }
  166 +
  167 + DeviceUserRespVO deviceUserRes = new DeviceUserRespVO();
  168 + BeanUtils.copyProperties(list.get(0), deviceUserRes);
  169 + return deviceUserRes;
  170 + }
  171 +
141 172 }
142 173 \ No newline at end of file
... ...
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java
... ... @@ -158,4 +158,10 @@ public interface DeptService {
158 158 * @return
159 159 */
160 160 List<DeptDO> getDeptAllList();
  161 + /**
  162 + * 获取部门父级部门id(公司)
  163 + * @param deptId
  164 + * @return
  165 + */
  166 + Long getParentDeptId(Long deptId);
161 167 }
... ...
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java
... ... @@ -51,6 +51,7 @@ public class DeptServiceImpl implements DeptService {
51 51 @Resource
52 52 private AdminUserMapper userMapper;
53 53  
  54 +
54 55 @Override
55 56 @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST,
56 57 allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存
... ... @@ -318,6 +319,7 @@ public class DeptServiceImpl implements DeptService {
318 319 UserDO userDO = new UserDO();
319 320 userDO.setUserId(adminUserDO.getId());
320 321 userDO.setUsername(adminUserDO.getUsername());
  322 + userDO.setCompanyId(getParentDeptId(adminUserDO.getDeptId()));
321 323 userDO.setDeptId(adminUserDO.getDeptId());
322 324 userDOList.add(userDO);
323 325 }
... ... @@ -336,4 +338,61 @@ public class DeptServiceImpl implements DeptService {
336 338 sql.lambda().eq(DeptDO::getDeleted, 0);
337 339 return deptMapper.selectList(sql);
338 340 }
  341 +
  342 + @Override
  343 + public Long getParentDeptId(Long deptId) {
  344 + if (deptId == null) {
  345 + return null;
  346 + }
  347 +
  348 + DeptDO dept = getDept(deptId);
  349 + if (dept == null) {
  350 + return null;
  351 + }
  352 +
  353 + // 顶级部门ID (parentId=0)
  354 + if (dept.getParentId().equals(0L)) {
  355 + return dept.getId();
  356 + }
  357 +
  358 + // 直接是二级部门 (parentId=100)
  359 + if (dept.getParentId().equals(100L)) {
  360 + return dept.getId();
  361 + }
  362 +
  363 + // 递归查找父部门链中parentId=100的部门
  364 + Long result = findParentDeptWithParentId(dept.getParentId(), 100L);
  365 + // 如果找不到parentId=100的部门,返回当前部门的id作为默认值
  366 + return result != null ? result : dept.getParentId();
  367 + }
  368 +
  369 + /**
  370 + * 递归查找父部门链中parentId等于目标值的部门ID
  371 + * @param currentDeptId 当前部门ID
  372 + * @param targetParentId 目标parentId
  373 + * @return 匹配的部门ID,无则返回null
  374 + */
  375 + private Long findParentDeptWithParentId(Long currentDeptId, Long targetParentId) {
  376 + if (currentDeptId == null) {
  377 + return null;
  378 + }
  379 +
  380 + DeptDO dept = getDept(currentDeptId);
  381 + if (dept == null) {
  382 + return null;
  383 + }
  384 +
  385 + // 找到目标父部门
  386 + if (dept.getParentId().equals(targetParentId)) {
  387 + return dept.getId();
  388 + }
  389 +
  390 + // 达到顶级部门,停止递归
  391 + if (dept.getParentId().equals(0L)) {
  392 + return dept.getId(); // 改为返回顶级部门ID,而不是null
  393 + }
  394 +
  395 + // 继续向上查找
  396 + return findParentDeptWithParentId(dept.getParentId(), targetParentId);
  397 + }
339 398 }
... ...
urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java
... ... @@ -10,4 +10,6 @@ public class UserDO {
10 10 private String username;
11 11  
12 12 private Long deptId;
  13 +
  14 + private Long companyId;
13 15 }
... ...
urbanops-server/src/main/resources/application.yaml
... ... @@ -271,6 +271,7 @@ urbanops:
271 271 security:
272 272 permit-all_urls:
273 273 - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录
  274 + - /admin-api/garden/device-user/**
274 275 api-encrypt:
275 276 enable: true # 是否开启 API 加密
276 277 algorithm: AES # 加密算法,支持 AES、RSA 等
... ...