From 16f4bb3c28fc85cffcc511718c903ada9fdab134 Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期五, 26 十二月 2025 16:59:45 +0800
Subject: [PATCH] 调用mes导入工程参数修改,Excel表数据流程卡号一致;增加读取层号/工程号方法; 工程号一致覆盖更新

---
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java |  367 ++++++++++++++++++++++++----------------------------
 1 files changed, 168 insertions(+), 199 deletions(-)

diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
index 5ae4704..fcc73ee 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
@@ -15,9 +15,8 @@
 import com.mes.interaction.vehicle.model.VehicleState;
 import com.mes.interaction.vehicle.model.VehicleStatus;
 import com.mes.interaction.vehicle.model.VehicleTask;
-import com.mes.s7.enhanced.EnhancedS7Serializer;
-import com.mes.s7.provider.S7SerializerProvider;
-import com.mes.service.PlcDynamicDataService;
+import com.mes.plc.client.PlcClient;
+import com.mes.plc.factory.PlcClientFactory;
 import com.mes.task.model.TaskExecutionContext;
 import com.mes.interaction.workstation.scanner.handler.HorizontalScannerLogicHandler;
 import lombok.extern.slf4j.Slf4j;
@@ -28,6 +27,7 @@
 import javax.annotation.PreDestroy;
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.stream.Collectors;
 
 /**
  * 澶ц溅璁惧閫昏緫澶勭悊鍣�
@@ -56,10 +56,7 @@
     private DeviceStatusService deviceStatusService;
     
     @Autowired(required = false)
-    private PlcDynamicDataService plcDynamicDataService;
-    
-    @Autowired(required = false)
-    private S7SerializerProvider s7SerializerProvider;
+    private PlcClientFactory plcClientFactory;
 
     // MES瀛楁鍒楄〃锛堣繘鐗囧拰鍑虹墖鍏辩敤鍚屼竴濂楀崗璁級
     // 鏍规嵁鍗忚锛屼娇鐢ㄥ甫鏁板瓧鍚庣紑鐨勫瓧娈靛悕锛�1-6瀵瑰簲6涓幓鐠冧綅缃級
@@ -120,9 +117,13 @@
     @Autowired
     public LoadVehicleLogicHandler(
             DevicePlcOperationService devicePlcOperationService,
-            @Qualifier("deviceGlassInfoService") GlassInfoService glassInfoService) {
+            @Qualifier("deviceGlassInfoService") GlassInfoService glassInfoService,
+            PlcClientFactory plcClientFactory) {
         super(devicePlcOperationService);
         this.glassInfoService = glassInfoService;
+        this.plcClientFactory = plcClientFactory;
+        // 璁剧疆 PlcClientFactory 鍒板熀绫�
+        this.setPlcClientFactory(plcClientFactory);
     }
 
     @Override
@@ -137,7 +138,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
 
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         log.info("鎵ц澶ц溅璁惧鎿嶄綔: deviceId={}, deviceName={}, operation={}", 
             deviceId, deviceConfig.getDeviceName(), operation);
 
@@ -288,7 +289,7 @@
             Map<String, Object> logicParams) {
         
         VehicleTask task = new VehicleTask();
-        task.setTaskId(generateTaskId(deviceConfig.getDeviceId()));
+        task.setTaskId(generateTaskId(String.valueOf(deviceConfig.getId())));
         task.setTaskName("澶ц溅璁惧-" + operation);
         task.setOperation(operation);
         
@@ -364,7 +365,7 @@
         Boolean triggerRequest = (Boolean) params.getOrDefault("triggerRequest", autoFeed);
 
         List<GlassInfo> plannedGlasses = planGlassLoading(glassInfos, vehicleCapacity, glassGap,
-                deviceConfig.getDeviceId());
+                String.valueOf(deviceConfig.getId()));
         if (plannedGlasses == null) {
             // 鐜荤拑娌℃湁闀垮害鏃惰繑鍥瀗ull琛ㄧず閿欒
             return DevicePlcVO.OperationResult.builder()
@@ -436,7 +437,7 @@
         // 濡傛灉鎵ц鎴愬姛锛屾洿鏂颁綅缃俊鎭埌鐘舵��
         if (Boolean.TRUE.equals(result.getSuccess())) {
             VehicleStatus status = statusManager.getOrCreateVehicleStatus(
-                deviceConfig.getDeviceId(), deviceConfig.getDeviceName());
+                String.valueOf(deviceConfig.getId()), deviceConfig.getDeviceName());
             if (positionCode != null || positionValue != null) {
                 VehiclePosition position = new VehiclePosition(positionCode, positionValue);
                 status.setCurrentPosition(position);
@@ -521,15 +522,15 @@
         
         // 閲嶇疆鏃讹紝娓呴櫎浠诲姟骞舵仮澶嶄负绌洪棽鐘舵�侊紝鍋滄鐩戞帶
         if (Boolean.TRUE.equals(result.getSuccess())) {
-            statusManager.clearVehicleTask(deviceConfig.getDeviceId());
-            statusManager.updateVehicleStatus(deviceConfig.getDeviceId(), VehicleState.IDLE);
-            stopStateMonitoring(deviceConfig.getDeviceId());
+            statusManager.clearVehicleTask(String.valueOf(deviceConfig.getId()));
+            statusManager.updateVehicleStatus(String.valueOf(deviceConfig.getId()), VehicleState.IDLE);
+            stopStateMonitoring(String.valueOf(deviceConfig.getId()));
             handleStopTaskMonitor(deviceConfig);
             handleStopIdleMonitor(deviceConfig);
             updateDeviceOnlineStatus(deviceConfig, true);
         } else {
             // 鍗充究閲嶇疆澶辫触锛屼篃灏濊瘯鍋滄鍐呴儴鐩戞帶锛岄伩鍏嶄换鍔″彇娑堝悗浠嶇劧鍙嶅鍐橮LC
-            stopStateMonitoring(deviceConfig.getDeviceId());
+            stopStateMonitoring(String.valueOf(deviceConfig.getId()));
             handleStopTaskMonitor(deviceConfig);
             handleStopIdleMonitor(deviceConfig);
         }
@@ -636,15 +637,15 @@
         
         // 娓呯┖鍚庯紝鎭㈠涓虹┖闂茬姸鎬侊紝鍋滄鐩戞帶
         if (Boolean.TRUE.equals(result.getSuccess())) {
-            statusManager.clearVehicleTask(deviceConfig.getDeviceId());
-            statusManager.updateVehicleStatus(deviceConfig.getDeviceId(), VehicleState.IDLE);
-            stopStateMonitoring(deviceConfig.getDeviceId());
+            statusManager.clearVehicleTask(String.valueOf(deviceConfig.getId()));
+            statusManager.updateVehicleStatus(String.valueOf(deviceConfig.getId()), VehicleState.IDLE);
+            stopStateMonitoring(String.valueOf(deviceConfig.getId()));
             handleStopTaskMonitor(deviceConfig);
             handleStopIdleMonitor(deviceConfig);
             updateDeviceOnlineStatus(deviceConfig, true);
         } else {
             // 鍐欏叆澶辫触涔熷皾璇曞仠姝㈢洃鎺э紝閬垮厤浠诲姟鍙栨秷鍚庝粛鏃ц繍琛�
-            stopStateMonitoring(deviceConfig.getDeviceId());
+            stopStateMonitoring(String.valueOf(deviceConfig.getId()));
             handleStopTaskMonitor(deviceConfig);
             handleStopIdleMonitor(deviceConfig);
         }
@@ -661,7 +662,7 @@
             deviceStatusService.updateDeviceOnlineStatus(deviceConfig.getId(), status);
         } catch (Exception e) {
             log.warn("鍚屾璁惧鍦ㄧ嚎鐘舵�佸埌鏁版嵁搴撳け璐�: deviceId={}, online={}, error={}",
-                    deviceConfig.getDeviceId(), online, e.getMessage());
+                    String.valueOf(deviceConfig.getId()), online, e.getMessage());
         }
     }
 
@@ -869,7 +870,7 @@
      * 瀹氭湡妫�鏌ュぇ杞︾殑 state1~6锛屽綋妫�娴嬪埌 state=1 鏃惰嚜鍔ㄥ崗璋冨崸杞珛璁惧
      */
     private void startStateMonitoring(DeviceConfig deviceConfig, Map<String, Object> logicParams) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 濡傛灉宸茬粡鍦ㄧ洃鎺э紝鍏堝仠姝㈡棫鐨勭洃鎺т换鍔�
         stopStateMonitoring(deviceId);
