cl
6 天以前 50393719d85fc30438456b0d0f065573a404fba5
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/CloudWmsNotifySchedule.java
@@ -7,6 +7,7 @@
import com.vincent.rsf.server.api.controller.erp.params.InOutResultReportParam;
import com.vincent.rsf.server.api.controller.erp.params.InventoryAdjustReportParam;
import com.vincent.rsf.server.api.service.CloudWmsReportService;
import com.vincent.rsf.server.manager.constant.CloudWmsInoutReportMode;
import com.vincent.rsf.server.manager.entity.CloudWmsNotifyLog;
import com.vincent.rsf.server.manager.service.CloudWmsNotifyLogService;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
@@ -77,6 +78,21 @@
        return s != null && s != 0;
    }
    /** CLOUD_WMS_INOUT_REPORT_MODE,缺省 immediate */
    private String resolveInOutReportMode() {
        try {
            Config cfg = configService.getCachedOrLoad(GlobalConfigCode.CLOUD_WMS_INOUT_REPORT_MODE);
            if (cfg != null && cfg.getVal() != null) {
                String v = cfg.getVal().trim();
                if (!v.isEmpty()) {
                    return v.toLowerCase();
                }
            }
        } catch (Exception ignored) {
        }
        return CloudWmsInoutReportMode.IMMEDIATE;
    }
    /** 同单多条合并上报 */
    private void dispatchPending(List<CloudWmsNotifyLog> pending) {
        int rowsReported = 0;
@@ -85,6 +101,11 @@
        log.debug("云仓上报派发:读取上报类型配置");
        String rtInOut = cloudWmsNotifyLogService.getReportTypeInOutResult();
        log.debug("云仓上报派发:上报类型={},读配置耗时 {} ms", rtInOut, System.currentTimeMillis() - tCfg);
        String inoutMode = resolveInOutReportMode();
        boolean singleRowOnly = CloudWmsInoutReportMode.SINGLE.equals(inoutMode);
        if (singleRowOnly) {
            log.debug("云仓上报派发:入出库模式 single,不合并同单多条");
        }
        LinkedHashMap<String, List<CloudWmsNotifyLog>> inOutGroups = new LinkedHashMap<>();
        int n = pending.size();
        for (int i = 0; i < n; i++) {
@@ -99,7 +120,9 @@
            if (key == null) {
                continue;
            }
            inOutGroups.computeIfAbsent(key, k -> new ArrayList<>()).add(row);
            if (!singleRowOnly) {
                inOutGroups.computeIfAbsent(key, k -> new ArrayList<>()).add(row);
            }
        }
        log.debug("云仓上报派发:入出库可分组键 {} 个", inOutGroups.size());
        Set<Long> done = new HashSet<>();
@@ -127,6 +150,19 @@
                    continue;
                }
                log.debug("云仓上报派发:无合并键单条 id={}", rid);
                if (safeProcessOne(row)) {
                    rowsReported++;
                    if (rid != null) {
                        done.add(rid);
                    }
                }
                continue;
            }
            if (singleRowOnly) {
                if (isSendingBusy(row)) {
                    continue;
                }
                log.debug("云仓上报派发:single 模式单条 id={}", rid);
                if (safeProcessOne(row)) {
                    rowsReported++;
                    if (rid != null) {
@@ -244,13 +280,11 @@
                updateAfterNotify(row, mergedBody, res, nextRetry, now, row.getMaxRetryCount());
            }
        } catch (FeignException e) {
            String responseBody = e.contentUTF8();
            String fullMsg = "status=" + e.status() + ",message=" + e.getMessage()
                    + (responseBody == null || responseBody.isEmpty() ? "" : ",responseBody=" + responseBody);
            log.warn("云仓上报同批合并请求失败:{}", fullMsg);
            String err = feignErrorSummary(e);
            log.warn("云仓上报同批合并请求失败:{}", err);
            for (CloudWmsNotifyLog row : group) {
                int nextRetry = (row.getRetryCount() == null ? 0 : row.getRetryCount()) + 1;
                setFailResult(row, mergedBody, "请求异常: " + fullMsg, nextRetry, now, row.getMaxRetryCount());
                setFailResult(row, mergedBody, "请求异常: " + err, nextRetry, now, row.getMaxRetryCount());
            }
        } catch (Exception e) {
            log.warn("云仓上报同批合并请求失败:{}", e.getMessage());
@@ -259,6 +293,15 @@
                setFailResult(row, mergedBody, "请求异常: " + e.getMessage(), nextRetry, now, row.getMaxRetryCount());
            }
        }
    }
    /** 打印全部返回日志 */
    private static String feignErrorSummary(FeignException e) {
        String body = e.contentUTF8();
        if (body != null && !body.trim().isEmpty()) {
            return "status=" + e.status() + ",responseBody=" + body.trim();
        }
        return "status=" + e.status() + ",message=" + e.getMessage();
    }
    private static List<Long> idsOf(List<CloudWmsNotifyLog> group) {
@@ -321,11 +364,9 @@
            log.warn("云仓上报请求体反序列化失败,id={}:{}", logRecord.getId(), e.getMessage());
            setFailResult(logRecord, requestBody, "反序列化失败: " + e.getMessage(), nextRetry, now, effectiveMaxRetry);
        } catch (FeignException e) {
            String responseBody = e.contentUTF8();
            String fullMsg = "status=" + e.status() + ",message=" + e.getMessage()
                    + (responseBody == null || responseBody.isEmpty() ? "" : ",responseBody=" + responseBody);
            log.warn("云仓上报请求失败,id={},bizRef={}:{}", logRecord.getId(), logRecord.getBizRef(), fullMsg);
            setFailResult(logRecord, requestBody, "请求异常: " + fullMsg, nextRetry, now, effectiveMaxRetry);
            String err = feignErrorSummary(e);
            log.warn("云仓上报请求失败,id={},bizRef={}:{}", logRecord.getId(), logRecord.getBizRef(), err);
            setFailResult(logRecord, requestBody, "请求异常: " + err, nextRetry, now, effectiveMaxRetry);
        } catch (Exception e) {
            log.warn("云仓上报请求失败,id={},bizRef={}:{}", logRecord.getId(), logRecord.getBizRef(), e.getMessage());
            setFailResult(logRecord, requestBody, "请求异常: " + e.getMessage(), nextRetry, now, effectiveMaxRetry);