From d1511d2d12b4223882fcfdabd3ba6b59c038edc4 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期三, 08 一月 2025 21:29:46 +0800 Subject: [PATCH] #拣货单功能开发 --- zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java | 192 +++++++++++++++++++++++++++++++++++------------ 1 files changed, 141 insertions(+), 51 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 8d3b95f..6a4b7d9 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,6 +1,7 @@ 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.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.dto.*; @@ -14,10 +15,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.math.BigDecimal; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -63,6 +67,12 @@ private CacheSiteService cacheSiteService; @Autowired private WaveSeedService waveSeedService; + @Autowired + private PickSheetService pickSheetService; + @Autowired + private PickSheetDetlService pickSheetDetlService; + @Autowired + private MatService matService; /** * 鍑哄簱 @@ -82,7 +92,7 @@ long taskType = locDto.getAll() ? 101L : 103L; Loc loc = locService.getById(locDto.getLocId()); - if(loc == null) { + if (loc == null) { throw new CoolException("搴撲綅涓嶅瓨鍦�"); } @@ -105,7 +115,7 @@ // 宸ヤ綔妗f槑缁嗕繚瀛� for (OutDetlDto detl : locDto.getDetls()) { LocDetl locDetl = locDetlService.getById(detl.getDetlId()); - if(locDetl == null) { + if (locDetl == null) { throw new CoolException("鏄庣粏涓嶅瓨鍦�"); } @@ -132,7 +142,7 @@ taskDetlField.sync(locDetlField); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -142,7 +152,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } } @@ -195,7 +205,9 @@ //鑾峰彇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) { @@ -207,7 +219,7 @@ outDetlDto.setOrderDetlId(orderDetl.getId()); detlDtos.add(outDetlDto); issued = issued - outDetlDto.getAnfme(); - }else { + } else { break; } } @@ -220,7 +232,7 @@ if (dtos == null) { dtos = new ArrayList<>(); dtos.add(detlDto); - }else { + } else { dtos.add(detlDto); } map.put(locDetl.getLocId(), dtos); @@ -329,11 +341,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); @@ -361,11 +373,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); @@ -411,12 +423,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()); @@ -442,7 +454,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -452,7 +464,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } @@ -477,7 +489,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); @@ -490,7 +502,7 @@ Double anfme = locDetlStockMap.get(matUniqueKey); anfme += issued; locDetlStockMap.put(matUniqueKey, anfme); - }else { + } else { locDetlStockMap.put(matUniqueKey, issued); } } @@ -534,7 +546,7 @@ dto.setFieldParams(fieldParams); } - FieldSortParam sortParam = new FieldSortParam("anfme","desc"); + FieldSortParam sortParam = new FieldSortParam("anfme", "desc"); List<FieldSortParam> sortParams = new ArrayList<>(); sortParams.add(sortParam); @@ -600,9 +612,11 @@ for (MergePreviewDto dto : param) { Double anfme = dto.getAnfme() - dto.getWorkQty(); //鍑忓幓骞冲簱鏁伴噺鍚庯紝灏忎簬绛変簬0锛岃烦鍑哄鐞� - if (anfme <= 0) {continue;} + 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<>()); @@ -673,7 +687,7 @@ @Transactional(rollbackFor = Exception.class) public void orderOutMerge(OrderOutMergeParamDto dto) { - if(dto == null){ + if (dto == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); } @@ -723,7 +737,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); @@ -757,7 +771,7 @@ orderOutMergeDto.setAnfme(issued); updateWorkQty = issued; requireAnfme -= issued; - }else { + } else { orderOutMergeDto.setAnfme(requireAnfme); updateWorkQty = requireAnfme; requireAnfme -= requireAnfme; @@ -777,7 +791,7 @@ List<OrderOutMergeDto> list = null; if (map.containsKey(orderOutMergeDto.getLocId())) { list = map.get(orderOutMergeDto.getLocId()); - }else { + } else { list = new ArrayList<>(); } list.add(orderOutMergeDto); @@ -823,12 +837,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("璁㈠崟鏄庣粏涓嶅瓨鍦�"); } @@ -853,7 +867,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -865,7 +879,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } @@ -883,11 +897,12 @@ * 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("鍙傛暟涓嶈兘涓虹┖"); } @@ -903,7 +918,6 @@ /** * 娉㈡鍚堝苟鍑哄簱 * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴� - * 2. 鏍规嵁鍗曞簱鍗曟嵁绫诲瀷 * 2. 骞冲簱鐢熸垚鎷h揣鍗� * 3. TCU搴撶敓鎴愪换鍔″崟 */ @@ -917,17 +931,25 @@ } } - private Map<Long, List<OrderOutMergeDto>> checkLoc(List<OrderOutMergeParam> mergeParams, Wave wave) { + /** + * 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 : 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, wave.getId())); - if(waveDetl == null){ + 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); } } @@ -935,33 +957,35 @@ HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>(); 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); } @@ -975,6 +999,7 @@ /** * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷e崟鍙奣UC浠诲姟妗� + * * @param dto * @param wave */ @@ -999,12 +1024,12 @@ tucOrders.addAll(listMap.get(key)); } }); - if (flatOrders.isEmpty()) { + if (!flatOrders.isEmpty()) { //骞冲簱鍑哄簱 outStockByFlat(flatOrders, wave); } - if (tucOrders.isEmpty()) { + if (!tucOrders.isEmpty()) { //TUC鍑哄簱 outStockByTUC(tucOrders, wave); } @@ -1018,12 +1043,15 @@ * @param tucOrders * @param wave */ - private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) { - Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave); - + private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {//123 + Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave); + if (!Objects.isNull(map)) { + return; + } 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(); @@ -1041,7 +1069,7 @@ if (operationPort == null) { throw new CoolException("浣滀笟鍙d笉瀛樺湪"); } - + //101 鍏ㄦ嫋鍑哄簱 103 鎷h揣鍑哄簱 long taskType = all ? 101L : 103L; Task task = new Task(); @@ -1059,7 +1087,7 @@ for (OrderOutMergeDto merge : list) { LocDetl locDetl = locDetlService.getById(merge.getLocDetlId()); - if(locDetl == null) { + if (locDetl == null) { throw new CoolException("鏄庣粏涓嶅瓨鍦�"); } @@ -1085,7 +1113,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -1106,7 +1134,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } } @@ -1114,18 +1142,80 @@ /** * 骞冲簱鍑哄簱--鐢熸垚鍑哄簱鎷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揣鍗曞啓鍏ュけ璐ワ紒锛�"); + } + //鏍规嵁搴撲綅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()); + }); + + }); } + /** + * 鐢熸垚鎷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) public void generateWave(GenerateWaveParam param) { @@ -1277,7 +1367,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