From d2c478f727ebf427e1490277420c841f8f884f56 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期五, 17 四月 2026 13:30:09 +0800
Subject: [PATCH] lsh#

---
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/phyz/impl/ErpReportServiceImpl.java |  157 ++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 116 insertions(+), 41 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 9480f9f..3ae1048 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
@@ -449,21 +449,44 @@
             throw new CoolException("骞傜瓑閿笉鑳戒负绌猴紙eventId/taskNo/reportNo锛�");
         }
 
+        String orderNo = pickString(root, "orderNo", "OrderNo", "WMSNO", "wmsno");
+        if (StringUtils.isBlank(orderNo)) {
+            return CommonResponse.error("orderNo涓嶈兘涓虹┖");
+        }
+
         if (existsReportEvent(eventId, taskNo, reportNo)) {
             return CommonResponse.ok("閲嶅鍥炰紶宸插拷鐣�");
         }
-        OpenApiOrderReportEvent reportEvent = saveReportEvent(eventId, taskNo, reportNo, pickString(root, "orderNo", "WMSNO"), root.toJSONString());
+        OpenApiOrderReportEvent reportEvent = saveReportEvent(eventId, taskNo, reportNo, orderNo, root.toJSONString());
 
-        JSONArray dataArray = pickArray(root, "Data", "data");
+        // 瑙f瀽鏄庣粏锛氫紭鍏堝彇 orderItems锛圤rder鏍煎紡锛夛紝鍏煎 Data/data锛圧eportParams鏍煎紡锛�
+        JSONArray dataArray = pickArray(root, "orderItems", "orderItems");
+        if (Objects.isNull(dataArray) || dataArray.isEmpty()) {
+            dataArray = pickArray(root, "Data", "data");
+        }
         if (Objects.isNull(dataArray) || dataArray.isEmpty()) {
             return CommonResponse.error("鍥炰紶鏄庣粏涓虹┖");
         }
 
-        // 瀵瑰洖浼犳暟鎹仛鍙嶆槧灏勶紙WMS瀛楁鍚� 鈫� ERP瀛楁鍚嶏級
+        // 瀵瑰洖浼犳暟鎹仛鍙嶆槧灏勶紙WMS瀛楁鍚� 鈫� ERP瀛楁鍚嶏級锛屽吋瀹规棫鏍煎紡
         JSONObject mappedRoot = ParamsMapUtils.reverseApiMaps("erp", "orderId", root);
-        JSONArray mappedDataArray = pickArray(mappedRoot, "Data", "data");
+        JSONArray mappedDataArray = pickArray(mappedRoot, "orderItems", "orderItems");
+        if (Objects.isNull(mappedDataArray) || mappedDataArray.isEmpty()) {
+            mappedDataArray = pickArray(mappedRoot, "Data", "data");
+        }
         if (Objects.isNull(mappedDataArray) || mappedDataArray.isEmpty()) {
             mappedDataArray = dataArray;
+        }
+
+        // 涓诲崟绾т俊鎭紙Order鏍煎紡涓婃姤鏃舵惡甯︼級
+        String orderType = pickString(root, "type", "Type");
+        String wkType = pickString(root, "wkType", "WkType");
+        String poCode = pickString(root, "poCode", "PoCode", "PONO");
+        String editUser = pickString(root, "editUser", "EditUser");
+        Date editDate = null;
+        Object editDateObj = root.get("editDate");
+        if (editDateObj instanceof Number) {
+            editDate = toDate(((Number) editDateObj).longValue());
         }
 
         int allocateCount = 0;
@@ -473,43 +496,45 @@
 
         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");
-            BigDecimal doneQty = pickDecimal(row, "qty", "doneQty", "InQty", "OutQty");
-            if (StringUtils.isBlank(orderNo) || StringUtils.isBlank(matnrCode) || doneQty.compareTo(ZERO) <= 0) {
-                errors.add("绗�" + (i + 1) + "琛岀己灏戝繀瑕佸瓧娈碉紙WMSNO/ItemCode/鏁伴噺锛�");
+            // Order鏍煎紡锛歮atNr/anfme/batch/doneQty/lineId
+            // ReportParams鏍煎紡鍏煎锛欼temCode/InQty/OutQty/GoodsNO
+            String matnrCode = pickString(row, "matNr", "MatNr", "ItemCode", "itemCode");
+            String batch = pickString(row, "batch", "Batch", "GoodsNO", "goodsNo");
+            String lineId = pickString(row, "lineId", "LineId", "sourceLineId");
+            BigDecimal doneQty = pickDecimal(row, "doneQty", "anfme", "qty", "InQty", "inQty", "OutQty", "outQty", "pdqty", "PDQty");
+            if (StringUtils.isBlank(matnrCode) || doneQty.compareTo(ZERO) <= 0) {
+                errors.add("绗�" + (i + 1) + "琛岀己灏戝繀瑕佸瓧娈碉紙matNr/鏁伴噺锛�");
                 continue;
             }
             doneQty = doneQty.setScale(2, RoundingMode.HALF_UP);
 
             try {
-                int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, doneQty, orderCache);
+                int singleAllocated = allocateMergedDoneQty(orderNo, matnrCode, batch, lineId, doneQty, orderCache);
                 allocateCount += singleAllocated;
                 affectedOrderNos.add(orderNo);
             } catch (Exception e) {
-                log.error("澶勭悊鍥炰紶澶辫触锛宱rderNo={}, matnr={}, batch={}", orderNo, matnrCode, batch, e);
+                log.error("澶勭悊鍥炰紶澶辫触锛宱rderNo={}, matnr={}, batch={}, lineId={}", orderNo, matnrCode, batch, lineId, e);
                 errors.add("绗�" + (i + 1) + "琛屽鐞嗗け璐ワ細" + e.getMessage());
             }
         }
 
         // 寰幆缁撴潫鍚庯紝姣忎釜鍙楀奖鍝嶈鍗曞彧鍒锋柊涓�娆$姸鎬�
