From 8d702fa2c62b3617f71c5e91293e338d1ccd1549 Mon Sep 17 00:00:00 2001
From: lsh <lsh@163.com>
Date: 星期六, 08 十一月 2025 13:15:23 +0800
Subject: [PATCH] *

---
 src/main/java/com/zy/asrs/service/WorkService.java                     |    4 
 src/main/java/com/zy/asrs/utils/OutboundAllocationUtil.java            |  106 ++++++++++
 src/main/java/com/zy/common/config/CoolExceptionHandler.java           |   24 ++
 src/main/java/com/zy/asrs/controller/OpenController.java               |   32 --
 src/main/java/com/zy/asrs/utils/OrderOutBatchUtil.java                 |  165 ++++++++++++++++
 src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java            |  106 ++++++++++
 src/main/java/com/zy/asrs/entity/param/OrderCargoBookingNoteParam.java |   47 ++++
 pom.xml                                                                |    5 
 src/main/java/com/zy/asrs/controller/OutController.java                |   15 +
 src/main/java/com/zy/asrs/entity/param/OrderOutLocBoxCsUtilParam.java  |   37 +++
 src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java            |   49 ++--
 src/main/java/com/zy/asrs/service/OpenService.java                     |    2 
 12 files changed, 538 insertions(+), 54 deletions(-)

diff --git a/pom.xml b/pom.xml
index 878f0dc..b5b19bf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,11 @@
             <artifactId>spring-boot-starter-web</artifactId>
         </dependency>
         <dependency>
+            <groupId>org.hibernate.validator</groupId>
+            <artifactId>hibernate-validator</artifactId>
+            <version>6.0.17.Final</version>
+        </dependency>
+        <dependency>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-tomcat</artifactId>
             <scope>provided</scope>
diff --git a/src/main/java/com/zy/asrs/controller/OpenController.java b/src/main/java/com/zy/asrs/controller/OpenController.java
index d0061c3..174e6b9 100644
--- a/src/main/java/com/zy/asrs/controller/OpenController.java
+++ b/src/main/java/com/zy/asrs/controller/OpenController.java
@@ -13,6 +13,7 @@
 import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -311,27 +312,14 @@
      * 娣诲姞鍑哄簱鍗曘�佹甯搁��搴撹嚦浜屾ゼ鍖呰
      */
     @PostMapping("/order/normalTransferToTheSecond-floorPackagingArea/v1")
-    @AppAuth(memo = "姝e父閫�搴撹嚦浜屾ゼ鍖呰")
+    @AppAuth(memo = "鎷嗗寘瑁呮鍑哄簱")
     public synchronized R packagingAreaOrderCreate(@RequestHeader(required = false) String appkey,
-                                            @RequestBody QualityInspectionParam param,
+                                            @RequestBody @Valid OrderCargoBookingNoteParam param,
                                             HttpServletRequest request) {
         auth(appkey, param, request);
         if (Cools.isEmpty(param)) {
             return R.parse(BaseRes.PARAM);
         }
-        //鍒ゆ柇param鍙傛暟
-        if (Cools.isEmpty(param.getBoxNo())){
-            throw new CoolException("鍙傛暟锛氱鍙� boxNo涓虹┖");
-        }
-        //鍒ゆ柇param鍙傛暟
-        if (Cools.isEmpty(param.getModel())){
-            throw new CoolException("鍙傛暟锛氬嵎鍙� Model涓虹┖");
-        }
-        //鍒ゆ柇param鍙傛暟
-        if (Cools.isEmpty(param.getMemo())){
-            throw new CoolException("鍙傛暟锛氬娉� Memo涓虹┖");
-        }
-
         return openService.packagingAreaOrderCreate(param);
     }
 
