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/device/controller/DeviceGroupController.java                                 |    8 
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/coordination/VehicleCoordinationService.java             |    4 
 mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java                                             |  155 +++++-
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java                     |   80 +-
 mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGroupRequest.java                                       |   10 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceStatus.java                                              |    2 
 mes-web/src/views/device/DeviceGroupList.vue                                                                                 |   42 +
 mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceStatusController.java                                |    6 
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/flow/LoadVehicleInteraction.java                         |    4 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceStatusServiceImpl.java                             |    8 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceInteractionController.java                           |    4 
 mes-processes/mes-plcSend/src/main/java/com/mes/s7/provider/S7SerializerProvider.java                                        |    3 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceInteractionServiceImpl.java                        |    6 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceConfigRequest.java                                      |   10 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java                                |  134 ++++--
 mes-web/src/views/device/DeviceConfigForm.vue                                                                                |    2 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/mapper/DeviceGroupRelationMapper.java                                 |    8 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceConfigServiceImpl.java                             |    8 
 mes-web/src/api/device/deviceManagement.js                                                                                   |   20 
 mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java                                  |   80 +++
 mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/transfer/handler/HorizontalTransferLogicHandler.java |    8 
 mes-web/src/views/device/DeviceConfigList.vue                                                                                |   27 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGlassFeedRequest.java                                   |    2 
 mes-web/src/views/plcTest/components/DeviceGroup/GroupTopology.vue                                                           |    4 
 /dev/null                                                                                                                    |  536 ------------------------
 mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceConfigController.java                                |   34 
 mes-common/serverBase/src/main/java/com/mes/s7/enhanced/EnhancedS7Serializer.java                                            |   20 
 mes-processes/mes-plcSend/src/main/java/com/mes/task/service/TaskExecutionEngine.java                                        |    4 
 mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceConfig.java                                              |    4 
 mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue                                                   |   28 +
 30 files changed, 499 insertions(+), 762 deletions(-)