-        for (String orderNo : affectedOrderNos) {
-            refreshOrderFinishStatus(orderNo);
+        for (String no : affectedOrderNos) {
+            refreshOrderFinishStatus(no);
         }
 
-        // 鍙嶆槧灏勫悗缁勮ReportParams锛屽弬鐓ф棫閾捐矾涓婃姤ERP锛堜竴娆℃�ф暣鍗曚笂鎶ワ級
+        // 缁勮ReportParams涓婃姤ERP锛堜竴娆℃�ф暣鍗曚笂鎶ワ級
         try {
-            ReportParams erpReportParams = buildReportParamsFromMappedData(mappedRoot, mappedDataArray);
+            ReportParams erpReportParams = buildReportParamsFromOrderData(orderNo, poCode, orderType, wkType, editUser, editDate, mappedDataArray);
             CommonResponse erpResp = wmsErpService.reportOrders(erpReportParams);
             if (Objects.nonNull(erpResp) && Objects.equals(erpResp.getCode(), 200)) {
-                log.info("鍙嶆槧灏勪笂鎶RP鎴愬姛锛宱rderNo={}", pickString(root, "orderNo", "WMSNO"));
+                log.info("涓婃姤ERP鎴愬姛锛宱rderNo={}", orderNo);
             } else {
                 String msg = Objects.isNull(erpResp) ? "ERP鍝嶅簲涓虹┖" : erpResp.getMsg();
                 errors.add("涓婃姤ERP澶辫触锛�" + msg);
             }
         } catch (Exception e) {
-            log.error("鍙嶆槧灏勪笂鎶RP寮傚父", e);
+            log.error("涓婃姤ERP寮傚父", e);
             errors.add("涓婃姤ERP寮傚父锛�" + e.getMessage());
         }
 
@@ -527,39 +552,70 @@
     }
 
     /**
-     * 鏍规嵁鍙嶆槧灏勫悗鐨勬暟鎹粍瑁匯eportParams锛屽弬鐓ф棫閾捐矾wmsErpService.reportOrders鏍煎紡涓婃姤ERP
+     * 鏍规嵁Order鏍煎紡鏁版嵁缁勮ReportParams锛屽弬鐓ф棫閾捐矾wmsErpService.reportOrders鏍煎紡涓婃姤ERP
      */
