From 450320f28d8db37264d7fc448c01fb32f64610b2 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期四, 13 十一月 2025 16:53:06 +0800
Subject: [PATCH] 波次出库修改

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java           |   17 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java     |   43 +++
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java |   19 ++
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java  |  330 ++++++++++++++++++++++++++---------
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ContainerWaveParam.java     |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/ExistDto.java          |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java              |   58 +++---
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/WavePickItemsParams.java    |   24 ++
 9 files changed, 375 insertions(+), 127 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
index d1fc67f..1e287d7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/PdaOutStockController.java
@@ -3,6 +3,7 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.api.entity.dto.ContainerWaveDto;
 import com.vincent.rsf.server.api.entity.params.ContainerWaveParam;
+import com.vincent.rsf.server.api.entity.params.WavePickItemsParams;
 import com.vincent.rsf.server.api.service.PdaOutStockService;
 import com.vincent.rsf.server.system.controller.BaseController;
 import io.swagger.annotations.Api;
@@ -54,10 +55,28 @@
     }
 
     @PreAuthorize("hasAuthority('manager:task:list')")
+    @PostMapping("/wave/order/items")
+    @ApiOperation("鑾峰彇娉㈡鎷h揣鏄庣粏")
+    public R getWaveOrderItem(@RequestBody Map<String, Object> params) {
+        return pdaOutStockService.getWaveOrderItems(params);
+    }
+
+    @PreAuthorize("hasAuthority('manager:task:list')")
+    @ApiOperation("娉㈡鏄庣粏鎷h揣")
+    @PostMapping("/wave/pick/item")
+    public R wavePickItems(@RequestBody WavePickItemsParams items) {
+        return pdaOutStockService.wavePickItems(items);
+    }
+
+
+    @PreAuthorize("hasAuthority('manager:task:list')")
     @PostMapping("/saveWavePick")
     @ApiOperation("鏍规嵁瀹瑰櫒鐮佹煡璇㈡尝娆″強鍑哄簱鍗�")
     public R saveWavePick(@RequestBody ContainerWaveParam containerWaveParam) {
 
         return pdaOutStockService.saveWavePick(containerWaveParam,getLoginUserId());
     }
+
+
+
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ContainerWaveParam.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ContainerWaveParam.java
index 93cf2c2..eb8b5e6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ContainerWaveParam.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/ContainerWaveParam.java
@@ -1,6 +1,8 @@
 package com.vincent.rsf.server.api.entity.params;
 
 import com.vincent.rsf.server.api.entity.dto.ContainerWaveDto;
+import com.vincent.rsf.server.manager.entity.TaskItem;
+import com.vincent.rsf.server.manager.entity.WkOrderItem;
 import io.swagger.annotations.ApiModel;
 import lombok.Data;
 import lombok.experimental.Accessors;
@@ -14,5 +16,7 @@
 
     private String container;
 
+    private List<WkOrderItem> orderItems;
+
     private List<ContainerWaveDto> containerWaveDtos;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/WavePickItemsParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/WavePickItemsParams.java
new file mode 100644
index 0000000..96ad0c9
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/WavePickItemsParams.java
@@ -0,0 +1,24 @@
+package com.vincent.rsf.server.api.entity.params;
+
+import com.vincent.rsf.server.manager.entity.TaskItem;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "WavePickItemsParams", description = "娉㈡鎷h揣鏄庣粏")
+public class WavePickItemsParams {
+
+    @ApiModelProperty("鎵樼洏鐮�")
+    private String barcode;
+
+    @ApiModelProperty("璁㈠崟ID")
+    private Long orderId;
+
+    @ApiModelProperty("浠诲姟鏄庣粏")
+    private List<TaskItem> taskItems;
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
index 0cb81ca..8224bca 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/PdaOutStockService.java
@@ -3,6 +3,7 @@
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.api.entity.dto.ContainerWaveDto;
 import com.vincent.rsf.server.api.entity.params.ContainerWaveParam;
+import com.vincent.rsf.server.api.entity.params.WavePickItemsParams;
 
 import java.util.List;
 import java.util.Map;
@@ -17,4 +18,20 @@
     R saveWavePick(ContainerWaveParam containerWaveParam,Long loginUserId);
 
     R saveOutTaskSts(String barcode);
+
+    /**
+     * @author Ryan
+     * @date 2025/11/13
+     * @description: 鑾峰彇娉㈡璁㈠崟鏄庣粏
+     * @version 1.0
+     */
+    R getWaveOrderItems(Map<String, Object> params);
+
+    /**
+     * @author Ryan
+     * @date 2025/11/13
+     * @description: 娉㈡鏄庣粏鎷h揣
+     * @version 1.0
+     */
+    R wavePickItems(WavePickItemsParams items);
 }
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 a00e287..4775bf7 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
@@ -6,19 +6,24 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.api.entity.dto.ContainerWaveDto;
 import com.vincent.rsf.server.api.entity.params.ContainerWaveParam;