@@ -940,7 +941,7 @@
      * 妫�鏌ュぇ杞︾姸鎬佸苟鍗忚皟鍗ц浆绔嬭澶囷紙鍐呴儴鏂规硶锛岀敱鐩戞帶绾跨▼璋冪敤锛�
      */
     private void checkAndCoordinateState(DeviceConfig deviceConfig) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         List<String> alreadyCoordinated = coordinatedStates.get(deviceId);
         if (alreadyCoordinated == null) {
             alreadyCoordinated = new CopyOnWriteArrayList<>();
@@ -1228,7 +1229,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 鍋滄鏃х殑鐩戞帶浠诲姟
         handleStopIdleMonitor(deviceConfig);
@@ -1247,20 +1248,17 @@
                 }
                 
                 // 妫�鏌ユ槸鍚︽湁寰呭鐞嗙殑杩涚墖鎴栧嚭鐗囦换鍔�
-                if (plcDynamicDataService != null && s7SerializerProvider != null) {
-                    EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-                    if (serializer != null) {
-                        // 妫�鏌ヨ繘鐗囦换鍔�
-                        Map<String, Object> mesData = plcDynamicDataService.readPlcData(
-                                deviceConfig, MES_FIELDS, serializer);
-                        Integer mesSend = parseInteger(mesData != null ? mesData.get("mesSend") : null);
-                        
-                        // 杩涚墖鍜屽嚭鐗囧叡鐢╩esSend瀛楁锛屽彧闇�妫�鏌ヤ竴娆�
-                        // 濡傛灉鏈夊緟澶勭悊鐨勪换鍔★紝涓嶈缃畃lcRequest锛堢瓑寰呬换鍔″鐞嗭級
-                        if (mesSend != null && mesSend == 1) {
-                            log.debug("澶ц溅绌洪棽鐩戞帶: deviceId={}, 妫�娴嬪埌寰呭鐞嗕换鍔★紙mesSend=1锛夛紝涓嶈缃畃lcRequest", deviceId);
-                            return;
-                        }
+                PlcClient plcClient = getPlcClient(deviceConfig);
+                if (plcClient != null) {
+                    // 妫�鏌ヨ繘鐗囦换鍔�
+                    Map<String, Object> mesData = plcClient.readData(MES_FIELDS.toArray(new String[0]));
+                    Integer mesSend = parseInteger(mesData != null ? mesData.get("mesSend") : null);
+                    
+                    // 杩涚墖鍜屽嚭鐗囧叡鐢╩esSend瀛楁锛屽彧闇�妫�鏌ヤ竴娆�
+                    // 濡傛灉鏈夊緟澶勭悊鐨勪换鍔★紝涓嶈缃畃lcRequest锛堢瓑寰呬换鍔″鐞嗭級
+                    if (mesSend != null && mesSend == 1) {
+                        log.debug("澶ц溅绌洪棽鐩戞帶: deviceId={}, 妫�娴嬪埌寰呭鐞嗕换鍔★紙mesSend=1锛夛紝涓嶈缃畃lcRequest", deviceId);
+                        return;
                     }
                 }
                 
@@ -1289,7 +1287,7 @@
      * 鍋滄绌洪棽鐩戞帶
      */
     private DevicePlcVO.OperationResult handleStopIdleMonitor(DeviceConfig deviceConfig) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         ScheduledFuture<?> future = idleMonitoringTasks.remove(deviceId);
         if (future != null && !future.isCancelled()) {
             future.cancel(false);
@@ -1310,19 +1308,12 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        if (plcDynamicDataService == null || s7SerializerProvider == null) {
+        String deviceId = String.valueOf(deviceConfig.getId());
+        PlcClient plcClient = getPlcClient(deviceConfig);
+        if (plcClient == null) {
             return DevicePlcVO.OperationResult.builder()
                     .success(false)
-                    .message("PlcDynamicDataService鎴朣7SerializerProvider鏈敞鍏�")
-                    .build();
-        }
-        
-        String deviceId = deviceConfig.getDeviceId();
-        EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-        if (serializer == null) {
-            return DevicePlcVO.OperationResult.builder()
-                    .success(false)
-                    .message("鑾峰彇PLC搴忓垪鍖栧櫒澶辫触")
+                    .message("鑾峰彇PLC瀹㈡埛绔け璐�")
                     .build();
         }
         
@@ -1331,16 +1322,27 @@
             MesTaskInfo existingTask = currentTasks.get(deviceId);
             if (existingTask != null) {
                 log.debug("璁惧宸叉湁浠诲姟鍦ㄦ墽琛屼腑锛岃烦杩囨鏌ES浠诲姟: deviceId={}", deviceId);
+                // 浠嶇劧杩斿洖褰撳墠浠诲姟鐨勭幓鐠冨垪琛紝渚涗换鍔″紩鎿庤褰�/瀵硅处鏈壒娆�
+                List<String> batchIds = new ArrayList<>();
+                if (existingTask.glasses != null) {
+                    for (GlassTaskInfo g : existingTask.glasses) {
+                        if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+                            batchIds.add(g.glassId);
+                        }
+                    }
+                }
                 return DevicePlcVO.OperationResult.builder()
                         .success(true)
                         .message("浠诲姟鎵ц涓紝鏃犻渶閲嶅妫�鏌ES浠诲姟")
-                        .data(Collections.singletonMap("waiting", false))
+                        .data(new HashMap<String, Object>() {{
+                            put("waiting", false);
+                            put("batchGlassIds", batchIds);
+                        }})
                         .build();
             }
             
             // 璇诲彇MES瀛楁锛堣繘鐗囧拰鍑虹墖鍏辩敤锛�
-            Map<String, Object> mesData = plcDynamicDataService.readPlcData(
-                    deviceConfig, MES_FIELDS, serializer);
+            Map<String, Object> mesData = plcClient.readData(MES_FIELDS.toArray(new String[0]));
             if (mesData == null || mesData.isEmpty()) {
                 log.warn("璇诲彇MES瀛楁澶辫触: deviceId={}, mesData涓虹┖鎴杗ull", deviceId);
                 return DevicePlcVO.OperationResult.builder()
@@ -1357,6 +1359,7 @@
                 waitData.put("completed", false);
                 waitData.put("waiting", true);
                 waitData.put("waitingReason", "mesSend=0");
+                waitData.put("batchGlassIds", new ArrayList<>());
                 return DevicePlcVO.OperationResult.builder()
                         .success(true)
                         .message("绛夊緟MES鍙戦�佽姹傦紙mesSend=0锛�")
@@ -1500,11 +1503,44 @@
             }
             
             currentTasks.put(deviceId, taskInfo);
+
+            // 濡傛灉鏈夊璁惧浠诲姟涓婁笅鏂囷紝鍒欒褰曟湰娆ES涓嬪彂鐨勭幓鐠僆D鍒楄〃鍒颁笂涓嬫枃锛屼緵鍒嗘壒鏍¢獙浣跨敤
+            if (params != null) {
+                Object ctxObj = params.get("_taskContext");
+                if (ctxObj instanceof TaskExecutionContext) {
+                    TaskExecutionContext ctx = (TaskExecutionContext) ctxObj;
+                    List<String> batchIds = new ArrayList<>();
+                    for (GlassTaskInfo g : glasses) {
+                        if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+                            batchIds.add(g.glassId);
+                        }
+                    }
+                    // 1. 璁板綍褰撳墠鎵规鐨勭幓鐠僆D
+                    ctx.getSharedData().put("currentMesBatchGlassIds", batchIds);
+                    log.info("璁板綍鏈MES鎵规鐜荤拑鍒楄〃: deviceId={}, batchIds={}", deviceId, batchIds);
+                    
+                    // 2. 鍒濆鍖栨�诲緟鍑虹墖鐜荤拑鍒楄〃锛堜粎绗竴娆″垵濮嬪寲锛屼粠浠诲姟鍙傛暟鑾峰彇锛�
+                    if (!ctx.getSharedData().containsKey("initialGlassIds")) {
+                        // 浠庝换鍔″弬鏁颁腑鑾峰彇鎬诲緟鍑虹墖鐜荤拑ID锛堟牳蹇冿細鎬诲垪琛ㄦ潵鑷换鍔″弬鏁帮紝鑰岄潪MES鎵规锛�
+                        List<String> taskGlassIds = ctx.getParameters().getGlassIds();
+                        if (taskGlassIds != null && !taskGlassIds.isEmpty()) {
+                            ctx.getSharedData().put("initialGlassIds", new ArrayList<>(taskGlassIds));
+                            // 鍒濆鍖栧凡鍑虹墖鍒楄〃涓虹┖
+                            if (!ctx.getSharedData().containsKey("outboundGlassIds")) {
+                                ctx.getSharedData().put("outboundGlassIds", new ArrayList<>());
+                            }
+                            log.info("鍒濆鍖栨�诲緟鍑虹墖鐜荤拑鍒楄〃: deviceId={}, taskGlassIds={}", deviceId, taskGlassIds);
+                        } else {
+                            log.warn("浠诲姟鍙傛暟涓湭鎵惧埌鎬诲緟鍑虹墖鐜荤拑ID鍒楄〃: deviceId={}", deviceId);
+                        }
+                    }
+                }
+            }
             
             // 娓呯┖plcRequest锛堣〃绀哄凡鎺ユ敹浠诲姟锛�
             Map<String, Object> payload = new HashMap<>();
             payload.put("plcRequest", 0);
-            plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+            plcClient.writeData(payload);
             log.info("宸叉竻绌簆lcRequest=0: deviceId={}", deviceId);
             
             // 鏇存柊杞﹁締鐘舵�佷负鎵ц涓�
@@ -1517,7 +1553,7 @@
             String taskType = isOutbound ? "鍑虹墖" : "杩涚墖";
             String glassIds = glasses.stream()
                     .map(g -> g.glassId)
-                    .collect(java.util.stream.Collectors.joining(","));
+                    .collect(Collectors.joining(","));
             log.info("MES{}浠诲姟宸插垱寤�: deviceId={}, glassCount={}, glassIds=[{}], 璧峰浣嶇疆={}鏍�, 鐩爣浣嶇疆={}鏍�, 璺濈{}鏍�->{}鏍�, gotime={}ms({}绉�), cartime={}ms({}绉�)", 
                     taskType, deviceId, glasses.size(), glassIds,
                     firstGlass.startPosition, firstGlass.targetPosition,
@@ -1537,6 +1573,14 @@
             Map<String, Object> successData = new HashMap<>();
             successData.put("waiting", false);
             successData.put("taskStarted", true);
+            // 灏嗘湰娆ES涓嬪彂鐨勭幓鐠僆D鍒楄〃閫氳繃杩斿洖鍊煎甫鍥烇紙浠诲姟寮曟搸涓嶅啀渚濊禆_taskContext鍐欏叆锛�
+            List<String> batchIdsForReturn = new ArrayList<>();
+            for (GlassTaskInfo g : glasses) {
+                if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+                    batchIdsForReturn.add(g.glassId);
+                }
+            }
+            successData.put("batchGlassIds", batchIdsForReturn);
             
             return DevicePlcVO.OperationResult.builder()
                     .success(true)
@@ -1657,7 +1701,7 @@
      */
     private Integer getCurrentPosition(DeviceConfig deviceConfig, Map<String, Object> logicParams) {
         // 浠庣姸鎬佺鐞嗗櫒鑾峰彇
-        VehicleStatus status = statusManager.getVehicleStatus(deviceConfig.getDeviceId());
+        VehicleStatus status = statusManager.getVehicleStatus(String.valueOf(deviceConfig.getId()));
         if (status != null && status.getCurrentPosition() != null) {
             return status.getCurrentPosition().getPositionValue();
         }
@@ -1748,7 +1792,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 鍋滄鏃х殑鐩戞帶浠诲姟
         handleStopTaskMonitor(deviceConfig);
@@ -1789,13 +1833,9 @@
                                       MesTaskInfo taskInfo,
                                       Map<String, Object> logicParams) {
         
-        if (plcDynamicDataService == null || s7SerializerProvider == null) {
-            return;
-        }
-        
-        String deviceId = deviceConfig.getDeviceId();
-        EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-        if (serializer == null) {
+        String deviceId = String.valueOf(deviceConfig.getId());
+        PlcClient plcClient = getPlcClient(deviceConfig);
+        if (plcClient == null) {
             return;
         }
         
@@ -1845,24 +1885,24 @@
                 // 浼樺厛妫�鏌ユ槸鍚︽爣璁颁负鐮存崯锛坰tate=8锛�
                 // 妫�鏌ヤ换鍔′俊鎭腑鏄惁鏍囪浜嗚鐜荤拑涓虹牬鎹�
                 if (taskInfo.brokenGlassIndices != null && taskInfo.brokenGlassIndices.contains(i)) {
-                    updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 8, taskInfo);
+                    updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 8, taskInfo);
                     log.info("鐜荤拑鏍囪涓虹牬鎹�: deviceId={}, stateField={}, glassIndex={}", 
-                            deviceConfig.getDeviceId(), stateField, i);
+                            String.valueOf(deviceConfig.getId()), stateField, i);
                     continue;
                 }
                 
                 // 妫�鏌ヨ秴鏃舵湭瀹屾垚锛坰tate=3锛�
                 if (elapsed >= state3TimeoutTime && (currentState == null || currentState < 2)) {
-                    updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 3, taskInfo);
+                    updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 3, taskInfo);
                     log.warn("浠诲姟瓒呮椂鏈畬鎴�: deviceId={}, stateField={}, elapsed={}ms, expectedTime={}ms", 
-                            deviceConfig.getDeviceId(), stateField, elapsed, state2Time);
+                            String.valueOf(deviceConfig.getId()), stateField, elapsed, state2Time);
                     continue;
                 }
                 
                 // 姝e父鐘舵�佹洿鏂�
                 if (elapsed >= state1Time && elapsed < state2Time) {
                     // state搴旇涓�1锛堜笂杞﹀畬鎴愶級
-                    boolean stateChanged = updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 1, taskInfo);
+                    boolean stateChanged = updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 1, taskInfo);
                     if (stateChanged) {
                         hasStateOne = true;
                         currentStepDesc = "鐜荤拑宸蹭笂杞︼紙state=1锛夛紝姝e湪杩愯緭鍒扮洰鏍囦綅缃�";
@@ -1871,7 +1911,7 @@
                     }
                 } else if (elapsed >= state2Time) {
                     // state搴旇涓�2锛堣繍杈撳畬鎴愶級
-                    boolean stateChanged = updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 2, taskInfo);
+                    boolean stateChanged = updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 2, taskInfo);
                     if (stateChanged) {
                         hasStateTwo = true;
                         currentStepDesc = "鐜荤拑宸插埌杈剧洰鏍囦綅缃紙state=2锛夛紝绛夊緟MES纭";
@@ -1895,7 +1935,7 @@
             
             // 妫�鏌ユ槸鍚︽墍鏈塻tate閮�>=2锛屽鏋滄槸鍒欑粰MES姹囨姤
             if (elapsed >= state2Time && allStatesCompleted(stateValues, glassCount)) {
-                reportToMes(deviceConfig, serializer, taskInfo, logicParams);
+                reportToMes(deviceConfig, plcClient, taskInfo, logicParams);
                 // 璁板綍MES纭寮�濮嬬瓑寰呯殑鏃堕棿锛堝彧璁板綍涓�娆★級
                 if (taskInfo.mesConfirmStartTime == null) {
                     taskInfo.mesConfirmStartTime = System.currentTimeMillis();
@@ -1918,7 +1958,7 @@
      * @return 鏄惁鍙戠敓浜嗙姸鎬佸彉鍖栵紙浠庨潪鐩爣鐘舵�佸彉涓虹洰鏍囩姸鎬侊級
      */
     private boolean updateStateIfNeeded(DeviceConfig deviceConfig,
-                                     EnhancedS7Serializer serializer,
+                                     PlcClient plcClient,
                                      Map<String, Object> currentStates,
                                      String stateField,
                                      int targetState,
@@ -1932,7 +1972,7 @@
         // 娉ㄦ剰锛氬鏋滃綋鍓峴tate宸茬粡鏄�3锛堟湭瀹屾垚锛夋垨8锛堢牬鎹燂級锛屼笉鍐嶆洿鏂�
         if (currentState != null && (currentState == 3 || currentState == 8)) {
             log.debug("浠诲姟鐘舵�佸凡涓哄紓甯哥姸鎬侊紝涓嶅啀鏇存柊: deviceId={}, stateField={}, currentState={}, targetState={}", 
-                    deviceConfig.getDeviceId(), stateField, currentState, targetState);
+                    String.valueOf(deviceConfig.getId()), stateField, currentState, targetState);
             return false;
         }
         
@@ -1941,15 +1981,15 @@
             try {
                 Map<String, Object> payload = new HashMap<>();
                 payload.put(stateField, targetState);
-                plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+                plcClient.writeData(payload);
                 
                 log.info("浠诲姟鐘舵�佸凡鏇存柊鍒癙LC: deviceId={}, stateField={}, currentState={}, targetState={}", 
-                        deviceConfig.getDeviceId(), stateField, currentState, targetState);
+                        String.valueOf(deviceConfig.getId()), stateField, currentState, targetState);
                 // 杩斿洖true琛ㄧず鐘舵�佸彂鐢熶簡鍙樺寲
                 return true;
             } catch (Exception e) {
                 log.error("鍐欏叆PLC state瀛楁澶辫触: deviceId={}, stateField={}, targetState={}, error={}", 
-                        deviceConfig.getDeviceId(), stateField, targetState, e.getMessage());
+                        String.valueOf(deviceConfig.getId()), stateField, targetState, e.getMessage());
                 return false;
             }
         }
