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