Просмотр исходного кода

pms 查看保养计划明细:处理多累计时长 公里数 的属性没有运行记录累计值的情况

zhangcl 1 месяц назад
Родитель
Сommit
4f27fd26c1

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

@@ -138,8 +138,10 @@ public class IotMaintenanceBomController {
                 deviceCategoryPair.put(k, v.getAssetClass());
             });
         }
-        // k设备id   v设备分类包含的模板中与累计运行时长、累计运行公里数相关的属性集合
+        // k设备id   v设备分类包含的模板中与累计运行时长、累计运行公里数相关的属性(正常属性)集合
         Map<Long, List<IotModelTemplateAttrsDO>> deviceAttrsPair = new HashMap<>();
+        // k设备id   v设备分类包含的模板中与累计运行时长、累计运行公里数相关的属性(多种累计属性)集合
+        Map<Long, List<String>> deviceMultiAttrsPair = new HashMap<>();
         if (CollUtil.isNotEmpty(deviceCategoryIds)) {
             // 查询设备分类id集合对应的运行记录模板中涉及多个 累计运行时长、累计运行公里数 的属性
             IotModelTemplateAttrsPageReqVO multiReqVO = new IotModelTemplateAttrsPageReqVO();
@@ -148,8 +150,21 @@ public class IotMaintenanceBomController {
             multiReqVO.setIsSum(1);  // 累计属性标识
             List<IotModelTemplateAttrsDO> multiAccumulatedAttrs = iotModelTemplateAttrsService.getIotDeviceTemplateAttrs(multiReqVO);
             // k设备分类id   v设备分类包含的模板中 多个 累计运行时长 累计运行公里数相关的属性集合
-            Map<Long, List<IotModelTemplateAttrsDO>> multiAccumulatedAttrPair = new HashMap<>();
+            Map<Long, List<String>> multiAccumulatedAttrPair = new HashMap<>();
             if (CollUtil.isNotEmpty(multiAccumulatedAttrs)) {
+                // 组装不同设备分类下的 多累计类型属性名称集合
+                multiAccumulatedAttrs.forEach(attr -> {
+                    if (multiAccumulatedAttrPair.containsKey(attr.getDeviceCategoryId())) {
+                        List<String> tempAttrs = multiAccumulatedAttrPair.get(attr.getDeviceCategoryId());
+                        tempAttrs.add(attr.getName());
+                        multiAccumulatedAttrPair.put(attr.getDeviceCategoryId(), tempAttrs);
+                    } else {
+                        List<String> tempAttrs = new ArrayList<>();
+                        tempAttrs.add(attr.getName());
+                        multiAccumulatedAttrPair.put(attr.getDeviceCategoryId(), tempAttrs);
+                    }
+                });
+                // 所有 多累计类型属性名称 集合
                 multiAccumulatedAttrs.forEach(attr -> {
                     multiPointNames.add(attr.getName());
                 });
@@ -189,6 +204,18 @@ public class IotMaintenanceBomController {
                     });
                 });
             }
+            // 将多累计时长 公里数属性名称集合的 key 值由设备分类id 修改成 设备id
+            if (CollUtil.isNotEmpty(multiAccumulatedAttrPair)) {
+                multiAccumulatedAttrPair.forEach((k,v) -> {
+                    // k设备分类id   v设备分类包含的模板中与累计运行时长 累计运行公里数相关的属性名称集合
+                    deviceCategoryPair.forEach((ik, iv) -> {
+                        // ik设备id   iv设备分类id
+                        if (iv.equals(k)) {
+                            deviceMultiAttrsPair.put(ik, v);
+                        }
+                    });
+                });
+            }
         }
         // key设备id  value设备对应的运行记录模板中涉及多个累计时长累计公里数的属性集合
         Map<Long, List<IotDeviceRunLogRespVO>> deviceRunLogPair = new HashMap<>();