@@ -343,23 +331,17 @@
     @PostMapping("/order/cargo/booking/note/v1")
     @AppAuth(memo = "璁″垝缁勮揣鍗�")
     public synchronized R cargoBookingNote(@RequestHeader(required = false) String appkey,
-                                                   @RequestBody OrderCargoBookingNoteParam param,
+                                                   @RequestBody @Valid OrderCargoBookingNoteParam param,
                                                    HttpServletRequest request) {
         auth(appkey, param, request);
         if (Cools.isEmpty(param)) {
             return R.parse(BaseRes.PARAM);
         }
-        //鍒ゆ柇param鍙傛暟
         if (Cools.isEmpty(param.getGroupGoodsNo())){
-            throw new CoolException("鍙傛暟锛氱粍璐у崟鍙� groupGoodsNo涓虹┖");
+            return new R(401,"缁勮揣鍗曞彿涓虹┖锛�");
         }
-        //鍒ゆ柇param鍙傛暟
-        if (Cools.isEmpty(param.getModelList()) || param.getBoxNoList().isEmpty()){
-            throw new CoolException("鍙傛暟锛氬嵎鍙� modelList涓虹┖");
-        }
-        //鍒ゆ柇param鍙傛暟
-        if (Cools.isEmpty(param.getBoxNoList()) || param.getModelList().isEmpty()){
-            throw new CoolException("鍙傛暟锛氱鍙烽泦鍚� boxNoList涓虹┖");
+        if (Cools.isEmpty(param.getCstmrName())){
+            return new R(401,"瀹㈡埛鍚嶇О涓虹┖锛�");
         }
 
         return openService.cargoBookingNote(param);
diff --git a/src/main/java/com/zy/asrs/controller/OutController.java b/src/main/java/com/zy/asrs/controller/OutController.java
index a3db49b..7e6cea3 100644
--- a/src/main/java/com/zy/asrs/controller/OutController.java
+++ b/src/main/java/com/zy/asrs/controller/OutController.java
@@ -140,8 +140,21 @@
     public synchronized R pakout(@RequestBody List<LocDto> locDtos) throws InterruptedException {
         StockOutParam param = new StockOutParam();
         ArrayList<StockOutParam.LocDetl> locDetls = new ArrayList<>();
+        int staNoOrder = 0;
         for (LocDto locDto:locDtos){
             Order order = orderService.selectByNo(locDto.getOrderNo());
+
+            DocType docType = docTypeService.selectById(order.getDocType());
+            if (docType.getDocName().equals("涓嶅悎鏍煎搧鍑哄簱")){
+                staNoOrder = 212;
+            }
+            if (docType.getDocName().equals("鎷嗗寘瑁呮鍑哄簱")){
+                staNoOrder = 212;
+            }
+            if (docType.getDocName().equals("閫�璐ц嚦浜屾ゼ")){
+                staNoOrder = 212;
+            }
+
             OrderDetl orderDetl = orderDetlService.selectById(locDto.getOrderDetlId());
 
             StockOutParam.LocDetl locDetl = new StockOutParam.LocDetl();
@@ -168,7 +181,7 @@
         }
         param.setLocDetls(locDetls);
 
-        List<StockOutParam> stockOutParams = OutboundAllocationUtil.OutboundClassification(param);
+        List<StockOutParam> stockOutParams = OutboundAllocationUtil.OutboundClassificationOrder(param,staNoOrder);
         Date now = new Date();
         for (StockOutParam stockOutParam : stockOutParams){
             stockOutParam.setNowTime(now);
diff --git a/src/main/java/com/zy/asrs/entity/param/OrderCargoBookingNoteParam.java b/src/main/java/com/zy/asrs/entity/param/OrderCargoBookingNoteParam.java
index 812b94c..096fea7 100644
--- a/src/main/java/com/zy/asrs/entity/param/OrderCargoBookingNoteParam.java
+++ b/src/main/java/com/zy/asrs/entity/param/OrderCargoBookingNoteParam.java
@@ -1,16 +1,55 @@
 package com.zy.asrs.entity.param;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
 import java.util.List;
 
 /*
- *  Created by Monkey D. Luffy on 2025.10.28
+ *  Created by Monkey D. Luffy on 2025.11.08
  * */
 @Data
 public class OrderCargoBookingNoteParam {
+
     private String groupGoodsNo;  //		鏄�	瀛楃涓�	缁勮揣鍗曞彿  === 銆嬪疄闄呯粍璐у崟璁㈠崟鍙�
-    private String cstmrName = "鏈煡";  //		鏄�	瀛楃涓�	缁勮揣鍗曞彿  === 銆嬪疄闄呯粍璐у崟璁㈠崟鍙�
-    private List<String> boxNoList;  //	鏄�	瀛楃涓�	绠卞彿锛堥泦鍚堬級
-    private List<String> modelList;  //寰呭垽  鍗峰彿锛堥泦鍚堬級
+
+    private String cstmrName = "鏈煡";  //		鏄�	瀛楃涓�	瀹㈡埛鍚嶇О
+
+    @NotNull(message = "绠卞垪琛ㄤ笉鑳戒负null")
+    @NotEmpty(message = "绠卞垪琛ㄤ笉鑳戒负绌�")
+    @Valid // 鍚敤瀵笲ox瀵硅薄鐨勭骇鑱旀牎楠�
+    private List<Box>  boxList;//		鏄�	瀛楃涓�	绠遍泦鍚�
+
+    @Data
+    @NoArgsConstructor // 鏃犲弬鏋勯�犳柟娉�
+    @AllArgsConstructor // 鍏ㄥ弬鏋勯�犳柟娉�
+    public static class Box {
+
+        @NotBlank(message = "绠卞彿涓嶈兘涓虹┖")
+        private String boxNo;  //		鏄�	瀛楃涓�	绠卞彿
+
+        @NotNull(message = "鍗峰垪琛ㄤ笉鑳戒负null")
+        @NotEmpty(message = "鍗峰垪琛ㄤ笉鑳戒负绌�")
+        @Valid // 鍚敤瀵筊oll瀵硅薄鐨勭骇鑱旀牎楠�
+        private List<Roll>  rollList;//		鏄�	瀛楃涓�	鍗烽泦鍚�
+
+        @Data
+        @NoArgsConstructor // 鏃犲弬鏋勯�犳柟娉�
+        @AllArgsConstructor // 鍏ㄥ弬鏋勯�犳柟娉�
+        public static class Roll {
+
+            @NotBlank(message = "鍗峰彿涓嶈兘涓虹┖")
+            private String rollNo;  //		鏄�	瀛楃涓�	鍗峰彿
+
+            @NotNull(message = "澶囨敞涓嶈兘涓簄ull")
+            private String memo;  //		鏄�	瀛楃涓�	澶囨敞
+
+        }
+
+    }
 }
diff --git a/src/main/java/com/zy/asrs/entity/param/OrderOutLocBoxCsUtilParam.java b/src/main/java/com/zy/asrs/entity/param/OrderOutLocBoxCsUtilParam.java
new file mode 100644
index 0000000..75168ac
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/OrderOutLocBoxCsUtilParam.java
@@ -0,0 +1,37 @@
+package com.zy.asrs.entity.param;
+
+import lombok.Data;
+
+/*
+ *  Created by Monkey D. Luffy on 2025.11.08
+ * */
+@Data
+public class OrderOutLocBoxCsUtilParam {
+    private String boxNo;  //绠卞彿
+    private String orderOneNo;  //璁㈠崟鍙�
+    private String cstmrName;  //瀹㈡埛鍚嶇О
+    private String memo;  //澶囨敞
+    private String danger;  //寰呭垽
+    private String roll;  //鍗峰彿
+
+    public OrderOutLocBoxCsUtilParam() {
+    }
+
+    public OrderOutLocBoxCsUtilParam(String batch, String orderOneNo, String cstmrName, String memo, String danger, String roll) {
+        this.boxNo = batch;
+        this.orderOneNo = orderOneNo;
+        this.cstmrName = cstmrName;
+        this.memo = memo;
+        this.danger = danger;
+        this.roll = roll;
+    }
+
+    public OrderOutLocBoxCsUtilParam(String batch,String roll, OrderOutLocBoxCsUtilParam orderOutLocBoxCsUtilParam) {
+        this.boxNo = batch;
+        this.orderOneNo = orderOutLocBoxCsUtilParam.getOrderOneNo();
+        this.cstmrName = orderOutLocBoxCsUtilParam.getCstmrName();
+        this.memo = orderOutLocBoxCsUtilParam.getMemo();
+        this.danger = orderOutLocBoxCsUtilParam.getDanger();
+        this.roll = roll;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/service/OpenService.java b/src/main/java/com/zy/asrs/service/OpenService.java
index bd80357..62af165 100644
--- a/src/main/java/com/zy/asrs/service/OpenService.java
+++ b/src/main/java/com/zy/asrs/service/OpenService.java
@@ -60,7 +60,7 @@
 
     void cs2();
     void qualityInspection(QualityInspectionParam param);
-    R packagingAreaOrderCreate(QualityInspectionParam param);
+    R packagingAreaOrderCreate(OrderCargoBookingNoteParam param);
     R cargoBookingNote(OrderCargoBookingNoteParam param);
 
 }
diff --git a/src/main/java/com/zy/asrs/service/WorkService.java b/src/main/java/com/zy/asrs/service/WorkService.java
index 4f892db..169142c 100644
--- a/src/main/java/com/zy/asrs/service/WorkService.java
+++ b/src/main/java/com/zy/asrs/service/WorkService.java
@@ -31,13 +31,15 @@
      * 鍑哄簱浣滀笟
      */
     void startupFullTakeStoreOrder(StockOutParam param, Long userId);
+    void startupFullTakeStoreOrderPakout(StockOutParam param, Long userId);
     void startupFullTakeStoreOrderGift(StockOutParam param, Long userId);
 
     /**
      * 鍑哄簱浣滀笟
      * @param staNo 鐩爣绔欑偣
      * @param locDetls 寰呭嚭搴撶墿鏂�
-     * @param ioType 鍏ュ嚭搴撶被鍨�
+     * @param ioWorkType 鍏ュ嚭搴撶被鍨�
+     * @param userId 鐢ㄦ埛ID
      */
     void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
 
diff --git a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
index e65df02..8084f72 100644
--- a/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1163,32 +1163,39 @@
 //    }
 
     /*
-     * 姝e父閫�搴撹嚦浜屾ゼ鍖呰
+     * 姝e父閫�搴撹嚦浜屾ゼ鍖呰  鎷嗗寘瑁呮鍑哄簱
      * */
     @Override
     @Transactional
-    public R packagingAreaOrderCreate(QualityInspectionParam param) {
+    public R packagingAreaOrderCreate(OrderCargoBookingNoteParam param) {
         try{
-//            String[] split = param.getModel().split(",");
-//            if (Cools.isEmpty(split)){
-//                throw new CoolException("鍙傛暟锛氬嵎鍙� Model涓虹┖,瑙f瀽澶辫触锛侊紒锛�");
-//            }
-            List<String[]> OutLocBoxCs = new ArrayList<>();
+
+            List<OrderOutLocBoxCsUtilParam> OutLocBoxCs = new ArrayList<>();
             String orderNo = "TK" + snowflakeIdWorker.nextId();
-            String cstmrName = "鏈煡";
-//            for (String model:split){
-                String[] outLocBox = new String[]{param.getBoxNo(),orderNo,cstmrName,param.getMemo(),"闅忔剰"};
-                OutLocBoxCs.add(outLocBox);
-//            }
+            for (OrderCargoBookingNoteParam.Box box : param.getBoxList()){
+                for (OrderCargoBookingNoteParam.Box.Roll roll : box.getRollList()){
+                    if (Cools.isEmpty(roll.getMemo())){
+                        return new R(401,"鍗峰彿"+roll.getRollNo()+"鐨勫娉ㄤ负绌猴紒");
+                    }
+                    OrderOutLocBoxCsUtilParam outLocBox = new OrderOutLocBoxCsUtilParam();
+                    outLocBox.setBoxNo(box.getBoxNo());
+                    outLocBox.setRoll(roll.getRollNo());
+                    outLocBox.setMemo(roll.getMemo());
+                    outLocBox.setOrderOneNo(orderNo);
+                    outLocBox.setCstmrName(param.getCstmrName());
+                    outLocBox.setDanger("闅忔剰");
+                    OutLocBoxCs.add(outLocBox);
+                }
+            }
 
             if (!OutLocBoxCs.isEmpty()){
-                OrderOutBatchUtil orderOutBatchUtil = new OrderOutBatchUtil(orderNo,cstmrName,"","MES涓嬪彂閫�璐ц嚦浜屾ゼ","閫�璐ц嚦浜屾ゼ",false);
+                OrderOutBatchUtil orderOutBatchUtil = new OrderOutBatchUtil(orderNo,param.getCstmrName(),"","MES涓嬪彂鎷嗗寘瑁呮鍑哄簱","鎷嗗寘瑁呮鍑哄簱",false);
                 return orderOutBatchUtil.setOrderOutBatch(OutLocBoxCs);
             }
         } catch (Exception e) {
-            throw new CoolException("瀵瑰簲绠卞彿锛�"+param.getBoxNo()+"鐨勭墿鏂欓��搴撹嚦2妤煎け璐�"+e.getMessage());
+            throw new CoolException("鎷嗗寘瑁呮鍑哄簱閫�搴撹嚦2妤煎け璐�"+e.getMessage());
         }
-        return R.error("瀵瑰簲绠卞彿锛�"+param.getBoxNo()+"鐨勭墿鏂欓��搴撹嚦2妤煎け璐�");
+        return R.error("鎷嗗寘瑁呮鍑哄簱閫�搴撹嚦2妤煎け璐�");
     }
 
     /*
@@ -1200,15 +1207,17 @@
         try{
             List<String[]> OutLocBoxCs = new ArrayList<>();
             String orderNo = "ZH" + snowflakeIdWorker.nextId();
-            for (String batch:param.getBoxNoList()){
-                String[] outLocBox = new String[]{batch,orderNo,param.getCstmrName(),"","鍚堟牸"};
-                OutLocBoxCs.add(outLocBox);
+            for (OrderCargoBookingNoteParam.Box box : param.getBoxList()){
+                for (OrderCargoBookingNoteParam.Box.Roll roll : box.getRollList()){
+                    String[] outLocBox = new String[]{box.getBoxNo(),orderNo,param.getCstmrName(),roll.getMemo(),"鍚堟牸"};
+                    OutLocBoxCs.add(outLocBox);
+                }
             }
 
             if (!OutLocBoxCs.isEmpty()){
                 OrderOutBatchUtil orderOutBatchUtil = new OrderOutBatchUtil(orderNo,param.getCstmrName(),"","MES涓嬪彂璁″垝缁勮揣鍗�","璁″垝缁勮揣鍗�",true,param.getGroupGoodsNo());
-//                return orderOutBatchUtil.setOrderOutBatch(OutLocBoxCs);
-                return R.ok();
+                return orderOutBatchUtil.setOrderOutBatchCargoBookingNote(OutLocBoxCs);
+//                return R.ok();
             }
         } catch (Exception e) {
             throw new CoolException("缁勮揣鍗曞彿锛�"+param.getGroupGoodsNo()+"璁″垝缁勮揣鍗曟帴鏀跺け璐ワ紒锛侊紒"+e.getMessage());
diff --git a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
index 8ec49ac..38e591c 100644
--- a/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -85,6 +85,10 @@
     private OrderGiftService orderGiftService;
     @Autowired
     private OrderDetlGiftService orderDetlGiftService;
+    @Autowired
+    private OrderPakoutService orderPakoutService;
+    @Autowired
+    private OrderDetlPakoutService orderDetlPakoutService;
 
     @Override
     @Transactional
@@ -298,6 +302,108 @@
 
     @Override
     @Transactional
+    public void startupFullTakeStoreOrderPakout(StockOutParam param, Long userId) {
+        if (Cools.isEmpty(param) || Cools.isEmpty(param.getLocDetls())){
+            throw new CoolException("鍙傛暟涓虹┖");
+        }
+        if (Cools.isEmpty(param.getOrderNo())){
+            throw new CoolException("璁㈠崟鍙峰弬鏁颁负绌�");
+        }
+        DocType docType = docTypeService.selectOrAdd(param.getOrderName(), Boolean.FALSE);
+        OrderPakout order = orderPakoutService.selectByNo(param.getOrderNo());
+        if (Cools.isEmpty(order)){
+            Date now = new Date();
+            order = new OrderPakout(
+                    String.valueOf(snowflakeIdWorker.nextId()),    // 缂栧彿[闈炵┖]
+                    param.getOrderNo(),    // 璁㈠崟缂栧彿
+                    DateUtils.convert(now),    // 鍗曟嵁鏃ユ湡
+                    docType.getDocId(),    // 鍗曟嵁绫诲瀷
+                    null,    // 椤圭洰缂栧彿
+                    null,    //
+                    null,    // 璋冩嫧椤圭洰缂栧彿
+                    null,    // 鍒濆绁ㄦ嵁鍙�
+                    null,    // 绁ㄦ嵁鍙�
+                    null,    // 瀹㈡埛缂栧彿
+                    param.getCstmrName(),    // 瀹㈡埛
+                    null,    // 鑱旂郴鏂瑰紡
+                    null,    // 鎿嶄綔浜哄憳
+                    null,    // 鍚堣閲戦
+                    null,    // 浼樻儬鐜�
+                    null,    // 浼樻儬閲戦
+                    null,    // 閿�鍞垨閲囪喘璐圭敤鍚堣
+                    null,    // 瀹炰粯閲戦
+                    null,    // 浠樻绫诲瀷
+                    null,    // 涓氬姟鍛�
+                    null,    // 缁撶畻澶╂暟
+                    null,    // 閭垂鏀粯绫诲瀷
+                    null,    // 閭垂
+                    null,    // 浠樻鏃堕棿
+                    null,    // 鍙戣揣鏃堕棿
+                    null,    // 鐗╂祦鍚嶇О
+                    null,    // 鐗╂祦鍗曞彿
+                    1L,    // 璁㈠崟鐘舵��
+                    1,    // 鐘舵��
+                    userId,    // 娣诲姞浜哄憳
+                    now,    // 娣诲姞鏃堕棿
+                    userId,    // 淇敼浜哄憳
+                    now,    // 淇敼鏃堕棿
+                    null    // 澶囨敞
+            );
+            if (!orderPakoutService.insert(order)) {
+                throw new CoolException("淇濆瓨璁㈠崟涓绘。澶辫触");
+            }
+            // 鍗曟嵁鏄庣粏妗�
+            List<DetlDto> list = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls = param.getLocDetls();
+            int i=0;
+            for (StockOutParam.LocDetl locDetl : locDetls) {
+                i++;
+                Mat mat = matService.selectByMatnr(locDetl.getMatnr());
+                if (Cools.isEmpty(mat)) {
+                    throw new CoolException(locDetl.getMatnr() + "鐗╂枡缂栫爜妫�绱㈠け璐ワ紝璇峰厛娣诲姞鍟嗗搧");
+                }
+                OrderDetlPakout orderDetl = new OrderDetlPakout();
+                orderDetl.sync(mat);
+                orderDetl.setSuppCode(String.valueOf(i));  // 琛屽彿
+                orderDetl.setManu(locDetl.getLocNo());  //搴撲綅鍙�
+                orderDetl.setBatch(locDetl.getBatch()); //鏈ㄧ缂栫爜
+                orderDetl.setAnfme(locDetl.getAnfme());//鍑哄簱鏁伴噺
+                orderDetl.setModel(locDetl.getModel());//鎵规
+                orderDetl.setSpecs(locDetl.getSpecs());//瑙勬牸
+                orderDetl.setBrand(locDetl.getBrand());//鏈ㄧ绫诲瀷
+                orderDetl.setBarcode(locDetl.getZpallet());//鏈ㄧ绫诲瀷
+                orderDetl.setDanger(locDetl.getDanger());//鏈ㄧ绫诲瀷
+                orderDetl.setWeight(locDetl.getWeight());
+//                orderDetl.setWorkQty(locDetl.getAnfme());
+                orderDetl.setWorkQty(0.0);
+                orderDetl.setOrderId(order.getId());
+                orderDetl.setOrderNo(order.getOrderNo());
+                orderDetl.setOrigin(locDetl.getOrigin());
+                orderDetl.setCreateBy(userId);
+                orderDetl.setCreateTime(now);
+                orderDetl.setUpdateBy(userId);
+                orderDetl.setUpdateTime(now);
+                orderDetl.setStatus(1);
+                orderDetl.setQty(0.0D);
+                orderDetl.setMemo(locDetl.getMemo());
+                if (!orderDetlPakoutService.insert(orderDetl)) {
+                    throw new CoolException("鐢熸垚鍗曟嵁鏄庣粏澶辫触锛岃鑱旂郴绠$悊鍛�");
+                }
+            }
+
+//            List<StockOutParam> stockOutParams = OutboundAllocationUtil.OutboundClassification(param);
+//            for (StockOutParam stockOutParam : stockOutParams){
+//                startupFullTakeStore(stockOutParam,userId);
+//            }
+
+        } else {
+            throw new CoolException("璁㈠崟鍙烽噸澶嶏紝璁㈠崟"+param.getOrderNo()+"宸插瓨鍦紒锛侊紒");
+        }
+
+    }
+
+    @Override
+    @Transactional
     public void startupFullTakeStoreOrderGift(StockOutParam param, Long userId) {
         if (Cools.isEmpty(param) || Cools.isEmpty(param.getLocDetls())){
             throw new CoolException("鍙傛暟涓虹┖");
diff --git a/src/main/java/com/zy/asrs/utils/OrderOutBatchUtil.java b/src/main/java/com/zy/asrs/utils/OrderOutBatchUtil.java
index 3c2aa8a..fb1cdd0 100644
--- a/src/main/java/com/zy/asrs/utils/OrderOutBatchUtil.java
+++ b/src/main/java/com/zy/asrs/utils/OrderOutBatchUtil.java
@@ -7,6 +7,7 @@
 import com.core.common.SpringUtils;
 import com.zy.asrs.entity.LocDetl;
 import com.zy.asrs.entity.LocMast;
+import com.zy.asrs.entity.param.OrderOutLocBoxCsUtilParam;
 import com.zy.asrs.entity.param.StockOutParam;
 import com.zy.asrs.service.LocDetlService;
 import com.zy.asrs.service.LocMastService;
@@ -15,6 +16,7 @@
 import com.zy.common.properties.SlaveProperties;
 import com.zy.system.entity.OperateLog;
 import com.zy.system.service.OperateLogService;
+import reactor.core.publisher.Mono;
 
 import java.util.ArrayList;
 import java.util.Date;
@@ -78,7 +80,166 @@
     }
 
 
-    public R setOrderOutBatch(List<String[]> OutLocBoxCs) {
+    public R setOrderOutBatch(List<OrderOutLocBoxCsUtilParam>  OutLocBoxCs) {
+        int total = OutLocBoxCs.size();
+        if (!Cools.isEmpty(OutLocBoxCs) && !OutLocBoxCs.isEmpty()) {
+            LocDetlService locDetlService = SpringUtils.getBean(LocDetlService.class);
+            LocMastService locMastService = SpringUtils.getBean(LocMastService.class);
+            SlaveProperties slaveProperties = SpringUtils.getBean(SlaveProperties.class);
+            WorkService workService = SpringUtils.getBean(WorkService.class);
+            List<LocDto> locDtos = new ArrayList<>();
+            List<OrderOutLocBoxCsUtilParam> outLocBoxCList = new ArrayList<>();
+            List<String> outLocBoxCNew = new ArrayList<>();
+            List<String> outLocRollListOld = new ArrayList<>();
+            List<String> outLocRollListNew = new ArrayList<>();
+            for (OrderOutLocBoxCsUtilParam outLocBoxC : OutLocBoxCs) {
+                if (!outLocRollListOld.contains(outLocBoxC.getRoll())) {
+                    outLocRollListOld.add(outLocBoxC.getRoll());
+                }
+            }
+            for (OrderOutLocBoxCsUtilParam outLocBoxC : OutLocBoxCs) {
+                total--;
+                LocDetl locDetlSou = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("batch", outLocBoxC.getBoxNo()).eq("model",outLocBoxC.getRoll()));
+                if (Cools.isEmpty(locDetlSou)) {
+                    sign = false;
+                    errorMsgOrderLoc = errorMsgOrderLoc + "[===銆�" + "绠卞彿锛�" + outLocBoxC.getBoxNo() + "鍗峰彿锛�" + outLocBoxC.getRoll() + " 鏈煡璇㈠埌鏁版嵁锛侊紒锛併��===]";
+                    continue;
+                }
+                if (signDanger){
+                    if (!locDetlSou.getDanger$().equals(outLocBoxC.getDanger())) {
+                        sign = false;
+                        errorMsgOrderLoc = errorMsgOrderLoc + "[===銆�" + "绠卞彿锛�" + outLocBoxC.getBoxNo() + "鍗峰彿锛�" + outLocBoxC.getRoll() +  " ==銆嬪嚭搴撹緭鍏ュ緟鍒ょ姸鎬侊細" + outLocBoxC.getDanger() + "銆佸簱瀛樼姸鎬侊細" + locDetlSou.getDanger$() + "銆傜姸鎬佷笉鍖归厤銆�===]";
+                        continue;
+                    }
+                }
+                if (!outLocBoxCNew.contains(outLocBoxC.getBoxNo())) {
+                    LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlSou.getLocNo()));
+                    if (Cools.isEmpty(locMast)) {
+                        sign = false;
+                        errorMsgOrderLoc = errorMsgOrderLoc + "[===銆�" + "绠卞彿锛�" + outLocBoxC.getBoxNo() + "鍗峰彿锛�" + outLocBoxC.getRoll() +  " 鎵�鍦ㄥ簱浣嶄笉婊¤冻鍑哄簱鏉′欢锛侊紒锛佹湭鏌ヨ鍒版绠卞彿鎵�鍦ㄥ簱浣�" + "銆�===]";
+                        continue;
+                    }
+                    if (!locMast.getLocSts().equals("F")) {
+                        sign = false;
+                        errorMsgOrderLoc = errorMsgOrderLoc + "[===銆�" + "绠卞彿锛�" + outLocBoxC.getBoxNo() + "鍗峰彿锛�" + outLocBoxC.getRoll() +  " 鎵�鍦ㄥ簱浣嶄笉婊¤冻鍑哄簱鏉′欢锛侊紒锛佸簱浣嶇姸鎬佷笉涓篎锛侊紒锛佸簱浣嶇姸鎬侊細" + locMast.getLocSts$() + "銆�===]";
+                        continue;
+                    }
+
+                    // 鐩爣搴撲綅 ===>> 娴呭簱浣�
+                    if (Utils.isShallowLoc(slaveProperties, locMast.getLocNo())) {
+                        String shallowLoc = Utils.getDeepLoc(slaveProperties, locMast.getLocNo());
+                        LocMast locMast2 = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", shallowLoc));
+                        if (!Cools.isEmpty(locMast2)) {
+                            if (locMast2.getLocSts().equals("P") || locMast2.getLocSts().equals("R")) {
+                                errorMsgOrderLoc = errorMsgOrderLoc + "[===銆�" + "绠卞彿锛�" + outLocBoxC.getBoxNo() +  "鍗峰彿锛�" + outLocBoxC.getRoll() + " 鎵�鍦ㄥ簱浣嶆弧瓒冲嚭搴撴潯浠讹紒锛侊紒浣嗘槸鐩搁偦搴撲綅鍦ㄥ嚭搴撲腑锛侊紒锛佸洜姝や細澶规潅鍦ㄥ墠杈硅鍗曟墽琛岋紒锛侊紒" + "銆�===]";
+                            }
+                        }
+                    }
+                }
+                if (sign && !outLocRollListNew.contains(outLocBoxC.getRoll())) {
+                    List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>()
+                            .eq("loc_no", locDetlSou.getLocNo()).eq("origin", locDetlSou.getOrigin()));
+                    for (LocDetl locDetl : locDetls) {
+                        if (!outLocRollListNew.contains(locDetl.getModel())){
+                            if (!outLocRollListOld.contains(locDetl.getModel())){
+                                total++;
+                                OrderOutLocBoxCsUtilParam orderOutLocBoxCsUtilParam = new OrderOutLocBoxCsUtilParam(locDetl.getBatch(),locDetl.getModel(), outLocBoxC);
+                                orderOutLocBoxCsUtilParam.setMemo("闄勫甫鍑哄簱");
+                                orderOutLocBoxCsUtilParam.setDanger(locDetl.getDanger$());
+                                outLocBoxCList.add(orderOutLocBoxCsUtilParam);
+                                outLocBoxCNew.add(outLocBoxC.getBoxNo());
+                                outLocRollListNew.add(outLocBoxC.getRoll());
+                            } else {
+                                if (locDetlSou.getBatch().equals(locDetl.getBatch()) && locDetlSou.getModel().equals(locDetl.getModel())) {
+                                    total++;
+                                    outLocBoxCList.add(outLocBoxC);
+                                    outLocBoxCNew.add(outLocBoxC.getBoxNo());
+                                    outLocRollListNew.add(outLocBoxC.getRoll());
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+            for (OrderOutLocBoxCsUtilParam outLocBoxC : outLocBoxCList) {
+                LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("batch", outLocBoxC.getBoxNo()).eq("model", outLocBoxC.getRoll()));
+                if (Cools.isEmpty(locDetl)) {
+                    total--;
+                    continue;
+                }
+
+                if (!Cools.isEmpty(Mono.just(outLocBoxC.getMemo()))) {
+                    String memo = Cools.isEmpty(locDetl.getMemo()) ? "" : locDetl.getMemo() + "锛�";
+                    locDetl.setMemo(memo + DateUtils.convert(new Date(), DateUtils.yyyyMMdd_C) + "澶囨敞锛�" + outLocBoxC.getMemo());
+                } else if (Cools.isEmpty(locDetl.getMemo())) {
+                    locDetl.setMemo(outLocBoxC.getMemo());
+                }
+                LocDto locDto = new LocDto(locDetl);
+                locDtos.add(locDto);
+            }
+
+            StockOutParam param = new StockOutParam();
+            ArrayList<StockOutParam.LocDetl> locDetls = new ArrayList<>();
+            List<LocDto> locDtosList = new ArrayList<>();
+            List<String> batchList = new ArrayList<>();
+            for (LocDto locDto : locDtos) {
+                if (!batchList.contains(locDto.getBatch())) {
+                    batchList.add(locDto.getBatch());
+                    locDtosList.add(locDto);
+                }
+            }
+            for (LocDto locDto : locDtosList) {
+                StockOutParam.LocDetl locDetl = new StockOutParam.LocDetl();
+                locDetl.setBrand(locDto.getBrand());
+                locDetl.setLocNo(locDto.getLocNo());
+                locDetl.setAnfme(locDto.getAnfme());
+                locDetl.setMatnr(locDto.getMatnr());
+                locDetl.setBatch(locDto.getBatch());
+                locDetl.setModel(locDto.getModel());
+                locDetl.setSpecs(locDto.getSpecs());
+                locDetl.setZpallet(locDto.getZpallet());
+                locDetl.setOrigin(locDto.getOrigin());
+                locDetl.setWeight(locDto.getWeight());
+                locDetl.setMemo(locDto.getMemo());
+                locDetl.setDanger(locDto.getDanger());
+
+                locDetls.add(locDetl);
+            }
+            param.setLocDetls(locDetls);
+            param.setOrderNo(orderOneNo);
+            param.setCstmrName(cstmrName);
+            param.setOrderName(orderName);
+            param.setGroupGoodsNo(groupGoodsNo);
+
+            if (sign && total > 0) {
+                workService.startupFullTakeStoreOrder(param, 9999L);
+            }
+
+            try {
+                OperateLogService operateLogService = SpringUtils.getBean(OperateLogService.class);
+                // 璁板綍鎿嶄綔鏃ュ織
+                OperateLog operateLog = new OperateLog();
+                operateLog.setAction(action);
+                operateLog.setIp(ip);
+                operateLog.setUserId(9999L);
+                operateLog.setRequest("鍗曞彿锛�" + orderOneNo + "銆佸鎴峰悕锛�" + cstmrName);
+                operateLog.setResponse(errorMsgOrderLoc.equals("") ? "姝e父" : (sign && total > 0) ? "鎴愬姛:" + errorMsgOrderLoc : "澶辫触:" + errorMsgOrderLoc);
+                operateLogService.insert(operateLog);
+            } catch (Exception e) {
+                log.error("璁板綍鎿嶄綔鏃ュ織澶辫触锛�" + e.getMessage());
+            }
+
+        }
+
+        log.info("鍑哄簱{}鏉$鍙凤紒", total);
+
+        String requert = errorMsgOrderLoc.equals("") ? "姝e父" : (sign && total > 0) ? "鎴愬姛:" + errorMsgOrderLoc : "澶辫触:" + errorMsgOrderLoc;
+        if (sign && total > 0) {
+            return R.ok(requert.equals("姝e父")? "鎴愬姛":requert);
+        }
+        return R.error(requert);
+    }
+    public R setOrderOutBatchCargoBookingNote(List<String[]> OutLocBoxCs) {
         int total = OutLocBoxCs.size();
         if (!Cools.isEmpty(OutLocBoxCs) && !OutLocBoxCs.isEmpty()) {
             LocDetlService locDetlService = SpringUtils.getBean(LocDetlService.class);
@@ -196,7 +357,7 @@
             param.setGroupGoodsNo(groupGoodsNo);
 
             if (sign && total > 0) {
-                workService.startupFullTakeStoreOrder(param, 9999L);
+                workService.startupFullTakeStoreOrderPakout(param, 9999L);
             }
 
             try {
diff --git a/src/main/java/com/zy/asrs/utils/OutboundAllocationUtil.java b/src/main/java/com/zy/asrs/utils/OutboundAllocationUtil.java
index a4e877f..ca2b834 100644
--- a/src/main/java/com/zy/asrs/utils/OutboundAllocationUtil.java
+++ b/src/main/java/com/zy/asrs/utils/OutboundAllocationUtil.java
@@ -300,6 +300,112 @@
 
         return stockOutParams;
     }
+    public static List<StockOutParam> OutboundClassificationOrder(StockOutParam param,int staNoOrder){
+        List<StockOutParam> stockOutParams = new ArrayList<>();
+
+        List<StockOutParam.LocDetl> locDetls = param.getLocDetls();
+        List<String> brands = new ArrayList<>();
+        for (StockOutParam.LocDetl locDetl:locDetls){
+            if (Cools.isEmpty(locDetl.getBrand())){
+                locDetl.setBrand("");
+            }
+            if (!brands.contains(locDetl.getBrand())){
+                brands.add(locDetl.getBrand());
+            }
+        }
+
+        for (String brand : brands){
+            List<StockOutParam.LocDetl> locDetls1 = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls2 = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls3 = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls4 = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls5 = new ArrayList<>();
+            List<StockOutParam.LocDetl> locDetls6 = new ArrayList<>();
+            for (StockOutParam.LocDetl locDetl:locDetls){
+                if (Cools.isEmpty(locDetl.getBrand())){
+                    locDetl.setBrand("");
+                }
+                if (locDetl.getBrand().equals(brand)){
+                    switch (Utils.getRow(locDetl.getLocNo())){
+                        case 1: case 2: case 3: case 4:
+                            locDetls1.add(locDetl);
+                            break;
+                        case 5: case 6: case 7: case 8:
+                            locDetls2.add(locDetl);
+                            break;
+                        case 9: case 10: case 11: case 12:
+                            locDetls3.add(locDetl);
+                            break;
+                        case 13: case 14: case 15: case 16:
+                            locDetls4.add(locDetl);
+                            break;
+                        case 17: case 18: case 19: case 20:
+                            locDetls5.add(locDetl);
+                            break;
+                        case 21: case 22: case 23: case 24:
+                            locDetls6.add(locDetl);
+                            break;
+                        default:
+                    }
+                }
+            }
+            ArrayList<List<StockOutParam.LocDetl>> lists = new ArrayList<>();
+            lists.add(locDetls1);
+            lists.add(locDetls2);
+            lists.add(locDetls3);
+            lists.add(locDetls4);
+            lists.add(locDetls5);
+            lists.add(locDetls6);
+
+            int sign = 0;
+            int staA=118;
+            int staB=118;
+            for (List<StockOutParam.LocDetl> locDetlList:lists){
+                sign++;
+                if (locDetlList.size()==0){
+                    continue;
+                }
+                if (sign>lists.size()/2) {
+                    //120銆�121
+                    staA=120;
+                    staB=121;
+                }
+                List<StockOutParam.LocDetl> locDetlsA = new ArrayList<>();
+                List<StockOutParam.LocDetl> locDetlsB = new ArrayList<>();
+                List<String> locNos = new ArrayList<>();
+                for (StockOutParam.LocDetl locDetl:locDetlList){
+                    if (locDetlsA.size()<locDetlList.size()/2){
+                        locDetlsA.add(locDetl);
+                        if (!locNos.contains(locDetl.getLocNo())){
+                            locNos.add(locDetl.getLocNo());
+                        }
+                    }else {
+                        if (locNos.contains(locDetl.getLocNo())){
+                            locDetlsA.add(locDetl);
+                        }else {
+                            locDetlsB.add(locDetl);
+                        }
+                    }
+                }
+                if (locDetlsA.size()!=0){
+                    StockOutParam stockOutParamA = new StockOutParam();
+                    stockOutParamA.setOutSite((Cools.isEmpty(staNoOrder) || staNoOrder==0)? staA : staNoOrder);
+                    stockOutParamA.setOrderNo(param.getOrderNo());
+                    stockOutParamA.setLocDetls(locDetlsA);
+                    stockOutParams.add(stockOutParamA);
+                }
+                if (locDetlsB.size()!=0){
+                    StockOutParam stockOutParamB = new StockOutParam();
+                    stockOutParamB.setOutSite((Cools.isEmpty(staNoOrder) || staNoOrder==0)? staB : staNoOrder);
+                    stockOutParamB.setOrderNo(param.getOrderNo());
+                    stockOutParamB.setLocDetls(locDetlsB);
+                    stockOutParams.add(stockOutParamB);
+                }
+            }
+        }
+
+        return stockOutParams;
+    }
 
     public static List<StockOutParam> OutboundClassificationNew(StockOutParam param){
         List<StockOutParam> stockOutParams = new ArrayList<>();
diff --git a/src/main/java/com/zy/common/config/CoolExceptionHandler.java b/src/main/java/com/zy/common/config/CoolExceptionHandler.java
index b3968a3..21b03bf 100644
--- a/src/main/java/com/zy/common/config/CoolExceptionHandler.java
+++ b/src/main/java/com/zy/common/config/CoolExceptionHandler.java
@@ -2,10 +2,18 @@
 
 import com.core.common.R;
 import com.core.exception.CoolException;
+import lombok.Data;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.BindingResult;
+import org.springframework.validation.FieldError;
 import org.springframework.web.HttpRequestMethodNotSupportedException;
+import org.springframework.web.bind.MethodArgumentNotValidException;
 import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
 import org.springframework.web.bind.annotation.RestControllerAdvice;
 import org.springframework.web.method.HandlerMethod;
+
+import java.util.concurrent.atomic.AtomicReference;
 
 /**
  * Created by vincent on 2019-06-09
@@ -35,4 +43,20 @@
         return R.error(e.getMessage());
     }
 
+    @ExceptionHandler(MethodArgumentNotValidException.class)
+    @ResponseStatus(HttpStatus.UNAUTHORIZED)
+    public R handleMethodArgumentNotValidException(MethodArgumentNotValidException ex) {
+        // 杩斿洖閿欒鍒楄〃
+        BindingResult bindingResult = ex.getBindingResult();
+        final String[] field = {""};
+
+        bindingResult.getFieldErrors().forEach(fieldError -> {
+            String message = fieldError.getDefaultMessage();
+            field[0] = field[0] + message+";";
+        });
+
+        // 鍙傛暟涓虹┖
+        return new R(401, field[0]);
+    }
+
 }

--
Gitblit v1.9.1