From e6d3803d1bafb782c0907fa925ec110932bc3f23 Mon Sep 17 00:00:00 2001
From: 1 <1@123>
Date: 星期三, 25 二月 2026 14:46:34 +0800
Subject: [PATCH] lsh#

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java |  307 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 284 insertions(+), 23 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..67eefb8 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,9 @@
 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.dto.OrderOutItemDto;
+import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
+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 +115,8 @@
     private WarehouseAreasItemServiceImpl warehouseAreasItemService;
     @Autowired
     private LocItemService locItemService;
+    @Autowired
+    private OutStockService outStockService;
 
 
     /**
@@ -523,22 +528,45 @@
                     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)) {
+//                            outStockService.getOrderOutTaskItem(orderOutTaskParam,param.getOrderItemId());
+                            //鍑哄簱
+//                        boolean itemsCheck = waitPakinService.mergeItemsCheck(pakinParam, loginUserId);
+//                            if (true) {
+                            CompletableFuture.runAsync(() -> {
+                                try {
+                                    asyncOutboundExecutionWcs(syncOrder.getStationId(), wkOrder.getId(), loginUserId);
+                                } catch (Exception e) {
+                                    log.warn("璁㈠崟 {} 寮�濮嬭嚜鍔ㄥ嚭搴�", syncOrder.getOrderNo());
+                                }
+                            });
+//                            }
+                        }
                     }
                 }
             });
@@ -577,6 +605,37 @@
             log.info("璁㈠崟 {} 鑷姩缁勬墭瀹屾垚锛屽叡澶勭悊 {} 涓」鐩�", orderNo, param.getItems().size());
         } catch (Exception e) {
             log.error("璁㈠崟 {} 鑷姩缁勬墭澶辫触: {}", orderNo, e.getMessage(), e);
+        }
+    }
+
+    @Async
+    public void asyncOutboundExecutionWcs(String stationId ,Long orderId, Long loginUserId) {
+        try {
+
+            OrderOutTaskParam orderOutTaskParam = new OrderOutTaskParam();
+            orderOutTaskParam.setOrderId(orderId);
+            orderOutTaskParam.setWaveId(16L);
+            List<OrderOutItemDto> orderOutTaskItemAuto = outStockService.getOrderOutTaskItemAuto(orderOutTaskParam);
+
+            List<OutStockToTaskParams> tasks = new ArrayList<>();
+            for (OrderOutItemDto orderOutItemDto : orderOutTaskItemAuto){
+                OutStockToTaskParams outStockToTaskParams = new OutStockToTaskParams(orderOutItemDto);
+                outStockToTaskParams.setId(orderOutItemDto.getLocItem().getId());
+//                                outStockToTaskParams.setOutQty(locItemServiceOne.getAnfme());
+                outStockToTaskParams.setLocCode(orderOutItemDto.getLocItem().getLocCode());
+                outStockToTaskParams.setBarcode(orderOutItemDto.getLocItem().getBarcode());
+                outStockToTaskParams.setSiteNo(stationId);
+                tasks.add(outStockToTaskParams);
+            }
+            if (tasks.isEmpty()){
+                log.warn("璁㈠崟ID {} 娌℃湁鎵惧埌鍙嚭搴撴槑缁嗭紝璺宠繃鑷姩鍑哄簱", orderId);
+                return;
+            }
+            outStockService.genOutStockTask(tasks, loginUserId, orderId);
+
+            log.info("璁㈠崟ID {} 鑷姩鍑哄簱锛屽叡澶勭悊 {} 涓槑缁�", orderId, tasks.size());
+        } catch (Exception e) {
+            log.error("璁㈠崟ID {} 鑷姩鍑哄簱: {}", orderId, e.getMessage(), e);
         }
     }
 
@@ -929,22 +988,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 +1015,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 +1259,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