From e046dba174365eb8934ee1e4206f09821145e876 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期四, 21 八月 2025 13:23:22 +0800
Subject: [PATCH] no message

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java |  309 ++++++++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 265 insertions(+), 44 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 b734f6c..c1aacdc 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,8 +1,11 @@
 package com.zy.asrs.wms.asrs.manage;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.mysql.cj.util.StringUtils;
+import com.zy.asrs.wms.asrs.entity.param.StockOutParam;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.entity.dto.*;
@@ -530,6 +533,12 @@
         return mergePreviewDtos;
     }
 
+    /**
+     * 娉㈡鍑哄簱棰勮
+     *
+     * @param param
+     * @return
+     */
     @Transactional(rollbackFor = Exception.class)
     public List<MergePreviewResultDto> orderOutMergeLocPreview(List<MergePreviewDto> param) {
         if (param == null) {
@@ -565,7 +574,7 @@
             //鏌ヨ骞冲簱涓鍚堟潯浠剁殑搴撳瓨
             List<LocDetl> locs = locDetlService.queryFlatStock(pars.getMatnr(), pars.getBatch(), pars.getFieldParams());
             if (!locs.isEmpty()) {
-                double anfme = pars.getAnfme() - pars.getWorkQty();
+                Double anfme = pars.getAnfme() - pars.getWorkQty();
                 for (LocDetl detl : locs) {
                     Loc loc = locService.getById(detl.getLocId());
                     if (loc == null) {
@@ -580,7 +589,7 @@
                     locDto.setLocNo(detl.getLocNo());
                     locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id);
                     locDto.setLocDetlId(detl.getId());
-                    locDto.setAnfme(detl.getAnfme());
+                    locDto.setAnfme(detl.getAnfme() - detl.getWorkQty());
                     locDto.setWorkQty(detl.getWorkQty());
                     locDtos.add(locDto);
                     //搴撲綅瀹為檯鍙敤鏁伴噺
@@ -589,8 +598,8 @@
                         continue;
                     }
                     //娉㈡鏁伴噺鍑忓幓搴撲綅鍙敤鏁伴噺鍚庯紝鐩堜綑鏁伴噺
-                    anfme = anfme - surplusQty;
-                    if (anfme > 0) {
+                    anfme = Math.round((anfme - surplusQty) * 10000) / 10000.0;
+                    if (anfme.compareTo(0.0) > 0) {
                         //褰撳墠鍙娇鐢ㄦ暟閲�
                         resultDto.setFetchQty(surplusQty);
                         //浣欎笅闇�姹傛暟閲�
@@ -935,9 +944,9 @@
 
         /**
          * 娉㈡鍚堝苟鍑哄簱
-         * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴�
+         * 1. 鍒ゆ柇鏄钩搴撹繕CTU搴�
          * 2. 骞冲簱鐢熸垚鎷h揣鍗�
-         * 3. TCU搴撶敓鎴愪换鍔″崟
+         * 3. CTU搴撶敓鎴愪换鍔″崟
          */
         outStockByArea(dto, wave);
 
@@ -1019,9 +1028,10 @@
      * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷h揣鍗曟垨CTU浠诲姟妗�
      *
      * @param dto
-     * @param wave
+     * @param
      */
-    private void outStockByArea(OrderOutMergeParamDto dto, Wave wave) {
+    @Transactional(rollbackFor = Exception.class)
+    public void outStockByArea(OrderOutMergeParamDto dto, Wave wave) {
         List<OrderOutMergeParam> params = dto.getList();
         if (params.isEmpty()) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
@@ -1048,13 +1058,11 @@
         if (!flatOrders.isEmpty()) {
             //骞冲簱鍑哄簱
             outStockByFlat(flatOrders, wave);
-        } else if (!tucOrders.isEmpty()) {
-            //CTU鍑哄簱
-            outStockByTUC(tucOrders, wave);
-        } else {
-            throw new CoolException("搴撳瓨涓嶈冻");
         }
-
+        if (!tucOrders.isEmpty()) {
+            //CTU鍑哄簱
+            outStockByCTU(tucOrders, wave);
+        }
     }
 
     /**
@@ -1063,7 +1071,7 @@
      * @param tucOrders
      * @param wave
      */
-    private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {
+    private void outStockByCTU(List<OrderOutMergeParam> tucOrders, Wave wave) {
         Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave);
 
         for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) {
@@ -1103,6 +1111,11 @@
                 throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
             }
 
+            wave.setSite(operationPort.getFlag());
+            if (!waveService.updateById(wave)) {
+                throw new CoolException("娉㈡绔欏彛鐘舵�佹洿鏂板け璐ワ紒锛�");
+            }
+
             for (OrderOutMergeDto merge : list) {
                 LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
                 if (locDetl == null) {
@@ -1137,9 +1150,12 @@
                 }
 
                 String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
-                WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId()));
+                logger.error("Matnr------>{}", taskDetl.getMatnr());
+                WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>()
+                        .eq(WaveDetl::getStockIndex, matUniqueKey)
+                        .eq(WaveDetl::getWaveId, wave.getId()));
                 if (waveDetl == null) {
-                    throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
+                    throw new CoolException("waveId:" + wave.getId() + "鐗╂枡锛�" + taskDetl.getMatnr() + "娉㈡鏁版嵁涓嶅瓨鍦�");
                 }
                 waveDetl.setWorkQty(waveDetl.getWorkQty() + taskDetl.getAnfme());
                 waveDetl.setUpdateTime(new Date());
@@ -1153,28 +1169,31 @@
                 throw new CoolException("褰撳墠娉㈡璁㈠崟涓嶅瓨鍦紒锛�");
             }
 
-            List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>()
-                    .eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id).eq(CacheSite::getChannel,task.getTargetSite()));
 
-            if (cacheSites.isEmpty()) {
-                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
-            }
+//            List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>()
+//                    .eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id).eq(CacheSite::getChannel, task.getTargetSite()));
+//
+//            if (cacheSites.isEmpty()) {
+//                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
+//            }
+//
+//            if (cacheSites.size() < orders.size()) {
+//                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
+//            }
 
-            if (cacheSites.size() < orders.size()) {
-                throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
-            }
-
-            for (int i = 0; i < orders.size(); i++) {
-                CacheSite cacheSite = cacheSites.get(i);
-                cacheSite.setOrderId(orders.get(i).getId());
-                cacheSite.setOrderNo(orders.get(i).getOrderNo());
-                cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
-                cacheSite.setBarcode(loc.getBarcode());
-                cacheSite.setUpdateTime(new Date());
-                if (!cacheSiteService.updateById(cacheSite)) {
-                    throw new CoolException("缂撳瓨绔欐洿鏂板け璐�");
-                }
-            }
+//            for (int i = 0; i < orders.size(); i++) {
+//                CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orders.get(i).getId()));
+//                if (Objects.isNull(cacheSite)) {
+//                    cacheSite.setOrderId(orders.get(i).getId());
+//                    cacheSite.setOrderNo(orders.get(i).getOrderNo());
+//                    cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
+//                    cacheSite.setBarcode(loc.getBarcode());
+//                    cacheSite.setUpdateTime(new Date());
+//                    if (!cacheSiteService.updateById(cacheSite)) {
+//                        throw new CoolException("缂撳瓨绔欐洿鏂板け璐�");
+//                    }
+//                }
+//            }
 
             //搴撲綅F => R
             loc.setLocStsId(LocStsType.R.val());
@@ -1219,6 +1238,18 @@
 
         //鏍规嵁搴撲綅ID鍒嗙粍
         Map<Long, List<OrderOutMergeParam>> listMap = flatOrders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId));
