ソースを参照

pms 保养维修BOM节点名称显示全路径

zhangcl 1 ヶ月 前
コミット
8142ff4b0c

+ 13 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotdevicebom/IotDeviceBomMapper.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.dal.mysql.iotdevicebom;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -11,7 +12,12 @@ import org.apache.ibatis.annotations.Delete;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
+import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 /**
  * PMS 设备BOM 关系 Mapper
@@ -51,6 +57,13 @@ public interface IotDeviceBomMapper extends BaseMapperX<IotDeviceBomDO> {
         return selectOne(IotDeviceBomDO::getId, reqVO.getParentId());
     }
 
+    default Map<Long, IotDeviceBomDO> selectNodeMapByIds(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) return Collections.emptyMap();
+        // 一次性查询所有节点
+        List<IotDeviceBomDO> nodes = selectList(new LambdaQueryWrapperX<IotDeviceBomDO>().in(IotDeviceBomDO::getId, ids));
+        return nodes.stream().collect(Collectors.toMap(IotDeviceBomDO::getId, Function.identity()));
+    }
+
     /**
      * 删除指定 deviceId 集合的设备BOM
      *

+ 36 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/IotDeviceServiceImpl.java

@@ -1,6 +1,7 @@
 package cn.iocoder.yudao.module.pms.service;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.common.exception.ServiceException;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -23,6 +24,7 @@ import cn.iocoder.yudao.module.pms.dal.mysql.IotTreeMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.TDDeviceMapper;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmodel.IotModelMapper;
 import cn.iocoder.yudao.module.pms.service.iotbom.IotBomService;
+import cn.iocoder.yudao.module.pms.service.iotdevicebom.IotDeviceBomService;
 import cn.iocoder.yudao.module.pms.service.yanfan.ThingsModelService;
 import cn.iocoder.yudao.module.pms.service.yanfan.YfDeviceService;
 import cn.iocoder.yudao.module.system.dal.dataobject.dict.DictDataDO;
@@ -81,6 +83,8 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     private RestTemplate restTemplate;
     @Value("${yanfan.url}")
     private String yanfanUrl;
+    @Autowired
+    private IotDeviceBomService iotDeviceBomService;
 
     @Override
     public List<IotDeviceDO> getMapDevice() {
@@ -343,6 +347,22 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     @Override
     public List<IotDeviceRespVO> deviceAssociateBomList(IotDevicePageReqVO pageReqVO) {
         List<IotDeviceRespVO> devices = iotDeviceMapper.deviceAssociateBomList(pageReqVO.getDeviceIds(), pageReqVO.getBomFlag());
+        // 查询所有 设备boms节点的所有上级节点名称 拼接出 全路径 的bom节点
+        List<Long> bomNodeIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(devices)) {
+            devices.forEach(device -> {
+                bomNodeIds.add(Long.valueOf(device.getBomNodeId()));
+            });
+            // 查询 bomNodeIds 集合中每个bom节点的所有上级节点
+            Map<Long, String> bomFullPaths = iotDeviceBomService.buildBomFullPaths(bomNodeIds);
+            devices.forEach(device -> {
+                if (bomFullPaths.containsKey(Long.valueOf(device.getBomNodeId()))) {
+                    if (StrUtil.isNotBlank(bomFullPaths.get(Long.valueOf(device.getBomNodeId())))) {
+                        device.setName(bomFullPaths.get(Long.valueOf(device.getBomNodeId())));
+                    }
+                }
+            });
+        }
         return devices;
     }
 
@@ -350,6 +370,22 @@ public class IotDeviceServiceImpl implements IotDeviceService {
     public PageResult<IotDeviceRespVO> deviceAssociateBomListPage(IotDevicePageReqVO pageReqVO) {
         IPage<IotDeviceRespVO> page = iotDeviceMapper.deviceAssociateBomListPage(new Page<>(pageReqVO.getPageNo(),
                 pageReqVO.getPageSize()), pageReqVO.getDeviceIds(), pageReqVO.getBomFlag());
+        // 查询所有 设备boms节点的所有上级节点名称 拼接出 全路径 的bom节点
+        List<Long> bomNodeIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(page.getRecords())) {
+            page.getRecords().forEach(device -> {
+                bomNodeIds.add(Long.valueOf(device.getBomNodeId()));
+            });
+            // 查询 bomNodeIds 集合中每个bom节点的所有上级节点
+            Map<Long, String> bomFullPaths = iotDeviceBomService.buildBomFullPaths(bomNodeIds);
+            page.getRecords().forEach(device -> {
+                if (bomFullPaths.containsKey(Long.valueOf(device.getBomNodeId()))) {
+                    if (StrUtil.isNotBlank(bomFullPaths.get(Long.valueOf(device.getBomNodeId())))) {
+                        device.setName(bomFullPaths.get(Long.valueOf(device.getBomNodeId())));
+                    }
+                }
+            });
+        }
         return new PageResult<>(page.getRecords(), page.getTotal());
     }
 

+ 8 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicebom/IotDeviceBomService.java

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.pms.dal.dataobject.iotdevicebom.IotDeviceBomDO;
 
 import javax.validation.Valid;
 import java.util.List;
+import java.util.Map;
 
 /**
  * PMS 设备BOM 关系 Service 接口
@@ -61,4 +62,11 @@ public interface IotDeviceBomService {
      * @return 设备bom 列表
      */
     List<IotDeviceBomDO> getDeviceBomList(IotDeviceBomListReqVO iotDeviceBomListReqVO);
