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