diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java index 90664a3..383e4e4 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/DeviceUserController.java @@ -40,19 +40,26 @@ public class DeviceUserController { @PostMapping("/create") @Operation(summary = "创建设备用户关系") - @PreAuthorize("@ss.hasPermission('garden:device-user:create')") + // @PreAuthorize("@ss.hasPermission('garden:device-user:create')") public CommonResult createDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO createReqVO) { return success(deviceUserService.createDeviceUser(createReqVO)); } - @PutMapping("/update") + @PutMapping("/update/device") @Operation(summary = "更新设备用户关系") - @PreAuthorize("@ss.hasPermission('garden:device-user:update')") - public CommonResult updateDeviceUser(@Valid @RequestBody DeviceUserSaveReqVO updateReqVO) { - deviceUserService.updateDeviceUser(updateReqVO); + //@PreAuthorize("@ss.hasPermission('garden:device-user:update')") + public CommonResult updateDevice(@Valid @RequestBody DeviceUserUpdateReqVO updateReqVO) { + deviceUserService.updateDevice(updateReqVO); return success(true); } + @GetMapping("/get/device_no") + @Operation(summary = "通过设备编码获取设备绑定信息") + public CommonResult getDeviceUserByDeviceNo(@RequestParam("device_no") @NotBlank String deviceNo) { + DeviceUserRespVO deviceUser = deviceUserService.getDeviceUserByDeviceNo(deviceNo); + return success(deviceUser); + } + @DeleteMapping("/delete") @Operation(summary = "删除设备用户关系") @Parameter(name = "id", description = "编号", required = true) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java index 6930a85..85db1a6 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java @@ -50,6 +50,17 @@ public class DeviceDeptTreeRespVO { * 节点类型:1部门 3设备 */ private Integer nodeType; + + /** + * 节点类型为设备时,该值有值 + * 产品名称 + */ + private String productName; + /** + * 节点类型为设备时,该值有值 + * 产品编码 + */ + private String productCode; /** * 子节点,和当前一样的结构 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java index dc6b20e..002d604 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserSaveReqVO.java @@ -35,8 +35,10 @@ public class DeviceUserSaveReqVO { @Data public static class DeviceInfoDO { + + private String productCode; + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") - @NotEmpty(message = "产品名称不能为空") private String productName; @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED) diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java new file mode 100644 index 0000000..5f7b9e0 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceUserUpdateReqVO.java @@ -0,0 +1,42 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; + +import java.util.List; + +@Schema(description = "管理后台 - 设备用户关系新增/修改 Request VO") +@Data +public class DeviceUserUpdateReqVO { + + @Schema(description = "设备信息") + @NotNull + @Size(min = 1, message = "道路信息不能为空") + @Valid + private List deviceInfoList; + + @Data + public static class DeviceInfoDO { + @Schema(description = "产品名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "产品名称不能为空") + private String productName; + + @Schema(description = "设备标识", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "设备标识不能为空") + private String deviceNo; + + @Schema(description = "设备名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三") + @NotEmpty(message = "设备名称不能为空") + private String deviceName; + + @Schema(description = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "连接状态 : 在线:ONLINE || 离线:OFFLINE || 未连接:INIT") + private String deviceState; + + } + +} \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java index 5abf0bb..6db3ef1 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/dal/dataobject/deviceuser/DeviceUserDO.java +++ b/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 { * 提交人用户 */ private String userName; + + private String productCode; /** * 产品名称 */ diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java index 61bd36a..5cfd74b 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserService.java @@ -5,10 +5,6 @@ import jakarta.validation.*; import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.*; import com.zteits.urbanops.module.garden.dal.dataobject.deviceuser.DeviceUserDO; import com.zteits.urbanops.framework.common.pojo.PageResult; -import com.zteits.urbanops.framework.common.pojo.PageParam; -import jakarta.validation.constraints.NotNull; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; /** * 设备用户关系 Service 接口 @@ -78,4 +74,18 @@ public interface DeviceUserService { */ DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO); + /** + * IOT更新设备信息 + * + * @param updateReqVO 更新信息 + * @return 更新结果 + */ + Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO); + + /** + * 通过设备编码查询对象 + * @return 设备用户关系树 + */ + DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo); + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java index 49899c4..9dd92ad 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/deviceuser/DeviceUserServiceImpl.java +++ b/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; import cn.hutool.core.collection.CollectionUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.garden.util.DeviceDeptTreeUtils; import com.zteits.urbanops.module.garden.util.http.OkHttpClientUtil; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import jakarta.annotation.Resource; +import org.springframework.util.StringUtils; import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; @@ -49,20 +51,21 @@ public class DeviceUserServiceImpl implements DeviceUserService { DeviceUserDO deviceUser = new DeviceUserDO(); deviceUser.setDeviceNo(deviceInfo.getDeviceNo()); deviceUser.setDeviceName(deviceInfo.getDeviceName()); + deviceUser.setProductCode(deviceInfo.getProductCode()); deviceUser.setProductName(deviceInfo.getProductName()); deviceUser.setCompanyId(createReqVO.getCompanyId()); deviceUser.setDeptId(createReqVO.getDeptId()); deviceUser.setUserId(Long.parseLong(userId)); deviceUser.setUserName(userName); - deviceUser.setCreateTime( now); + deviceUser.setCreateTime(now); deviceUser.setCreator(userId); deviceUser.setCreatorName(userName); deviceUser.setUpdater(userId); - deviceUser.setUpdateTime( now); + deviceUser.setUpdateTime(now); list.add(deviceUser); }); // 插入 - deviceUserMapper.insert( list); + deviceUserMapper.insert(list); return 1L; } @@ -84,10 +87,10 @@ public class DeviceUserServiceImpl implements DeviceUserService { } @Override - public void deleteDeviceUserListByIds(List ids) { + public void deleteDeviceUserListByIds(List ids) { // 删除 deviceUserMapper.deleteByIds(ids); - } + } private void validateDeviceUserExists(Long id) { @@ -118,19 +121,19 @@ public class DeviceUserServiceImpl implements DeviceUserService { params.put("deviceName", reqVO.getDeviceName()); params.put("deviceDeptName", reqVO.getDeviceDeptName()); String json = OkHttpClientUtil.doPostJson(iotHost + "/deviceApi/findDeviceDeptTree", params); - JSONObject jsonObject =JSONObject.parseObject(json); - if(!jsonObject.getInteger("code").equals(200)){ + JSONObject jsonObject = JSONObject.parseObject(json); + if (!jsonObject.getInteger("code").equals(200)) { return null; } List deviceDeptTreeList = JSONArray.parseArray(jsonObject.getString("data"), DeviceDeptTreeRespVO.class); - if(CollectionUtil.isEmpty(deviceDeptTreeList)){ + if (CollectionUtil.isEmpty(deviceDeptTreeList)) { return null; } //获取所有已绑定设备列表 List list = deviceUserMapper.selectList(); - if(CollectionUtil.isEmpty(list)){ - return deviceDeptTreeList.get(0); + if (CollectionUtil.isEmpty(list)) { + return deviceDeptTreeList.get(0); } List deviceNos = list.stream().map(deviceUserDO -> deviceUserDO.getDeviceNo()).collect(Collectors.toList()); // @@ -138,4 +141,32 @@ public class DeviceUserServiceImpl implements DeviceUserService { return deviceDeptTreeList.get(0); } + @Override + public Boolean updateDevice(DeviceUserUpdateReqVO updateReqVO) { + updateReqVO.getDeviceInfoList().forEach(deviceInfo -> { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.lambda().set(!StringUtils.isEmpty(deviceInfo.getProductName()), DeviceUserDO::getProductName, deviceInfo.getProductName()) + .set(!StringUtils.isEmpty(deviceInfo.getDeviceName()), DeviceUserDO::getDeviceName, deviceInfo.getDeviceName()) + .set(!StringUtils.isEmpty(deviceInfo.getDeviceState()), DeviceUserDO::getDeviceState, deviceInfo.getDeviceState()) + .eq(DeviceUserDO::getDeviceNo, deviceInfo.getDeviceNo()); + deviceUserMapper.update(updateWrapper); + }); + + return true; + } + + @Override + public DeviceUserRespVO getDeviceUserByDeviceNo(String deviceNo) { + QueryWrapper query = new QueryWrapper<>(); + query.lambda().eq(DeviceUserDO::getDeviceNo, deviceNo); + List list = deviceUserMapper.selectList(query); + if (CollectionUtil.isEmpty(list)) { + return null; + } + + DeviceUserRespVO deviceUserRes = new DeviceUserRespVO(); + BeanUtils.copyProperties(list.get(0), deviceUserRes); + return deviceUserRes; + } + } \ No newline at end of file diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java index 45973ba..0ea13d0 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptService.java @@ -158,4 +158,10 @@ public interface DeptService { * @return */ List getDeptAllList(); + /** + * 获取部门父级部门id(公司) + * @param deptId + * @return + */ + Long getParentDeptId(Long deptId); } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java index 3bbcabe..f12767c 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/service/dept/DeptServiceImpl.java @@ -51,6 +51,7 @@ public class DeptServiceImpl implements DeptService { @Resource private AdminUserMapper userMapper; + @Override @CacheEvict(cacheNames = RedisKeyConstants.DEPT_CHILDREN_ID_LIST, allEntries = true) // allEntries 清空所有缓存,因为操作一个部门,涉及到多个缓存 @@ -318,6 +319,7 @@ public class DeptServiceImpl implements DeptService { UserDO userDO = new UserDO(); userDO.setUserId(adminUserDO.getId()); userDO.setUsername(adminUserDO.getUsername()); + userDO.setCompanyId(getParentDeptId(adminUserDO.getDeptId())); userDO.setDeptId(adminUserDO.getDeptId()); userDOList.add(userDO); } @@ -336,4 +338,61 @@ public class DeptServiceImpl implements DeptService { sql.lambda().eq(DeptDO::getDeleted, 0); return deptMapper.selectList(sql); } + + @Override + public Long getParentDeptId(Long deptId) { + if (deptId == null) { + return null; + } + + DeptDO dept = getDept(deptId); + if (dept == null) { + return null; + } + + // 顶级部门ID (parentId=0) + if (dept.getParentId().equals(0L)) { + return dept.getId(); + } + + // 直接是二级部门 (parentId=100) + if (dept.getParentId().equals(100L)) { + return dept.getId(); + } + + // 递归查找父部门链中parentId=100的部门 + Long result = findParentDeptWithParentId(dept.getParentId(), 100L); + // 如果找不到parentId=100的部门,返回当前部门的id作为默认值 + return result != null ? result : dept.getParentId(); + } + + /** + * 递归查找父部门链中parentId等于目标值的部门ID + * @param currentDeptId 当前部门ID + * @param targetParentId 目标parentId + * @return 匹配的部门ID,无则返回null + */ + private Long findParentDeptWithParentId(Long currentDeptId, Long targetParentId) { + if (currentDeptId == null) { + return null; + } + + DeptDO dept = getDept(currentDeptId); + if (dept == null) { + return null; + } + + // 找到目标父部门 + if (dept.getParentId().equals(targetParentId)) { + return dept.getId(); + } + + // 达到顶级部门,停止递归 + if (dept.getParentId().equals(0L)) { + return dept.getId(); // 改为返回顶级部门ID,而不是null + } + + // 继续向上查找 + return findParentDeptWithParentId(dept.getParentId(), targetParentId); + } } diff --git a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java index 6c4de34..eaf3837 100644 --- a/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java +++ b/urbanops-module-system/src/main/java/com/zteits/urbanops/module/system/util/tree/UserDO.java @@ -10,4 +10,6 @@ public class UserDO { private String username; private Long deptId; + + private Long companyId; } diff --git a/urbanops-server/src/main/resources/application.yaml b/urbanops-server/src/main/resources/application.yaml index 6773c11..edb43f9 100644 --- a/urbanops-server/src/main/resources/application.yaml +++ b/urbanops-server/src/main/resources/application.yaml @@ -271,6 +271,7 @@ urbanops: security: permit-all_urls: - /admin-api/mp/open/** # 微信公众号开放平台,微信回调接口,不需要登录 + - /admin-api/garden/device-user/** api-encrypt: enable: true # 是否开启 API 加密 algorithm: AES # 加密算法,支持 AES、RSA 等