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 c20e690..90664a3 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 @@ -102,4 +102,14 @@ public class DeviceUserController { BeanUtils.toBean(list, DeviceUserRespVO.class)); } + @PostMapping("/findDeviceDeptTree") + @Operation(summary = "获取IOT设备tree") + //@PreAuthorize("@ss.hasPermission('garden:device-user:query')") + public CommonResult findDeviceDeptTree(@Valid @RequestBody DeviceDeptTreeReqVO reqVO) { + DeviceDeptTreeRespVO deviceUser = deviceUserService.findDeviceDeptTree(reqVO); + return success(deviceUser); + } + + + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java new file mode 100644 index 0000000..b78db76 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeReqVO.java @@ -0,0 +1,24 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Schema(description = "管理后台 - IOT设备") +@Data +public class DeviceDeptTreeReqVO { + + /** + * 设备编码 精确查询 + */ + private String deviceCode; + + /** + * 设备名称 模糊查询 + */ + private String deviceName; + + /** + * 设备归属部门名称 模糊查询 + */ + private String deviceDeptName; +} 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 new file mode 100644 index 0000000..6930a85 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/deviceuser/vo/DeviceDeptTreeRespVO.java @@ -0,0 +1,57 @@ +package com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo; + + +import lombok.Data; +import java.util.Date; +import java.util.List; + +/** + * 设备部门树响应数据 + * + * @author your-name + * @since 2023-xx-xx + */ +@Data +public class DeviceDeptTreeRespVO { + + /** + * 编码 + */ + private String code; + + /** + * 名称 + */ + private String name; + /** + * 父编码 + */ + private String parentCode; + /** + * 显示顺序 + */ + private Integer orderNum; + + /** + * 部门状态(0正常 1停用) + */ + private String status; + + /** + * 设备数量 + */ + private Integer deviceCount; + + /** + * 创建时间 + */ + private Date createTime; + /** + * 节点类型:1部门 3设备 + */ + private Integer nodeType; + /** + * 子节点,和当前一样的结构 + */ + private List children; +} 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 6cdb73c..61bd36a 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 @@ -7,6 +7,7 @@ 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; /** @@ -69,4 +70,12 @@ public interface DeviceUserService { */ Integer deleteDeviceUser(Long userId, String deviceNo); + /** + * 获得设备用户关系树-从iot + * + * @param reqVO 树查询 + * @return 设备用户关系树 + */ + DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO); + } \ 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 c4b62ec..49899c4 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 @@ -1,7 +1,12 @@ package com.zteits.urbanops.module.garden.service.deviceuser; -import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; 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.validation.annotation.Validated; @@ -9,18 +14,15 @@ import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.*; +import java.util.stream.Collectors; + 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 com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.module.garden.dal.mysql.deviceuser.DeviceUserMapper; -import static com.zteits.urbanops.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.convertList; -import static com.zteits.urbanops.framework.common.util.collection.CollectionUtils.diffList; -import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; /** * 设备用户关系 Service 实现类 @@ -31,6 +33,9 @@ import static com.zteits.urbanops.module.garden.enums.ErrorCodeConstants.*; @Validated public class DeviceUserServiceImpl implements DeviceUserService { + @Value("${urbanops.iot.device.host}") + private String iotHost; + @Resource private DeviceUserMapper deviceUserMapper; @@ -106,4 +111,31 @@ public class DeviceUserServiceImpl implements DeviceUserService { return deviceUserMapper.deleteDeviceUser(userId, deviceNo); } + @Override + public DeviceDeptTreeRespVO findDeviceDeptTree(DeviceDeptTreeReqVO reqVO) { + Map params = new HashMap<>(); + params.put("deviceCode", reqVO.getDeviceCode()); + 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)){ + return null; + } + + List deviceDeptTreeList = JSONArray.parseArray(jsonObject.getString("data"), DeviceDeptTreeRespVO.class); + if(CollectionUtil.isEmpty(deviceDeptTreeList)){ + return null; + } + //获取所有已绑定设备列表 + List list = deviceUserMapper.selectList(); + if(CollectionUtil.isEmpty(list)){ + return deviceDeptTreeList.get(0); + } + List deviceNos = list.stream().map(deviceUserDO -> deviceUserDO.getDeviceNo()).collect(Collectors.toList()); + // + DeviceDeptTreeUtils.removeDevicesByCodes(deviceDeptTreeList, deviceNos); + return deviceDeptTreeList.get(0); + } + } \ No newline at end of file diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java new file mode 100644 index 0000000..f125384 --- /dev/null +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/util/DeviceDeptTreeUtils.java @@ -0,0 +1,86 @@ +package com.zteits.urbanops.module.garden.util; + +import com.zteits.urbanops.module.garden.controller.admin.deviceuser.vo.DeviceDeptTreeRespVO; + +import java.util.*; + +public class DeviceDeptTreeUtils { + + + /** + * 批量删除指定codes的设备节点 + * + * @param treeNodes 树节点列表 + * @param codes 待删除的设备编码列表 + * @return 删除成功的设备数量 + */ + public static int removeDevicesByCodes(List treeNodes, List codes) { + if (treeNodes == null || treeNodes.isEmpty() || codes == null || codes.isEmpty()) { + return 0; + } + + Set codeSet = new HashSet<>(codes); // 转换为Set提高查找效率 + return removeDevicesInternal(treeNodes, codeSet); + } + + /** + * 内部递归删除方法 + */ + private static int removeDevicesInternal(List treeNodes, Set codeSet) { + if (treeNodes == null || treeNodes.isEmpty()) { + return 0; + } + + int removedCount = 0; + Iterator iterator = treeNodes.iterator(); + while (iterator.hasNext()) { + DeviceDeptTreeRespVO node = iterator.next(); + + // 检查当前节点是否需要删除(是设备节点且code在待删除列表中) + if (node.getNodeType() != null && node.getNodeType() == 3 && + codeSet.contains(node.getCode())) { + iterator.remove(); + removedCount++; + } else { + // 递归处理子节点 + if (node.getChildren() != null) { + removedCount += removeDevicesInternal(node.getChildren(), codeSet); + } + } + } + + return removedCount; + } + + /** + * 获取所有设备节点 + */ + public static List getAllDevices(List treeNodes) { + List devices = new ArrayList<>(); + collectDevices(treeNodes, devices); + return devices; + } + + /** + * 递归收集所有设备节点 + */ + private static void collectDevices(List nodes, List devices) { + if (nodes == null || nodes.isEmpty()) { + return; + } + + for (DeviceDeptTreeRespVO node : nodes) { + // 如果是设备节点,添加到结果列表 + if (node.getNodeType() != null && node.getNodeType() == 3) { + devices.add(node); + } + + // 递归处理子节点 + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + collectDevices(node.getChildren(), devices); + } + } + } + +} + diff --git a/urbanops-server/src/main/resources/application.yaml b/urbanops-server/src/main/resources/application.yaml index 2cfeef0..bcdb079 100644 --- a/urbanops-server/src/main/resources/application.yaml +++ b/urbanops-server/src/main/resources/application.yaml @@ -348,5 +348,8 @@ urbanops: iot: message-bus: type: redis # 消息总线的类型 + device: + host: https://iot.jichengshanshui.com.cn:28202/prod-api/link debug: false +