From d0226747665355acecd5b4f2b5c0beb020586729 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 17 一月 2025 15:37:32 +0800
Subject: [PATCH] # 23. PDA拣货单据,勾选或点击确认按钮后,完成当前单据 (已完成) 24. PDA出库成功后,界面数据重置,避免重复操作  (已修复) 25. PDA接口请求,添加一个Loading遮档  (已修复) 27. 非平库单据,在平库可做入库操作  (已修复) 28. 平库已组拖数据,组拖完成后依然可组拖  (已修复) 29. 平库入库后,订单明细没有添加(已修复) 30. 平库入库后,单据类型没有修改(已修复) 31. 没有绑定播种位,不能进行播种,前后端都需加判定(已修复) 33. 平库入库未修改入库已完成数量(已修复) 34. cacheSite缓存站点逻辑需重新梳理,入库生成波次时(已完成) 35. PDA添加发货确认,默认全选 (已修复) 36. 大屏获取任务时,是由容器到达的拖盘码确认通知 (已修复) 37. 拣货单序号不显示 问题修复 (已修复) 42. pda发货确认,添加不同颜色区分是否全部完成拣货,绿色全部拣货完成,红色完成部分拣货(已修复) 43. CTU入库完成后,订单明细没有删除,执行中数量清空(已修复) 44. 平库入库完成后,历史档明细完成数量没有更新 (已修复) 45. PDA料号不显示  (已修复) 46. 发货完成后,波次管理数据未加入历史档 (已修复)

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java |  459 ++++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 355 insertions(+), 104 deletions(-)

diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
index 45893a6..e5e77a4 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java
@@ -1,7 +1,9 @@
 package com.zy.asrs.wms.asrs.manage;
 
 import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.mysql.cj.util.StringUtils;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.dto.*;
 import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto;
@@ -14,11 +16,16 @@
 import com.zy.asrs.wms.utils.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * 鍑哄簱绠$悊
@@ -62,11 +69,17 @@
     private CacheSiteService cacheSiteService;
     @Autowired
     private WaveSeedService waveSeedService;
