From b0926b3d4379d087d5c0187882b98be0ed88da83 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 28 四月 2025 17:40:44 +0800
Subject: [PATCH] #新增  1. 波次生成出库任务

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java                  |    6 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java     |  177 ++++++++++++++++++++++++-----
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java                   |   19 ++
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java             |   46 +++---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java                  |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java              |    7 
 rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx                                            |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java                  |    3 
 rsf-admin/src/i18n/zh.js                                                                      |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java                      |    3 
 rsf-admin/src/i18n/en.js                                                                      |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java        |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java                |   28 ++--
 14 files changed, 224 insertions(+), 79 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 6207c83..37cd4e3 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -70,7 +70,7 @@
             loadMore: 'Load More Data',
             complete: 'Complete',
             deprecate: 'Deprecate',
-            stockError: 'Insuff stock ',
+            stockError: 'Empty',
             inputPlaceholder: 'Use commas to separate',
             resend: 'RESEND',
             selected: 'selected',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 53d905e..8f6d2d3 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -71,7 +71,7 @@
             loadMore: '鍔犺浇鏇村',
             complete: '瀹屾垚',
             deprecate: '搴熷純',
-            stockError: '搴撳瓨涓嶈冻',
+            stockError: '娌℃湁搴撳瓨',
             resend: '閲嶅彂',
             selected: '椤归�変腑',
             batch: '鎵归噺缂栬緫'
