From 053e6028bd20e599aea103401137816c6296a9ef Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期五, 20 九月 2024 09:26:49 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java |  408 +++++++++++++++++++++++++++++++++++++++++++++++----------
 1 files changed, 335 insertions(+), 73 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 d6be710..34c43e9 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
@@ -7,6 +7,8 @@
 import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto;
 import com.zy.asrs.wms.asrs.entity.enums.CacheSiteStatusType;
 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.enums.WaveStatusType;
 import com.zy.asrs.wms.asrs.entity.param.*;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.service.*;
@@ -112,6 +114,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);
@@ -389,6 +392,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());
@@ -506,6 +510,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;
             }
 
@@ -518,6 +528,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());
@@ -531,7 +550,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);
         }
@@ -704,6 +744,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());
@@ -738,73 +779,220 @@
 
         }
 
-        if (dto.getWaveId() != null) {
-            HashMap<Long, List<TaskDetl>> orderMap = new HashMap<>();
-            for (TaskDetl taskDetl : taskDetls) {
-                Long orderId = taskDetl.getOrderId();
-
-                List<TaskDetl> list = orderMap.get(orderId);
-                if (list == null) {
-                    list = new ArrayList<>();
-                }
-
-                list.add(taskDetl);
-                orderMap.put(orderId, list);
-            }
-
-            for (Map.Entry<Long, List<TaskDetl>> entry : orderMap.entrySet()) {
-                List<TaskDetl> list = entry.getValue();
-
-                List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id));
-                if (cacheSites.isEmpty()) {
-                    throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�");
-                }
-                CacheSite cacheSite = cacheSites.get(0);
-
-                Long orderId = null;
-                String orderNo = null;
-                for (TaskDetl taskDetl : list) {
-                    orderId = taskDetl.getOrderId();
-                    orderNo = taskDetl.getOrderNo();
-                    Long orderDetlId = taskDetl.getDetlId();
-
-                    WaveSeed waveSeed = new WaveSeed();
-                    waveSeed.setSiteId(cacheSite.getId());
-                    waveSeed.setSiteNo(cacheSite.getSiteNo());
-                    waveSeed.setOrderDetlId(orderDetlId);
-                    waveSeed.setTaskDetlId(taskDetl.getId());
-                    waveSeed.setAnfme(taskDetl.getAnfme());
-                    waveSeed.setWorkQty(0D);
-                    if (!waveSeedService.save(waveSeed)) {
-                        throw new CoolException("娉㈡鎾鍒涘缓澶辫触");
-                    }
-                }
-
-                if(orderId == null){
-                    continue;
-                }
-
-                cacheSite.setOrderId(orderId);
-                cacheSite.setOrderNo(orderNo);
-                cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
-                cacheSite.setUpdateTime(new Date());
-                if (!cacheSiteService.updateById(cacheSite)) {
-                    throw new CoolException("缂撳瓨绔欐洿鏂板け璐�");
-                }
-
-            }
-        }
-
     }
 
     @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);
+        }
+
+        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(101L);
+            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);
@@ -822,26 +1010,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("娉㈡鏄庣粏鐢熸垚澶辫触");
+            }
+
         }
 
     }
@@ -864,11 +1103,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