From 83b51a5a0774ea8ecb9a06304af3b956a21307c8 Mon Sep 17 00:00:00 2001 From: pjb <123456> Date: 星期六, 08 三月 2025 09:06:55 +0800 Subject: [PATCH] CUT库条码T开头,截取后10位 --- zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java | 520 +++++++++++++++++++++++++++++++++++++++++++++------------ 1 files changed, 412 insertions(+), 108 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 812eb3f..b1d6fe3 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,7 +1,10 @@ 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.fasterxml.jackson.datatype.jsr310.DecimalUtils; +import com.mysql.cj.util.StringUtils; import com.zy.asrs.framework.exception.CoolException; import com.zy.asrs.wms.asrs.entity.dto.*; import com.zy.asrs.wms.asrs.entity.dto.OrderOutMergeDto; @@ -14,11 +17,17 @@ 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.DecimalFormat; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.Stream; /** * 鍑哄簱绠$悊 @@ -62,11 +71,17 @@ private CacheSiteService cacheSiteService; @Autowired private WaveSeedService waveSeedService; + @Autowired + private PickSheetService pickSheetService; + @Autowired + private PickSheetDetlService pickSheetDetlService; + @Autowired + private MatService matService; /** * 鍑哄簱 */ - @Transactional + @Transactional(rollbackFor = Exception.class) public void out(OutParam outParam) { if (outParam.getOperationPort() == null) { throw new CoolException("浣滀笟鍙d笉瀛樺湪"); @@ -81,7 +96,7 @@ long taskType = locDto.getAll() ? 101L : 103L; Loc loc = locService.getById(locDto.getLocId()); - if(loc == null) { + if (loc == null) { throw new CoolException("搴撲綅涓嶅瓨鍦�"); } @@ -104,7 +119,7 @@ // 宸ヤ綔妗f槑缁嗕繚瀛� for (OutDetlDto detl : locDto.getDetls()) { LocDetl locDetl = locDetlService.getById(detl.getDetlId()); - if(locDetl == null) { + if (locDetl == null) { throw new CoolException("鏄庣粏涓嶅瓨鍦�"); } @@ -131,7 +146,7 @@ taskDetlField.sync(locDetlField); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -141,7 +156,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } } @@ -152,7 +167,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("璁㈠崟鏄庣粏涓嶅瓨鍦�"); @@ -160,11 +174,44 @@ 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; } + 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) { @@ -176,7 +223,7 @@ outDetlDto.setOrderDetlId(orderDetl.getId()); detlDtos.add(outDetlDto); issued = issued - outDetlDto.getAnfme(); - }else { + } else { break; } } @@ -189,7 +236,7 @@ if (dtos == null) { dtos = new ArrayList<>(); dtos.add(detlDto); - }else { + } else { dtos.add(detlDto); } map.put(locDetl.getLocId(), dtos); @@ -270,7 +317,7 @@ return previewDtos; } - @Transactional + @Transactional(rollbackFor = Exception.class) public void orderOutBatch(List<OrderOutBatchPreviewDto> param) { if (param == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -298,11 +345,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); @@ -330,11 +377,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); @@ -380,12 +427,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()); @@ -411,7 +458,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -421,7 +468,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } @@ -446,7 +493,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); @@ -459,7 +506,7 @@ Double anfme = locDetlStockMap.get(matUniqueKey); anfme += issued; locDetlStockMap.put(matUniqueKey, anfme); - }else { + } else { locDetlStockMap.put(matUniqueKey, issued); } } @@ -485,11 +532,10 @@ mergePreviewDtos.add(dto); } - return mergePreviewDtos; } - @Transactional + @Transactional(rollbackFor = Exception.class) public List<MergePreviewResultDto> orderOutMergeLocPreview(List<MergePreviewDto> param) { if (param == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -504,17 +550,96 @@ dto.setFieldParams(fieldParams); } - FieldSortParam sortParam = new FieldSortParam("anfme","desc"); + FieldSortParam sortParam = new FieldSortParam("anfme", "desc"); List<FieldSortParam> sortParams = new ArrayList<>(); sortParams.add(sortParam); List<MergePreviewResultDto> resultDtos = new ArrayList<>(); + //浼樺厛鏌ヨ骞冲簱鏁版嵁 + param.forEach(pars -> { + if (pars.getStatus() == 1) { + return; + } + List<MergePreviewResultLocDto> locDtos = new ArrayList<>(); + MergePreviewResultDto resultDto = new MergePreviewResultDto(); + resultDto.sync(pars); + resultDto.setOrderIds(pars.getOrderIds()); + //鎬婚渶姹傛暟閲� + resultDto.setAnfme(pars.getAnfme()); + resultDto.setLocs(locDtos); + //鏌ヨ骞冲簱涓鍚堟潯浠剁殑搴撳瓨 + 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.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id); + locDto.setLocDetlId(detl.getId()); + locDto.setAnfme(detl.getAnfme()); + locDto.setWorkQty(detl.getWorkQty()); + locDtos.add(locDto); + //搴撲綅瀹為檯鍙敤鏁伴噺 + double surplusQty = detl.getAnfme() - detl.getWorkQty(); + if (surplusQty <= 0) { + continue; + } + //娉㈡鏁伴噺鍑忓幓搴撲綅鍙敤鏁伴噺鍚庯紝鐩堜綑鏁伴噺 + anfme = anfme - surplusQty; + if (anfme > 0) { + //褰撳墠鍙娇鐢ㄦ暟閲� + resultDto.setFetchQty(surplusQty); + //浣欎笅闇�姹傛暟閲� + pars.setStatus(2); + pars.setWorkQty(pars.getWorkQty() + surplusQty); + pars.setAnfme(anfme); + } else { + //褰撳墠浣跨敤鏁伴噺 + resultDto.setFetchQty(pars.getAnfme()); + //浣欎笅闇�姹� + pars.setWorkQty(pars.getWorkQty() + pars.getAnfme()); + pars.setStatus(1); + pars.setAnfme(0.0); + break; + } + } + + if (!Objects.isNull(resultDto.getFetchQty()) && !(new BigDecimal(resultDto.getFetchQty()).compareTo(new BigDecimal("0.00")) == 0)) { + resultDto.setOtherLocs(new ArrayList<>()); + + resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.desc); + + resultDtos.add(resultDto); + } + } + }); + + //骞冲簱鏌ヨ瀹屾垚鍚庯紝鍐嶆煡璇CU for (MergePreviewDto dto : param) { + //鍗曟嵁宸插畬鎴愶紝璺冲嚭 + if (dto.getStatus() == 1) { + continue; + } +// Double anfme = dto.getAnfme() - dto.getWorkQty(); +// //鍑忓幓骞冲簱鏁伴噺鍚庯紝灏忎簬绛変簬0锛岃烦鍑哄鐞� +// 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<>()); + resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_UTC.desc); resultDto.setOrderIds(dto.getOrderIds()); resultDto.setAnfme(dto.getAnfme()); resultDtos.add(resultDto); @@ -525,10 +650,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) { @@ -543,7 +667,7 @@ locDto.setLocId(locDetl.getLocId()); locDto.setLocNo(locDetl.getLocNo()); locDto.setLocDetlId(locDetl.getId()); - + locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_UTC.id); locDtos.add(locDto); if (anfme - locDetl.getAnfme() < 0) { locDto.setAnfme(anfme); @@ -567,6 +691,7 @@ MergePreviewResultLocDto locDto = new MergePreviewResultLocDto(); locDto.setLocId(locDetl.getLocId()); locDto.setLocNo(locDetl.getLocNo()); + locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_UTC.id); locDto.setLocDetlId(locDetl.getId()); locDto.setAnfme(locDetl.getAnfme()); otherLocDtos.add(locDto); @@ -575,15 +700,17 @@ resultDto.setAnfme(dto.getAnfme()); + resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_UTC.desc); + resultDtos.add(resultDto); } return resultDtos; } - @Transactional + @Transactional(rollbackFor = Exception.class) public void orderOutMerge(OrderOutMergeParamDto dto) { - if(dto == null){ + if (dto == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); } @@ -633,7 +760,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); @@ -667,7 +794,7 @@ orderOutMergeDto.setAnfme(issued); updateWorkQty = issued; requireAnfme -= issued; - }else { + } else { orderOutMergeDto.setAnfme(requireAnfme); updateWorkQty = requireAnfme; requireAnfme -= requireAnfme; @@ -687,7 +814,7 @@ List<OrderOutMergeDto> list = null; if (map.containsKey(orderOutMergeDto.getLocId())) { list = map.get(orderOutMergeDto.getLocId()); - }else { + } else { list = new ArrayList<>(); } list.add(orderOutMergeDto); @@ -733,12 +860,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("璁㈠崟鏄庣粏涓嶅瓨鍦�"); } @@ -763,7 +890,7 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } @@ -775,7 +902,7 @@ loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } @@ -783,9 +910,22 @@ } + + /** + * 娉㈡鐢熸垚鍑哄簱浠诲姟 + * UTC鍑哄簱浠诲姟閫昏緫涓嶅彉锛屾坊鍔犲钩搴撳垽鍒�昏緫 + * 1. 鑾峰彇娉㈡璁㈠崟鏄庣粏锛屽垽鍒槸鍚︿负骞冲簱璁㈠崟 + * 2. 骞冲簱璁㈠崟鐢熸垚鎷h揣鍗曪紝 UTC璁㈠崟鐢熸垚鍑哄簱浠诲姟 + * 3. 骞冲簱鍗曟嵁鏄庣粏鎵�鍗犲簱浣嶇墿鏂欐暟閲忓姞閿� + * 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("鍙傛暟涓嶈兘涓虹┖"); } @@ -793,68 +933,82 @@ throw new CoolException("鏈敓鎴愭尝娆�"); } - List<OrderOutMergeParam> params = dto.getList(); - - if (params.isEmpty()) { - throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); + Wave wave = waveService.getById(dto.getWaveId()); + if (Objects.isNull(wave)) { + throw new CoolException("娉㈡涓嶅瓨鍦�"); } - Long waveId = dto.getWaveId(); + /** + * 娉㈡鍚堝苟鍑哄簱 + * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴� + * 2. 骞冲簱鐢熸垚鎷h揣鍗� + * 3. TCU搴撶敓鎴愪换鍔″崟 + */ + outStockByArea(dto, wave); - List<Long> filterParamsList = new ArrayList<>(); - List<OrderOutMergeParam> filterParams = new ArrayList<>(); + //娉㈡鐘舵�佷慨鏀逛负--鐢熸垚浠诲姟 + wave.setWaveStatus(WaveStatusType.GENERATE.id); + wave.setUpdateTime(new Date()); + if (!waveService.updateById(wave)) { + throw new CoolException("娉㈡鏇存柊澶辫触"); + } + } - params.forEach(action -> { - if (action.getLocId() != null) { - filterParamsList.add(action.getLocId()); - filterParams.add(action); - } - }); - + /** + * 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 : filterParams) { + 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, waveId)); - if(waveDetl == null){ + WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); + 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); } } HashMap<Long, List<OrderOutMergeDto>> map = new HashMap<>(); - for (OrderOutMergeParam param : filterParams) { + 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); } @@ -863,9 +1017,64 @@ throw new CoolException("搴撳瓨涓嶈冻"); } + return map; + } + + /** + * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷h揣鍗曟垨CTU浠诲姟妗� + * + * @param dto + * @param wave + */ + private void outStockByArea(OrderOutMergeParamDto dto, Wave wave) { + List<OrderOutMergeParam> params = dto.getList(); + if (params.isEmpty()) { + throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); + } + + //骞冲簱鏁版嵁婧� + List<OrderOutMergeParam> flatOrders = new ArrayList<>();// listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_FLAT); + //CTU鏁版嵁婧� + List<OrderOutMergeParam> tucOrders = new ArrayList<>();//listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_UTC); + //鎸夊簱浣嶇被鍨嬪垎绫� + List<OrderOutMergeParam> mergeParam = params.stream().filter(par -> { + return !StringUtils.isNullOrEmpty(par.getLocNo()); + }).collect(Collectors.toList()); + //鏁版嵁鍒嗙被 1.骞冲簱鏁版嵁 2. CTU鏁版嵁 + Map<Long, List<OrderOutMergeParam>> listMap = mergeParam.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getTypeId)); + + listMap.keySet().forEach(key -> { + if (key == LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id) { + flatOrders.addAll(listMap.get(key)); + } else { + tucOrders.addAll(listMap.get(key)); + } + }); + if (!flatOrders.isEmpty()) { + //骞冲簱鍑哄簱 + outStockByFlat(flatOrders, wave); + } + + if (!tucOrders.isEmpty()) { + //CTU鍑哄簱 + outStockByTUC(tucOrders, wave); + } + + } + + /** + * CTU鍑哄簱--鐢熸垚鍑哄簱浠诲姟妗� + * + * @param tucOrders + * @param wave + */ + private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) { + Map<Long, List<OrderOutMergeDto>> map = checkLoc(tucOrders, wave); + 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(); @@ -883,7 +1092,7 @@ if (operationPort == null) { throw new CoolException("浣滀笟鍙d笉瀛樺湪"); } - + //101 鍏ㄦ嫋鍑哄簱 103 鎷h揣鍑哄簱 long taskType = all ? 101L : 103L; Task task = new Task(); @@ -901,7 +1110,7 @@ for (OrderOutMergeDto merge : list) { LocDetl locDetl = locDetlService.getById(merge.getLocDetlId()); - if(locDetl == null) { + if (locDetl == null) { throw new CoolException("鏄庣粏涓嶅瓨鍦�"); } @@ -912,7 +1121,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)) { @@ -926,16 +1136,13 @@ taskDetlField.setId(null); taskDetlField.setDetlId(taskDetl.getId()); boolean taskDetlFieldSave = taskDetlFieldService.save(taskDetlField); - if(!taskDetlFieldSave){ + if (!taskDetlFieldSave) { throw new CoolException("鏄庣粏鎵╁睍鐢熸垚澶辫触"); } } - - //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::getWaveId, waveId), false); + WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); if (waveDetl == null) { throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�"); } @@ -946,32 +1153,121 @@ } } - //搴撳瓨鏇存柊閫昏緫 - List<Long> orderIds = dto.getList().stream().findFirst().get().getOrderIds(); - List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>().in(OrderDetl::getOrderId, orderIds)); - orderDetls.forEach(orderDetl -> { - orderUtils.updateWorkQty(orderDetl.getId(), orderDetl.getAnfme()); - }); + List<Order> orders = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveNo, wave.getWaveNo())); + if (orders.isEmpty()) { + throw new CoolException("褰撳墠娉㈡璁㈠崟涓嶅瓨鍦紒锛�"); + } + + List<CacheSite> cacheSites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getSiteStatus, CacheSiteStatusType.O.id).orderByAsc(CacheSite::getChannel)); + + if (cacheSites.isEmpty()) { + 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.setUpdateTime(new Date()); + if (!cacheSiteService.updateById(cacheSite)) { + throw new CoolException("缂撳瓨绔欐洿鏂板け璐�"); + } + } //搴撲綅F => R loc.setLocStsId(LocStsType.R.val()); loc.setUpdateTime(new Date()); boolean locUpdate = locService.updateById(loc); - if(!locUpdate){ + if (!locUpdate) { throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); } } + } - Wave wave = waveService.getById(waveId); - if (wave == null) { - throw new CoolException("娉㈡涓嶅瓨鍦�"); + /** + * 骞冲簱鍑哄簱--鐢熸垚鍑哄簱鎷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揣鍗曞啓鍏ュけ璐ワ紒锛�"); } - wave.setWaveStatus(WaveStatusType.GENERATE.id); - wave.setUpdateTime(new Date()); - if (!waveService.updateById(wave)) { - throw new CoolException("娉㈡鏇存柊澶辫触"); - } + //鏍规嵁搴撲綅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()); + + if (!locDetlService.updateById(locDetl)) { + throw new CoolException("搴撳瓨鍔犻攣澶辫触锛侊紒"); + } + + }); + + }); + + } + + /** + * 鐢熸垚鎷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) @@ -989,12 +1285,12 @@ 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 + "閫氶亾宸茬粡鍒嗛厤娉㈡"); - } - } +// 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(); @@ -1047,19 +1343,19 @@ 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("缂撳瓨绔欐洿鏂板け璐�"); - } +// 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()) { @@ -1096,7 +1392,7 @@ } - @Transactional + @Transactional(rollbackFor = Exception.class) public void cancelWave(List<Long> waveIds) { if (waveIds == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -1119,12 +1415,20 @@ throw new CoolException("宸插瓨鍦ㄤ换鍔★紝绂佹鍙栨秷娉㈡"); } + List<PickSheet> pickSheets = pickSheetService.list(new LambdaQueryWrapper<PickSheet>() + .eq(PickSheet::getWaveNo, wave.getWaveNo()) + .eq(PickSheet::getDeleted, 0) + .eq(PickSheet::getStatus, 1)); + if (!pickSheets.isEmpty()) { + 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())){ + if (order.getOrderSettle().equals(OrderSettleType.WAVE.val())) { order.setOrderSettle(OrderSettleType.WAIT.val()); } if (!orderService.updateById(order)) { -- Gitblit v1.9.1