+    @Autowired
+    private PickSheetService pickSheetService;
+    @Autowired
+    private PickSheetDetlService pickSheetDetlService;
+    @Autowired
+    private MatService matService;
 
     /**
      * 鍑哄簱
      */
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void out(OutParam outParam) {
         if (outParam.getOperationPort() == null) {
             throw new CoolException("浣滀笟鍙d笉瀛樺湪");
@@ -81,7 +94,7 @@
             long taskType = locDto.getAll() ? 101L : 103L;
 
             Loc loc = locService.getById(locDto.getLocId());
-            if(loc == null) {
+            if (loc == null) {
                 throw new CoolException("搴撲綅涓嶅瓨鍦�");
             }
 
@@ -104,7 +117,12 @@
             // 宸ヤ綔妗f槑缁嗕繚瀛�
             for (OutDetlDto detl : locDto.getDetls()) {
                 LocDetl locDetl = locDetlService.getById(detl.getDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
+                    throw new CoolException("鏄庣粏涓嶅瓨鍦�");
+                }
+
+                OrderDetl orderDetl = orderDetlService.getById(detl.getOrderDetlId());
+                if (orderDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -126,7 +144,7 @@
                     taskDetlField.sync(locDetlField);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -136,7 +154,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
         }
@@ -147,7 +165,6 @@
         if (orderDetlIds.isEmpty()) {
             throw new CoolException("璁㈠崟鏄庣粏涓嶈兘涓虹┖");
         }
-
         List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getId, orderDetlIds).orderByAsc(OrderDetl::getOrderNo, OrderDetl::getCreateTime));
         if (orderDetls.isEmpty()) {
             throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
@@ -155,11 +172,44 @@
         orderDetls = orderDetlService.parseDetl(orderDetls);
 
         HashMap<Long, List<LocDetl>> orderDetlLocMap = new HashMap<>();
+//        //鍑哄簱璁㈠崟鍚堣
         List<OutDetlDto> detlDtos = new ArrayList<>();
+//        //鑾峰彇骞充粨涓鍚堟潯浠剁殑鎵�鏈夊簱浣�
+//        orderDetls.forEach(detl -> {
+//            double issued = Optional.of(detl.getAnfme() - detl.getQty() - detl.getWorkQty()).orElse(0.0D);
+//            if (issued <= 0.0D) {
+//                return;
+//            }
+//            List<LocDetl> locs = locDetlService.queryFlatStock(detl.getMat$().getMatnr(), detl.getBatch(), detl.getUniqueField());
+//            //骞冲簱鏈夊綋鏄庣墿鏂欎紭鍏堝嚭搴�
+//            if (!locs.isEmpty()) {
+//                for (LocDetl locDetl : locs) {
+//                    if (issued > 0) {
+//                        OutDetlDto outDetlDto = new OutDetlDto();
+//                        outDetlDto.setDetlId(locDetl.getId());
+//                        outDetlDto.setAnfme(issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
+//                        outDetlDto.setStock(locDetl.getAnfme());
+//                        outDetlDto.setOrderDetlId(locDetl.getId());
+//                        detlDtos.add(outDetlDto);
+//                        issued = issued - outDetlDto.getAnfme();
+//                    }
+//                }
+//                //璁㈠崟鏄庣粏闇�鍑哄簱鏁伴噺
+//                double workQty = Optional.of(detl.getAnfme() - detl.getQty() - detl.getWorkQty()).orElse(0.0D);
+//                //鏇存柊骞冲簱璁㈠崟鏄庣粏鐨勫疄闄呭彲鐢ㄦ暟閲�
+//                detl.setWorkQty(workQty - issued);
+//            }
+//        });
 
+        /**
+         * 骞冲簱浼樺厛鍑哄簱瀹屾垚鍚庯紝褰撹鍗曟槑缁唚orkQty + qty 杩樹笉绛変簬anfme鏃讹紝鏌ヨTCU搴�
+         */
+        //鑾峰彇TCU绗﹀悎鏉′欢搴撲綅
         for (OrderDetl orderDetl : orderDetls) {
             double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D);
-            if (issued <= 0.0D) { continue; }
+            if (issued <= 0.0D) {
+                continue;
+            }
             List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMat$().getMatnr(), orderDetl.getBatch(), orderDetl.getUniqueField());
             orderDetlLocMap.put(orderDetl.getId(), locDetls);
             for (LocDetl locDetl : locDetls) {
@@ -171,7 +221,7 @@
                     outDetlDto.setOrderDetlId(orderDetl.getId());
                     detlDtos.add(outDetlDto);
                     issued = issued - outDetlDto.getAnfme();
-                }else {
+                } else {
                     break;
                 }
             }
@@ -184,7 +234,7 @@
             if (dtos == null) {
                 dtos = new ArrayList<>();
                 dtos.add(detlDto);
-            }else {
+            } else {
                 dtos.add(detlDto);
             }
             map.put(locDetl.getLocId(), dtos);
@@ -265,7 +315,7 @@
         return previewDtos;
     }
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void orderOutBatch(List<OrderOutBatchPreviewDto> param) {
         if (param == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
@@ -293,11 +343,11 @@
                 continue;
             }
 
-            if(detlMap.containsKey(previewDto.getLocDetlId())) {
+            if (detlMap.containsKey(previewDto.getLocDetlId())) {
                 List<OrderOutBatchPreviewDto> previewDtos = detlMap.get(previewDto.getLocDetlId());
                 previewDtos.add(previewDto);
                 detlMap.put(previewDto.getLocDetlId(), previewDtos);
-            }else {
+            } else {
                 List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>();
                 previewDtos.add(previewDto);
                 detlMap.put(previewDto.getLocDetlId(), previewDtos);
@@ -325,11 +375,11 @@
         HashMap<Long, List<OrderOutBatchPreviewDto>> map = new HashMap<>();
 
         for (OrderOutBatchPreviewDto previewDto : dtos) {
-            if(map.containsKey(previewDto.getLocId())) {
+            if (map.containsKey(previewDto.getLocId())) {
                 List<OrderOutBatchPreviewDto> previewDtos = map.get(previewDto.getLocId());
                 previewDtos.add(previewDto);
                 map.put(previewDto.getLocId(), previewDtos);
-            }else {
+            } else {
                 List<OrderOutBatchPreviewDto> previewDtos = new ArrayList<>();
                 previewDtos.add(previewDto);
                 map.put(previewDto.getLocId(), previewDtos);
@@ -375,12 +425,12 @@
 
             for (OrderOutBatchPreviewDto dto : previewDtos) {
                 LocDetl locDetl = locDetlService.getById(dto.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
                 OrderDetl orderDetl = orderDetlService.getById(dto.getOrderDetlId());
-                if(orderDetl == null) {
+                if (orderDetl == null) {
                     throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                 }
                 orderUtils.updateWorkQty(dto.getOrderDetlId(), dto.getAnfme());
@@ -406,7 +456,7 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -416,7 +466,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
 
@@ -441,7 +491,7 @@
         }
 
         List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getOrderId, orderIds));
-        if(orderDetls.isEmpty()){
+        if (orderDetls.isEmpty()) {
             throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
         }
         orderDetls = orderDetlService.parseDetl(orderDetls);
@@ -454,7 +504,7 @@
                 Double anfme = locDetlStockMap.get(matUniqueKey);
                 anfme += issued;
                 locDetlStockMap.put(matUniqueKey, anfme);
-            }else {
+            } else {
                 locDetlStockMap.put(matUniqueKey, issued);
             }
         }
@@ -480,11 +530,10 @@
             mergePreviewDtos.add(dto);
         }
 
-
         return mergePreviewDtos;
     }
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public List<MergePreviewResultDto> orderOutMergeLocPreview(List<MergePreviewDto> param) {
         if (param == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
@@ -499,14 +548,71 @@
             dto.setFieldParams(fieldParams);
         }
 
-        FieldSortParam sortParam = new FieldSortParam("anfme","desc");
+        FieldSortParam sortParam = new FieldSortParam("anfme", "desc");
         List<FieldSortParam> sortParams = new ArrayList<>();
         sortParams.add(sortParam);
 
         List<MergePreviewResultDto> resultDtos = new ArrayList<>();
+        //浼樺厛鏌ヨ骞冲簱鏁版嵁
+        param.forEach(pars -> {
+            List<MergePreviewResultLocDto> locDtos = new ArrayList<>();
+            MergePreviewResultDto resultDto = new MergePreviewResultDto();
+            resultDto.sync(pars);
+            resultDto.setOrderIds(pars.getOrderIds());
+            resultDto.setLocs(locDtos);
+
+            List<LocDetl> locs = locDetlService.queryFlatStock(pars.getMatnr(), pars.getBatch(), pars.getFieldParams());
+            if (!locs.isEmpty()) {
+                double anfme = pars.getAnfme() - pars.getWorkQty();
+                for (LocDetl detl : locs) {
+                    Loc loc = locService.getById(detl.getLocId());
+                    if (loc == null) {
+                        throw new CoolException("搴撲綅鏁版嵁涓嶅瓨鍦�");
+                    }
+
+                    if (loc.getLocStsId() != LocStsType.F.val()) {
+                        continue;
+                    }
+                    MergePreviewResultLocDto locDto = new MergePreviewResultLocDto();
+                    locDto.setLocId(detl.getLocId());
+                    locDto.setLocNo(detl.getLocNo());
+                    locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id);
+                    locDto.setLocDetlId(detl.getId());
+
+                    locDtos.add(locDto);
+                    //搴撲綅瀹為檯鍙敤鏁伴噺
+                    double surplusQty = detl.getAnfme() - detl.getWorkQty();
+                    //娉㈡鏁伴噺鍑忓幓搴撲綅鍙敤鏁伴噺鍚庯紝鐩堜綑鏁伴噺
+                    anfme = anfme - surplusQty;
+                    if (anfme > 0) {
+                        locDto.setAnfme(detl.getAnfme());
+                        locDto.setWorkQty(surplusQty);
+                    } else {
+                        locDto.setAnfme(pars.getAnfme() - pars.getWorkQty());
+                        locDto.setWorkQty(pars.getAnfme() - pars.getWorkQty());
+                        break;
+                    }
+                }
+                //淇濆瓨鍑哄簱鏁伴噺锛堝钩搴擄級
+                pars.setWorkQty(pars.getAnfme() - pars.getWorkQty() - anfme);
+
+                resultDto.setOtherLocs(new ArrayList<>());
+
+                resultDto.setAnfme(pars.getAnfme());
+
+                resultDtos.add(resultDto);
+
+            }
+        });
+        //骞冲簱鏌ヨ瀹屾垚鍚庯紝鍐嶆煡璇CU
         for (MergePreviewDto dto : param) {
+            Double anfme = dto.getAnfme() - dto.getWorkQty();
+            //鍑忓幓骞冲簱鏁伴噺鍚庯紝灏忎簬绛変簬0锛岃烦鍑哄鐞�
+            if (anfme <= 0) {
+                continue;
+            }
             List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams);
-            if(locDetls.isEmpty()){
+            if (locDetls.isEmpty()) {
                 MergePreviewResultDto resultDto = new MergePreviewResultDto();
                 resultDto.sync(dto);
                 resultDto.setLocs(new ArrayList<>());
@@ -520,10 +626,9 @@
 
             MergePreviewResultDto resultDto = new MergePreviewResultDto();
             resultDto.sync(dto);
-            resultDto.setLocs(locDtos);
             resultDto.setOrderIds(dto.getOrderIds());
-
-            Double anfme = dto.getAnfme();
+//            Double anfme = dto.getAnfme();
+            resultDto.setLocs(locDtos);
             for (LocDetl locDetl : locDetls) {
                 Loc loc = locService.getById(locDetl.getLocId());
                 if (loc == null) {
@@ -538,7 +643,7 @@
                 locDto.setLocId(locDetl.getLocId());
                 locDto.setLocNo(locDetl.getLocNo());
                 locDto.setLocDetlId(locDetl.getId());
-
+                locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_UTC.id);
                 locDtos.add(locDto);
                 if (anfme - locDetl.getAnfme() < 0) {
                     locDto.setAnfme(anfme);
@@ -562,6 +667,7 @@
                 MergePreviewResultLocDto locDto = new MergePreviewResultLocDto();
                 locDto.setLocId(locDetl.getLocId());
                 locDto.setLocNo(locDetl.getLocNo());
+                locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_UTC.id);
                 locDto.setLocDetlId(locDetl.getId());
                 locDto.setAnfme(locDetl.getAnfme());
                 otherLocDtos.add(locDto);
@@ -576,9 +682,9 @@
         return resultDtos;
     }
 
-    @Transactional
+    @Transactional(rollbackFor = Exception.class)
     public void orderOutMerge(OrderOutMergeParamDto dto) {
-        if(dto == null){
+        if (dto == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
 
@@ -628,7 +734,7 @@
                 List<OrderDetl> detls = detlMap.get(matUniqueKey);
                 detls.add(orderDetl);
                 detlMap.put(matUniqueKey, detls);
-            }else {
+            } else {
                 List<OrderDetl> detls = new ArrayList<>();
                 detls.add(orderDetl);
                 detlMap.put(matUniqueKey, detls);
@@ -662,7 +768,7 @@
                     orderOutMergeDto.setAnfme(issued);
                     updateWorkQty = issued;
                     requireAnfme -= issued;
-                }else {
+                } else {
                     orderOutMergeDto.setAnfme(requireAnfme);
                     updateWorkQty = requireAnfme;
                     requireAnfme -= requireAnfme;
@@ -682,7 +788,7 @@
             List<OrderOutMergeDto> list = null;
             if (map.containsKey(orderOutMergeDto.getLocId())) {
                 list = map.get(orderOutMergeDto.getLocId());
-            }else {
+            } else {
                 list = new ArrayList<>();
             }
             list.add(orderOutMergeDto);
@@ -728,12 +834,12 @@
 
             for (OrderOutMergeDto merge : list) {
                 LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
                 OrderDetl orderDetl = orderDetlService.getById(merge.getOrderDetlId());
-                if(orderDetl == null) {
+                if (orderDetl == null) {
                     throw new CoolException("璁㈠崟鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -758,7 +864,7 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
@@ -770,7 +876,7 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
 
@@ -778,9 +884,22 @@
 
     }
 
+
+    /**
+     * 娉㈡鐢熸垚鍑哄簱浠诲姟
+     * UTC鍑哄簱浠诲姟閫昏緫涓嶅彉锛屾坊鍔犲钩搴撳垽鍒�昏緫
+     * 1. 鑾峰彇娉㈡璁㈠崟鏄庣粏锛屽垽鍒槸鍚︿负骞冲簱璁㈠崟
+     * 2. 骞冲簱璁㈠崟鐢熸垚鎷h揣鍗曪紝 UTC璁㈠崟鐢熸垚鍑哄簱浠诲姟
+     * 3. 骞冲簱鍗曟嵁鏄庣粏鎵�鍗犲簱浣嶇墿鏂欐暟閲忓姞閿�
+     * 4. 鐢熸垚鍑哄簱鍗昉DA绔紝缁熶竴鍑哄簱鎵e噺搴撳瓨
+     * 5. 鐢熸垚鎷h揣鍗曞巻鍙叉。锛屽嚭搴撳崟鎹姞鍏ュ巻鍙叉。锛屽垹闄ゅ師鍗曟嵁
+     * 6. 鍒犻櫎娉㈡鍒楄〃鏁版嵁
+     *
+     * @param dto
+     */
     @Transactional(rollbackFor = Exception.class)
     public void orderOutMergeWave(OrderOutMergeParamDto dto) {
-        if(dto == null){
+        if (dto == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
 
@@ -788,71 +907,82 @@
             throw new CoolException("鏈敓鎴愭尝娆�");
         }
 
-        List<OrderOutMergeParam> params = dto.getList();
-
-        if (params.isEmpty()) {
-            throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        Wave wave = waveService.getById(dto.getWaveId());
+        if (Objects.isNull(wave)) {
+            throw new CoolException("娉㈡涓嶅瓨鍦�");
         }
 
-        Long waveId = dto.getWaveId();
+        /**
+         * 娉㈡鍚堝苟鍑哄簱
+         * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴�
+         * 2. 骞冲簱鐢熸垚鎷h揣鍗�
+         * 3. TCU搴撶敓鎴愪换鍔″崟
+         */
+        outStockByArea(dto, wave);
 
-        List<Long> filterParamsList = new ArrayList<>();
-        List<OrderOutMergeParam> filterParams = new ArrayList<>();
-        for (OrderOutMergeParam param : params) {
-            if (param.getLocId() == null) {
-                continue;
-            }
-
-            if(!filterParamsList.contains(param.getLocId())){
-                filterParamsList.add(param.getLocId());
-                filterParams.add(param);
-            }
+        //娉㈡鐘舵�佷慨鏀逛负--鐢熸垚浠诲姟
+        wave.setWaveStatus(WaveStatusType.GENERATE.id);
+        wave.setUpdateTime(new Date());
+        if (!waveService.updateById(wave)) {
+            throw new CoolException("娉㈡鏇存柊澶辫触");
         }
+    }
 
+    /**
+     * 1. 鍒ゆ柇褰撴尝娆″強搴撲綅鏄庣粏鏄惁瀛樺湪
+     * 2. 缁勫悎key-value(list)褰㈠紡鏁版嵁
+     *
+     * @param mergeParams
+     * @param wave
+     * @return
+     */
+    private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam> mergeParams, Wave wave) {
         HashMap<String, Double> stockMap = new HashMap<>();
-        for (OrderOutMergeParam param : filterParams) {
+        for (OrderOutMergeParam param : mergeParams) {
             String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams());
-            WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, waveId));
-            if(waveDetl == null){
+            WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId()));
+            if (waveDetl == null) {
                 throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
             }
-
+            //鑾峰彇褰撳墠闇�瑕佹墽琛屾暟閲�
             double issued = Optional.of(waveDetl.getAnfme() - waveDetl.getWorkQty()).orElse(0.0D);
-            if(!stockMap.containsKey(matUniqueKey)){
+            if (!stockMap.containsKey(matUniqueKey)) {
                 stockMap.put(matUniqueKey, issued);
             }
         }
 
         HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>();
-        for (OrderOutMergeParam param : filterParams) {
+        for (OrderOutMergeParam param : mergeParams) {
             LocDetl locDetl = locDetlService.getById(param.getLocDetlId());
-            if(locDetl == null) {
+            if (locDetl == null) {
                 continue;
             }
-
-            if (locDetl.getAnfme() - param.getAnfme() < 0) {
+            //搴撲綅鏁伴噺灏忎簬鍑哄簱鏁伴噺 //鏂板workQty鐢ㄤ簬骞冲簱閿佸簱瀛�
+            if (locDetl.getAnfme() - locDetl.getWorkQty() - param.getAnfme() < 0) {
                 continue;
             }
 
             OrderOutMergeDto orderOutMergeDto = new OrderOutMergeDto();
             orderOutMergeDto.sync(param);
-
+            //fixme 纭stockMap鏄惁鏈夌敤锛屾澶勫叆鍊煎悗鍗存病鏈変娇鐢�
             String matUniqueKey = Utils.getMatUniqueKey(param.getMatnr(), param.getBatch(), param.getFieldParams());
             Double issued = stockMap.get(matUniqueKey);
             if (issued - orderOutMergeDto.getAnfme() < 0) {
                 orderOutMergeDto.setAnfme(issued);
                 issued = 0D;
-            }else {
+            } else {
                 issued -= orderOutMergeDto.getAnfme();
             }
-            stockMap.put(matUniqueKey, issued);
 
+            stockMap.put(matUniqueKey, issued);
+            //鏍规嵁搴撲綅鍋氬垎绫伙紝鍙娇鐢╯tream().groupby
             List<OrderOutMergeDto> list = null;
             if (map.containsKey(orderOutMergeDto.getLocId())) {
                 list = map.get(orderOutMergeDto.getLocId());
-            }else {
+            } else {
                 list = new ArrayList<>();
             }
+
             list.add(orderOutMergeDto);
             map.put(orderOutMergeDto.getLocId(), list);
         }
@@ -861,9 +991,66 @@
             throw new CoolException("搴撳瓨涓嶈冻");
         }
 
+        return map;
+    }
+
+    /**
+     * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷e崟鍙奀TU浠诲姟妗�
+     *
+     * @param dto
+     * @param wave
+     */
+    private void outStockByArea(OrderOutMergeParamDto dto, Wave wave) {
+        List<OrderOutMergeParam> params = dto.getList();
+        if (params.isEmpty()) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        //骞冲簱鏁版嵁婧�
+        List<OrderOutMergeParam> flatOrders = new ArrayList<>();// listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_FLAT);
+        //TUC鏁版嵁婧�
+        List<OrderOutMergeParam> tucOrders = new ArrayList<>();//listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_UTC);
+        //鎸夊簱浣嶇被鍨嬪垎绫�
+        //fixme 濡傛灉搴撳瓨涓嶈冻鏃讹紝鐢熸垚浠诲姟妗� 杩囨护鎺夋病鏈夊簱浣嶄俊鎭殑鏁版嵁銆傛壘鍚涙澃纭
+        List<OrderOutMergeParam> mergeParam = params.stream().filter(par -> {
+            return !StringUtils.isNullOrEmpty(par.getLocNo());
+        }).collect(Collectors.toList());
+        //鏁版嵁鍒嗙被 1.骞冲簱鏁版嵁  2. TUC鏁版嵁
+        Map<Long, List<OrderOutMergeParam>> listMap = mergeParam.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getTypeId));
+
+        listMap.keySet().forEach(key -> {
+            if (key == LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id) {
+                flatOrders.addAll(listMap.get(key));
+            } else {
+                tucOrders.addAll(listMap.get(key));
+            }
+        });
+        if (!flatOrders.isEmpty()) {
+            //骞冲簱鍑哄簱
+            outStockByFlat(flatOrders, wave);
+        }
+
+        if (!tucOrders.isEmpty()) {
+            //TUC鍑哄簱
+            outStockByTUC(tucOrders, wave);
+        }
+
+
+    }
+
+    /**
+     * TUC鍑哄簱--鐢熸垚鍑哄簱浠诲姟妗�
+     *
+     * @param tucOrders
+     * @param wave
+     */
+    private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {//123
+        Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave);
+
         for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) {
             Long locId = entry.getKey();
             List<OrderOutMergeDto> list = entry.getValue();
+            //鍒ゆ柇鏄惁鍏ㄤ粨鍑哄簱
             Boolean all = outUtils.isAllForMerge(locId, list);
             OrderOutMergeDto param = list.get(0);
             Long operationPortId = param.getOperationPort();
@@ -881,7 +1068,7 @@
             if (operationPort == null) {
                 throw new CoolException("浣滀笟鍙d笉瀛樺湪");
             }
-
+            //101 鍏ㄦ嫋鍑哄簱   103 鎷h揣鍑哄簱
             long taskType = all ? 101L : 103L;
 
             Task task = new Task();
@@ -899,7 +1086,7 @@
 
             for (OrderOutMergeDto merge : list) {
                 LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
-                if(locDetl == null) {
+                if (locDetl == null) {
                     throw new CoolException("鏄庣粏涓嶅瓨鍦�");
                 }
 
@@ -910,7 +1097,8 @@
                 taskDetl.setTaskNo(task.getTaskNo());
                 taskDetl.setAnfme(merge.getAnfme());
                 taskDetl.setStock(locDetl.getAnfme());
-                taskDetl.setWaveId(waveId);
+                taskDetl.setWaveId(wave.getId());
+                taskDetl.setWaveNo(wave.getWaveNo());
                 taskDetl.setOrderId(null);
                 taskDetl.setOrderNo(null);
                 if (!taskDetlService.save(taskDetl)) {
@@ -924,15 +1112,13 @@
                     taskDetlField.setId(null);
                     taskDetlField.setDetlId(taskDetl.getId());
                     boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
-                    if(!taskDetlFieldSave){
+                    if (!taskDetlFieldSave) {
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
 
-                //TODO 纭鍚庯紝闇�灏嗘敞閲婃墦寮�
                 String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
-//                WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, waveId));
-                WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, waveId), false);
+                WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId()));
                 if (waveDetl == null) {
                     throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
                 }
@@ -947,22 +1133,87 @@
             loc.setLocStsId(LocStsType.R.val());
             loc.setUpdateTime(new Date());
             boolean locUpdate = locService.updateById(loc);
-            if(!locUpdate){
+            if (!locUpdate) {
                 throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
             }
+        }
+    }
 
+    /**
+     * 骞冲簱鍑哄簱--鐢熸垚鍑哄簱鎷h揣鍗�
+     * 1. 鍒ゆ柇褰撳墠搴撲綅鏄惁瀛樺湪
+     * 2. 涓�寮犲崟鎹竴涓尝娆�
+     * 3. 涓�涓尝娆″鏉¤鍗�
+     * 4. 涓�涓簱浣嶅彲澶氭潯鏄庣粏
+     * 5. 鎷h揣鍗曞畬鎴愬悗锛岄噴鏀惧簱浣嶆槑缁嗛攣瀹氭暟閲�
+     *
+     * @param flatOrders
+     * @param wave
+     */
+    private void outStockByFlat(List<OrderOutMergeParam> flatOrders, Wave wave) {
+        //鏍¢獙搴撳瓨鏁伴噺
+        Map<Long, List<OrderOutMergeDto>> map = checkLoc(flatOrders, wave);
+        //鐢熸垚鎷h揣鍗�
+        PickSheet pickSheet = new PickSheet();
+        //娉㈡鏁伴噺姹囨��
+        double sum = flatOrders.stream().mapToDouble(OrderOutMergeParam::getAnfme).sum();
+        //鐢熸垚鎷h揣鍗曞彿
+        String pickNo = generatePickNO();
+        pickSheet.setId(null)
+                .setPickNo(pickNo)
+                .setMemo(wave.getMemo())
+                .setAnfme(sum)
+                .setWaveId(wave.getId())
+                .setWaveNo(wave.getWaveNo());
+
+        if (!pickSheetService.save(pickSheet)) {
+            throw new CoolException("鎷h揣鍗曞啓鍏ュけ璐ワ紒锛�");
         }
 
-        Wave wave = waveService.getById(waveId);
-        if (wave == null) {
-            throw new CoolException("娉㈡涓嶅瓨鍦�");
-        }
+        //鏍规嵁搴撲綅ID鍒嗙粍
+        Map<Long, List<OrderOutMergeParam>> listMap = flatOrders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId));
+        //鐢熸垚鎷h揣鏄庣粏
+        listMap.keySet().forEach(key -> {
+            Loc curLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key));
+            if (Objects.isNull(curLoc)) {
+                throw new CoolException("涓婚敭." + key + "鐨勫簱浣嶄笉瀛樺湪锛侊紒");
+            }
+            listMap.get(key).forEach(outOder -> {
+                //鑾峰彇搴撲綅鏄庣粏淇℃伅
+                LocDetl locDetl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, outOder.getLocDetlId()));
+                PickSheetDetl sheetDetl = new PickSheetDetl();
+                BeanUtils.copyProperties(outOder, sheetDetl);
+                //鑾峰彇鐗╂枡淇℃伅
+                Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, outOder.getMatnr()));
+                //鎷h揣鍗曟槑缁�
+                sheetDetl.setBarcode(curLoc.getBarcode())
+                        .setPickId(pickSheet.getId())
+                        .setAnfme(BigDecimal.valueOf(outOder.getAnfme()))
+                        .setLocDetlId(locDetl.getId())
+                        .setMaktx(mat.getMaktx())
+                        .setMatId(mat.getId());
+                if (!pickSheetDetlService.save(sheetDetl)) {
+                    throw new CoolException("鎷h揣鏄庣粏鍒楁柊澶辫触");
+                }
+                //閿佸畾搴撳瓨閲�
+                locDetl.setWorkQty(locDetl.getWorkQty() + outOder.getAnfme());
 
-        wave.setWaveStatus(WaveStatusType.GENERATE.id);
-        wave.setUpdateTime(new Date());
-        if (!waveService.updateById(wave)) {
-            throw new CoolException("娉㈡鏇存柊澶辫触");
-        }
+            });
+
+        });
+
+    }
+
+    /**
+     * 鐢熸垚鎷h揣鍗曞彿
+     *
+     * @return
+     */
+    private String generatePickNO() {
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+        String format = simpleDateFormat.format(new Date());
+        Random random = new Random();
+        return "PN" + format + random.nextInt(10000);
     }
 
     @Transactional(rollbackFor = Exception.class)
@@ -980,12 +1231,12 @@
             throw new CoolException("閫氶亾鍙傛暟涓嶈兘涓虹┖");
         }
 
-        for (String channel : channels) {
-            long count = cacheSiteService.count(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getChannel, channel).ne(CacheSite::getSiteStatus, 0));
-            if (count > 0) {
-                throw new CoolException(channel + "閫氶亾宸茬粡鍒嗛厤娉㈡");
-            }
-        }
+//        for (String channel : channels) {
+//            long count = cacheSiteService.count(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getChannel, channel).ne(CacheSite::getSiteStatus, 0));
+//            if (count > 0) {
+//                throw new CoolException(channel + "閫氶亾宸茬粡鍒嗛厤娉㈡");
+//            }
+//        }
 
 
         List<Long> orderIds = param.getOrderIds();
@@ -1038,19 +1289,19 @@
                 throw new CoolException("璁㈠崟鍙嶅啓娉㈡澶辫触");
             }
 