+import com.vincent.rsf.server.api.entity.params.WavePickItemsParams;
 import com.vincent.rsf.server.api.service.PdaOutStockService;
 import com.vincent.rsf.server.manager.entity.*;
 import com.vincent.rsf.server.manager.enums.AsnExceStatus;
 import com.vincent.rsf.server.manager.enums.TaskStsType;
 import com.vincent.rsf.server.manager.service.*;
+import com.vincent.rsf.server.system.entity.Fields;
 import com.vincent.rsf.server.system.entity.FieldsItem;
 import com.vincent.rsf.server.system.service.FieldsItemService;
+import com.vincent.rsf.server.system.service.FieldsService;
 import com.vincent.rsf.server.system.service.impl.FieldsItemServiceImpl;
+import com.vincent.rsf.server.system.service.impl.FieldsServiceImpl;
 import lombok.Synchronized;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -42,6 +47,8 @@
     private WaveOrderRelaService waveOrderRelaService;
     @Autowired
     private FieldsItemService fieldsItemService;
+    @Autowired
+    private FieldsService fieldsService;
 
     @Override
     public R getOutStockTaskItem(String barcode) {
@@ -98,7 +105,6 @@
     @Override
     public R getContainerWaveList(Map<String, String> map) {
         String barcode = map.get("barcode");
-
         if (Cools.isEmpty(barcode)) {
             throw new CoolException("鍙傛暟鏈夎");
         }
@@ -109,37 +115,183 @@
         if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
             return R.error("浠诲姟鐘舵�佷笉鏄瓑寰呯‘璁�");
         }
-        ArrayList<ContainerWaveDto> containerWaveDtos = new ArrayList<>();
         List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
-        for (TaskItem taskItem : taskItems) {
-            ContainerWaveDto containerWaveDto = new ContainerWaveDto();
-            containerWaveDto.setTaskItem(taskItem);
-            Wave wave = waveService.getById(taskItem.getSourceId());
-            if (null == wave) {
-                throw new CoolException("鏈壘鍒板鍣ㄥ彿瀵瑰簲娉㈡");
-            }
-            List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>()
-                    .eq(WaveOrderRela::getWaveId, wave.getId()));
-            if (Cools.isEmpty(waveOrderRelas)) {
-                throw new CoolException("娉㈡瀵瑰簲鍏宠仈鍗曟湭鎵惧埌");
-            }
-            Set<Long> ids = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toSet());
-            ArrayList<WkOrderItem> list = new ArrayList<>();
-            List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, ids));
-            for (WkOrder wkOrder : wkOrderList) {
-                List<WkOrderItem> orderItem = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
-                        .eq(WkOrderItem::getOrderId, wkOrder.getId())
-                        .eq(StringUtils.isNotEmpty(taskItem.getMatnrCode()), WkOrderItem::getMatnrCode, taskItem.getMatnrCode())
-                        .eq(StringUtils.isNotEmpty(taskItem.getBatch()), WkOrderItem::getSplrBatch, taskItem.getBatch()));
-                if (null != orderItem) {
-                    list.addAll(orderItem);
-                }
-            }
-            containerWaveDto.setWkOrderItems(list);
-            containerWaveDtos.add(containerWaveDto);
+        Set<Long> longSet = taskItems.stream().map(TaskItem::getSourceId).collect(Collectors.toSet());
+        List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>()
+                .in(WaveOrderRela::getWaveId, longSet));
+        if (Cools.isEmpty(waveOrderRelas)) {
+            throw new CoolException("娉㈡瀵瑰簲鍏宠仈鍗曟湭鎵惧埌");
         }
