From e046dba174365eb8934ee1e4206f09821145e876 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 21 八月 2025 13:23:22 +0800 Subject: [PATCH] no message --- zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/manage/OutManage.java | 453 +++++++++++++++++++++++++++++++++++++++++++++---------- 1 files changed, 366 insertions(+), 87 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 6a4b7d9..c1aacdc 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,14 +1,16 @@ package com.zy.asrs.wms.asrs.manage; import com.alibaba.fastjson.JSON; -import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.mysql.cj.util.StringUtils; +import com.zy.asrs.wms.asrs.entity.param.StockOutParam; import com.zy.asrs.framework.exception.CoolException; +import com.zy.asrs.wms.asrs.entity.*; import com.zy.asrs.wms.asrs.entity.dto.*; -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.*; import com.zy.asrs.wms.utils.OrderUtils; import com.zy.asrs.wms.utils.OutUtils; @@ -531,6 +533,12 @@ return mergePreviewDtos; } + /** + * 娉㈡鍑哄簱棰勮 + * + * @param param + * @return + */ @Transactional(rollbackFor = Exception.class) public List<MergePreviewResultDto> orderOutMergeLocPreview(List<MergePreviewDto> param) { if (param == null) { @@ -551,17 +559,22 @@ 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(); + Double anfme = pars.getAnfme() - pars.getWorkQty(); for (LocDetl detl : locs) { Loc loc = locService.getById(detl.getLocId()); if (loc == null) { @@ -576,50 +589,61 @@ locDto.setLocNo(detl.getLocNo()); locDto.setTypeId(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id); locDto.setLocDetlId(detl.getId()); - + locDto.setAnfme(detl.getAnfme() - detl.getWorkQty()); + locDto.setWorkQty(detl.getWorkQty()); locDtos.add(locDto); //搴撲綅瀹為檯鍙敤鏁伴噺 - double surplusQty = detl.getAnfme() - detl.getWorkQty(); + Double surplusQty = Math.round((detl.getAnfme() - detl.getWorkQty()) * 10000) / 10000.0; + if (surplusQty <= 0) { + continue; + } //娉㈡鏁伴噺鍑忓幓搴撲綅鍙敤鏁伴噺鍚庯紝鐩堜綑鏁伴噺 - anfme = anfme - surplusQty; - if (anfme > 0) { - locDto.setAnfme(detl.getAnfme()); - locDto.setWorkQty(surplusQty); + anfme = Math.round((anfme - surplusQty) * 10000) / 10000.0; + if (anfme.compareTo(0.0) > 0) { + //褰撳墠鍙娇鐢ㄦ暟閲� + resultDto.setFetchQty(surplusQty); + //浣欎笅闇�姹傛暟閲� + pars.setStatus(2); + pars.setWorkQty(pars.getWorkQty() + surplusQty); + pars.setAnfme(anfme); } else { - locDto.setAnfme(pars.getAnfme() - pars.getWorkQty()); - locDto.setWorkQty(pars.getAnfme() - pars.getWorkQty()); + //褰撳墠浣跨敤鏁伴噺 + resultDto.setFetchQty(pars.getAnfme()); + //浣欎笅闇�姹� + pars.setWorkQty(pars.getWorkQty() + pars.getAnfme()); + pars.setStatus(1); + pars.setAnfme(0.0); break; } } - //淇濆瓨鍑哄簱鏁伴噺锛堝钩搴擄級 - pars.setWorkQty(pars.getAnfme() - pars.getWorkQty() - anfme); - resultDto.setOtherLocs(new ArrayList<>()); + if (!Objects.isNull(resultDto.getFetchQty()) && !(new BigDecimal(resultDto.getFetchQty()).compareTo(new BigDecimal("0.00")) == 0)) { + resultDto.setOtherLocs(new ArrayList<>()); - resultDto.setAnfme(pars.getAnfme()); + resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_FLAT.desc); - resultDtos.add(resultDto); - - } else { - resultDto.sync(pars); - resultDto.setLocs(new ArrayList<>()); - resultDto.setOrderIds(pars.getOrderIds()); - resultDto.setAnfme(pars.getAnfme()); - resultDtos.add(resultDto); + resultDtos.add(resultDto); + } } }); + //骞冲簱鏌ヨ瀹屾垚鍚庯紝鍐嶆煡璇CU for (MergePreviewDto dto : param) { - Double anfme = dto.getAnfme() - dto.getWorkQty(); - //鍑忓幓骞冲簱鏁伴噺鍚庯紝灏忎簬绛変簬0锛岃烦鍑哄鐞� - if (anfme <= 0) { + //鍗曟嵁宸插畬鎴愶紝璺冲嚭 + 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()) { 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); @@ -631,7 +655,7 @@ MergePreviewResultDto resultDto = new MergePreviewResultDto(); resultDto.sync(dto); resultDto.setOrderIds(dto.getOrderIds()); -// Double anfme = dto.getAnfme(); + Double anfme = dto.getAnfme(); resultDto.setLocs(locDtos); for (LocDetl locDetl : locDetls) { Loc loc = locService.getById(locDetl.getLocId()); @@ -647,7 +671,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); @@ -671,6 +695,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); @@ -678,6 +703,8 @@ resultDto.setOtherLocs(otherLocDtos); resultDto.setAnfme(dto.getAnfme()); + + resultDto.setType(LocAreaTypeSts.LOC_AREA_TYPE_UTC.desc); resultDtos.add(resultDto); } @@ -917,9 +944,9 @@ /** * 娉㈡鍚堝苟鍑哄簱 - * 1. 鍒ゆ柇鏄钩搴撹繕TCU搴� + * 1. 鍒ゆ柇鏄钩搴撹繕CTU搴� * 2. 骞冲簱鐢熸垚鎷h揣鍗� - * 3. TCU搴撶敓鎴愪换鍔″崟 + * 3. CTU搴撶敓鎴愪换鍔″崟 */ outStockByArea(dto, wave); @@ -998,12 +1025,13 @@ } /** - * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷e崟鍙奣UC浠诲姟妗� + * 鏍规嵁涓嶅悓搴撲綅绫诲瀷鐢熸垚鍑哄簱鎷h揣鍗曟垨CTU浠诲姟妗� * * @param dto - * @param wave + * @param */ - private void outStockByArea(OrderOutMergeParamDto dto, Wave wave) { + @Transactional(rollbackFor = Exception.class) + public void outStockByArea(OrderOutMergeParamDto dto, Wave wave) { List<OrderOutMergeParam> params = dto.getList(); if (params.isEmpty()) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -1011,12 +1039,15 @@ //骞冲簱鏁版嵁婧� List<OrderOutMergeParam> flatOrders = new ArrayList<>();// listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_FLAT); - //TUC鏁版嵁婧� + //CTU鏁版嵁婧� List<OrderOutMergeParam> tucOrders = new ArrayList<>();//listMap.get(LocAreaTypeSts.LOC_AREA_TYPE_UTC); //鎸夊簱浣嶇被鍨嬪垎绫� - Map<Long, List<OrderOutMergeParam>> listMap = params.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getTypeId)); + 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)); - //鏁版嵁鍒嗙被 1.骞冲簱鏁版嵁 2. TUC鏁版嵁 listMap.keySet().forEach(key -> { if (key == LocAreaTypeSts.LOC_AREA_TYPE_FLAT.id) { flatOrders.addAll(listMap.get(key)); @@ -1028,26 +1059,21 @@ //骞冲簱鍑哄簱 outStockByFlat(flatOrders, wave); } - if (!tucOrders.isEmpty()) { - //TUC鍑哄簱 - outStockByTUC(tucOrders, wave); + //CTU鍑哄簱 + outStockByCTU(tucOrders, wave); } - - } /** - * TUC鍑哄簱--鐢熸垚鍑哄簱浠诲姟妗� + * CTU鍑哄簱--鐢熸垚鍑哄簱浠诲姟妗� * * @param tucOrders * @param wave */ - private void outStockByTUC(List<OrderOutMergeParam> tucOrders, Wave wave) {//123 + private void outStockByCTU(List<OrderOutMergeParam> tucOrders, Wave wave) { 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(); @@ -1085,6 +1111,11 @@ throw new CoolException("淇濆瓨宸ヤ綔妗eけ璐�"); } + wave.setSite(operationPort.getFlag()); + if (!waveService.updateById(wave)) { + throw new CoolException("娉㈡绔欏彛鐘舵�佹洿鏂板け璐ワ紒锛�"); + } + for (OrderOutMergeDto merge : list) { LocDetl locDetl = locDetlService.getById(merge.getLocDetlId()); if (locDetl == null) { @@ -1119,9 +1150,12 @@ } String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField()); - WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>().eq(WaveDetl::getStockIndex, matUniqueKey).eq(WaveDetl::getWaveId, wave.getId())); + logger.error("Matnr------>{}", taskDetl.getMatnr()); + WaveDetl waveDetl = waveDetlService.getOne(new LambdaQueryWrapper<WaveDetl>() + .eq(WaveDetl::getStockIndex, matUniqueKey) + .eq(WaveDetl::getWaveId, wave.getId())); if (waveDetl == null) { - throw new CoolException("娉㈡鏁版嵁涓嶅瓨鍦�"); + throw new CoolException("waveId:" + wave.getId() + "鐗╂枡锛�" + taskDetl.getMatnr() + "娉㈡鏁版嵁涓嶅瓨鍦�"); } waveDetl.setWorkQty(waveDetl.getWorkQty() + taskDetl.getAnfme()); waveDetl.setUpdateTime(new Date()); @@ -1129,6 +1163,37 @@ throw new CoolException("娉㈡鏁版嵁鏇存柊澶辫触"); } } + + 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).eq(CacheSite::getChannel, task.getTargetSite())); +// +// if (cacheSites.isEmpty()) { +// throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�"); +// } +// +// if (cacheSites.size() < orders.size()) { +// throw new CoolException("缂撳瓨绔欑┖闂翠笉瓒筹紝璇风◢鍚庡啀璇�"); +// } + +// for (int i = 0; i < orders.size(); i++) { +// CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orders.get(i).getId())); +// if (Objects.isNull(cacheSite)) { +// cacheSite.setOrderId(orders.get(i).getId()); +// cacheSite.setOrderNo(orders.get(i).getOrderNo()); +// cacheSite.setSiteStatus(CacheSiteStatusType.R.id); +// cacheSite.setBarcode(loc.getBarcode()); +// cacheSite.setUpdateTime(new Date()); +// if (!cacheSiteService.updateById(cacheSite)) { +// throw new CoolException("缂撳瓨绔欐洿鏂板け璐�"); +// } +// } +// } //搴撲綅F => R loc.setLocStsId(LocStsType.R.val()); @@ -1173,6 +1238,18 @@ //鏍规嵁搴撲綅ID鍒嗙粍 Map<Long, List<OrderOutMergeParam>> listMap = flatOrders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId)); + + genPickSheet(listMap, pickSheet); + } + + /** + * @author Ryan + * @date 2025/7/4 + * @description: 鐢熸垚鎷h揣鏄庣粏 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void genPickSheet(Map<Long, List<OrderOutMergeParam>> listMap, PickSheet pickSheet) { //鐢熸垚鎷h揣鏄庣粏 listMap.keySet().forEach(key -> { Loc curLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getId, key)); @@ -1199,10 +1276,23 @@ //閿佸畾搴撳瓨閲� locDetl.setWorkQty(locDetl.getWorkQty() + outOder.getAnfme()); + if (!locDetlService.updateById(locDetl)) { + throw new CoolException("搴撳瓨鍔犻攣澶辫触锛侊紒"); + } + + orderDetlService.update(new LambdaUpdateWrapper<OrderDetl>() + .set(OrderDetl::getWareType, 2) + .eq(OrderDetl::getMatId, mat.getId()) + .eq(StringUtils.isNullOrEmpty(outOder.getBatch()), OrderDetl::getBatch, outOder.getBatch()) + .in(OrderDetl::getOrderId, outOder.getOrderIds())); }); - }); + curLoc.setLocStsId(LocStsType.R.val()); + if (!locService.updateById(curLoc)) { + throw new CoolException("搴撲綅鐘舵�佷慨鏀瑰け璐ワ紒锛�"); + } + }); } /** @@ -1222,24 +1312,19 @@ 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 + "閫氶亾宸茬粡鍒嗛厤娉㈡"); - } - } - - +// 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("璁㈠崟鍙傛暟涓嶈兘涓虹┖"); @@ -1290,19 +1375,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()) { @@ -1339,7 +1424,7 @@ } - @Transactional + @Transactional(rollbackFor = Exception.class) public void cancelWave(List<Long> waveIds) { if (waveIds == null) { throw new CoolException("鍙傛暟涓嶈兘涓虹┖"); @@ -1362,6 +1447,14 @@ 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); @@ -1375,15 +1468,15 @@ } 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("缂撳瓨绔欐竻绌哄け璐�"); + if (cacheSite != null) { + cacheSite.setSiteStatus(CacheSiteStatusType.O.id); + cacheSite.setOrderId(null); + cacheSite.setOrderNo(null); + cacheSite.setBarcode(null); + cacheSite.setUpdateTime(new Date()); + if (!cacheSiteService.updateById(cacheSite)) { + throw new CoolException("缂撳瓨绔欐竻绌哄け璐�"); + } } } @@ -1392,7 +1485,193 @@ waveService.removeById(wave.getId()); } - } + /** + * @author Ryan + * @date 2025/7/3 + * @description: 搴撳瓨鍑哄簱淇℃伅 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void outLocStock(StockOutParam param) { + System.out.println(JSONObject.toJSONString(param)); + if (param.getOutType().equals(1)) { + //鎷h揣鍗� + outFlatStock(param); + } else { + //鐢熸垚浠诲姟妗� + generateTask(param); + } + } + + /** + * @author Ryan + * @param: [] + * @return: void + * @date: 2025/7/4 + * @description: 鎵嬪姩鍑哄簱鐢熸垚浠诲姟 + */ + @Transactional(rollbackFor = Exception.class) + public void generateTask(StockOutParam outParam) { + for (LocDetl outLocDetl : outParam.getLocDetls()) { + List<OrderOutMergeDto> orders = new ArrayList<>(); + LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>().eq(LocDetl::getId, outLocDetl.getId())); + if (Objects.isNull(detl)) { + continue; + } + OrderOutMergeDto outMergeParam = new OrderOutMergeDto(); + outMergeParam.setAnfme(outLocDetl.getAnfme()); + outMergeParam.setLocNo(outLocDetl.getLocNo()); + outMergeParam.setLocDetlId(detl.getId()); + outMergeParam.setLocId(detl.getLocId()); + outMergeParam.setMatnr(outLocDetl.getMatnr()); + outMergeParam.setBatch(detl.getBatch()); + orders.add(outMergeParam); + + //鏍规嵁搴撲綅ID鍒嗙粍 + Map<Long, List<OrderOutMergeDto>> listMap = orders.stream().collect(Collectors.groupingBy(OrderOutMergeDto::getLocId)); + //鐢熸垚鎷h揣鍗曟槑缁� + for (Map.Entry<Long, List<OrderOutMergeDto>> entry : listMap.entrySet()) { + Long locId = entry.getKey(); + List<OrderOutMergeDto> list = entry.getValue(); + //鍒ゆ柇鏄惁鍏ㄤ粨鍑哄簱 + Boolean all = outUtils.isAllForMerge(locId, list); + OrderOutMergeDto param = list.stream().findFirst().get(); + + List<CacheSite> sites = cacheSiteService.list(new LambdaQueryWrapper<CacheSite>() + .isNotNull(CacheSite::getOrderId)); + if (!sites.isEmpty()) { + Map<String, Long> longMap = sites.stream().collect(Collectors.groupingBy(CacheSite::getChannel, Collectors.counting())); + Map.Entry<String, Long> entry1 = longMap.entrySet().stream().min(Map.Entry.comparingByValue()).get(); + param.setPortSite(entry1.getKey()); + } else { + CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().last("limit 1")); + param.setPortSite(cacheSite.getChannel()); + } + 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 + .getOne(new LambdaQueryWrapper<OperationPort>() + .eq(OperationPort::getFlag, param.getPortSite())); + if (Objects.isNull(operationPort)) { + throw new CoolException("浣滀笟鍙d笉瀛樺湪"); + } + //101 鍏ㄦ嫋鍑哄簱 103 鎷h揣鍑哄簱 + 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.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("鏄庣粏鎵╁睍鐢熸垚澶辫触"); + } + } + } + + //搴撲綅F => R + loc.setLocStsId(LocStsType.R.val()); + loc.setUpdateTime(new Date()); + boolean locUpdate = locService.updateById(loc); + if (!locUpdate) { + throw new CoolException("搴撲綅鐘舵�佹洿鏂板け璐�"); + } + } + } + } + + + /** + * @author Ryan + * @date 2025/7/4 + * @description: 骞冲簱搴撳瓨鍑哄簱 + * @version 1.0 + */ + @Transactional(rollbackFor = Exception.class) + public void outFlatStock(StockOutParam param) { + //鐢熸垚鎷h揣鍗� + PickSheet pickSheet = new PickSheet(); + //娉㈡鏁伴噺姹囨�� + Double sum = param.getLocDetls().stream().mapToDouble(LocDetl::getAnfme).sum(); + //鐢熸垚鎷h揣鍗曞彿 + String pickNo = generatePickNO(); + pickSheet.setId(null) + .setPickNo(pickNo) + .setMemo("搴撳瓨鍑哄簱") + .setAnfme(sum) + .setType(2); + + if (!pickSheetService.save(pickSheet)) { + throw new CoolException("鎷h揣鍗曞啓鍏ュけ璐ワ紒锛�"); + } + + for (LocDetl locDetl : param.getLocDetls()) { + List<OrderOutMergeParam> orders = new ArrayList<>(); + LocDetl detl = locDetlService.getOne(new LambdaQueryWrapper<LocDetl>() + .eq(LocDetl::getMatId, locDetl.getMatId()) + .eq(LocDetl::getBatch, locDetl.getBatch()) + .eq(LocDetl::getLocNo, locDetl.getLocNo())); + if (Objects.isNull(detl)) { + continue; + } + OrderOutMergeParam outMergeParam = new OrderOutMergeParam(); + outMergeParam.setAnfme(locDetl.getAnfme()) + .setLocNo(locDetl.getLocNo()) + .setLocId(detl.getLocId()) + .setLocDetlId(detl.getId()) + .setMatnr(locDetl.getMatnr()) + .setBatch(detl.getBatch()); + orders.add(outMergeParam); + + //鏍规嵁搴撲綅ID鍒嗙粍 + Map<Long, List<OrderOutMergeParam>> listMap = orders.stream().collect(Collectors.groupingBy(OrderOutMergeParam::getLocId)); + //鐢熸垚鎷h揣鍗曟槑缁� + genPickSheet(listMap, pickSheet); + } + } } -- Gitblit v1.9.1