+
+        genPickSheet(listMap, pickSheet);
+    }
+
+    /**
+     * @author Ryan
+     * @date 2025/7/4
+     * @description: 鐢熸垚鎷h揣鏄庣粏
+     * @version 1.0
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void genPickSheet(Map<Long, List<OrderOutMergeParam>> listMap, PickSheet pickSheet) {
         //鐢熸垚鎷h揣鏄庣粏
         listMap.keySet().forEach(key -> {
             Loc curLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key));
@@ -1249,10 +1280,19 @@
                     throw new CoolException("搴撳瓨鍔犻攣澶辫触锛侊紒");
                 }
 
+                orderDetlService.update(new LambdaUpdateWrapper<OrderDetl>()
+                                .set(OrderDetl::getWareType, 2)
+                        .eq(OrderDetl::getMatId, mat.getId())
+                        .eq(StringUtils.isNullOrEmpty(outOder.getBatch()), OrderDetl::getBatch, outOder.getBatch())
+                        .in(OrderDetl::getOrderId, outOder.getOrderIds()));
             });
 
-        });
+            curLoc.setLocStsId(LocStsType.R.val());
 
+            if (!locService.updateById(curLoc)) {
+                throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+            }
+        });
     }
 
     /**
@@ -1272,24 +1312,19 @@
         if (param == null) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
-
         List<String> channels = param.getChannels();
         if (channels == null) {
             throw new CoolException("閫氶亾鍙傛暟涓嶈兘涓虹┖");
         }
-
         if (channels.isEmpty()) {
             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 + "閫氶亾宸茬粡鍒嗛厤娉㈡");
 //            }
 //        }
-
-
         List<Long> orderIds = param.getOrderIds();
         if (orderIds == null) {
             throw new CoolException("璁㈠崟鍙傛暟涓嶈兘涓虹┖");
@@ -1450,7 +1485,193 @@
 
             waveService.removeById(wave.getId());
         }
-
     }
 
+    /**
+     * @author Ryan
+     * @date 2025/7/3
+     * @description: 搴撳瓨鍑哄簱淇℃伅
+     * @version 1.0
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void outLocStock(StockOutParam param) {
+        System.out.println(JSONObject.toJSONString(param));
+        if (param.getOutType().equals(1)) {
+            //鎷h揣鍗�
+            outFlatStock(param);
+        } else {
+            //鐢熸垚浠诲姟妗�
+            generateTask(param);
+        }
+    }
+
+    /**
+     * @author Ryan
+     * @param: []
+     * @return: void
+     * @date: 2025/7/4
+     * @description: 鎵嬪姩鍑哄簱鐢熸垚浠诲姟
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void generateTask(StockOutParam outParam) {
+        for (LocDetl outLocDetl : outParam.getLocDetls()) {
+            List<OrderOutMergeDto> orders = new ArrayList<>();
+            LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, outLocDetl.getId()));
+            if (Objects.isNull(detl)) {
+                continue;
+            }
+            OrderOutMergeDto outMergeParam = new OrderOutMergeDto();
+            outMergeParam.setAnfme(outLocDetl.getAnfme());
+            outMergeParam.setLocNo(outLocDetl.getLocNo());
+            outMergeParam.setLocDetlId(detl.getId());
+            outMergeParam.setLocId(detl.getLocId());
+            outMergeParam.setMatnr(outLocDetl.getMatnr());
+            outMergeParam.setBatch(detl.getBatch());
+            orders.add(outMergeParam);
+
+            //鏍规嵁搴撲綅ID鍒嗙粍
+            Map<Long, List<OrderOutMergeDto>> listMap = orders.stream().collect(Collectors.groupingBy(OrderOutMergeDto::getLocId));
+            //鐢熸垚鎷h揣鍗曟槑缁�
+            for (Map.Entry<Long, List<OrderOutMergeDto>> entry : listMap.entrySet()) {
+                Long locId = entry.getKey();
+                List<OrderOutMergeDto> list = entry.getValue();
+                //鍒ゆ柇鏄惁鍏ㄤ粨鍑哄簱
+                Boolean all = outUtils.isAllForMerge(locId, list);
+                OrderOutMergeDto param = list.stream().findFirst().get();
+
+                List<CacheSite> sites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>()
+                        .isNotNull(CacheSite::getOrderId));
+                if (!sites.isEmpty()) {
+                    Map<String, Long> longMap = sites.stream().collect(Collectors.groupingBy(CacheSite::getChannel, Collectors.counting()));
+                    Map.Entry<String, Long> entry1 = longMap.entrySet().stream().min(Map.Entry.comparingByValue()).get();
+                    param.setPortSite(entry1.getKey());
+                } else {
+                    CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().last("limit 1"));
+                    param.setPortSite(cacheSite.getChannel());
+                }
+                Loc loc = locService.getById(locId);
+                if (loc == null) {
+                    throw new CoolException("搴撲綅涓嶅瓨鍦�");
+                }
+
+                if (!loc.getLocStsId().equals(LocStsType.F.val())) {
+                    throw new CoolException(loc.getLocNo() + "搴撲綅鐘舵�佸紓甯�");
+                }
+
+                OperationPort operationPort = operationPortService
+                        .getOne(new LambdaQueryWrapper<OperationPort>()
+                                .eq(OperationPort::getFlag, param.getPortSite()));
+                if (Objects.isNull(operationPort)) {
+                    throw new CoolException("浣滀笟鍙d笉瀛樺湪");
+                }
+                //101 鍏ㄦ嫋鍑哄簱   103 鎷h揣鍑哄簱
+                long taskType = all ? 101L : 103L;
+
+                Task task = new Task();
+                task.setTaskNo(workService.generateTaskNo(taskType));
+                task.setTaskSts(TaskStsType.GENERATE_OUT.id);
+                task.setTaskType(taskType);
+                task.setIoPri(workService.generateIoPri(taskType));
+                task.setOriginLoc(loc.getLocNo());
+                task.setTargetSite(operationPort.getFlag());
+                task.setBarcode(loc.getBarcode());
+                boolean res = taskService.save(task);
+                if (!res) {
+                    throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�");
+                }
+
+                for (OrderOutMergeDto merge : list) {
+                    LocDetl locDetl = locDetlService.getById(merge.getLocDetlId());
+                    if (locDetl == null) {
+                        throw new CoolException("鏄庣粏涓嶅瓨鍦�");
+                    }
+
+                    TaskDetl taskDetl = new TaskDetl();
+                    taskDetl.sync(locDetl);
+                    taskDetl.setId(null);
+                    taskDetl.setTaskId(task.getId());
+                    taskDetl.setTaskNo(task.getTaskNo());
+                    taskDetl.setAnfme(merge.getAnfme());
+                    taskDetl.setStock(locDetl.getAnfme());
+                    taskDetl.setOrderId(null);
+                    taskDetl.setOrderNo(null);
+                    if (!taskDetlService.save(taskDetl)) {
+                        throw new CoolException("淇濆瓨宸ヤ綔妗f槑缁嗗け璐�");
+                    }
+
+                    List<LocDetlField> locDetlFields = locDetlFieldService
+                            .list(new LambdaQueryWrapper<LocDetlField>()
+                                    .eq(LocDetlField::getDetlId, locDetl.getId()));
+                    for (LocDetlField locDetlField : locDetlFields) {
+                        TaskDetlField taskDetlField = new TaskDetlField();
+                        taskDetlField.sync(locDetlField);
+                        taskDetlField.setId(null);
+                        taskDetlField.setDetlId(taskDetl.getId());
+                        boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField);
+                        if (!taskDetlFieldSave) {
+                            throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                        }
+                    }
+                }
+
+                //搴撲綅F => R
+                loc.setLocStsId(LocStsType.R.val());
+                loc.setUpdateTime(new Date());
+                boolean locUpdate = locService.updateById(loc);
+                if (!locUpdate) {
+                    throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+                }
+            }
+        }
+    }
+
+
+    /**
+     * @author Ryan
+     * @date 2025/7/4
+     * @description: 骞冲簱搴撳瓨鍑哄簱
+     * @version 1.0
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void outFlatStock(StockOutParam param) {
+        //鐢熸垚鎷h揣鍗�
+        PickSheet pickSheet = new PickSheet();
+        //娉㈡鏁伴噺姹囨��
+        Double sum = param.getLocDetls().stream().mapToDouble(LocDetl::getAnfme).sum();
+        //鐢熸垚鎷h揣鍗曞彿
+        String pickNo = generatePickNO();
+        pickSheet.setId(null)
+                .setPickNo(pickNo)
+                .setMemo("搴撳瓨鍑哄簱")
+                .setAnfme(sum)
+                .setType(2);
+
+        if (!pickSheetService.save(pickSheet)) {
+            throw new CoolException("鎷h揣鍗曞啓鍏ュけ璐ワ紒锛�");
+        }
+
+        for (LocDetl locDetl : param.getLocDetls()) {
+            List<OrderOutMergeParam> orders = new ArrayList<>();
+            LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>()
+                    .eq(LocDetl::getMatId, locDetl.getMatId())
+                    .eq(LocDetl::getBatch, locDetl.getBatch())
+                    .eq(LocDetl::getLocNo, locDetl.getLocNo()));
+            if (Objects.isNull(detl)) {
+                continue;
+            }
+            OrderOutMergeParam outMergeParam = new OrderOutMergeParam();
+            outMergeParam.setAnfme(locDetl.getAnfme())
+                    .setLocNo(locDetl.getLocNo())
+                    .setLocId(detl.getLocId())
+                    .setLocDetlId(detl.getId())
+                    .setMatnr(locDetl.getMatnr())
+                    .setBatch(detl.getBatch());
+            orders.add(outMergeParam);
+
+            //鏍规嵁搴撲綅ID鍒嗙粍
+            Map<Long, List<OrderOutMergeParam>> listMap = orders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId));
+            //鐢熸垚鎷h揣鍗曟槑缁�
+            genPickSheet(listMap, pickSheet);
+        }
+    }
 }

--
Gitblit v1.9.1