+        Set<Long> orderIds = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toSet());
+        List<WkOrder> wkOrders = asnOrderService.listByIds(orderIds);
+        if (wkOrders.isEmpty()) {
+            throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+        }
+        Set<String> codes = taskItems.stream().map(TaskItem::getMatnrCode).collect(Collectors.toSet());
+        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
+                .in(WkOrderItem::getMatnrCode, codes)
+                .in(WkOrderItem::getOrderId, orderIds));
 
-        return R.ok(containerWaveDtos);
+        return R.ok("鏌ヨ鎴愬姛").add(orderItems);
+
+//        ArrayList<ContainerWaveDto> containerWaveDtos = new ArrayList<>();
+////        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
+//        for (TaskItem taskItem : taskItems) {
+//            ContainerWaveDto containerWaveDto = new ContainerWaveDto();
+//            containerWaveDto.setTaskItem(taskItem);
+//            Wave wave = waveService.getById(taskItem.getSourceId());
+//            if (null == wave) {
+//                throw new CoolException("鏈壘鍒板鍣ㄥ彿瀵瑰簲娉㈡");
+//            }
+//            List<WaveOrderRela> waveOrderRelas = waveOrderRelaService.list(new LambdaQueryWrapper<WaveOrderRela>()
+//                    .eq(WaveOrderRela::getWaveId, wave.getId()));
+//            if (Cools.isEmpty(waveOrderRelas)) {
+//                throw new CoolException("娉㈡瀵瑰簲鍏宠仈鍗曟湭鎵惧埌");
+//            }
+//            Set<Long> ids = waveOrderRelas.stream().map(WaveOrderRela::getOrderId).collect(Collectors.toSet());
+//            ArrayList<WkOrderItem> list = new ArrayList<>();
+//            List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, ids));
+//            for (WkOrder wkOrder : wkOrderList) {
+//                List<WkOrderItem> orderItem = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
+//                        .eq(WkOrderItem::getOrderId, wkOrder.getId())
+//                        .eq(StringUtils.isNotEmpty(taskItem.getMatnrCode()), WkOrderItem::getMatnrCode, taskItem.getMatnrCode())
+//                        .eq(StringUtils.isNotEmpty(taskItem.getBatch()), WkOrderItem::getSplrBatch, taskItem.getBatch()));
+//                if (null != orderItem) {
+//                    list.addAll(orderItem);
+//                }
+//            }
+//            containerWaveDto.setWkOrderItems(list);
+//            containerWaveDtos.add(containerWaveDto);
+//        }
+//        return R.ok("鏌ヨ鎴愬姛").add(wkOrders);
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/11/13
+     * @description: 鑾峰彇娉㈡鎷h揣鏄庣粏
+     * @version 1.0
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R getWaveOrderItems(Map<String, Object> param) {
+        if (Objects.isNull(param)) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(param.get("fieldsIndex"))) {
+            return R.error("绁ㄥ彿涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(param.get("barcode"))) {
+            return R.error("瀹瑰櫒鍙蜂笉鑳戒负绌猴紒锛�");
+        }
+        if (Objects.isNull(param.get("orderId"))) {
+            return R.error("璁㈠崟ID涓嶈兘涓虹┖锛侊紒");
+        }
+        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, param.get("barcode").toString()));
+        if (Objects.isNull(task)) {
+            throw new CoolException("鏁版嵁閿欒锛屼换鍔℃。宸蹭笉瀛樺湪锛侊紒");
+        }
+        FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>()
+                .eq(FieldsItem::getValue, param.get("fieldsIndex").toString())
+                .last("limit 1"));
+        if (Objects.isNull(fieldsItem)) {
+            return R.error("鏁版嵁閿欒锛岀エ鍙蜂笉瀛樺湪锛侊紒");
+        }
+        TaskItem taskItem = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>()
+                        .eq(TaskItem::getFieldsIndex, fieldsItem.getUuid())
+                .eq(TaskItem::getTaskId, task.getId()));
+        if (Objects.isNull(taskItem)) {
+            return R.error("鏁版嵁閿欒锛屼换鍔℃。鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+//        Long orderId = Long.valueOf(param.get("orderId").toString());
+//        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, orderId));
+//        if (orderItems.isEmpty()) {
+//            return R.error("鏁版嵁閿欒锛岃鍗曟暟鎹笉瀛樺湪锛侊紒");
+//        }
+        //鏍规嵁绱㈠紩鑾峰彇鍔ㄦ�佸瓧娈礦alue鍊�
+        Map<String, String> fields = new HashMap<>();
+        Fields fields1 = fieldsService.getById(fieldsItem.getFieldsId());
+        fields.put(fields1.getFields(), fieldsItem.getValue());
+        taskItem.setExtendFields(fields);
+
+        return R.ok().add(taskItem);
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/11/13
+     * @description: 娉㈡鏄庣粏鎷h揣
+     * @version 1.0
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R wavePickItems(WavePickItemsParams params) {
+        if (Objects.isNull(params.getBarcode())) {
+            return R.error("鎵樼洏鐮佷笉鑳戒负绌猴紒锛�");
+        }
+        if (Objects.isNull(params.getOrderId())) {
+            return R.error("璁㈠崟ID涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(params.getTaskItems()) || params.getTaskItems().isEmpty()) {
+            return R.error("鎷h揣鏄庣粏涓嶈兘涓虹┖锛�");
+        }
+        Task task = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, params.getBarcode()));
+        if (null == task) {
+            return R.error("鏈壘鍒版墭鐩樺搴旂殑浠诲姟");
+        }
+        if (!task.getTaskStatus().equals(TaskStsType.AWAIT.id)) {
+            return R.error("浠诲姟鐘舵�佷笉鏄瓑寰呯‘璁�");
+        }
+        WkOrder order = asnOrderService.getById(params.getOrderId());
+        if (Objects.isNull(order)) {
+            return R.error("鍗曟嵁淇℃伅涓嶅瓨鍦紒锛�");
+        }
+        List<TaskItem> taskItems = params.getTaskItems();
+        Map<String, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getMatnrCode));
+        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()));
+            if (Objects.isNull(orderItem)) {
+                throw new CoolException("鏁版嵁閿欒锛屾嫞鏂欎笉鍦ㄥ崟鎹渶姹備腑锛侊紒");
+            }
+            Double summed = items.stream().mapToDouble(TaskItem::getAnfme).sum();
+            //鍔犱笂鍘嗗彶鎷f枡鏁伴噺
+            Double pickQty = Math.round((orderItem.getQty() + summed) * 10000) / 10000.0;
+            if (pickQty.compareTo(orderItem.getAnfme()) > 0.0) {
+                throw new CoolException("鎾鏁伴噺涓嶈兘瓒呭嚭璁㈠崟闇�姹傛暟閲�");
+            }
+            orderItem.setQty(pickQty);
+
+            if (!asnOrderItemService.updateById(orderItem)) {
+                throw new CoolException("鍑哄簱鍗曟槑缁嗘洿鏂板け璐ワ紒锛�");
+            }
+
+            items.forEach(taskItem -> {
+                taskItem.setQty(taskItem.getAnfme());
+                if (!taskItemService.updateById(taskItem)) {
+                    throw new CoolException("鐘舵�佸畬鎴愬け璐ワ紒锛�");
+                }
+            });
+        });
+
+        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, params.getOrderId()));
+        double total = orderItems.stream().mapToDouble(WkOrderItem::getQty).sum();
+        order.setQty(total);
+        if (!asnOrderService.updateById(order)) {
+            throw new CoolException("璁㈠崟鏁伴噺鏇存柊澶辫触锛侊紒");
+        }
+//        //妫�鏌ュ崟鎹槸鍚﹀畬鎴�
+//        if (order.getAnfme().compareTo(order.getQty()) == 0) {
+//            order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
+//            if (!asnOrderService.updateById(order)) {
+//                throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
+//            }
+//        }
+
+        return R.ok();
     }
 
     /**
@@ -163,73 +315,75 @@
             return R.error("浠诲姟鐘舵�佷笉鏄瓑寰呯‘璁�");
         }
 
-        for (ContainerWaveDto containerWaveDto : containerWaveParam.getContainerWaveDtos()) {
-            //鍋氫竴娆℃牎楠岋紝鍒ゆ柇鍓嶇鎵�鏈夊嚭搴撴暟閲忔槸鍚﹁秴杩囨湰鎵樺嚭搴撴暟閲�
-            double sum = containerWaveDto.getWkOrderItems().stream().mapToDouble(WkOrderItem::getDemandQty).sum();
-            BigDecimal total = new BigDecimal(String.valueOf(sum));
-            BigDecimal anfme = new BigDecimal(containerWaveDto.getTaskItem().getAnfme().toString());
-            if (!anfme.equals(total)) {
-                throw new CoolException("鎾鏁伴噺涓嶇瓑浜庡鍣ㄥ嚭搴撴暟閲忥紝璇锋鏌�");
-            }
-            for (WkOrderItem oldOrderItem : containerWaveDto.getWkOrderItems()) {
-                if (Double.compare(oldOrderItem.getDemandQty(), 0.0) == 0) {
-                    continue;
-                }
-                WkOrderItem orderItem = asnOrderItemService.getById(oldOrderItem.getId());
-                BigDecimal num = new BigDecimal(orderItem.getWorkQty().toString()).subtract(new BigDecimal(orderItem.getQty().toString()));
-                BigDecimal orderDemandQty = new BigDecimal(oldOrderItem.getDemandQty().toString());
-                if (num.compareTo(orderDemandQty) < 0) {
-                    throw new CoolException("鎾鏁伴噺澶т簬鍗曟嵁鍑哄簱鏁伴噺锛岃妫�鏌�");
-                }
-                WkOrder wkOrder = asnOrderService.getById(orderItem.getOrderId());
-                if (Cools.isEmpty(wkOrder)) {
-                    throw new CoolException("鍑哄簱鍗曚富鍗曟湭鎵惧埌");
-                }
-                wkOrder.setQty(new BigDecimal(wkOrder.getQty().toString()).add(orderDemandQty).doubleValue());
-                if (!asnOrderService.updateById(wkOrder)) {
-                    throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
-                }
-
-                if (Objects.isNull(oldOrderItem.getFieldsIndex())) {
-                    throw new CoolException("绁ㄥ彿涓嶈兘涓虹┖锛侊紒");
-                }
-                //Fix 杩欓噷鍙拡瀵瑰笇鏃ラ」鐩殑绁ㄥ彿鍔熻兘锛岀エ鍙峰拰uuid涓轰竴瀵逛竴鐨勬儏鍐碉紝涓嶄細鍑虹幇閲嶅鐨勬儏鍐�
-                FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getValue, oldOrderItem.getFieldsIndex()).last("limit 1"));
-                if (!Objects.isNull(fieldsItem)) {
-                    orderItem.setFieldsIndex(fieldsItem.getUuid());
-                }
-                orderItem.setQty(new BigDecimal(orderItem.getQty().toString()).add(orderDemandQty).doubleValue());
-                if (!asnOrderItemService.updateById(orderItem)) {
-                    throw new CoolException("鍗曟嵁鏄庣粏鏇存柊澶辫触");
-                }
-                //妫�鏌ュ崟鎹槸鍚﹀畬鎴�
-                Boolean orderChecked = checkOrderComplete(orderItem);
-                if (orderChecked) {
-                    wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
-                    if (!asnOrderService.updateById(wkOrder)) {
-                        throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
-                    }
-                }
-            }
-        //妫�鏌ユ尝娆℃槸鍚﹀畬鎴�
-//            Boolean waveChecked = checkWaveComplete(containerWaveDto.getTaskItem());
-//            if (waveChecked){
-//                Wave wave = waveService.getById(containerWaveDto.getTaskItem().getSourceId());
-//                if (null == wave){
-//                    throw new CoolException("鏈壘鍒板鍣ㄥ彿瀵瑰簲娉㈡");
+//        containerWaveParam.getOrderItems().forEach(orderItem -> {
+//
+//        });
+//        for (ContainerWaveDto containerWaveDto : containerWaveParam.getContainerWaveDtos()) {
+//            //鍋氫竴娆℃牎楠岋紝鍒ゆ柇鍓嶇鎵�鏈夊嚭搴撴暟閲忔槸鍚﹁秴杩囨湰鎵樺嚭搴撴暟閲�
+//            double sum = containerWaveDto.getWkOrderItems().stream().mapToDouble(WkOrderItem::getDemandQty).sum();
+//            BigDecimal total = new BigDecimal(String.valueOf(sum));
+//            BigDecimal anfme = new BigDecimal(containerWaveDto.getTaskItem().getAnfme().toString());
+//            if (!anfme.equals(total)) {
+//                throw new CoolException("鎾鏁伴噺涓嶇瓑浜庡鍣ㄥ嚭搴撴暟閲忥紝璇锋鏌�");
+//            }
+//            for (WkOrderItem oldOrderItem : containerWaveDto.getWkOrderItems()) {
+//                if (Double.compare(oldOrderItem.getDemandQty(), 0.0) == 0) {
+//                    continue;
 //                }
-//                wave.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_TASK.val);
-//                if (!waveService.updateById(wave)){
-//                    throw new CoolException("娉㈡鍗曟洿鏂扮姸鎬佸け璐�");
+//                WkOrderItem orderItem = asnOrderItemService.getById(oldOrderItem.getId());
+//                BigDecimal num = new BigDecimal(orderItem.getWorkQty().toString()).subtract(new BigDecimal(orderItem.getQty().toString()));
+//                BigDecimal orderDemandQty = new BigDecimal(oldOrderItem.getDemandQty().toString());
+//                if (num.compareTo(orderDemandQty) < 0) {
+//                    throw new CoolException("鎾鏁伴噺澶т簬鍗曟嵁鍑哄簱鏁伴噺锛岃妫�鏌�");
+//                }
+//                WkOrder wkOrder = asnOrderService.getById(orderItem.getOrderId());
+//                if (Cools.isEmpty(wkOrder)) {
+//                    throw new CoolException("鍑哄簱鍗曚富鍗曟湭鎵惧埌");
+//                }
+//                wkOrder.setQty(new BigDecimal(wkOrder.getQty().toString()).add(orderDemandQty).doubleValue());
+//                if (!asnOrderService.updateById(wkOrder)) {
+//                    throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
+//                }
+//
+//                if (Objects.isNull(oldOrderItem.getFieldsIndex())) {
+//                    throw new CoolException("绁ㄥ彿涓嶈兘涓虹┖锛侊紒");
+//                }
+//                //Fix 杩欓噷鍙拡瀵瑰笇鏃ラ」鐩殑绁ㄥ彿鍔熻兘锛岀エ鍙峰拰uuid涓轰竴瀵逛竴鐨勬儏鍐碉紝涓嶄細鍑虹幇閲嶅鐨勬儏鍐�
+//                FieldsItem fieldsItem = fieldsItemService.getOne(new LambdaQueryWrapper<FieldsItem>().eq(FieldsItem::getValue, oldOrderItem.getFieldsIndex()).last("limit 1"));
+//                if (!Objects.isNull(fieldsItem)) {
+//                    orderItem.setFieldsIndex(fieldsItem.getUuid());
+//                }
+//                orderItem.setQty(new BigDecimal(orderItem.getQty().toString()).add(orderDemandQty).doubleValue());
+//                if (!asnOrderItemService.updateById(orderItem)) {
+//                    throw new CoolException("鍗曟嵁鏄庣粏鏇存柊澶辫触");
+//                }
+//                //妫�鏌ュ崟鎹槸鍚﹀畬鎴�
+//                Boolean orderChecked = checkOrderComplete(orderItem);
+//                if (orderChecked) {
+//                    wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
+//                    if (!asnOrderService.updateById(wkOrder)) {
+//                        throw new CoolException("鍑哄簱鍗曟洿鏂扮姸鎬佸け璐�");
+//                    }
 //                }
 //            }
-        }
+//        //妫�鏌ユ尝娆℃槸鍚﹀畬鎴�
+////            Boolean waveChecked = checkWaveComplete(containerWaveDto.getTaskItem());
+////            if (waveChecked){
+////                Wave wave = waveService.getById(containerWaveDto.getTaskItem().getSourceId());
+////                if (null == wave){
+////                    throw new CoolException("鏈壘鍒板鍣ㄥ彿瀵瑰簲娉㈡");
+////                }
+////                wave.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_TASK.val);
+////                if (!waveService.updateById(wave)){
+////                    throw new CoolException("娉㈡鍗曟洿鏂扮姸鎬佸け璐�");
+////                }
+////            }
+//        }
 
         task.setTaskStatus(TaskStsType.COMPLETE_OUT.id);
         if (!taskService.updateById(task)) {
             throw new CoolException("浠诲姟鐘舵�佹洿鏂板け璐�");
         }
-
 
         return R.ok();
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/ExistDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/ExistDto.java
index 90a8f54..93d682e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/ExistDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/ExistDto.java
@@ -9,4 +9,5 @@
     private String locNo;
     private String matnr;
     private String batch;
+    private String lastSite;
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index 50df08e..6cf090d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -345,8 +345,8 @@
                 }
             });
         }
-        
-        
+
+
         if (!asnOrderItemService.saveOrUpdateBatch(orderItems)) {
             throw new CoolException("鍑哄簱鍗曟墽琛屾暟閲忎慨鏀瑰け璐ワ紒锛�");
         }
@@ -723,7 +723,7 @@
                         p1.getUpdateBy(),
                         p1.getMemo()
                 ),
-                WaveItem::getSplrBatch, WaveItem::getMatnrCode, WaveItem::getFieldsIndex
+                 WaveItem::getMatnrCode
         );
 
         return waveItems;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
index 42fe873..ebe1571 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
@@ -279,21 +279,48 @@
     @Synchronized
     @Transactional(rollbackFor = Exception.class)
     public void generateOutTask(List<OrderOutItemDto> itemParams, Long loginUserId, Wave wave) throws Exception {
-        for (OrderOutItemDto itemDto : itemParams) {
+        Map<Long, List<OrderOutItemDto>> listMap = itemParams.stream().collect(Collectors.groupingBy(OrderOutItemDto::getLocId));
+        listMap.keySet().forEach(id -> {
+            double sum = listMap.get(id).stream().mapToDouble(OrderOutItemDto::getAnfme).sum();
+            List<LocItem> items = new ArrayList<>();
+            //鐢熸垚鏄庣粏
+            listMap.get(id).forEach(orderOutItemDto -> {
+                items.add(orderOutItemDto.getLocItem());
+            });
+            //鑾峰彇涓嶄负绌虹珯鐐�
+            List<OrderOutItemDto> itemDtos = listMap.get(id).stream().filter(orderOutItemDto -> !Objects.isNull(orderOutItemDto.getSitesNo())).collect(Collectors.toList());
+            OrderOutItemDto itemDto = itemDtos.stream().findFirst().get();
+            itemDto.setAnfme(sum);
             LocToTaskParams taskParams = new LocToTaskParams();
             Loc loc = locService.getById(itemDto.getLocId());
-            if (Objects.isNull(loc)) {
-                continue;
-            }
-            taskParams.setItems(Arrays.asList(itemDto.getLocItem()))
+            taskParams.setItems(items)
                     .setSiteNo(itemDto.getSitesNo())
                     .setType(Constants.TASK_TYPE_WAVE_OUT_STOCK)
                     .setSourceId(wave.getId())
                     .setTarLoc(loc.getCode());
-
             //TODO 鐢熸垚鍑哄簱浠诲姟锛岃幏鍙栨尝娆″崟鎹俊鎭�
-            locItemService.generateTask(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val, taskParams, loginUserId);
-        }
+            try {
+                locItemService.generateTask(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val, taskParams, loginUserId);
+            } catch (Exception e) {
+                throw new CoolException("鍑哄簱浠诲姟鐢熸垚澶辫触锛�");
+            }
+        });
+
+//        for (OrderOutItemDto itemDto : itemParams) {
+//            LocToTaskParams taskParams = new LocToTaskParams();
+//            Loc loc = locService.getById(itemDto.getLocId());
+//            if (Objects.isNull(loc)) {
+//                continue;
+//            }
+//            taskParams.setItems(Arrays.asList(itemDto.getLocItem()))
+//                    .setSiteNo(itemDto.getSitesNo())
+//                    .setType(Constants.TASK_TYPE_WAVE_OUT_STOCK)
+//                    .setSourceId(wave.getId())
+//                    .setTarLoc(loc.getCode());
+//
+//            //TODO 鐢熸垚鍑哄簱浠诲姟锛岃幏鍙栨尝娆″崟鎹俊鎭�
+//            locItemService.generateTask(TaskResouceType.TASK_RESOUCE_WAVE_TYPE.val, taskParams, loginUserId);
+//        }
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
index cc667d6..f16250a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
@@ -13,7 +13,7 @@
 import com.vincent.rsf.server.manager.enums.WaveRuleType;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.enums.LocStsType;
-import io.swagger.models.auth.In;
+
 import org.apache.commons.lang3.StringUtils;
 
 import javax.swing.*;
@@ -158,7 +158,8 @@
         List<OrderOutItemDto> list = new ArrayList<>();
         //涓嶈绔欑偣閲嶅浣跨敤闂
         List<BasStation> stations = new ArrayList<>();
-        Set<ExistDto> existDtos = new HashSet<>();
+        List<ExistDto> existDtos = new ArrayList<>();
+        Set<Loc> locs = new HashSet<>();
         for (WaveToLocParams item : params) {
             BigDecimal issued = new BigDecimal(item.getAnfme().toString())
                     .subtract(new BigDecimal(item.getWorkQty().toString()));
@@ -189,41 +190,42 @@
                                 .setSource(item.getItemId());//娉㈡鏄庣粏ID
                         OrderOutItemDto orderOutItemDto = new OrderOutItemDto();
                         orderOutItemDto.setLocItem(locItem);
-
+                        orderOutItemDto.setSource(item.getItemId())
+                                .setSourceId(item.getWaveId());
                         List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
                                 .eq(!Objects.isNull(loc.getChannel()), DeviceSite::getChannel, loc.getChannel())
                                 .eq(DeviceSite::getType, issued.doubleValue() >= locItem.getAnfme() && itemList.size() == 1 ? TaskType.TASK_TYPE_OUT.type : TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
                         );
 
-                        if (!deviceSites.isEmpty()) {
-                            List<OrderOutItemDto.staListDto> maps = new ArrayList<>();
-                            for (DeviceSite sta : deviceSites) {
-                                OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto();
-                                staListDto.setStaNo(sta.getSite());
-                                staListDto.setStaName(sta.getSite());
-                                maps.add(staListDto);
-                            }
-                            orderOutItemDto.setStaNos(maps);
-                            //鑾峰彇婊¤冻鏉′欢绔欑偣
-                            Set<String> stationSet = deviceSites.stream().map(DeviceSite::getSite).collect(Collectors.toSet());
-                            //宸蹭娇鐢ㄧ珯鐐�
-                            Set<String> stas = stations.stream().map(BasStation::getStationName).collect(Collectors.toSet());
-                            BasStationService basStationService = SpringUtils.getBean(BasStationService.class);
-                            BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
-                                    .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
-                                    .in(BasStation::getStationName, stationSet)
-                                    .notIn(!stas.isEmpty(), BasStation::getStationName, stas)
-                                    .last("LIMIT 1"));
-                            stations.add(basStation);
+                        if (locs.add(loc)) {
+                            if (!deviceSites.isEmpty()) {
+                                List<OrderOutItemDto.staListDto> maps = new ArrayList<>();
+                                for (DeviceSite sta : deviceSites) {
+                                    OrderOutItemDto.staListDto staListDto = new OrderOutItemDto.staListDto();
+                                    staListDto.setStaNo(sta.getSite());
+                                    staListDto.setStaName(sta.getSite());
+                                    maps.add(staListDto);
+                                }
+                                orderOutItemDto.setStaNos(maps);
+                                //鑾峰彇婊¤冻鏉′欢绔欑偣
+                                Set<String> stationSet = deviceSites.stream().map(DeviceSite::getSite).collect(Collectors.toSet());
+                                //宸蹭娇鐢ㄧ珯鐐�
+                                Set<String> stas = stations.stream().map(BasStation::getStationName).collect(Collectors.toSet());
+                                BasStationService basStationService = SpringUtils.getBean(BasStationService.class);
+                                BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
+                                        .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
+                                        .in(BasStation::getStationName, stationSet)
+                                        .notIn(!stas.isEmpty(), BasStation::getStationName, stas)
+                                        .last("LIMIT 1"));
+                                stations.add(basStation);
 
-                            if (Objects.isNull(basStation)) {
-                                throw new CoolException("绔欓粸涓嶅瓨鍦紒锛�");
+                                if (Objects.isNull(basStation)) {
+                                    throw new CoolException("绔欓粸涓嶅瓨鍦紒锛�");
+                                }
+                                orderOutItemDto.setSitesNo(basStation.getStationName());
                             }
-                            orderOutItemDto.setSitesNo(basStation.getStationName());
                         }
 
-                        orderOutItemDto.setSource(item.getItemId())
-                                .setSourceId(item.getWaveId());
 
                         list.add(orderOutItemDto);
 

--
Gitblit v1.9.1