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