From 9a9479a5e34324822b223747b7c88ff060466db0 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期四, 04 十二月 2025 16:58:29 +0800
Subject: [PATCH] 修改任务定时触发大车逻辑,循环检查mes值是否符合
---
mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java | 408 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 369 insertions(+), 39 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 627c88e..e2d0469 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
@@ -102,6 +102,8 @@
TaskExecutionContext context = new TaskExecutionContext(parameters);
runningTaskContexts.put(task.getTaskId(), context);
+ // 灏嗘湰娆′换鍔℃秹鍙婄殑璁惧鍒楄〃瀛樺叆涓婁笅鏂囷紝渚夸簬鍙栨秷浠诲姟鏃跺仛璁惧绾ф敹灏撅紙濡傚仠姝㈠ぇ杞﹀唴閮ㄧ洃鎺у畾鏃跺櫒锛�
+ context.getSharedData().put("devices", devices);
task.setTotalSteps(devices.size());
task.setStatus(MultiDeviceTask.Status.RUNNING.name());
@@ -340,6 +342,35 @@
if (context != null) {
context.getSharedData().put("taskCancelled", true);
log.warn("宸叉爣璁颁换鍔″彇娑�: taskId={}", taskId);
+
+ // 鍚屾椂閫氱煡鐩稿叧璁惧閫昏緫澶勭悊鍣ㄦ墽琛屽彇娑堟敹灏鹃�昏緫锛堜緥濡傚仠姝㈠ぇ杞﹀唴閮ㄧ殑鐩戞帶瀹氭椂鍣級
+ try {
+ Map<String, Object> cancelParams = new HashMap<>();
+ cancelParams.put("_taskContext", context);
+ Object devicesObj = context.getSharedData().get("devices");
+ if (devicesObj instanceof List) {
+ @SuppressWarnings("unchecked")
+ List<DeviceConfig> devices = (List<DeviceConfig>) devicesObj;
+ for (DeviceConfig device : devices) {
+ if (device == null) {
+ continue;
+ }
+ try {
+ DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType());
+ if (handler != null) {
+ // 鐩墠澶ц溅閫昏緫澶勭悊鍣ㄤ細鍦╮eset/clear绛夋搷浣滀腑鍋滄鍐呴儴鐩戞帶瀹氭椂鍣�
+ // 杩欓噷缁熶竴璋冪敤涓�娆♀�渞eset鈥濅綔涓轰换鍔″彇娑堟椂鐨勬敹灏惧姩浣�
+ handler.execute(device, "reset", cancelParams);
+ }
+ } catch (Exception e) {
+ log.warn("浠诲姟鍙栨秷鏃舵墽琛岃澶囨敹灏�(reset)澶辫触: taskId={}, deviceId={}, error={}",
+ taskId, device.getId(), e.getMessage());
+ }
+ }
+ }
+ } catch (Exception e) {
+ log.warn("浠诲姟鍙栨秷鏃舵墽琛岃澶囨敹灏鹃�昏緫寮傚父: taskId={}, error={}", taskId, e.getMessage());
+ }
} else {
log.warn("璇锋眰鍙栨秷浠诲姟浣嗘湭鎵惧埌涓婁笅鏂�: taskId={}", taskId);
}
@@ -382,10 +413,13 @@
ScheduledFuture<?> future = scheduledExecutor.scheduleWithFixedDelay(() -> {
try {
if (isTaskCancelled(context)) {
- log.debug("浠诲姟宸插彇娑堬紝鍋滄鍗ц浆绔嬫壂鐮佸畾鏃跺櫒: taskId={}, deviceId={}",
+ log.debug("浠诲姟宸插彇娑堬紝鍋滄鍗ц浆绔嬫壂鐮佸畾鏃跺櫒: taskId={}, deviceId={}",
task.getTaskId(), device.getId());
return;
}
+ // 瀹氭椂鍣ㄧ涓�娆℃墽琛屾椂锛屽皢璁惧鐘舵�佷粠 WAITING 璁剧疆涓� RUNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
ensureStepRunning(step, task.getTaskId());
// 妫�鏌ユ槸鍚﹂渶瑕佹殏鍋�
if (shouldPauseScanner(context)) {
@@ -484,6 +518,8 @@
}
}, 0, scanIntervalMs, TimeUnit.MILLISECONDS);
+ // 鍦ㄤ覆琛屾墽琛屾ā寮忎笅锛屾壂鐮佽澶囨槸绗竴涓紝搴旇绔嬪嵆璁剧疆涓� RUNNING
+ // 鍏朵粬璁惧淇濇寔 WAITING锛岀洿鍒板畠浠湡姝e紑濮嬪伐浣�
deviceCoordinationService.syncDeviceStatus(device,
DeviceCoordinationService.DeviceStatus.RUNNING, context);
return future;
@@ -509,6 +545,9 @@
task.getTaskId(), device.getId(), monitorIntervalMs);
// 鍚姩瀹氭椂浠诲姟
+ // 浣跨敤AtomicBoolean鏍囪鏄惁绗竴娆℃墽琛�
+ final java.util.concurrent.atomic.AtomicBoolean firstExecution = new java.util.concurrent.atomic.AtomicBoolean(true);
+
ScheduledFuture<?> future = scheduledExecutor.scheduleWithFixedDelay(() -> {
try {
if (isTaskCancelled(context)) {
@@ -516,7 +555,14 @@
task.getTaskId(), device.getId());
return;
}
- ensureStepRunning(step, task.getTaskId());
+
+ // 濡傛灉姝ラ宸茬粡瀹屾垚锛屼笉鍐嶆墽琛屽悗缁�昏緫锛堥伩鍏嶇姸鎬佽閲嶇疆锛�
+ if (TaskStepDetail.Status.COMPLETED.name().equals(step.getStatus())) {
+ log.debug("鍗ц浆绔嬭澶囨楠ゅ凡瀹屾垚锛屽仠姝㈠畾鏃跺櫒鎵ц: taskId={}, deviceId={}",
+ task.getTaskId(), device.getId());
+ return;
+ }
+
// 鏋勫缓鍙傛暟
Map<String, Object> params = new HashMap<>();
params.put("_taskContext", context);
@@ -529,19 +575,61 @@
if (handler != null) {
DevicePlcVO.OperationResult result = handler.execute(device, "checkAndProcess", params);
+ // 妫�鏌ユ槸鍚︽湁鏁版嵁锛氬鏋滄湁鏁版嵁鎴栨鍦ㄥ鐞嗭紝璁剧疆涓篟UNNING锛涘鏋滅紦鍐查槦鍒椾负绌轰笖鏃犲緟澶勭悊鐜荤拑锛屼繚鎸丳ENDING
+ String message = result.getMessage();
+ boolean hasData = result.getSuccess() != null && result.getSuccess()
+ && message != null && !message.contains("缂撳啿闃熷垪涓虹┖锛屾棤寰呭鐞嗙幓鐠�");
+
+ // 濡傛灉褰撳墠鏄疨ENDING鐘舵�侊紝涓旀娴嬪埌鏈夋暟鎹紝鍒欒缃负RUNNING锛堣澶囧紑濮嬪伐浣滐級
+ boolean isPending = TaskStepDetail.Status.PENDING.name().equals(step.getStatus());
+
+ if (hasData && isPending) {
+ // 妫�娴嬪埌鏁版嵁涓斿綋鍓嶆槸绛夊緟鐘舵�侊紝璁惧寮�濮嬪伐浣滐紝璁剧疆涓篟UNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ if (step.getStartTime() == null) {
+ step.setStartTime(new Date());
+ }
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒妫�娴嬪埌鏁版嵁锛屼粠PENDING杞负RUNNING: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), message);
+ } else if (!hasData) {
+ // 娌℃湁鏁版嵁锛屼繚鎸丳ENDING鐘舵�侊紝绛夊緟鎵爜璁惧杈撳嚭
+ if (firstExecution.compareAndSet(true, false)) {
+ // 绗竴娆℃墽琛岋紝纭繚鐘舵�佹槸PENDING
+ if (!TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("绛夊緟鎵爜璁惧杈撳嚭鏁版嵁");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
+ log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒绗竴娆℃墽琛岋紝鏃犳暟鎹紝淇濇寔PENDING: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), message);
+ }
+ return; // 涓嶆墽琛屽悗缁�昏緫锛岀瓑寰呬笅涓�娆″畾鏃跺櫒瑙﹀彂
+ }
+
// 鏇存柊姝ラ鐘舵�侊紙鍖哄垎绛夊緟涓拰鐪熸瀹屾垚锛�
- updateStepStatusForTransfer(step, result);
+ updateStepStatusForTransfer(step, result, device, context);
// 閫氱煡姝ラ鏇存柊锛堣鍓嶇瀹炴椂鐪嬪埌姝ラ鐘舵�侊級
notificationService.notifyStepUpdate(task.getTaskId(), step);
boolean opSuccess = Boolean.TRUE.equals(result.getSuccess());
updateTaskProgress(task, step.getStepOrder(), opSuccess);
+
+ // 鏍规嵁鎵ц缁撴灉鏇存柊璁惧鐘舵��
+ // 娉ㄦ剰锛氳澶囧凡缁忓紑濮嬪伐浣滐紙瀹氭椂鍣ㄥ凡鎵ц锛夛紝鎵�浠ュ簲璇ヤ繚鎸丷UNNING鐘舵��
+ // 鍙湁鍦ㄧ湡姝e畬鎴愭椂鎵嶈缃负COMPLETED
if (opSuccess) {
- String message = result.getMessage();
+ // 璁惧姝e湪宸ヤ綔锛堢瓑寰呯紦鍐层�佸鐞嗕腑绛夛級锛屼繚鎸丷UNNING鐘舵��
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
if (message != null && message.contains("鎵规宸插啓鍏LC")) {
- log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒鎵ц鎴愬姛锛堝凡鍐欏叆PLC锛�: taskId={}, deviceId={}, message={}",
+ log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒鎵ц鎴愬姛锛堝凡鍐欏叆PLC锛�: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), message);
} else {
- log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒绛夊緟涓�: taskId={}, deviceId={}, message={}",
+ log.debug("鍗ц浆绔嬭澶囧畾鏃跺櫒宸ヤ綔涓紙绛夊緟缂撳啿锛�: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), message);
}
} else {
@@ -556,8 +644,9 @@
}
}, 0, monitorIntervalMs, TimeUnit.MILLISECONDS);
+ // 鍦ㄤ覆琛屾墽琛屾ā寮忎笅锛岃澶囧惎鍔ㄥ畾鏃跺櫒鏃跺厛璁剧疆涓� WAITING锛屽畾鏃跺櫒绗竴娆℃墽琛屾椂鍐嶈缃负 RUNNING
deviceCoordinationService.syncDeviceStatus(device,
- DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
return future;
} catch (Exception e) {
log.error("鍚姩鍗ц浆绔嬭澶囧畾鏃跺櫒澶辫触: taskId={}, deviceId={}", task.getTaskId(), device.getId(), e);
@@ -587,17 +676,30 @@
task.getTaskId(), device.getId());
return;
}
- ensureStepRunning(step, task.getTaskId());
+ // 杩涚墖澶ц溅璁惧锛氬彧鏈夊湪鐪熸寮�濮嬪鐞嗘椂鎵嶈缃负RUNNING
// 妫�鏌ユ槸鍚︽湁鍗ц浆绔嬩富浣撳凡杈撳嚭銆佸噯澶囦笂澶ц溅鐨勭幓鐠冧俊鎭�
List<String> readyGlassIds = getTransferReadyGlassIds(context);
+
+ // 濡傛灉褰撳墠娌℃湁鏂扮殑鐜荤拑锛屾棤璁烘楠ゆ槸鍚﹀凡杩涘叆RUNNING锛岄兘搴旇杞MES浠诲姟/纭鐘舵��
if (CollectionUtils.isEmpty(readyGlassIds)) {
- // 娌℃湁鍗ц浆绔嬭緭鍑虹殑鐜荤拑锛岀户缁瓑寰�
+ // 杞MES浠诲姟/纭锛岄伩鍏嶉敊杩嘙ES渚у悗鍐欏叆鐨勪换鍔�
+ pollMesForVehicle(task, step, device, context);
+ // 濡傛灉浠嶇劧娌℃湁鍗ц浆绔嬭緭鍑虹殑鐜荤拑锛屼繚鎸�/鏇存柊涓篜ENDING鎻愮ず
+ if (!TaskStepDetail.Status.RUNNING.name().equals(step.getStatus())
+ && !TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("绛夊緟鍗ц浆绔嬭緭鍑虹幓鐠�");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
return;
}
- // 濡傛灉鐜荤拑ID鏁伴噺娌℃湁鍙樺寲锛岃鏄庢病鏈夋柊鐨勭幓鐠冿紝缁х画绛夊緟
+ // 濡傛灉鐜荤拑ID鏁伴噺娌℃湁鍙樺寲锛岃鏄庢病鏈夋柊鐨勭幓鐠�
int currentCount = readyGlassIds.size();
if (currentCount == lastProcessedCount.get()) {
+ // 鐜荤拑鏁伴噺娌℃湁鍙樺寲锛氭病鏈夋柊鐜荤拑锛屼絾浠嶉渶杞MES浠诲姟/纭锛岄伩鍏嶉敊杩嘙ES渚х殑鍙樺寲
+ pollMesForVehicle(task, step, device, context);
log.debug("澶ц溅璁惧瀹氭椂鍣細鐜荤拑ID鏁伴噺鏈彉鍖栵紝缁х画绛夊緟: taskId={}, deviceId={}, count={}",
task.getTaskId(), device.getId(), currentCount);
return;
@@ -622,6 +724,18 @@
DevicePlcVO.OperationResult feedResult = handler.execute(device, "feedGlass", checkParams);
if (Boolean.TRUE.equals(feedResult.getSuccess())) {
+ // 鐪熸寮�濮嬪鐞嗭紝璁剧疆涓篟UNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ // 姝ラ鐘舵�佷篃璁剧疆涓篟UNNING
+ if (!TaskStepDetail.Status.RUNNING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ if (step.getStartTime() == null) {
+ step.setStartTime(new Date());
+ }
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
log.debug("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄦ墽琛屾垚鍔�: taskId={}, deviceId={}, glassCount={}",
task.getTaskId(), device.getId(), readyGlassIds.size());
// 灏嗗凡瑁呰浇鐨勭幓鐠僆D淇濆瓨鍒板叡浜暟鎹腑锛堜緵澶х悊鐗囩浣跨敤锛�
@@ -631,7 +745,29 @@
lastProcessedCount.set(0);
// 纭繚鍗ц浆绔嬫壂鐮佺户缁繍琛�
setScannerPause(context, false);
+
+ // feedGlass鎴愬姛鍚庯紝鍏堟鏌ES浠诲姟锛坈heckMesTask锛夋潵寮�濮嬫墽琛屼换鍔�
+ DevicePlcVO.OperationResult mesTaskResult = null;
+ try {
+ mesTaskResult = handler.execute(device, "checkMesTask", Collections.emptyMap());
+ if (mesTaskResult != null && Boolean.TRUE.equals(mesTaskResult.getSuccess())) {
+ log.info("杩涚墖澶ц溅璁惧宸叉鏌ES浠诲姟骞跺紑濮嬫墽琛�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), mesTaskResult.getMessage());
+ }
+ } catch (Exception e) {
+ log.warn("杩涚墖澶ц溅璁惧妫�鏌ES浠诲姟寮傚父: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
} else {
+ // 瑁呬笉涓嬶紝淇濇寔WAITING鐘舵�佸拰PENDING姝ラ鐘舵��
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
+ if (!TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("瀹归噺涓嶈冻锛岀瓑寰呬腑");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
// 瑁呬笉涓嬶紝璁板綍瀹归噺涓嶈冻锛堟槸鍚﹂渶瑕佸奖鍝嶆壂鐮佺敱宸ヨ壓鍐嶅喅瀹氾級
log.warn("杩涚墖澶ц溅璁惧瀹氭椂鍣ㄥ閲忎笉瓒�: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), feedResult.getMessage());
@@ -639,6 +775,7 @@
}
// 绗簩姝ワ細妫�鏌ES纭鐘舵�侊紙濡傛灉澶ц溅澶勭悊鍣ㄦ敮鎸佺殑璇濓級
+ // 鍙湁鍦ㄤ换鍔″凡寮�濮嬫墽琛岋紙鏈変换鍔¤褰曪級鏃舵墠妫�鏌ES纭
DevicePlcVO.OperationResult mesResult = null;
try {
mesResult = handler.execute(device, "checkMesConfirm", Collections.emptyMap());
@@ -671,8 +808,9 @@
}
}, 0, MONITOR_INTERVAL_MS, TimeUnit.MILLISECONDS);
+ // 鍦ㄤ覆琛屾墽琛屾ā寮忎笅锛岃澶囧惎鍔ㄥ畾鏃跺櫒鏃跺厛璁剧疆涓� WAITING锛屽畾鏃跺櫒绗竴娆℃墽琛屾椂鍐嶈缃负 RUNNING
deviceCoordinationService.syncDeviceStatus(device,
- DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
return future;
} catch (Exception e) {
log.error("鍚姩杩涚墖澶ц溅璁惧瀹氭椂鍣ㄥけ璐�: taskId={}, deviceId={}", task.getTaskId(), device.getId(), e);
@@ -701,13 +839,65 @@
task.getTaskId(), device.getId());
return;
}
- ensureStepRunning(step, task.getTaskId());
+ // 鍑虹墖澶ц溅璁惧锛氬彧鏈夊湪鐪熸寮�濮嬪鐞嗘椂鎵嶈缃负RUNNING
// 妫�鏌ユ槸鍚︽湁宸插鐞嗙殑鐜荤拑淇℃伅锛堜粠澶х悊鐗囩鏉ョ殑锛�
List<String> processedGlassIds = getProcessedGlassIds(context);
+ boolean isRunning = TaskStepDetail.Status.RUNNING.name().equals(step.getStatus());
+
+ // 濡傛灉璁惧宸茬粡鍦ㄨ繍琛屼腑锛屽嵆浣挎病鏈夋柊鐜荤拑锛屼篃瑕佺户缁洃鎺ES浠诲姟鍜岀‘璁ょ姸鎬�
if (CollectionUtils.isEmpty(processedGlassIds)) {
- log.debug("鍑虹墖澶ц溅璁惧瀹氭椂鍣細鏆傛棤宸插鐞嗙殑鐜荤拑淇℃伅: taskId={}, deviceId={}",
- task.getTaskId(), device.getId());
- return;
+ if (isRunning) {
+ // 璁惧姝e湪杩愯涓紝鍏堟鏌ES浠诲姟锛岀劧鍚庣洃鎺ES纭鐘舵��
+ DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType());
+ if (handler != null) {
+ Map<String, Object> logicParams = parseLogicParams(device);
+
+ // 鍏堟鏌ES浠诲姟锛堝鏋渕esSend=1锛屼細鍒涘缓浠诲姟骞跺紑濮嬫墽琛岋級
+ DevicePlcVO.OperationResult mesTaskResult = null;
+ try {
+ mesTaskResult = handler.execute(device, "checkMesTask", Collections.emptyMap());
+ if (mesTaskResult != null && Boolean.TRUE.equals(mesTaskResult.getSuccess())) {
+ log.info("鍑虹墖澶ц溅璁惧宸叉鏌ES浠诲姟骞跺紑濮嬫墽琛�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), mesTaskResult.getMessage());
+ }
+ } catch (Exception e) {
+ log.warn("鍑虹墖澶ц溅璁惧妫�鏌ES浠诲姟寮傚父: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
+
+ // 鐒跺悗妫�鏌ES纭鐘舵�侊紙鍙湁鍦ㄤ换鍔″凡寮�濮嬫墽琛屾椂鎵嶆鏌ワ級
+ DevicePlcVO.OperationResult mesResult = null;
+ try {
+ mesResult = handler.execute(device, "checkMesConfirm", Collections.emptyMap());
+ } catch (Exception e) {
+ log.warn("鍑虹墖澶ц溅璁惧妫�鏌ES纭鐘舵�佸紓甯�: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
+
+ // 鏇存柊姝ラ鐘舵�侊紙澶ц溅璁惧淇濇寔RUNNING锛岀洿鍒癕ES纭瀹屾垚鎴栦换鍔″彇娑堬級
+ if (mesResult != null) {
+ updateStepStatusForVehicle(step, mesResult);
+ boolean opSuccess = Boolean.TRUE.equals(mesResult.getSuccess());
+ updateTaskProgress(task, step.getStepOrder(), opSuccess);
+ if (!opSuccess) {
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.FAILED, context);
+ }
+ }
+ }
+ return;
+ } else {
+ // 娌℃湁鏁版嵁锛屼笖璁惧鏈繍琛岋紝淇濇寔PENDING鐘舵��
+ if (!TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("绛夊緟澶х悊鐗囩澶勭悊瀹屾垚");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
+ log.debug("鍑虹墖澶ц溅璁惧瀹氭椂鍣細鏆傛棤宸插鐞嗙殑鐜荤拑淇℃伅: taskId={}, deviceId={}",
+ task.getTaskId(), device.getId());
+ return;
+ }
}
log.debug("鍑虹墖澶ц溅璁惧瀹氭椂鍣ㄦ娴嬪埌宸插鐞嗙殑鐜荤拑淇℃伅: taskId={}, deviceId={}, glassCount={}",
@@ -729,16 +919,51 @@
DevicePlcVO.OperationResult feedResult = handler.execute(device, "feedGlass", checkParams);
if (Boolean.TRUE.equals(feedResult.getSuccess())) {
+ // 鐪熸寮�濮嬪鐞嗭紝璁剧疆涓篟UNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ // 姝ラ鐘舵�佷篃璁剧疆涓篟UNNING
+ if (!TaskStepDetail.Status.RUNNING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ if (step.getStartTime() == null) {
+ step.setStartTime(new Date());
+ }
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
log.debug("鍑虹墖澶ц溅璁惧瀹氭椂鍣ㄦ墽琛屾垚鍔�: taskId={}, deviceId={}, glassCount={}",
task.getTaskId(), device.getId(), processedGlassIds.size());
// 娓呯┖宸插鐞嗙殑鐜荤拑ID鍒楄〃锛堝凡澶勭悊锛�
clearProcessedGlassIds(context);
+
+ // feedGlass鎴愬姛鍚庯紝鍏堟鏌ES浠诲姟锛坈heckMesTask锛夋潵寮�濮嬫墽琛屼换鍔�
+ DevicePlcVO.OperationResult mesTaskResult = null;
+ try {
+ mesTaskResult = handler.execute(device, "checkMesTask", Collections.emptyMap());
+ if (mesTaskResult != null && Boolean.TRUE.equals(mesTaskResult.getSuccess())) {
+ log.info("鍑虹墖澶ц溅璁惧宸叉鏌ES浠诲姟骞跺紑濮嬫墽琛�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), mesTaskResult.getMessage());
+ }
+ } catch (Exception e) {
+ log.warn("鍑虹墖澶ц溅璁惧妫�鏌ES浠诲姟寮傚父: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
} else {
+ // 娌℃湁鏁版嵁锛屼繚鎸乄AITING鐘舵�佸拰PENDING姝ラ鐘舵��
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
+ if (!TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("绛夊緟涓�");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
log.debug("鍑虹墖澶ц溅璁惧瀹氭椂鍣ㄦ墽琛屽け璐�: taskId={}, deviceId={}, message={}",
task.getTaskId(), device.getId(), feedResult.getMessage());
}
// 绗簩姝ワ細妫�鏌ES纭鐘舵�侊紙濡傛灉澶ц溅澶勭悊鍣ㄦ敮鎸佺殑璇濓級
+ // 鍙湁鍦ㄤ换鍔″凡寮�濮嬫墽琛岋紙鏈変换鍔¤褰曪級鏃舵墠妫�鏌ES纭
DevicePlcVO.OperationResult mesResult = null;
try {
mesResult = handler.execute(device, "checkMesConfirm", Collections.emptyMap());
@@ -771,8 +996,9 @@
}
}, 0, MONITOR_INTERVAL_MS, TimeUnit.MILLISECONDS);
+ // 鍦ㄤ覆琛屾墽琛屾ā寮忎笅锛岃澶囧惎鍔ㄥ畾鏃跺櫒鏃跺厛璁剧疆涓� WAITING锛屽畾鏃跺櫒绗竴娆℃墽琛屾椂鍐嶈缃负 RUNNING
deviceCoordinationService.syncDeviceStatus(device,
- DeviceCoordinationService.DeviceStatus.RUNNING, context);
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
return future;
} catch (Exception e) {
log.error("鍚姩鍑虹墖澶ц溅璁惧瀹氭椂鍣ㄥけ璐�: taskId={}, deviceId={}", task.getTaskId(), device.getId(), e);
@@ -804,14 +1030,27 @@
task.getTaskId(), device.getId());
return;
}
- ensureStepRunning(step, task.getTaskId());
+ // 澶х悊鐗囩璁惧锛氬彧鏈夊湪鐪熸寮�濮嬪鐞嗘椂鎵嶈缃负RUNNING
// 妫�鏌ユ槸鍚︽湁宸茶杞界殑鐜荤拑淇℃伅锛堜粠杩涚墖澶ц溅鏉ョ殑锛�
List<String> loadedGlassIds = getLoadedGlassIds(context);
if (CollectionUtils.isEmpty(loadedGlassIds)) {
+ // 娌℃湁鏁版嵁锛屼繚鎸乄AITING鐘舵�佸拰PENDING姝ラ鐘舵��
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
+ if (!TaskStepDetail.Status.PENDING.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ step.setSuccessMessage("绛夊緟杩涚墖澶ц溅瑁呰浇鐜荤拑");
+ taskStepDetailMapper.updateById(step);
+ notificationService.notifyStepUpdate(task.getTaskId(), step);
+ }
log.debug("澶х悊鐗囩璁惧瀹氭椂鍣細鏆傛棤宸茶杞界殑鐜荤拑淇℃伅: taskId={}, deviceId={}",
task.getTaskId(), device.getId());
return;
}
+
+ // 鏈夋暟鎹紝璁剧疆涓篟UNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.RUNNING, context);
// 妫�鏌ョ幓鐠冩槸鍚﹀凡缁忓鐞嗗畬鎴愶紙閫氳繃澶勭悊鏃堕棿鍒ゆ柇锛�
Long processStartTime = getProcessStartTime(context);
@@ -853,6 +1092,9 @@
}
}, 0, 1_000, TimeUnit.MILLISECONDS); // 姣忕妫�鏌ヤ竴娆�
+ // 鍦ㄤ覆琛屾墽琛屾ā寮忎笅锛岃澶囧惎鍔ㄥ畾鏃跺櫒鏃跺厛璁剧疆涓� WAITING锛屽畾鏃跺櫒绗竴娆℃墽琛屾椂鍐嶈缃负 RUNNING
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.WAITING, context);
return future;
} catch (Exception e) {
log.error("鍚姩澶х悊鐗囩璁惧瀹氭椂鍣ㄥけ璐�: taskId={}, deviceId={}", task.getTaskId(), device.getId(), e);
@@ -1287,11 +1529,33 @@
step.setStartTime(now);
}
+ boolean waiting = false;
+ String waitingReason = null;
+ if (result.getData() != null) {
+ Object waitingFlag = result.getData().get("waiting");
+ if (waitingFlag instanceof Boolean) {
+ waiting = (Boolean) waitingFlag;
+ } else if (waitingFlag != null) {
+ waiting = "true".equalsIgnoreCase(String.valueOf(waitingFlag));
+ }
+ Object reason = result.getData().get("waitingReason");
+ if (reason != null) {
+ waitingReason = String.valueOf(reason);
+ }
+ }
+
if (success && !completed) {
- // 鎴愬姛浣嗘湭瀹屾垚锛氫繚鎸丷UNNING鐘舵�侊紝浠呮洿鏂版彁绀轰俊鎭拰鑰楁椂
- step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ // 鎴愬姛浣嗘湭瀹屾垚锛氭牴鎹畐aiting鐘舵�佸喅瀹氭樉绀轰负绛夊緟杩樻槸鎵ц涓�
+ if (waiting) {
+ step.setStatus(TaskStepDetail.Status.PENDING.name());
+ } else {
+ step.setStatus(TaskStepDetail.Status.RUNNING.name());
+ }
String message = result.getMessage();
- step.setSuccessMessage(StringUtils.hasText(message) ? message : "澶ц溅璁惧杩愯涓�");
+ if (!StringUtils.hasText(message) && waiting) {
+ message = "澶ц溅璁惧绛夊緟涓�" + (StringUtils.hasText(waitingReason) ? "锛�" + waitingReason + "锛�" : "");
+ }
+ step.setSuccessMessage(StringUtils.hasText(message) ? message : (waiting ? "澶ц溅璁惧绛夊緟涓�" : "澶ц溅璁惧杩愯涓�"));
step.setErrorMessage(null);
if (step.getStartTime() != null) {
step.setDurationMs(now.getTime() - step.getStartTime().getTime());
@@ -1326,11 +1590,66 @@
step.setOutputData(toJson(result));
taskStepDetailMapper.updateById(step);
}
+
+ /**
+ * 杞澶ц溅璁惧鐨凪ES浠诲姟鍜岀‘璁ょ姸鎬�
+ * 鏃犺姝ラ褰撳墠鏄惁涓篟UNNING/PENDING锛岄兘鍙互璋冪敤锛岀敤浜庨伩鍏嶉敊杩嘙ES绔悗鍐欏叆鐨勪换鍔�
+ */
+ private void pollMesForVehicle(MultiDeviceTask task,
+ TaskStepDetail step,
+ DeviceConfig device,
+ TaskExecutionContext context) {
+ try {
+ DeviceLogicHandler handler = handlerFactory.getHandler(device.getDeviceType());
+ if (handler == null) {
+ return;
+ }
+
+ Map<String, Object> logicParams = parseLogicParams(device);
+
+ // 鍏堟鏌ES浠诲姟锛堝鏋渕esSend=1锛屼細鍒涘缓浠诲姟骞跺紑濮嬫墽琛岋級
+ DevicePlcVO.OperationResult mesTaskResult = null;
+ try {
+ mesTaskResult = handler.execute(device, "checkMesTask", Collections.emptyMap());
+ if (mesTaskResult != null && Boolean.TRUE.equals(mesTaskResult.getSuccess())) {
+ log.info("澶ц溅璁惧宸叉鏌ES浠诲姟骞跺紑濮嬫墽琛�: taskId={}, deviceId={}, message={}",
+ task.getTaskId(), device.getId(), mesTaskResult.getMessage());
+ }
+ } catch (Exception e) {
+ log.warn("澶ц溅璁惧妫�鏌ES浠诲姟寮傚父: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
+
+ // 鐒跺悗妫�鏌ES纭鐘舵��
+ DevicePlcVO.OperationResult mesResult = null;
+ try {
+ mesResult = handler.execute(device, "checkMesConfirm", Collections.emptyMap());
+ } catch (Exception e) {
+ log.warn("澶ц溅璁惧妫�鏌ES纭鐘舵�佸紓甯�: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
+
+ // 鏇存柊姝ラ鐘舵��
+ if (mesResult != null) {
+ updateStepStatusForVehicle(step, mesResult);
+ boolean opSuccess = Boolean.TRUE.equals(mesResult.getSuccess());
+ updateTaskProgress(task, step.getStepOrder(), opSuccess);
+ if (!opSuccess) {
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.FAILED, context);
+ }
+ }
+ } catch (Exception e) {
+ log.warn("杞澶ц溅璁惧MES浠诲姟/纭鐘舵�佸紓甯�: taskId={}, deviceId={}, error={}",
+ task.getTaskId(), device.getId(), e.getMessage());
+ }
+ }
/**
* 鏇存柊鍗ц浆绔嬭澶囨楠ょ姸鎬侊紙鍖哄垎绛夊緟涓拰鐪熸瀹屾垚锛�
*/
- private void updateStepStatusForTransfer(TaskStepDetail step, DevicePlcVO.OperationResult result) {
+ private void updateStepStatusForTransfer(TaskStepDetail step, DevicePlcVO.OperationResult result,
+ DeviceConfig device, TaskExecutionContext context) {
if (step == null || result == null) {
return;
}
@@ -1338,26 +1657,36 @@
String message = result.getMessage();
// 鍒ゆ柇鏄惁鐪熸瀹屾垚锛�
- // 1. 鍐欏叆PLC鎴愬姛
- // 2. 涓旂紦鍐插凡娓呯┖锛堣〃绀烘墍鏈夌幓鐠冨凡澶勭悊瀹岋紝鏃犳柊鐜荤拑锛�
- boolean isRealCompleted = success && message != null
- && message.contains("鎵规宸插啓鍏LC")
- && message.contains("缂撳啿宸叉竻绌猴紝浠诲姟瀹屾垚");
+ // 1. 鍐欏叆PLC鎴愬姛涓旂紦鍐插凡娓呯┖锛堣〃绀烘墍鏈夌幓鐠冨凡澶勭悊瀹岋紝鏃犳柊鐜荤拑锛�
+ // 娉ㄦ剰锛氱紦鍐查槦鍒椾负绌轰笖鏃犲緟澶勭悊鐜荤拑锛屽湪浠诲姟鍒氬紑濮嬫椂涔熷彲鑳藉嚭鐜帮紝涓嶅簲璇ョ珛鍗虫爣璁颁负瀹屾垚
+ // 鍙湁褰撲换鍔″凡缁忚繍琛屼竴娈垫椂闂达紝涓旂‘瀹炴病鏈夌幓鐠冮渶瑕佸鐞嗘椂锛屾墠鏍囪涓哄畬鎴�
+ boolean isRealCompleted = success && message != null && (
+ (message.contains("鎵规宸插啓鍏LC") && message.contains("缂撳啿宸叉竻绌猴紝浠诲姟瀹屾垚"))
+ );
if (isRealCompleted) {
// 鐪熸瀹屾垚锛氳缃负瀹屾垚鐘舵�侊紝骞惰缃粨鏉熸椂闂�
- step.setStatus(TaskStepDetail.Status.COMPLETED.name());
- step.setSuccessMessage(message);
- if (step.getEndTime() == null) {
- step.setEndTime(new Date());
+ // 娉ㄦ剰锛氫竴鏃︽爣璁颁负瀹屾垚锛岀姸鎬佷笉搴旇鍐嶈鏀瑰彉
+ if (!TaskStepDetail.Status.COMPLETED.name().equals(step.getStatus())) {
+ step.setStatus(TaskStepDetail.Status.COMPLETED.name());
+ step.setSuccessMessage(message);
+ if (step.getEndTime() == null) {
+ step.setEndTime(new Date());
+ }
+ // 璁$畻鑰楁椂
+ if (step.getStartTime() != null && step.getEndTime() != null) {
+ step.setDurationMs(step.getEndTime().getTime() - step.getStartTime().getTime());
+ }
+ log.info("鍗ц浆绔嬭澶囨楠ゅ凡瀹屾垚: stepId={}, durationMs={}, message={}",
+ step.getId(), step.getDurationMs(), message);
+ // 鍗ц浆绔嬩富浣撳畬鎴愬悗灏濊瘯鑷姩鏀跺熬鏁翠釜浠诲姟
+ checkAndCompleteTaskIfDone(step.getTaskId());
+ // 鏇存柊璁惧鐘舵�佷负宸插畬鎴�
+ if (device != null) {
+ deviceCoordinationService.syncDeviceStatus(device,
+ DeviceCoordinationService.DeviceStatus.COMPLETED, context);
+ }
}
- // 璁$畻鑰楁椂
- if (step.getStartTime() != null && step.getEndTime() != null) {
- step.setDurationMs(step.getEndTime().getTime() - step.getStartTime().getTime());
- }
- log.debug("鍗ц浆绔嬭澶囨楠ゅ凡瀹屾垚: stepId={}, durationMs={}", step.getId(), step.getDurationMs());
- // 鍗ц浆绔嬩富浣撳畬鎴愬悗灏濊瘯鑷姩鏀跺熬鏁翠釜浠诲姟
- checkAndCompleteTaskIfDone(step.getTaskId());
} else if (success && message != null && message.contains("鎵规宸插啓鍏LC")) {
// 鍐欏叆PLC鎴愬姛浣嗙紦鍐茶繕鏈夌幓鐠冿紙杞︽弧鎯呭喌锛夛紝缁х画杩愯
if (!TaskStepDetail.Status.RUNNING.name().equals(step.getStatus())) {
@@ -1369,12 +1698,13 @@
step.setStartTime(new Date());
}
} else if (success) {
- // 绛夊緟涓細淇濇寔杩愯鐘舵�侊紝鍙洿鏂版秷鎭�
+ // 璁惧姝e湪宸ヤ綔锛堢瓑寰呯紦鍐层�佺瓑寰呮洿澶氱幓鐠冪瓑锛夛紝淇濇寔RUNNING鐘舵��
+ // 鍥犱负瀹氭椂鍣ㄥ凡缁忔墽琛岋紝璇存槑璁惧宸茬粡寮�濮嬪伐浣滀簡
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());
}
--
Gitblit v1.8.0