diff --git a/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx b/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx
index a0b4d7e..2f81a39 100644
--- a/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx
+++ b/rsf-admin/src/page/orders/wave/ItemToTaskModal.jsx
@@ -165,7 +165,7 @@
     const notify = useNotify();
     const redirect = useRedirect();
     const generateTask = async () => {
-        const res = await request.post(`/wave/public/task`, { wave: dataSource });
+        const res = await request.post(`/wave/public/task`, { wave: record, waveItem: dataSource });
         if (res?.data?.code === 200) {
             notify(res.data.msg);
             redirect("/task")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
index 5fc1dfc..47c79d8 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskStsType.java
@@ -3,13 +3,13 @@
 public enum TaskStsType {
 
     //浠诲姟鐘舵��
-    GENERATE_IN(1L, "鍒涘缓鍏ュ簱浠诲姟"),
-    WCS_EXECUTE_IN(2L, "RCS浠诲姟宸蹭笅鍙�"),
-    WCS_CONTAINER_RECEIVE(3L, "RCS瀹瑰櫒鍒拌揪"),
-    WCS_CONVEYOR_START(4L, "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"),
-    WCS_TOTE_LOAD(5L, "RCS鍙栫瀹屾垚"),
-    WCS_TOTE_UNLOAD(6L, "RCS鏀剧瀹屾垚"),
-    WCS_PUTAWAY_SUCESS(7L, "RCS浠诲姟瀹屾垚"),
+    GENERATE_IN("1", "鍒涘缓鍏ュ簱浠诲姟"),
+    WCS_EXECUTE_IN("2", "RCS浠诲姟宸蹭笅鍙�"),
+    WCS_CONTAINER_RECEIVE("3", "RCS瀹瑰櫒鍒拌揪"),
+    WCS_CONVEYOR_START("4", "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"),
+    WCS_TOTE_LOAD("5", "RCS鍙栫瀹屾垚"),
+    WCS_TOTE_UNLOAD("6", "RCS鏀剧瀹屾垚"),
+    WCS_PUTAWAY_SUCESS("7", "RCS浠诲姟瀹屾垚"),
 
 //    WCS_PUTAWAY_FAILED(11L, "浠诲姟澶辫触"),
 //
@@ -17,36 +17,36 @@
 //
 //    WCS_PUTAWAY_SUSPEND(13L, "鍏ュ簱浠诲姟鎸傝捣"),
 
-    COMPLETE_IN(99L, "鍏ュ簱瀹屾垚"),
+    COMPLETE_IN("99", "鍏ュ簱瀹屾垚"),
 
-    UPDATED_IN(100L, "搴撳瓨鏇存柊瀹屾垚"),
+    UPDATED_IN("100", "搴撳瓨鏇存柊瀹屾垚"),
 
-    GENERATE_OUT(101L, "鍒涘缓鍑哄簱浠诲姟"),
+    GENERATE_OUT("101", "鍒涘缓鍑哄簱浠诲姟"),
 
-    WCS_EXECUTE_OUT(102L, "RCS鍑哄簱浠诲姟宸蹭笅鍙�"),
+    WCS_EXECUTE_OUT("102", "RCS鍑哄簱浠诲姟宸蹭笅鍙�"),
 
-    WCS_EXECUTE_OUT_TOTE_LOAD(103L, "RCS鍙栫瀹屾垚"),
+    WCS_EXECUTE_OUT_TOTE_LOAD("103", "RCS鍙栫瀹屾垚"),
 
-    WCS_EXECUTE_OUT_TOTE_UNLOAD(104L, "RCS鏀剧瀹屾垚"),
+    WCS_EXECUTE_OUT_TOTE_UNLOAD("104", "RCS鏀剧瀹屾垚"),
 
-    WCS_EXECUTE_OUT_TASK_DONE(105L, "RCS浠诲姟瀹屾垚"),
+    WCS_EXECUTE_OUT_TASK_DONE("105", "RCS浠诲姟瀹屾垚"),
 
-    WCS_EXECUTE_OUT_ARRIVED(106L, "RCS瀹瑰櫒宸插埌杈�"),
+    WCS_EXECUTE_OUT_ARRIVED("106", "RCS瀹瑰櫒宸插埌杈�"),
 
-    WCS_EXECUTE_OUT_CONVEYOR(107L, "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"),
+    WCS_EXECUTE_OUT_CONVEYOR("107", "RCS瀹瑰櫒娴佸姩浠诲姟宸蹭笅鍙�"),
 
-    GENERATE_WAVE_SEED(197L, "绛夊緟瀹瑰櫒鍒拌揪"),
-    WAVE_SEED(198L, "鎾涓�"),
+    GENERATE_WAVE_SEED("197", "绛夊緟瀹瑰櫒鍒拌揪"),
+    WAVE_SEED("198", "鎾涓�"),
 
-    COMPLETE_OUT(199L, "鍑哄簱瀹屾垚"),
-    UPDATED_OUT(200L, "搴撳瓨鏇存柊瀹屾垚"),
+    COMPLETE_OUT("199", "鍑哄簱瀹屾垚"),
+    UPDATED_OUT("200", "搴撳瓨鏇存柊瀹屾垚"),
     ;
 
-    public Long id;
+    public Short id;
     public String desc;
 
-    TaskStsType(Long id, String desc) {
-        this.id = id;
+    TaskStsType(String id, String desc) {
+        this.id = Short.parseShort(id);
         this.desc = desc;
     }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java
index 80a8ae0..c5cbfd6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/enums/TaskType.java
@@ -9,23 +9,23 @@
  */
 public enum TaskType {
 
-    TASK_TYPE_IN(1, "鍏ュ簱"),
-    TASK_TYPE_EMPITY_IN(10, "绌烘澘鍏ュ簱"),
-    TASK_TYPE_LOC_MOVE(11, "搴撴牸绉昏浇"),
-    TASK_TYPE_PICK_IN(53, "鎷f枡鍐嶅叆搴�"),
-    TASK_TYPE_MERGE_IN(54, "骞舵澘鍐嶅叆搴�"),
-    TASK_TYPE_CHECK_IN(57, "鐩樼偣鍐嶅叆搴�"),
-    TASK_TYPE_OUT(101, "鍑哄簱"),
-    TASK_TYPE_PICK_AGAIN_IN(103, "鎷f枡鍏ュ簱"),
-    TASK_TYPE_MERGE_OUT(104, "骞舵澘鍑哄簱"),
-    TASK_TYPE_CHECK_OUT(107, "鐩樼偣鍑哄簱"),
-    TASK_TYPE_EMPITY_OUT(110, "绌烘澘鍑哄簱"),
+    TASK_TYPE_IN("1", "鍏ュ簱"),
+    TASK_TYPE_EMPITY_IN("10", "绌烘澘鍏ュ簱"),
+    TASK_TYPE_LOC_MOVE("11", "搴撴牸绉昏浇"),
+    TASK_TYPE_PICK_IN("53", "鎷f枡鍐嶅叆搴�"),
+    TASK_TYPE_MERGE_IN("54", "骞舵澘鍐嶅叆搴�"),
+    TASK_TYPE_CHECK_IN("57", "鐩樼偣鍐嶅叆搴�"),
+    TASK_TYPE_OUT("101", "鍑哄簱"),
+    TASK_TYPE_PICK_AGAIN_IN("103", "鎷f枡鍏ュ簱"),
+    TASK_TYPE_MERGE_OUT("104", "骞舵澘鍑哄簱"),
+    TASK_TYPE_CHECK_OUT("107", "鐩樼偣鍑哄簱"),
+    TASK_TYPE_EMPITY_OUT("110", "绌烘澘鍑哄簱"),
     ;
-    public Integer type;
+    public Short type;
     public String desc;
 
-    TaskType(Integer type, String desc) {
-        this.type = type;
+    TaskType(String type, String desc) {
+        this.type = Short.parseShort(type);
         this.desc = desc;
     }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
index a14c907..d21aa52 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WaveController.java
@@ -118,14 +118,14 @@
         if (Cools.isEmpty(map) || Cools.isEmpty(map.get("wave"))) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        return waveService.publicTask(map);
+        return waveService.publicTask(map, getLoginUserId());
     }
 
     @PreAuthorize("hasAuthority('manager:wave:list')")
     @ApiOperation("娉㈡鍑哄簱浠诲姟棰勮")
     @PostMapping("/wave/locs/preview/page")
     public R mergeWavePreview(@RequestBody Map<String, Object> map) {
-        if (Cools.isEmpty(map.get("wave")) || StringUtils.isBlank(map.get("wave").toString())) {
+        if (Cools.isEmpty(map.get("waveId")) || StringUtils.isBlank(map.get("waveId").toString())) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
         Long waveId = Long.parseLong(map.get("waveId").toString());
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
index 1017e0e..54348e0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/AsnOrder.java
@@ -91,6 +91,9 @@
     @ApiModelProperty(value= "鐗╂祦鍗曞彿")
     private String logisNo;
 
+    @ApiModelProperty("娉㈡ID")
+    private Long waveId;
+
     /**
      * 棰勮鍒拌揪鏃堕棿
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
index 6382e57..2a7897e 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
@@ -1,6 +1,7 @@
 package com.vincent.rsf.server.manager.entity;
 
-import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.*;
+
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
@@ -9,10 +10,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -106,8 +104,10 @@
     @ApiModelProperty(value= "鏁伴噺")
     private Double anfme;
 
+
     @ApiModelProperty("鎵ц鏁伴噺")
     private Double workQty;
+
 
     @ApiModelProperty("瀹屾垚鏁伴噺")
     private Double qty;
@@ -187,6 +187,17 @@
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
+    @TableField(exist = false)
+    private Long waveId;
+
+    @TableField(exist = false)
+    private Long waveItemId;
+
+    @TableField(exist = false)
+    private String waveCode;
+
+
+
     /**
      * 澶囨敞
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
index 5424d53..2bb3cf0 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TaskItem.java
@@ -77,6 +77,9 @@
      */
     @ApiModelProperty("鐗╂枡璺熻釜鐮�")
     private String trackCode;
+
+    @ApiModelProperty("渚涘簲鍟嗘尝娆�")
+    private String splrBatch;
     /**
      * 鐗╂枡缂栫爜
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
index 1490cc7..78f965a 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Wave.java
@@ -70,6 +70,9 @@
     @ApiModelProperty(value= "宸插畬鎴愭暟閲�")
     private Double qty;
 
+    @ApiModelProperty("鐩爣浣嶇疆")
+    private String targSite;
+
     /**
      * 鍗曟嵁鏁伴噺
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java
index 619bc5f..a83f7e7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WaveItem.java
@@ -184,6 +184,12 @@
     @TableField(exist = false)
     private Double stockQty;
 
+
+    /***
+     * 鏄惁鍏ㄦ嫋鍑哄簱
+     */
+    @TableField(exist = false)
+    private Short flagAll;
     /**
      * 澶囨敞
      */
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
index e6648c9..c9cc4f7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/WaveService.java
@@ -11,13 +11,14 @@
 public interface WaveService extends IService<Wave> {
 
     /**
+     * @param
+     * @param loginUserId
+     * @return
      * @author Ryan
      * @description 娉㈡浠诲姟涓嬪彂
-     * @param
-     * @return
      * @time 2025/4/25 16:24
      */
-    R publicTask(Map<String, Object> map);
+    R publicTask(Map<String, Object> map, Long loginUserId);
 
     /**
      * @author Ryan
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 b08055a..ded80e7 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
@@ -291,6 +291,7 @@
         }
 
         if (!this.update(new LambdaUpdateWrapper<AsnOrder>()
+                .set(AsnOrder::getWaveId, wave.getId())
                 .set(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WAVE.val)
                 .in(AsnOrder::getId, ids))) {
             throw new CoolException("鎵ц鐘舵�佷慨鏀逛慨鏀瑰け璐ワ紒锛�");
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 96355b3..f070e5f 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
@@ -6,16 +6,17 @@
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
-import com.vincent.rsf.server.manager.entity.AsnOrder;
-import com.vincent.rsf.server.manager.entity.LocItem;
-import com.vincent.rsf.server.manager.entity.WaveItem;
+import com.vincent.rsf.server.api.entity.enums.TaskStsType;
+import com.vincent.rsf.server.api.entity.enums.TaskType;
+import com.vincent.rsf.server.manager.entity.*;
 import com.vincent.rsf.server.manager.enums.AsnExceStatus;
 import com.vincent.rsf.server.manager.enums.WaveExceStatus;
 import com.vincent.rsf.server.manager.mapper.WaveMapper;
-import com.vincent.rsf.server.manager.entity.Wave;
 import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.vincent.rsf.server.manager.utils.OptimalAlgorithmUtil;
+import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -24,7 +25,6 @@
 
 import java.util.*;
 import java.util.stream.Collectors;
-import java.util.stream.IntStream;
 
 @Service("waveService")
 public class WaveServiceImpl extends ServiceImpl<WaveMapper, Wave> implements WaveService {
@@ -41,9 +41,12 @@
     private TaskItemService taskItemService;
     @Autowired
     private LocItemService locItemService;
+    @Autowired
+    private LocService locService;
 
     /**
      * @param
+     * @param loginUserId
      * @return
      * @author Ryan
      * @description 娉㈡浠诲姟涓嬪彂
@@ -51,25 +54,24 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public R publicTask(Map<String, Object> map) {
-        List<WaveItem> itemParams = (List<WaveItem>) map.get("wave");
+    public R publicTask(Map<String, Object> map, Long loginUserId) {
+        List<WaveItem> itemParams = (List<WaveItem>) map.get("waveItem");
         if (Objects.isNull(itemParams) || itemParams.isEmpty()) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        List<Long> ids = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList());
-        List<Wave> waves = this.list(new LambdaQueryWrapper<Wave>().in(Wave::getId, ids));
-        if (Objects.isNull(waves) || waves.isEmpty()) {
+        Wave wave = (Wave) map.get("wave");
+        Wave waves = this.getById(new LambdaQueryWrapper<Wave>().in(Wave::getId, wave.getId()));
+        if (Objects.isNull(waves)) {
             throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦紒锛�");
         }
-        List<Long> list = waves.stream().map(Wave::getId).collect(Collectors.toList());
+        List<Long> list = itemParams.stream().map(WaveItem::getWaveId).collect(Collectors.toList());
         List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().in(WaveItem::getWaveId, list));
         if (waveItems.isEmpty()) {
             throw new CoolException("娉㈡鏄庣粏涓嶅瓨鍦紒锛�");
         }
-        List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList());
-        /**鏌ヨ姣忔潯鏄庣粏鍖归厤鐨勫簱浣�*/
+        /**鐢熸垚鍑哄簱浠诲姟*/
         try {
-//            List<WaveItem> items = getLocs(waveItems);
+            generateOutTask(itemParams, loginUserId, wave);
         } catch (Exception e) {
             throw new CoolException("搴撲綅鑾峰彇澶辫触锛侊紒锛�");
         }
@@ -77,17 +79,130 @@
         // 2. 鏍规嵁鐗╂枡SKU瀵绘壘绗﹀悎鐗╂枡搴撲綅  {1. 鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣� 2. 鍒ゆ柇褰撳墠璁㈠崟鏄叏鎷栧嚭搴撹繕鏄嫞鏂欏叆搴搣
         // 3. 淇敼涓诲崟銆佹尝娆℃墽琛屾暟閲�
         // 4. 鍒ゆ柇鍏ㄤ粨鍑哄簱鎴栨嫞鏂欏嚭搴�
-//        List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds));
-//        /**淇敼鍘熷嚭搴撳崟鐘舵��*/
-//        if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>()
-//                .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val)
-//                .in(AsnOrder::getId, orders))) {
-//            throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-//        }
-//        if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).in(Wave::getId, ids))) {
-//            throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-//        }
+        List<Long> orderIds = waveItems.stream().map(WaveItem::getOrderId).collect(Collectors.toList());
+
+        List<AsnOrder> orders = asnOrderService.list(new LambdaQueryWrapper<AsnOrder>().in(AsnOrder::getId, orderIds));
+        /**淇敼鍑哄簱鍗曠姸鎬�*/
+        if (!asnOrderService.update(new LambdaQueryWrapper<AsnOrder>()
+                .eq(AsnOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val)
+                .in(AsnOrder::getId, orders))) {
+            throw new CoolException("鍑哄簱鍗曟嵁鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
+        /**淇敼娉㈡鍗曟嵁鎵ц鐘舵��*/
+        if (!this.update(new LambdaUpdateWrapper<Wave>().set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK).eq(Wave::getId, wave.getId()))) {
+            throw new CoolException("娉㈡鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+        }
         return R.ok();
+    }
+
+    /**
+     * @param
+     * @param loginUserId
+     * @param wave
+     * @return
+     * @author Ryan
+     * @description 鐢熸垚鍑哄簱浠诲姟
+     * @time 2025/4/28 14:01
+     */
+    @Transactional(rollbackFor = Exception.class)
+    private synchronized void generateOutTask(List<WaveItem> itemParams, Long loginUserId, Wave wave) throws Exception {
+        List<LocItem> locItemList = new ArrayList<>();
+        for (WaveItem param : itemParams) {
+            String locs = param.getStockLocs();
+            List<LocItem> locItems = JSONArray.parseArray(locs, LocItem.class);
+            if (locItems.isEmpty()) {
+                continue;
+            }
+            List<Long> list = locItems.stream().map(LocItem::getId).collect(Collectors.toList());
+            /**鏍规嵁渚涘簲鍟嗘壒娆★紝鐗╂枡鐮侊紝 鍔ㄦ�佸瓧娈垫煡璇㈡寚瀹氱殑鐗╂枡搴撳瓨淇℃伅*/
+            List<LocItem> items = locItemService.list(new LambdaQueryWrapper<LocItem>()
+                    .eq(LocItem::getSplrBatch, param.getSplrBatch())
+                    .in(LocItem::getLocId, list)
+                    .eq(StringUtils.isNotBlank(param.getFieldsIndex()), LocItem::getFieldsIndex, param.getFieldsIndex())
+                    .eq(LocItem::getMatnrCode, param.getMatnrCode()));
+            if (items.isEmpty()) {
+                throw new CoolException("搴撳瓨淇℃伅鏈夊彉锛岃鍙栨秷褰撳墠娉㈡锛岀敓鏂扮敓鎴愭柊鐨勬尝娆★紒锛�");
+            }
+            /***灏嗘湁璐ф湁鐨勬槑缁嗕俊鎭瓨鏀惧埌搴撲綅淇℃伅涓�*/
+            for (int i = 0; i < items.size(); i++) {
+                items.get(i)
+                        .setWaveId(param.getWaveId())
+                        .setWaveCode(param.getWaveCode())
+                        .setWaveItemId(param.getId());
+            }
+            locItemList.addAll(items);
+        }
+        if (locItemList.isEmpty()) {
+            throw new CoolException("娌℃湁鍚堥�傚簱浣嶏紒锛�");
+        }
+
+        /**鎷嗗垎娉㈡鏄庣粏搴撲綅闆嗭紝鍚堝苟鐩稿悓搴撲綅锛屽垎瑙d换鍔℃槑缁�*/
+        Map<Long, List<LocItem>> listMap = locItemList.stream().collect(Collectors.groupingBy(LocItem::getLocId));
+        /**鏍规嵁搴撲綅姹囨�讳俊鎭紝鐢熸垚浠诲姟鏄庣粏**/
+        listMap.keySet().forEach(key -> {
+            List<LocItem> locItems = listMap.get(key);
+            LocItem item1 = locItems.stream().findFirst().get();
+            WaveItem waveItem = waveItemService.getById(item1.getWaveItemId());
+            if (null == waveItem || Objects.isNull(waveItem)) {
+                throw new CoolException("鏁版嵁閿欒锛氭尝娆℃槑缁嗕笉瀛樺湪锛侊紒");
+            }
+            //TODO 褰撳墠浠诲姟瀹屾垚鍚庯紝閫氳繃瀹氭椂浜嬩欢鍒ゆ柇鏄叏鐩樺嚭搴擄紝杩樻槸鎷f枡鍐嶅叆搴�
+            Loc loc = locService.getById(key);
+            Task task = new Task();
+            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
+            if (StringUtils.isBlank(ruleCode)) {
+                throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌ャ�孲YS_TASK_CODE銆嶆槸鍚﹁缃畬鎴愶紒锛�");
+            }
+            if (Objects.isNull(loc)) {
+                throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
+            }
+            task.setTaskCode(ruleCode)
+                    .setTaskType(TaskType.TASK_TYPE_OUT.type)
+                    .setTaskStatus(TaskStsType.GENERATE_OUT.id)
+                    .setBarcode(loc.getBarcode())
+                    .setOrgLoc(loc.getCode())
+                    .setCreateBy(loginUserId)
+                    .setUpdateBy(loginUserId)
+                    .setTargSite(wave.getTargSite());
+
+            if (!taskService.save(task)) {
+                throw new CoolException("浠诲姟鐢熸垚澶辫触锛侊紒");
+            }
+            List<TaskItem> taskItems = new ArrayList<>();
+            /**鐢熸垚浠诲姟鏄庣粏淇℃伅*/
+            for (LocItem item : locItems) {
+                TaskItem taskItem = new TaskItem();
+                BeanUtils.copyProperties(item, taskItem);
+                taskItem.setTaskId(task.getId())
+                        .setId(null)
+                        .setSource(item.getWaveItemId());
+                taskItems.add(taskItem);
+            }
+            if (!taskItemService.saveBatch(taskItems)) {
+                throw new CoolException("浠诲姟鏄庣粏淇濆瓨澶辫触锛侊紒");
+            }
+
+            /**淇敼娉㈡鎵ц鏁伴噺*/
+            taskItems.forEach(item -> {
+                boolean update = waveItemService.update(new LambdaUpdateWrapper<WaveItem>()
+                        .eq(WaveItem::getWaveId, item.getSource())
+                        .set(WaveItem::getWorkQty, item.getAnfme()));
+                if (!update) {
+                    throw new CoolException("娉㈡鎵ц鏁伴噺淇敼澶辫触锛侊紒");
+                }
+            });
+
+            List<WaveItem> waveItems = waveItemService.list(new LambdaQueryWrapper<WaveItem>().eq(WaveItem::getWaveId, wave.getId()));
+            double sum = waveItems.stream().mapToDouble(WaveItem::getWorkQty).sum();
+            /**娉㈡涓诲崟淇℃伅淇敼*/
+            if (!update(new LambdaUpdateWrapper<Wave>()
+                    .eq(Wave::getId, wave.getId())
+                    .set(Wave::getWorkQty, sum)
+                    .set(Wave::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_TASK.val))) {
+                throw new CoolException("娉㈡涓诲崟淇℃伅淇敼澶辫触锛侊紒");
+            }
+
+        });
     }
 
     /**
@@ -129,7 +244,7 @@
         //TODO  鏍规嵁鐗╂枡缂栫爜锛屾壒娆★紝鍔ㄦ�佸瓧娈� 鏌ヨ绗﹀悎鐨勫簱浣嶏紝鍐嶆牴鎹簱浣嶄腑鐗╂枡鐨勬暟閲忛�夋嫨鏈�閫傚悎鐨勫簱浣�
         waveItems.forEach(waveItem -> {
             List<LocItem> locItems = locItemService.list(new QueryWrapper<LocItem>()
-                    .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code")
+                    .select("id", "loc_id", "loc_code", "order_id", "SUM(anfme) anfme", "SUM(qty) qty", "SUM(work_qty) work_qty", "splr_batch", "fields_index", "matnr_code")
                     .lambda()
                     .eq(LocItem::getMatnrCode, waveItem.getMatnrCode())
                     .eq(LocItem::getSplrBatch, waveItem.getSplrBatch())
@@ -140,19 +255,21 @@
 
             /**浣跨敤鍥炴函绠楁硶璁$畻锛岃幏鍙栫鍚堝嚭搴撻噺鐨勬渶绠�缁勫悎*/
             List<Integer> result = OptimalAlgorithmUtil.findCombination(doubles, waveItem.getAnfme());
+
             String locs = "[]";
-            if (Objects.isNull(result)) {
+            if (Objects.isNull(result) || result.isEmpty()) {
                 waveItem.setStockLocs(locs).setStockQty(0.0);
             } else {
                 /**杩囨护闆嗗悎涓渶绠�鐭殑缁勫悎*/
                 List<LocItem> locsInfo = result.stream()
                         .filter(i -> i >= 0 && i < locItems.size())
                         .map(locItems::get).collect(Collectors.toList());
+
                 locs = JSONArray.toJSONString(locsInfo);
-                double sumQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum();
-                double surQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum();
-                double qty = locItems.stream().mapToDouble(LocItem::getQty).sum();
-                double v = sumQty - surQty - qty;
+                Double sumQty = locsInfo.stream().mapToDouble(LocItem::getAnfme).sum();
+                Double surQty = locsInfo.stream().mapToDouble(LocItem::getWorkQty).sum();
+                Double qty = locsInfo.stream().mapToDouble(LocItem::getQty).sum();
+                Double v = sumQty - surQty - qty;
                 waveItem.setStockLocs(locs).setStockQty(v);
             }
         });

--
Gitblit v1.9.1