From 91831843f3b9fa4c9f29e518e10dae5d3f9aead8 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期四, 30 四月 2026 10:40:51 +0800
Subject: [PATCH] 增加几种出入库单类型

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java |  140 ++++++++++++++++++++++++++++------------------
 1 files changed, 85 insertions(+), 55 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
index a8b30e1..535bd96 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -406,64 +406,58 @@
             return R.error("鍗曟嵁淇℃伅涓嶅瓨鍦紒锛�");
         }
         List<TaskItem> taskItems = params.getTaskItems();
-        Map<String, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getMatnrCode));
-        // 鎷h揣瀹屾垚浠呮墸鍑忓簱浣嶆暟閲忓苟绱姞 TaskItem.qty锛屼笉鏇存柊鍑哄簱鍗�/璁㈠崟锛涘緟鎵樼洏鍏ㄩ儴鎷e畬鍦� saveWavePick 鍐嶆寜椤哄簭鏇存柊搴撳瓨骞舵牎楠�
+        // 鎸夎鍗曟槑缁嗚鍖哄垎锛氬悓鍗曞悓鐗╂枡澶氳涓嶅緱鎸� matnr 鍚堝苟
         Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.ALLOW_OVER_CHANGE));
-        listMap.keySet().forEach(code -> {
-            List<TaskItem> items = listMap.get(code);
-            WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
-                    .eq(WkOrderItem::getMatnrCode, code)
-                    .eq(WkOrderItem::getOrderId, order.getId()));
+        Map<Long, Double> batchPickSumByOrderItem = new HashMap<>();
+        for (TaskItem taskItemParam : taskItems) {
+            TaskItem item = taskItemService.getById(taskItemParam.getId());
+            if (Objects.isNull(item)) {
+                throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
+            }
+            WkOrderItem orderItem = resolveOrderItemForPick(item, order.getId());
             if (Objects.isNull(orderItem)) {
                 throw new CoolException("鏁版嵁閿欒锛屾嫞鏂欎笉鍦ㄥ崟鎹渶姹備腑锛侊紒");
             }
-            Double summed = items.stream().mapToDouble(ti -> ti.getAnfme() != null ? ti.getAnfme() : 0.0).sum();
-            Double pickQty = Math.round((orderItem.getQty() != null ? orderItem.getQty() : 0.0) + summed) * 1000000.0 / 1000000.0;
+            Double pickInc = taskItemParam.getAnfme() != null ? taskItemParam.getAnfme() : 0.0;
+            Double prevBatch = batchPickSumByOrderItem.getOrDefault(orderItem.getId(), 0.0);
+            Double pickQty = Math.round((orderItem.getQty() != null ? orderItem.getQty() : 0.0) + prevBatch + pickInc) * 1000000.0 / 1000000.0;
             if (!Objects.isNull(config) && !Boolean.parseBoolean(config.getVal())) {
                 if (pickQty.compareTo(orderItem.getAnfme()) > 0.0) {
                     throw new CoolException("鎾鏁伴噺涓嶈兘瓒呭嚭璁㈠崟闇�姹傛暟閲�");
                 }
+                Double v = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + pickInc) * 1000000.0) / 1000000.0;
+                if (item.getAnfme() != null && item.getAnfme().compareTo(v) < 0.0) {
+                    throw new CoolException("褰撳墠鐗╂枡宸茶秴鍑哄彲鎷h寖鍥达紝璇锋牳瀵瑰悗鍐嶆搷浣滐紒锛�");
+                }
             }
-
-            items.forEach(taskItem -> {
-                TaskItem item = taskItemService.getById(taskItem.getId());
-                if (Objects.isNull(item)) {
-                    throw new CoolException("浠诲姟鏄庣粏涓嶅瓨鍦紒锛�");
-                }
-                if (!Objects.isNull(config) && !Boolean.parseBoolean(config.getVal())) {
-                    Double v = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + (taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0)) * 1000000.0) / 1000000.0;
-                    if (item.getAnfme() != null && item.getAnfme().compareTo(v) < 0.0) {
-                        throw new CoolException("褰撳墠鐗╂枡宸茶秴鍑哄彲鎷h寖鍥达紝璇锋牳瀵瑰悗鍐嶆搷浣滐紒锛�");
-                    }
-                }
-                Double picQty = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + (taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0)) * 1000000.0) / 1000000.0;
-                item.setQty(picQty).setOrderId(order.getId()).setOrderItemId(orderItem.getId());
-                if (!taskItemService.updateById(item)) {
-                    throw new CoolException("鎷h揣鏁伴噺鏇存柊澶辫触锛侊紒");
-                }
-                if (StringUtils.isNotBlank(task.getOrgLoc())) {
-                    LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
-                            .eq(LocItem::getLocCode, task.getOrgLoc())
-                            .eq(LocItem::getMatnrId, item.getMatnrId())
-                            .eq(StringUtils.isNotBlank(item.getBatch()), LocItem::getBatch, item.getBatch())
-                            .eq(StringUtils.isNotBlank(item.getFieldsIndex()), LocItem::getFieldsIndex, item.getFieldsIndex()));
-                    if (Objects.nonNull(locItem)) {
-                        Double pickAmt = taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0;
-                        Double newAnfme = Math.round((locItem.getAnfme() - pickAmt) * 1000000.0) / 1000000.0;
-                        if (newAnfme.compareTo(0.0) <= 0) {
-                            locItemService.removeById(locItem.getId());
-                        } else {
-                            locItem.setAnfme(newAnfme)
-                                    .setUpdateBy(SystemAuthUtils.getLoginUserId())
-                                    .setUpdateTime(new Date());
-                            if (!locItemService.updateById(locItem)) {
-                                throw new CoolException("搴撲綅鏄庣粏鏁伴噺鎵e噺澶辫触锛侊紒");
-                            }
+            batchPickSumByOrderItem.merge(orderItem.getId(), pickInc, (a, b) -> (a != null ? a : 0.0) + (b != null ? b : 0.0));
+            Double picQty = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + pickInc) * 1000000.0) / 1000000.0;
+            item.setQty(picQty).setOrderId(order.getId()).setOrderItemId(orderItem.getId());
+            if (!taskItemService.updateById(item)) {
+                throw new CoolException("鎷h揣鏁伴噺鏇存柊澶辫触锛侊紒");
+            }
+            if (StringUtils.isNotBlank(task.getOrgLoc())) {
+                LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
+                        .eq(LocItem::getLocCode, task.getOrgLoc())
+                        .eq(LocItem::getMatnrId, item.getMatnrId())
+                        .eq(StringUtils.isNotBlank(item.getBatch()), LocItem::getBatch, item.getBatch())
+                        .eq(StringUtils.isNotBlank(item.getFieldsIndex()), LocItem::getFieldsIndex, item.getFieldsIndex()));
+                if (Objects.nonNull(locItem)) {
+                    Double pickAmt = pickInc;
+                    Double newAnfme = Math.round((locItem.getAnfme() - pickAmt) * 1000000.0) / 1000000.0;
+                    if (newAnfme.compareTo(0.0) <= 0) {
+                        locItemService.removeById(locItem.getId());
+                    } else {
+                        locItem.setAnfme(newAnfme)
+                                .setUpdateBy(SystemAuthUtils.getLoginUserId())
+                                .setUpdateTime(new Date());
+                        if (!locItemService.updateById(locItem)) {
+                            throw new CoolException("搴撲綅鏄庣粏鏁伴噺鎵e噺澶辫触锛侊紒");
                         }
                     }
                 }
