Commit 8d4a74f6fd2bb1018bdc03e92dccbdf266a0183a
Merge branch 'master' into dev
Showing
11 changed files
with
194 additions
and
21 deletions
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
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
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
urbanops-server/src/main/resources/application.yaml