From 8027c8e2e0b5c559da612b187031dd6fd82d9bc7 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期六, 04 四月 2026 12:03:48 +0800
Subject: [PATCH] #任务分析异常修复
---
src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java | 209 +++++++++++++++++++++++++++++++++++++++++++++-------
1 files changed, 181 insertions(+), 28 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 da83645..6eab1a5 100644
--- a/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WrkAnalysisServiceImpl.java
@@ -75,7 +75,7 @@
if (wrkMast == null || wrkMast.getWrkNo() == null) {
return;
}
- WrkAnalysis entity = this.getById(wrkMast.getWrkNo());
+ WrkAnalysis entity = findActiveRecord(wrkMast.getWrkNo());
Date now = new Date();
if (entity == null) {
entity = new WrkAnalysis();
@@ -96,7 +96,11 @@
entity.setStationFaultDurationMs(defaultLong(entity.getStationFaultDurationMs()));
entity.setMetricCompleteness(METRIC_PARTIAL);
entity.setUpdateTime(now);
- this.saveOrUpdate(entity);
+ if (entity.getId() == null) {
+ this.save(entity);
+ } else {
+ this.updateById(entity);
+ }
}
@Override
@@ -220,6 +224,12 @@
@Override
@Transactional(rollbackFor = Exception.class)
public void finishTask(WrkMast wrkMast, Date finishTime) {
+ finishTask(wrkMast, finishTime, null);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void finishTask(WrkMast wrkMast, Date finishTime, Long wrkLogId) {
if (wrkMast == null || wrkMast.getWrkNo() == null) {
return;
}
@@ -238,7 +248,8 @@
&& entity.getStationDurationMs() == null) {
entity.setStationDurationMs(0L);
}
- FaultSummary faultSummary = buildFaultSummary(wrkMast.getWrkNo(), time);
+ entity.setWrkLogId(wrkLogId);
+ FaultSummary faultSummary = buildFaultSummary(wrkMast.getWrkNo(), entity.getAppeTime(), time);
entity.setHasFault(faultSummary.hasFault);
entity.setFaultCount(faultSummary.totalCount);
entity.setFaultDurationMs(faultSummary.totalDurationMs);
@@ -252,19 +263,21 @@
entity.setStationFaultDurationMs(faultSummary.stationDurationMs);
entity.setMetricCompleteness(resolveMetricCompleteness(wrkMast, entity));
entity.setUpdateTime(time);
- this.saveOrUpdate(entity);
+ this.updateById(entity);
}
@Override
- public Map<Integer, WrkAnalysis> mapByWrkNos(Collection<Integer> wrkNos) {
- Map<Integer, WrkAnalysis> result = new LinkedHashMap<>();
- if (wrkNos == null || wrkNos.isEmpty()) {
+ public Map<Long, WrkAnalysis> mapByWrkLogIds(Collection<Long> wrkLogIds) {
+ Map<Long, WrkAnalysis> result = new LinkedHashMap<>();
+ if (wrkLogIds == null || wrkLogIds.isEmpty()) {
return result;
}
- List<WrkAnalysis> list = this.listByIds(new LinkedHashSet<>(wrkNos));
+ List<WrkAnalysis> list = this.list(new QueryWrapper<WrkAnalysis>()
+ .in("wrk_log_id", new LinkedHashSet<>(wrkLogIds))
+ .orderByAsc("wrk_log_id", "id"));
for (WrkAnalysis item : list) {
- if (item != null && item.getWrkNo() != null) {
- result.put(item.getWrkNo(), item);
+ if (item != null && item.getWrkLogId() != null) {
+ result.put(item.getWrkLogId(), item);
}
}
return result;
@@ -316,11 +329,11 @@
QueryWrapper<WrkMastLog> wrapper = buildHistoryLogWrapper(param);
Page<WrkMastLog> page = wrkMastLogService.page(new Page<>(pageNo, pageSize), wrapper);
List<WrkMastLog> logList = page.getRecords();
- List<Integer> wrkNos = logList.stream().map(WrkMastLog::getWrkNo).filter(Objects::nonNull).collect(Collectors.toList());
- Map<Integer, WrkAnalysis> analysisMap = mapByWrkNos(wrkNos);
+ List<Long> logIds = logList.stream().map(WrkMastLog::getId).filter(Objects::nonNull).collect(Collectors.toList());
+ Map<Long, WrkAnalysis> analysisMap = mapByWrkLogIds(logIds);
List<Map<String, Object>> records = new ArrayList<>();
for (WrkMastLog log : logList) {
- records.add(toListItem(log, analysisMap.get(log.getWrkNo())));
+ records.add(toListItem(log, analysisMap.get(log.getId())));
}
Map<String, Object> data = new LinkedHashMap<>();
data.put("records", records);
@@ -340,7 +353,8 @@
QueryWrapper<WrkAnalysis> wrapper = buildAnalysisWrapper(request, mode);
List<WrkAnalysis> list = this.list(wrapper);
list.sort(Comparator.comparing(WrkAnalysis::getFinishTime, Comparator.nullsLast(Date::compareTo))
- .thenComparing(WrkAnalysis::getWrkNo, Comparator.nullsLast(Integer::compareTo)));
+ .thenComparing(WrkAnalysis::getWrkLogId, Comparator.nullsLast(Long::compareTo))
+ .thenComparing(WrkAnalysis::getId, Comparator.nullsLast(Long::compareTo)));
Collections.reverse(list);
String timeField = TIME_FIELD_FINISH;
if (TIME_FIELD_APPE.equalsIgnoreCase(request.getString("timeField"))) {
@@ -380,7 +394,7 @@
applyDeviceTypeFilter(wrapper, upperTrim(stringValue(param.get("deviceType"))));
applyRange(wrapper, "appe_time", stringValue(param.get("appeTimeRange")));
applyRange(wrapper, "modi_time", stringValue(param.get("finishTimeRange")));
- wrapper.orderByDesc("modi_time", "wrk_no");
+ wrapper.orderByDesc("modi_time", "id");
return wrapper;
}
@@ -413,6 +427,11 @@
wrapper.isNotNull("rgv_no");
}
if (MODE_TASK.equals(mode)) {
+ List<Long> wrkLogIds = parseLongIds(request.get("wrkLogIds"));
+ if (!wrkLogIds.isEmpty()) {
+ wrapper.in("wrk_log_id", wrkLogIds);
+ return wrapper;
+ }
List<Integer> wrkNos = parseWrkNos(request.get("wrkNos"));
if (wrkNos.isEmpty()) {
wrapper.eq("wrk_no", -1);
@@ -439,7 +458,7 @@
return;
}
QueryWrapper<WrkAnalysis> analysisWrapper = new QueryWrapper<>();
- analysisWrapper.select("wrk_no");
+ analysisWrapper.select("wrk_log_id");
if (DEVICE_TYPE_CRN.equals(deviceType)) {
analysisWrapper.isNotNull("crn_no");
} else if (DEVICE_TYPE_DUAL_CRN.equals(deviceType)) {
@@ -449,15 +468,15 @@
} else {
return;
}
- List<Integer> wrkNos = this.list(analysisWrapper).stream()
- .map(WrkAnalysis::getWrkNo)
+ List<Long> wrkLogIds = this.list(analysisWrapper).stream()
+ .map(WrkAnalysis::getWrkLogId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
- if (wrkNos.isEmpty()) {
- wrapper.eq("wrk_no", -1);
+ if (wrkLogIds.isEmpty()) {
+ wrapper.eq("id", -1);
return;
}
- wrapper.in("wrk_no", wrkNos);
+ wrapper.in("id", wrkLogIds);
}
private Map<String, Object> buildAnalysisResult(List<WrkAnalysis> list, String timeField) {
@@ -639,6 +658,7 @@
private Map<String, Object> toListItem(WrkMastLog log, WrkAnalysis analysis) {
Map<String, Object> item = new LinkedHashMap<>();
+ item.put("logId", log.getId());
item.put("wrkNo", log.getWrkNo());
item.put("wmsWrkNo", log.getWmsWrkNo());
item.put("wrkSts", log.getWrkSts());
@@ -660,6 +680,9 @@
private Map<String, Object> toDetailItem(WrkAnalysis item) {
Map<String, Object> result = new LinkedHashMap<>();
+ result.put("id", item.getId());
+ result.put("wrkLogId", item.getWrkLogId());
+ result.put("rowKey", buildRowKey(item));
result.put("wrkNo", item.getWrkNo());
result.put("wmsWrkNo", item.getWmsWrkNo());
result.put("ioType", item.getIoType());
@@ -692,15 +715,31 @@
target.put("metricCompleteness", analysis == null ? METRIC_PARTIAL : analysis.getMetricCompleteness());
}
- private FaultSummary buildFaultSummary(Integer wrkNo, Date finishTime) {
+ private FaultSummary buildFaultSummary(Integer wrkNo, Date taskStartTime, Date finishTime) {
FaultSummary summary = new FaultSummary();
if (wrkNo == null) {
return summary;
}
- 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));
+ List<BasCrnpErrLog> crnList = filterTaskFaultLogs(
+ basCrnpErrLogService.list(new QueryWrapper<BasCrnpErrLog>().eq("wrk_no", wrkNo)),
+ taskStartTime,
+ finishTime
+ );
+ List<BasDualCrnpErrLog> dualList = filterTaskFaultLogs(
+ basDualCrnpErrLogService.list(new QueryWrapper<BasDualCrnpErrLog>().eq("wrk_no", wrkNo)),
+ taskStartTime,
+ finishTime
+ );
+ List<BasRgvErrLog> rgvList = filterTaskFaultLogs(
+ basRgvErrLogService.list(new QueryWrapper<BasRgvErrLog>().eq("task_no", wrkNo)),
+ taskStartTime,
+ finishTime
+ );
+ List<BasStationErrLog> stationList = filterTaskFaultLogs(
+ basStationErrLogService.list(new QueryWrapper<BasStationErrLog>().eq("wrk_no", wrkNo)),
+ taskStartTime,
+ finishTime
+ );
summary.crnCount = crnList.size();
summary.crnDurationMs = durationMs(crnList, finishTime);
summary.dualCount = dualList.size();
@@ -758,13 +797,13 @@
if (wrkMast == null || wrkMast.getWrkNo() == null) {
return null;
}
- WrkAnalysis entity = this.getById(wrkMast.getWrkNo());
+ WrkAnalysis entity = findActiveRecord(wrkMast.getWrkNo());
if (entity != null) {
syncBaseFields(entity, wrkMast);
return entity;
}
initForTask(wrkMast);
- return this.getById(wrkMast.getWrkNo());
+ return findActiveRecord(wrkMast.getWrkNo());
}
private void syncBaseFields(WrkAnalysis entity, WrkMast wrkMast) {
@@ -787,6 +826,28 @@
return item.getAppeTime();
}
return item.getFinishTime();
+ }
+
+ private WrkAnalysis findActiveRecord(Integer wrkNo) {
+ if (wrkNo == null) {
+ return null;
+ }
+ return this.getOne(new QueryWrapper<WrkAnalysis>()
+ .eq("wrk_no", wrkNo)
+ .isNull("wrk_log_id")
+ .isNull("finish_time")
+ .orderByDesc("id")
+ .last("limit 1"), false);
+ }
+
+ private String buildRowKey(WrkAnalysis item) {
+ if (item.getWrkLogId() != null) {
+ return "log-" + item.getWrkLogId();
+ }
+ if (item.getId() != null) {
+ return "analysis-" + item.getId();
+ }
+ return "wrk-" + defaultInt(item.getWrkNo()) + "-" + defaultLong(item.getAppeTime() == null ? null : item.getAppeTime().getTime());
}
private Map<String, Object> option(String key, String code, String label, Object value) {
@@ -894,6 +955,59 @@
wrapper.le(column, DateUtils.convert(parts[1].trim()));
}
+ private <T> List<T> filterTaskFaultLogs(List<T> source, Date taskStartTime, Date taskFinishTime) {
+ if (source == null || source.isEmpty()) {
+ return Collections.emptyList();
+ }
+ return source.stream()
+ .filter(item -> overlapsTaskWindow(resolveFaultStartTime(item), resolveFaultEndTime(item), taskStartTime, taskFinishTime))
+ .collect(Collectors.toList());
+ }
+
+ private Date resolveFaultStartTime(Object item) {
+ if (item instanceof BasCrnpErrLog) {
+ return ((BasCrnpErrLog) item).getStartTime();
+ }
+ if (item instanceof BasDualCrnpErrLog) {
+ return ((BasDualCrnpErrLog) item).getStartTime();
+ }
+ if (item instanceof BasRgvErrLog) {
+ return ((BasRgvErrLog) item).getStartTime();
+ }
+ if (item instanceof BasStationErrLog) {
+ return ((BasStationErrLog) item).getStartTime();
+ }
+ return null;
+ }
+
+ private Date resolveFaultEndTime(Object item) {
+ if (item instanceof BasCrnpErrLog) {
+ return ((BasCrnpErrLog) item).getEndTime();
+ }
+ if (item instanceof BasDualCrnpErrLog) {
+ return ((BasDualCrnpErrLog) item).getEndTime();
+ }
+ if (item instanceof BasRgvErrLog) {
+ return ((BasRgvErrLog) item).getEndTime();
+ }
+ if (item instanceof BasStationErrLog) {
+ return ((BasStationErrLog) item).getEndTime();
+ }
+ return null;
+ }
+
+ private boolean overlapsTaskWindow(Date eventStartTime, Date eventEndTime, Date taskStartTime, Date taskFinishTime) {
+ long taskStart = taskStartTime == null ? Long.MIN_VALUE : taskStartTime.getTime();
+ long taskEnd = taskFinishTime == null ? Long.MAX_VALUE : taskFinishTime.getTime();
+ long eventStart = eventStartTime == null
+ ? (eventEndTime == null ? Long.MIN_VALUE : eventEndTime.getTime())
+ : eventStartTime.getTime();
+ long eventEnd = eventEndTime == null
+ ? (eventStartTime == null ? Long.MAX_VALUE : eventStartTime.getTime())
+ : eventEndTime.getTime();
+ return eventStart <= taskEnd && eventEnd >= taskStart;
+ }
+
private List<Integer> parseWrkNos(Object value) {
List<Integer> result = new ArrayList<>();
if (value == null) {
@@ -933,6 +1047,45 @@
return result;
}
+ private List<Long> parseLongIds(Object value) {
+ List<Long> result = new ArrayList<>();
+ if (value == null) {
+ return result;
+ }
+ if (value instanceof JSONArray) {
+ JSONArray array = (JSONArray) value;
+ for (int i = 0; i < array.size(); i++) {
+ Long item = parseLong(array.get(i));
+ if (item != null) {
+ result.add(item);
+ }
+ }
+ return result;
+ }
+ if (value instanceof Collection) {
+ for (Object item : (Collection<?>) value) {
+ Long parsed = parseLong(item);
+ if (parsed != null) {
+ result.add(parsed);
+ }
+ }
+ return result;
+ }
+ String text = String.valueOf(value).trim();
+ if (text.startsWith("[") && text.endsWith("]")) {
+ return parseLongIds(JSONArray.parseArray(text));
+ }
+ if (!Cools.isEmpty(text)) {
+ for (String part : text.split(",")) {
+ Long parsed = parseLong(part);
+ if (parsed != null) {
+ result.add(parsed);
+ }
+ }
+ }
+ return result;
+ }
+
private Integer parseInteger(Object value) {
if (value == null || Cools.isEmpty(value)) {
return null;
--
Gitblit v1.9.1