From 54794979fc9ad0aacf21f4e47a84c24e8f675251 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期四, 07 五月 2026 18:15:41 +0800
Subject: [PATCH] 重发按钮权限

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java |  143 +++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 125 insertions(+), 18 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java
index 5e266bb..d7229ab 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CloudWmsFeedbackResendServiceImpl.java
@@ -1,11 +1,15 @@
 package com.vincent.rsf.server.manager.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.server.api.controller.erp.params.InOutResultBatchPayload;
 import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam;
 import com.vincent.rsf.server.manager.entity.AsnOrderLog;
 import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog;
+import com.vincent.rsf.server.manager.enums.OrderType;
 import com.vincent.rsf.server.manager.service.AsnOrderLogService;
 import com.vincent.rsf.server.manager.service.CloudWmsFeedbackResendService;
 import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
@@ -17,7 +21,7 @@
 import java.util.*;
 
 /**
- * 浠庡巻鍙蹭簯浠撲笂鎶ヨ褰曚腑鍙栥�屾渶鏂颁竴鏉°�嶆寜鏄庣粏缁村害鍘婚噸鍚庯紝澶嶅埗璇锋眰浣撳啓鍏ュ緟鍙戦�侀槦鍒椼��
+ * 鍘嗗彶鍗曡Е鍙戜簯浠撳叆鍑哄簱涓婃姤锛氫紭鍏堟斁琛岃鍗曟殏缂撳緟鍔烇紱鑻ユ棤鍒欎粠鍘嗗彶浜戜粨涓婃姤璁板綍澶嶅埗璇锋眰浣撳叆闃熴��
  */
 @Slf4j
 @Service
@@ -33,7 +37,7 @@
     private ObjectMapper objectMapper;
 
     @Override
-    public R resendInOutFeedbackByAsnOrderLogId(Long asnOrderLogId) {
+    public R submitInOutCloudWmsByAsnOrderLogId(Long asnOrderLogId) {
         if (asnOrderLogId == null) {
             return R.error("鍙傛暟涓嶈兘涓虹┖");
         }
@@ -43,8 +47,18 @@
         }
         String code = orderLog.getCode();
         if (StringUtils.isBlank(code)) {
-            return R.error("鍗曟嵁鍙蜂负绌猴紝鏃犳硶閲嶅彂");
+            return R.error("鍗曟嵁鍙蜂负绌�");
         }
+        boolean inbound = inboundFromOrderType(orderLog.getType());
+        R flushR = cloudWmsNotifyLogService.manualFlushToNotifyByOrderCode(code.trim(), inbound);
+        Object flushCode = flushR.get("code");
+        if (flushCode instanceof Number && ((Number) flushCode).intValue() == 200) {
+            return flushR;
+        }
+        return enqueueFromHistoricalNotifyLogs(asnOrderLogId, orderLog, code);
+    }
+
+    private R enqueueFromHistoricalNotifyLogs(Long asnOrderLogId, AsnOrderLog orderLog, String code) {
         String reportType = cloudWmsNotifyLogService.getReportTypeInOutResult();
         LambdaQueryWrapper<CloudWmsNotifyLog> qw = new LambdaQueryWrapper<CloudWmsNotifyLog>()
                 .eq(CloudWmsNotifyLog::getReportType, reportType)
@@ -59,23 +73,35 @@
             if (StringUtils.isBlank(row.getRequestBody())) {
                 continue;
             }
-            InOutResultReportParam p;
             try {
-                p = objectMapper.readValue(row.getRequestBody(), InOutResultReportParam.class);
+                JsonNode root = objectMapper.readTree(row.getRequestBody());
+                if (root.has("lines") && root.get("lines").isArray() && root.get("lines").size() > 0) {
+                    InOutResultBatchPayload batch = objectMapper.readValue(row.getRequestBody(), InOutResultBatchPayload.class);
+                    if (batch.getLines() == null || batch.getLines().isEmpty()) {
+                        continue;
+                    }
+                    InOutResultReportParam first = batch.getLines().get(0);
+                    if (!code.equals(first.getOrderNo()) || !matchOrderType(orderLog.getType(), first.getInbound())) {
+                        continue;
+                    }
+                    latestByLine.putIfAbsent("batch_" + row.getId(), row);
+                    continue;
+                }
+                InOutResultReportParam p = objectMapper.readValue(row.getRequestBody(), InOutResultReportParam.class);
+                if (p == null || !code.equals(p.getOrderNo())) {
+                    continue;
+                }
+                if (!matchOrderType(orderLog.getType(), p.getInbound())) {
+                    continue;
+                }
+                String sig = lineSignature(p);
+                latestByLine.putIfAbsent(sig, row);
             } catch (Exception e) {
                 continue;
             }
-            if (p == null || !code.equals(p.getOrderNo())) {
-                continue;
-            }
-            if (!matchOrderType(orderLog.getType(), p.getInbound())) {
-                continue;
-            }
-            String sig = lineSignature(p);
-            latestByLine.putIfAbsent(sig, row);
         }
         if (latestByLine.isEmpty()) {
-            return R.error("鏈壘鍒拌鍗曞彿瀵瑰簲鐨勪簯浠撳叆鍑哄簱涓婃姤璁板綍锛屾棤娉曢噸鍙�");
+            return R.error("鏈壘鍒拌鍗曞彿瀵瑰簲鐨勪簯浠撳叆鍑哄簱涓婃姤璁板綍");
         }
         Date now = new Date();
         int n = 0;
@@ -87,13 +113,94 @@
                     .setRetryCount(0)
                     .setBizRef("manualResend,asnOrderLogId=" + asnOrderLogId + ",fromNotifyLogId=" + src.getId() + ",orderNo=" + code)
                     .setCreateTime(now)
