From 59d63f694e9f0e726820ca5f79483ec74e108e3f Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期五, 17 四月 2026 10:55:41 +0800
Subject: [PATCH] lsh#
---
rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java | 109 ++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 93 insertions(+), 16 deletions(-)
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java
index 7c96629..9480f9f 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java
@@ -459,12 +459,20 @@
return CommonResponse.error("鍥炰紶鏄庣粏涓虹┖");
}
- int allocateCount = 0;
- int erpReportCount = 0;
- List<String> errors = new ArrayList<>();
+ // 瀵瑰洖浼犳暟鎹仛鍙嶆槧灏勶紙WMS瀛楁鍚� 鈫� ERP瀛楁鍚嶏級
+ JSONObject mappedRoot = ParamsMapUtils.reverseApiMaps("erp", "orderId", root);
+ JSONArray mappedDataArray = pickArray(mappedRoot, "Data", "data");
+ if (Objects.isNull(mappedDataArray) || mappedDataArray.isEmpty()) {
+ mappedDataArray = dataArray;
+ }
- for (int i = 0; i < dataArray.size(); i++) {
- JSONObject row = dataArray.getJSONObject(i);
+ int allocateCount = 0;
+ List<String> errors = new ArrayList<>();
+ Set<String> affectedOrderNos = new HashSet<>();
+ Map<String, OpenApiOrder> orderCache = new HashMap<>();
+
+ for (int i = 0; i < mappedDataArray.size(); i++) {
+ JSONObject row = mappedDataArray.getJSONObject(i);
String orderNo = pickString(row, "WMSNO", "wmsNo", "orderNo", "OrderNo");
String matnrCode = pickString(row, "ItemCode", "itemCode", "matNr", "MatNr");
String batch = pickString(row, "Batch", "batch", "GoodsNO", "goodsNo");
@@ -476,14 +484,33 @@
doneQty = doneQty.setScale(2, RoundingMode.HALF_UP);
try {
- int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, doneQty);
+ int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, doneQty, orderCache);
allocateCount += singleAllocated;
- erpReportCount += reportReadyLinesToErp(orderNo);
- refreshOrderFinishStatus(orderNo);
+ affectedOrderNos.add(orderNo);
} catch (Exception e) {
log.error("澶勭悊鍥炰紶澶辫触锛宱rderNo={}, matnr={}, batch={}", orderNo, matnrCode, batch, e);
errors.add("绗�" + (i + 1) + "琛屽鐞嗗け璐ワ細" + e.getMessage());
}
+ }
+
+ // 寰幆缁撴潫鍚庯紝姣忎釜鍙楀奖鍝嶈鍗曞彧鍒锋柊涓�娆$姸鎬�
+ for (String orderNo : affectedOrderNos) {
+ refreshOrderFinishStatus(orderNo);
+ }
+
+ // 鍙嶆槧灏勫悗缁勮ReportParams锛屽弬鐓ф棫閾捐矾涓婃姤ERP锛堜竴娆℃�ф暣鍗曚笂鎶ワ級
+ try {
+ ReportParams erpReportParams = buildReportParamsFromMappedData(mappedRoot, mappedDataArray);
+ CommonResponse erpResp = wmsErpService.reportOrders(erpReportParams);
+ if (Objects.nonNull(erpResp) && Objects.equals(erpResp.getCode(), 200)) {
+ log.info("鍙嶆槧灏勪笂鎶RP鎴愬姛锛宱rderNo={}", pickString(root, "orderNo", "WMSNO"));
+ } else {
+ String msg = Objects.isNull(erpResp) ? "ERP鍝嶅簲涓虹┖" : erpResp.getMsg();
+ errors.add("涓婃姤ERP澶辫触锛�" + msg);
+ }
+ } catch (Exception e) {
+ log.error("鍙嶆槧灏勪笂鎶RP寮傚父", e);
+ errors.add("涓婃姤ERP寮傚父锛�" + e.getMessage());
}
if (!errors.isEmpty()) {
@@ -496,8 +523,43 @@
Map<String, Object> result = new HashMap<>();
result.put("allocatedCount", allocateCount);
- result.put("erpReportCount", erpReportCount);
return CommonResponse.ok(result);
+ }
+
+ /**
+ * 鏍规嵁鍙嶆槧灏勫悗鐨勬暟鎹粍瑁匯eportParams锛屽弬鐓ф棫閾捐矾wmsErpService.reportOrders鏍煎紡涓婃姤ERP
+ */
+ private ReportParams buildReportParamsFromMappedData(JSONObject root, JSONArray dataArray) {
+ String orderType = pickString(root, "OrderType", "orderType", "type", "wkType");
+
+ List<ReportDataParam> reportDataList = new ArrayList<>();
+ for (int i = 0; i < dataArray.size(); i++) {
+ JSONObject row = dataArray.getJSONObject(i);
+ ReportDataParam dataParam = new ReportDataParam()
+ .setWMSNO(pickString(row, "WMSNO", "wmsNo", "orderNo", "OrderNo"))
+ .setPONO(pickString(row, "PONO", "poNo"))
+ .setOrderNO(pickString(row, "OrderNO", "orderNo"))
+ .setGoodsNO(pickString(row, "GoodsNO", "goodsNo", "batch", "Batch"))
+ .setItemCode(pickString(row, "ItemCode", "itemCode", "matNr", "MatNr"))
+ .setEditUser(pickString(row, "EditUser", "editUser"))
+ .setMemoDtl(pickString(row, "MemoDtl", "memoDtl", "memo"));
+
+ BigDecimal inQty = pickDecimal(row, "InQty", "inQty");
+ BigDecimal outQty = pickDecimal(row, "OutQty", "outQty");
+ if (Objects.nonNull(inQty) && inQty.compareTo(ZERO) > 0) {
+ dataParam.setInQty(inQty.doubleValue());
+ }
+ if (Objects.nonNull(outQty) && outQty.compareTo(ZERO) > 0) {
+ dataParam.setOutQty(outQty.doubleValue());
+ }
+
+ reportDataList.add(dataParam);
+ }
+
+ return new ReportParams()
+ .setOrderType(orderType)
+ .setAction("Update")
+ .setData(reportDataList);
}
private OpenApiOrder saveOpenApiOrder(Order order) {
@@ -698,10 +760,11 @@
return event;
}
- private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, BigDecimal mergedDoneQty) {
- OpenApiOrder order = openApiOrderMapper.selectOne(new LambdaQueryWrapper<OpenApiOrder>()
- .eq(OpenApiOrder::getCode, orderNo)
- .last("limit 1"));
+ private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, BigDecimal mergedDoneQty, Map<String, OpenApiOrder> orderCache) {
+ OpenApiOrder order = orderCache.computeIfAbsent(orderNo, k ->
+ openApiOrderMapper.selectOne(new LambdaQueryWrapper<OpenApiOrder>()
+ .eq(OpenApiOrder::getCode, k)
+ .last("limit 1")));
if (Objects.isNull(order)) {
throw new CoolException("鏈壘鍒拌鍗曪細" + orderNo);
}
@@ -740,7 +803,7 @@
openApiOrderItemMapMapper.updateById(row);
openApiOrderItemMapper.update(null, new LambdaUpdateWrapper<OpenApiOrderItem>()
.eq(OpenApiOrderItem::getId, row.getSourceItemId())
- .setSql("qty = IFNULL(qty,0) + " + toAllocate));
+ .setSql("qty = IFNULL(qty,0) + " + toAllocate.toPlainString()));
remaining = remaining.subtract(toAllocate).setScale(2, RoundingMode.HALF_UP);
allocateRows++;
}
@@ -762,8 +825,22 @@
.eq(OpenApiOrderItemMap::getOrderId, order.getId())
.orderByAsc(OpenApiOrderItemMap::getSeqNo)
.orderByAsc(OpenApiOrderItemMap::getId));
- int successCount = 0;
+ // 鎵归噺鏌ヨ鎵�鏈� sourceItemId 瀵瑰簲鐨� OpenApiOrderItem锛屾秷闄� N+1
+ List<Long> itemIds = mappings.stream()
+ .map(OpenApiOrderItemMap::getSourceItemId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .toList();
+ Map<Long, OpenApiOrderItem> itemMap = new HashMap<>();
+ if (!itemIds.isEmpty()) {
+ List<OpenApiOrderItem> items = openApiOrderItemMapper.selectBatchIds(itemIds);
+ for (OpenApiOrderItem item : items) {
+ itemMap.put(item.getId(), item);
+ }
+ }
+
+ int successCount = 0;
for (OpenApiOrderItemMap mapping : mappings) {
BigDecimal allocatedQty = defaultQty(mapping.getAllocatedQty());
BigDecimal reportedQty = defaultQty(mapping.getReportedQty());
@@ -772,7 +849,7 @@
continue;
}
- OpenApiOrderItem item = openApiOrderItemMapper.selectById(mapping.getSourceItemId());
+ OpenApiOrderItem item = itemMap.get(mapping.getSourceItemId());
if (Objects.isNull(item)) {
continue;
}
--
Gitblit v1.9.1