@@ -2012,7 +2052,7 @@
      * 缁橫ES姹囨姤
      */
     private void reportToMes(DeviceConfig deviceConfig,
-                             EnhancedS7Serializer serializer,
+                             PlcClient plcClient,
                              MesTaskInfo taskInfo,
                              Map<String, Object> logicParams) {
         
@@ -2020,18 +2060,18 @@
             // 璁剧疆姹囨姤瀛�
             Map<String, Object> payload = new HashMap<>();
             payload.put("plcReport", 1);
-            plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+            plcClient.writeData(payload);
             
             String taskType = taskInfo.isOutbound ? "鍑虹墖" : "杩涚墖";
             String glassIds = taskInfo.glasses.stream()
                     .map(g -> g.glassId)
                     .collect(java.util.stream.Collectors.joining(","));
             log.info("宸茬粰MES姹囨姤({}浠诲姟): deviceId={}, glassCount={}, glassIds=[{}]", 
-                    taskType, deviceConfig.getDeviceId(), taskInfo.glasses.size(), glassIds);
+                    taskType, String.valueOf(deviceConfig.getId()), taskInfo.glasses.size(), glassIds);
             
             // 澶氳澶囦换鍔″満鏅笅锛屼笉鍦ㄨ繖閲岄樆濉炵瓑寰匨ES纭锛岀敱浠诲姟寮曟搸瀹氭椂璋冪敤checkMesConfirm
         } catch (Exception e) {
-            log.error("缁橫ES姹囨姤寮傚父: deviceId={}", deviceConfig.getDeviceId(), e);
+            log.error("缁橫ES姹囨姤寮傚父: deviceId={}", String.valueOf(deviceConfig.getId()), e);
         }
     }
 
