Browse Source

pms 查询设备保养项的最近一次保养时间

zhangcl 1 month ago
parent
commit
9ccea8fc1b

+ 30 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/IotMaintenanceBomController.java

@@ -16,10 +16,12 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmaintenancebom.vo.IotMain
 import cn.iocoder.yudao.module.pms.controller.admin.iotmodeltemplateattrs.vo.IotModelTemplateAttrsPageReqVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmaintenancebom.IotMaintenanceBomDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmodeltemplateattrs.IotModelTemplateAttrsDO;
 import cn.iocoder.yudao.module.pms.service.IotDeviceService;
 import cn.iocoder.yudao.module.pms.service.iotdevicerunlog.IotDeviceRunLogService;
 import cn.iocoder.yudao.module.pms.service.iotmaintenancebom.IotMaintenanceBomService;
+import cn.iocoder.yudao.module.pms.service.iotmainworkorder.IotMainWorkOrderService;
 import cn.iocoder.yudao.module.pms.service.iotmodeltemplateattrs.IotModelTemplateAttrsService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
@@ -33,6 +35,7 @@ import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
 import java.math.BigDecimal;
+import java.time.LocalDateTime;
 import java.util.*;
 import java.util.stream.Stream;
 
@@ -54,6 +57,8 @@ public class IotMaintenanceBomController {
     private IotDeviceRunLogService iotDeviceRunLogService;
     @Resource
     private IotModelTemplateAttrsService iotModelTemplateAttrsService;
+    @Resource
+    private IotMainWorkOrderService iotMainWorkOrderService;
 
     @PostMapping("/create")
     @Operation(summary = "创建PMS 保养计划明细BOM")
@@ -117,6 +122,10 @@ public class IotMaintenanceBomController {
         Set<String> pointNames = new HashSet<>();
         // 多个累计类型属性名称集合
         Set<String> multiPointNames = new HashSet<>();
+        // 查询保养计划保养项的上次保养时间 唯一键
+        Set<String> lastMaintenanceDateKey = new HashSet<>();
+        // 保养计划中保养项BOM节点id集合
+        Set<Long> bomNodeIds = new HashSet<>();
         BOMs.forEach(bom -> {
             if (StrUtil.isNotBlank(bom.getCode())) {
                 pointNames.add(bom.getCode());
@@ -124,7 +133,11 @@ public class IotMaintenanceBomController {
             if (StrUtil.isNotBlank(bom.getType())) {
                 pointNames.add(bom.getType());
             }
+            // 设置唯一健 标识 标识保养项的 历史保养工单中最新的上次保养时间
+            // lastMaintenanceDateKey.add(StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId()));
+            bomNodeIds.add(bom.getBomNodeId());
         });
+
         // 设备对应的设备分类 map
         Map<Long, Long> deviceCategoryPair = new HashMap<>();
         Set<Long> deviceCategoryIds = new HashSet<>();
@@ -138,6 +151,18 @@ public class IotMaintenanceBomController {
                 deviceCategoryPair.put(k, v.getAssetClass());
             });
         }
+
+        // 查询所有保养项 历史保养记录 (保养项所有历史工单中最新的保养时间)
+        Map<String, LocalDateTime> latestMaintenanceDatePair = new HashMap<>();
+        if (CollUtil.isNotEmpty(deviceIds) && CollUtil.isNotEmpty(bomNodeIds)) {
+            List<IotMainWorkOrderBomDO> latestWorkOrderBomS = iotMainWorkOrderService.historyWorkOrderBoms(deviceIds, bomNodeIds);
+            if (CollUtil.isNotEmpty(latestWorkOrderBomS)) {
+                latestWorkOrderBomS.forEach(bom -> {
+                    String uniqueKey = StrUtil.join("-", bom.getDeviceId(), bom.getBomNodeId());
+                    latestMaintenanceDatePair.put(uniqueKey, bom.getUpdateTime());
+                });
+            }
+        }
         // k设备id   v设备分类包含的模板中与累计运行时长、累计运行公里数相关的属性(正常属性)集合
         Map<Long, List<IotModelTemplateAttrsDO>> deviceAttrsPair = new HashMap<>();
         // k设备id   v设备分类包含的模板中与累计运行时长、累计运行公里数相关的属性(多种累计属性)集合
@@ -313,7 +338,11 @@ public class IotMaintenanceBomController {
                     bomVO.setMileageAccumulatedAttrs(mileageRunLogs);
                 }
             }
-
+            // 设置保养项的上次保养时间
+            String uniqueKey = StrUtil.join("-", bomVO.getDeviceId(), bomVO.getBomNodeId());
+            if (latestMaintenanceDatePair.containsKey(uniqueKey)) {
+                bomVO.setLastMaintenanceDate(latestMaintenanceDatePair.get(uniqueKey));
+            }
         });
     }
 

+ 4 - 1
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmaintenancebom/vo/IotMaintenanceBomRespVO.java