-    private ReportParams buildReportParamsFromMappedData(JSONObject root, JSONArray dataArray) {
-        String orderType = pickString(root, "OrderType", "orderType", "type", "wkType");
+    private ReportParams buildReportParamsFromOrderData(String orderNo, String poCode, String type, String wkType,
+                                                         String editUser, Date editDate, JSONArray dataArray) {
+        // 鏍规嵁wkType/type纭畾ERP涓婃姤鐨凮rderType
+        String erpOrderType = resolveErpOrderType(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"));
+            String matnrCode = pickString(row, "matNr", "MatNr", "ItemCode", "itemCode");
+            String batch = pickString(row, "batch", "Batch", "GoodsNO", "goodsNo");
+            BigDecimal doneQty = pickDecimal(row, "doneQty", "anfme", "qty", "InQty", "inQty", "OutQty", "outQty");
 
-            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());
+            ReportDataParam dataParam = new ReportDataParam()
+                    .setWMSNO(orderNo)
+                    .setPONO(poCode)
+                    .setOrderNO(orderNo)
+                    .setGoodsNO(batch)
+                    .setItemCode(matnrCode)
+                    .setEditUser(editUser)
+                    .setEditDate(editDate)
+                    .setMemoDtl(pickString(row, "memo", "MemoDtl"));
+
+            // 鍏ュ簱绫诲瀷璁綢nQty锛屽嚭搴撶被鍨嬭OutQty
+            if ("in".equalsIgnoreCase(type)) {
+                if (doneQty.compareTo(ZERO) > 0) {
+                    dataParam.setInQty(doneQty.doubleValue());
+                }
+            } else {
+                if (doneQty.compareTo(ZERO) > 0) {
+                    dataParam.setOutQty(doneQty.doubleValue());
+                }
             }
 
             reportDataList.add(dataParam);
         }
 
         return new ReportParams()
-                .setOrderType(orderType)
+                .setOrderType(erpOrderType)
                 .setAction("Update")
                 .setData(reportDataList);
+    }
+
+    /**
+     * 鏍规嵁type鍜寃kType瑙f瀽ERP涓婃姤鐨勮鍗曠被鍨�
+     */
+    private String resolveErpOrderType(String type, String wkType) {
+        if (StringUtils.isBlank(wkType)) {
+            return "in".equalsIgnoreCase(type) ? "PO_Instock" : "WO_Outstock";
+        }
+        switch (wkType) {
+            case "PUR_ReceiveBill": return "PO_Instock";
+            case "PUR_MRB": return "PR_Outstock";
+            case "PRD_ReturnMtrl": return "WR_Instock";
+            case "PRD_PickMtrl": return "WO_Outstock";
+            case "PRD_FeedMtrl": return "WR_Instock_BL";
+            case "PRD_INSTOCK":
+            case "PRD_MORPT": return "WO_Outstock";
+            case "STK_MISCELLANEOUS": return "In_Instock";
+            case "STK_MisDelivery": return "Io_Outstock";
+            default:
+                return "in".equalsIgnoreCase(type) ? "PO_Instock" : "WO_Outstock";
+        }
     }
 
     private OpenApiOrder saveOpenApiOrder(Order order) {
@@ -760,7 +816,7 @@
         return event;
     }
 
-    private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, BigDecimal mergedDoneQty, Map<String, OpenApiOrder> orderCache) {
+    private int allocateMergedDoneQty(String orderNo, String matnrCode, String batch, String lineId, BigDecimal mergedDoneQty, Map<String, OpenApiOrder> orderCache) {
         OpenApiOrder order = orderCache.computeIfAbsent(orderNo, k ->
                 openApiOrderMapper.selectOne(new LambdaQueryWrapper<OpenApiOrder>()
                         .eq(OpenApiOrder::getCode, k)
@@ -771,13 +827,32 @@
 
         LambdaQueryWrapper<OpenApiOrderItemMap> queryWrapper = new LambdaQueryWrapper<OpenApiOrderItemMap>()
                 .eq(OpenApiOrderItemMap::getOrderId, order.getId())
-                .eq(OpenApiOrderItemMap::getMergeMatnrCode, defaultString(matnrCode))
                 .orderByAsc(OpenApiOrderItemMap::getSeqNo)
                 .orderByAsc(OpenApiOrderItemMap::getId);
-        if (StringUtils.isNotBlank(batch)) {
-            queryWrapper.eq(OpenApiOrderItemMap::getMergeBatch, batch);
+
+        // 浼樺厛鐢╨ineId绮剧‘鍖归厤鍘熷琛�
+        if (StringUtils.isNotBlank(lineId)) {
+            queryWrapper.eq(OpenApiOrderItemMap::getSourceLineId, lineId);
+        } else {
+            queryWrapper.eq(OpenApiOrderItemMap::getMergeMatnrCode, defaultString(matnrCode));
+            if (StringUtils.isNotBlank(batch)) {
+                queryWrapper.eq(OpenApiOrderItemMap::getMergeBatch, batch);
+            }
         }
+
         List<OpenApiOrderItemMap> mappingRows = openApiOrderItemMapMapper.selectList(queryWrapper);
+        if (mappingRows.isEmpty() && StringUtils.isNotBlank(lineId)) {
+            // lineId鍖归厤涓嶅埌鏃讹紝鍥為��鍒癿atNr+batch鍖归厤
+            queryWrapper = new LambdaQueryWrapper<OpenApiOrderItemMap>()
+                    .eq(OpenApiOrderItemMap::getOrderId, order.getId())
+                    .eq(OpenApiOrderItemMap::getMergeMatnrCode, defaultString(matnrCode))
+                    .orderByAsc(OpenApiOrderItemMap::getSeqNo)
+                    .orderByAsc(OpenApiOrderItemMap::getId);
+            if (StringUtils.isNotBlank(batch)) {
+                queryWrapper.eq(OpenApiOrderItemMap::getMergeBatch, batch);
+            }
+            mappingRows = openApiOrderItemMapMapper.selectList(queryWrapper);
+        }
         if (mappingRows.isEmpty()) {
             throw new CoolException("鏈壘鍒版槧灏勫叧绯伙紝璁㈠崟锛�" + orderNo + "锛岀墿鏂欙細" + matnrCode);
         }

--
Gitblit v1.9.1