| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | 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++) { |
| | |
| | | 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<>(); |
| | |
| | | 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) { |
| | |
| | | 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()); |
| | |
| | | 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) { |
| | |
| | | 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); |