From 1da4047a0a011bdbab1e6ae1135e4abb1bcebad2 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 31 三月 2026 11:11:15 +0800
Subject: [PATCH] #许可证去重

---
 src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java |   68 +++++++++++++++++++++++++++++++---
 1 files changed, 62 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
index f7f3500..6bbaac2 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
@@ -16,6 +16,8 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -28,7 +30,8 @@
             WrkStsType.SETTLE_INBOUND.sts,
             WrkStsType.COMPLETE_OUTBOUND.sts,
             WrkStsType.SETTLE_OUTBOUND.sts,
-            WrkStsType.COMPLETE_LOC_MOVE.sts
+            WrkStsType.COMPLETE_LOC_MOVE.sts,
+            WrkStsType.COMPLETE_CRN_MOVE.sts
     );
     private static final String MODE_TASK = "TASK";
     private static final String MODE_TIME = "TIME";
@@ -184,7 +187,9 @@
         entity.setRgvNo(wrkMast.getRgvNo());
         entity.setFinalWrkSts(wrkMast.getWrkSts());
         entity.setUpdateTime(time);
-        if (Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id) && entity.getStationDurationMs() == null) {
+        if ((Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id)
+                || Objects.equals(wrkMast.getIoType(), WrkIoType.CRN_MOVE.id))
+                && entity.getStationDurationMs() == null) {
             entity.setStationDurationMs(0L);
         }
         this.updateById(entity);
@@ -223,7 +228,9 @@
         if (entity.getAppeTime() != null) {
             entity.setTotalDurationMs(durationMs(entity.getAppeTime(), time));
         }