-                    .setUpdateTime(now);
-            cloudWmsNotifyLogService.fillFromConfig(copy);
-            if (cloudWmsNotifyLogService.save(copy)) {
+                    .setUpdateTime(now)
+                    .setSendHold(0)
+                    .setSending(0);
+            if (StringUtils.isNotBlank(src.getSourceOrderNo())) {
+                copy.setSourceOrderNo(src.getSourceOrderNo())
+                        .setInboundFlag(src.getInboundFlag())
+                        .setWareHouseCode(src.getWareHouseCode());
+            } else {
+                fillInOutRoutingFromBody(copy, src.getRequestBody());
+            }
+            if (saveOrRefreshResendRow(copy, now)) {
                 n++;
             }
         }
-        return R.ok("宸插姞鍏ヤ簯浠撻噸鍙戦槦鍒� " + n + " 鏉★紝灏嗙敱瀹氭椂浠诲姟鍙戦��").add(n);
+        return R.ok("宸插姞鍏ヤ簯浠撲笂鎶ラ槦鍒� " + n + " 鏉★紝灏嗙敱瀹氭椂浠诲姟鍙戦��").add(n);
+    }
+
+    private static boolean inboundFromOrderType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return true;
+        }
+        return OrderType.ORDER_IN.type.equalsIgnoreCase(type.trim());
+    }
+
+    /**
+     * 鍚岃姹備綋宸叉湁寰呭彂閫佹垨澶辫触璁板綍锛氭洿鏂颁负鍙嚜鍔ㄨ皟搴︼紱鍚﹀垯鎻掑叆鏂板緟鍔炪��
+     */
+    private boolean saveOrRefreshResendRow(CloudWmsNotifyLog copy, Date now) {
+        int pending = cloudWmsNotifyLogService.getNotifyStatusPending();
+        int fail = cloudWmsNotifyLogService.getNotifyStatusFail();
+        LambdaQueryWrapper<CloudWmsNotifyLog> existQw = new LambdaQueryWrapper<CloudWmsNotifyLog>()
+                .eq(CloudWmsNotifyLog::getReportType, copy.getReportType())
+                .eq(CloudWmsNotifyLog::getRequestBody, copy.getRequestBody())
+                .in(CloudWmsNotifyLog::getNotifyStatus, pending, fail)
+                .orderByDesc(CloudWmsNotifyLog::getId)
+                .last("LIMIT 1");
+        CloudWmsNotifyLog existing = cloudWmsNotifyLogService.getOne(existQw);
+        if (existing != null && existing.getId() != null) {
+            CloudWmsNotifyLog row = new CloudWmsNotifyLog().setId(existing.getId());
+            cloudWmsNotifyLogService.fillFromConfig(row);
+            LambdaUpdateWrapper<CloudWmsNotifyLog> u = new LambdaUpdateWrapper<CloudWmsNotifyLog>()
+                    .eq(CloudWmsNotifyLog::getId, existing.getId())
+                    .set(CloudWmsNotifyLog::getNotifyStatus, row.getNotifyStatus())
+                    .set(CloudWmsNotifyLog::getMaxRetryCount, row.getMaxRetryCount())
+                    .set(CloudWmsNotifyLog::getRetryIntervalSeconds, row.getRetryIntervalSeconds())
+                    .set(CloudWmsNotifyLog::getSendHold, 0)
+                    .set(CloudWmsNotifyLog::getSending, 0)
+                    .set(CloudWmsNotifyLog::getRetryCount, 0)
+                    .set(CloudWmsNotifyLog::getBizRef, copy.getBizRef())
+                    .set(CloudWmsNotifyLog::getUpdateTime, now)
+                    .set(CloudWmsNotifyLog::getLastNotifyTime, null)
+                    .set(CloudWmsNotifyLog::getLastResponseBody, null);
+            if (StringUtils.isNotBlank(copy.getSourceOrderNo())) {
+                u.set(CloudWmsNotifyLog::getSourceOrderNo, copy.getSourceOrderNo())
+                        .set(CloudWmsNotifyLog::getInboundFlag, copy.getInboundFlag())
+                        .set(CloudWmsNotifyLog::getWareHouseCode, copy.getWareHouseCode());
+            }
+            return cloudWmsNotifyLogService.update(u);
+        }
+        cloudWmsNotifyLogService.fillFromConfig(copy);
+        return cloudWmsNotifyLogService.save(copy);
+    }
+
+    private void fillInOutRoutingFromBody(CloudWmsNotifyLog copy, String body) {
+        if (StringUtils.isBlank(body)) {
+            return;
+        }
+        try {
+            JsonNode root = objectMapper.readTree(body);
+            if (root.has("lines") && root.get("lines").isArray() && root.get("lines").size() > 0) {
+                InOutResultReportParam first = objectMapper.treeToValue(root.get("lines").get(0), InOutResultReportParam.class);
+                if (first != null) {
+                    boolean inb = first.getInbound() == null || Boolean.TRUE.equals(first.getInbound());
+                    copy.setSourceOrderNo(first.getOrderNo())
+                            .setInboundFlag(inb ? 1 : 0)
+                            .setWareHouseCode(first.getWareHouseId());
+                }
+                return;
+            }
+            InOutResultReportParam p = objectMapper.readValue(body, InOutResultReportParam.class);
+            if (p != null) {
+                boolean inb = p.getInbound() == null || Boolean.TRUE.equals(p.getInbound());
+                copy.setSourceOrderNo(p.getOrderNo())
+                        .setInboundFlag(inb ? 1 : 0)
+                        .setWareHouseCode(p.getWareHouseId());
+            }
+        } catch (Exception ignored) {
+        }
     }
 
     private static boolean matchOrderType(String asnType, Boolean inbound) {

--
Gitblit v1.9.1