From ab389a5a6b329b15a655340ba7b87bce7fd7871d Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期三, 24 十二月 2025 17:16:19 +0800
Subject: [PATCH] 添加新增设备自动生成编码
---
mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java | 297 +++++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 206 insertions(+), 91 deletions(-)
diff --git a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
index 7a04e23..457da90 100644
--- a/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
+++ b/mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java
@@ -15,9 +15,8 @@
import com.mes.interaction.vehicle.model.VehicleState;
import com.mes.interaction.vehicle.model.VehicleStatus;
import com.mes.interaction.vehicle.model.VehicleTask;
-import com.mes.s7.enhanced.EnhancedS7Serializer;
-import com.mes.s7.provider.S7SerializerProvider;
-import com.mes.service.PlcDynamicDataService;
+import com.mes.plc.client.PlcClient;
+import com.mes.plc.factory.PlcClientFactory;
import com.mes.task.model.TaskExecutionContext;
import com.mes.interaction.workstation.scanner.handler.HorizontalScannerLogicHandler;
import lombok.extern.slf4j.Slf4j;
@@ -28,6 +27,7 @@
import javax.annotation.PreDestroy;
import java.util.*;
import java.util.concurrent.*;
+import java.util.stream.Collectors;
/**
* 澶ц溅璁惧閫昏緫澶勭悊鍣�
@@ -56,10 +56,7 @@
private DeviceStatusService deviceStatusService;
@Autowired(required = false)
- private PlcDynamicDataService plcDynamicDataService;
-
- @Autowired(required = false)
- private S7SerializerProvider s7SerializerProvider;
+ private PlcClientFactory plcClientFactory;
// MES瀛楁鍒楄〃锛堣繘鐗囧拰鍑虹墖鍏辩敤鍚屼竴濂楀崗璁級
// 鏍规嵁鍗忚锛屼娇鐢ㄥ甫鏁板瓧鍚庣紑鐨勫瓧娈靛悕锛�1-6瀵瑰簲6涓幓鐠冧綅缃級
@@ -112,13 +109,21 @@
// 璁板綍褰撳墠浠诲姟锛歞eviceId -> 浠诲姟淇℃伅
private final Map<String, MesTaskInfo> currentTasks = new ConcurrentHashMap<>();
+ /**
+ * 璁板綍鏈�杩戜竴娆″凡瀹屾垚浣哅ES鏈浣嶇殑浠诲姟绛惧悕锛岄伩鍏嶉噸澶嶆媺璧�
+ */
+ private final Map<String, CompletedMesRecord> lastCompletedMesRecords = new ConcurrentHashMap<>();
@Autowired
public LoadVehicleLogicHandler(
DevicePlcOperationService devicePlcOperationService,
- @Qualifier("deviceGlassInfoService") GlassInfoService glassInfoService) {
+ @Qualifier("deviceGlassInfoService") GlassInfoService glassInfoService,
+ PlcClientFactory plcClientFactory) {
super(devicePlcOperationService);
this.glassInfoService = glassInfoService;
+ this.plcClientFactory = plcClientFactory;
+ // 璁剧疆 PlcClientFactory 鍒板熀绫�
+ this.setPlcClientFactory(plcClientFactory);
}
@Override
@@ -145,6 +150,10 @@
// 鍥犱负瀹氭椂鍣ㄥ彲鑳戒細閲嶅璋冪敤锛屾垨鑰呴渶瑕佺瓑寰呬换鍔″畬鎴�
if ("feedGlass".equals(operation) && status.isExecuting()) {
log.debug("杞﹁締 {} 褰撳墠鐘舵�佷负 EXECUTING锛屼絾鍏佽缁х画鎵ц feedGlass锛堝畾鏃跺櫒閲嶅璋冪敤锛�", deviceId);
+ // 鍏佽缁х画鎵ц锛屼笉杩斿洖閿欒
+ } else if ("clearGlass".equals(operation) || "clearPlc".equals(operation) || "clear".equals(operation)) {
+ // 娓呴櫎鎿嶄綔搴旇鍏佽鍦ㄤ换浣曠姸鎬佷笅鎵ц锛屽洜涓哄叾鐩殑灏辨槸閲嶇疆璁惧鐘舵��
+ log.debug("杞﹁締 {} 褰撳墠鐘舵�佷负 {}锛屼絾鍏佽鎵ц娓呴櫎鎿嶄綔 {}", deviceId, status.getState(), operation);
// 鍏佽缁х画鎵ц锛屼笉杩斿洖閿欒
} else {
return DevicePlcVO.OperationResult.builder()
@@ -215,7 +224,7 @@
result = handleSetOnlineState(deviceConfig, params, logicParams);
break;
case "checkMesConfirm":
- result = checkMesConfirm(deviceConfig, logicParams);
+ result = checkMesConfirm(deviceConfig, params, logicParams);
break;
case "markBroken":
result = handleMarkBroken(deviceConfig, params, logicParams);
@@ -1239,20 +1248,17 @@
}
// 妫�鏌ユ槸鍚︽湁寰呭鐞嗙殑杩涚墖鎴栧嚭鐗囦换鍔�
- if (plcDynamicDataService != null && s7SerializerProvider != null) {
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer != null) {
- // 妫�鏌ヨ繘鐗囦换鍔�
- Map<String, Object> mesData = plcDynamicDataService.readPlcData(
- deviceConfig, MES_FIELDS, serializer);
- Integer mesSend = parseInteger(mesData != null ? mesData.get("mesSend") : null);
-
- // 杩涚墖鍜屽嚭鐗囧叡鐢╩esSend瀛楁锛屽彧闇�妫�鏌ヤ竴娆�
- // 濡傛灉鏈夊緟澶勭悊鐨勪换鍔★紝涓嶈缃畃lcRequest锛堢瓑寰呬换鍔″鐞嗭級
- if (mesSend != null && mesSend == 1) {
- log.debug("澶ц溅绌洪棽鐩戞帶: deviceId={}, 妫�娴嬪埌寰呭鐞嗕换鍔★紙mesSend=1锛夛紝涓嶈缃畃lcRequest", deviceId);
- return;
- }
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient != null) {
+ // 妫�鏌ヨ繘鐗囦换鍔�
+ Map<String, Object> mesData = plcClient.readData(MES_FIELDS.toArray(new String[0]));
+ Integer mesSend = parseInteger(mesData != null ? mesData.get("mesSend") : null);
+
+ // 杩涚墖鍜屽嚭鐗囧叡鐢╩esSend瀛楁锛屽彧闇�妫�鏌ヤ竴娆�
+ // 濡傛灉鏈夊緟澶勭悊鐨勪换鍔★紝涓嶈缃畃lcRequest锛堢瓑寰呬换鍔″鐞嗭級
+ if (mesSend != null && mesSend == 1) {
+ log.debug("澶ц溅绌洪棽鐩戞帶: deviceId={}, 妫�娴嬪埌寰呭鐞嗕换鍔★紙mesSend=1锛夛紝涓嶈缃畃lcRequest", deviceId);
+ return;
}
}
@@ -1302,19 +1308,12 @@
Map<String, Object> params,
Map<String, Object> logicParams) {
- if (plcDynamicDataService == null || s7SerializerProvider == null) {
- return DevicePlcVO.OperationResult.builder()
- .success(false)
- .message("PlcDynamicDataService鎴朣7SerializerProvider鏈敞鍏�")
- .build();
- }
-
String deviceId = deviceConfig.getDeviceId();
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer == null) {
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient == null) {
return DevicePlcVO.OperationResult.builder()
.success(false)
- .message("鑾峰彇PLC搴忓垪鍖栧櫒澶辫触")
+ .message("鑾峰彇PLC瀹㈡埛绔け璐�")
.build();
}
@@ -1323,16 +1322,27 @@
MesTaskInfo existingTask = currentTasks.get(deviceId);
if (existingTask != null) {
log.debug("璁惧宸叉湁浠诲姟鍦ㄦ墽琛屼腑锛岃烦杩囨鏌ES浠诲姟: deviceId={}", deviceId);
+ // 浠嶇劧杩斿洖褰撳墠浠诲姟鐨勭幓鐠冨垪琛紝渚涗换鍔″紩鎿庤褰�/瀵硅处鏈壒娆�
+ List<String> batchIds = new ArrayList<>();
+ if (existingTask.glasses != null) {
+ for (GlassTaskInfo g : existingTask.glasses) {
+ if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+ batchIds.add(g.glassId);
+ }
+ }
+ }
return DevicePlcVO.OperationResult.builder()
.success(true)
.message("浠诲姟鎵ц涓紝鏃犻渶閲嶅妫�鏌ES浠诲姟")
- .data(Collections.singletonMap("waiting", false))
+ .data(new HashMap<String, Object>() {{
+ put("waiting", false);
+ put("batchGlassIds", batchIds);
+ }})
.build();
}
// 璇诲彇MES瀛楁锛堣繘鐗囧拰鍑虹墖鍏辩敤锛�
- Map<String, Object> mesData = plcDynamicDataService.readPlcData(
- deviceConfig, MES_FIELDS, serializer);
+ Map<String, Object> mesData = plcClient.readData(MES_FIELDS.toArray(new String[0]));
if (mesData == null || mesData.isEmpty()) {
log.warn("璇诲彇MES瀛楁澶辫触: deviceId={}, mesData涓虹┖鎴杗ull", deviceId);
return DevicePlcVO.OperationResult.builder()
@@ -1349,11 +1359,31 @@
waitData.put("completed", false);
waitData.put("waiting", true);
waitData.put("waitingReason", "mesSend=0");
+ waitData.put("batchGlassIds", new ArrayList<>());
return DevicePlcVO.OperationResult.builder()
.success(true)
.message("绛夊緟MES鍙戦�佽姹傦紙mesSend=0锛�")
.data(waitData)
.build();
+ }
+
+ // 鏋勫缓褰撳墠MES鏁版嵁绛惧悕锛岀敤浜庡垽鏂槸鍚︿负宸茬‘璁や絾鏈浣嶇殑鏃т换鍔�
+ String mesSignature = buildMesSignature(mesData);
+ CompletedMesRecord completedRecord = lastCompletedMesRecords.get(deviceId);
+ if (completedRecord != null
+ && mesSignature.equals(completedRecord.signature)) {
+ Integer mesConfirm = parseInteger(mesData.get("mesConfirm"));
+ if (mesConfirm != null && mesConfirm == 1) {
+ Map<String, Object> waitData = new HashMap<>();
+ waitData.put("completed", true);
+ waitData.put("waiting", true);
+ waitData.put("waitingReason", "mesNotReset");
+ return DevicePlcVO.OperationResult.builder()
+ .success(true)
+ .message("MES宸茬‘璁ゅ畬鎴愪絾鏈浣嶏紙mesSend/mesConfirm锛夛紝绛夊緟澶嶄綅鍚庡啀鎺ユ敹鏂颁换鍔�")
+ .data(waitData)
+ .build();
+ }
}
// mesSend=1锛岃褰曟棩蹇�
@@ -1453,6 +1483,7 @@
taskInfo.cartime = timeCalc.cartime;
taskInfo.createdTime = System.currentTimeMillis();
taskInfo.isOutbound = isOutbound;
+ taskInfo.mesSignature = mesSignature;
// 浠庨厤缃腑璇诲彇鐮存崯鐜荤拑绱㈠紩锛堢敤浜庢祴璇曞満鏅級
// 閰嶇疆鏍煎紡锛歜rokenGlassIndices: [0, 2] 琛ㄧず绗�1涓拰绗�3涓幓鐠冨簲璇ョ牬鎹�
@@ -1472,11 +1503,44 @@
}
currentTasks.put(deviceId, taskInfo);
+
+ // 濡傛灉鏈夊璁惧浠诲姟涓婁笅鏂囷紝鍒欒褰曟湰娆ES涓嬪彂鐨勭幓鐠僆D鍒楄〃鍒颁笂涓嬫枃锛屼緵鍒嗘壒鏍¢獙浣跨敤
+ if (params != null) {
+ Object ctxObj = params.get("_taskContext");
+ if (ctxObj instanceof TaskExecutionContext) {
+ TaskExecutionContext ctx = (TaskExecutionContext) ctxObj;
+ List<String> batchIds = new ArrayList<>();
+ for (GlassTaskInfo g : glasses) {
+ if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+ batchIds.add(g.glassId);
+ }
+ }
+ // 1. 璁板綍褰撳墠鎵规鐨勭幓鐠僆D
+ ctx.getSharedData().put("currentMesBatchGlassIds", batchIds);
+ log.info("璁板綍鏈MES鎵规鐜荤拑鍒楄〃: deviceId={}, batchIds={}", deviceId, batchIds);
+
+ // 2. 鍒濆鍖栨�诲緟鍑虹墖鐜荤拑鍒楄〃锛堜粎绗竴娆″垵濮嬪寲锛屼粠浠诲姟鍙傛暟鑾峰彇锛�
+ if (!ctx.getSharedData().containsKey("initialGlassIds")) {
+ // 浠庝换鍔″弬鏁颁腑鑾峰彇鎬诲緟鍑虹墖鐜荤拑ID锛堟牳蹇冿細鎬诲垪琛ㄦ潵鑷换鍔″弬鏁帮紝鑰岄潪MES鎵规锛�
+ List<String> taskGlassIds = ctx.getParameters().getGlassIds();
+ if (taskGlassIds != null && !taskGlassIds.isEmpty()) {
+ ctx.getSharedData().put("initialGlassIds", new ArrayList<>(taskGlassIds));
+ // 鍒濆鍖栧凡鍑虹墖鍒楄〃涓虹┖
+ if (!ctx.getSharedData().containsKey("outboundGlassIds")) {
+ ctx.getSharedData().put("outboundGlassIds", new ArrayList<>());
+ }
+ log.info("鍒濆鍖栨�诲緟鍑虹墖鐜荤拑鍒楄〃: deviceId={}, taskGlassIds={}", deviceId, taskGlassIds);
+ } else {
+ log.warn("浠诲姟鍙傛暟涓湭鎵惧埌鎬诲緟鍑虹墖鐜荤拑ID鍒楄〃: deviceId={}", deviceId);
+ }
+ }
+ }
+ }
// 娓呯┖plcRequest锛堣〃绀哄凡鎺ユ敹浠诲姟锛�
Map<String, Object> payload = new HashMap<>();
payload.put("plcRequest", 0);
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+ plcClient.writeData(payload);
log.info("宸叉竻绌簆lcRequest=0: deviceId={}", deviceId);
// 鏇存柊杞﹁締鐘舵�佷负鎵ц涓�
@@ -1489,7 +1553,7 @@
String taskType = isOutbound ? "鍑虹墖" : "杩涚墖";
String glassIds = glasses.stream()
.map(g -> g.glassId)
- .collect(java.util.stream.Collectors.joining(","));
+ .collect(Collectors.joining(","));
log.info("MES{}浠诲姟宸插垱寤�: deviceId={}, glassCount={}, glassIds=[{}], 璧峰浣嶇疆={}鏍�, 鐩爣浣嶇疆={}鏍�, 璺濈{}鏍�->{}鏍�, gotime={}ms({}绉�), cartime={}ms({}绉�)",
taskType, deviceId, glasses.size(), glassIds,
firstGlass.startPosition, firstGlass.targetPosition,
@@ -1509,6 +1573,14 @@
Map<String, Object> successData = new HashMap<>();
successData.put("waiting", false);
successData.put("taskStarted", true);
+ // 灏嗘湰娆ES涓嬪彂鐨勭幓鐠僆D鍒楄〃閫氳繃杩斿洖鍊煎甫鍥烇紙浠诲姟寮曟搸涓嶅啀渚濊禆_taskContext鍐欏叆锛�
+ List<String> batchIdsForReturn = new ArrayList<>();
+ for (GlassTaskInfo g : glasses) {
+ if (g != null && g.glassId != null && !g.glassId.isEmpty()) {
+ batchIdsForReturn.add(g.glassId);
+ }
+ }
+ successData.put("batchGlassIds", batchIdsForReturn);
return DevicePlcVO.OperationResult.builder()
.success(true)
@@ -1761,13 +1833,9 @@
MesTaskInfo taskInfo,
Map<String, Object> logicParams) {
- if (plcDynamicDataService == null || s7SerializerProvider == null) {
- return;
- }
-
String deviceId = deviceConfig.getDeviceId();
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer == null) {
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient == null) {
return;
}
@@ -1817,7 +1885,7 @@
// 浼樺厛妫�鏌ユ槸鍚︽爣璁颁负鐮存崯锛坰tate=8锛�
// 妫�鏌ヤ换鍔′俊鎭腑鏄惁鏍囪浜嗚鐜荤拑涓虹牬鎹�
if (taskInfo.brokenGlassIndices != null && taskInfo.brokenGlassIndices.contains(i)) {
- updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 8, taskInfo);
+ updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 8, taskInfo);
log.info("鐜荤拑鏍囪涓虹牬鎹�: deviceId={}, stateField={}, glassIndex={}",
deviceConfig.getDeviceId(), stateField, i);
continue;
@@ -1825,7 +1893,7 @@
// 妫�鏌ヨ秴鏃舵湭瀹屾垚锛坰tate=3锛�
if (elapsed >= state3TimeoutTime && (currentState == null || currentState < 2)) {
- updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 3, taskInfo);
+ updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 3, taskInfo);
log.warn("浠诲姟瓒呮椂鏈畬鎴�: deviceId={}, stateField={}, elapsed={}ms, expectedTime={}ms",
deviceConfig.getDeviceId(), stateField, elapsed, state2Time);
continue;
@@ -1834,7 +1902,7 @@
// 姝e父鐘舵�佹洿鏂�
if (elapsed >= state1Time && elapsed < state2Time) {
// state搴旇涓�1锛堜笂杞﹀畬鎴愶級
- boolean stateChanged = updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 1, taskInfo);
+ boolean stateChanged = updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 1, taskInfo);
if (stateChanged) {
hasStateOne = true;
currentStepDesc = "鐜荤拑宸蹭笂杞︼紙state=1锛夛紝姝e湪杩愯緭鍒扮洰鏍囦綅缃�";
@@ -1843,7 +1911,7 @@
}
} else if (elapsed >= state2Time) {
// state搴旇涓�2锛堣繍杈撳畬鎴愶級
- boolean stateChanged = updateStateIfNeeded(deviceConfig, serializer, stateValues, stateField, 2, taskInfo);
+ boolean stateChanged = updateStateIfNeeded(deviceConfig, plcClient, stateValues, stateField, 2, taskInfo);
if (stateChanged) {
hasStateTwo = true;
currentStepDesc = "鐜荤拑宸插埌杈剧洰鏍囦綅缃紙state=2锛夛紝绛夊緟MES纭";
@@ -1867,7 +1935,7 @@
// 妫�鏌ユ槸鍚︽墍鏈塻tate閮�>=2锛屽鏋滄槸鍒欑粰MES姹囨姤
if (elapsed >= state2Time && allStatesCompleted(stateValues, glassCount)) {
- reportToMes(deviceConfig, serializer, taskInfo, logicParams);
+ reportToMes(deviceConfig, plcClient, taskInfo, logicParams);
// 璁板綍MES纭寮�濮嬬瓑寰呯殑鏃堕棿锛堝彧璁板綍涓�娆★級
if (taskInfo.mesConfirmStartTime == null) {
taskInfo.mesConfirmStartTime = System.currentTimeMillis();
@@ -1890,7 +1958,7 @@
* @return 鏄惁鍙戠敓浜嗙姸鎬佸彉鍖栵紙浠庨潪鐩爣鐘舵�佸彉涓虹洰鏍囩姸鎬侊級
*/
private boolean updateStateIfNeeded(DeviceConfig deviceConfig,
- EnhancedS7Serializer serializer,
+ PlcClient plcClient,
Map<String, Object> currentStates,
String stateField,
int targetState,
@@ -1913,7 +1981,7 @@
try {
Map<String, Object> payload = new HashMap<>();
payload.put(stateField, targetState);
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+ plcClient.writeData(payload);
log.info("浠诲姟鐘舵�佸凡鏇存柊鍒癙LC: deviceId={}, stateField={}, currentState={}, targetState={}",
deviceConfig.getDeviceId(), stateField, currentState, targetState);
@@ -1984,7 +2052,7 @@
* 缁橫ES姹囨姤
*/
private void reportToMes(DeviceConfig deviceConfig,
- EnhancedS7Serializer serializer,
+ PlcClient plcClient,
MesTaskInfo taskInfo,
Map<String, Object> logicParams) {
@@ -1992,7 +2060,7 @@
// 璁剧疆姹囨姤瀛�
Map<String, Object> payload = new HashMap<>();
payload.put("plcReport", 1);
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+ plcClient.writeData(payload);
String taskType = taskInfo.isOutbound ? "鍑虹墖" : "杩涚墖";
String glassIds = taskInfo.glasses.stream()
@@ -2012,30 +2080,27 @@
* 杩斿洖OperationResult.data涓殑 completed 鏍囧織琛ㄧず鏄惁宸茬‘璁ゅ畬鎴�
*/
public DevicePlcVO.OperationResult checkMesConfirm(DeviceConfig deviceConfig,
+ Map<String, Object> params,
Map<String, Object> logicParams) {
- if (plcDynamicDataService == null || s7SerializerProvider == null) {
- return DevicePlcVO.OperationResult.builder()
- .success(false)
- .message("PlcDynamicDataService鎴朣7SerializerProvider鏈敞鍏�")
- .build();
- }
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer == null) {
- return DevicePlcVO.OperationResult.builder()
- .success(false)
- .message("鑾峰彇PLC搴忓垪鍖栧櫒澶辫触")
- .build();
- }
-
String deviceId = deviceConfig.getDeviceId();
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient == null) {
+ return DevicePlcVO.OperationResult.builder()
+ .success(false)
+ .message("鑾峰彇PLC瀹㈡埛绔け璐�")
+ .build();
+ }
MesTaskInfo taskInfo = currentTasks.get(deviceId);
// 濡傛灉娌℃湁浠诲姟璁板綍锛屼紭鍏堝皾璇曡ˉ鍋挎�у湴妫�鏌ヤ竴娆ES浠诲姟锛堥伩鍏嶅洜鏃跺簭闂涓�鐩磏oTask锛�
if (taskInfo == null) {
log.info("妫�鏌ES纭鏃舵湭鎵惧埌浠诲姟璁板綍锛屽皾璇曡ˉ鍋挎鏌ES浠诲姟: deviceId={}", deviceId);
try {
+ // 鍏抽敭锛氳ˉ鍋挎鏌ユ椂涔熻閫忎紶params锛堝寘鍚玙taskContext锛夛紝
+ // 鍚﹀垯handleCheckMesTask鏃犳硶鎶婃湰鎵规鐜荤拑ID鍐欏叆currentMesBatchGlassIds锛屼换鍔″紩鎿庢棤娉曠疮鍔犲畬鎴愯繘搴�
+ Map<String, Object> checkParams = params != null ? params : Collections.emptyMap();
DevicePlcVO.OperationResult checkResult =
- handleCheckMesTask(deviceConfig, Collections.emptyMap(), logicParams);
+ handleCheckMesTask(deviceConfig, checkParams, logicParams);
if (Boolean.TRUE.equals(checkResult.getSuccess())) {
taskInfo = currentTasks.get(deviceId);
if (taskInfo != null) {
@@ -2075,9 +2140,14 @@
data.put("completed", false);
data.put("waiting", true);
data.put("waitingReason", "waitingReport");
+ String detail = taskInfo.currentStepDesc;
+ String message = "澶ц溅浠诲姟鎵ц涓紝灏氭湭姹囨姤锛屾棤闇�妫�鏌ョ‘璁�";
+ if (detail != null && !detail.isEmpty()) {
+ message = detail + "锛�" + message;
+ }
return DevicePlcVO.OperationResult.builder()
.success(true)
- .message("澶ц溅浠诲姟鎵ц涓紝灏氭湭姹囨姤锛屾棤闇�妫�鏌ョ‘璁�")
+ .message(message)
.data(data)
.build();
}
@@ -2093,7 +2163,7 @@
// 瓒呮椂瑙嗕负浠诲姟澶辫触锛氭竻鐞嗕换鍔$姸鎬佸苟鍋滄鐩戞帶锛岄伩鍏嶇户缁疮鍔犵瓑寰呮椂闂�
try {
- clearTaskStates(deviceConfig, serializer);
+ clearTaskStates(deviceConfig, plcClient);
} catch (Exception e) {
log.warn("MES纭瓒呮椂鏃舵竻绌轰换鍔$姸鎬佸け璐�: deviceId={}, error={}", deviceId, e.getMessage());
}
@@ -2109,15 +2179,20 @@
.build();
}
- Object confirmValue = plcDynamicDataService.readPlcField(
- deviceConfig, "mesConfirm", serializer);
- Integer confirm = parseInteger(confirmValue);
+ Map<String, Object> confirmData = plcClient.readData("mesConfirm");
+ Integer confirm = parseInteger(confirmData != null ? confirmData.get("mesConfirm") : null);
boolean completed = confirm != null && confirm == 1;
data.put("completed", completed);
if (completed) {
- // MES宸茬‘璁わ紝娓呯┖state鍜屾眹鎶ュ瓧
- clearTaskStates(deviceConfig, serializer);
+ // MES宸茬‘璁わ細鏈浜や簰瀹屾垚锛堜笉鍦ㄨ澶囦晶鍒ゆ柇"鏄惁杩樻湁鏇村鐜荤拑"锛岀敱浠诲姟寮曟搸缁熶竴缂栨帓锛�
+ clearTaskStates(deviceConfig, plcClient);
+
+ // 璁板綍宸插畬鎴愮殑浠诲姟绛惧悕锛岄伩鍏峂ES鏈浣嶆椂琚噸澶嶆媺璧�
+ if (taskInfo != null && taskInfo.mesSignature != null) {
+ lastCompletedMesRecords.put(deviceId,
+ new CompletedMesRecord(taskInfo.mesSignature, System.currentTimeMillis()));
+ }
// 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵��
statusManager.updateVehicleStatus(
@@ -2133,13 +2208,13 @@
// 鎭㈠plcRequest=1锛堝彲浠ユ帴鏀舵柊浠诲姟锛�
Map<String, Object> payload = new HashMap<>();
payload.put("plcRequest", 1);
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+ plcClient.writeData(payload);
log.info("MES浠诲姟宸茬‘璁ゅ畬鎴�: deviceId={}", deviceConfig.getDeviceId());
- String taskType = taskInfo.isOutbound ? "鍑虹墖" : "杩涚墖";
+ String taskType = (taskInfo != null && taskInfo.isOutbound) ? "鍑虹墖" : "杩涚墖";
return DevicePlcVO.OperationResult.builder()
.success(true)
- .message(String.format("%s浠诲姟瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧锛屽ぇ杞︾┖闂诧紙plcRequest=1锛夛紝鍙互绛夊緟涓嬫浠诲姟", taskType))
+ .message(String.format("%s浠诲姟浜や簰瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧锛屽ぇ杞︾┖闂诧紙plcRequest=1锛�", taskType))
.data(data)
.build();
}
@@ -2224,20 +2299,27 @@
}
// 绔嬪嵆鍐欏叆PLC鐨剆tate瀛楁
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer != null) {
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient != null) {
try {
Map<String, Object> payload = new HashMap<>();
for (Integer index : brokenIndices) {
String stateField = "state" + (index + 1);
payload.put(stateField, 8);
}
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
- log.info("宸叉爣璁扮幓鐠冧负鐮存崯骞跺啓鍏LC: deviceId={}, brokenIndices={}",
- deviceId, brokenIndices);
+ boolean success = plcClient.writeData(payload);
+ if (success) {
+ log.info("宸叉爣璁扮幓鐠冧负鐮存崯骞跺啓鍏LC: deviceId={}, brokenIndices={}",
+ deviceId, brokenIndices);
+ } else {
+ log.error("鍐欏叆鐮存崯鐘舵�佸埌PLC澶辫触: deviceId={}, brokenIndices={}",
+ deviceId, brokenIndices);
+ }
} catch (Exception e) {
log.error("鍐欏叆鐮存崯鐘舵�佸埌PLC澶辫触: deviceId={}, error={}", deviceId, e.getMessage());
}
+ } else {
+ log.error("鑾峰彇PLC瀹㈡埛绔け璐ワ紝鏃犳硶鍐欏叆鐮存崯鐘舵��: deviceId={}", deviceId);
}
return DevicePlcVO.OperationResult.builder()
@@ -2249,7 +2331,7 @@
/**
* 娓呯┖浠诲姟鐘舵��
*/
- private void clearTaskStates(DeviceConfig deviceConfig, EnhancedS7Serializer serializer) {
+ private void clearTaskStates(DeviceConfig deviceConfig, PlcClient plcClient) {
try {
Map<String, Object> payload = new HashMap<>();
// 娓呯┖state1~6
@@ -2258,7 +2340,7 @@
}
// 娓呯┖姹囨姤瀛�
payload.put("plcReport", 0);
- plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+ plcClient.writeData(payload);
} catch (Exception e) {
log.error("娓呯┖浠诲姟鐘舵�佸紓甯�: deviceId={}", deviceConfig.getDeviceId(), e);
}
@@ -2321,6 +2403,20 @@
List<Integer> brokenGlassIndices = null; // 鏍囪涓虹牬鎹熺殑鐜荤拑绱㈠紩鍒楄〃锛�0-based锛岀敤浜庢祴璇曞満鏅級
Long mesConfirmStartTime = null; // MES纭寮�濮嬬瓑寰呯殑鏃堕棿锛堢敤浜庤秴鏃舵娴嬶級
String currentStepDesc = null; // 褰撳墠姝ラ鎻忚堪锛堢敤浜庢樉绀鸿缁嗙殑鎵ц鐘舵�侊級
+ String mesSignature = null; // MES鏁版嵁绛惧悕锛岀敤浜庨伩鍏嶆湭澶嶄綅鏃堕噸澶嶆媺璧�
+ }
+
+ /**
+ * 璁板綍宸插畬鎴愪絾MES鏈浣嶇殑浠诲姟淇℃伅
+ */
+ private static class CompletedMesRecord {
+ final String signature;
+ final long completedAt;
+
+ CompletedMesRecord(String signature, long completedAt) {
+ this.signature = signature;
+ this.completedAt = completedAt;
+ }
}
/**
@@ -2387,17 +2483,36 @@
}
private void clearDynamicTaskStates(DeviceConfig deviceConfig) {
- if (plcDynamicDataService == null || s7SerializerProvider == null) {
- return;
- }
try {
- EnhancedS7Serializer serializer = s7SerializerProvider.getSerializer(deviceConfig);
- if (serializer != null) {
- clearTaskStates(deviceConfig, serializer);
+ PlcClient plcClient = getPlcClient(deviceConfig);
+ if (plcClient != null) {
+ clearTaskStates(deviceConfig, plcClient);
}
} catch (Exception e) {
log.warn("娓呯┖澶ц溅state瀛楁澶辫触: deviceId={}, error={}", deviceConfig != null ? deviceConfig.getId() : "null", e.getMessage());
}
}
+
+ /**
+ * 灏哅ES鏁版嵁鏋勯�犳垚绛惧悕瀛楃涓诧紝鐢ㄤ簬璇嗗埆鏄惁涓哄悓涓�鎵规浠诲姟
+ */
+ private String buildMesSignature(Map<String, Object> mesData) {
+ if (mesData == null || mesData.isEmpty()) {
+ return "empty";
+ }
+ StringBuilder sb = new StringBuilder();
+ sb.append("mesSend=").append(mesData.getOrDefault("mesSend", ""))
+ .append(";mesConfirm=").append(mesData.getOrDefault("mesConfirm", ""));
+ for (int i = 1; i <= 6; i++) {
+ sb.append(";g").append(i).append("=")
+ .append(mesData.getOrDefault("mesGlassId" + i, ""))
+ .append(",s").append(mesData.getOrDefault("start" + i, ""))
+ .append(",t").append(mesData.getOrDefault("target" + i, ""))
+ .append(",w").append(mesData.getOrDefault("mesWidth" + i, ""))
+ .append(",h").append(mesData.getOrDefault("mesHeight" + i, ""))
+ .append(",th").append(mesData.getOrDefault("mesThickness" + i, ""));
+ }
+ return sb.toString();
+ }
}
--
Gitblit v1.8.0