From 628aa6a42e587e9f337e213f87f922fc2ab2af02 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期二, 02 十二月 2025 17:00:39 +0800
Subject: [PATCH] 修改卧转立扫码到卧转立任务流转,卧转立判断玻璃超时时间
---
mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java | 152 ++++++++++++++++++++++++++++++++++++++++++++------
1 files changed, 133 insertions(+), 19 deletions(-)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java b/mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java
index 986a06b..2156e46 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java
@@ -165,6 +165,12 @@
log.info("妫�娴嬪埌鎵爜璁惧锛屽噯澶囧惎鍔ㄥ畾鏃跺櫒: deviceId={}, deviceType={}, deviceName={}",
device.getId(), device.getDeviceType(), device.getDeviceName());
TaskStepDetail step = createStepRecord(task, device, currentOrder);
+ // 璁剧疆姝ラ涓鸿繍琛岀姸鎬侊紝骞惰缃紑濮嬫椂闂�
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ step.setStartTime(new Date());
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+
ScheduledFuture<?> scannerTask = startScannerTimer(task, step, device, context);
if (scannerTask != null) {
registerScheduledTask(task.getTaskId(), scannerTask);
@@ -187,6 +193,12 @@
log.info("妫�娴嬪埌鍗ц浆绔嬭澶囷紝鍑嗗鍚姩瀹氭椂鍣�: deviceId={}, deviceType={}, deviceName={}",
device.getId(), device.getDeviceType(), device.getDeviceName());
TaskStepDetail step = createStepRecord(task, device, currentOrder);
+ // 璁剧疆姝ラ涓鸿繍琛岀姸鎬侊紝骞惰缃紑濮嬫椂闂�
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ step.setStartTime(new Date());
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+
ScheduledFuture<?> transferTask = startTransferTimer(task, step, device, context);
if (transferTask != null) {
registerScheduledTask(task.getTaskId(), transferTask);
@@ -209,6 +221,12 @@
boolean isInboundVehicle = currentLoadVehicleIndex == 1; // 绗竴涓ぇ杞︽槸杩涚墖澶ц溅
TaskStepDetail step = createStepRecord(task, device, currentOrder);
+ // 璁剧疆姝ラ涓鸿繍琛岀姸鎬侊紝骞惰缃紑濮嬫椂闂�
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ step.setStartTime(new Date());
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+
ScheduledFuture<?> vehicleTask;
if (isInboundVehicle) {
// 杩涚墖澶ц溅锛氱洃鎺у閲忥紝鍔ㄦ�佸垽鏂�
@@ -242,6 +260,12 @@
// 4. 澶х悊鐗囩璁惧锛氬惎鍔ㄥ畾鏃跺櫒閫昏緫澶勭悊锛堜笉娑夊強PLC浜や簰锛屽彧璐熻矗閫昏緫澶勭悊锛�
if (isLargeGlass) {
TaskStepDetail step = createStepRecord(task, device, currentOrder);
+ // 璁剧疆姝ラ涓鸿繍琛岀姸鎬侊紝骞惰缃紑濮嬫椂闂�
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ step.setStartTime(new Date());
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+
ScheduledFuture<?> largeGlassTask = startLargeGlassTimer(task, step, device, context);
if (largeGlassTask != null) {
registerScheduledTask(task.getTaskId(), largeGlassTask);
@@ -392,6 +416,17 @@
log.info("鍗ц浆绔嬫壂鐮佸畾鏃跺櫒瀹屾垚: taskId={}, deviceId={}, processed={}/{}, success={}, fail={}",
task.getTaskId(), device.getId(), processedCount.get(), glassIds.size(),
successCount.get(), failCount.get());
+ // 鑻ヤ箣鍓嶆湭鍑虹幇澶辫触锛屽啀灏嗙姸鎬佺疆涓哄畬鎴�
+ boolean alreadyFailed = TaskStepDetail.Status.FAILED.name().equals(step.getStatus());
+ if (!alreadyFailed) {
+ step.setStatus(TaskStepDetail.Status.COMPLETED.name());
+ step.setSuccessMessage(String.format("宸插畬鎴愭壂鎻�: 鎴愬姛=%d, 澶辫触=%d", successCount.get(), failCount.get()));
+ if (step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
deviceCoordinationService.syncDeviceStatus(device,
DeviceCoordinationService.DeviceStatus.COMPLETED, context);
return;
@@ -492,15 +527,21 @@
if (handler != null) {
DevicePlcVO.OperationResult result = handler.execute(device, "checkAndProcess", params);
- // 鏇存柊姝ラ鐘舵��
- updateStepStatus(step, result);
+ // 鏇存柊姝ラ鐘舵�侊紙鍖哄垎绛夊緟涓拰鐪熸瀹屾垚锛�
+ updateStepStatusForTransfer(step, result);
// 閫氱煡姝ラ鏇存柊锛堣鍓嶇瀹炴椂鐪嬪埌姝ラ鐘舵�侊級
notificationService.notifyStepUpdate(task.getTaskId(), step);
boolean opSuccess = Boolean.TRUE.equals(result.getSuccess());
updateTaskProgress(task, step.getStepOrder(), opSuccess);
if (opSuccess) {
- log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒鎵ц鎴愬姛: taskId={}, deviceId={}, message={}",
- task.getTaskId(), device.getId(), result.getMessage());
+ String message = result.getMessage();
+ if (message != null && message.contains("鎵规宸插啓鍏LC")) {
+ log.info("鍗ц浆绔嬭澶囧畾鏃跺櫒鎵ц鎴愬姛锛堝凡鍐欏叆PLC锛�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), message);
+ } else {
+ log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒绛夊緟涓�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), message);
+ }
} else {
log.warn("鍗ц浆绔嬭澶囧畾鏃跺櫒鎵ц澶辫触: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), result.getMessage());
@@ -544,28 +585,27 @@
task.getTaskId(), device.getId());
return;
}
- // 妫�鏌ユ槸鍚︽湁宸叉壂鎻忕殑鐜荤拑淇℃伅
- List<String> scannedGlassIds = getScannedGlassIds(context);
- if (CollectionUtils.isEmpty(scannedGlassIds)) {
- // 娌℃湁宸叉壂鎻忕殑鐜荤拑锛岀‘淇濆崸杞珛鎵爜缁х画杩愯
- setScannerPause(context, false);
+ // 妫�鏌ユ槸鍚︽湁鍗ц浆绔嬩富浣撳凡杈撳嚭銆佸噯澶囦笂澶ц溅鐨勭幓鐠冧俊鎭�
+ List<String> readyGlassIds = getTransferReadyGlassIds(context);
+ if (CollectionUtils.isEmpty(readyGlassIds)) {
+ // 娌℃湁鍗ц浆绔嬭緭鍑虹殑鐜荤拑锛岀户缁瓑寰�
return;
}
// 濡傛灉鐜荤拑ID鏁伴噺娌℃湁鍙樺寲锛岃鏄庢病鏈夋柊鐨勭幓鐠冿紝缁х画绛夊緟
- int currentCount = scannedGlassIds.size();
+ int currentCount = readyGlassIds.size();
if (currentCount == lastProcessedCount.get()) {
log.debug("澶ц溅璁惧瀹氭椂鍣細鐜荤拑ID鏁伴噺鏈彉鍖栵紝缁х画绛夊緟: taskId={}, deviceId={}, count={}",
task.getTaskId(), device.getId(), currentCount);
return;
}
- log.info("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄦ娴嬪埌鏂扮殑鐜荤拑淇℃伅: taskId={}, deviceId={}, glassCount={}",
+ log.info("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄦ娴嬪埌鍗ц浆绔嬭緭鍑虹殑鐜荤拑淇℃伅: taskId={}, deviceId={}, glassCount={}",
task.getTaskId(), device.getId(), currentCount);
// 妫�鏌ュ閲�
Map<String, Object> checkParams = new HashMap<>();
- checkParams.put("glassIds", new ArrayList<>(scannedGlassIds));
+ checkParams.put("glassIds", new ArrayList<>(readyGlassIds));
checkParams.put("_taskContext", context);
DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType());
@@ -579,19 +619,18 @@
if (Boolean.TRUE.equals(result.getSuccess())) {
log.info("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄦ墽琛屾垚鍔�: taskId={}, deviceId={}, glassCount={}",
- task.getTaskId(), device.getId(), scannedGlassIds.size());
+ task.getTaskId(), device.getId(), readyGlassIds.size());
// 灏嗗凡瑁呰浇鐨勭幓鐠僆D淇濆瓨鍒板叡浜暟鎹腑锛堜緵澶х悊鐗囩浣跨敤锛�
- setLoadedGlassIds(context, new ArrayList<>(scannedGlassIds));
- // 娓呯┖宸叉壂鎻忕殑鐜荤拑ID鍒楄〃锛堝凡澶勭悊锛�
- clearScannedGlassIds(context);
+ setLoadedGlassIds(context, new ArrayList<>(readyGlassIds));
+ // 娓呯┖鍗ц浆绔嬭緭鍑虹殑鐜荤拑ID鍒楄〃锛堝凡澶勭悊锛�
+ clearTransferReadyGlassIds(context);
lastProcessedCount.set(0);
// 纭繚鍗ц浆绔嬫壂鐮佺户缁繍琛�
setScannerPause(context, false);
} else {
- // 瑁呬笉涓嬶紝閫氱煡鍗ц浆绔嬫壂鐮佹殏鍋�
- log.warn("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄥ閲忎笉瓒�: taskId={}, deviceId={}, message={}, 宸查�氱煡鍗ц浆绔嬫壂鐮佹殏鍋�",
+ // 瑁呬笉涓嬶紝璁板綍瀹归噺涓嶈冻锛堟槸鍚﹂渶瑕佸奖鍝嶆壂鐮佺敱宸ヨ壓鍐嶅喅瀹氾級
+ log.warn("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄥ閲忎笉瓒�: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), result.getMessage());
- setScannerPause(context, true);
lastProcessedCount.set(currentCount); // 璁板綍褰撳墠鏁伴噺锛岄伩鍏嶉噸澶嶆鏌�
}
@@ -942,6 +981,30 @@
context.getSharedData().put("scannedGlassIds", new ArrayList<>());
}
}
+
+ /**
+ * 鑾峰彇鍗ц浆绔嬩富浣撳凡杈撳嚭銆佸噯澶囦笂澶ц溅鐨勭幓鐠僆D鍒楄〃
+ */
+ @SuppressWarnings("unchecked")
+ private List<String> getTransferReadyGlassIds(TaskExecutionContext context) {
+ if (context == null) {
+ return Collections.emptyList();
+ }
+ Object glassIds = context.getSharedData().get("transferReadyGlassIds");
+ if (glassIds instanceof List) {
+ return new ArrayList<>((List<String>) glassIds);
+ }
+ return Collections.emptyList();
+ }
+
+ /**
+ * 娓呯┖鍗ц浆绔嬩富浣撳凡杈撳嚭鐨勭幓鐠僆D鍒楄〃
+ */
+ private void clearTransferReadyGlassIds(TaskExecutionContext context) {
+ if (context != null) {
+ context.getSharedData().put("transferReadyGlassIds", new ArrayList<>());
+ }
+ }
/**
* 娉ㄥ唽瀹氭椂鍣ㄤ换鍔�
@@ -1025,15 +1088,66 @@
if (success) {
// 鎴愬姛鏃讹紝濡傛灉鏈夋秷鎭垯淇濆瓨锛堢敤浜庢彁绀轰俊鎭級锛屽惁鍒欐竻绌�
step.setSuccessMessage(StringUtils.hasText(message) ? message : null);
+ // 濡傛灉鐘舵�佸彉涓哄畬鎴愶紝璁剧疆缁撴潫鏃堕棿
+ if (TaskStepDetail.Status.COMPLETED.name().equals(step.getStatus()) && step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
} else {
// 澶辫触鏃朵繚瀛橀敊璇秷鎭�
step.setErrorMessage(message);
+ // 濡傛灉鐘舵�佸彉涓哄け璐ワ紝璁剧疆缁撴潫鏃堕棿
+ if (TaskStepDetail.Status.FAILED.name().equals(step.getStatus()) && step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
}
step.setOutputData(toJson(result));
taskStepDetailMapper.updateById(step);
}
/**
+ * 鏇存柊鍗ц浆绔嬭澶囨楠ょ姸鎬侊紙鍖哄垎绛夊緟涓拰鐪熸瀹屾垚锛�
+ */
+ private void updateStepStatusForTransfer(TaskStepDetail step, DevicePlcVO.OperationResult result) {
+ if (step == null || result == null) {
+ return;
+ }
+ boolean success = Boolean.TRUE.equals(result.getSuccess());
+ String message = result.getMessage();
+
+ // 鍒ゆ柇鏄惁鐪熸瀹屾垚锛堝彧鏈夊啓鍏LC鎵嶇畻瀹屾垚锛�
+ boolean isRealCompleted = success && message != null && message.contains("鎵规宸插啓鍏LC");
+
+ if (isRealCompleted) {
+ // 鐪熸瀹屾垚锛氳缃负瀹屾垚鐘舵�侊紝骞惰缃粨鏉熸椂闂�
+ step.setStatus(TaskStepDetail.Status.COMPLETED.name());
+ step.setSuccessMessage(message);
+ if (step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
+ } else if (success) {
+ // 绛夊緟涓細淇濇寔杩愯鐘舵�侊紝鍙洿鏂版秷鎭�
+ if (!TaskStepDetail.Status.RUNNING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ }
+ step.setSuccessMessage(message);
+ // 纭繚寮�濮嬫椂闂村凡璁剧疆
+ if (step.getStartTime() == null) {
+ step.setStartTime(new Date());
+ }
+ } else {
+ // 澶辫触锛氳缃负澶辫触鐘舵�侊紝骞惰缃粨鏉熸椂闂�
+ step.setStatus(TaskStepDetail.Status.FAILED.name());
+ step.setErrorMessage(message);
+ if (step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
+ }
+
+ step.setOutputData(toJson(result));
+ taskStepDetailMapper.updateById(step);
+ }
+
+ /**
* 鍒涘缓姝ラ鎽樿
*/
private Map<String, Object> createStepSummary(String deviceName, boolean success, String message) {
--
Gitblit v1.8.0