From cbb00d4729243e4949b3c921fc2f94cb03ca8aaa Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 27 三月 2026 18:47:43 +0800
Subject: [PATCH] #

---
 src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java |   38 +++++++++++++++++++++++++++++++++++---
 1 files changed, 35 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 e2b88c7..f647010 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;
@@ -464,6 +466,10 @@
         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));
@@ -593,11 +599,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) {
@@ -826,6 +845,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