diff --git a/mes-common/serverBase/src/main/java/com/mes/s7/enhanced/EnhancedS7Serializer.java b/mes-common/serverBase/src/main/java/com/mes/s7/enhanced/EnhancedS7Serializer.java
index 3831e13..d4c24ef 100644
--- a/mes-common/serverBase/src/main/java/com/mes/s7/enhanced/EnhancedS7Serializer.java
+++ b/mes-common/serverBase/src/main/java/com/mes/s7/enhanced/EnhancedS7Serializer.java
@@ -487,7 +487,25 @@
     private void extractField(S7ParseData item, Object data) {
         switch (item.getDataType()) {
             case BOOL:
-                item.setDataItem(DataItem.createReqByBoolean((Boolean) data));
+                // 绫诲瀷杞崲瀹归敊锛氭敮鎸� Integer/Number 杞� Boolean
+                Boolean boolValue;
+                if (data instanceof Boolean) {
+                    boolValue = (Boolean) data;
+                } else if (data instanceof Number) {
+                    boolValue = ((Number) data).intValue() != 0;
+                } else if (data instanceof String) {
+                    String str = ((String) data).trim().toLowerCase();
+                    boolValue = "true".equals(str) || "1".equals(str) || "on".equals(str);
+                } else {
+                    // 灏濊瘯杞崲涓烘暟瀛楀啀杞珺oolean
+                    try {
+                        int intValue = Integer.parseInt(String.valueOf(data));
+                        boolValue = intValue != 0;
+                    } catch (NumberFormatException e) {
+                        throw new S7CommException("鏃犳硶灏嗗�艰浆鎹负Boolean: " + data + " (绫诲瀷: " + (data != null ? data.getClass().getName() : "null") + ")");
+                    }
+                }
+                item.setDataItem(DataItem.createReqByBoolean(boolValue));
                 break;
             case BYTE:
                 item.setDataItem(DataItem.createReqByByte(ByteReadBuff.newInstance((byte[]) data)
diff --git a/mes-processes/mes-plcSend/ARCHITECTURE.md b/mes-processes/mes-plcSend/ARCHITECTURE.md
deleted file mode 100644
index 4d41c1d..0000000
--- a/mes-processes/mes-plcSend/ARCHITECTURE.md
+++ /dev/null
@@ -1,536 +0,0 @@
-# 椤圭洰鏋舵瀯璇存槑鏂囨。
-
-## 馃搵 椤圭洰涓讳綋鏋舵瀯
-
-### 鏍稿績涓讳綋锛歍askExecutionEngine锛堜换鍔℃墽琛屽紩鎿庯級
-
-**浣嶇疆**锛歚com.mes.task.service.TaskExecutionEngine`
-
-**鑱岃矗**锛氬璁惧浠诲姟鎵ц鐨勬牳蹇冨紩鎿庯紝璐熻矗锛�
-- 涓茶/骞惰鎵ц妯″紡鎺у埗
-- 璁惧姝ラ鎵ц璋冨害
-- 璁惧鍗忚皟妫�鏌�
-- 閿欒澶勭悊鍜岄噸璇�
-- 瀹炴椂鐘舵�侀�氱煡
-
-## 馃攧 璋冪敤娴佺▼
-
-### 1. 浠诲姟鍚姩娴佺▼
-
-```
-鐢ㄦ埛璇锋眰 (Controller)
-    鈫�
-MultiDeviceTaskServiceImpl.startTask()
-    鈹溾攢 楠岃瘉璁惧缁�
-    鈹溾攢 鑾峰彇璁惧鍒楄〃
-    鈹溾攢 鍒涘缓浠诲姟璁板綍 (PENDING)
-    鈹斺攢 寮傛鎵ц executeTaskAsync()
-        鈫�
-    TaskExecutionEngine.execute()
-        鈹溾攢 璁惧鍗忚皟妫�鏌� (DeviceCoordinationService)
-        鈹溾攢 纭畾鎵ц妯″紡 (涓茶/骞惰)
-        鈹斺攢 鎵ц璁惧姝ラ
-```
-
-### 2. 璁惧姝ラ鎵ц娴佺▼
-
-```
-TaskExecutionEngine.executeStep()
-    鈫�
-妫�鏌ユ槸鍚︽湁 DeviceInteraction
-    鈹溾攢 鏈� 鈫� executeInteractionStepWithRetry()
-    鈹�       鈫�
-    鈹�   DeviceInteraction.execute(InteractionContext)
-    鈹�       鈫�
-    鈹�   鍏蜂綋璁惧浜や簰瀹炵幇锛堝 LoadVehicleInteraction锛�
-    鈹�       鈫�
-    鈹�   璋冪敤 DeviceInteractionService
-    鈹�       鈫�
-    鈹�   鏈�缁堣皟鐢� DeviceLogicHandler
-    鈹�
-    鈹斺攢 鏃� 鈫� 鐩存帴璋冪敤 DeviceLogicHandler
-            鈫�
-        DeviceLogicHandlerFactory.getHandler(deviceType)
-            鈫�
-        BaseDeviceLogicHandler.execute()
-            鈫�
-        瀛愮被瀹炵幇 doExecute()
-```
-
-### 3. 涓ょ鎵ц璺緞
-
-#### 璺緞A锛氶�氳繃 DeviceInteraction锛堟帹鑽愮敤浜庡鏉傝澶囷級
-
-```
-TaskExecutionEngine
-    鈫�
-DeviceInteraction.execute(InteractionContext)
-    鈫�
-鍏蜂綋瀹炵幇绫伙紙濡� LoadVehicleInteraction锛�
-    鈹溾攢 鐘舵�佹鏌�
-    鈹溾攢 璁惧閫夋嫨锛堝瀹炰緥鍗忚皟锛�
-    鈹溾攢 鏁版嵁鍑嗗
-    鈹斺攢 璋冪敤 DeviceInteractionService
-        鈫�
-    DeviceLogicHandler.execute()
-```
-
-**閫傜敤鍦烘櫙**锛�
-- 闇�瑕佸瀹炰緥鍗忚皟鐨勮澶囷紙濡傚ぇ杞﹁澶囷級
-- 闇�瑕佸鏉傚墠缃鏌ョ殑璁惧
-- 闇�瑕佹暟鎹浆鎹㈠拰鍑嗗鐨勮澶�
-
-#### 璺緞B锛氱洿鎺ヨ皟鐢� DeviceLogicHandler锛堢畝鍗曡澶囷級
-
-```
-TaskExecutionEngine
-    鈫�
-DeviceLogicHandlerFactory.getHandler(deviceType)
-    鈫�
-BaseDeviceLogicHandler.execute()
-    鈹溾攢 鍙傛暟瑙f瀽
-    鈹溾攢 閫昏緫鍙傛暟鎻愬彇 (extraParams.deviceLogic)
-    鈹斺攢 瀛愮被瀹炵幇 doExecute()
-```
-
-**閫傜敤鍦烘櫙**锛�
-- 绠�鍗曡澶囷紝閫昏緫鍗曚竴
-- 涓嶉渶瑕佸鏉傚崗璋冪殑璁惧
-
-## 馃彈锔� 鍒嗗眰鏋舵瀯
-
-### 绗竴灞傦細Controller 灞傦紙API鍏ュ彛锛�
-
-**浣嶇疆**锛歚com.mes.task.controller.*`
-
-**鑱岃矗**锛�
-- 鎺ユ敹HTTP璇锋眰
-- 鍙傛暟楠岃瘉
-- 璋冪敤Service灞�
-
-**涓昏绫�**锛�
-- `MultiDeviceTaskController` - 浠诲姟绠$悊API
-- `TaskStatusNotificationController` - SSE瀹炴椂閫氱煡API
-
-### 绗簩灞傦細Service 灞傦紙涓氬姟閫昏緫锛�
-
-**浣嶇疆**锛歚com.mes.task.service.*`
-
-**鑱岃矗**锛�
-- 涓氬姟閫昏緫澶勭悊
-- 浜嬪姟绠$悊
-- 璋冪敤鎵ц寮曟搸
-
-**涓昏绫�**锛�
-- `MultiDeviceTaskServiceImpl` - 浠诲姟鏈嶅姟瀹炵幇
-  - 鍒涘缓浠诲姟璁板綍
-  - 寮傛鎵ц浠诲姟
-  - 浠诲姟鐘舵�佺鐞�
-  
-- `TaskExecutionEngine` - **鏍稿績鎵ц寮曟搸**
-  - 璁惧鍗忚皟妫�鏌�
-  - 鎵ц妯″紡鍒ゆ柇锛堜覆琛�/骞惰锛�
-  - 姝ラ鎵ц璋冨害
-  - 閲嶈瘯鏈哄埗
-
-### 绗笁灞傦細Interaction 灞傦紙璁惧浜や簰锛�
-
-**浣嶇疆**锛歚com.mes.interaction.*`
-
-**鑱岃矗**锛�
-- 璁惧浜や簰閫昏緫灏佽
-- 澶氳澶囧崗璋�
-- 鏁版嵁浼犻��
-
-**涓昏缁勪欢**锛�
-
-#### 3.1 DeviceInteraction锛堣澶囦氦浜掓帴鍙o級
-
-**鎺ュ彛**锛歚com.mes.interaction.DeviceInteraction`
-
-**瀹炵幇绫荤ず渚�**锛�
-- `LoadVehicleInteraction` - 澶ц溅璁惧浜や簰
-- `LargeGlassInteraction` - 澶х悊鐗囩浜や簰
-- `GlassStorageInteraction` - 鐜荤拑瀛樺偍浜や簰
-
-**娉ㄥ唽鏈哄埗**锛�
-- `DeviceInteractionRegistry` - 鑷姩娉ㄥ唽鎵�鏈� `@Component` 鐨� `DeviceInteraction` 瀹炵幇
-
-#### 3.2 DeviceLogicHandler锛堣澶囬�昏緫澶勭悊鍣級
-
-**鎺ュ彛**锛歚com.mes.interaction.DeviceLogicHandler`
-
-**鍩虹被**锛歚BaseDeviceLogicHandler`
-- 鎻愪緵閫氱敤鍔熻兘锛�
-  - 鍙傛暟瑙f瀽
-  - 閫昏緫鍙傛暟鎻愬彇锛堜粠 `extraParams.deviceLogic`锛�
-  - 閿欒澶勭悊
-
-**瀹炵幇绫荤ず渚�**锛�
-- `LoadVehicleLogicHandler` - 澶ц溅璁惧閫昏緫
-- `HorizontalScannerLogicHandler` - 鍗ц浆绔嬫壂鐮侀�昏緫
-- `HorizontalTransferLogicHandler` - 鍗ц浆绔嬮�昏緫
-- `LargeGlassLogicHandler` - 澶х悊鐗囩閫昏緫
-
-**娉ㄥ唽鏈哄埗**锛�
-- `DeviceLogicHandlerFactory` - 鑷姩娉ㄥ唽鎵�鏈� `DeviceLogicHandler` 瀹炵幇
-- 閫氳繃 `@PostConstruct` 鍒濆鍖栨槧灏勮〃
-
-### 绗洓灞傦細Coordination 灞傦紙璁惧鍗忚皟锛�
-
-**浣嶇疆**锛歚com.mes.device.service.*` 鍜� `com.mes.interaction.*.coordination.*`
-
-**鑱岃矗**锛�
-- 璁惧闂存暟鎹紶閫�
-- 璁惧鐘舵�佸悓姝�
-- 璁惧渚濊禆绠$悊
-- 澶氬疄渚嬪崗璋�
-
-**涓昏绫�**锛�
-- `DeviceCoordinationService` - 閫氱敤璁惧鍗忚皟鏈嶅姟
-- `VehicleCoordinationService` - 澶ц溅璁惧鍗忚皟鏈嶅姟
-- `VehicleStatusManager` - 澶ц溅鐘舵�佺鐞嗗櫒
-
-### 绗簲灞傦細PLC 鎿嶄綔灞傦紙纭欢閫氫俊锛�
-
-**浣嶇疆**锛歚com.mes.device.service.DevicePlcOperationService`
-
-**鑱岃矗**锛�
-- PLC璇诲啓鎿嶄綔
-- 鍦板潃鏄犲皠
-- 閫氫俊绠$悊
-
-## 馃摝 濡備綍娣诲姞鏂拌澶�
-
-### 姝ラ1锛氬畾涔夎澶囩被鍨嬪父閲�
-
-鍦� `DeviceConfig.DeviceType` 涓坊鍔狅細
-
-```java
-public static final class DeviceType {
-    public static final String NEW_DEVICE = "鏂拌澶囩被鍨�";
-}
-```
-
-### 姝ラ2锛氬垱寤鸿澶囬�昏緫澶勭悊鍣紙蹇呴』锛�
-
-**浣嶇疆**锛歚com.mes.interaction.*.handler.NewDeviceLogicHandler`
-
-```java
-@Component
-public class NewDeviceLogicHandler extends BaseDeviceLogicHandler {
-    
-    @Override
-    public String getDeviceType() {
-        return DeviceConfig.DeviceType.NEW_DEVICE;
-    }
-    
-    @Override
-    protected DevicePlcVO.OperationResult doExecute(
-            DeviceConfig deviceConfig,
-            String operation,
-            Map<String, Object> params,
-            Map<String, Object> logicParams) {
-        
-        // 1. 浠� logicParams 涓幏鍙栭厤缃弬鏁�
-        Integer timeout = getLogicParam(logicParams, "timeout", 5000);
-        String mode = getLogicParam(logicParams, "mode", "default");
-        
-        // 2. 浠� params 涓幏鍙栬繍琛屾椂鍙傛暟
-        String glassId = (String) params.get("glassId");
-        
-        // 3. 鎵ц璁惧閫昏緫
-        // ... 鍏蜂綋瀹炵幇
-        
-        // 4. 璋冪敤PLC鎿嶄綔
-        Map<String, Object> plcParams = new HashMap<>();
-        plcParams.put("field1", value1);
-        DevicePlcVO.OperationResult result = 
-            devicePlcOperationService.writePlcData(deviceConfig, plcParams);
-        
-        return result;
-    }
-    
-    @Override
-    protected Map<String, Object> getDefaultLogicParams() {
-        Map<String, Object> defaults = new HashMap<>();
-        defaults.put("timeout", 5000);
-        defaults.put("mode", "default");
-        return defaults;
-    }
-}
-```
-
-**鑷姩娉ㄥ唽**锛�
-- 瀹炵幇 `DeviceLogicHandler` 鎺ュ彛
-- 娣诲姞 `@Component` 娉ㄨВ
-- `DeviceLogicHandlerFactory` 浼氳嚜鍔ㄥ彂鐜板苟娉ㄥ唽
-
-### 姝ラ3锛氬垱寤鸿澶囦氦浜掔被锛堝彲閫夛紝澶嶆潅璁惧鎺ㄨ崘锛�
-
-**浣嶇疆**锛歚com.mes.interaction.*.flow.NewDeviceInteraction`
-
-```java
-@Component
-public class NewDeviceInteraction implements DeviceInteraction {
-    
-    @Override
-    public String getDeviceType() {
-        return DeviceConfig.DeviceType.NEW_DEVICE;
-    }
-    
-    @Override
-    public InteractionResult execute(InteractionContext context) {
-        DeviceConfig device = context.getCurrentDevice();
-        
-        // 1. 鍓嶇疆鏉′欢妫�鏌�
-        if (device == null) {
-            return InteractionResult.fail("璁惧閰嶇疆涓嶅瓨鍦�");
-        }
-        
-        // 2. 鏁版嵁鍑嗗
-        List<String> glassIds = context.getParameters().getGlassIds();
-        
-        // 3. 璋冪敤璁惧閫昏緫澶勭悊鍣�
-        DeviceInteractionService service = ...;
-        Map<String, Object> params = new HashMap<>();
-        params.put("glassIds", glassIds);
-        
-        DevicePlcVO.OperationResult result = 
-            service.executeDeviceOperation(device, "operationName", params);
-        
-        if (result.isSuccess()) {
-            // 4. 鏁版嵁浼犻�掑埌涓嬩竴涓澶�
-            context.getSharedData().put("processedGlasses", glassIds);
-            return InteractionResult.success("鎵ц鎴愬姛", result.getData());
-        } else {
-            return InteractionResult.fail(result.getMessage());
-        }
-    }
-}
-```
-
-**鑷姩娉ㄥ唽**锛�
-- 瀹炵幇 `DeviceInteraction` 鎺ュ彛
-- 娣诲姞 `@Component` 娉ㄨВ
-- `DeviceInteractionRegistry` 浼氳嚜鍔ㄥ彂鐜板苟娉ㄥ唽
-
-### 姝ラ4锛氶厤缃澶囬�昏緫鍙傛暟锛堝墠绔級
-
-鍦ㄨ澶囬厤缃殑 `extraParams.deviceLogic` 涓厤缃細
-
-```json
-{
-  "deviceLogic": {
-    "timeout": 5000,
-    "mode": "default",
-    "customParam1": "value1"
-  }
-}
-```
-
-### 姝ラ5锛氳澶囩粍缁囨柟寮忛�夋嫨
-
-#### 绠�鍗曡澶囷紙鎺ㄨ崘鏀惧湪閫氱敤鍖咃級
-
-```
-interaction/
-鈹斺攢鈹� impl/
-    鈹斺攢鈹� NewDeviceLogicHandler.java
-```
-
-#### 澶嶆潅璁惧锛堥渶瑕佸崗璋冦�佺姸鎬佺鐞嗙瓑锛�
-
-```
-interaction/
-鈹斺攢鈹� newdevice/
-    鈹溾攢鈹� handler/
-    鈹�   鈹斺攢鈹� NewDeviceLogicHandler.java
-    鈹溾攢鈹� flow/
-    鈹�   鈹斺攢鈹� NewDeviceInteraction.java
-    鈹溾攢鈹� coordination/  (鍙��)
-    鈹�   鈹斺攢鈹� NewDeviceCoordinationService.java
-    鈹斺攢鈹� model/  (鍙��)
-        鈹斺攢鈹� NewDeviceStatus.java
-```
-
-## 馃攳 鎵ц娴佺▼璇﹁В
-
-### 涓茶鎵ц妯″紡
-
-```
-TaskExecutionEngine.execute()
-    鈫�
-for (姣忎釜璁惧) {
-    1. 鍒涘缓姝ラ璁板綍 (TaskStepDetail)
-    2. executeStep()
-        鈫�
-    3. 妫�鏌ユ槸鍚︽湁 DeviceInteraction
-        鈹溾攢 鏈� 鈫� DeviceInteraction.execute()
-        鈹�       鈫�
-        鈹�   璋冪敤 DeviceLogicHandler
-        鈹�
-        鈹斺攢 鏃� 鈫� 鐩存帴璋冪敤 DeviceLogicHandler
-                鈫�
-            BaseDeviceLogicHandler.execute()
-                鈫�
-            瀛愮被 doExecute()
-    4. 鏇存柊姝ラ鐘舵��
-    5. 浼犻�掓暟鎹埌涓嬩竴涓澶�
-}
-```
-
-### 骞惰鎵ц妯″紡
-
-```
-TaskExecutionEngine.execute()
-    鈫�
-鍒涘缓绾跨▼姹犱换鍔″垪琛�
-    鈫�
-for (姣忎釜璁惧) {
-    鎻愪氦鍒扮嚎绋嬫睜鎵ц
-        鈫�
-    executeStep() (鍚屼笂)
-}
-    鈫�
-绛夊緟鎵�鏈変换鍔″畬鎴�
-    鈫�
-姹囨�荤粨鏋�
-```
-
-## 馃摑 鍏抽敭鎺ュ彛璇存槑
-
-### DeviceLogicHandler
-
-**鎺ュ彛鏂规硶**锛�
-```java
-DevicePlcVO.OperationResult execute(
-    DeviceConfig deviceConfig,
-    String operation,
-    Map<String, Object> params
-);
-```
-
-**璋冪敤鏃舵満**锛�
-- 浠诲姟鎵ц寮曟搸鐩存帴璋冪敤
-- 鎴栭�氳繃 DeviceInteraction 闂存帴璋冪敤
-
-### DeviceInteraction
-
-**鎺ュ彛鏂规硶**锛�
-```java
-InteractionResult execute(InteractionContext context);
-```
-
-**璋冪敤鏃舵満**锛�
-- 浠诲姟鎵ц寮曟搸浼樺厛妫�鏌ユ槸鍚︽湁 DeviceInteraction
-- 濡傛灉鏈夛紝浼樺厛浣跨敤 DeviceInteraction
-- 濡傛灉娌℃湁锛岀洿鎺ヨ皟鐢� DeviceLogicHandler
-
-### InteractionContext
-
-**鍖呭惈鍐呭**锛�
-- `currentDevice` - 褰撳墠璁惧閰嶇疆
-- `taskContext` - 浠诲姟涓婁笅鏂�
-- `parameters` - 浠诲姟鍙傛暟
-- `sharedData` - 璁惧闂村叡浜暟鎹�
-
-## 馃幆 鏈�浣冲疄璺�
-
-### 1. 浣曟椂浣跨敤 DeviceInteraction锛�
-
-**浣跨敤鍦烘櫙**锛�
-- 鉁� 闇�瑕佸瀹炰緥鍗忚皟锛堝澶ц溅璁惧锛�
-- 鉁� 闇�瑕佸鏉傚墠缃鏌�
-- 鉁� 闇�瑕佹暟鎹浆鎹㈠拰鍑嗗
-- 鉁� 闇�瑕佺姸鎬佺鐞�
-
-**涓嶄娇鐢ㄥ満鏅�**锛�
-- 鉂� 绠�鍗曡澶囷紝閫昏緫鍗曚竴
-- 鉂� 涓嶉渶瑕佸崗璋冪殑璁惧
-
-### 2. 鍙傛暟璁捐
-
-**logicParams锛堥�昏緫鍙傛暟锛�**锛�
-- 浠� `extraParams.deviceLogic` 涓鍙�
-- 璁惧閰嶇疆鏃惰缃紝杩愯鏃朵笉鍙�
-- 濡傦細瓒呮椂鏃堕棿銆佹ā寮忋�佸閲忕瓑
-
-**params锛堣繍琛屾椂鍙傛暟锛�**锛�
-- 浠诲姟鎵ц鏃跺姩鎬佷紶鍏�
-- 濡傦細鐜荤拑ID銆佷綅缃�佹暟閲忕瓑
-
-### 3. 閿欒澶勭悊
-
-**鍦� BaseDeviceLogicHandler 涓�**锛�
-- 鑷姩鎹曡幏寮傚父
-- 杩斿洖缁熶竴鐨勯敊璇牸寮�
-
-**鍦ㄥ瓙绫讳腑**锛�
-- 鍙互鎶涘嚭涓氬姟寮傚父
-- 浼氳鍩虹被鎹曡幏骞惰浆鎹�
-
-### 4. 鏁版嵁浼犻��
-
-**閫氳繃 InteractionContext.sharedData**锛�
-```java
-// 鍦ㄨ澶嘇涓缃�
-context.getSharedData().put("glassIds", glassIds);
-
-// 鍦ㄨ澶嘊涓幏鍙�
-List<String> glassIds = (List<String>) context.getSharedData().get("glassIds");
-```
-
-## 馃摎 鐩稿叧鏂囦欢浣嶇疆
-
-### 鏍稿績鏂囦欢
-- `TaskExecutionEngine.java` - 浠诲姟鎵ц寮曟搸
-- `MultiDeviceTaskServiceImpl.java` - 浠诲姟鏈嶅姟
-- `DeviceLogicHandlerFactory.java` - 澶勭悊鍣ㄥ伐鍘�
-- `DeviceInteractionRegistry.java` - 浜や簰娉ㄥ唽涓績
-
-### 鍩虹被
-- `BaseDeviceLogicHandler.java` - 閫昏緫澶勭悊鍣ㄥ熀绫�
-- `DeviceInteraction.java` - 浜や簰鎺ュ彛
-
-### 绀轰緥瀹炵幇
-- `LoadVehicleLogicHandler.java` - 澶ц溅璁惧閫昏緫澶勭悊鍣�
-- `LoadVehicleInteraction.java` - 澶ц溅璁惧浜や簰
-- `HorizontalScannerLogicHandler.java` - 鍗ц浆绔嬫壂鐮佸鐞嗗櫒
-
-## 馃敡 璋冭瘯鎶�宸�
-
-### 1. 鏌ョ湅娉ㄥ唽鐨勮澶囧鐞嗗櫒
-
-```java
-@Autowired
-private DeviceLogicHandlerFactory factory;
-
-// 鏌ョ湅鎵�鏈夊凡娉ㄥ唽鐨勮澶囩被鍨�
-Set<String> types = factory.getSupportedDeviceTypes();
-```
-
-### 2. 鏌ョ湅娉ㄥ唽鐨勮澶囦氦浜�
-
-```java
-@Autowired
-private DeviceInteractionRegistry registry;
-
-// 鏌ョ湅鎵�鏈夊凡娉ㄥ唽鐨勪氦浜�
-Map<String, DeviceInteraction> interactions = registry.getInteractions();
-```
-
-### 3. 鏃ュ織杈撳嚭
-
-- 浠诲姟鎵ц锛氭煡鐪� `TaskExecutionEngine` 鏃ュ織
-- 璁惧鎵ц锛氭煡鐪嬪叿浣� Handler 鏃ュ織
-- 鍗忚皟鏈嶅姟锛氭煡鐪� `DeviceCoordinationService` 鏃ュ織
-
-## 鉁� 鎬荤粨
-
-1. **椤圭洰涓讳綋**锛歚TaskExecutionEngine` 鏄牳蹇冩墽琛屽紩鎿�
-2. **璋冪敤娴佺▼**锛欳ontroller 鈫� Service 鈫� Engine 鈫� Interaction/Handler 鈫� PLC
-3. **鍒嗗眰鏋舵瀯**锛欳ontroller 鈫� Service 鈫� Interaction 鈫� Coordination 鈫� PLC
-4. **娣诲姞璁惧**锛氬疄鐜� `DeviceLogicHandler`锛堝繀椤伙級+ `DeviceInteraction`锛堝彲閫夛級
-5. **鑷姩娉ㄥ唽**锛氶�氳繃 Spring 鐨� `@Component` 鍜屽伐鍘傜被鑷姩鍙戠幇鍜屾敞鍐�
-
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceConfigController.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceConfigController.java
index ecf6b1e..4369f5b 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceConfigController.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceConfigController.java
@@ -82,11 +82,11 @@
                 return Result.error("璁惧閰嶇疆鏁版嵁鏍煎紡閿欒");
             }
             
-            deviceConfig.setId(request.getDeviceId());
+            deviceConfig.setId(request.getId());
             boolean success = deviceConfigService.updateDevice(deviceConfig);
             if (success) {
                 // 鏇存柊鎴愬姛鍚庯紝閲嶆柊鑾峰彇璁惧瀵硅薄
-                DeviceConfig updated = deviceConfigService.getDeviceById(request.getDeviceId());
+                DeviceConfig updated = deviceConfigService.getDeviceById(request.getId());
                 return Result.success(updated);
             } else {
                 return Result.error("璁惧閰嶇疆涓嶅瓨鍦�");
@@ -105,7 +105,7 @@
     public Result<Void> deleteDevice(
             @Valid @RequestBody DeviceConfigRequest request) {
         try {
-            deviceConfigService.deleteDevice(request.getDeviceId());
+            deviceConfigService.deleteDevice(request.getId());
             return Result.success(null);
         } catch (Exception e) {
             log.error("鍒犻櫎璁惧閰嶇疆澶辫触", e);
@@ -121,7 +121,7 @@
     public Result<DeviceConfig> getDeviceById(
             @Valid @RequestBody DeviceConfigRequest request) {
         try {
-            DeviceConfig device = deviceConfigService.getDeviceById(request.getDeviceId());
+            DeviceConfig device = deviceConfigService.getDeviceById(request.getId());
             return Result.success(device);
         } catch (Exception e) {
             log.error("鑾峰彇璁惧閰嶇疆澶辫触", e);
@@ -159,7 +159,7 @@
     public Result<Void> enableDevice(
             @Valid @RequestBody DeviceConfigRequest request) {
         try {
-            deviceConfigService.enableDevice(request.getDeviceId());
+            deviceConfigService.enableDevice(request.getId());
             return Result.success(null);
         } catch (Exception e) {
             log.error("鍚敤璁惧澶辫触", e);
@@ -175,7 +175,7 @@
     public Result<Void> disableDevice(
             @Valid @RequestBody DeviceConfigRequest request) {
         try {
-            deviceConfigService.disableDevice(request.getDeviceId());
+            deviceConfigService.disableDevice(request.getId());
             return Result.success(null);
         } catch (Exception e) {
             log.error("绂佺敤璁惧澶辫触", e);
@@ -239,7 +239,7 @@
     public Result<Boolean> checkDeviceCodeExists(
             @ApiParam("璁惧閰嶇疆璇锋眰") @RequestBody DeviceConfigRequest request) {
         try {
-            boolean exists = deviceConfigService.isDeviceCodeExists(request.getDeviceCode(), request.getDeviceId());
+            boolean exists = deviceConfigService.isDeviceCodeExists(request.getDeviceCode(), request.getId());
             return Result.success(exists);
         } catch (Exception e) {
             log.error("妫�鏌ヨ澶囩紪鐮佸け璐�", e);
@@ -301,7 +301,7 @@
     public Result<DeviceConfigVO.HealthCheckResult> performHealthCheck(
             @Valid @RequestBody DeviceConfigRequest request) {
         try {
-            DeviceConfigVO.HealthCheckResult result = deviceConfigService.performHealthCheck(request.getDeviceId());
+            DeviceConfigVO.HealthCheckResult result = deviceConfigService.performHealthCheck(request.getId());
             return Result.success(result);
         } catch (Exception e) {
             log.error("璁惧鍋ュ悍妫�鏌ュけ璐�", e);
@@ -312,7 +312,7 @@
     /**
      * 娴嬭瘯璁惧PLC杩炴帴
      * 鏀寔涓ょ鏂瑰紡锛�
-     * 1. 浼犲叆 deviceId锛屾牴鎹凡淇濆瓨鐨勮澶囬厤缃祴璇�
+     * 1. 浼犲叆 id锛屾牴鎹凡淇濆瓨鐨勮澶囬厤缃祴璇�
      * 2. 鐩存帴浼犲叆 plcIp / plcPort / timeout 杩涜涓�娆℃�ф祴璇�
      */
     @PostMapping("/devices/test-connection")
@@ -323,15 +323,15 @@
             Integer plcPort = null;
             Integer timeoutMs = null;
 
-            // 浼樺厛鏍规嵁 deviceId 璇诲彇宸蹭繚瀛橀厤缃�
-            Object deviceIdObj = body.get("deviceId");
-            if (deviceIdObj != null) {
-                Long deviceId = deviceIdObj instanceof Number
-                        ? ((Number) deviceIdObj).longValue()
-                        : Long.parseLong(deviceIdObj.toString());
-                DeviceConfig device = deviceConfigService.getDeviceById(deviceId);
+            // 浼樺厛鏍规嵁 id 璇诲彇宸蹭繚瀛橀厤缃�
+            Object idObj = body.get("id");
+            if (idObj != null) {
+                Long id = idObj instanceof Number
+                        ? ((Number) idObj).longValue()
+                        : Long.parseLong(idObj.toString());
+                DeviceConfig device = deviceConfigService.getDeviceById(id);
                 if (device == null) {
-                    return Result.error("璁惧涓嶅瓨鍦�: " + deviceId);
+                    return Result.error("璁惧涓嶅瓨鍦�: " + id);
                 }
                 plcIp = device.getPlcIp();
                 plcPort = device.getPlcPort();
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceGroupController.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceGroupController.java
index fc0bc8e..fb68306 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceGroupController.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceGroupController.java
@@ -294,7 +294,7 @@
     public Result<Void> addDeviceToGroup(
             @Valid @RequestBody DeviceGroupRequest request) {
         try {
-            deviceGroupRelationService.addDeviceToGroup(request.getGroupId(), request.getDeviceId(), 
+            deviceGroupRelationService.addDeviceToGroup(request.getGroupId(), request.getId(), 
                 request.getDeviceRole() != null ? request.getDeviceRole() : "MEMBER");
             return Result.success(null);
         } catch (Exception e) {
@@ -311,7 +311,7 @@
     public Result<Void> removeDeviceFromGroup(
             @Valid @RequestBody DeviceGroupRequest request) {
         try {
-            deviceGroupRelationService.removeDeviceFromGroup(request.getGroupId(), request.getDeviceId());
+            deviceGroupRelationService.removeDeviceFromGroup(request.getGroupId(), request.getId());
             return Result.success(null);
         } catch (Exception e) {
             log.error("浠庤澶囩粍绉婚櫎璁惧澶辫触", e);
@@ -327,7 +327,7 @@
     public Result<Void> updateDeviceRole(
             @Valid @RequestBody DeviceGroupRequest request) {
         try {
-            deviceGroupRelationService.updateDeviceRole(request.getGroupId(), request.getDeviceId(), 
+            deviceGroupRelationService.updateDeviceRole(request.getGroupId(), request.getId(), 
                 request.getDeviceRole());
             return Result.success(null);
         } catch (Exception e) {
@@ -360,7 +360,7 @@
     public Result<List<DeviceGroupVO.GroupInfo>> getDeviceGroups(
             @Valid @RequestBody DeviceGroupRequest request) {
         try {
-            List<DeviceGroupVO.GroupInfo> groups = deviceGroupRelationService.getDeviceGroups(request.getDeviceId());
+            List<DeviceGroupVO.GroupInfo> groups = deviceGroupRelationService.getDeviceGroups(request.getId());
             return Result.success(groups);
         } catch (Exception e) {
             log.error("鑾峰彇璁惧璁惧缁勫垪琛ㄥけ璐�", e);
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceInteractionController.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceInteractionController.java
index f38af62..17d3606 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceInteractionController.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceInteractionController.java
@@ -37,7 +37,7 @@
     public Result<DevicePlcVO.OperationResult> executeOperation(
             @Valid @RequestBody DeviceOperationRequest request) {
         return Result.success(deviceInteractionService.executeOperation(
-                request.getDeviceId(),
+                request.getId(),
                 request.getOperation(),
                 request.getParams()
         ));
@@ -50,7 +50,7 @@
     public static class DeviceOperationRequest {
         @NotNull(message = "璁惧ID涓嶈兘涓虹┖")
         @ApiParam(value = "璁惧ID", required = true)
-        private Long deviceId;
+        private Long id;
 
         @NotNull(message = "鎿嶄綔绫诲瀷涓嶈兘涓虹┖")
         @ApiParam(value = "鎿嶄綔绫诲瀷锛堝锛歠eedGlass, triggerRequest, triggerReport绛夛級", required = true)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceStatusController.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceStatusController.java
index 88d9613..c47a744 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceStatusController.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/controller/DeviceStatusController.java
@@ -34,7 +34,7 @@
             @Valid @RequestBody DeviceStatusUpdateRequest request) {
         try {
             boolean success = deviceStatusService.updateDeviceOnlineStatus(
-                    request.getDeviceId(), 
+                    request.getId(), 
                     request.getStatus()
             );
             if (success) {
@@ -104,7 +104,7 @@
     public static class DeviceStatusUpdateRequest {
         @NotNull(message = "璁惧ID涓嶈兘涓虹┖")
         @ApiParam(value = "璁惧閰嶇疆ID", required = true)
-        private Long deviceId;
+        private Long id;
 
         @NotEmpty(message = "璁惧鐘舵�佷笉鑳戒负绌�")
         @ApiParam(value = "璁惧鐘舵�侊紙ONLINE/OFFLINE/BUSY/ERROR/MAINTENANCE锛�", required = true)
@@ -131,7 +131,7 @@
     @Data
     public static class DeviceHeartbeatRequest {
         @NotEmpty(message = "璁惧ID涓嶈兘涓虹┖")
-        @ApiParam(value = "璁惧ID锛坉evice_config.device_id锛�", required = true)
+        @ApiParam(value = "璁惧ID锛圖eviceConfig.id鐨勫瓧绗︿覆褰㈠紡锛屽搴攄evice_status.device_id锛�", required = true)
         private String deviceId;
 
         @ApiParam(value = "璁惧鐘舵�侊紙鍙�夛紝榛樿涓篛NLINE锛�")
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceConfig.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceConfig.java
index 12734de..174df75 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceConfig.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceConfig.java
@@ -23,10 +23,6 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
-    @ApiModelProperty(value = "璁惧鍞竴鏍囪瘑", example = "DEVICE_001")
-    @TableField("device_id")
-    private String deviceId;
-
     @ApiModelProperty(value = "璁惧鍚嶇О", example = "澶ц溅璁惧1")
     @TableField("device_name")
     private String deviceName;
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceStatus.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceStatus.java
index a3bf53d..b4dc67c 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceStatus.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/entity/DeviceStatus.java
@@ -25,7 +25,7 @@
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
-    @ApiModelProperty(value = "璁惧ID锛坉evice_config.device_id锛�", example = "DEVICE_001")
+    @ApiModelProperty(value = "璁惧ID锛圖eviceConfig.id鐨勫瓧绗︿覆褰㈠紡锛�", example = "1")
     @TableField("device_id")
     private String deviceId;
 
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/mapper/DeviceGroupRelationMapper.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/mapper/DeviceGroupRelationMapper.java
index 0da6396..354cae1 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/mapper/DeviceGroupRelationMapper.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/mapper/DeviceGroupRelationMapper.java
@@ -62,8 +62,8 @@
             "CASE WHEN ds.status = 'ONLINE' THEN TRUE ELSE FALSE END as isOnline " +
             "FROM device_config d " +
             "INNER JOIN device_group_relation dgr ON d.id = dgr.device_id " +
-            "LEFT JOIN device_status ds ON d.device_id = ds.device_id " +
-            "  AND ds.id = (SELECT MAX(id) FROM device_status WHERE device_id = d.device_id) " +
+            "LEFT JOIN device_status ds ON CAST(d.id AS CHAR) = ds.device_id " +
+            "  AND ds.id = (SELECT MAX(id) FROM device_status WHERE device_id = CAST(d.id AS CHAR)) " +
             "WHERE dgr.group_id = #{groupId} AND dgr.is_deleted = 0 AND d.is_deleted = 0 " +
             "ORDER BY dgr.connection_order ASC")
     List<DeviceGroupVO.DeviceInfo> getGroupDevices(@Param("groupId") Long groupId);
@@ -107,8 +107,8 @@
     @Select("SELECT COUNT(DISTINCT d.id) " +
             "FROM device_config d " +
             "INNER JOIN device_group_relation dgr ON d.id = dgr.device_id " +
-            "LEFT JOIN device_status ds ON d.device_id = ds.device_id " +
-            "  AND ds.id = (SELECT MAX(id) FROM device_status WHERE device_id = d.device_id) " +
+            "LEFT JOIN device_status ds ON CAST(d.id AS CHAR) = ds.device_id " +
+            "  AND ds.id = (SELECT MAX(id) FROM device_status WHERE device_id = CAST(d.id AS CHAR)) " +
             "WHERE dgr.group_id = #{groupId} " +
             "  AND dgr.is_deleted = 0 " +
             "  AND d.is_deleted = 0 " +
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceConfigRequest.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceConfigRequest.java
index 717a216..1c7940e 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceConfigRequest.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceConfigRequest.java
@@ -17,7 +17,7 @@
 public class DeviceConfigRequest {
 
     @ApiModelProperty(value = "璁惧ID", example = "1")
-    private Long deviceId;
+    private Long id;
 
     @ApiModelProperty(value = "璁惧閰嶇疆淇℃伅")
     private Object deviceConfig;
@@ -50,12 +50,12 @@
     public DeviceConfigRequest() {
     }
 
-    public DeviceConfigRequest(Long deviceId) {
-        this.deviceId = deviceId;
+    public DeviceConfigRequest(Long id) {
+        this.id = id;
     }
 
-    public DeviceConfigRequest(Long deviceId, Object deviceConfig) {
-        this.deviceId = deviceId;
+    public DeviceConfigRequest(Long id, Object deviceConfig) {
+        this.id = id;
         this.deviceConfig = deviceConfig;
     }
 
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGlassFeedRequest.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGlassFeedRequest.java
index 47a12b4..659468e 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGlassFeedRequest.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGlassFeedRequest.java
@@ -17,7 +17,7 @@
 
     @NotNull
     @ApiModelProperty(value = "璁惧ID", required = true)
-    private Long deviceId;
+    private Long id;
 
     @ApiModelProperty(value = "鐜荤拑ID鍒楄〃", example = "GLS001")
     private List<String> glassIds;
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGroupRequest.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGroupRequest.java
index 2c3acbd..92d1526 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGroupRequest.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/request/DeviceGroupRequest.java
@@ -20,7 +20,7 @@
     private Long groupId;
 
     @ApiModelProperty(value = "璁惧ID", example = "1")
-    private Long deviceId;
+    private Long id;
 
     @ApiModelProperty(value = "璁惧ID鍒楄〃")
     private List<Long> deviceIds;
@@ -42,14 +42,14 @@
         this.groupId = groupId;
     }
 
-    public DeviceGroupRequest(Long groupId, Long deviceId) {
+    public DeviceGroupRequest(Long groupId, Long id) {
         this.groupId = groupId;
-        this.deviceId = deviceId;
+        this.id = id;
     }
 
-    public DeviceGroupRequest(Long groupId, Long deviceId, String deviceRole) {
+    public DeviceGroupRequest(Long groupId, Long id, String deviceRole) {
         this.groupId = groupId;
-        this.deviceId = deviceId;
+        this.id = id;
         this.deviceRole = deviceRole;
     }
 
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceConfigServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceConfigServiceImpl.java
index c48c702..0b0b17e 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceConfigServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceConfigServiceImpl.java
@@ -48,9 +48,6 @@
                 throw new IllegalArgumentException("璁惧缂栫爜宸插瓨鍦�");
             }
 
-            // 鍏煎鏃у瓧娈碉細缁熶竴灏� device_id 濉负 deviceCode锛岄伩鍏嶉潪绌�/鍞竴绾︽潫闂
-            deviceConfig.setDeviceId(code);
-
             // 椤圭洰ID鏈紶鍒欎娇鐢ㄩ粯璁ら」鐩紙鍗曢」鐩満鏅彲鐢級锛岄伩鍏嶉潪绌虹害鏉�
             if (deviceConfig.getProjectId() == null) {
                 deviceConfig.setProjectId(1L);
@@ -79,11 +76,6 @@
             if (isDeviceCodeExists(deviceConfig.getDeviceCode(), deviceConfig.getId())) {
                 log.warn("璁惧缂栧彿宸插瓨鍦�: {}", deviceConfig.getDeviceCode());
                 return false;
-            }
-
-            // 鍚屾 device_id 涓� deviceCode锛屼繚鎸佷竴鑷�
-            if (StringUtils.isNotBlank(deviceConfig.getDeviceCode())) {
-                deviceConfig.setDeviceId(deviceConfig.getDeviceCode().trim());
             }
 
             // 鑻ラ」鐩甀D缂哄け锛屼娇鐢ㄩ粯璁ら」鐩�
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceInteractionServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceInteractionServiceImpl.java
index 73cb33a..3d52809 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceInteractionServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceInteractionServiceImpl.java
@@ -38,7 +38,7 @@
     @Override
     public DevicePlcVO.OperationResult feedGlass(DeviceGlassFeedRequest request) {
         // 浼樺厛浣跨敤鏂扮殑澶勭悊鍣ㄦ灦鏋�
-        DeviceConfig deviceConfig = deviceConfigService.getDeviceById(request.getDeviceId());
+        DeviceConfig deviceConfig = deviceConfigService.getDeviceById(request.getId());
         if (deviceConfig != null) {
             DeviceLogicHandler handler = handlerFactory.getHandler(deviceConfig.getDeviceType());
             if (handler != null) {
@@ -53,13 +53,13 @@
         }
 
         // 闄嶇骇鍒板師鏈夐�昏緫锛堝吋瀹规棫浠g爜锛�
-        DeviceControlProfile profile = controlProfileService.getProfile(request.getDeviceId());
+        DeviceControlProfile profile = controlProfileService.getProfile(request.getId());
         Map<String, Object> payload = buildGlassPayload(profile, request);
         String opName = "鐜荤拑涓婃枡";
         if (request.getPositionCode() != null) {
             opName = opName + "(" + request.getPositionCode() + ")";
         }
-        return devicePlcOperationService.writeFields(request.getDeviceId(), payload, opName);
+        return devicePlcOperationService.writeFields(request.getId(), payload, opName);
     }
 
     /**
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceStatusServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceStatusServiceImpl.java
index 48ab167..1e92c44 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceStatusServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/DeviceStatusServiceImpl.java
@@ -83,9 +83,9 @@
                 return false;
             }
 
-            String deviceIdStr = device.getDeviceId();
+            String deviceIdStr = String.valueOf(device.getId());
             if (deviceIdStr == null || deviceIdStr.trim().isEmpty()) {
-                log.warn("璁惧閰嶇疆涓璬evice_id瀛楁涓虹┖: id={}", deviceId);
+                log.warn("璁惧閰嶇疆涓璱d瀛楁涓虹┖: id={}", deviceId);
                 return false;
             }
 
@@ -188,10 +188,10 @@
         }
         try {
             DeviceConfig device = deviceConfigService.getDeviceById(deviceConfigId);
-            if (device == null || device.getDeviceId() == null) {
+            if (device == null || device.getId() == null) {
                 return null;
             }
-            return getLatestByDeviceId(device.getDeviceId());
+            return getLatestByDeviceId(String.valueOf(device.getId()));
         } catch (Exception e) {
             log.error("鏍规嵁璁惧閰嶇疆ID鑾峰彇璁惧鐘舵�佸け璐�: deviceConfigId={}", deviceConfigId, e);
             return null;
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
index d46acfb..3e04c93 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/device/service/impl/GlassInfoServiceImpl.java
@@ -233,8 +233,18 @@
             return result;
         }
 
-        // 宸ョ▼鍙风敓鎴愶細姣忔瀵煎叆閮界敓鎴愭柊鐨勫伐绋嬪彿锛堝厛鍙敓鎴愶紝涓嶄繚瀛樺埌鏁版嵁搴擄紝绛夊埌MES璋冪敤鎴愬姛鍚庡啀淇濆瓨锛�
-        final String engineerId = engineeringSequenceService.generateEngineeringId(new Date());
+        // 宸ョ▼鍙凤細浠h〃鏁翠釜Excel琛紝浼樺厛浣跨敤Excel涓殑宸ョ▼鍙凤紙浠庣涓�琛屾垨浠绘剰涓�琛岃幏鍙栵級锛屽鏋滄墍鏈夎閮芥病鏈夊垯鑷姩鐢熸垚
+        String engineerIdFromExcel = null;
+        for (Map<String, Object> row : excelRows) {
+            String engineeringId = str(row.get("engineeringId"));
+            if (engineeringId != null && !engineeringId.trim().isEmpty()) {
+                engineerIdFromExcel = engineeringId.trim();
+                break; // 鎵惧埌绗竴涓潪绌虹殑宸ョ▼鍙峰氨浣跨敤
+            }
+        }
+        final String engineerId = engineerIdFromExcel != null 
+                ? engineerIdFromExcel 
+                : engineeringSequenceService.generateEngineeringId(new Date());
         final String filmsIdDefault = firstValue(excelRows, "filmsId", "鐧界幓");
         final double thicknessDefault = parseDouble(firstValue(excelRows, "thickness"), 0d);
 
@@ -246,6 +256,15 @@
         // 鐢熸垚鏃ユ湡瀛楃涓诧紙yyMMdd鏍煎紡锛夛紝鐢ㄤ簬娴佺▼鍗D鐢熸垚
         LocalDate localDate = new Date().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
         String dateStr = localDate.format(DateTimeFormatter.ofPattern("yyMMdd"));
+        
+        // 妫�鏌ユ槸鍚︽湁娴佺▼鍗D锛氬鏋滄墍鏈夎鐨勬祦绋嬪崱ID閮戒负绌猴紝鍒欐墍鏈夎褰曞叡浜悓涓�涓祦绋嬪崱ID
+        boolean allFlowCardIdEmpty = excelRows.stream()
+                .allMatch(row -> {
+                    String flowCardId = str(row.get("flowCardId"));
+                    return flowCardId == null || flowCardId.trim().isEmpty();
+                });
+        // 濡傛灉鎵�鏈夋祦绋嬪崱ID閮戒负绌猴紝鐢熸垚涓�涓叡浜殑娴佺▼鍗D
+        String sharedFlowCardId = allFlowCardIdEmpty ? "NG" + dateStr + "01A001" : null;
         
         // 鐢ㄤ簬瀛樺偍姣忎釜鐜荤拑ID瀵瑰簲鐨勬祦绋嬪崱ID锛堝悓涓�鐜荤拑ID鐨勫涓幓鐠冨叡浜悓涓�涓祦绋嬪崱ID锛�
         Map<String, String> glassIdFlowCardIdMap = new HashMap<>();
@@ -276,32 +295,25 @@
 
             String glassId = str(row.get("glassId"));
             String filmsId = strOrDefault(row.get("filmsId"), filmsIdDefaultFinal);
-            String flowCardId = str(row.get("flowCardId"));
-            
-            // 濡傛灉娴佺▼鍗D涓虹┖锛屾寜鏂拌鍒欑敓鎴愶細NG + yyMMdd + 搴忓彿锛堜袱浣嶏紝浣跨敤鐜荤拑ID锛� + A001
-            if (flowCardId.isEmpty()) {
-                // 妫�鏌ユ槸鍚﹀凡涓鸿鐜荤拑ID鐢熸垚杩囨祦绋嬪崱ID锛堝悓涓�鐜荤拑ID鐨勫涓幓鐠冨叡浜悓涓�涓祦绋嬪崱ID锛�
-                String generatedFlowCardId = glassIdFlowCardIdMap.get(glassId);
-                if (generatedFlowCardId == null) {
-                    // 浣跨敤鐜荤拑ID浣滀负搴忓彿锛堣В鏋愪负鏁存暟锛屽鏋滆В鏋愬け璐ュ垯浣跨敤1锛�
-                    int sequence;
-                    try {
-                        sequence = Integer.parseInt(glassId.trim());
-                        if (sequence <= 0) {
-                            sequence = 1;
-                        }
-                    } catch (NumberFormatException e) {
-                        log.warn("鐜荤拑ID鏃犳硶瑙f瀽涓烘暣鏁帮紝浣跨敤榛樿鍊�1: glassId={}", glassId);
-                        sequence = 1;
-                    }
-                    generatedFlowCardId = "NG" + dateStr + String.format("%02d", sequence) + "A001";
-                    glassIdFlowCardIdMap.put(glassId, generatedFlowCardId);
-                    log.info("涓虹幓鐠僆D {} 鐢熸垚娴佺▼鍗D: flowCardId={}", glassId, generatedFlowCardId);
-                }
-                flowCardId = generatedFlowCardId;
+            // 娴佺▼鍗D锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+            String flowCardIdFromExcel = str(row.get("flowCardId"));
+            String flowCardId;
+            if (flowCardIdFromExcel != null && !flowCardIdFromExcel.trim().isEmpty()) {
+                // Excel涓湁娴佺▼鍗D锛屼娇鐢‥xcel鐨�
+                flowCardId = flowCardIdFromExcel.trim();
+            } else {
+                // Excel涓祦绋嬪崱ID涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+                flowCardId = sharedFlowCardId != null ? sharedFlowCardId : getOrGenerateFlowCardId(glassId, dateStr, glassIdFlowCardIdMap);
             }
             // 鍘绘帀灏鹃儴 "/鏁板瓧"锛堝鏋滄湁锛�
             String baseFlowCardId = flowCardId.replaceFirst("/\\d+$", "");
+            
+            // 灞傚彿锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉娌℃湁锛岄粯璁�1
+            Object layerObj = row.get("layer");
+            int layer = layerObj != null ? (int) parseDouble(layerObj, 1) : 1;
+            if (layer <= 0) {
+                layer = 1;
+            }
             
             // orderNumber 鏄暣鍨嬶紙鐜荤拑绫诲瀷锛夛紝浠� Excel 璇诲彇鎴栦娇鐢ㄩ粯璁ゅ�� 1
             Object orderNumberObj = row.get("orderNumber");
@@ -351,7 +363,7 @@
                 m.put("height", height);
                 m.put("thickness", thickness);
                 m.put("filmsId", filmsId);
-                m.put("layer", 1);
+                m.put("layer", layer);
                 m.put("totalLayer", 1);
                 m.put("edgWidth", width);
                 m.put("edgHeight", height);
@@ -403,26 +415,15 @@
         Map<String, Map<String, Object>> flowCardMap = new HashMap<>();
         for (Map<String, Object> row : excelRows) {
             String glassId = str(row.get("glassId"));
-            String flowCardId = str(row.get("flowCardId"));
-            if (flowCardId.isEmpty()) {
-                // 浣跨敤宸茬敓鎴愮殑娴佺▼鍗D锛堜笌glassInfolList涓殑閫昏緫淇濇寔涓�鑷达級
-                flowCardId = glassIdFlowCardIdMap.get(glassId);
-                if (flowCardId == null) {
-                    // 濡傛灉鏈敓鎴愶紝鍒欐寜瑙勫垯鐢熸垚锛堢悊璁轰笂涓嶅簲璇ヨ蛋鍒拌繖閲岋紝鍥犱负glassInfolList宸茬粡鐢熸垚杩囷級
-                    int sequence;
-                    try {
-                        sequence = Integer.parseInt(glassId.trim());
-                        if (sequence <= 0) {
-                            sequence = 1;
-                        }
-                    } catch (NumberFormatException e) {
-                        log.warn("鐜荤拑ID鏃犳硶瑙f瀽涓烘暣鏁帮紝浣跨敤榛樿鍊�1: glassId={}", glassId);
-                        sequence = 1;
-                    }
-                    flowCardId = "NG" + dateStr + String.format("%02d", sequence) + "A001";
-                    glassIdFlowCardIdMap.put(glassId, flowCardId);
-                    log.warn("娴佺▼鍗D鏈湪glassInfolList涓敓鎴愶紝姝ゅ琛ュ厖鐢熸垚: flowCardId={}, glassId={}", flowCardId, glassId);
-                }
+            // 娴佺▼鍗D锛氬鏋淓xcel涓湁锛屼娇鐢‥xcel鐨勶紱濡傛灉涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D锛堜笌glassInfolList閫昏緫涓�鑷达級
+            String flowCardIdFromExcel = str(row.get("flowCardId"));
+            String flowCardId;
+            if (flowCardIdFromExcel != null && !flowCardIdFromExcel.trim().isEmpty()) {
+                // Excel涓湁娴佺▼鍗D锛屼娇鐢‥xcel鐨�
+                flowCardId = flowCardIdFromExcel.trim();
+            } else {
+                // Excel涓祦绋嬪崱ID涓虹┖锛屼娇鐢ㄥ叡浜殑娴佺▼鍗D
+                flowCardId = sharedFlowCardId != null ? sharedFlowCardId : getOrGenerateFlowCardId(glassId, dateStr, glassIdFlowCardIdMap);
             }
             // 鍘绘帀灏鹃儴 "/鏁板瓧"锛堝鏋滄湁锛�
             flowCardId = flowCardId.replaceFirst("/\\d+$", "");
@@ -592,6 +593,40 @@
             return def;
         }
     }
+    
+    /**
+     * 鑾峰彇鎴栫敓鎴愭祦绋嬪崱ID
+     * 濡傛灉宸插瓨鍦ㄥ垯杩斿洖锛屽惁鍒欑敓鎴愭柊鐨勬祦绋嬪崱ID骞剁紦瀛�
+     * 鍓嶇鏍煎紡锛氬師濮媑lassId + 涓や綅搴忓彿锛堝"101"銆�"102"銆�"201"锛夛紝閫氳繃闄や互100鍘绘帀鏈�鍚庝袱浣嶆彁鍙栧師濮媑lassId
+     * 
+     * @param glassId 鐜荤拑ID锛堝"101"銆�"102"銆�"201"锛�
+     * @param dateStr 鏃ユ湡瀛楃涓诧紙yyMMdd鏍煎紡锛�
+     * @param glassIdFlowCardIdMap 鐜荤拑ID鍒版祦绋嬪崱ID鐨勬槧灏勭紦瀛�
+     * @return 娴佺▼鍗D锛堟牸寮忥細NG + yyMMdd + 搴忓彿锛堜袱浣嶏級 + A001锛�
+     */
+    private String getOrGenerateFlowCardId(String glassId, String dateStr, Map<String, String> glassIdFlowCardIdMap) {
+        String flowCardId = glassIdFlowCardIdMap.get(glassId);
+        if (flowCardId == null) {
+            // 浠巊lassId涓彁鍙栧師濮嬫暟瀛楋細101 -> 1, 102 -> 1, 201 -> 2
+            int sequence = 1;
+            if (glassId != null && !glassId.trim().isEmpty()) {
+                try {
+                    String cleaned = glassId.trim().split("[\\r\\n\\t\\s]+")[0];
+                    if (cleaned.matches("\\d+")) {
+                        int num = Integer.parseInt(cleaned);
+                        // 濡傛灉闀垮害>=3锛岄櫎浠�100鍘绘帀鏈�鍚庝袱浣嶏紙鍓嶇杩藉姞鐨勫簭鍙凤級
+                        sequence = (cleaned.length() >= 3 && num >= 100) ? num / 100 : (num > 0 ? num : 1);
+                    }
+                } catch (Exception e) {
+                    log.error("浠巊lassId涓彁鍙栧師濮嬫暟瀛楀け璐�: glassId={}", glassId, e);
+                }
+            }
+            flowCardId = "NG" + dateStr + String.format("%02d", sequence) + "A001";
+            glassIdFlowCardIdMap.put(glassId, flowCardId);
+            log.info("涓虹幓鐠僆D {} 鐢熸垚娴佺▼鍗D: flowCardId={}", glassId, flowCardId);
+        }
+        return flowCardId;
+    }
 
     /**
      * 淇濈暀涓や綅灏忔暟锛堝洓鑸嶄簲鍏ワ級
@@ -622,6 +657,13 @@
             return;
         }
 
+        // 濡傛灉宸ョ▼鍙峰凡瀛樺湪锛屽厛鍒犻櫎璇ュ伐绋嬪彿涓嬬殑鏃ф暟鎹紝瀹炵幇瑕嗙洊鏇存柊
+        List<GlassInfo> existingGlassInfos = getGlassInfosByEngineeringId(engineeringId.trim());
+        if (!existingGlassInfos.isEmpty()) {
+            log.info("妫�娴嬪埌宸ョ▼鍙� {} 宸插瓨鍦� {} 鏉¤褰曪紝灏嗗垹闄ゆ棫鏁版嵁骞舵洿鏂�", engineeringId, existingGlassInfos.size());
+            deleteGlassInfosByEngineeringId(engineeringId.trim());
+        }
+
         List<GlassInfo> glassInfos = new ArrayList<>();
         Date now = new Date();
 
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/coordination/VehicleCoordinationService.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/coordination/VehicleCoordinationService.java
index 118e7f3..80f25f5 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/coordination/VehicleCoordinationService.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/coordination/VehicleCoordinationService.java
@@ -93,7 +93,7 @@
         
         if (deviceConfig != null) {
             log.info("閫夋嫨鍙敤杞﹁締: deviceId={}, deviceName={}", 
-                deviceConfig.getDeviceId(), deviceConfig.getDeviceName());
+                String.valueOf(deviceConfig.getId()), deviceConfig.getDeviceName());
         }
         
         return deviceConfig;
@@ -172,7 +172,7 @@
      */
     public List<DeviceConfig> getAvailableVehiclesInGroup(Long groupId) {
         return getVehiclesInGroup(groupId).stream()
-            .filter(v -> statusManager.isVehicleAvailable(v.getDeviceId()))
+            .filter(v -> statusManager.isVehicleAvailable(String.valueOf(v.getId())))
             .collect(Collectors.toList());
     }
     
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/flow/LoadVehicleInteraction.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/flow/LoadVehicleInteraction.java
index a644e2d..24d2e4e 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/flow/LoadVehicleInteraction.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/flow/LoadVehicleInteraction.java
@@ -55,7 +55,7 @@
             }
 
             DeviceConfig currentDevice = context.getCurrentDevice();
-            String deviceId = currentDevice.getDeviceId();
+            String deviceId = String.valueOf(currentDevice.getId());
 
             // 1. 妫�鏌ヨ溅杈嗙姸鎬侊紙濡傛灉璁惧宸叉寚瀹氾級
             if (deviceId != null) {
@@ -98,7 +98,7 @@
             }
 
             // 4. 鏍囪杞﹁締涓烘墽琛屼腑
-            String selectedDeviceId = selectedDevice.getDeviceId();
+            String selectedDeviceId = String.valueOf(selectedDevice.getId());
             statusManager.updateVehicleStatus(
                 selectedDeviceId, 
                 selectedDevice.getDeviceName(), 
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 457da90..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
@@ -138,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);
 
@@ -289,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);
         
@@ -365,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()
@@ -437,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);
@@ -522,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);
         }
@@ -637,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);
         }
@@ -662,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());
         }
     }
 
@@ -870,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);
@@ -941,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<>();
@@ -1229,7 +1229,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 鍋滄鏃х殑鐩戞帶浠诲姟
         handleStopIdleMonitor(deviceConfig);
@@ -1287,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);
@@ -1308,7 +1308,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         PlcClient plcClient = getPlcClient(deviceConfig);
         if (plcClient == null) {
             return DevicePlcVO.OperationResult.builder()
@@ -1701,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();
         }
@@ -1792,7 +1792,7 @@
             Map<String, Object> params,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 鍋滄鏃х殑鐩戞帶浠诲姟
         handleStopTaskMonitor(deviceConfig);
@@ -1833,7 +1833,7 @@
                                       MesTaskInfo taskInfo,
                                       Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         PlcClient plcClient = getPlcClient(deviceConfig);
         if (plcClient == null) {
             return;
@@ -1887,7 +1887,7 @@
                 if (taskInfo.brokenGlassIndices != null && taskInfo.brokenGlassIndices.contains(i)) {
                     updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 8, taskInfo);
                     log.info("鐜荤拑鏍囪涓虹牬鎹�: deviceId={}, stateField={}, glassIndex={}", 
-                            deviceConfig.getDeviceId(), stateField, i);
+                            String.valueOf(deviceConfig.getId()), stateField, i);
                     continue;
                 }
                 
@@ -1895,7 +1895,7 @@
                 if (elapsed >= state3TimeoutTime && (currentState == null || currentState < 2)) {
                     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;
                 }
                 
@@ -1972,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;
         }
         
@@ -1984,12 +1984,12 @@
                 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;
             }
         }
@@ -2067,11 +2067,11 @@
                     .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);
         }
     }
 
@@ -2082,7 +2082,7 @@
     public DevicePlcVO.OperationResult checkMesConfirm(DeviceConfig deviceConfig,
                                                        Map<String, Object> params,
                                                        Map<String, Object> logicParams) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         PlcClient plcClient = getPlcClient(deviceConfig);
         if (plcClient == null) {
             return DevicePlcVO.OperationResult.builder()
@@ -2167,9 +2167,9 @@
                 } 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()
@@ -2196,11 +2196,11 @@
 
                 // 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵��
                 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);
@@ -2210,7 +2210,7 @@
                 payload.put("plcRequest", 1);
                 plcClient.writeData(payload);
 
-                log.info("MES浠诲姟宸茬‘璁ゅ畬鎴�: deviceId={}", deviceConfig.getDeviceId());
+                log.info("MES浠诲姟宸茬‘璁ゅ畬鎴�: deviceId={}", String.valueOf(deviceConfig.getId()));
                 String taskType = (taskInfo != null && taskInfo.isOutbound) ? "鍑虹墖" : "杩涚墖";
                 return DevicePlcVO.OperationResult.builder()
                         .success(true)
@@ -2234,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())
@@ -2250,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()
@@ -2342,7 +2342,7 @@
             payload.put("plcReport", 0);
             plcClient.writeData(payload);
         } catch (Exception e) {
-            log.error("娓呯┖浠诲姟鐘舵�佸紓甯�: deviceId={}", deviceConfig.getDeviceId(), e);
+            log.error("娓呯┖浠诲姟鐘舵�佸紓甯�: deviceId={}", String.valueOf(deviceConfig.getId()), e);
         }
     }
 
@@ -2350,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);
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/transfer/handler/HorizontalTransferLogicHandler.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/transfer/handler/HorizontalTransferLogicHandler.java
index 9db7993..909861f 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/transfer/handler/HorizontalTransferLogicHandler.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/workstation/transfer/handler/HorizontalTransferLogicHandler.java
@@ -114,7 +114,7 @@
             Map<String, Object> logicParams,
             Map<String, Object> params) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         PlcClient plcClient = getPlcClient(deviceConfig);
         if (plcClient == null) {
             return buildResult(deviceConfig, "checkAndProcess", false, 
@@ -482,7 +482,7 @@
             WorkstationLogicConfig config,
             Map<String, Object> logicParams) {
         
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         
         // 鍋滄鏃х殑鐩戞帶浠诲姟
         handleStopMonitor(deviceConfig);
@@ -513,7 +513,7 @@
      * 鍋滄鐩戞帶浠诲姟
      */
     private DevicePlcVO.OperationResult handleStopMonitor(DeviceConfig deviceConfig) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         ScheduledFuture<?> future = monitorTasks.remove(deviceId);
         if (future != null && !future.isCancelled()) {
             future.cancel(false);
@@ -526,7 +526,7 @@
      * 娓呯┖缂撳啿闃熷垪
      */
     private DevicePlcVO.OperationResult handleClearBuffer(DeviceConfig deviceConfig) {
-        String deviceId = deviceConfig.getDeviceId();
+        String deviceId = String.valueOf(deviceConfig.getId());
         glassBuffer.remove(deviceId);
         lastScanTime.remove(deviceId);
         log.info("宸叉竻绌虹紦鍐查槦鍒�: deviceId={}", deviceId);
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/s7/provider/S7SerializerProvider.java b/mes-processes/mes-plcSend/src/main/java/com/mes/s7/provider/S7SerializerProvider.java
index 9eead5a..e7372e1 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/s7/provider/S7SerializerProvider.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/s7/provider/S7SerializerProvider.java
@@ -45,12 +45,15 @@
     }
 
     private String buildCacheKey(DeviceConfig deviceConfig) {
+        // 浼樺厛浣跨敤鏁版嵁搴撲富閿甀D
         if (deviceConfig.getId() != null) {
             return "device:" + deviceConfig.getId();
         }
+        // 澶囩敤鏂规锛氫娇鐢ㄨ澶囩紪鐮�
         if (deviceConfig.getDeviceCode() != null) {
             return "device:" + deviceConfig.getDeviceCode();
         }
+        // 鏈�鍚庢柟妗堬細浣跨敤瀵硅薄鍝堝笇
         return "device:" + Objects.hash(deviceConfig);
     }
 
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java b/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
index 82582c4..51d053e 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/service/PlcTestWriteService.java
@@ -70,11 +70,16 @@
                 // 浣跨敤鏂扮殑PLC瀹㈡埛绔鍙栨暟鎹�
                 Map<String, Object> currentData = plcClient.readAllData();
                 if (currentData != null && !currentData.isEmpty()) {
-                    // 妫�鏌ヨ仈鏈虹姸鎬�
-                    Integer onlineState = parseInteger(currentData.get("onlineState"));
-                    if (onlineState != null && onlineState == OFF) {
-                        log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", deviceId);
-                        return false;
+                    // 妫�鏌ヨ仈鏈虹姸鎬侊紙浠呭綋閰嶇疆涓瓨鍦ㄨ瀛楁鏃讹級
+                    if (hasFieldInConfig(device, "onlineState")) {
+                        Object onlineStateObj = currentData.get("onlineState");
+                        if (onlineStateObj != null) {
+                            Integer onlineState = parseInteger(onlineStateObj);
+                            if (onlineState == OFF) {
+                                log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", deviceId);
+                                return false;
+                            }
+                        }
                     }
 
                     // 妫�鏌ユ眹鎶ュ瓧锛屽鏋滀负1鍒欓噸缃负0
@@ -126,27 +131,29 @@
                 return false;
             }
 
-            // 妫�鏌ヨ仈鏈虹姸鎬�
-            Object onlineStateObj = currentData.get("onlineState");
-            Integer onlineState = null;
-            if (onlineStateObj != null) {
-                if (onlineStateObj instanceof Number) {
-                    onlineState = ((Number) onlineStateObj).intValue();
-                } else {
-                    try {
-                        String strValue = String.valueOf(onlineStateObj);
-                        if (!strValue.isEmpty() && !"null".equalsIgnoreCase(strValue)) {
-                            onlineState = Integer.parseInt(strValue);
+            // 妫�鏌ヨ仈鏈虹姸鎬侊紙浠呭綋閰嶇疆涓瓨鍦ㄨ瀛楁鏃讹級
+            if (hasFieldInConfig(device, "onlineState")) {
+                Object onlineStateObj = currentData.get("onlineState");
+                Integer onlineState = null;
+                if (onlineStateObj != null) {
+                    if (onlineStateObj instanceof Number) {
+                        onlineState = ((Number) onlineStateObj).intValue();
+                    } else {
+                        try {
+                            String strValue = String.valueOf(onlineStateObj);
+                            if (!strValue.isEmpty() && !"null".equalsIgnoreCase(strValue)) {
+                                onlineState = Integer.parseInt(strValue);
+                            }
+                        } catch (NumberFormatException e) {
+                            log.warn("瑙f瀽onlineState澶辫触: deviceId={}, value={}", device.getId(), onlineStateObj, e);
                         }
-                    } catch (NumberFormatException e) {
-                        log.warn("瑙f瀽onlineState澶辫触: deviceId={}, value={}", device.getId(), onlineStateObj, e);
                     }
                 }
-            }
 
-            if (onlineState != null && onlineState == OFF) {
-                log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", device.getId());
-                return false;
+                if (onlineState != null && onlineState == OFF) {
+                    log.info("褰撳墠PLC鑱旀満妯″紡涓�0锛屽仠姝㈣仈鏈�: deviceId={}", device.getId());
+                    return false;
+                }
             }
 
             // 妫�鏌ユ眹鎶ュ瓧锛屽鏋滀负1鍒欓噸缃负0
@@ -281,14 +288,32 @@
             // 灏濊瘯浣跨敤鏂扮殑PLC瀹㈡埛绔伐鍘�
             PlcClient plcClient = plcClientFactory.getClient(device);
             if (plcClient != null) {
-                // 鏋勫缓閲嶇疆鏁版嵁
+                // 鏋勫缓閲嶇疆鏁版嵁锛堝彧娣诲姞閰嶇疆涓瓨鍦ㄧ殑瀛楁锛�
                 Map<String, Object> resetData = new HashMap<>();
-                resetData.put("plcRequest", OFF);
-                resetData.put("plcReport", OFF);
-                resetData.put("mesSend", OFF);
-                resetData.put("mesConfirm", OFF);
-                resetData.put("onlineState", ON);
-                resetData.put("alarmInfo", OFF);
+                if (hasFieldInConfig(device, "plcRequest")) {
+                    resetData.put("plcRequest", OFF);
+                }
+                if (hasFieldInConfig(device, "plcReport")) {
+                    resetData.put("plcReport", OFF);
+                }
+                if (hasFieldInConfig(device, "mesSend")) {
+                    resetData.put("mesSend", OFF);
+                }
+                if (hasFieldInConfig(device, "mesConfirm")) {
+                    resetData.put("mesConfirm", OFF);
+                }
+                if (hasFieldInConfig(device, "onlineState")) {
+                    resetData.put("onlineState", ON);
+                }
+                if (hasFieldInConfig(device, "alarmInfo")) {
+                    resetData.put("alarmInfo", OFF);
+                }
+
+                // 妫�鏌ユ槸鍚︽湁瀛楁闇�瑕侀噸缃�
+                if (resetData.isEmpty()) {
+                    log.warn("璁惧閰嶇疆涓湭鎵惧埌浠讳綍鍙噸缃殑瀛楁: deviceId={}", deviceId);
+                    return false;
+                }
 
                 // 浣跨敤鏂扮殑PLC瀹㈡埛绔啓鍏ユ暟鎹�
                 boolean success = plcClient.writeData(resetData);
@@ -321,14 +346,32 @@
                 return false;
             }
 
-            // 鏋勫缓閲嶇疆鏁版嵁
+            // 鏋勫缓閲嶇疆鏁版嵁锛堝彧娣诲姞閰嶇疆涓瓨鍦ㄧ殑瀛楁锛�
             Map<String, Object> resetData = new HashMap<>();
-            resetData.put("plcRequest", OFF);
-            resetData.put("plcReport", OFF);
-            resetData.put("mesSend", OFF);
-            resetData.put("mesConfirm", OFF);
-            resetData.put("onlineState", ON);
-            resetData.put("alarmInfo", OFF);
+            if (hasFieldInConfig(device, "plcRequest")) {
+                resetData.put("plcRequest", OFF);
+            }
+            if (hasFieldInConfig(device, "plcReport")) {
+                resetData.put("plcReport", OFF);
+            }
+            if (hasFieldInConfig(device, "mesSend")) {
+                resetData.put("mesSend", OFF);
+            }
+            if (hasFieldInConfig(device, "mesConfirm")) {
+                resetData.put("mesConfirm", OFF);
+            }
+            if (hasFieldInConfig(device, "onlineState")) {
+                resetData.put("onlineState", ON);
+            }
+            if (hasFieldInConfig(device, "alarmInfo")) {
+                resetData.put("alarmInfo", OFF);
+            }
+
+            // 妫�鏌ユ槸鍚︽湁瀛楁闇�瑕侀噸缃�
+            if (resetData.isEmpty()) {
+                log.warn("璁惧閰嶇疆涓湭鎵惧埌浠讳綍鍙噸缃殑瀛楁: deviceId={}", device.getId());
+                return false;
+            }
 
             // 浣跨敤PlcDynamicDataService鍐欏叆鏁版嵁
             plcDynamicDataService.writePlcData(device, resetData, s7Serializer);
@@ -572,4 +615,44 @@
         
         throw new IllegalStateException("鏃犳硶瑙f瀽璁惧鐨凱LC椤圭洰鏍囪瘑, deviceId=" + device.getId());
     }
+    
+    /**
+     * 妫�鏌ヨ澶囬厤缃腑鏄惁瀛樺湪鎸囧畾瀛楁
+     * 
+     * @param device 璁惧閰嶇疆
+     * @param fieldName 瀛楁鍚�
+     * @return 鏄惁瀛樺湪
+     */
+    private boolean hasFieldInConfig(DeviceConfig device, String fieldName) {
+        if (device == null || fieldName == null || fieldName.isEmpty()) {
+            return false;
+        }
+        
+        try {
+            // 浠� configJson 涓鏌ワ紙鏂扮粨鏋勶級
+            Map<String, Object> configParams = ConfigJsonHelper.parseToMap(device.getConfigJson(), objectMapper);
+            if (configParams.containsKey(fieldName)) {
+                return true;
+            }
+            
+            // 浠� extraParams.addressMapping 涓鏌ワ紙鍏煎鏃х粨鏋勶級
+            Map<String, Object> extraParams = parseExtraParams(device);
+            Object addressMapping = extraParams.get("addressMapping");
+            if (addressMapping != null) {
+                Map<String, Object> addressMappingMap;
+                if (addressMapping instanceof Map) {
+                    addressMappingMap = (Map<String, Object>) addressMapping;
+                } else if (addressMapping instanceof String) {
+                    addressMappingMap = objectMapper.readValue((String) addressMapping, MAP_TYPE);
+                } else {
+                    return false;
+                }
+                return addressMappingMap.containsKey(fieldName);
+            }
+        } catch (Exception e) {
+            log.warn("妫�鏌ュ瓧娈垫槸鍚﹀瓨鍦ㄦ椂鍑洪敊: deviceId={}, fieldName={}", device.getId(), fieldName, e);
+        }
+        
+        return false;
+    }
 }
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
index 8831206..55c9cb0 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/service/impl/PlcDynamicDataServiceImpl.java
@@ -213,8 +213,9 @@
         try {
             String addressMapping = extractAddressMapping(device);
             if (addressMapping == null || addressMapping.isEmpty()) {
-                log.error("璁惧閰嶇疆涓璦ddressMapping涓虹┖: deviceId={}", device.getId());
-                return;
+                String errorMsg = "璁惧閰嶇疆涓璦ddressMapping涓虹┖: deviceId=" + device.getId();
+                log.error(errorMsg);
+                throw new IllegalArgumentException(errorMsg);
             }
             
             // 瑙f瀽addressMapping JSON閰嶇疆
@@ -224,11 +225,18 @@
             String dbArea = extractDbArea(device);
             List<S7Parameter> parameters = buildS7ParametersWithValuesForDevice(device, dbArea, addressMappingObj, dataMap);
             
+            if (parameters.isEmpty()) {
+                log.warn("娌℃湁鏈夋晥鐨勫瓧娈甸渶瑕佸啓鍏LC: deviceId={}", device.getId());
+                return;
+            }
+            
             // 鍐欏叆PLC
             s7Serializer.write(parameters);
         } catch (Exception e) {
-            log.error("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[{}] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宒eviceId: {}, 璇︾粏閿欒: {}", 
-                device.getPlcIp(), device.getId(), e.getMessage(), e);
+            String errorMsg = String.format("鍐欏叆PLC鏁版嵁澶辫触锛岃妫�鏌ワ細1.PLC IP鍦板潃鏄惁姝g‘[%s] 2.PLC璁惧鏄惁鍦ㄧ嚎 3.缃戠粶杩炴帴鏄惁姝e父锛宒eviceId: %s, 璇︾粏閿欒: %s", 
+                device.getPlcIp(), device.getId(), e.getMessage());
+            log.error(errorMsg, e);
+            throw new RuntimeException(errorMsg, e);
         }
     }
     
@@ -463,9 +471,12 @@
             EDataType dataType = fieldConfig.dataType != null ? fieldConfig.dataType : determineFieldTypeByName(fieldName);
             int count = fieldConfig.count > 0 ? fieldConfig.count : determineFieldCountByName(fieldName);
             
+            // 鏍规嵁瀛楁绫诲瀷杞崲鍊�
+            Object convertedValue = convertValueByType(value, dataType);
+            
             // 鍒涘缓S7Parameter锛岃缃��
             S7Parameter parameter = new S7Parameter(fullAddress, dataType, count);
-            parameter.setValue(value);
+            parameter.setValue(convertedValue);
             parameters.add(parameter);
         }
         
@@ -579,6 +590,65 @@
     }
     
     /**
+     * 鏍规嵁瀛楁绫诲瀷杞崲鍊�
+     * 涓昏澶勭悊锛欼nteger -> Boolean (瀵逛簬BOOL绫诲瀷)
+     * 
+     * @param value 鍘熷鍊�
+     * @param dataType 鐩爣鏁版嵁绫诲瀷
+     * @return 杞崲鍚庣殑鍊�
+     */
+    private Object convertValueByType(Object value, EDataType dataType) {
+        if (value == null) {
+            return null;
+        }
+        
+        // 濡傛灉宸茬粡鏄洰鏍囩被鍨嬶紝鐩存帴杩斿洖
+        if (dataType == EDataType.BOOL) {
+            if (value instanceof Boolean) {
+                return value;
+            }
+            // 灏� Integer/Number 杞崲涓� Boolean
+            if (value instanceof Number) {
+                int intValue = ((Number) value).intValue();
+                return intValue != 0;
+            }
+            // 灏濊瘯浠庡瓧绗︿覆杞崲
+            if (value instanceof String) {
+                String str = ((String) value).trim().toLowerCase();
+                return "true".equals(str) || "1".equals(str) || "on".equals(str);
+            }
+            // 鍏朵粬绫诲瀷锛屽皾璇曡浆鎹负鏁板瓧鍐嶈浆Boolean
+            try {
+                int intValue = Integer.parseInt(String.valueOf(value));
+                return intValue != 0;
+            } catch (NumberFormatException e) {
+                log.warn("鏃犳硶灏嗗�艰浆鎹负Boolean: {}", value);
+                return false;
+            }
+        }
+        
+        // 瀵逛簬鍏朵粬绫诲瀷锛屽鏋滃凡缁忔槸鐩爣绫诲瀷鎴栧吋瀹圭被鍨嬶紝鐩存帴杩斿洖
+        // 渚嬪锛歎INT16 鍙互鎺ュ彈 Integer, Short, Byte 绛�
+        if (dataType == EDataType.UINT16 || dataType == EDataType.INT16) {
+            if (value instanceof Number) {
+                return value;
+            }
+            // 灏濊瘯浠庡瓧绗︿覆杞崲
+            if (value instanceof String) {
+                try {
+                    return Integer.parseInt((String) value);
+                } catch (NumberFormatException e) {
+                    log.warn("鏃犳硶灏嗗�艰浆鎹负Integer: {}", value);
+                    return 0;
+                }
+            }
+        }
+        
+        // 瀵逛簬鍏朵粬绫诲瀷锛岀洿鎺ヨ繑鍥炲師鍊�
+        return value;
+    }
+    
+    /**
      * 鏍规嵁瀛楁鍚嶆帹鏂瓧娈甸暱搴�/鏁伴噺
      */
     private int determineFieldCountByName(String fieldName) {
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 db6fc48..0738a90 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
@@ -2833,7 +2833,7 @@
             List<TaskStepDetail> largeGlassSteps = taskStepDetailMapper.selectList(
                     Wrappers.<TaskStepDetail>lambdaQuery()
                             .eq(TaskStepDetail::getTaskId, task.getTaskId())
-                            .eq(TaskStepDetail::getDeviceId, largeGlassDevice.getId())
+                            .eq(TaskStepDetail::getDeviceId, String.valueOf(largeGlassDevice.getId()))
                             .orderByDesc(TaskStepDetail::getStepOrder)
                             .last("LIMIT 1")
             );
@@ -2904,7 +2904,7 @@
             List<TaskStepDetail> transferSteps = taskStepDetailMapper.selectList(
                 Wrappers.<TaskStepDetail>lambdaQuery()
                     .eq(TaskStepDetail::getTaskId, taskId)
-                    .eq(TaskStepDetail::getDeviceId, transferDevice.getId())
+                    .eq(TaskStepDetail::getDeviceId, String.valueOf(transferDevice.getId()))
                     .orderByDesc(TaskStepDetail::getStepOrder)
                     .last("LIMIT 1")
             );
diff --git a/mes-web/src/api/device/deviceManagement.js b/mes-web/src/api/device/deviceManagement.js
index 4d87dfb..ca8a2f9 100644
--- a/mes-web/src/api/device/deviceManagement.js
+++ b/mes-web/src/api/device/deviceManagement.js
@@ -25,7 +25,7 @@
       url: `/api/plcSend/device/config/devices/update`,
       method: 'post',
       data: {
-        deviceId: id,
+        id: id,
         deviceConfig: data
       }
     })
@@ -38,7 +38,7 @@
     return request({
       url: `/api/plcSend/device/config/devices/delete`,
       method: 'post',
-      data: { deviceId: id }
+      data: { id: id }
     })
   },
 
@@ -49,7 +49,7 @@
     return request({
       url: `/api/plcSend/device/config/devices/detail`,
       method: 'post',
-      data: { deviceId: id }
+      data: { id: id }
     })
   },
 
@@ -78,7 +78,7 @@
     return request({
       url: '/api/plcSend/device/config/devices/enable',
       method: 'post',
-      data: { deviceId: id }
+      data: { id: id }
     })
   },
 
@@ -89,7 +89,7 @@
     return request({
       url: '/api/plcSend/device/config/devices/disable',
       method: 'post',
-      data: { deviceId: id }
+      data: { id: id }
     })
   },
 
@@ -135,7 +135,7 @@
       method: 'post',
       data: {
         deviceCode,
-        excludeId
+        id: excludeId
       }
     })
   },
@@ -162,7 +162,7 @@
 
   /**
    * 娴嬭瘯璁惧PLC杩炴帴
-   * data 鍙互鏄� { deviceId } 鎴� { plcIp, plcPort, timeout }
+   * data 鍙互鏄� { id } 鎴� { plcIp, plcPort, timeout }
    */
   testConnection(data) {
     return request({
@@ -190,7 +190,7 @@
     return request({
       url: `/api/plcSend/device/config/devices/health-check`,
       method: 'post',
-      data: { deviceId: id }
+      data: { id: id }
     })
   }
 }
@@ -535,7 +535,7 @@
 export const deviceInteractionApi = {
   /**
    * 鎵ц璁惧閫昏緫鎿嶄綔
-   * @param {Object} data - { deviceId, operation, params }
+   * @param {Object} data - { id, operation, params }
    */
   executeOperation(data) {
     return request({
@@ -561,7 +561,7 @@
 export const deviceStatusApi = {
   /**
    * 鏇存柊璁惧鍦ㄧ嚎鐘舵��
-   * @param {Object} data - { deviceId, status }
+   * @param {Object} data - { id, status }
    */
   updateDeviceOnlineStatus(data) {
     return request({
diff --git a/mes-web/src/views/device/DeviceConfigForm.vue b/mes-web/src/views/device/DeviceConfigForm.vue
index f751fbc..f927ec3 100644
--- a/mes-web/src/views/device/DeviceConfigForm.vue
+++ b/mes-web/src/views/device/DeviceConfigForm.vue
@@ -432,7 +432,7 @@
       showConfirmButton: false
     })
     
-    const response = await deviceConfigApi.testConnection({ deviceId: row.id })
+    const response = await deviceConfigApi.testConnection({ id: row.id })
     
     if (response.success) {
       ElMessage.success(response.data || `璁惧 ${row.deviceName} 杩炴帴娴嬭瘯鎴愬姛`)
diff --git a/mes-web/src/views/device/DeviceConfigList.vue b/mes-web/src/views/device/DeviceConfigList.vue
index 72a5e45..4503408 100644
--- a/mes-web/src/views/device/DeviceConfigList.vue
+++ b/mes-web/src/views/device/DeviceConfigList.vue
@@ -79,7 +79,7 @@
         </el-table-column>
         <el-table-column prop="plcIp" label="PLC IP" width="130" />
         <el-table-column prop="plcType" label="PLC绫诲瀷" width="100" />
-        <el-table-column prop="moduleName" label="妯″潡鍚嶇О" min-width="120" />
+        <el-table-column prop="moduleName" label="妯″潡鍚嶇О" min-width="60" />
         <el-table-column prop="isPrimary" label="涓绘帶璁惧" width="100" align="center">
           <template #default="scope">
             <el-tag v-if="scope.row.isPrimary" type="success" size="small">涓绘帶</el-tag>
@@ -107,12 +107,12 @@
             {{ formatDateTime(scope.row.lastHeartbeat) }}
           </template>
         </el-table-column>
-        <el-table-column label="鎿嶄綔" width="200" fixed="right">
+        <el-table-column label="鎿嶄綔" width="300" fixed="right">
           <template #default="scope">
             <el-button type="primary" size="small" @click="editDevice(scope.row)">
               缂栬緫
             </el-button>
-            <el-button type="warning" size="small" :loading="plcOperationLoading" @click="handleSinglePlcRequest(scope.row)">
+            <el-button type="warning" size="small" :loading="plcOperationLoading" @click.stop="handleSinglePlcRequest(scope.row, $event)">
               PLC璇锋眰
             </el-button>
             <el-button type="success" size="small" @click="healthCheck(scope.row)">
@@ -322,9 +322,24 @@
   }
 }
 
-const handleSinglePlcRequest = (row) => executePlcOperation([row.id || row.deviceId], 'request')
-const handleSinglePlcReport = (row) => executePlcOperation([row.id || row.deviceId], 'report')
-const handleSinglePlcReset = (row) => executePlcOperation([row.id || row.deviceId], 'reset')
+const handleSinglePlcRequest = (row, event) => {
+  if (event) {
+    event.stopPropagation()
+  }
+  executePlcOperation([row.id || row.deviceId], 'request')
+}
+const handleSinglePlcReport = (row, event) => {
+  if (event) {
+    event.stopPropagation()
+  }
+  executePlcOperation([row.id || row.deviceId], 'report')
+}
+const handleSinglePlcReset = (row, event) => {
+  if (event) {
+    event.stopPropagation()
+  }
+  executePlcOperation([row.id || row.deviceId], 'reset')
+}
 
 const batchPlcRequest = () => executePlcOperation(getSelectedDeviceIds(), 'request')
 const batchPlcReport = () => executePlcOperation(getSelectedDeviceIds(), 'report')
diff --git a/mes-web/src/views/device/DeviceGroupList.vue b/mes-web/src/views/device/DeviceGroupList.vue
index d629cfd..27365c7 100644
--- a/mes-web/src/views/device/DeviceGroupList.vue
+++ b/mes-web/src/views/device/DeviceGroupList.vue
@@ -208,7 +208,7 @@
               </el-tag>
             </template>
           </el-table-column>
-          <el-table-column label="鎿嶄綔" width="200" fixed="right">
+          <el-table-column label="鎿嶄綔" width="280" fixed="right">
             <template #default="scope">
               <el-button
                 v-if="scope.row.isOnline"
@@ -227,6 +227,13 @@
                 :loading="scope.row.statusUpdating"
               >
                 璁句负鍦ㄧ嚎
+              </el-button>
+              <el-button
+                type="danger"
+                size="small"
+                @click="removeSingleDevice(scope.row)"
+              >
+                绉婚櫎璁惧
               </el-button>
             </template>
           </el-table-column>
@@ -761,6 +768,37 @@
   }
 }
 
+// 绉婚櫎鍗曚釜璁惧
+const removeSingleDevice = async (device) => {
+  try {
+    await ElMessageBox.confirm(
+      `纭畾瑕佷粠璁惧缁勪腑绉婚櫎璁惧"${device.deviceName || device.deviceCode}"鍚楋紵`,
+      '绉婚櫎璁惧纭',
+      {
+        confirmButtonText: '纭畾绉婚櫎',
+        cancelButtonText: '鍙栨秷',
+        type: 'warning'
+      }
+    )
+    
+    const deviceId = device.id || device.deviceId
+    await deviceGroupApi.batchRemoveDevicesFromGroup({
+      groupId: currentGroup.value.id || currentGroup.value.groupId,
+      deviceIds: [deviceId]
+    })
+    ElMessage.success('璁惧绉婚櫎鎴愬姛')
+    const groupId = currentGroup.value.id || currentGroup.value.groupId
+    await loadGroupDevices(groupId)
+    await loadAvailableDevices()
+    emit('refresh-statistics')
+  } catch (error) {
+    if (error !== 'cancel') {
+      console.error('绉婚櫎璁惧澶辫触:', error)
+      ElMessage.error('绉婚櫎璁惧澶辫触: ' + (error.response?.data?.message || error.message))
+    }
+  }
+}
+
 // 鏇存柊璁惧鍦ㄧ嚎鐘舵��
 const updateDeviceOnlineStatus = async (device, status) => {
   try {
@@ -774,7 +812,7 @@
     }
 
     await deviceStatusApi.updateDeviceOnlineStatus({
-      deviceId: deviceId,
+      id: deviceId,
       status: status
     })
 
diff --git a/mes-web/src/views/plcTest/components/DeviceGroup/GroupTopology.vue b/mes-web/src/views/plcTest/components/DeviceGroup/GroupTopology.vue
index f4ce6a0..d231ce4 100644
--- a/mes-web/src/views/plcTest/components/DeviceGroup/GroupTopology.vue
+++ b/mes-web/src/views/plcTest/components/DeviceGroup/GroupTopology.vue
@@ -385,7 +385,7 @@
   try {
     togglingDeviceId.value = deviceId
     await deviceInteractionApi.executeOperation({
-      deviceId,
+      id: deviceId,
       operation: 'setOnlineState',
       params: {
         onlineState: value
@@ -415,7 +415,7 @@
   try {
     clearingDeviceId.value = deviceId
     await deviceInteractionApi.executeOperation({
-      deviceId,
+      id: deviceId,
       operation: 'clearPlc'
     })
     ElMessage.success(`宸叉竻绌� ${device.deviceName || device.deviceCode} 鐨凱LC鏁版嵁`)
diff --git a/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue b/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
index a06745f..aced2f8 100644
--- a/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
+++ b/mes-web/src/views/plcTest/components/MultiDeviceTest/TaskOrchestration.vue
@@ -398,7 +398,7 @@
   try {
     clearLoading.value = true
     const response = await deviceInteractionApi.executeOperation({
-      deviceId: loadDeviceId.value,
+      id: loadDeviceId.value,
       operation: 'clearPlc',
       params: {}
     })
@@ -566,6 +566,16 @@
       headerStr === '瀹㈡埛鍚嶇О') {
       headerMap.customerName = index
     }
+    // 灞傚彿
+    else if (headerStr.includes('灞傚彿') || headerStr.includes('layer') ||
+      headerStr === '灞�') {
+      headerMap.layer = index
+    }
+    // 宸ョ▼鍙�
+    else if (headerStr.includes('宸ョ▼鍙�') || headerStr.includes('engineeringid') ||
+      headerStr.includes('engineering') || headerStr === '宸ョ▼id') {
+      headerMap.engineeringId = index
+    }
   })
 
   // 濡傛灉娌℃湁鎵惧埌琛ㄥご锛屽皾璇曚娇鐢ㄧ涓�琛屼綔涓鸿〃澶达紙绱㈠紩鏂瑰紡锛�
@@ -594,6 +604,8 @@
     const flowCardId = row[headerMap.flowCardId] ? String(row[headerMap.flowCardId]).trim() : ''
     const productName = row[headerMap.productName] ? String(row[headerMap.productName]).trim() : ''
     const customerName = row[headerMap.customerName] ? String(row[headerMap.customerName]).trim() : ''
+    const layer = row[headerMap.layer] ? String(row[headerMap.layer]).trim() : ''
+    const engineeringId = row[headerMap.engineeringId] ? String(row[headerMap.engineeringId]).trim() : ''
 
     // 璺宠繃绌鸿
     if (!glassId && !width && !length && !thickness && !quantity) {
@@ -613,11 +625,13 @@
       return isNaN(num) ? '0' : String(num)
     }
 
-    // 澶勭悊鏁伴噺锛氬鏋滄暟閲忓ぇ浜�1锛岄渶瑕佺敓鎴愬鏉¤褰�
+    // 澶勭悊鏁伴噺锛氭牴鎹暟閲忕敓鎴愬鏉¤褰曪紝姣忔潯璁板綍閮借琛ラ綈搴忓彿
     const qty = parseInt(quantity) || 1
     for (let j = 0; j < qty; j++) {
-      // 濡傛灉鏁伴噺澶т簬1锛屼负姣忔潯璁板綍鐢熸垚鍞竴鐨勭幓鐠僆D锛堣拷鍔犲簭鍙凤級
-      const finalGlassId = qty > 1 ? `${glassId}${padTwoZero(j + 1)}` : glassId
+      // 涓烘瘡鏉¤褰曠敓鎴愬敮涓�鐨勭幓鐠僆D锛堣拷鍔犲簭鍙凤紝鍗充娇鏁伴噺涓�1涔熻琛ラ綈锛�
+      // 渚嬪锛歡lassId="1", quantity=2 -> "101", "102"
+      //       glassId="2", quantity=1 -> "201"
+      const finalGlassId = `${glassId}${padTwoZero(j + 1)}`
 
       result.push({
         glassId: finalGlassId,
@@ -626,9 +640,11 @@
         thickness: parseNumber(thickness),
         quantity: '1', // 姣忔潯璁板綍鏁伴噺涓�1
         filmsId: filmsId,
-        flowCardId: flowCardId || finalGlassId,
+        flowCardId: flowCardId || '', // 濡傛灉Excel涓病鏈夋祦绋嬪崱ID锛屼紶绌哄瓧绗︿覆璁╁悗绔敓鎴�
         productName: productName,
-        customerName: customerName
+        customerName: customerName,
+        layer: layer || '', // 灞傚彿锛屽鏋淓xcel涓病鏈夊垯涓虹┖
+        engineeringId: engineeringId || '' // 宸ョ▼鍙凤紝濡傛灉Excel涓病鏈夊垯涓虹┖
       })
     }
   }

--
Gitblit v1.8.0