From 2a34b52125d5fc356d65ee1e8912845dd601d4e3 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期五, 01 五月 2026 12:52:02 +0800
Subject: [PATCH] 多加入参数和修改规则
---
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/CloudWmsReportServiceImpl.java | 286 ++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 260 insertions(+), 26 deletions(-)
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/CloudWmsReportServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/CloudWmsReportServiceImpl.java
index ca1da5c..3adaa1b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/CloudWmsReportServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/CloudWmsReportServiceImpl.java
@@ -1,44 +1,49 @@
package com.vincent.rsf.server.api.service.impl;
import com.vincent.rsf.server.api.config.RemotesInfoProperties;
+import com.vincent.rsf.server.api.controller.erp.params.DapIlcwmsCompletionLine;
+import com.vincent.rsf.server.api.controller.erp.params.DapIlcwmsCompletionRequest;
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.feign.CloudWmsErpFeignClient;
+import com.vincent.rsf.server.api.integration.dap.DapIlcwmsResponseNormalizer;
import com.vincent.rsf.server.api.service.CloudWmsReportService;
+import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
/**
- * 绔嬪簱渚ц姹備簯浠擄細鍏�/鍑哄簱缁撴灉涓婃姤锛�9.1锛夈�佸簱瀛樿皟鏁翠富鍔ㄤ笂鎶ワ紙9.2锛夈�佺墿鏂欏熀纭�淇℃伅鍚屾銆�
- * 浣跨敤 OpenFeign 璋冪敤锛涘彲閫� HttpEntity(RestTemplate) 鏂瑰紡宸叉敞閲婁繚鐣欍��
+ * 绔嬪簱渚ц姹備簯浠擄細ICusStockService 鍏ュ簱/鍑哄簱/璋冩嫧瀹屾垚鍙嶉锛�9.2 澧炲噺璋冩暣浠嶄负 /api/report/inventoryAdjust锛屾姤鏂囧悓涓� {data:[]}銆�
*/
@Slf4j
@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;
@Autowired
- private RemotesInfoProperties.ApiInfo erpApiInfo;
-
- @Autowired
private CloudWmsErpFeignClient cloudWmsErpFeignClient;
-
- /**
- * 鍙�夛細鏀圭敤 HttpEntity(RestTemplate) 璋冪敤浜戜粨鏃跺惎鐢ㄣ��
- */
- // @Autowired
- // private RestTemplate restTemplate;
+ @Autowired
+ private ObjectMapper objectMapper;
@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<>());
@@ -50,10 +55,54 @@
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("浜戜粨鍦板潃鏈厤缃紝鏈疄闄呬笂鎶�");
}
- return cloudWmsErpFeignClient.reportInOutResult(param);
+ String err = validateDapBaseForInOut(param);
+ if (err != null) {
+ return resultMap(400, err, null);
+ }
+ boolean inbound = param.getInbound() == null || Boolean.TRUE.equals(param.getInbound());
+ DapIlcwmsCompletionRequest req = new DapIlcwmsCompletionRequest()
+ .setData(Collections.singletonList(buildInOutLine(param, inbound)));
+ logOutboundPayload("IN_OUT_RESULT", inbound ? "stockInCompleted" : "stockOutCompleted", req);
+ Map<String, Object> raw = inbound
+ ? cloudWmsErpFeignClient.cusInventoryCompletionReport(req)
+ : cloudWmsErpFeignClient.cusOutboundCompletionReport(req);
+ return DapIlcwmsResponseNormalizer.toNotifyFormat(raw);
+ }
+
+ @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
@@ -62,15 +111,200 @@
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("浜戜粨鍦板潃鏈厤缃紝鏈疄闄呬笂鎶�");
}
- return cloudWmsErpFeignClient.reportInventoryAdjust(param);
+ Integer changeType = param.getChangeType();
+ if (changeType == null) {
+ return resultMap(400, "changeType 涓嶈兘涓虹┖", null);
+ }
+ DapIlcwmsCompletionRequest req = new DapIlcwmsCompletionRequest();
+ if (changeType == 3) {
+ String baseSeq = StringUtils.isNotBlank(param.getDocSeqNo()) ? param.getDocSeqNo() : "1";
+ List<DapIlcwmsCompletionLine> lines = new ArrayList<>(2);
+ lines.add(buildAdjustLine(param, false, true, baseSeq + "-O"));
+ lines.add(buildAdjustLine(param, true, false, baseSeq + "-I"));
+ req.setData(lines);
+ } else if (changeType == 1) {
+ req.setData(Collections.singletonList(buildAdjustLine(param, true, false, null)));
+ } else if (changeType == 2) {
+ req.setData(Collections.singletonList(buildAdjustLine(param, false, true, null)));
+ } else {
+ return resultMap(400, "涓嶆敮鎸佺殑 changeType锛�" + changeType, null);
+ }
+ logOutboundPayload("INVENTORY_ADJUST", changeType == 3 ? "stockTransferCompleted" : "reportInventoryAdjust", req);
+ Map<String, Object> raw = changeType == 3
+ ? cloudWmsErpFeignClient.stockTransferCompleted(req)
+ : cloudWmsErpFeignClient.reportInventoryAdjust(req);
+ return changeType == 3
+ ? DapIlcwmsResponseNormalizer.toNotifyFormat(raw)
+ : 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) {
+ CloudMatnrParts matnrParts = parseCloudMatnr(param.getMatNr());
+ String docType = StringUtils.isNotBlank(param.getWkType())
+ ? param.getWkType()
+ : (inbound ? "IN" : "OUT");
+ 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(orgNoLine)
+ .setDocWarehouseNo(docWh)
+ .setDocType(docType)
+ .setDocNo(param.getOrderNo())
+ .setDocSeqNo(StringUtils.isNotBlank(param.getLineId()) ? param.getLineId() : "1")
+ // 鎸変簯浠撹鍒欐媶鍒嗙墿鏂欑紪鐮�
+ .setItemNo(matnrParts.getItemNo())
+ .setQty(parseQty(param.getQty()))
+ .setUnitNo(unitNo)
+ .setCombinationLotNo(matnrParts.getCombinationLotNo())
+ .setBarcode(matnrParts.getBarcode());
+ if (inbound) {
+ line.setInWarehouseNo(inWhLine).setInCellNo(param.getLocId());
+ } else {
+ line.setOutWarehouseNo(outWhLine).setOutCellNo(param.getLocId());
+ }
+ return line;
+ }
+
+ /**
+ * @param fillIn 鏄惁濉叆搴撳偍浣�
+ * @param fillOut 鏄惁濉嚭搴撳偍浣�
+ * @param docSeqOverride 闈炵┖鏃剁敤浣滈」娆★紙绉诲簱绗簩琛岀瓑锛�
+ */
+ private DapIlcwmsCompletionLine buildAdjustLine(InventoryAdjustReportParam param, boolean fillIn, boolean fillOut, String docSeqOverride) {
+ String docType = resolveAdjustDocType(param);
+ String docNo = StringUtils.isNotBlank(param.getDocNo()) ? param.getDocNo() : "ADJ";
+ String docSeq = docSeqOverride != null ? docSeqOverride
+ : (StringUtils.isNotBlank(param.getDocSeqNo()) ? param.getDocSeqNo() : "1");
+ String unit = StringUtils.isNotBlank(param.getUnitNo()) ? param.getUnitNo() : "PCS";
+ CloudMatnrParts matnrParts = parseCloudMatnr(param.getMatNr());
+ DapIlcwmsCompletionLine line = new DapIlcwmsCompletionLine()
+ .setOrgNo(DEFAULT_CLOUD_ORG_NO)
+ .setDocType(docType)
+ .setDocNo(docNo)
+ .setDocSeqNo(docSeq)
+ // 鎸変簯浠撹鍒欐媶鍒嗙墿鏂欑紪鐮�
+ .setItemNo(matnrParts.getItemNo())
+ .setQty(parseQty(param.getQty()))
+ .setUnitNo(unit)
+ .setCombinationLotNo(matnrParts.getCombinationLotNo())
+ .setBarcode(matnrParts.getBarcode());
+ if (fillIn) {
+ line.setInWarehouseNo(param.getWareHouseId());
+ line.setInCellNo(StringUtils.isNotBlank(param.getTargetLocId()) ? param.getTargetLocId() : param.getSourceLocId());
+ }
+ if (fillOut) {
+ line.setOutWarehouseNo(param.getWareHouseId());
+ line.setOutCellNo(StringUtils.isNotBlank(param.getSourceLocId()) ? param.getSourceLocId() : param.getTargetLocId());
+ }
+ return line;
+ }
+
+ private static String resolveAdjustDocType(InventoryAdjustReportParam param) {
+ if (StringUtils.isNotBlank(param.getDocType())) {
+ return param.getDocType();
+ }
+ Integer ct = param.getChangeType();
+ if (ct != null && ct == 2) {
+ return "OUT";
+ }
+ if (ct != null && ct == 3) {
+ return "ADJ";
+ }
+ return "IN";
+ }
+
+ // private static String resolveBarcode(InOutResultReportParam param) {
+ // if (StringUtils.isNotBlank(param.getBarcode())) {
+ // return param.getBarcode();
+ // }
+ // if (StringUtils.isNotBlank(param.getPalletId())) {
+ // return param.getPalletId();
+ // }
+ // if (param.getMatNr() != null && param.getLocId() != null) {
+ // return param.getMatNr() + ":" + param.getLocId();
+ // }
+ // return param.getMatNr();
+ // }
+ //
+ // private static String resolveAdjustBarcode(InventoryAdjustReportParam param) {
+ // if (StringUtils.isNotBlank(param.getBarcode())) {
+ // return param.getBarcode();
+ // }
+ // if (StringUtils.isNotBlank(param.getPalletId())) {
+ // return param.getPalletId();
+ // }
+ // return param.getMatNr();
+ // }
+
+ /**
+ * 浜戜粨鍥炴姤瀛楁鏄犲皠锛氫笁娈靛紡鍙栧墠涓ゆ锛宐arcode 淇濈暀鍘熶覆銆�
+ */
+ private static CloudMatnrParts parseCloudMatnr(String matNr) {
+ if (StringUtils.isBlank(matNr)) {
+ return new CloudMatnrParts(null, null, null);
+ }
+ String[] arr = matNr.split("#", -1);
+ if (arr.length >= 3) {
+ return new CloudMatnrParts(arr[0], arr[1], matNr);
+ }
+ return new CloudMatnrParts(matNr, null, matNr);
+ }
+
+ private static class CloudMatnrParts {
+ private final String itemNo;
+ private final String combinationLotNo;
+ private final String barcode;
+
+ private CloudMatnrParts(String itemNo, String combinationLotNo, String barcode) {
+ this.itemNo = itemNo;
+ this.combinationLotNo = combinationLotNo;
+ this.barcode = barcode;
+ }
+
+ public String getItemNo() {
+ return itemNo;
+ }
+
+ public String getCombinationLotNo() {
+ return combinationLotNo;
+ }
+
+ public String getBarcode() {
+ return barcode;
+ }
+ }
+
+ private static Double parseQty(String q) {
+ if (StringUtils.isBlank(q)) {
+ return 0d;
+ }
+ try {
+ return Double.parseDouble(q.trim());
+ } catch (NumberFormatException e) {
+ return 0d;
+ }
}
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) {
@@ -87,13 +321,13 @@
return map;
}
- // ========== 鍙�夛細HttpEntity(RestTemplate) 鏂瑰紡锛堝綋鍓嶆湭浣跨敤锛� ==========
- // 鍚敤姝ラ锛�1锛夊彇娑堜笂鏂� restTemplate 鐨� @Autowired 娉ㄥ叆锛�
- // 2锛夊彇娑堜笅闈㈡暣娈垫敞閲婏紝鎭㈠ buildUrl銆乸ostToCloudWms銆乸arseResponse 鏂规硶鍙� OBJECT_MAPPER锛�
- // 3锛夊湪 syncMatnrsToCloud/reportInOutResult/reportInventoryAdjust 涓敼涓猴細String url = buildUrl(erpApiInfo.getXxxPath()); if (url == null) return stubSuccess(...); return postToCloudWms(url, body);
- //
- // private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
- // private String buildUrl(String path) { ... }
- // private Map<String, Object> postToCloudWms(String url, Object body) { HttpHeaders headers = ...; HttpEntity<Object> entity = new HttpEntity<>(body, headers); ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, entity, String.class); return parseResponse(response.getBody()); }
- // private Map<String, Object> parseResponse(String json) { ... }
+ private void logOutboundPayload(String reportType, String endpoint, DapIlcwmsCompletionRequest req) {
+ try {
+ log.info("浜戜粨鐪熷疄璇锋眰鎶ユ枃锛宺eportType={}锛宔ndpoint={}锛宲ayload={}",
+ reportType, endpoint, objectMapper.writeValueAsString(req));
+ } catch (Exception e) {
+ log.warn("浜戜粨鐪熷疄璇锋眰鎶ユ枃搴忓垪鍖栧け璐ワ紝reportType={}锛宔ndpoint={}锛歿}",
+ reportType, endpoint, e.getMessage());
+ }
+ }
}
--
Gitblit v1.9.1