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

---
 src/main/webapp/static/js/wrkAnalysis/wrkAnalysis.js               |   50 ++++++++++++++++++------
 src/main/webapp/views/wrkAnalysis/wrkAnalysis.html                 |   20 ++++++++++
 src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java |   15 +++++++
 3 files changed, 72 insertions(+), 13 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..e2b88c7 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));
diff --git a/src/main/webapp/static/js/wrkAnalysis/wrkAnalysis.js b/src/main/webapp/static/js/wrkAnalysis/wrkAnalysis.js
index b1904c5..fb70615 100644
--- a/src/main/webapp/static/js/wrkAnalysis/wrkAnalysis.js
+++ b/src/main/webapp/static/js/wrkAnalysis/wrkAnalysis.js
@@ -29,6 +29,11 @@
         return {
             summary: {
                 taskCount: 0,
+                taskStartTime: null,
+                taskStartTime$: "",
+                taskEndTime: null,
+                taskEndTime$: "",
+                taskDurationMs: null,
                 avgTotalDurationMs: null,
                 avgStationDurationMs: null,
                 avgCraneDurationMs: null,
@@ -743,11 +748,7 @@
                 if (!isFinite(num)) {
                     return "0s";
                 }
-                var text = String(num);
-                if (text.indexOf(".") >= 0) {
-                    text = text.replace(/0+$/, "").replace(/\.$/, "");
-                }
-                return text + "s";
+                return this.formatDurationBySeconds(num);
             },
             formatDuration: function (value) {
                 if (value === null || value === undefined || value === "") {
@@ -760,17 +761,40 @@
                 if (ms < 1000) {
                     return Math.round(ms) + " ms";
                 }
-                var totalSeconds = Math.floor(ms / 1000);
-                var hours = Math.floor(totalSeconds / 3600);
-                var minutes = Math.floor((totalSeconds % 3600) / 60);
-                var seconds = totalSeconds % 60;
+                return this.formatDurationBySeconds(ms / 1000);
+            },
+            formatDurationBySeconds: function (seconds) {
+                var totalSeconds = Number(seconds || 0);
+                if (!isFinite(totalSeconds)) {
+                    return "0s";
+                }
+                var safeSeconds = Math.max(0, totalSeconds);
+                if (safeSeconds < 60) {
+                    return this.trimTrailingZeros(safeSeconds) + "s";
+                }
+                var hours = Math.floor(safeSeconds / 3600);
+                var minutes = Math.floor((safeSeconds % 3600) / 60);
+                var remainSeconds = safeSeconds - hours * 3600 - minutes * 60;
+                var secondText = this.trimTrailingZeros(remainSeconds);
                 if (hours > 0) {
-                    return hours + "h " + this.pad(minutes) + "m " + this.pad(seconds) + "s";
+                    return hours + "h" + this.pad(minutes) + "m" + this.padSeconds(secondText) + "s";
                 }
-                if (minutes > 0) {
-                    return minutes + "m " + this.pad(seconds) + "s";
+                return minutes + "m" + this.padSeconds(secondText) + "s";
+            },
+            trimTrailingZeros: function (value) {
+                var text = String(Number(Number(value).toFixed(3)));
+                if (text.indexOf(".") >= 0) {
+                    text = text.replace(/0+$/, "").replace(/\.$/, "");
                 }
-                return seconds + "s";
+                return text;
+            },
+            padSeconds: function (value) {
+                var text = String(value);
+                if (text.indexOf(".") >= 0) {
+                    var parts = text.split(".");
+                    return (parts[0].length < 2 ? "0" + parts[0] : parts[0]) + "." + parts[1];
+                }
+                return text.length < 2 ? "0" + text : text;
             }
         }
     });
diff --git a/src/main/webapp/views/wrkAnalysis/wrkAnalysis.html b/src/main/webapp/views/wrkAnalysis/wrkAnalysis.html
index a5114e2..c1bdc91 100644
--- a/src/main/webapp/views/wrkAnalysis/wrkAnalysis.html
+++ b/src/main/webapp/views/wrkAnalysis/wrkAnalysis.html
@@ -113,6 +113,11 @@
             font-weight: 700;
             color: #22364a;
         }
+        .summary-value.datetime {
+            font-size: 20px;
+            line-height: 1.25;
+            word-break: break-word;
+        }
         .summary-sub {
             margin-top: 8px;
             font-size: 12px;
@@ -389,6 +394,21 @@
                             <div class="summary-sub">鏈鍒嗘瀽鍛戒腑浠诲姟鎬绘暟</div>
                         </div>
                         <div class="summary-card">
+                            <div class="summary-label">鎬讳换鍔″紑濮�</div>
+                            <div class="summary-value datetime">{{ analysis.summary.taskStartTime$ || '--' }}</div>
+                            <div class="summary-sub">鍛戒腑浠诲姟鏈�鏃╁垱寤烘椂闂�</div>
+                        </div>
+                        <div class="summary-card">
+                            <div class="summary-label">鎬讳换鍔$粨鏉�</div>
+                            <div class="summary-value datetime">{{ analysis.summary.taskEndTime$ || '--' }}</div>
+                            <div class="summary-sub">鍛戒腑浠诲姟鏈�鏅氬畬鎴愭椂闂�</div>
+                        </div>
+                        <div class="summary-card">
+                            <div class="summary-label">鎬讳换鍔℃�昏�楁椂</div>
+                            <div class="summary-value">{{ formatDuration(analysis.summary.taskDurationMs) }}</div>
+                            <div class="summary-sub">鏈�鏃╁垱寤哄埌鏈�鏅氬畬鎴�</div>
+                        </div>
+                        <div class="summary-card">
                             <div class="summary-label">骞冲潎鎬昏�楁椂</div>
                             <div class="summary-value">{{ formatDuration(analysis.summary.avgTotalDurationMs) }}</div>
                             <div class="summary-sub">鍒涘缓鍒板畬鎴愮殑骞冲潎鑰楁椂</div>

--
Gitblit v1.9.1