@@ -206,7 +233,7 @@ public class IotMaintenanceBomController {
             multipleAccumulatedData.forEach(data -> {
                 String uniqueKey = StrUtil.join("-", data.getDeviceId(), data.getPointName());
                 tempTotalRunDataPair.put(uniqueKey, data.getTotalRunTime());
-                // 设置每个设备对应的多个累计类型属性集合
+                // 设置每个设备对应的多个累计类型属性值 运行记录填报的值 集合
                 if (deviceRunLogPair.containsKey(data.getDeviceId())) {
                     List<IotDeviceRunLogRespVO> tempRunLogs = deviceRunLogPair.get(data.getDeviceId());
                     tempRunLogs.add(data);
@@ -252,8 +279,9 @@ public class IotMaintenanceBomController {
                     bomVO.setTempTotalMileage(tempTotalRunDataPair.get(uniqueKey));
                 }
             }
+            // 如果多累计时长 公里数属性 没有运行记录填报数据,只返回 属性名称集合
             if (deviceRunLogPair.containsKey(bomVO.getDeviceId())) {
-                // 设置每个保养项对应的 多个累计类型属性集合
+                // 设置每个保养项对应的 多个累计类型属性集合 包含属性的运行记录值
                 // 区分开 时间 里程 的累计属性列表 便于前端选择
                 List<IotDeviceRunLogRespVO> mileageRunLogs = new ArrayList<>();
                 List<IotDeviceRunLogRespVO> timeRunLogs = deviceRunLogPair.get(bomVO.getDeviceId());
@@ -266,7 +294,26 @@ public class IotMaintenanceBomController {
                 });
                 bomVO.setTimeAccumulatedAttrs(timeRunLogs);
                 bomVO.setMileageAccumulatedAttrs(mileageRunLogs);
+            } else {
+                // 如果多累计属性没有运行记录填报值 则直接返回 名称 可以设置 累计运行时长 或 公里数 为 0
+                List<IotDeviceRunLogRespVO> mileageRunLogs = new ArrayList<>();
+                List<IotDeviceRunLogRespVO> timeRunLogs = new ArrayList<>();
+                if (deviceMultiAttrsPair.containsKey(bomVO.getDeviceId())) {
+                    List<String> attrNames = deviceMultiAttrsPair.get(bomVO.getDeviceId());
+                    attrNames.forEach(attrName -> {
+                        IotDeviceRunLogRespVO tempRunLog = new IotDeviceRunLogRespVO();
+                        tempRunLog.setDeviceId(bomVO.getDeviceId());
+                        tempRunLog.setTotalRunTime(BigDecimal.ZERO);
+                        tempRunLog.setPointName(attrName);
+                        timeRunLogs.add(tempRunLog);
+                        tempRunLog.setTotalRunTime(BigDecimal.ZERO);
+                        mileageRunLogs.add(tempRunLog);
+                    });
+                    bomVO.setTimeAccumulatedAttrs(timeRunLogs);
+                    bomVO.setMileageAccumulatedAttrs(mileageRunLogs);
+                }
             }
+
         });
     }
 

+ 0 - 2
yudao-module-pms/yudao-module-pms-biz/src/main/java/cn/iocoder/yudao/module/pms/dal/dataobject/iotmodeltemplateattrs/IotModelTemplateAttrsDO.java

@@ -7,11 +7,9 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
-import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.*;
 
 import java.math.BigDecimal;
