From aa710969e00e9d7e56a276066a239f74d5c49310 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期二, 31 三月 2026 21:47:07 +0800
Subject: [PATCH] #
---
src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java | 74 +++++++++++++++++++++++++++++++++----
1 files changed, 66 insertions(+), 8 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..da83645 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";
@@ -43,6 +46,7 @@
private final BasCrnpErrLogService basCrnpErrLogService;
private final BasDualCrnpErrLogService basDualCrnpErrLogService;
private final BasRgvErrLogService basRgvErrLogService;
+ private final BasStationErrLogService basStationErrLogService;
private final BasStationService basStationService;
private final BasWrkStatusService basWrkStatusService;
private final WrkMastService wrkMastService;
@@ -51,6 +55,7 @@
BasCrnpErrLogService basCrnpErrLogService,
BasDualCrnpErrLogService basDualCrnpErrLogService,
BasRgvErrLogService basRgvErrLogService,
+ BasStationErrLogService basStationErrLogService,
BasStationService basStationService,
BasWrkStatusService basWrkStatusService,
WrkMastService wrkMastService) {
@@ -58,6 +63,7 @@
this.basCrnpErrLogService = basCrnpErrLogService;
this.basDualCrnpErrLogService = basDualCrnpErrLogService;
this.basRgvErrLogService = basRgvErrLogService;
+ this.basStationErrLogService = basStationErrLogService;
this.basStationService = basStationService;
this.basWrkStatusService = basWrkStatusService;
this.wrkMastService = wrkMastService;
@@ -86,6 +92,8 @@
entity.setDualCrnFaultDurationMs(defaultLong(entity.getDualCrnFaultDurationMs()));
entity.setRgvFaultCount(defaultInt(entity.getRgvFaultCount()));
entity.setRgvFaultDurationMs(defaultLong(entity.getRgvFaultDurationMs()));
+ entity.setStationFaultCount(defaultInt(entity.getStationFaultCount()));
+ entity.setStationFaultDurationMs(defaultLong(entity.getStationFaultDurationMs()));
entity.setMetricCompleteness(METRIC_PARTIAL);
entity.setUpdateTime(now);
this.saveOrUpdate(entity);
@@ -184,7 +192,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 +233,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);
@@ -236,6 +248,8 @@
entity.setDualCrnFaultDurationMs(faultSummary.dualDurationMs);
entity.setRgvFaultCount(faultSummary.rgvCount);
entity.setRgvFaultDurationMs(faultSummary.rgvDurationMs);
+ entity.setStationFaultCount(faultSummary.stationCount);
+ entity.setStationFaultDurationMs(faultSummary.stationDurationMs);
entity.setMetricCompleteness(resolveMetricCompleteness(wrkMast, entity));
entity.setUpdateTime(time);
this.saveOrUpdate(entity);
@@ -263,6 +277,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));
@@ -464,6 +479,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 +612,25 @@
}
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());
+ addDeviceFaultDuration(durationMap, "杈撻�佺珯鐐�", null, item.getStationFaultDurationMs());
+ }
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) {
@@ -655,6 +688,7 @@
target.put("crnFaultDurationMs", analysis == null ? 0L : defaultLong(analysis.getCrnFaultDurationMs()));
target.put("dualCrnFaultDurationMs", analysis == null ? 0L : defaultLong(analysis.getDualCrnFaultDurationMs()));
target.put("rgvFaultDurationMs", analysis == null ? 0L : defaultLong(analysis.getRgvFaultDurationMs()));
+ target.put("stationFaultDurationMs", analysis == null ? 0L : defaultLong(analysis.getStationFaultDurationMs()));
target.put("metricCompleteness", analysis == null ? METRIC_PARTIAL : analysis.getMetricCompleteness());
}
@@ -666,14 +700,17 @@
List<BasCrnpErrLog> crnList = basCrnpErrLogService.list(new QueryWrapper<BasCrnpErrLog>().eq("wrk_no", wrkNo));
List<BasDualCrnpErrLog> dualList = basDualCrnpErrLogService.list(new QueryWrapper<BasDualCrnpErrLog>().eq("wrk_no", wrkNo));
List<BasRgvErrLog> rgvList = basRgvErrLogService.list(new QueryWrapper<BasRgvErrLog>().eq("task_no", wrkNo));
+ List<BasStationErrLog> stationList = basStationErrLogService.list(new QueryWrapper<BasStationErrLog>().eq("wrk_no", wrkNo));
summary.crnCount = crnList.size();
summary.crnDurationMs = durationMs(crnList, finishTime);
summary.dualCount = dualList.size();
summary.dualDurationMs = durationMs(dualList, finishTime);
summary.rgvCount = rgvList.size();
summary.rgvDurationMs = durationMs(rgvList, finishTime);
- summary.totalCount = summary.crnCount + summary.dualCount + summary.rgvCount;
- summary.totalDurationMs = summary.crnDurationMs + summary.dualDurationMs + summary.rgvDurationMs;
+ summary.stationCount = stationList.size();
+ summary.stationDurationMs = durationMs(stationList, finishTime);
+ summary.totalCount = summary.crnCount + summary.dualCount + summary.rgvCount + summary.stationCount;
+ summary.totalDurationMs = summary.crnDurationMs + summary.dualDurationMs + summary.rgvDurationMs + summary.stationDurationMs;
summary.hasFault = summary.totalCount > 0 ? 1 : 0;
return summary;
}
@@ -692,6 +729,9 @@
} else if (item instanceof BasRgvErrLog) {
startTime = ((BasRgvErrLog) item).getStartTime();
endTime = ((BasRgvErrLog) item).getEndTime();
+ } else if (item instanceof BasStationErrLog) {
+ startTime = ((BasStationErrLog) item).getStartTime();
+ endTime = ((BasStationErrLog) item).getEndTime();
}
if (startTime == null) {
continue;
@@ -800,6 +840,9 @@
if (Objects.equals(ioType, WrkIoType.LOC_MOVE.id)) {
return "绉诲簱";
}
+ if (Objects.equals(ioType, WrkIoType.CRN_MOVE.id)) {
+ return "鍫嗗灈鏈虹Щ鍔�";
+ }
return String.valueOf(ioType);
}
@@ -824,6 +867,19 @@
count++;
}
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) {
@@ -936,6 +992,8 @@
private long dualDurationMs;
private int rgvCount;
private long rgvDurationMs;
+ private int stationCount;
+ private long stationDurationMs;
}
private static class BucketAccumulator {
--
Gitblit v1.9.1