+
+    /**
+     * 查询指定bom节点的所有父节点 拼接层级名称
+     * @param bomNodeIds
+     * @return
+     */
+    Map<Long, String> buildBomFullPaths(List<Long> bomNodeIds);
 }

+ 50 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotdevicebom/IotDeviceBomServiceImpl.java

@@ -1,5 +1,6 @@
 package cn.iocoder.yudao.module.pms.service.iotdevicebom;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
@@ -15,8 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
-import java.util.List;
+import java.util.*;
 
 import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant.IOT_DEVICE_BOM_NOT_EXISTS;
@@ -105,4 +105,52 @@ public class IotDeviceBomServiceImpl implements IotDeviceBomService {
         return list;
     }
 
+    @Override
+    public Map<Long, String> buildBomFullPaths(List<Long> bomNodeIds) {
+        // 1. 参数检查
+        if (CollUtil.isEmpty(bomNodeIds)) {
+            return Collections.emptyMap();
+        }
+
+        // 2. 批量查询所有相关节点(包括祖先)
+        Set<Long> allNodeIds = new HashSet<>();
+        Queue<Long> queue = new LinkedList<>(bomNodeIds);
+        allNodeIds.addAll(bomNodeIds);
+
+        // 递归收集父节点ID
+        while (!queue.isEmpty()) {
+            Long currentId = queue.poll();
+            IotDeviceBomDO node = iotDeviceBomMapper.selectById(currentId);
+            if (node == null) continue;
+
+            Long parentId = node.getParentId();
+            // 有效父节点且未遍历过
+            if (parentId != null && parentId > 0 && !allNodeIds.contains(parentId)) {
+                allNodeIds.add(parentId);
+                queue.offer(parentId);
+            }
+        }
+
+        // 3. 批量查询节点数据
+        Map<Long, IotDeviceBomDO> nodeMap = iotDeviceBomMapper.selectNodeMapByIds(allNodeIds);
+
+        // 4. 构建路径
+        Map<Long, String> result = new HashMap<>();
+        for (Long nodeId : bomNodeIds) {
+            LinkedList<String> pathSegments = new LinkedList<>();
+            Long currentId = nodeId;
+
+            // 向上回溯直到根节点
+            while (currentId != null && currentId > 0) {
+                IotDeviceBomDO node = nodeMap.get(currentId);
+                if (node == null) break;
+
+                pathSegments.addFirst(node.getName()); // 头部插入保证顺序
+                currentId = node.getParentId();
+            }
+            result.put(nodeId, String.join("->", pathSegments));
+        }
+        return result;
+    }
+
 }

+ 22 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorderbom/IotMainWorkOrderBomServiceImpl.java

@@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.pms.service.iotmainworkorderbom;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.module.pms.controller.admin.iotdevicerunlog.vo.IotDeviceRunLogRespVO;
@@ -10,6 +11,7 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom.vo.IotMa
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper;
 import cn.iocoder.yudao.module.pms.enums.ErrorCodeConstant;
+import cn.iocoder.yudao.module.pms.service.iotdevicebom.IotDeviceBomService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -36,6 +38,8 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
     private IotMainWorkOrderBomMapper iotMainWorkOrderBomMapper;
     @Autowired
     private IotDeviceRunLogService iotDeviceRunLogService;
+    @Autowired
+    private IotDeviceBomService iotDeviceBomService;
 
     @Override
     public Long createIotMainWorkOrderBom(IotMainWorkOrderBomSaveReqVO createReqVO) {
@@ -81,7 +85,24 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
 
     @Override
     public List<IotMainWorkOrderBomDO> getIotMainWorkOrderBomList(IotMainWorkOrderBomPageReqVO pageReqVO) {
-        return iotMainWorkOrderBomMapper.selectList(pageReqVO);
+        List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.selectList(pageReqVO);
+        // 查询所有BOM节点id 查询出每个节点所有的上级节点 替换节点名称
+        List<Long> bomNodeIds = new ArrayList<>();
+        if (CollUtil.isNotEmpty(workOrderBomS)) {
+            workOrderBomS.forEach(bom -> {
+                bomNodeIds.add(bom.getBomNodeId());
+            });
+            // 查询 bomNodeIds 集合中每个bom节点的所有上级节点
+            Map<Long, String> bomFullPaths = iotDeviceBomService.buildBomFullPaths(bomNodeIds);
+            workOrderBomS.forEach(bom -> {
+                if (bomFullPaths.containsKey(bom.getBomNodeId())) {
+                    if (StrUtil.isNotBlank(bomFullPaths.get(bom.getBomNodeId()))) {
+                        bom.setName(bomFullPaths.get(bom.getBomNodeId()));
+                    }
+                }
+            });
+        }
+        return workOrderBomS;
     }
 
     @Override