-import java.util.List;
 
 /**
  * PMS 功能优化 运行记录模板属性 DO

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

@@ -109,6 +109,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
     public Map<Long, String> mainWorkOrderNearestDistance(IotMainWorkOrderBomPageReqVO pageReqVO) {
         List<IotMainWorkOrderBomDO> workOrderBomS = getIotMainWorkOrderBomList(pageReqVO);
         Map<Long, String> resultMap = new HashMap<>();
+
         // 遍历工单明细 找出每个工单中 触发保养时间最近的 时间/里程/自然日
         if (CollUtil.isNotEmpty(workOrderBomS)) {
             Set<Long> deviceIds = new HashSet<>();
@@ -123,7 +124,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
                 BigDecimal runningKiloDistance = null;
                 BigDecimal naturalDateDistance = null;
                 // 计算每个保养项 每个保养规则下的 距离保养时间
-                if (0 == bom.getRunningTimeRule()) {
+                if (ObjUtil.isNotEmpty(bom.getRunningTimeRule()) && 0 == bom.getRunningTimeRule()) {
                     // 运行时间保养规则
                     if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
                         BigDecimal totalRunTime = deviceRunLogMap.get(bom.getDeviceId()).getTotalRunTime();
@@ -135,7 +136,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
                         runningTimeDistance = (runningTimePeriod.subtract(totalRunTime.subtract(lastRunningTime))).add(delayDuration);
                     }
                 }
-                if (0 == bom.getMileageRule()) {
+                if (ObjUtil.isNotEmpty(bom.getMileageRule()) && 0 == bom.getMileageRule()) {
                     // 运行里程保养规则
                     // 累计运行里程规则 累计运行里程 >= (上次保养运行里程+运行里程周期-提前量)
                     if (deviceRunLogMap.containsKey(bom.getDeviceId())) {
@@ -148,7 +149,7 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
                         runningKiloDistance = (runningKiloPeriod.subtract(totalMileage.subtract(lastRunningKilo))).add(delayKilometers);
                     }
                 }
-                if (0 == bom.getNaturalDateRule()) {
+                if (ObjUtil.isNotEmpty(bom.getNaturalDateRule()) && 0 == bom.getNaturalDateRule()) {
                     // 自然日期保养规则
                     LocalDateTime lastNaturalDate = bom.getLastNaturalDate();      // 上次保养自然日期
                     BigDecimal naturalDatePeriod = bom.getNextNaturalDate();       // 自然日周期
@@ -197,58 +198,6 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
      */
     private Map<Long, String> findClosestToZero(Map<Long, List<Map<String, Object>>> orderDistancePair){
         Map<Long, String> result = new HashMap<>();
-        /* for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
-            Long key = entry.getKey();
-            List<Map<String, Object>> mapList = entry.getValue();
-            // 初始化最小距离和对应的Map
-            BigDecimal minAbsDistance = null;
-            Map<String, Object> closestMap = null;
-            for (Map<String, Object> currentMap : mapList) {
-                // 计算当前Map所有值的最小绝对值
-                BigDecimal currentMinAbs = calculateMinAbsolute(currentMap);
-                // 跳过无效Map(无有效值)
-                if (currentMinAbs == null) continue;
-                // 比较并更新最小值
-                if (minAbsDistance == null || currentMinAbs.compareTo(minAbsDistance) < 0) {
-                    minAbsDistance = currentMinAbs;
-                    closestMap = currentMap;
-                }
-            }
-            // 将有效结果放入最终Map
-            if (closestMap != null) {
-                result.put(key, convertMapToString(closestMap));
-            }
-        }
-        return result; */
-        /* for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
-            Long workOrderId = entry.getKey();
-            List<Map<String, Object>> mapList = entry.getValue();
-            // 存储所有有效值及其单位
-            List<Pair<BigDecimal, String>> allValues = new ArrayList<>();
-            // 收集所有值
-            for (Map<String, Object> map : mapList) {
-                for (Map.Entry<String, Object> valueEntry : map.entrySet()) {
-                    if (valueEntry.getValue() instanceof BigDecimal) {
-                        BigDecimal value = (BigDecimal) valueEntry.getValue();
-                        allValues.add(new Pair<>(value, valueEntry.getKey()));
-                    }
-                }
-            }
-            // 如果没有有效值,跳过
-            if (allValues.isEmpty()) {
-                continue;
-            }
-            // 找到实际数值最小的值
-            Pair<BigDecimal, String> minPair = allValues.get(0);
-            for (Pair<BigDecimal, String> pair : allValues) {
-                if (pair.getKey().compareTo(minPair.getKey()) < 0) {
-                    minPair = pair;
-                }
-            }
-            // 格式化为字符串: "数值 单位"
-            result.put(workOrderId, minPair.getKey() + " " + minPair.getValue());
-        }
-        return result; */
         for (Map.Entry<Long, List<Map<String, Object>>> entry : orderDistancePair.entrySet()) {
             Long workOrderId = entry.getKey();
             List<Map<String, Object>> mapList = entry.getValue();
@@ -332,66 +281,6 @@ public class IotMainWorkOrderBomServiceImpl implements IotMainWorkOrderBomServic
 
     private BigDecimal chooseNearestDistance(BigDecimal runningTimeDistance, BigDecimal runningKiloDistance, BigDecimal naturalDateDistance){
         // 存储当前找到的最小绝对值的变量
-        /* BigDecimal closest = null;
-        // 存储当前最小绝对值(BigDecimal 类型)
-        BigDecimal minAbs = null;
-        // 比较第一个变量
-        if (runningTimeDistance != null) {
-            closest = runningTimeDistance;
-            minAbs = runningTimeDistance.abs();
-        }
-        // 比较第二个变量
-        if (runningKiloDistance != null) {
-            if (minAbs == null) {
-                // 如果之前没有有效值,直接使用 b
-                closest = runningKiloDistance;
-                minAbs = runningKiloDistance.abs();
-            } else {
-                // 比较绝对值大小
-                BigDecimal absB = runningKiloDistance.abs();
-                int cmp = absB.compareTo(minAbs);
-                if (cmp < 0 || (cmp == 0 && runningKiloDistance.compareTo(closest) > 0)) {
-                    // 如果 b 的绝对值更小,或绝对值相等但 b 是正数(更大值表示正数)
-                    closest = runningKiloDistance;
-                    minAbs = absB;
-                }
-            }
-        }
-        // 比较第三个变量
-        if (naturalDateDistance != null) {
-            if (minAbs == null) {
-                // 如果之前没有有效值,直接使用 c
-                closest = naturalDateDistance;
-                minAbs = naturalDateDistance.abs();
-            } else {
-                // 比较绝对值大小
-                BigDecimal absC = naturalDateDistance.abs();
-                int cmp = absC.compareTo(minAbs);
-                if (cmp < 0 || (cmp == 0 && naturalDateDistance.compareTo(closest) > 0)) {
-                    // 如果 c 的绝对值更小,或绝对值相等但 c 是正数
-                    closest = naturalDateDistance;
-                    minAbs = absC;
-                }
-            }
-        }
-        return closest; // 可能返回 null(当所有输入均为 null 时) */
-        // 存储所有非空值
-        /* List<BigDecimal> values = new ArrayList<>();
-        if (runningTimeDistance != null) values.add(runningTimeDistance);
-        if (runningKiloDistance != null) values.add(runningKiloDistance);
-        if (naturalDateDistance != null) values.add(naturalDateDistance);
-        // 如果没有有效值,返回null
-        if (values.isEmpty()) {
-            return null;
-        }
-        // 找到实际数值最小的值
-        BigDecimal minValue = values.get(0);
-        for (BigDecimal value : values) {
-            if (value.compareTo(minValue) < 0) {
-                minValue = value;
-            }
-        }
-        return minValue; */
         // 存储所有非空值及其转换值(小时->天)
         List<Triple<BigDecimal, String, BigDecimal>> values = new ArrayList<>();
         if (runningTimeDistance != null) {