| | |
| | | @Service |
| | | public class CloudWmsReportServiceImpl implements CloudWmsReportService { |
| | | |
| | | /** 云仓回馈:通知单 orgNo 为空时的默认组织 */ |
| | | private static final String DEFAULT_CLOUD_ORG_NO = "1"; |
| | | /** 云仓回馈:通知单 inWarehouseNo / outWarehouseNo 为空时的默认仓编码 */ |
| | | private static final String DEFAULT_CLOUD_WH_NO = "101"; |
| | | |
| | | @Autowired |
| | | private RemotesInfoProperties erpApi; |
| | | |
| | |
| | | @Override |
| | | public Map<String, Object> syncMatnrsToCloud(Object body) { |
| | | if (!isCloudWmsConfigured()) { |
| | | log.warn("ErpApi(云仓WMS) 未配置 host,跳过物料基础信息同步"); |
| | | log.warn("ErpApi(云仓WMS) 未配置 host/base-url,跳过物料基础信息同步"); |
| | | return stubSuccess("云仓地址未配置,未实际同步"); |
| | | } |
| | | return cloudWmsErpFeignClient.syncMatnrs(body != null ? body : new HashMap<>()); |
| | |
| | | return resultMap(400, "参数不能为空", null); |
| | | } |
| | | if (!isCloudWmsConfigured()) { |
| | | log.warn("ErpApi(云仓WMS) 未配置 host,跳过 9.1 入/出库结果上报,订单:{}", param.getOrderNo()); |
| | | log.warn("ErpApi(云仓WMS) 未配置 host/base-url,跳过 9.1 入/出库结果上报,订单:{}", param.getOrderNo()); |
| | | return stubSuccess("云仓地址未配置,未实际上报"); |
| | | } |
| | | String err = validateDapBase(); |
| | | String err = validateDapBaseForInOut(param); |
| | | if (err != null) { |
| | | return resultMap(400, err, null); |
| | | } |
| | |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> reportInOutResults(List<InOutResultReportParam> lines) { |
| | | if (lines == null || lines.isEmpty()) { |
| | | return resultMap(400, "明细不能为空", null); |
| | | } |
| | | if (!isCloudWmsConfigured()) { |
| | | log.warn("ErpApi(云仓WMS) 未配置 host/base-url,跳过 9.1 入出库合并上报"); |
| | | return stubSuccess("云仓地址未配置,未实际上报"); |
| | | } |
| | | InOutResultReportParam first = lines.get(0); |
| | | boolean inbound = first.getInbound() == null || Boolean.TRUE.equals(first.getInbound()); |
| | | for (InOutResultReportParam param : lines) { |
| | | String err = validateDapBaseForInOut(param); |
| | | if (err != null) { |
| | | return resultMap(400, err, null); |
| | | } |
| | | boolean rowIn = param.getInbound() == null || Boolean.TRUE.equals(param.getInbound()); |
| | | if (rowIn != inbound) { |
| | | return resultMap(400, "合并上报须同为入库或同为出库", null); |
| | | } |
| | | } |
| | | List<DapIlcwmsCompletionLine> data = new ArrayList<>(lines.size()); |
| | | for (InOutResultReportParam param : lines) { |
| | | data.add(buildInOutLine(param, inbound)); |
| | | } |
| | | DapIlcwmsCompletionRequest req = new DapIlcwmsCompletionRequest().setData(data); |
| | | logOutboundPayload("IN_OUT_RESULT_BATCH", inbound ? "stockInCompleted" : "stockOutCompleted", req); |
| | | Map<String, Object> raw = inbound |
| | | ? cloudWmsErpFeignClient.cusInventoryCompletionReport(req) |
| | | : cloudWmsErpFeignClient.cusOutboundCompletionReport(req); |
| | | return DapIlcwmsResponseNormalizer.toNotifyFormat(raw); |
| | | } |
| | | |
| | | @Override |
| | | public Map<String, Object> reportInventoryAdjust(InventoryAdjustReportParam param) { |
| | | if (param == null) { |
| | | return resultMap(400, "参数不能为空", null); |
| | | } |
| | | if (!isCloudWmsConfigured()) { |
| | | log.warn("ErpApi(云仓WMS) 未配置 host,跳过 9.2 库存调整上报,物料:{}", param.getMatNr()); |
| | | log.warn("ErpApi(云仓WMS) 未配置 host/base-url,跳过 9.2 库存调整上报,物料:{}", param.getMatNr()); |
| | | return stubSuccess("云仓地址未配置,未实际上报"); |
| | | } |
| | | String err = validateDapBase(); |
| | | if (err != null) { |
| | | return resultMap(400, err, null); |
| | | } |
| | | Integer changeType = param.getChangeType(); |
| | | if (changeType == null) { |
| | |
| | | : DapIlcwmsResponseNormalizer.toNotifyFormatFlexible(raw); |
| | | } |
| | | |
| | | private String validateDapBaseForInOut(InOutResultReportParam param) { |
| | | if (param != null && StringUtils.isBlank(param.getUnitNo())) { |
| | | return "unitNo 不能为空"; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private DapIlcwmsCompletionLine buildInOutLine(InOutResultReportParam param, boolean inbound) { |
| | | RemotesInfoProperties.Dap dap = erpApi.getDap(); |
| | | CloudMatnrParts matnrParts = parseCloudMatnr(param.getMatNr()); |
| | | String docType = StringUtils.isNotBlank(param.getWkType()) |
| | | ? param.getWkType() |
| | | : (inbound ? "IN" : "OUT"); |
| | | String unitNo = StringUtils.isNotBlank(param.getUnitNo()) ? param.getUnitNo() : "PCS"; |
| | | String unitNo = StringUtils.trimToEmpty(param.getUnitNo()); |
| | | String orgNoLine = StringUtils.isNotBlank(param.getOrgNo()) ? param.getOrgNo().trim() : DEFAULT_CLOUD_ORG_NO; |
| | | String docWh = StringUtils.trimToNull(param.getDocWarehouseNo()); |
| | | String inWhLine = StringUtils.isNotBlank(param.getInWarehouseNo()) ? param.getInWarehouseNo().trim() : DEFAULT_CLOUD_WH_NO; |
| | | String outWhLine = StringUtils.isNotBlank(param.getOutWarehouseNo()) ? param.getOutWarehouseNo().trim() : DEFAULT_CLOUD_WH_NO; |
| | | DapIlcwmsCompletionLine line = new DapIlcwmsCompletionLine() |
| | | .setOrgNo(dap.getOrgNo()) |
| | | .setOrgNo(orgNoLine) |
| | | .setDocWarehouseNo(docWh) |
| | | .setDocType(docType) |
| | | .setDocNo(param.getOrderNo()) |
| | | .setDocSeqNo(StringUtils.isNotBlank(param.getLineId()) ? param.getLineId() : "1") |
| | |
| | | .setCombinationLotNo(matnrParts.getCombinationLotNo()) |
| | | .setBarcode(matnrParts.getBarcode()); |
| | | if (inbound) { |
| | | line.setInWarehouseNo(param.getWareHouseId()).setInCellNo(param.getLocId()); |
| | | line.setInWarehouseNo(inWhLine).setInCellNo(param.getLocId()); |
| | | } else { |
| | | line.setOutWarehouseNo(param.getWareHouseId()).setOutCellNo(param.getLocId()); |
| | | line.setOutWarehouseNo(outWhLine).setOutCellNo(param.getLocId()); |
| | | } |
| | | return line; |
| | | } |
| | |
| | | * @param docSeqOverride 非空时用作项次(移库第二行等) |
| | | */ |
| | | private DapIlcwmsCompletionLine buildAdjustLine(InventoryAdjustReportParam param, boolean fillIn, boolean fillOut, String docSeqOverride) { |
| | | RemotesInfoProperties.Dap dap = erpApi.getDap(); |
| | | String docType = resolveAdjustDocType(param); |
| | | String docNo = StringUtils.isNotBlank(param.getDocNo()) ? param.getDocNo() : "ADJ"; |
| | | String docSeq = docSeqOverride != null ? docSeqOverride |
| | |
| | | String unit = StringUtils.isNotBlank(param.getUnitNo()) ? param.getUnitNo() : "PCS"; |
| | | CloudMatnrParts matnrParts = parseCloudMatnr(param.getMatNr()); |
| | | DapIlcwmsCompletionLine line = new DapIlcwmsCompletionLine() |
| | | .setOrgNo(dap.getOrgNo()) |
| | | .setOrgNo(DEFAULT_CLOUD_ORG_NO) |
| | | .setDocType(docType) |
| | | .setDocNo(docNo) |
| | | .setDocSeqNo(docSeq) |
| | |
| | | } |
| | | } |
| | | |
| | | private String validateDapBase() { |
| | | RemotesInfoProperties.Dap d = erpApi.getDap(); |
| | | if (d == null || StringUtils.isBlank(d.getOrgNo())) { |
| | | return "未配置 platform.erp.dap.org-no"; |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | private boolean isCloudWmsConfigured() { |
| | | String host = erpApi.getHost(); |
| | | return host != null && !host.trim().isEmpty(); |
| | | if (host != null && !host.trim().isEmpty()) { |
| | | return true; |
| | | } |
| | | String baseUrl = erpApi.getBaseUrl(); |
| | | return baseUrl != null && !baseUrl.trim().isEmpty(); |
| | | } |
| | | |
| | | private Map<String, Object> stubSuccess(String msg) { |