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 |   45 ++++++++++++++++++++++++++++++++-------------
 1 files changed, 32 insertions(+), 13 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 dbe9b05..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
@@ -467,8 +467,9 @@
         }
 
         int allocateCount = 0;
-        int erpReportCount = 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);
@@ -483,17 +484,21 @@
             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());
             }
         }
 
-        // 鍙嶆槧灏勫悗缁勮ReportParams锛屽弬鐓ф棫閾捐矾涓婃姤ERP
+        // 寰幆缁撴潫鍚庯紝姣忎釜鍙楀奖鍝嶈鍗曞彧鍒锋柊涓�娆$姸鎬�
+        for (String orderNo : affectedOrderNos) {
+            refreshOrderFinishStatus(orderNo);
+        }
+
+        // 鍙嶆槧灏勫悗缁勮ReportParams锛屽弬鐓ф棫閾捐矾涓婃姤ERP锛堜竴娆℃�ф暣鍗曚笂鎶ワ級
         try {
             ReportParams erpReportParams = buildReportParamsFromMappedData(mappedRoot, mappedDataArray);
             CommonResponse erpResp = wmsErpService.reportOrders(erpReportParams);
@@ -518,7 +523,6 @@
 
         Map<String, Object> result = new HashMap<>();
         result.put("allocatedCount", allocateCount);
-        result.put("erpReportCount", erpReportCount);
         return CommonResponse.ok(result);
     }
 
@@ -756,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);
         }
@@ -798,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++;
         }
@@ -820,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());
@@ -830,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