From 01ce50a3b8736726f58899b6cfa70ea27154637a Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期五, 13 六月 2025 14:03:55 +0800 Subject: [PATCH] 出库推荐库位优化 --- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java | 121 +++++++++++++++++++++++++++++++++------- 1 files changed, 99 insertions(+), 22 deletions(-) diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java index c93da6b..77953ef 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java @@ -171,13 +171,9 @@ */ @Override @Transactional(rollbackFor = Exception.class) - public R genOutStock(List<Long> ids, Long loginUserId) { - if (Objects.isNull(ids) || ids.isEmpty()) { - throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); - } - List<DeliveryItem> items = deliveryItemService.list(new LambdaQueryWrapper<DeliveryItem>().in(DeliveryItem::getId, ids)); + public R genOutStock(List<DeliveryItem> items, Long loginUserId) { if (items.isEmpty()) { - throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�"); + throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒"); } Map<Long, List<DeliveryItem>> listMap = items.stream().collect(Collectors.groupingBy(DeliveryItem::getDeliveryId)); listMap.keySet().forEach(key -> { @@ -188,7 +184,7 @@ AsnOrder order = new AsnOrder(); BeanUtils.copyProperties(delivery, order); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, order); - if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) { + if (StringUtils.isBlank(ruleCode)) { throw new CoolException("缂栫爜瑙勫垯閿欒锛氳妫�鏌� 銆孲YS_OUT_STOCK_CODE銆嶇紪鐮佹槸鍚﹁缃垚鍔�"); } order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val) @@ -205,15 +201,23 @@ } List<AsnOrderItem> orderItems = new ArrayList<>(); listMap.get(key).forEach(item -> { + DeliveryItem deliveryItem = deliveryItemService.getById(item.getId()); AsnOrderItem orderItem = new AsnOrderItem(); - Double anfme = Math.round((item.getAnfme() - item.getWorkQty() - item.getQty()) * 10000) / 10000.0; + if (item.getAnfme().compareTo(0.0) <= 0) { + throw new CoolException("鍑哄簱鏁伴噺涓嶈兘灏忎簬鎴栫瓑浜庨浂锛侊紒"); + } + Double anfme = Math.round((deliveryItem.getAnfme() - item.getAnfme()) * 10000) / 10000.0; + if (anfme.compareTo(0.0) < 0) { + throw new CoolException("鍑哄簱鏁伴噺涓嶈冻锛侊紒"); + } + BeanUtils.copyProperties(item, orderItem); orderItem.setId(null) .setPoCode(order.getPoCode()) .setMaktx(item.getMaktx()) .setMatnrCode(item.getMatnrCode()) .setFieldsIndex(item.getFieldsIndex()) - .setAnfme(anfme) + .setAnfme(item.getAnfme()) .setWorkQty(0.0) .setAsnId(order.getId()) .setAsnCode(order.getCode()) @@ -257,7 +261,6 @@ .eq(Delivery::getId, key))) { throw new CoolException("涓诲崟淇敼澶辫触锛侊紒"); } - }); return R.ok(); } @@ -446,7 +449,7 @@ if (Objects.isNull(param)) { continue; } - Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode())); + Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, param.getLocCode()).eq(Loc::getBarcode, param.getBarcode())); if (!Objects.isNull(loc)) { List<LocItem> locItems = new ArrayList<>(); LocItem locItem = locItemService.getById(param.getId()); @@ -476,7 +479,7 @@ .setSiteNo(param.getSiteNo()); try { //鐢熸垚鍑哄簱浠诲姟 - locItemService.generateTask(taskParams, loginUserId); + locItemService.generateTask(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val, taskParams, loginUserId); } catch (Exception e) { logger.error("UNK", e); throw new CoolException(e.getMessage()); @@ -512,6 +515,7 @@ /** * 鑾峰彇鍑哄簱绔欑偣 + * * @return */ @Override @@ -522,6 +526,47 @@ TaskType.TASK_TYPE_PICK_AGAIN_OUT.type); List<DeviceSite> sites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>().in(DeviceSite::getType, list).groupBy(DeviceSite::getSite)); return R.ok(sites); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public R cancelOutOrderByItems(List<AsnOrderItem> orderItems) { + Map<Long, List<AsnOrderItem>> listMap = orderItems.stream().collect(Collectors.groupingBy(AsnOrderItem::getAsnId)); + for (Long key : listMap.keySet()) { + AsnOrder order = this.getById(key); + if (Objects.isNull(order)) { + throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�"); + } + List<AsnOrderItem> items = listMap.get(key); + if (!items.isEmpty()) { + for (AsnOrderItem orderItem : items) { + DeliveryItem deliveryItem = deliveryItemService.getById(orderItem.getPoDetlId()); + Double workQty = Math.round((deliveryItem.getWorkQty() - orderItem.getAnfme()) * 10000) / 10000.0; + deliveryItem.setWorkQty(workQty.compareTo(0.0) >= 0 ? workQty : 0); + if (!deliveryItemService.updateById(deliveryItem)) { + throw new CoolException("DO鍗曟槑缁嗘洿鏂板け璐ワ紒锛�"); + } + + Delivery delivery = deliveryService.getOne(new LambdaQueryWrapper<Delivery>().eq(Delivery::getCode, orderItem.getPoCode())); + if (!Objects.isNull(delivery)) { + Double wkQty = Math.round((delivery.getWorkQty() - delivery.getAnfme()) * 10000) / 10000.0; + delivery.setWorkQty(wkQty.compareTo(0.0) >= 0 ? wkQty : 0).setExceStatus(POExceStatus.PO_EXCE_STATUS_UN_EXCE.val); + if (!deliveryService.updateById(delivery)) { + throw new CoolException("DO鍗曟嵁淇敼澶辫触锛侊紒"); + } + } + } + } + + if (!this.remove(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getId, key))) { + throw new CoolException("涓诲崟鍒犻櫎澶辫触锛侊紒"); + } + if (!outStockItemService.remove(new LambdaQueryWrapper<AsnOrderItem>() + .eq(AsnOrderItem::getAsnId, key))) { + throw new CoolException("鍗曟嵁鏄庣粏鍒犻櫎澶辫触锛侊紒"); + } + } + return R.ok("鎿嶄綔鎴愬姛"); } @@ -538,9 +583,7 @@ ); locItemQueryWrapper.apply(applySql); List<LocItem> locItems = locItemService.list(locItemQueryWrapper); - locItems.sort(Comparator - .comparing((LocItem item) -> !LocUtils.isShallowLoc(item.getLocCode())) - ); + locItems.sort(Comparator.comparing((LocItem item) -> !LocUtils.isShallowLoc(item.getLocCode()))); return locItems; } @@ -574,14 +617,34 @@ if (issued.doubleValue() <= 0) { continue; } - List<LocItem> locItems = null; - if (WaveRuleType.Efficiency_First.type.equals(waveRule.getType())) { - locItems = getEfficiencyFirstItemList(asnOrderItem); - } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) { - locItems = getFirstInFirstOutItemList(asnOrderItem); - } else { - locItems = getFirstInFirstOutItemList(asnOrderItem); + List<LocItem> locItems = new ArrayList<>(); + List<LocItem> items = locItemService.list(new LambdaQueryWrapper<LocItem>() + .eq(StringUtils.isNotBlank(asnOrderItem.getSplrBatch()), LocItem::getBatch, asnOrderItem.getSplrBatch()) + .eq(StringUtils.isNotBlank(asnOrderItem.getFieldsIndex()), LocItem::getFieldsIndex, asnOrderItem.getFieldsIndex()) + .eq(StringUtils.isNotBlank(asnOrderItem.getPlatOrderCode()), LocItem::getPlatOrderCode, asnOrderItem.getPlatOrderCode()) + .eq(LocItem::getAnfme, asnOrderItem.getAnfme()) + .eq(LocItem::getMatnrId, asnOrderItem.getMatnrId())); + if (!items.isEmpty()) { + for (LocItem item : items) { + if (LocUtils.isShallowLoc(item.getLocCode())) { + locItems.add(item); + } + } + if (locItems.isEmpty()) { + locItems.addAll(items); + } } + + if (locItems.isEmpty()) { + if (WaveRuleType.Efficiency_First.type.equals(waveRule.getType())) { + locItems = getEfficiencyFirstItemList(asnOrderItem); + } else if (WaveRuleType.First_In_First_Out.type.equals(waveRule.getType())) { + locItems = getFirstInFirstOutItemList(asnOrderItem); + } else { + locItems = getFirstInFirstOutItemList(asnOrderItem); + } + } + for (LocItem locItem : locItems) { Loc loc = locService.getById(locItem.getLocId()); List<LocItem> itemList = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocCode, locItem.getLocCode())); @@ -620,6 +683,20 @@ } } + if (issued.doubleValue() > 0) { + LocItem locItem = new LocItem() + .setId(new Random().nextLong()) + .setMatnrCode(asnOrderItem.getMatnrCode()) + .setMaktx(asnOrderItem.getMaktx()) + .setAnfme(0.00) + .setWorkQty(issued.doubleValue()) + .setOutQty(issued.doubleValue()) + .setUnit(asnOrderItem.getStockUnit()) + .setBatch(asnOrderItem.getSplrBatch()); + OrderOutItemDto orderOutItemDto = new OrderOutItemDto(); + orderOutItemDto.setLocItem(locItem); + list.add(orderOutItemDto); + } } return list; -- Gitblit v1.9.1