From a38d4a8619b886e2544cdefe421f171765ad2229 Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期二, 03 二月 2026 10:11:51 +0800
Subject: [PATCH] 库存汇总

---
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java                   |  178 +++++++++++--------
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java |   85 +++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java                      |    7 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java             |  182 ++++++++++++++++++++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java                  |    8 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java              |   18 ++
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java                    |    2 
 rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java                     |    3 
 8 files changed, 404 insertions(+), 79 deletions(-)

diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
index 8da1005..d2f59c7 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/controller/phyz/ERPController.java
@@ -2,17 +2,16 @@
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.openApi.entity.dto.CommonResponse;
 import com.vincent.rsf.openApi.entity.phyz.*;
 import com.vincent.rsf.openApi.feign.wms.WmsServerFeignClient;
+import com.vincent.rsf.openApi.feign.wms.fallback.WmsServerFeignClientFallback;
 import com.vincent.rsf.openApi.service.phyz.ErpReportService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.compress.utils.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -257,87 +256,114 @@
             }
         } catch (Exception e) {
             log.error("搴撳瓨鏌ヨ鏄庣粏澶辫触", e);
-            // 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
-            String errorMessage = e.getMessage();
-            if (errorMessage != null) {
-                // 濡傛灉鍖呭惈"executing"锛岃鏄庢槸HTTP璇锋眰閿欒锛屽幓鎺塙RL閮ㄥ垎
-                if (errorMessage.contains("executing")) {
-                    int executingIndex = errorMessage.indexOf("executing");
-                    if (executingIndex > 0) {
-                        // 鎻愬彇"executing"涔嬪墠鐨勯儴鍒嗭紙濡�"Read timed out"锛�
-                        errorMessage = errorMessage.substring(0, executingIndex).trim();
-                    } else {
-                        // 濡傛灉"executing"鍦ㄥ紑澶达紝浣跨敤榛樿閿欒娑堟伅
-                        errorMessage = "璇锋眰瓒呮椂";
-                    }
-                }
-                // 濡傛灉鍖呭惈"http://"鎴�"https://"锛屼篃灏濊瘯鍘绘帀URL閮ㄥ垎
-                else if (errorMessage.contains("http://") || errorMessage.contains("https://")) {
-                    // 浣跨敤姝e垯琛ㄨ揪寮忓幓鎺塙RL
-                    errorMessage = errorMessage.replaceAll("https?://[^\\s]+", "").trim();
-                    if (errorMessage.isEmpty()) {
-                        errorMessage = "璇锋眰澶辫触";
-                    }
-                }
-            }
-            return CommonResponse.error("鏌ヨ澶辫触锛�" + (errorMessage != null && !errorMessage.isEmpty() ? errorMessage : "鏈煡閿欒"));
+            String errorMessage = WmsServerFeignClientFallback.filterErrorMessage(e);
+            return CommonResponse.error(errorMessage);
         }
     }
 
+    @ApiOperation("搴撳瓨鏌ヨ姹囨�伙紙琛ㄥ崟鎻愪氦锛�")
+    @PostMapping(value = "/inventory/summary", consumes = "application/x-www-form-urlencoded")
+    public CommonResponse queryInventorySummaryForm(HttpServletRequest request) {
+        // 浠庤〃鍗曞弬鏁版瀯寤烘煡璇㈡潯浠�
+        InventoryQueryCondition condition = buildConditionFromRequestParams(request);
+        // 璋冪敤JSON澶勭悊鏂规硶
+        return queryInventorySummary(condition);
+    }
+
     @ApiOperation("搴撳瓨鏌ヨ姹囨��")