-            });
-        });
+            }
+        }
         return R.ok();
     }
 
@@ -607,18 +601,27 @@
             WkOrder order = asnOrderService.getById(orderId);
             if (order == null) continue;
             List<TaskItem> items = byOrder.get(orderId);
-            Map<String, List<TaskItem>> byMatnr = items.stream().collect(Collectors.groupingBy(TaskItem::getMatnrCode));
-            for (String code : byMatnr.keySet()) {
-                List<TaskItem> matItems = byMatnr.get(code);
-                WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
-                        .eq(WkOrderItem::getMatnrCode, code)
-                        .eq(WkOrderItem::getOrderId, orderId));
-                if (orderItem == null) continue;
+            Map<Long, List<TaskItem>> byOrderItem = new LinkedHashMap<>();
+            for (TaskItem ti : items) {
+                WkOrderItem oi = resolveOrderItemForPick(ti, orderId);
+                if (oi == null) {
+                    continue;
+                }
+                byOrderItem.computeIfAbsent(oi.getId(), k -> new ArrayList<>()).add(ti);
+            }
+            for (Map.Entry<Long, List<TaskItem>> e : byOrderItem.entrySet()) {
+                WkOrderItem orderItem = asnOrderItemService.getById(e.getKey());
+                if (orderItem == null) {
+                    continue;
+                }
+                List<TaskItem> matItems = e.getValue();
                 Double summed = matItems.stream().mapToDouble(t -> t.getQty() != null ? t.getQty() : 0.0).sum();
                 orderItem.setQty(summed);
                 asnOrderItemService.updateById(orderItem);
                 String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
-                if (StringUtils.isBlank(ruleCode)) continue;
+                if (StringUtils.isBlank(ruleCode)) {
+                    continue;
+                }
                 Stock stock = new Stock();
                 stock.setCode(ruleCode)
                         .setUpdateBy(loginUserId)
@@ -630,7 +633,9 @@
                         .setSourceCode(orderItem.getOrderCode())
                         .setUpdateTime(new Date())
                         .setAnfme(summed);
-                if (!stockService.save(stock)) continue;
+                if (!stockService.save(stock)) {
+                    continue;
+                }
                 List<StockItem> stockItems = new ArrayList<>();
                 for (TaskItem ti : matItems) {
                     StockItem si = new StockItem();
@@ -666,6 +671,31 @@
     }
 
 
+    /**
+     * 娉㈡鎷h揣锛氫换鍔℃槑缁嗕笌璁㈠崟琛屽搴旓紙orderItemId 浼樺厛锛屽惁鍒欒鍐呯爜 platItemId锛夛紝閬垮厤鍚屽崟鍚屾枡澶氳鍙懡涓竴鏉�
+     */
+    private WkOrderItem resolveOrderItemForPick(TaskItem taskItem, Long orderId) {
+        if (taskItem.getOrderItemId() != null) {
+            WkOrderItem oi = asnOrderItemService.getById(taskItem.getOrderItemId());
+            if (oi != null && orderId.equals(oi.getOrderId())) {
+                return oi;
+            }
+        }
+        if (StringUtils.isNotBlank(taskItem.getPlatItemId())) {
+            WkOrderItem oi = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
+                    .eq(WkOrderItem::getOrderId, orderId)
+                    .eq(WkOrderItem::getPlatItemId, taskItem.getPlatItemId())
+                    .last("LIMIT 1"));
+            if (oi != null) {
+                return oi;
+            }
+        }
+        return asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>()
+                .eq(WkOrderItem::getMatnrCode, taskItem.getMatnrCode())
+                .eq(WkOrderItem::getOrderId, orderId)
+                .last("LIMIT 1"));
+    }
+
     private Boolean checkWaveComplete(TaskItem taskItem) {
         Wave wave = waveService.getById(taskItem.getSourceId());
         List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getWaveId, wave.getId()));

--
Gitblit v1.9.1