浏览代码

pms 保养工单 填报 详情 查询多累计属性的运行记录填报值

zhangcl 1 月之前
父节点
当前提交
f10a0b07e8

+ 50 - 3
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbom/IotMainWorkOrderBomController.java

@@ -1,6 +1,8 @@
 package cn.iocoder.yudao.module.pms.controller.admin.iotmainworkorderbom;
 
 import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
 import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageParam;
@@ -28,9 +30,8 @@ import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import javax.validation.Valid;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
+import java.math.BigDecimal;
+import java.util.*;
 import java.util.stream.Stream;
 
 import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
@@ -123,6 +124,36 @@ public class IotMainWorkOrderBomController {
                 bom -> Stream.of(bom.getDeviceId())));
         Map<Long, IotDeviceRunLogRespVO> deviceRunLogMap = iotDeviceRunLogService.getDeviceRunLogMap(convertListByFlatMap(BOMs,
                 bom -> Stream.of(bom.getDeviceId())));
+        // 查询保养工单明细中继承自保养计划明细 的 code累计运行时长属性名称 type累计运行公里数属性名称
+        // 所有保养工单明细 已经 绑定了多个累计属性名称集合
+        Set<String> pointNames = new HashSet<>();
+        // 所有保养工单明细包含的设备id集合
+        Set<Long> deviceIds = new HashSet<>();
+        BOMs.forEach(bom -> {
+            if (ObjUtil.isNotEmpty(bom.getDeviceId())) {
+                deviceIds.add(bom.getDeviceId());
+            }
+            if (StrUtil.isNotBlank(bom.getCode())) {
+                pointNames.add(bom.getCode());
+            }
+            if (StrUtil.isNotBlank(bom.getType())) {
+                pointNames.add(bom.getType());
+            }
+        });
+        // 查询 运行记录模板中包含多个累计 时长 公里数 属性的集合
+        List<IotDeviceRunLogRespVO> multipleAccumulatedData = new ArrayList<>();
+        // key(设备id-累计时长属性名称)    value多累计时长属性运行记录填报数值
+        Map<String, BigDecimal> tempTotalRunDataPair = new HashMap<>();
+        // 查询指定设备 指定 多累计属性名称 的设备运行记录数据集合数据
+        if (CollUtil.isNotEmpty(deviceIds) && CollUtil.isNotEmpty(pointNames)) {
+            multipleAccumulatedData = iotDeviceRunLogService.multipleAccumulatedData(deviceIds, pointNames);
+        }
+        if (CollUtil.isNotEmpty(multipleAccumulatedData)) {
+            multipleAccumulatedData.forEach(data -> {
+                String uniqueKey = StrUtil.join("-", data.getDeviceId(), data.getPointName());
+                tempTotalRunDataPair.put(uniqueKey, data.getTotalRunTime());
+            });
+        }
         // 2. 转换成 VO
         return BeanUtils.toBean(BOMs, IotMainWorkOrderBomRespVO.class, bomVO -> {
             // 设置设备相关信息
@@ -134,6 +165,22 @@ public class IotMainWorkOrderBomController {
                     device -> bomVO.setTotalMileage(device.getTotalMileage()));
             MapUtils.findAndThen(deviceRunLogMap, bomVO.getDeviceId(),
                     device -> bomVO.setTotalRunTime(device.getTotalRunTime()));
+
+            // 运行记录模板中包含的多个累计类型属性
+            if (StrUtil.isNotBlank(bomVO.getCode())) {
+                // code 累计运行时长属性名称
+                String uniqueKey = StrUtil.join("-", bomVO.getDeviceId(), bomVO.getCode());
+                if (tempTotalRunDataPair.containsKey(uniqueKey)) {
+                    bomVO.setTempTotalRunTime(tempTotalRunDataPair.get(uniqueKey));
+                }
+            }
+            if (StrUtil.isNotBlank(bomVO.getType())) {
+                // type 累计运行公里数属性名称
+                String uniqueKey = StrUtil.join("-", bomVO.getDeviceId(), bomVO.getType());
+                if (tempTotalRunDataPair.containsKey(uniqueKey)) {
+                    bomVO.setTempTotalMileage(tempTotalRunDataPair.get(uniqueKey));
+                }
+            }
         });
     }
 }

+ 5 - 0
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/controller/admin/iotmainworkorderbom/vo/IotMainWorkOrderBomRespVO.java

@@ -188,4 +188,9 @@ public class IotMainWorkOrderBomRespVO {
     private BigDecimal totalRunTime;
     @Schema(description = "累计运行公里数", example = "20238km")
     private BigDecimal totalMileage;
+
+    @Schema(description = "临时 累计运行时间 用于运行记录模板中包含多个累计类型属性的场景", example = "30000H")
+    private BigDecimal tempTotalRunTime;
+    @Schema(description = "临时 累计运行公里数 用于运行记录模板中包含多个累计类型属性的场景", example = "20238km")
+    private BigDecimal tempTotalMileage;
 }

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