-        if (Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id) && entity.getStationDurationMs() == null) {
+        if ((Objects.equals(wrkMast.getIoType(), WrkIoType.LOC_MOVE.id)
+                || Objects.equals(wrkMast.getIoType(), WrkIoType.CRN_MOVE.id))
+                && entity.getStationDurationMs() == null) {
             entity.setStationDurationMs(0L);
         }
         FaultSummary faultSummary = buildFaultSummary(wrkMast.getWrkNo(), time);
@@ -263,6 +270,7 @@
         ioTypes.add(option("1", "IN", "鍏ュ簱", WrkIoType.IN.id));
         ioTypes.add(option("2", "OUT", "鍑哄簱", WrkIoType.OUT.id));
         ioTypes.add(option("3", "LOC_MOVE", "绉诲簱", WrkIoType.LOC_MOVE.id));
+        ioTypes.add(option("4", "CRN_MOVE", "鍫嗗灈鏈虹Щ鍔�", WrkIoType.CRN_MOVE.id));
         List<Map<String, Object>> timeFields = new ArrayList<>();
         timeFields.add(option(TIME_FIELD_FINISH, TIME_FIELD_FINISH, "瀹屾垚鏃堕棿", TIME_FIELD_FINISH));
         timeFields.add(option(TIME_FIELD_APPE, TIME_FIELD_APPE, "鍒涘缓鏃堕棿", TIME_FIELD_APPE));
@@ -448,7 +456,26 @@
     private Map<String, Object> buildAnalysisResult(List<WrkAnalysis> list, String timeField) {
         Map<String, Object> result = new LinkedHashMap<>();
         Map<String, Object> summary = new LinkedHashMap<>();
+        Date taskStartTime = list.stream()
+                .map(WrkAnalysis::getAppeTime)
+                .filter(Objects::nonNull)
+                .min(Date::compareTo)
+                .orElse(null);
+        Date taskEndTime = list.stream()
+                .map(WrkAnalysis::getFinishTime)
+                .filter(Objects::nonNull)
+                .max(Date::compareTo)
+                .orElse(null);
         summary.put("taskCount", list.size());
+        summary.put("taskStartTime", taskStartTime);
+        summary.put("taskStartTime$", formatDate(taskStartTime));
+        summary.put("taskEndTime", taskEndTime);
+        summary.put("taskEndTime$", formatDate(taskEndTime));
+        summary.put("taskDurationMs", taskStartTime == null || taskEndTime == null ? null : durationMs(taskStartTime, taskEndTime));
+        summary.put("avgTaskBeatDurationMs", list.isEmpty() || taskStartTime == null || taskEndTime == null
+                ? null
+                : durationMs(taskStartTime, taskEndTime) / list.size());
+        summary.put("avgTaskPerHour", calculateAvgTaskPerHour(list.size(), summary.get("taskDurationMs")));
         summary.put("avgTotalDurationMs", average(list, item -> item.getTotalDurationMs() != null, WrkAnalysis::getTotalDurationMs));
         summary.put("avgStationDurationMs", average(list, item -> !METRIC_PARTIAL.equals(item.getMetricCompleteness()) && item.getStationDurationMs() != null, WrkAnalysis::getStationDurationMs));
         summary.put("avgCraneDurationMs", average(list, item -> !METRIC_PARTIAL.equals(item.getMetricCompleteness()) && item.getCraneDurationMs() != null, WrkAnalysis::getCraneDurationMs));
@@ -578,11 +605,24 @@
     }
 
     private List<Map<String, Object>> buildFaultDuration(List<WrkAnalysis> list) {
+        Map<String, Long> durationMap = new LinkedHashMap<>();
+        for (WrkAnalysis item : list) {
+            addDeviceFaultDuration(durationMap, "鍗曞爢鍨涙満", item.getCrnNo(), item.getCrnFaultDurationMs());
+            addDeviceFaultDuration(durationMap, "鍙屽伐浣嶅爢鍨涙満", item.getDualCrnNo(), item.getDualCrnFaultDurationMs());
+            addDeviceFaultDuration(durationMap, "RGV", item.getRgvNo(), item.getRgvFaultDurationMs());
+        }
         List<Map<String, Object>> result = new ArrayList<>();
-        result.add(slice("鍗曞爢鍨涙満", list.stream().map(WrkAnalysis::getCrnFaultDurationMs).filter(Objects::nonNull).reduce(0L, Long::sum)));
-        result.add(slice("鍙屽伐浣嶅爢鍨涙満", list.stream().map(WrkAnalysis::getDualCrnFaultDurationMs).filter(Objects::nonNull).reduce(0L, Long::sum)));
-        result.add(slice("RGV", list.stream().map(WrkAnalysis::getRgvFaultDurationMs).filter(Objects::nonNull).reduce(0L, Long::sum)));
+        durationMap.forEach((name, durationMs) -> result.add(slice(name, durationMs)));
         return result;
+    }
+
+    private void addDeviceFaultDuration(Map<String, Long> durationMap, String deviceLabel, Integer deviceNo, Long durationMs) {
+        long value = defaultLong(durationMs);
+        if (value <= 0L) {
+            return;
+        }
+        String key = deviceNo == null ? deviceLabel : deviceLabel + deviceNo;
+        durationMap.merge(key, value, Long::sum);
     }
 
     private List<Map<String, Object>> buildDetailRows(List<WrkAnalysis> list) {
@@ -785,6 +825,9 @@
         if (Objects.equals(ioType, WrkIoType.LOC_MOVE.id)) {
             return "绉诲簱";
         }
+        if (Objects.equals(ioType, WrkIoType.CRN_MOVE.id)) {
+            return "鍫嗗灈鏈虹Щ鍔�";
+        }
         return String.valueOf(ioType);
     }
 
@@ -811,6 +854,19 @@
         return count == 0 ? null : total / count;
     }
 
+    private Double calculateAvgTaskPerHour(int taskCount, Object taskDurationMsValue) {
+        if (taskCount <= 0 || !(taskDurationMsValue instanceof Number)) {
+            return null;
+        }
+        long taskDurationMs = ((Number) taskDurationMsValue).longValue();
+        if (taskDurationMs <= 0L) {
+            return null;
+        }
+        return BigDecimal.valueOf(taskCount * 3600000D / taskDurationMs)
+                .setScale(2, RoundingMode.HALF_UP)
+                .doubleValue();
+    }
+
     private void applyRange(QueryWrapper<WrkMastLog> wrapper, String column, String rawValue) {
         if (Cools.isEmpty(rawValue) || !rawValue.contains("~")) {
             return;

--
Gitblit v1.9.1