From a17781479bd4acb36069472ac1a987df21c0cc05 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期一, 23 三月 2026 10:01:10 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java |   34 +++++++++++++++++++++++++++++++---
 1 files changed, 31 insertions(+), 3 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..a15880a 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
@@ -448,7 +448,22 @@
     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("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,13 +593,26 @@
     }
 
     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) {
         return list.stream().map(this::toDetailItem).collect(Collectors.toList());
     }

--
Gitblit v1.9.1