@@ -109,13 +109,35 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
     public Map<Long, String> mainWorkOrderNearestDistance(IotMainWorkOrderBomPageReqVO pageReqVO) {
         List<IotMainWorkOrderBomDO> workOrderBomS = getIotMainWorkOrderBomList(pageReqVO);
         Map<Long, String> resultMap = new HashMap<>();
-
+        // 查找所有保养工单明细 继承自 保养计划明细 的 code累计运行时长属性名称 type累计运行公里数属性名称
+        // 运行记录模板中 多种 累计时长 公里数 属性名称集合
+        Set<String> boundedMultiAttrNames = new HashSet<>();
         // 遍历工单明细 找出每个工单中 触发保养时间最近的 时间/里程/自然日
         if (CollUtil.isNotEmpty(workOrderBomS)) {
             Set<Long> deviceIds = new HashSet<>();
             workOrderBomS.forEach(bom -> {
                 deviceIds.add(bom.getDeviceId());
+                if (StrUtil.isNotBlank(bom.getCode())) {
+                    boundedMultiAttrNames.add(bom.getCode());
+                }
+                if (StrUtil.isNotBlank(bom.getType())) {
+                    boundedMultiAttrNames.add(bom.getType());
+                }
             });
+            // 查询 保养工单保养明细中已经绑定的 多种累计时长 公里数 属性运行记录值集合
+            List<IotDeviceRunLogRespVO> multipleAccumulatedData = new ArrayList<>();
+            if (CollUtil.isNotEmpty(deviceIds) && CollUtil.isNotEmpty(boundedMultiAttrNames)) {
+                multipleAccumulatedData = iotDeviceRunLogService.multipleAccumulatedData(deviceIds, boundedMultiAttrNames);
+            }
+            // key(设备id-累计时长属性名称)    value时长属性累计时长数值
+            Map<String, BigDecimal> tempTotalRunDataPair = new HashMap<>();
+            if (CollUtil.isNotEmpty(multipleAccumulatedData)) {
+                multipleAccumulatedData.forEach(data -> {
+                    String uniqueKey = StrUtil.join("-", data.getDeviceId(), data.getPointName());
+                    tempTotalRunDataPair.put(uniqueKey, data.getTotalRunTime());
+                });
+            }
+
             // 查询当前所有设备的 累计运行里程 累计运行时间
             Map<Long, IotDeviceRunLogRespVO> deviceRunLogMap = iotDeviceRunLogService.getDeviceRunLogMap(new ArrayList<>(deviceIds));
             Map<Long, List<Map<String, Object>>> orderDistancePair = new HashMap<>();
@@ -123,31 +145,50 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
                 BigDecimal runningTimeDistance = null;
                 BigDecimal runningKiloDistance = null;
                 BigDecimal naturalDateDistance = null;
+                // 运行记录模板中维护的属性 填报的累计值
+                BigDecimal totalRunTime = BigDecimal.ZERO;
+                BigDecimal totalMileage = BigDecimal.ZERO;
+                if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
+                    // 正常的累计时长 公里数
+                    totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
+                    totalMileage = deviceRunLogMap.get(bom.getDeviceId()).getTotalMileage();
+                } else {
+                    // 保养项绑定的 累计时长 类型的属性值
+                    String uniqueKey = StrUtil.join("-", bom.getDeviceId(), bom.getCode());
+                    if (tempTotalRunDataPair.containsKey(uniqueKey)) {
+                        totalRunTime = tempTotalRunDataPair.get(uniqueKey);
+                    }
+                    // 保养项绑定的 累计公里数类型的属性值
+                    String uniqueKeyType = StrUtil.join("-", bom.getDeviceId(), bom.getType());
+                    if (tempTotalRunDataPair.containsKey(uniqueKeyType)) {
+                        totalMileage = tempTotalRunDataPair.get(uniqueKeyType);
+                    }
+                }
                 // 计算每个保养项 每个保养规则下的 距离保养时间
                 if (ObjUtil.isNotEmpty(bom.getRunningTimeRule()) && 0 == bom.getRunningTimeRule()) {
                     // 运行时间保养规则
-                    if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
-                        BigDecimal totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
+                    // if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
+                        // BigDecimal totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
                         BigDecimal lastRunningTime = bom.getLastRunningTime();      // 上次保养运行时间
                         BigDecimal runningTimePeriod = bom.getNextRunningTime();    // 运行时间周期
                         BigDecimal timePeriodLead = bom.getTimePeriodLead();        // 运行时间周期提前量
                         BigDecimal delayDuration = bom.getDelayDuration();          // 推迟运行时长H
                         // runningTimeDistance = (lastRunningTime.add(runningTimePeriod).subtract(timePeriodLead)).subtract(totalRunTime);
                         runningTimeDistance = (runningTimePeriod.subtract(totalRunTime.subtract(lastRunningTime))).add(delayDuration);
-                    }
+                    // }
                 }
                 if (ObjUtil.isNotEmpty(bom.getMileageRule()) && 0 == bom.getMileageRule()) {
                     // 运行里程保养规则
                     // 累计运行里程规则 累计运行里程 >= (上次保养运行里程+运行里程周期-提前量)
-                    if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
-                        BigDecimal totalMileage = deviceRunLogMap.get(bom.getDeviceId()).getTotalMileage();
+                    // if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
+                        // BigDecimal totalMileage = deviceRunLogMap.get(bom.getDeviceId()).getTotalMileage();
                         BigDecimal lastRunningKilo = bom.getLastRunningKilometers();      // 上次保养运行里程
                         BigDecimal runningKiloPeriod = bom.getNextRunningKilometers();    // 运行里程周期
                         BigDecimal kiloCycleLead = bom.getKiloCycleLead();                // 运行里程周期提前量
                         BigDecimal delayKilometers = bom.getDelayKilometers();            // 推迟运行公里数KM
                         // runningKiloDistance = (lastRunningKilo.add(runningKiloPeriod).subtract(kiloCycleLead)).subtract(totalMileage);
                         runningKiloDistance = (runningKiloPeriod.subtract(totalMileage.subtract(lastRunningKilo))).add(delayKilometers);
-                    }
+                    // }
                 }
                 if (ObjUtil.isNotEmpty(bom.getNaturalDateRule()) && 0 == bom.getNaturalDateRule()) {
                     // 自然日期保养规则