From 4f47f94957e67df0864930a2f638e9bdc8411b36 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期三, 25 二月 2026 09:50:06 +0800
Subject: [PATCH] lsh#

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java |  307 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 285 insertions(+), 22 deletions(-)

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 8e1fe0c..0cb4583 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
@@ -18,6 +18,7 @@
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.controller.dto.LocStockDto;
+import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
 import com.vincent.rsf.server.manager.controller.params.PakinItem;
 import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
 import com.vincent.rsf.server.manager.entity.*;
@@ -112,6 +113,8 @@
     private WarehouseAreasItemServiceImpl warehouseAreasItemService;
     @Autowired
     private LocItemService locItemService;
+    @Autowired
+    private OutStockService outStockService;
 
 
     /**
@@ -523,22 +526,51 @@
                     throw new CoolException("璁″垝鏀惰揣鏁伴噺淇敼澶辫触锛侊紒");
                 }
 
-                // 绔嬪嵆瑙﹀彂寮傛浠诲姟锛屼笉绛夊緟缁撴灉
-                if (!Cools.isEmpty(palletId.get()) && StringUtils.isNotBlank(syncOrder.getOrderNo()) && !Cools.isEmpty(syncOrder.getStationId())) {
-                    //缁勬墭
-                    WaitPakinParam pakinParam = new WaitPakinParam();
-                    pakinParam.setBarcode(palletId.get());
-                    pakinParam.setStaNo(syncOrder.getStationId());
+                if (!rule.equals(SerialRuleCode.SYS_OUT_STOCK_CODE)){
+                    // 鍏ュ簱锛氳仈鍔ㄧ粍鎵�
+                    // 绔嬪嵆瑙﹀彂寮傛浠诲姟锛屼笉绛夊緟缁撴灉
+                    if (!Cools.isEmpty(palletId.get()) && StringUtils.isNotBlank(syncOrder.getOrderNo()) && !Cools.isEmpty(syncOrder.getStationId())) {
+                        //缁勬墭
+                        WaitPakinParam pakinParam = new WaitPakinParam();
+                        pakinParam.setBarcode(palletId.get());
+                        pakinParam.setStaNo(syncOrder.getStationId());
 
-                    boolean itemsCheck = waitPakinService.mergeItemsCheck(pakinParam, loginUserId);
-                    if (itemsCheck) {
-                        CompletableFuture.runAsync(() -> {
-                            try {
-                                asyncMergeItemsWcs(pakinParam, syncOrder.getOrderNo(), loginUserId);
-                            } catch (Exception e) {
-                                log.warn("璁㈠崟 {} 寮�濮嬭嚜鍔ㄧ粍鎵�", syncOrder.getOrderNo());
+                        boolean itemsCheck = waitPakinService.mergeItemsCheck(pakinParam, loginUserId);
+                        if (itemsCheck) {
+                            CompletableFuture.runAsync(() -> {
+                                try {
+                                    asyncMergeItemsWcs(pakinParam, syncOrder.getOrderNo(), loginUserId);
+                                } catch (Exception e) {
+                                    log.warn("璁㈠崟 {} 寮�濮嬭嚜鍔ㄧ粍鎵�", syncOrder.getOrderNo());
+                                }
+                            });
+                        }
+                    }
+                } else {
+                    // 鍑哄簱锛氭寚瀹氬嚭搴�
+                    // 绔嬪嵆瑙﹀彂寮傛浠诲姟锛屼笉绛夊緟缁撴灉
+                    if (!Cools.isEmpty(palletId.get()) && StringUtils.isNotBlank(syncOrder.getOrderNo()) && !Cools.isEmpty(syncOrder.getStationId())) {
+                        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, palletId.get()));
+                        if (!Cools.isEmpty(loc)) {
+                            //鍑哄簱
+                            List<OutStockToTaskParams> param = new ArrayList<>();
+                            for (WkOrderItem wkOrderItem : orderItems){
+                                OutStockToTaskParams outStockToTaskParams = new OutStockToTaskParams(wkOrderItem);
+                                outStockToTaskParams.setLocCode(loc.getCode());
+                                outStockToTaskParams.setSiteNo(syncOrder.getStationId());
+                                param.add(outStockToTaskParams);
                             }
-                        });
+//                        boolean itemsCheck = waitPakinService.mergeItemsCheck(pakinParam, loginUserId);
+//                            if (true) {
+                            CompletableFuture.runAsync(() -> {
+                                try {
+                                    asyncOutboundExecutionWcs(param, wkOrder.getId(), loginUserId);
+                                } catch (Exception e) {
+                                    log.warn("璁㈠崟 {} 寮�濮嬭嚜鍔ㄥ嚭搴�", syncOrder.getOrderNo());
+                                }
+                            });
+//                            }
+                        }
                     }
                 }
             });
@@ -577,6 +609,35 @@
             log.info("璁㈠崟 {} 鑷姩缁勬墭瀹屾垚锛屽叡澶勭悊 {} 涓」鐩�", orderNo, param.getItems().size());
         } catch (Exception e) {
             log.error("璁㈠崟 {} 鑷姩缁勬墭澶辫触: {}", orderNo, e.getMessage(), e);
+        }
+    }
+
+    @Async
+    public void asyncOutboundExecutionWcs(List<OutStockToTaskParams> param, Long orderId, Long loginUserId) {
+        try {
+//            int i = 0;
+//            List<OutStockToTaskParams> tasks = new ArrayList<>();
+//            while (true) {
+//                tasks = new ArrayList<>();
+//                i++;
+//                if (i > 5) return;
+//                Thread.sleep(3000);
+//                for (OutStockToTaskParams taskParam : new OutStockToTaskParams[param.size()]) {
+//                    if (StringUtils.isNotBlank(taskParam.getLocCode())) {
+//                        tasks.add(taskParam);
+//                    }
+//                }
+//                break;
+//            }
+            if (param.isEmpty()){
+                log.warn("璁㈠崟ID {} 娌℃湁鎵惧埌鍙嚭搴撴槑缁嗭紝璺宠繃鑷姩鍑哄簱", orderId);
+                return;
+            }
+            outStockService.genOutStockTask(param, loginUserId, orderId);
+
+            log.info("璁㈠崟ID {} 鑷姩鍑哄簱锛屽叡澶勭悊 {} 涓槑缁�", orderId, param.size());
+        } catch (Exception e) {
+            log.error("璁㈠崟ID {} 鑷姩鍑哄簱: {}", orderId, e.getMessage(), e);
         }
     }
 
@@ -929,22 +990,25 @@
                 return R.error("鏌ヨ鏉′欢涓嶈兘涓虹┖");
             }
 
-            // 灏咵RP鍙傛暟鏄犲皠涓篔ava瀹炰綋瀛楁鍚嶏紙椹煎嘲鏍煎紡锛夛紝PageParam浼氳嚜鍔ㄨ浆鎹负鏁版嵁搴撳瓧娈靛悕锛堜笅鍒掔嚎鏍煎紡锛�
+            // 灏咵RP鍙傛暟鏄犲皠涓烘暟鎹簱瀛楁鍚嶏紙涓嬪垝绾挎牸寮忥級
             Map<String, Object> queryMap = new HashMap<>();
-
-            // 浠庡疄浣撶被涓彁鍙栨煡璇㈡潯浠讹紝鏄犲皠涓烘暟鎹簱瀛楁鍚�
+            
+            // 浠庡疄浣撶被涓彁鍙栨煡璇㈡潯浠讹紝鏄犲皠涓虹湡瀹炵殑鏁版嵁搴撳瓧娈靛悕
             if (StringUtils.isNotBlank(condition.getLocId())) {
-                queryMap.put("locCode", condition.getLocId());
+                queryMap.put("loc_code", condition.getLocId());
             }
             if (StringUtils.isNotBlank(condition.getMatNr())) {
-                queryMap.put("matnrCode", condition.getMatNr());
+                queryMap.put("matnr_code", condition.getMatNr());
             }
             if (StringUtils.isNotBlank(condition.getPlanNo())) {
-                queryMap.put("trackCode", condition.getPlanNo());
+                queryMap.put("track_code", condition.getPlanNo());
             }
             if (StringUtils.isNotBlank(condition.getBatch())) {
                 queryMap.put("batch", condition.getBatch());
             }
+            // 娉ㄦ剰锛歰rderNo 鍜� wareHouseId 涓嶅湪 LocItem 琛ㄤ腑锛岄渶瑕侀�氳繃鍏朵粬鏂瑰紡鏌ヨ
+            // orderNo 宸插湪鍚庨潰鍗曠嫭澶勭悊锛坧lat_order_code 鍜� plat_work_code锛�
+            // wareHouseId 闇�瑕侀�氳繃 Loc 琛ㄥ叧鑱旀煡璇紝宸插湪鍚庨潰鍗曠嫭澶勭悊
 
             BaseParam baseParam = new BaseParam();
             baseParam.syncMap(queryMap);
@@ -953,10 +1017,27 @@
             QueryWrapper<LocItem> wrapper = pageParam.buildWrapper(false);
 
             // 璁㈠崟鍙�/宸ュ崟鍙�/MES宸ュ崟鍙�
+            // 璁㈠崟鍙峰彲鑳藉瓨鍌ㄥ湪锛�1) LocItem.plat_order_code 2) LocItem.plat_work_code 3) WkOrder.code (閫氳繃orderId鍏宠仈)
             if (StringUtils.isNotBlank(condition.getOrderNo())) {
                 String orderNo = condition.getOrderNo();
-                wrapper.and(w -> w.eq("plat_order_code", orderNo)
-                        .or().eq("plat_work_code", orderNo));
+                
+                // 鍏堟煡璇kOrder琛紝鑾峰彇鍖归厤鐨勮鍗旾D鍒楄〃
+                LambdaQueryWrapper<WkOrder> orderWrapper = new LambdaQueryWrapper<>();
+                orderWrapper.eq(WkOrder::getCode, orderNo);
+                List<WkOrder> matchingOrders = asnOrderService.list(orderWrapper);
+                List<Long> matchingOrderIds = matchingOrders.stream()
+                        .map(WkOrder::getId)
+                        .collect(Collectors.toList());
+                
+                // 鏋勫缓璁㈠崟鍙锋煡璇㈡潯浠讹細LocItem琛ㄧ殑plat_order_code銆乸lat_work_code锛屾垨閫氳繃orderId鍏宠仈WkOrder.code
+                wrapper.and(w -> {
+                    w.eq("plat_order_code", orderNo)
+                     .or().eq("plat_work_code", orderNo);
+                    // 濡傛灉鎵惧埌浜嗗尮閰嶇殑璁㈠崟锛屼篃鏌ヨorderId
+                    if (!matchingOrderIds.isEmpty()) {
+                        w.or().in("order_id", matchingOrderIds);
+                    }
+                });
             }
 
             // 鐗╂枡缁勶紙闇�瑕侀�氳繃鐗╂枡琛ㄥ叧鑱旀煡璇級
@@ -1180,4 +1261,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