From 83b504d7a369baa08b15c741c3b6daf71f6fa1f9 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期二, 07 一月 2025 14:25:25 +0800 Subject: [PATCH] #平库出库功能 --- zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java | 144 +++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 117 insertions(+), 27 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 e71501d..9d6abd4 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 @@ -14,11 +14,13 @@ 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.util.*; +import java.util.stream.Collectors; /** * 鍑哄簱绠$悊 @@ -66,7 +68,7 @@ /** * 鍑哄簱 */ - @Transactional + @Transactional(rollbackFor = Exception.class) public void out(OutParam outParam) { if (outParam.getOperationPort() == null) { throw new CoolException("浣滀笟鍙d笉瀛樺湪"); @@ -105,6 +107,11 @@ for (OutDetlDto detl : locDto.getDetls()) { LocDetl locDetl = locDetlService.getById(detl.getDetlId()); if(locDetl == null) { + throw new CoolException("鏄庣粏涓嶅瓨鍦�"); + } + + OrderDetl orderDetl = orderDetlService.getById(detl.getOrderDetlId()); + if (orderDetl == null) { throw new CoolException("鏄庣粏涓嶅瓨鍦�"); } @@ -147,7 +154,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,8 +161,39 @@ 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; } @@ -265,7 +302,7 @@ return previewDtos; } - @Transactional + @Transactional(rollbackFor = Exception.class) public void orderOutBatch(List<OrderOutBatchPreviewDto> param) { if (param == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -504,6 +541,46 @@ sortParams.add(sortParam); List<MergePreviewResultDto> resultDtos = new ArrayList<>(); + + param.forEach(pars -> { + List<MergePreviewResultLocDto> locDtos = new ArrayList<>(); + 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.setLocDetlId(detl.getId()); + + locDtos.add(locDto); + //搴撲綅瀹為檯鍙敤鏁伴噺 + double surplusQty = detl.getAnfme() - detl.getWorkQty(); + //娉㈡鏁伴噺鍑忓幓搴撲綅鍙敤鏁伴噺鍚庯紝鐩堜綑鏁伴噺 +// double workQty = anfme - surplusQty; + anfme = anfme - surplusQty; + if (anfme > 0) { + locDto.setAnfme(detl.getAnfme()); + locDto.setWorkQty(surplusQty); + } else { + locDto.setAnfme(anfme); + locDto.setWorkQty(anfme); + break; + } + } + + pars.setWorkQty(pars.getAnfme() - pars.getWorkQty() - anfme); + } + }); + for (MergePreviewDto dto : param) { List<LocDetl> locDetls = locDetlService.queryStock(dto.getMatnr(), dto.getBatch(), dto.getFieldParams(), sortParams); if(locDetls.isEmpty()){ @@ -520,10 +597,9 @@ MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); - resultDto.setLocs(locDtos); resultDto.setOrderIds(dto.getOrderIds()); - Double anfme = dto.getAnfme(); + resultDto.setLocs(locDtos); for (LocDetl locDetl : locDetls) { Loc loc = locService.getById(locDetl.getLocId()); if (loc == null) { @@ -576,7 +652,18 @@ return resultDtos; } - @Transactional + /** + * 娉㈡鐢熸垚鍑哄簱浠诲姟 + * UTC鍑哄簱浠诲姟閫昏緫涓嶅彉锛屾坊鍔犲钩搴撳垽鍒�昏緫 + * 1. 鑾峰彇娉㈡璁㈠崟鏄庣粏锛屽垽鍒槸鍚︿负骞冲簱璁㈠崟 + * 2. 骞冲簱璁㈠崟鐢熸垚鎷h揣鍗曪紝 UTC璁㈠崟鐢熸垚鍑哄簱浠诲姟 + * 3. 骞冲簱鍗曟嵁鏄庣粏鎵�鍗犲簱浣嶇墿鏂欐暟閲忓姞閿� + * 4. 鐢熸垚鍑哄簱鍗昉DA绔紝缁熶竴鍑哄簱鎵e噺搴撳瓨 + * 5. 鐢熸垚鎷h揣鍗曞巻鍙叉。锛屽嚭搴撳崟鎹姞鍏ュ巻鍙叉。锛屽垹闄ゅ師鍗曟嵁 + * 6. 鍒犻櫎娉㈡鍒楄〃鏁版嵁 + * @param dto + */ + @Transactional(rollbackFor = Exception.class) public void orderOutMerge(OrderOutMergeParamDto dto) { if(dto == null){ throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -778,7 +865,7 @@ } - @Transactional + @Transactional(rollbackFor = Exception.class) public void orderOutMergeWave(OrderOutMergeParamDto dto) { if(dto == null){ throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -788,31 +875,31 @@ throw new CoolException("鏈敓鎴愭尝娆�"); } + Wave wave = waveService.getById(dto.getWaveId()); + if (Objects.isNull(wave)) { + 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); + params.forEach(action -> { + if (action.getLocId() != null) { + filterParamsList.add(action.getLocId()); + filterParams.add(action); } - } + }); 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)); + WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); if(waveDetl == null){ throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�"); } @@ -910,7 +997,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)) { @@ -929,8 +1017,11 @@ } } + + //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::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); +// WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getWaveId, wave.getId()), false); if (waveDetl == null) { throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�"); } @@ -939,8 +1030,8 @@ if (!waveDetlService.updateById(waveDetl)) { throw new CoolException("娉㈡鏁版嵁鏇存柊澶辫触"); } - } + //搴撲綅F => R loc.setLocStsId(LocStsType.R.val()); @@ -949,13 +1040,12 @@ if(!locUpdate){ throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } - } - Wave wave = waveService.getById(waveId); - if (wave == null) { - throw new CoolException("娉㈡涓嶅瓨鍦�"); - } +// Wave wave = waveService.getById(dto.getWaveId()); +// if (wave == null) { +// throw new CoolException("娉㈡涓嶅瓨鍦�"); +// } wave.setWaveStatus(WaveStatusType.GENERATE.id); wave.setUpdateTime(new Date()); @@ -964,7 +1054,7 @@ } } - @Transactional + @Transactional(rollbackFor = Exception.class) public void generateWave(GenerateWaveParam param) { if (param == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); -- Gitblit v1.9.1