From ac4341ea6b66ae02427d39d35f41d42d78b2eb2e Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期五, 14 二月 2025 10:08:32 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java |  377 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 353 insertions(+), 24 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 ba2a50e..fa5f797 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
@@ -4,8 +4,8 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.dto.*;
-import com.zy.asrs.wms.asrs.entity.enums.LocStsType;
-import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
+import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto;
+import com.zy.asrs.wms.asrs.entity.enums.*;
 import com.zy.asrs.wms.asrs.entity.param.*;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.service.*;
@@ -58,6 +58,10 @@
     private WaveService waveService;
     @Autowired
     private WaveDetlService waveDetlService;
+    @Autowired
+    private CacheSiteService cacheSiteService;
+    @Autowired
+    private WaveSeedService waveSeedService;
 
     /**
      * 鍑哄簱
@@ -87,7 +91,7 @@
 
             Task task = new Task();
             task.setTaskNo(workService.generateTaskNo(1L));
-            task.setTaskSts(101L);
+            task.setTaskSts(TaskStsType.GENERATE_OUT.id);
             task.setTaskType(taskType);
             task.setIoPri(workService.generateIoPri(taskType));
             task.setOriginLoc(loc.getLocNo());
@@ -107,6 +111,7 @@
                 TaskDetl taskDetl = new TaskDetl();
                 taskDetl.sync(locDetl);
                 taskDetl.setTaskId(task.getId());
+                taskDetl.setTaskNo(task.getTaskNo());
                 taskDetl.setAnfme(detl.getAnfme());
                 taskDetl.setStock(detl.getStock());
                 taskDetl.setOrderId(null);
@@ -357,7 +362,7 @@
 
             Task task = new Task();
             task.setTaskNo(workService.generateTaskNo(taskType));
-            task.setTaskSts(101L);
+            task.setTaskSts(TaskStsType.GENERATE_OUT.id);
             task.setTaskType(taskType);
             task.setIoPri(workService.generateIoPri(taskType));
             task.setOriginLoc(loc.getLocNo());
@@ -384,6 +389,7 @@
                 taskDetl.sync(locDetl);
                 taskDetl.setId(null);
                 taskDetl.setTaskId(task.getId());
+                taskDetl.setTaskNo(task.getTaskNo());
                 taskDetl.setAnfme(dto.getAnfme());
                 taskDetl.setStock(locDetl.getAnfme());
                 taskDetl.setOrderId(orderDetl.getOrderId());
@@ -501,6 +507,12 @@
         for (MergePreviewDto dto : param) {
             List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams);
             if(locDetls.isEmpty()){
+                MergePreviewResultDto resultDto = new MergePreviewResultDto();
+                resultDto.sync(dto);
+                resultDto.setLocs(new ArrayList<>());
+                resultDto.setOrderIds(dto.getOrderIds());
+                resultDto.setAnfme(dto.getAnfme());
+                resultDtos.add(resultDto);
                 continue;
             }
 
@@ -513,6 +525,15 @@
 
             Double anfme = dto.getAnfme();
             for (LocDetl locDetl : locDetls) {
+                Loc loc = locService.getById(locDetl.getLocId());
+                if (loc == null) {
+                    throw new CoolException("搴撲綅鏁版嵁涓嶅瓨鍦�");
+                }
+
+                if (loc.getLocStsId() != LocStsType.F.val()) {
+                    continue;
+                }
+
                 MergePreviewResultLocDto locDto = new MergePreviewResultLocDto();
                 locDto.setLocId(locDetl.getLocId());
                 locDto.setLocNo(locDetl.getLocNo());
@@ -526,7 +547,28 @@
                 locDto.setAnfme(locDetl.getAnfme());
                 anfme -= locDetl.getAnfme();
             }
-            resultDto.setAnfme(anfme < 0 ? 0 : anfme);
+
+            List<MergePreviewResultLocDto> otherLocDtos = new ArrayList<>();
+            for (LocDetl locDetl : locDetls) {
+                Loc loc = locService.getById(locDetl.getLocId());
+                if (loc == null) {
+                    throw new CoolException("搴撲綅鏁版嵁涓嶅瓨鍦�");
+                }
+
+                if (loc.getLocStsId() != LocStsType.F.val()) {
+                    continue;
+                }
+
+                MergePreviewResultLocDto locDto = new MergePreviewResultLocDto();
+                locDto.setLocId(locDetl.getLocId());
+                locDto.setLocNo(locDetl.getLocNo());
+                locDto.setLocDetlId(locDetl.getId());
+                locDto.setAnfme(locDetl.getAnfme());
+                otherLocDtos.add(locDto);
+            }
+            resultDto.setOtherLocs(otherLocDtos);
+
+            resultDto.setAnfme(dto.getAnfme());
 
             resultDtos.add(resultDto);
         }
@@ -535,10 +577,12 @@
     }
 
     @Transactional
-    public void orderOutMerge(List<OrderOutMergeParam> params) {
-        if(params == null){
+    public void orderOutMerge(OrderOutMergeParamDto dto) {
+        if(dto == null){
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
+
+        List<OrderOutMergeParam> params = dto.getList();
 
         if (params.isEmpty()) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
@@ -645,6 +689,7 @@
             map.put(orderOutMergeDto.getLocId(), list);
         }
 
+        List<TaskDetl> taskDetls = new ArrayList<>();
         for (Map.Entry<Long, List<OrderOutMergeDto>> entry : map.entrySet()) {
             Long locId = entry.getKey();
             List<OrderOutMergeDto> list = entry.getValue();
@@ -670,7 +715,7 @@
 
             Task task = new Task();
             task.setTaskNo(workService.generateTaskNo(taskType));
-            task.setTaskSts(101L);
+            task.setTaskSts(TaskStsType.GENERATE_OUT.id);
             task.setTaskType(taskType);
             task.setIoPri(workService.generateIoPri(taskType));
             task.setOriginLoc(loc.getLocNo());
@@ -696,6 +741,7 @@
                 taskDetl.sync(locDetl);
                 taskDetl.setId(null);
                 taskDetl.setTaskId(task.getId());
+                taskDetl.setTaskNo(task.getTaskNo());
                 taskDetl.setAnfme(merge.getAnfme());
                 taskDetl.setStock(locDetl.getAnfme());
                 taskDetl.setOrderId(orderDetl.getOrderId());
@@ -716,6 +762,8 @@
                         throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触");
                     }
                 }
+
+                taskDetls.add(taskDetl);
             }
 
             //搴撲綅F => R
@@ -728,17 +776,224 @@
 
         }
 
-
     }
 
     @Transactional
-    public void generateWave(List<Long> orderIds) {
-        if (orderIds == null) {
+    public void orderOutMergeWave(OrderOutMergeParamDto dto) {
+        if(dto == null){
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
         }
 
-        if (orderIds.isEmpty()) {
+        if (dto.getWaveId() == null) {
+            throw new CoolException("鏈敓鎴愭尝娆�");
+        }
+
+        List<OrderOutMergeParam> params = dto.getList();
+
+        if (params.isEmpty()) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        Long waveId = dto.getWaveId();
+
+        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);
+            }
+        }
+
+        HashMap<String, Double> stockMap = new HashMap<>();
+        for (OrderOutMergeParam param : filterParams) {
+            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){
+                throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
+            }
+
+            double issued = Optional.of(waveDetl.getAnfme() - waveDetl.getWorkQty()).orElse(0.0D);
+            if(!stockMap.containsKey(matUniqueKey)){
+                stockMap.put(matUniqueKey, issued);
+            }
+        }
+
+        HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>();
+        for (OrderOutMergeParam param : filterParams) {
+            LocDetl locDetl = locDetlService.getById(param.getLocDetlId());
+            if(locDetl == null) {
+                continue;
+            }
+
+            if (locDetl.getAnfme() - param.getAnfme() < 0) {
+                continue;
+            }
+
+            OrderOutMergeDto orderOutMergeDto = new OrderOutMergeDto();
+            orderOutMergeDto.sync(param);
+
+            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 {
+                issued -= orderOutMergeDto.getAnfme();
+            }
+            stockMap.put(matUniqueKey, issued);
+
+            List<OrderOutMergeDto> list = null;
+            if (map.containsKey(orderOutMergeDto.getLocId())) {
+                list = map.get(orderOutMergeDto.getLocId());
+            }else {
+                list = new ArrayList<>();
+            }
+            list.add(orderOutMergeDto);
+            map.put(orderOutMergeDto.getLocId(), list);
+        }
+
+        if (map.isEmpty()) {
+            throw new CoolException("搴撳瓨涓嶈冻");
+        }
+
+        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();
+
+            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.getById(operationPortId);
+            if (operationPort == null) {
+                throw new CoolException("浣滀笟鍙d笉瀛樺湪");
+            }
+
+            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.setWaveId(waveId);
+                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("鏄庣粏鎵╁睍鐢熸垚澶辫触");
+                    }
+                }
+
+                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));
+                if (waveDetl == null) {
+                    throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�");
+                }
+                waveDetl.setWorkQty(waveDetl.getWorkQty() + taskDetl.getAnfme());
+                waveDetl.setUpdateTime(new Date());
+                if (!waveDetlService.updateById(waveDetl)) {
+                    throw new CoolException("娉㈡鏁版嵁鏇存柊澶辫触");
+                }
+
+            }
+
+            //搴撲綅F => R
+            loc.setLocStsId(LocStsType.R.val());
+            loc.setUpdateTime(new Date());
+            boolean locUpdate = locService.updateById(loc);
+            if(!locUpdate){
+                throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�");
+            }
+
+        }
+
+        Wave wave = waveService.getById(waveId);
+        if (wave == null) {
+            throw new CoolException("娉㈡涓嶅瓨鍦�");
+        }
+
+        wave.setWaveStatus(WaveStatusType.GENERATE.id);
+        wave.setUpdateTime(new Date());
+        if (!waveService.updateById(wave)) {
+            throw new CoolException("娉㈡鏇存柊澶辫触");
+        }
+    }
+
+    @Transactional
+    public void generateWave(GenerateWaveParam param) {
+        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("璁㈠崟鍙傛暟涓嶈兘涓虹┖");
+        }
+
+        if (orderIds.isEmpty()) {
+            throw new CoolException("璁㈠崟鍙傛暟涓嶈兘涓虹┖");
         }
 
         List<Order> orderList = orderService.listByIds(orderIds);
@@ -756,26 +1011,77 @@
         Wave wave = new Wave();
         wave.setWaveNo(waveNo);
         wave.setWaveType(0);
+        wave.setWaveStatus(WaveStatusType.INIT.id);
         if (!waveService.save(wave)) {
             throw new CoolException("娉㈡鐢熸垚澶辫触");
         }
 
+        HashMap<String, List<OrderDetl>> map = new HashMap<>();
         for (Order order : orderList) {
-            WaveDetl waveDetl = new WaveDetl();
-            waveDetl.setWaveNo(waveNo);
-            waveDetl.setWaveId(wave.getId());
-            waveDetl.setOrderId(order.getId());
-            waveDetl.setOrderNo(order.getOrderNo());
-            if (!waveDetlService.save(waveDetl)) {
-                throw new CoolException("娉㈡鏄庣粏鐢熸垚澶辫触");
+            List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().eq(OrderDetl::getOrderId, order.getId()));
+            for (OrderDetl orderDetl : orderDetls) {
+                List<OrderDetl> list = map.get(orderDetl.getStockIndex());
+                if (list == null) {
+                    list = new ArrayList<>();
+                }
+                list.add(orderDetl);
+                map.put(orderDetl.getStockIndex(), list);
             }
 
+            order.setOrderSettle(OrderSettleType.WAVE.val());
             order.setWaveId(wave.getId());
             order.setWaveNo(waveNo);
+            order.setHasWave(1);
             order.setUpdateTime(new Date());
             if (!orderService.updateById(order)) {
                 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()) {
+            String stockIndex = entry.getKey();
+            List<OrderDetl> orderDetls = entry.getValue();
+            Double anfme = 0D;
+            Long matId = null;
+            String matnr = null;
+            String batch = null;
+            List<FieldParam> uniqueField = null;
+            for (OrderDetl orderDetl : orderDetls) {
+                anfme += orderDetl.getAnfme();
+                matId = orderDetl.getMatId();
+                matnr = orderDetl.getMat$().getMatnr();
+                batch = orderDetl.getBatch();
+                uniqueField = orderDetl.getUniqueField();
+            }
+
+            WaveDetl waveDetl = new WaveDetl();
+            waveDetl.setWaveNo(waveNo);
+            waveDetl.setWaveId(wave.getId());
+            waveDetl.setStockIndex(stockIndex);
+            waveDetl.setMatId(matId);
+            waveDetl.setMatnr(matnr);
+            waveDetl.setBatch(batch);
+            waveDetl.setAnfme(anfme);
+            waveDetl.setWorkQty(0D);
+            waveDetl.setFieldParams(JSON.toJSONString(uniqueField));
+            if (!waveDetlService.save(waveDetl)) {
+                throw new CoolException("娉㈡鏄庣粏鐢熸垚澶辫触");
+            }
+
         }
 
     }
@@ -798,11 +1104,34 @@
         for (Wave wave : waves) {
             List<WaveDetl> waveDetls = waveDetlService.list(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId()));
             for (WaveDetl waveDetl : waveDetls) {
-                Order order = orderService.getById(waveDetl.getOrderId());
-                order.setWaveId(null);
-                order.setWaveNo(null);
-                if (!orderService.updateById(order)) {
-                    throw new CoolException("璁㈠崟鍙嶅啓澶辫触");
+                long count = taskDetlService.count(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getWaveId, wave.getId()));
+                if (count > 0) {
+                    throw new CoolException("宸插瓨鍦ㄤ换鍔★紝绂佹鍙栨秷娉㈡");
+                }
+
+                List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, wave.getId()));
+                for (Order order : orders) {
+                    order.setWaveId(null);
+                    order.setWaveNo(null);
+                    order.setHasWave(0);
+                    if(order.getOrderSettle().equals(OrderSettleType.WAVE.val())){
+                        order.setOrderSettle(OrderSettleType.WAIT.val());
+                    }
+                    if (!orderService.updateById(order)) {
+                        throw new CoolException("璁㈠崟鍙嶅啓澶辫触");
+                    }
+
+                    CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, order.getId()));
+                    if (cacheSite == null) {
+                        throw new CoolException("缂撳瓨绔欎笉瀛樺湪");
+                    }
+                    cacheSite.setSiteStatus(CacheSiteStatusType.O.id);
+                    cacheSite.setOrderId(null);
+                    cacheSite.setOrderNo(null);
+                    cacheSite.setUpdateTime(new Date());
+                    if (!cacheSiteService.updateById(cacheSite)) {
+                        throw new CoolException("缂撳瓨绔欐竻绌哄け璐�");
+                    }
                 }
 
                 waveDetlService.removeById(waveDetl.getId());

--
Gitblit v1.9.1