@@ -2042,29 +2082,25 @@
     public DevicePlcVO.OperationResult checkMesConfirm(DeviceConfig deviceConfig,
                                                        Map<String, Object> params,
                                                        Map<String, Object> logicParams) {
-        if (plcDynamicDataService == null || s7SerializerProvider == null) {
+        String deviceId = String.valueOf(deviceConfig.getId());
+        PlcClient plcClient = getPlcClient(deviceConfig);
+        if (plcClient == null) {
             return DevicePlcVO.OperationResult.builder()
                     .success(false)
-                    .message("PlcDynamicDataService鎴朣7SerializerProvider鏈敞鍏�")
+                    .message("鑾峰彇PLC瀹㈡埛绔け璐�")
                     .build();
         }
-        EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-        if (serializer == null) {
-            return DevicePlcVO.OperationResult.builder()
-                    .success(false)
-                    .message("鑾峰彇PLC搴忓垪鍖栧櫒澶辫触")
-                    .build();
-        }
-
-        String deviceId = deviceConfig.getDeviceId();
         MesTaskInfo taskInfo = currentTasks.get(deviceId);
         
         // 濡傛灉娌℃湁浠诲姟璁板綍锛屼紭鍏堝皾璇曡ˉ鍋挎�у湴妫�鏌ヤ竴娆ES浠诲姟锛堥伩鍏嶅洜鏃跺簭闂涓�鐩磏oTask锛�
         if (taskInfo == null) {
             log.info("妫�鏌ES纭鏃舵湭鎵惧埌浠诲姟璁板綍锛屽皾璇曡ˉ鍋挎鏌ES浠诲姟: deviceId={}", deviceId);
             try {
+                // 鍏抽敭锛氳ˉ鍋挎鏌ユ椂涔熻閫忎紶params锛堝寘鍚玙taskContext锛夛紝
+                // 鍚﹀垯handleCheckMesTask鏃犳硶鎶婃湰鎵规鐜荤拑ID鍐欏叆currentMesBatchGlassIds锛屼换鍔″紩鎿庢棤娉曠疮鍔犲畬鎴愯繘搴�
+                Map<String, Object> checkParams = params != null ? params : Collections.emptyMap();
                 DevicePlcVO.OperationResult checkResult =
-                        handleCheckMesTask(deviceConfig, Collections.emptyMap(), logicParams);
+                        handleCheckMesTask(deviceConfig, checkParams, logicParams);
                 if (Boolean.TRUE.equals(checkResult.getSuccess())) {
                     taskInfo = currentTasks.get(deviceId);
                     if (taskInfo != null) {
@@ -2127,13 +2163,13 @@
 
                 // 瓒呮椂瑙嗕负浠诲姟澶辫触锛氭竻鐞嗕换鍔$姸鎬佸苟鍋滄鐩戞帶锛岄伩鍏嶇户缁疮鍔犵瓑寰呮椂闂�
                 try {
-                    clearTaskStates(deviceConfig, serializer);
+                    clearTaskStates(deviceConfig, plcClient);
                 } catch (Exception e) {
                     log.warn("MES纭瓒呮椂鏃舵竻绌轰换鍔$姸鎬佸け璐�: deviceId={}, error={}", deviceId, e.getMessage());
                 }
-                statusManager.updateVehicleStatus(deviceConfig.getDeviceId(), VehicleState.ERROR);
-                statusManager.clearVehicleTask(deviceConfig.getDeviceId());
-                currentTasks.remove(deviceConfig.getDeviceId());
+                statusManager.updateVehicleStatus(String.valueOf(deviceConfig.getId()), VehicleState.ERROR);
+                statusManager.clearVehicleTask(String.valueOf(deviceConfig.getId()));
+                currentTasks.remove(String.valueOf(deviceConfig.getId()));
                 handleStopTaskMonitor(deviceConfig);
 
                 return DevicePlcVO.OperationResult.builder()
@@ -2143,99 +2179,28 @@
                         .build();
             }
             
-            Object confirmValue = plcDynamicDataService.readPlcField(
-                    deviceConfig, "mesConfirm", serializer);
-            Integer confirm = parseInteger(confirmValue);
+            Map<String, Object> confirmData = plcClient.readData("mesConfirm");
+            Integer confirm = parseInteger(confirmData != null ? confirmData.get("mesConfirm") : null);
             boolean completed = confirm != null && confirm == 1;
             data.put("completed", completed);
 
             if (completed) {
-                // MES宸茬‘璁わ紝妫�鏌ユ槸鍚﹁繕鏈夋湭鍑虹墖鐨勭幓鐠冿紙浠呭鍑虹墖浠诲姟锛�
-                boolean hasMoreGlass = false;
-                int completedCount = 0;
-                int totalCount = 0;
-                
-                if (taskInfo.isOutbound && params != null) {
-                    // 浠嶵askExecutionContext涓幏鍙栧凡鍑虹墖鐨勭幓鐠僆D鍒楄〃鍜屽垵濮嬬幓鐠僆D鍒楄〃
-                    Object contextObj = params.get("_taskContext");
-                    if (contextObj instanceof com.mes.task.model.TaskExecutionContext) {
-                        com.mes.task.model.TaskExecutionContext context = 
-                                (com.mes.task.model.TaskExecutionContext) contextObj;
-                        
-                        @SuppressWarnings("unchecked")
-                        List<String> initialGlassIds = (List<String>) context.getSharedData().get("initialGlassIds");
-                        @SuppressWarnings("unchecked")
-                        List<String> outboundGlassIds = (List<String>) context.getSharedData().get("outboundGlassIds");
-                        
-                        if (initialGlassIds != null && !initialGlassIds.isEmpty()) {
-                            totalCount = initialGlassIds.size();
-                            completedCount = (outboundGlassIds != null) ? outboundGlassIds.size() : 0;
-                            
-                            // 妫�鏌ユ槸鍚︽墍鏈夌幓鐠冮兘宸插嚭鐗�
-                            if (outboundGlassIds == null || !outboundGlassIds.containsAll(initialGlassIds)) {
-                                hasMoreGlass = true;
-                            }
-                        }
-                    }
-                }
-                
-                // 濡傛灉杩樻湁鏈嚭鐗囩殑鐜荤拑锛屼繚鎸乸lcRequest=1锛屾竻鐞嗘湰娆′换鍔$姸鎬侊紝绛夊緟涓嬫浜や簰
-                // 杩欐牱绗簩娆′氦浜掓椂锛宑heckMesTask鍙互妫�娴嬪埌mesSend=1锛屽垱寤烘柊浠诲姟锛屽畬鏁村湴璧颁竴閬嶉�昏緫
-                if (hasMoreGlass) {
-                    // 娓呯┖state鍜屾眹鎶ュ瓧锛堟湰娆′氦浜掑凡瀹屾垚锛�
-                    clearTaskStates(deviceConfig, serializer);
-                    
-                    // 娉ㄦ剰锛氫笉璁板綍lastCompletedMesRecords锛屽洜涓鸿繕鏈夋湭鍑虹墖鐨勭幓鐠冿紝浠诲姟鏈湡姝e畬鎴�
-                    // 杩欐牱绗簩娆′氦浜掓椂锛屽嵆浣縈ES鍙戦�佹柊浠诲姟锛堟柊鐨勭幓鐠僆D锛夛紝涔熶笉浼氳璇垽涓烘棫浠诲姟
-                    
-                    // 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵�侊紙鏈浜や簰宸插畬鎴愶級
-                    statusManager.updateVehicleStatus(
-                            deviceConfig.getDeviceId(), VehicleState.IDLE);
-                    statusManager.clearVehicleTask(deviceConfig.getDeviceId());
-                    
-                    // 绉婚櫎浠诲姟璁板綍锛堟湰娆′氦浜掑凡瀹屾垚锛岀瓑寰呬笅娆′氦浜掓椂鍒涘缓鏂颁换鍔★級
-                    currentTasks.remove(deviceConfig.getDeviceId());
-                    
-                    // 鍋滄浠诲姟鐩戞帶锛堟湰娆′氦浜掑凡瀹屾垚锛�
-                    handleStopTaskMonitor(deviceConfig);
-                    
-                    // 淇濇寔plcRequest=1锛堝彲浠ユ帴鏀朵笅娆′换鍔★級
-                    Map<String, Object> payload = new HashMap<>();
-                    payload.put("plcRequest", 1);
-                    plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
-                    
-                    log.info("鍑虹墖浠诲姟鏈浜や簰瀹屾垚锛岃繕鏈夋湭鍑虹墖鐨勭幓鐠冿紝绛夊緟涓嬫浜や簰: deviceId={}, completedCount={}, totalCount={}", 
-                            deviceConfig.getDeviceId(), completedCount, totalCount);
-                    
-                    String progressMessage = String.format("鐩墠瀹屾垚鍑虹墖鐜荤拑鏁伴噺%d/%d锛岀瓑寰呬笅娆′氦浜掍换鍔�", completedCount, totalCount);
-                    data.put("completed", false); // 鏍囪涓烘湭瀹屾垚锛屽洜涓鸿繕鏈夋湭鍑虹墖鐨勭幓鐠�
-                    data.put("waiting", true);
-                    data.put("waitingReason", "moreGlassToOutbound");
-                    data.put("completedCount", completedCount);
-                    data.put("totalCount", totalCount);
-                    
-                    return DevicePlcVO.OperationResult.builder()
-                            .success(true)
-                            .message(String.format("鍑虹墖浠诲姟鏈浜や簰瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧銆�%s銆傚ぇ杞︾┖闂诧紙plcRequest=1锛夛紝绛夊緟MES鍙戦�佷笅娆′换鍔�", progressMessage))
-                            .data(data)
-                            .build();
-                }
-                
-                // 鎵�鏈夌幓鐠冮兘宸插嚭鐗囷紝姝e父瀹屾垚娴佺▼
-                // MES宸茬‘璁わ紝娓呯┖state鍜屾眹鎶ュ瓧
-                clearTaskStates(deviceConfig, serializer);
+                // MES宸茬‘璁わ細鏈浜や簰瀹屾垚锛堜笉鍦ㄨ澶囦晶鍒ゆ柇"鏄惁杩樻湁鏇村鐜荤拑"锛岀敱浠诲姟寮曟搸缁熶竴缂栨帓锛�
+                clearTaskStates(deviceConfig, plcClient);
 
                 // 璁板綍宸插畬鎴愮殑浠诲姟绛惧悕锛岄伩鍏峂ES鏈浣嶆椂琚噸澶嶆媺璧�
-                lastCompletedMesRecords.put(deviceId,
-                        new CompletedMesRecord(taskInfo.mesSignature, System.currentTimeMillis()));
+                if (taskInfo != null && taskInfo.mesSignature != null) {
+                    lastCompletedMesRecords.put(deviceId,
+                            new CompletedMesRecord(taskInfo.mesSignature, System.currentTimeMillis()));
+                }
 
                 // 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵��
                 statusManager.updateVehicleStatus(
-                        deviceConfig.getDeviceId(), VehicleState.IDLE);
-                statusManager.clearVehicleTask(deviceConfig.getDeviceId());
+                        String.valueOf(deviceConfig.getId()), VehicleState.IDLE);
+                statusManager.clearVehicleTask(String.valueOf(deviceConfig.getId()));
 
                 // 绉婚櫎浠诲姟璁板綍锛堝鏋滄湁锛�
-                currentTasks.remove(deviceConfig.getDeviceId());
+                currentTasks.remove(String.valueOf(deviceConfig.getId()));
 
                 // 鍋滄浠诲姟鐩戞帶
                 handleStopTaskMonitor(deviceConfig);
@@ -2243,13 +2208,13 @@
                 // 鎭㈠plcRequest=1锛堝彲浠ユ帴鏀舵柊浠诲姟锛�
                 Map<String, Object> payload = new HashMap<>();
                 payload.put("plcRequest", 1);
-                plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+                plcClient.writeData(payload);
 
-                log.info("MES浠诲姟宸茬‘璁ゅ畬鎴�: deviceId={}", deviceConfig.getDeviceId());
-                String taskType = taskInfo.isOutbound ? "鍑虹墖" : "杩涚墖";
+                log.info("MES浠诲姟宸茬‘璁ゅ畬鎴�: deviceId={}", String.valueOf(deviceConfig.getId()));
+                String taskType = (taskInfo != null && taskInfo.isOutbound) ? "鍑虹墖" : "杩涚墖";
                 return DevicePlcVO.OperationResult.builder()
                         .success(true)
-                        .message(String.format("%s浠诲姟瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧锛屽ぇ杞︾┖闂诧紙plcRequest=1锛夛紝鍙互绛夊緟涓嬫浠诲姟", taskType))
+                        .message(String.format("%s浠诲姟浜や簰瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧锛屽ぇ杞︾┖闂诧紙plcRequest=1锛�", taskType))
                         .data(data)
                         .build();
             }
@@ -2269,7 +2234,7 @@
                     .data(data)
                     .build();
         } catch (Exception e) {
-            log.error("妫�鏌ES纭鐘舵�佸紓甯�: deviceId={}", deviceConfig.getDeviceId(), e);
+            log.error("妫�鏌ES纭鐘舵�佸紓甯�: deviceId={}", String.valueOf(deviceConfig.getId()), e);
             return DevicePlcVO.OperationResult.builder()
                     .success(false)
                     .message("妫�鏌ES纭鐘舵�佸紓甯�: " + e.getMessage())
@@ -2285,7 +2250,7 @@
     private DevicePlcVO.OperationResult handleMarkBroken(DeviceConfig deviceConfig,
                                                          Map<String, Object> params,
                                                          Map<String, Object> logicParams) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         MesTaskInfo taskInfo = currentTasks.get(deviceId);
         if (taskInfo == null) {
             return DevicePlcVO.OperationResult.builder()
@@ -2334,20 +2299,27 @@
         }
         
         // 绔嬪嵆鍐欏叆PLC鐨剆tate瀛楁
-        EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-        if (serializer != null) {
+        PlcClient plcClient = getPlcClient(deviceConfig);
+        if (plcClient != null) {
             try {
                 Map<String, Object> payload = new HashMap<>();
                 for (Integer index : brokenIndices) {
                     String stateField = "state" + (index + 1);
                     payload.put(stateField, 8);
                 }
-                plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
-                log.info("宸叉爣璁扮幓鐠冧负鐮存崯骞跺啓鍏LC: deviceId={}, brokenIndices={}", 
-                        deviceId, brokenIndices);
+                boolean success = plcClient.writeData(payload);
+                if (success) {
+                    log.info("宸叉爣璁扮幓鐠冧负鐮存崯骞跺啓鍏LC: deviceId={}, brokenIndices={}", 
+                            deviceId, brokenIndices);
+                } else {
+                    log.error("鍐欏叆鐮存崯鐘舵�佸埌PLC澶辫触: deviceId={}, brokenIndices={}", 
+                            deviceId, brokenIndices);
+                }
             } catch (Exception e) {
                 log.error("鍐欏叆鐮存崯鐘舵�佸埌PLC澶辫触: deviceId={}, error={}", deviceId, e.getMessage());
             }
+        } else {
+            log.error("鑾峰彇PLC瀹㈡埛绔け璐ワ紝鏃犳硶鍐欏叆鐮存崯鐘舵��: deviceId={}", deviceId);
         }
         
         return DevicePlcVO.OperationResult.builder()
@@ -2359,7 +2331,7 @@
     /**
      * 娓呯┖浠诲姟鐘舵��
      */
-    private void clearTaskStates(DeviceConfig deviceConfig, EnhancedS7Serializer serializer) {
+    private void clearTaskStates(DeviceConfig deviceConfig, PlcClient plcClient) {
         try {
             Map<String, Object> payload = new HashMap<>();
             // 娓呯┖state1~6
@@ -2368,9 +2340,9 @@
             }
             // 娓呯┖姹囨姤瀛�
             payload.put("plcReport", 0);
-            plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+            plcClient.writeData(payload);
         } catch (Exception e) {
-            log.error("娓呯┖浠诲姟鐘舵�佸紓甯�: deviceId={}", deviceConfig.getDeviceId(), e);
+            log.error("娓呯┖浠诲姟鐘舵�佸紓甯�: deviceId={}", String.valueOf(deviceConfig.getId()), e);
         }
     }
 
@@ -2378,7 +2350,7 @@
      * 鍋滄浠诲姟鐩戞帶
      */
     private DevicePlcVO.OperationResult handleStopTaskMonitor(DeviceConfig deviceConfig) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         ScheduledFuture<?> future = taskMonitoringTasks.remove(deviceId);
         if (future != null && !future.isCancelled()) {
             future.cancel(false);
@@ -2511,13 +2483,10 @@
     }
 
     private void clearDynamicTaskStates(DeviceConfig deviceConfig) {
-        if (plcDynamicDataService == null || s7SerializerProvider == null) {
-            return;
-        }
         try {
-            EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
-            if (serializer != null) {
-                clearTaskStates(deviceConfig, serializer);
+            PlcClient plcClient = getPlcClient(deviceConfig);
+            if (plcClient != null) {
+                clearTaskStates(deviceConfig, plcClient);
             }
         } catch (Exception e) {
             log.warn("娓呯┖澶ц溅state瀛楁澶辫触: deviceId={}, error={}", deviceConfig != null ? deviceConfig.getId() : "null", e.getMessage());

--
Gitblit v1.8.0