@@ -134,7 +134,7 @@ public class IotMaintenanceBomRespVO {
     private LocalDateTime createTime;
 
     /**
-     * 设备关联字段
+     * 扩展属性 设备关联字段
      */
     @Schema(description = "设备名称")
     private String deviceName;
@@ -160,4 +160,7 @@ public class IotMaintenanceBomRespVO {
     @Schema(description = "模板中涉及多个累计运行公里数的属性集合")
     private List<IotDeviceRunLogRespVO> mileageAccumulatedAttrs;
 
+
+    @Schema(description = "上次保养时间")
+    private LocalDateTime lastMaintenanceDate;
 }

+ 1 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/mysql/iotmainworkorderbom/IotMainWorkOrderBomMapper.java

@@ -114,4 +114,5 @@ public interface IotMainWorkOrderBomMapper extends BaseMapperX<IotMainWorkOrderB
     @DataPermission(enable = false)
     List<IotMainWorkOrderBomDO> historyWorkOrderBomS(@Param("deptIds") List<Long> deptIds, @Param("deviceIds") List<Long> deviceIds);
 
+    List<IotMainWorkOrderBomDO> latestWorkOrderBomS(@Param("req") IotMainWorkOrderBomPageReqVO reqVO);
 }

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderService.java

@@ -7,10 +7,12 @@ import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainW
 import cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorder.vo.IotMainWorkOrderSaveVO;
 import cn.iocoder.yudao.module.pms.controller.admin.vo.IotDeviceRespVO;
 import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorder.IotMainWorkOrderDO;
+import cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO;
 
 import javax.validation.Valid;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * 保养工单 Service 接口
@@ -137,4 +139,11 @@ public interface IotMainWorkOrderService {
      * @return
      */
     void syncWorkOrderData(List<Long> deviceIds, Long deptId, List<Long> personIds);
+
+    /**
+     * 查询设备BOM保养项 最新的 保养记录 (上次保养时间)
+     *
+     * @return
+     */
+    List<IotMainWorkOrderBomDO> historyWorkOrderBoms(Set<Long> deviceIds, Set<Long> bomNodeIds);
 }

+ 9 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/service/iotmainworkorder/IotMainWorkOrderServiceImpl.java

@@ -1113,6 +1113,15 @@ public class IotMainWorkOrderServiceImpl implements IotMainWorkOrderService {
         }
     }
 
+    @Override
+    public List<IotMainWorkOrderBomDO> historyWorkOrderBoms(Set<Long> deviceIds, Set<Long> bomNodeIds) {
+        IotMainWorkOrderBomPageReqVO reqVO = new IotMainWorkOrderBomPageReqVO();
+        reqVO.setDeviceIds(new ArrayList<>(deviceIds));
+        reqVO.setBomNodeIds(new ArrayList<>(bomNodeIds));
+        List<IotMainWorkOrderBomDO> workOrderBomS = iotMainWorkOrderBomMapper.latestWorkOrderBomS(reqVO);
+        return CollUtil.isNotEmpty(workOrderBomS) ? workOrderBomS : new ArrayList<>();
+    }
+
     private static class Triple<A, B, C> {
         private final A first;
         private final B second;

+ 48 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/resources/mapper/static/IotMainWorkOrderBomMapper.xml

@@ -2,6 +2,25 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="cn.iocoder.yudao.module.pms.dal.mysql.iotmainworkorderbom.IotMainWorkOrderBomMapper">
 
+    <sql id="condition">
+        <!-- 集合类型参数(使用 foreach) -->
+        <if test="req.deviceIds != null and !req.deviceIds.isEmpty()">
+            AND device_id IN (
+            <foreach collection="req.deviceIds" item="id" separator=",">
+                #{id}
+            </foreach>
+            )
+        </if>
+
+        <if test="req.bomNodeIds != null and !req.bomNodeIds.isEmpty()">
+            AND bom_node_id IN (
+            <foreach collection="req.bomNodeIds" item="id" separator=",">
+                #{id}
+            </foreach>
+            )
+        </if>
+    </sql>
+
     <select id="historyWorkOrderBomS" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO">
         SELECT *
         FROM rq_iot_main_work_order_bom mwob
@@ -22,4 +41,33 @@
         </if>
     </select>
 
+    <select id="latestWorkOrderBomS" resultType="cn.iocoder.yudao.module.pms.dal.dataobject.iotmainworkorderbom.IotMainWorkOrderBomDO">
+        SELECT t1.*
+        FROM rq_iot_main_work_order_bom t1
+        INNER JOIN (
+            SELECT device_id, bom_node_id, MAX(update_time) AS max_update_time
+            FROM rq_iot_main_work_order_bom
+            <where>
+                status = 1
+                AND deleted = 0
+                <include refid="condition"/>
+            </where>
+            GROUP BY device_id, bom_node_id
+        ) t2 ON t1.device_id = t2.device_id
+        AND t1.bom_node_id = t2.bom_node_id
+        AND t1.update_time = t2.max_update_time
+        WHERE t1.id = (
+        SELECT MAX(id)
+        FROM rq_iot_main_work_order_bom
+        <where>
+            status = 1
+            AND deleted = 0
+            AND device_id = t2.device_id
+            AND bom_node_id = t2.bom_node_id
+            AND update_time = t2.max_update_time
+            <include refid="condition"/>
+        </where>
+        )
+    </select>
+
 </mapper>