-            List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id).in(CacheSite::getChannel, channels).orderBy(true, true, CacheSite::getChannel));
-            if (cacheSites.isEmpty()) {
-                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
-            }
-
-            CacheSite cacheSite = cacheSites.get(0);
-            cacheSite.setOrderId(order.getId());
-            cacheSite.setOrderNo(order.getOrderNo());
-            cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
-            cacheSite.setUpdateTime(new Date());
-            if (!cacheSiteService.updateById(cacheSite)) {
-                throw new CoolException("缂撳瓨绔欐洿鏂板け璐�");
-            }
+//            List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id).in(CacheSite::getChannel, channels).orderBy(true, true, CacheSite::getChannel));
+//            if (cacheSites.isEmpty()) {
+//                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
+//            }
+//
+//            CacheSite cacheSite = cacheSites.get(0);
+//            cacheSite.setOrderId(order.getId());
+//            cacheSite.setOrderNo(order.getOrderNo());
+//            cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
+//            cacheSite.setUpdateTime(new Date());
+//            if (!cacheSiteService.updateById(cacheSite)) {
+//                throw new CoolException("缂撳瓨绔欐洿鏂板け璐�");
+//            }
         }
 
         for (Map.Entry<String, List<OrderDetl>> entry : map.entrySet()) {
@@ -1115,7 +1366,7 @@
                     order.setWaveId(null);
                     order.setWaveNo(null);
                     order.setHasWave(0);
-                    if(order.getOrderSettle().equals(OrderSettleType.WAVE.val())){
+                    if (order.getOrderSettle().equals(OrderSettleType.WAVE.val())) {
                         order.setOrderSettle(OrderSettleType.WAIT.val());
                     }
                     if (!orderService.updateById(order)) {

--
Gitblit v1.9.1