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