-    @PostMapping("/inventory/summary")
-    public CommonResponse queryInventorySummary(@RequestBody JSONObject params) {
+    @PostMapping(value = "/inventory/summary", consumes = "application/json")
+    public CommonResponse queryInventorySummary(@RequestBody(required = false) InventoryQueryCondition condition) {
+        // JSON鏂瑰紡锛氭敮鎸佷笉浼犻�掑弬鏁帮紙{}鎴杗ull鎴栫┖璇锋眰浣擄級锛屽垱寤洪粯璁ょ殑绌烘煡璇㈡潯浠跺璞�
+        if (condition == null) {
+            condition = new InventoryQueryCondition();
+        }
+        
         if (SIMULATED_DATA_ENABLE.equals("1")) {
-            String s = "{\n" +
-                    "  \"code\": 200,\n" +
-                    "  \"msg\": \"鎿嶄綔鎴愬姛\",\n" +
-                    "  \"data\": [\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH001\",\n" +
-                    "      \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT10001\",\n" +
-                    "      \"makTx\": \"閽㈡潗Q235\",\n" +
-                    "      \"spec\": \"鍥芥爣GB/T700-2006\",\n" +
-                    "      \"anfme\": 10.5,\n" +
-                    "      \"unit\": \"鍚╘",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106001\",\n" +
-                    "      \"planNo\": \"Plan20260106006\"\n" +
-                    "    },\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH001\",\n" +
-                    "      \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT10002\",\n" +
-                    "      \"makTx\": \"閾濆瀷鏉�6061\",\n" +
-                    "      \"spec\": \"鍥芥爣GB/T3190-2008\",\n" +
-                    "      \"anfme\": 20.3,\n" +
-                    "      \"unit\": \"鍚╘",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106002\",\n" +
-                    "      \"planNo\": \"Plan20260106005\"\n" +
-                    "    },\n" +
-                    "    {\n" +
-                    "      \"wareHouseId\": \"WH002\",\n" +
-                    "      \"wareHouseName\": \"鎴愬搧浠撳簱\",\n" +
-                    "      \"matNr\": \"MAT30001\",\n" +
-                    "      \"makTx\": \"鐢垫満鎴愬搧\",\n" +
-                    "      \"spec\": \"380V 50Hz 15KW\",\n" +
-                    "      \"anfme\": 100,\n" +
-                    "      \"unit\": \"鍙癨",\n" +
-                    "      \"stockOrgId\": \"ORG001\",\n" +
-                    "      \"batch\": \"BATCH20260106003\",\n" +
-                    "      \"planNo\": \"Plan20260106004\"\n" +
-                    "    }\n" +
-                    "  ]\n" +
-                    "}";
-            return JSONObject.parseObject(s, CommonResponse.class);
+            String x = "[\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH001\",\n" +
+                    "    \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT10001\",\n" +
+                    "    \"matTx\": \"閽㈡潗Q235\",\n" +
+                    "    \"spec\": \"鍥芥爣GB/T700-2006\",\n" +
+                    "    \"anfme\": 10.5,\n" +
+                    "    \"unit\": \"鍚╘",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106001\",\n" +
+                    "    \"planNo\": \"Plan20260106006\"\n" +
+                    "  },\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH001\",\n" +
+                    "    \"wareHouseName\": \"鍘熸枡浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT10002\",\n" +
+                    "    \"matTx\": \"閾濆瀷鏉�6061\",\n" +
+                    "    \"spec\": \"鍥芥爣GB/T3190-2008\",\n" +
+                    "    \"anfme\": 20.3,\n" +
+                    "    \"unit\": \"鍚╘",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106002\",\n" +
+                    "    \"planNo\": \"Plan20260106005\"\n" +
+                    "  },\n" +
+                    "  {\n" +
+                    "    \"wareHouseId\": \"WH002\",\n" +
+                    "    \"wareHouseName\": \"鎴愬搧浠撳簱\",\n" +
+                    "    \"matNr\": \"MAT30001\",\n" +
+                    "    \"matTx\": \"鐢垫満鎴愬搧\",\n" +
+                    "    \"spec\": \"380V 50Hz 15KW\",\n" +
+                    "    \"anfme\": 100,\n" +
+                    "    \"unit\": \"鍙癨",\n" +
+                    "    \"stockOrgId\": \"ORG001\",\n" +
+                    "    \"batch\": \"BATCH20260106003\",\n" +
+                    "    \"planNo\": \"Plan20260106004\"\n" +
+                    "  }\n" +
+                    "]";
+            return CommonResponse.ok(JSONArray.parseArray(x, InventorySummary.class));
         }
 
-        InventoryQueryCondition condition = JSON.parseObject(params.toJSONString(), InventoryQueryCondition.class);
-        // 鏁版嵁澶勭悊锛岃浆鍙憇erver
-        List<InventorySummary> inventorySummaries = Lists.newArrayList();
-        return new CommonResponse().setCode(200).setData(inventorySummaries);
-
+        try {
+            if (wmsServerFeignClient == null) {
+                log.warn("WmsServerFeignClient鏈敞鍏ワ紝鏃犳硶杩涜璋冪敤");
+                return CommonResponse.error("鏈嶅姟鏈垵濮嬪寲");
+            }
+            
+            log.info("搴撳瓨鏌ヨ姹囨�昏姹傚弬鏁帮細 {}", JSON.toJSONString(condition));
+            
+            // 鐩存帴浼犻�掑疄浣撶被锛孎eign浼氳嚜鍔ㄥ簭鍒楀寲涓篔SON
+            R result = wmsServerFeignClient.queryInventorySummary(condition);
+            
+            log.info("搴撳瓨鏌ヨ姹囨�昏繑鍥炵粨鏋滐細 {}", JSON.toJSONString(result));
+            
+            if (result != null) {
+                // R绫荤户鎵胯嚜HashMap锛屼娇鐢╣et鏂规硶鑾峰彇鍊�
+                Integer code = (Integer) result.get("code");
+                String msg = (String) result.get("msg");
+                Object data = result.get("data");
+                
+                if (code != null && code == 200) {
+                    // 灏哅ap鍒楄〃杞崲涓篒nventorySummary鍒楄〃
+                    if (data != null) {
+                        @SuppressWarnings("unchecked")
+                        List<Map<String, Object>> dataList = (List<Map<String, Object>>) data;
+                        List<InventorySummary> inventorySummaries = new ArrayList<>();
+                        for (Map<String, Object> item : dataList) {
+                            InventorySummary summary = JSON.parseObject(JSON.toJSONString(item), InventorySummary.class);
+                            inventorySummaries.add(summary);
+                        }
+                        return CommonResponse.ok(inventorySummaries);
+                    } else {
+                        return CommonResponse.ok(new ArrayList<>());
+                    }
+                } else {
+                    return CommonResponse.error(msg != null ? msg : "鏌ヨ澶辫触");
+                }
+            } else {
+                return CommonResponse.error("鏌ヨ澶辫触锛氳繑鍥炵粨鏋滀负绌�");
+            }
+        } catch (Exception e) {
+            log.error("搴撳瓨鏌ヨ姹囨�诲け璐�", e);
+            String errorMessage = WmsServerFeignClientFallback.filterErrorMessage(e);
+            return CommonResponse.error(errorMessage);
+        }
     }
 
     @ApiOperation("鐩樼偣缁撴灉纭")
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
index f36148d..73da571 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/constant/WmsConstant.java
@@ -43,5 +43,8 @@
     //搴撳瓨鏌ヨ鏄庣粏锛圗RP鎺ュ彛锛屽搴攐pen-api鐨�/inventory/details锛�
     public static final String QUERY_INVENTORY_DETAILS = "/rsf-server/erp/inventory/details";
 
+    //搴撳瓨鏌ヨ姹囨�伙紙ERP鎺ュ彛锛屽搴攐pen-api鐨�/inventory/summary锛�
+    public static final String QUERY_INVENTORY_SUMMARY = "/rsf-server/erp/inventory/summary";
+
 
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
index 7d51252..1fcfd78 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/phyz/InventorySummary.java
@@ -18,7 +18,7 @@
     // 鐗╂枡缂栫爜
     private String matNr;
     // 鐗╂枡鍚嶇О
-    private String makTx;
+    private String matTx;
     // 瑙勬牸
     private String spec;
     // 鏁伴噺锛屽皬鏁扮偣鏈�闀�6浣�
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
index e48e236..299c917 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/WmsServerFeignClient.java
@@ -31,4 +31,12 @@
      */
     @PostMapping(WmsConstant.QUERY_INVENTORY_DETAILS)
     R queryInventoryDetails(@RequestBody InventoryQueryCondition condition);
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙璋冪敤server绔殑erpQueryInventorySummary鏂规硶锛�
+     * @param condition 鏌ヨ鏉′欢瀹炰綋绫�
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @PostMapping(WmsConstant.QUERY_INVENTORY_SUMMARY)
+    R queryInventorySummary(@RequestBody InventoryQueryCondition condition);
 }
