From 0125becfef917675ad9572dd3f9a802c1578dfa0 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期三, 29 四月 2026 20:04:52 +0800
Subject: [PATCH] MQTT上报和erp上报进行区分,现在是MQTT上报后还会上报一次ERP
---
src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 152 insertions(+), 3 deletions(-)
diff --git a/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java b/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java
index 1e7f83c..0e569e9 100644
--- a/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java
+++ b/src/main/java/com/zy/integration/iot/biz/impl/IotInstructionServiceImpl.java
@@ -42,6 +42,15 @@
@Service
public class IotInstructionServiceImpl implements IotInstructionService {
+ /**
+ * MQTT 缁勬墭鍏ュ彛鍐欏叆 WaitPakin.boxType1=aws銆�
+ * 鐪熷疄鍏ュ簱浠诲姟鐢熸垚鏃惰瀛楁浼氬悓姝ュ埌 WrkDetl.boxType1锛屽彲浣滀负鍏ュ簱浠诲姟鏉ユ簮鐨勬湰鍦板厹搴曟爣璇嗐��
+ */
+ private static final String MQTT_SOURCE_BOX_TYPE = "aws";
+
+ private static final List<Integer> STOW_WORK_IO_TYPES = Arrays.asList(1, 8, 11, 53, 54, 57);
+ private static final List<Integer> PICK_WORK_IO_TYPES = Arrays.asList(101, 108);
+
@Autowired
private IotPublishRecordService iotPublishRecordService;
@Autowired
@@ -180,6 +189,29 @@
}
/**
+ * 鍒ゆ柇浠诲姟鏄惁鏉ヨ嚜 MQTT 鎸囦护銆�
+ *
+ * 鍑哄簱 MQTT 鎸囦护鍦� handlePickInstruction 涓細鍏堣惤 asr_iot_publish_record(INBOUND/PICK)锛�
+ * 鍐嶉�氳繃缁熶竴鍑哄簱璁㈠崟鎵ц閫昏緫鐢熸垚 WrkMast锛屽洜姝や紭鍏堢敤 wrk_no 绮剧‘鍖归厤銆�
+ *
+ * 鍏ュ簱 MQTT 鎸囦护鍏堣惤 WaitPakin锛學CS 鎵爜鍚庢墠鐢熸垚 WrkMast锛屽叆绔欒褰曞綋鏃惰繕涓嶇煡閬� wrk_no锛�
+ * 鎵�浠ュ叆搴撲晶浼樺厛鐪� WrkDetl.boxType1=aws锛屽啀鐢ㄦ墭鐩樺彿 + instructionId/orderNo 鍋氬厹搴曘��
+ */
+ @Override
+ public boolean isMqttOriginWork(WrkMast wrkMast) {
+ if (wrkMast == null || wrkMast.getWrkNo() == null || wrkMast.getIoType() == null) {
+ return false;
+ }
+ if (STOW_WORK_IO_TYPES.contains(wrkMast.getIoType())) {
+ return isMqttOriginStowWork(wrkMast);
+ }
+ if (PICK_WORK_IO_TYPES.contains(wrkMast.getIoType())) {
+ return isMqttOriginPickWork(wrkMast);
+ }
+ return false;
+ }
+
+ /**
* 鍦ㄥ伐浣滄。鐪熸瀹屾垚鍚庤惤涓�鏉″緟鍙戝竷璁板綍銆�
* 浜嬪姟鍐呭彧鍐欏簱锛屼笉鐩存帴鍙� MQTT锛岄伩鍏嶄笟鍔℃彁浜ゅ拰缃戠粶鍙戦�佽�﹀悎銆�
*/
@@ -189,10 +221,15 @@
if (!iotDbConfigService.isMqttEnabled() || wrkMast == null || wrkMast.getWrkNo() == null) {
return;
}
- IotPublishRecord existed = iotPublishRecordService.selectOne(new EntityWrapper<IotPublishRecord>()
+ // MQTT 瀹屽伐涓婃姤鍙鐞� MQTT 鏉ユ簮鐨勪换鍔★紱ERP/open 鏉ユ簮鐨勪换鍔$敱 ERP 瀹屽伐涓婃姤璋冨害澶勭悊銆�
+ // 杩欐牱鍚屼竴涓畬宸ヤ簨浠朵笉浼氬悓鏃惰繘鍏� MQTT 鍜� ERP 涓ゆ潯涓婃姤閾捐矾銆�
+ if (!isMqttOriginWork(wrkMast)) {
+ return;
+ }
+ int existedCount = iotPublishRecordService.selectCount(new EntityWrapper<IotPublishRecord>()
.eq("direction", IotConstants.DIRECTION_OUTBOUND)
.eq("wrk_no", wrkMast.getWrkNo()));
- if (existed != null) {
+ if (existedCount > 0) {
return;
}
IotPublishRecord record = buildOutboundRecord(wrkMast);
@@ -238,7 +275,7 @@
param.setAnfme(1D);
param.setFull(1);
param.setLocId(preferredLocNo);
- param.setBoxType1("aws");
+ param.setBoxType1(MQTT_SOURCE_BOX_TYPE);
return param;
}
@@ -272,6 +309,118 @@
return record.getId();
}
+ private boolean isMqttOriginStowWork(WrkMast wrkMast) {
+ List<WrkDetl> wrkDetls = loadWrkDetls(wrkMast);
+ if (hasMqttSourceBoxType(wrkDetls)) {
+ return true;
+ }
+ if (hasProcessedInboundByWrkNo(wrkMast.getWrkNo(), IotConstants.MESSAGE_TYPE_STOW)) {
+ return true;
+ }
+
+ String containerId = resolveContainerId(wrkMast, wrkDetls);
+ if (Cools.isEmpty(containerId)) {
+ return false;
+ }
+ String bizNo = firstNonEmpty(wrkMast.getUserNo(), resolveOrderNo(wrkDetls));
+ return hasProcessedInboundByBusinessKey(IotConstants.MESSAGE_TYPE_STOW, containerId, bizNo);
+ }
+
+ private boolean isMqttOriginPickWork(WrkMast wrkMast) {
+ if (hasProcessedInboundByWrkNo(wrkMast.getWrkNo(), IotConstants.MESSAGE_TYPE_PICK)) {
+ return true;
+ }
+ List<WrkDetl> wrkDetls = loadWrkDetls(wrkMast);
+ String containerId = resolveContainerId(wrkMast, wrkDetls);
+ if (Cools.isEmpty(containerId)) {
+ return false;
+ }
+ String orderNo = firstNonEmpty(wrkMast.getUserNo(), resolveOrderNo(wrkDetls));
+ return hasProcessedInboundByBusinessKey(IotConstants.MESSAGE_TYPE_PICK, containerId, orderNo);
+ }
+
+ private List<WrkDetl> loadWrkDetls(WrkMast wrkMast) {
+ if (wrkMast == null || wrkMast.getWrkNo() == null) {
+ return Collections.emptyList();
+ }
+ List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
+ return wrkDetls == null ? Collections.<WrkDetl>emptyList() : wrkDetls;
+ }
+
+ private boolean hasMqttSourceBoxType(List<WrkDetl> wrkDetls) {
+ if (Cools.isEmpty(wrkDetls)) {
+ return false;
+ }
+ for (WrkDetl wrkDetl : wrkDetls) {
+ if (wrkDetl != null && MQTT_SOURCE_BOX_TYPE.equalsIgnoreCase(wrkDetl.getBoxType1())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ private boolean hasProcessedInboundByWrkNo(Integer wrkNo, String messageType) {
+ if (wrkNo == null || Cools.isEmpty(messageType)) {
+ return false;
+ }
+ return iotPublishRecordService.selectCount(new EntityWrapper<IotPublishRecord>()
+ .eq("direction", IotConstants.DIRECTION_INBOUND)
+ .eq("message_type", messageType)
+ .eq("process_status", IotConstants.PROCESS_STATUS_PROCESSED)
+ .eq("wrk_no", wrkNo)) > 0;
+ }
+
+ private boolean hasProcessedInboundByBusinessKey(String messageType, String containerId, String bizNo) {
+ if (Cools.isEmpty(messageType) || Cools.isEmpty(containerId) || Cools.isEmpty(bizNo)) {
+ return false;
+ }
+ // 鍑哄簱锛歰rder_no/reference_id 閫氬父鏄鍗曞彿锛涘叆搴擄細instruction_id 閫氬父浼氬悓姝ュ埌 WrkMast.userNo銆�
+ // 涓変釜瀛楁鍒嗗埆鏌ヨ锛岄伩鍏� MyBatis-Plus 鏃х増鏈鏉� OR 鏉′欢鍦ㄤ笉鍚屾暟鎹簱鏂硅█涓嬬敓鎴愬紓甯� SQL銆�
+ return hasProcessedInbound(messageType, containerId, "order_no", bizNo)
+ || hasProcessedInbound(messageType, containerId, "reference_id", bizNo)
+ || hasProcessedInbound(messageType, containerId, "instruction_id", bizNo);
+ }
+
+ private boolean hasProcessedInbound(String messageType, String containerId, String column, String value) {
+ return iotPublishRecordService.selectCount(new EntityWrapper<IotPublishRecord>()
+ .eq("direction", IotConstants.DIRECTION_INBOUND)
+ .eq("message_type", messageType)
+ .eq("process_status", IotConstants.PROCESS_STATUS_PROCESSED)
+ .eq("container_id", containerId)
+ .eq(column, value)) > 0;
+ }
+
+ private String resolveContainerId(WrkMast wrkMast, List<WrkDetl> wrkDetls) {
+ if (wrkMast != null && !Cools.isEmpty(wrkMast.getBarcode())) {
+ return wrkMast.getBarcode();
+ }
+ if (Cools.isEmpty(wrkDetls)) {
+ return null;
+ }
+ for (WrkDetl wrkDetl : wrkDetls) {
+ if (wrkDetl != null && !Cools.isEmpty(wrkDetl.getZpallet())) {
+ return wrkDetl.getZpallet();
+ }
+ }
+ return null;
+ }
+
+ private String resolveOrderNo(List<WrkDetl> wrkDetls) {
+ if (Cools.isEmpty(wrkDetls)) {
+ return null;
+ }
+ for (WrkDetl wrkDetl : wrkDetls) {
+ if (wrkDetl != null && !Cools.isEmpty(wrkDetl.getOrderNo())) {
+ return wrkDetl.getOrderNo();
+ }
+ }
+ return null;
+ }
+
+ private String firstNonEmpty(String first, String second) {
+ return Cools.isEmpty(first) ? second : first;
+ }
+
private void applyFeedback(IotPublishRecord record, String status, String errorCode, String errorMessage, Date now) {
IotFeedbackMessage feedbackMessage = new IotFeedbackMessage();
feedbackMessage.setInstructionId(record.getInstructionId());
--
Gitblit v1.9.1