From ea51b55feb73883040ed8a87b5a4aeb0bf94bb5e Mon Sep 17 00:00:00 2001
From: huang <1532065656@qq.com>
Date: 星期一, 15 十二月 2025 17:02:27 +0800
Subject: [PATCH] 修改出片任务分批进行
---
mes-processes/mes-plcSend/src/main/java/com/mes/interaction/vehicle/handler/LoadVehicleLogicHandler.java | 150 +++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 148 insertions(+), 2 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..5ae4704 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
@@ -112,6 +112,10 @@
// 璁板綍褰撳墠浠诲姟锛歞eviceId -> 浠诲姟淇℃伅
private final Map<String, MesTaskInfo> currentTasks = new ConcurrentHashMap<>();
+ /**
+ * 璁板綍鏈�杩戜竴娆″凡瀹屾垚浣哅ES鏈浣嶇殑浠诲姟绛惧悕锛岄伩鍏嶉噸澶嶆媺璧�
+ */
+ private final Map<String, CompletedMesRecord> lastCompletedMesRecords = new ConcurrentHashMap<>();
@Autowired
public LoadVehicleLogicHandler(
@@ -145,6 +149,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 +223,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);
@@ -1356,6 +1364,25 @@
.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锛岃褰曟棩蹇�
log.info("妫�娴嬪埌mesSend=1锛屽紑濮嬭鍙朚ES浠诲姟淇℃伅: deviceId={}", deviceId);
@@ -1453,6 +1480,7 @@
taskInfo.cartime = timeCalc.cartime;
taskInfo.createdTime = System.currentTimeMillis();
taskInfo.isOutbound = isOutbound;
+ taskInfo.mesSignature = mesSignature;
// 浠庨厤缃腑璇诲彇鐮存崯鐜荤拑绱㈠紩锛堢敤浜庢祴璇曞満鏅級
// 閰嶇疆鏍煎紡锛歜rokenGlassIndices: [0, 2] 琛ㄧず绗�1涓拰绗�3涓幓鐠冨簲璇ョ牬鎹�
@@ -2012,6 +2040,7 @@
* 杩斿洖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()
@@ -2075,9 +2104,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();
}
@@ -2116,8 +2150,84 @@
data.put("completed", completed);
if (completed) {
+ // MES宸茬‘璁わ紝妫�鏌ユ槸鍚﹁繕鏈夋湭鍑虹墖鐨勭幓鐠冿紙浠呭鍑虹墖浠诲姟锛�
+ boolean hasMoreGlass = false;
+ int completedCount = 0;
+ int totalCount = 0;
+
+ if (taskInfo.isOutbound && params != null) {
+ // 浠嶵askExecutionContext涓幏鍙栧凡鍑虹墖鐨勭幓鐠僆D鍒楄〃鍜屽垵濮嬬幓鐠僆D鍒楄〃
+ Object contextObj = params.get("_taskContext");
+ if (contextObj instanceof com.mes.task.model.TaskExecutionContext) {
+ com.mes.task.model.TaskExecutionContext context =
+ (com.mes.task.model.TaskExecutionContext) contextObj;
+
+ @SuppressWarnings("unchecked")
+ List<String> initialGlassIds = (List<String>) context.getSharedData().get("initialGlassIds");
+ @SuppressWarnings("unchecked")
+ List<String> outboundGlassIds = (List<String>) context.getSharedData().get("outboundGlassIds");
+
+ if (initialGlassIds != null && !initialGlassIds.isEmpty()) {
+ totalCount = initialGlassIds.size();
+ completedCount = (outboundGlassIds != null) ? outboundGlassIds.size() : 0;
+
+ // 妫�鏌ユ槸鍚︽墍鏈夌幓鐠冮兘宸插嚭鐗�
+ if (outboundGlassIds == null || !outboundGlassIds.containsAll(initialGlassIds)) {
+ hasMoreGlass = true;
+ }
+ }
+ }
+ }
+
+ // 濡傛灉杩樻湁鏈嚭鐗囩殑鐜荤拑锛屼繚鎸乸lcRequest=1锛屾竻鐞嗘湰娆′换鍔$姸鎬侊紝绛夊緟涓嬫浜や簰
+ // 杩欐牱绗簩娆′氦浜掓椂锛宑heckMesTask鍙互妫�娴嬪埌mesSend=1锛屽垱寤烘柊浠诲姟锛屽畬鏁村湴璧颁竴閬嶉�昏緫
+ if (hasMoreGlass) {
+ // 娓呯┖state鍜屾眹鎶ュ瓧锛堟湰娆′氦浜掑凡瀹屾垚锛�
+ clearTaskStates(deviceConfig, serializer);
+
+ // 娉ㄦ剰锛氫笉璁板綍lastCompletedMesRecords锛屽洜涓鸿繕鏈夋湭鍑虹墖鐨勭幓鐠冿紝浠诲姟鏈湡姝e畬鎴�
+ // 杩欐牱绗簩娆′氦浜掓椂锛屽嵆浣縈ES鍙戦�佹柊浠诲姟锛堟柊鐨勭幓鐠僆D锛夛紝涔熶笉浼氳璇垽涓烘棫浠诲姟
+
+ // 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵�侊紙鏈浜や簰宸插畬鎴愶級
+ statusManager.updateVehicleStatus(
+ deviceConfig.getDeviceId(), VehicleState.IDLE);
+ statusManager.clearVehicleTask(deviceConfig.getDeviceId());
+
+ // 绉婚櫎浠诲姟璁板綍锛堟湰娆′氦浜掑凡瀹屾垚锛岀瓑寰呬笅娆′氦浜掓椂鍒涘缓鏂颁换鍔★級
+ currentTasks.remove(deviceConfig.getDeviceId());
+
+ // 鍋滄浠诲姟鐩戞帶锛堟湰娆′氦浜掑凡瀹屾垚锛�
+ handleStopTaskMonitor(deviceConfig);
+
+ // 淇濇寔plcRequest=1锛堝彲浠ユ帴鏀朵笅娆′换鍔★級
+ Map<String, Object> payload = new HashMap<>();
+ payload.put("plcRequest", 1);
+ plcDynamicDataService.writePlcData(deviceConfig, payload, serializer);
+
+ log.info("鍑虹墖浠诲姟鏈浜や簰瀹屾垚锛岃繕鏈夋湭鍑虹墖鐨勭幓鐠冿紝绛夊緟涓嬫浜や簰: deviceId={}, completedCount={}, totalCount={}",
+ deviceConfig.getDeviceId(), completedCount, totalCount);
+
+ String progressMessage = String.format("鐩墠瀹屾垚鍑虹墖鐜荤拑鏁伴噺%d/%d锛岀瓑寰呬笅娆′氦浜掍换鍔�", completedCount, totalCount);
+ data.put("completed", false); // 鏍囪涓烘湭瀹屾垚锛屽洜涓鸿繕鏈夋湭鍑虹墖鐨勭幓鐠�
+ data.put("waiting", true);
+ data.put("waitingReason", "moreGlassToOutbound");
+ data.put("completedCount", completedCount);
+ data.put("totalCount", totalCount);
+
+ return DevicePlcVO.OperationResult.builder()
+ .success(true)
+ .message(String.format("鍑虹墖浠诲姟鏈浜や簰瀹屾垚锛歁ES宸茬‘璁わ紙mesConfirm=1锛夛紝宸叉竻绌簊tate鍜屾眹鎶ュ瓧銆�%s銆傚ぇ杞︾┖闂诧紙plcRequest=1锛夛紝绛夊緟MES鍙戦�佷笅娆′换鍔�", progressMessage))
+ .data(data)
+ .build();
+ }
+
+ // 鎵�鏈夌幓鐠冮兘宸插嚭鐗囷紝姝e父瀹屾垚娴佺▼
// MES宸茬‘璁わ紝娓呯┖state鍜屾眹鎶ュ瓧
clearTaskStates(deviceConfig, serializer);
+
+ // 璁板綍宸插畬鎴愮殑浠诲姟绛惧悕锛岄伩鍏峂ES鏈浣嶆椂琚噸澶嶆媺璧�
+ lastCompletedMesRecords.put(deviceId,
+ new CompletedMesRecord(taskInfo.mesSignature, System.currentTimeMillis()));
// 浠诲姟瀹屾垚锛屾仮澶嶄负绌洪棽鐘舵��
statusManager.updateVehicleStatus(
@@ -2321,6 +2431,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;
+ }
}
/**
@@ -2399,5 +2523,27 @@
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