diff --git a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
index 0c846f7..2e33cf4 100644
--- a/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
+++ b/rsf-open-api/src/main/java/com/vincent/rsf/openApi/feign/wms/fallback/WmsServerFeignClientFallback.java
@@ -15,7 +15,88 @@
 
     @Override
     public R queryInventoryDetails(InventoryQueryCondition condition) {
-        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ鏄庣粏鎺ュ彛澶辫触锛岃Е鍙戦檷绾у鐞�");
-        return R.error("鏈嶅姟璋冪敤澶辫触锛岃绋嶅悗閲嶈瘯");
+        return queryInventoryDetails(condition, null);
+    }
+
+    /**
+     * 搴撳瓨鏌ヨ鏄庣粏闄嶇骇澶勭悊锛堝甫寮傚父淇℃伅锛�
+     * @param condition 鏌ヨ鏉′欢
+     * @param throwable 寮傚父淇℃伅锛堝彲閫夛級
+     * @return 閿欒鍝嶅簲
+     */
+    public R queryInventoryDetails(InventoryQueryCondition condition, Throwable throwable) {
+        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ鏄庣粏鎺ュ彛澶辫触锛岃Е鍙戦檷绾у鐞�", throwable);
+        String errorMessage = filterErrorMessage(throwable);
+        return R.error(errorMessage);
+    }
+
+    @Override
+    public R queryInventorySummary(InventoryQueryCondition condition) {
+        return queryInventorySummary(condition, null);
+    }
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�婚檷绾у鐞嗭紙甯﹀紓甯镐俊鎭級
+     * @param condition 鏌ヨ鏉′欢
+     * @param throwable 寮傚父淇℃伅锛堝彲閫夛級
+     * @return 閿欒鍝嶅簲
+     */
+    public R queryInventorySummary(InventoryQueryCondition condition, Throwable throwable) {
+        log.error("璋冪敤WMS Server搴撳瓨鏌ヨ姹囨�绘帴鍙eけ璐ワ紝瑙﹀彂闄嶇骇澶勭悊", throwable);
+        String errorMessage = filterErrorMessage(throwable);
+        return R.error(errorMessage);
+    }
+
+    /**
+     * 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
+     * @param throwable 寮傚父瀵硅薄锛堝彲閫夛級
+     * @return 杩囨护鍚庣殑瀹屾暣閿欒娑堟伅锛堝寘鍚�"鏌ヨ澶辫触锛�"鍓嶇紑锛�
+     */
+    public static String filterErrorMessage(Throwable throwable) {
+        if (throwable == null) {
+            return "鏌ヨ澶辫触锛氭湇鍔¤皟鐢ㄥけ璐ワ紝璇风◢鍚庨噸璇�";
+        }
+        return filterErrorMessage(throwable.getMessage());
+    }
+
+    /**
+     * 杩囨护閿欒娑堟伅涓殑URL锛屽彧淇濈暀閿欒绫诲瀷
+     * @param errorMessage 閿欒娑堟伅瀛楃涓诧紙鍙�夛級
+     * @return 杩囨护鍚庣殑瀹屾暣閿欒娑堟伅锛堝寘鍚�"鏌ヨ澶辫触锛�"鍓嶇紑锛�
+     */
+    public static String filterErrorMessage(String errorMessage) {
+        if (errorMessage == null || errorMessage.isEmpty()) {
+            return "鏌ヨ澶辫触锛氭湭鐭ラ敊璇�";
+        }
+        
+        String filteredMessage = errorMessage;
+        
+        // 濡傛灉鍖呭惈"executing"锛岃鏄庢槸HTTP璇锋眰閿欒锛屽幓鎺塙RL閮ㄥ垎
+        if (filteredMessage.contains("executing")) {
+            int executingIndex = filteredMessage.indexOf("executing");
+            if (executingIndex > 0) {
+                // 鎻愬彇"executing"涔嬪墠鐨勯儴鍒嗭紙濡�"Read timed out"锛�
+                filteredMessage = filteredMessage.substring(0, executingIndex).trim();
+            } else {
+                // 濡傛灉"executing"鍦ㄥ紑澶达紝浣跨敤榛樿閿欒娑堟伅
+                filteredMessage = "璇锋眰瓒呮椂";
+            }
+        }
+        // 濡傛灉鍖呭惈"http://"鎴�"https://"锛屼篃灏濊瘯鍘绘帀URL閮ㄥ垎
+        else if (filteredMessage.contains("http://") || filteredMessage.contains("https://")) {
+            // 浣跨敤姝e垯琛ㄨ揪寮忓幓鎺塙RL
+            filteredMessage = filteredMessage.replaceAll("https?://[^\\s]+", "").trim();
+            if (filteredMessage.isEmpty()) {
+                filteredMessage = "璇锋眰澶辫触";
+            }
+        }
+        
+        // 濡傛灉杩囨护鍚庣殑娑堟伅涓虹┖锛屼娇鐢ㄩ粯璁ら敊璇秷鎭�
+        if (filteredMessage.isEmpty()) {
+            filteredMessage = "鏈煡閿欒";
+        }
+        
+        // 杩斿洖鍖呭惈"鏌ヨ澶辫触锛�"鍓嶇紑鐨勫畬鏁撮敊璇秷鎭�
+        return "鏌ヨ澶辫触锛�" + filteredMessage;
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
index c70bf3d..36457c8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ErpQueryController.java
@@ -121,4 +121,22 @@
         return receiveMsgService.erpQueryInventoryDetails(condition);
     }
 
+    /**
+     * ERP搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api妯″潡璋冪敤锛�
+     * 瀵瑰簲open-api鐨� /inventory/summary 鎺ュ彛
+     * @param condition 鏌ヨ鏉′欢
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @PostMapping("/inventory/summary")
+    @ApiOperation(value = "ERP搴撳瓨鏌ヨ姹囨��", hidden = true)
+    @OperationLog("ERP搴撳瓨鏌ヨ姹囨��")
+    public R erpQueryInventorySummary(@RequestBody InventoryQueryConditionParam condition) {
+        // 鍙傛暟楠岃瘉
+        if (condition == null) {
+            return R.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
+        }
+        
+        return receiveMsgService.erpQueryInventorySummary(condition);
+    }
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
index 78a0464..f9b7559 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
@@ -159,4 +159,11 @@
      * @return 搴撳瓨鏄庣粏鍒楄〃
      */
     R erpQueryInventoryDetails(InventoryQueryConditionParam condition);
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api璋冪敤锛�
+     * @param condition 鏌ヨ鏉′欢
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    R erpQueryInventorySummary(InventoryQueryConditionParam condition);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
index f771b8f..cd0ab43 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -1200,4 +1200,186 @@
 
         return details;
     }
+
+    /**
+     * 搴撳瓨鏌ヨ姹囨�伙紙渚沷pen-api璋冪敤锛�
+     *
+     * @param condition 鏌ヨ鏉′欢瀹炰綋绫�
+     * @return 搴撳瓨姹囨�诲垪琛�
+     */
+    @Override
+    public R erpQueryInventorySummary(InventoryQueryConditionParam condition) {
+        try {
+            // 鍙傛暟楠岃瘉
+            if (condition == null) {
+                return R.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
+            }
+
+            // 灏咵RP鍙傛暟鏄犲皠涓烘暟鎹簱瀛楁鍚嶏紙涓嬪垝绾挎牸寮忥級
+            Map<String, Object> queryMap = new HashMap<>();
+            
+            // 浠庡疄浣撶被涓彁鍙栨煡璇㈡潯浠讹紝鏄犲皠涓虹湡瀹炵殑鏁版嵁搴撳瓧娈靛悕
+            if (StringUtils.isNotBlank(condition.getMatNr())) {
+                queryMap.put("matnr_code", condition.getMatNr());
+            }
+            if (StringUtils.isNotBlank(condition.getPlanNo())) {
+                queryMap.put("track_code", condition.getPlanNo());
+            }
+            if (StringUtils.isNotBlank(condition.getBatch())) {
+                queryMap.put("batch", condition.getBatch());
+            }
+
+            BaseParam baseParam = new BaseParam();
+            baseParam.syncMap(queryMap);
+            PageParam<LocItem, BaseParam> pageParam = new PageParam<>(baseParam, LocItem.class);
+
+            QueryWrapper<LocItem> wrapper = pageParam.buildWrapper(false);
+
+            // 鐗╂枡缁勶紙闇�瑕侀�氳繃鐗╂枡琛ㄥ叧鑱旀煡璇級
+            if (StringUtils.isNotBlank(condition.getMatGroup())) {
+                // 璋冪敤鐗╂枡Service鏌ヨ鐗╂枡缁勫搴旂殑鐗╂枡ID鍒楄〃锛堝鐢ㄥ凡鏈夋柟娉曪級
+                LambdaQueryWrapper<Matnr> matnrWrapper = new LambdaQueryWrapper<>();
+                matnrWrapper.eq(Matnr::getGroupId, condition.getMatGroup());
+                List<Matnr> matnrs = matnrService.list(matnrWrapper);
+                if (!matnrs.isEmpty()) {
+                    List<Long> matnrIds = matnrs.stream().map(Matnr::getId).collect(Collectors.toList());
+                    wrapper.in("matnr_id", matnrIds);
+                } else {
+                    // 濡傛灉娌℃湁鎵惧埌鐗╂枡锛岃繑鍥炵┖缁撴灉
+                    return R.ok().add(new ArrayList<>());
+                }
+            }
+
+            // 鍙煡璇㈡甯哥姸鎬佺殑搴撳瓨锛坰tatus=1琛ㄧず姝e父锛�
+            wrapper.eq("status", 1);
+
+            // 璁剧疆鍒嗛〉鍙傛暟锛屾煡璇㈡墍鏈夋暟鎹敤浜庢眹鎬�
+            pageParam.setCurrent(1);
+            pageParam.setSize(Integer.MAX_VALUE);
+            PageParam<LocItem, BaseParam> pageResult = locItemService.page(pageParam, wrapper);
+            List<LocItem> locItems = pageResult.getRecords();
+
+            if (locItems.isEmpty()) {
+                return R.ok().add(new ArrayList<>());
+            }
+
+            // 鑾峰彇鎵�鏈夐渶瑕佸叧鑱旂殑ID
+            List<Long> locIds = locItems.stream()
+                    .map(LocItem::getLocId)
+                    .filter(Objects::nonNull)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            List<Long> warehouseIds = new ArrayList<>();
+
+            // 璋冪敤LocService鏌ヨ搴撲綅淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+            Map<Long, Loc> locMap = new HashMap<>();
+            if (!locIds.isEmpty()) {
+                List<Loc> locs = locService.listByIds(locIds);
+                locMap = locs.stream().collect(Collectors.toMap(Loc::getId, loc -> loc));
+
+                // 鏀堕泦浠撳簱ID
+                warehouseIds = locs.stream()
+                        .map(Loc::getWarehouseId)
+                        .filter(Objects::nonNull)
+                        .distinct()
+                        .collect(Collectors.toList());
+            }
+
+            // 浠撳簱缂栫爜杩囨护
+            if (StringUtils.isNotBlank(condition.getWareHouseId())) {
+                String wareHouseId = condition.getWareHouseId();
+                LambdaQueryWrapper<Warehouse> whWrapper = new LambdaQueryWrapper<>();
+                whWrapper.eq(Warehouse::getCode, wareHouseId);
+                // 璋冪敤WarehouseService鏌ヨ浠撳簱淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+                List<Warehouse> warehouses = warehouseService.list(whWrapper);
+                if (!warehouses.isEmpty()) {
+                    Long targetWarehouseId = warehouses.get(0).getId();
+                    // 杩囨护搴撲綅锛屽彧淇濈暀鐩爣浠撳簱鐨勫簱浣�
+                    locMap = locMap.entrySet().stream()
+                            .filter(entry -> Objects.equals(entry.getValue().getWarehouseId(), targetWarehouseId))
+                            .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+                    // 杩囨护locItems锛屽彧淇濈暀鐩爣浠撳簱鐨�
+                    Set<Long> validLocIds = locMap.keySet();
+                    locItems = locItems.stream()
+                            .filter(item -> item.getLocId() != null && validLocIds.contains(item.getLocId()))
+                            .collect(Collectors.toList());
+
+                    warehouseIds = Collections.singletonList(targetWarehouseId);
+                } else {
+                    return R.ok().add(new ArrayList<>());
+                }
+            }
+
+            // 璋冪敤WarehouseService鏌ヨ浠撳簱淇℃伅锛堝鐢⊿ervice灞傛柟娉曪級
+            Map<Long, Warehouse> warehouseMap = new HashMap<>();
+            if (!warehouseIds.isEmpty()) {
+                List<Warehouse> warehouses = warehouseService.listByIds(warehouseIds);
+                warehouseMap = warehouses.stream().collect(Collectors.toMap(Warehouse::getId, wh -> wh));
+            }
+
+            // 鎸変粨搴撱�佺墿鏂欍�佹壒鍙枫�佸簱瀛樼粍缁囧垎缁勬眹鎬�
+            // 浣跨敤Map鐨刱ey浣滀负鍒嗙粍閿細wareHouseId_matNr_batch_stockOrgId
+            Map<String, Map<String, Object>> summaryMap = new HashMap<>();
+            
+            for (LocItem locItem : locItems) {
+                // 鑾峰彇浠撳簱淇℃伅
+                Loc loc = null;
+                if (locItem.getLocId() != null) {
+                    loc = locMap.get(locItem.getLocId());
+                }
+                
+                if (loc == null) {
+                    continue;
+                }
+                
+                Warehouse warehouse = null;
+                if (loc.getWarehouseId() != null && warehouseMap.containsKey(loc.getWarehouseId())) {
+                    warehouse = warehouseMap.get(loc.getWarehouseId());
+                }
+                
+                if (warehouse == null) {
+                    continue;
+                }
+                
+                // 鏋勫缓鍒嗙粍閿細wareHouseId_matNr_batch_stockOrgId
+                String wareHouseId = warehouse.getCode();
+                String matNr = locItem.getMatnrCode();
+                String batch = locItem.getBatch() != null ? locItem.getBatch() : "";
+                String stockOrgId = locItem.getUseOrgId() != null ? locItem.getUseOrgId() : "";
+                String groupKey = wareHouseId + "_" + matNr + "_" + batch + "_" + stockOrgId;
+                
+                // 濡傛灉璇ュ垎缁勫凡瀛樺湪锛岀疮鍔犳暟閲�
+                if (summaryMap.containsKey(groupKey)) {
+                    Map<String, Object> summary = summaryMap.get(groupKey);
+                    Double currentAnfme = (Double) summary.get("anfme");
+                    Double newAnfme = currentAnfme + (locItem.getAnfme() != null ? locItem.getAnfme() : 0.0);
+                    summary.put("anfme", newAnfme);
+                } else {
+                    // 鍒涘缓鏂扮殑姹囨�昏褰�
+                    Map<String, Object> summary = new HashMap<>();
+                    summary.put("wareHouseId", wareHouseId);
+                    summary.put("wareHouseName", warehouse.getName());
+                    summary.put("matNr", matNr);
+                    summary.put("matTx", locItem.getMaktx());
+                    summary.put("spec", locItem.getSpec());
+                    summary.put("unit", locItem.getUnit());
+                    summary.put("anfme", locItem.getAnfme() != null ? locItem.getAnfme() : 0.0);
+                    summary.put("batch", locItem.getBatch());
+                    summary.put("stockOrgId", locItem.getUseOrgId());
+                    summary.put("planNo", locItem.getTrackCode());
+                    summaryMap.put(groupKey, summary);
+                }
+            }
+
+            // 杞崲涓哄垪琛�
+            List<Map<String, Object>> result = new ArrayList<>(summaryMap.values());
+
+            return R.ok().add(result);
+        } catch (Exception e) {
+            log.error("搴撳瓨鏌ヨ姹囨�诲け璐�", e);
+            return R.error("鏌ヨ澶辫触锛�" + e.getMessage());
+        }
+    }
 }

--
Gitblit v1.9.1