From 88176e1522e0a8d354a1ff1c5a0edfff9e52f3fa Mon Sep 17 00:00:00 2001 From: "HUOJIN\\92525" Date: Fri, 16 Jan 2026 16:54:36 +0800 Subject: [PATCH] no message --- .../modules/constant/enums/AsnTypeEnum.java | 5 +- .../modules/constant/enums/PickTypeEnum.java | 14 ++- .../service/impl/TaskServiceImpl.java | 27 ++++-- .../service/processor/PickProcessor.java | 95 ++++++++++++++++--- 4 files changed, 120 insertions(+), 21 deletions(-) diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnTypeEnum.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnTypeEnum.java index bd53ff2..528ef8c 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnTypeEnum.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/AsnTypeEnum.java @@ -51,7 +51,10 @@ public enum AsnTypeEnum { AsnTypeEnum.PJ.getValue(), AsnTypeEnum.JY.getValue(), AsnTypeEnum.CPC.getValue(), - AsnTypeEnum.PJC.getValue() + AsnTypeEnum.PJC.getValue(), + AsnTypeEnum.SC.getValue(), + AsnTypeEnum.WX.getValue(), + AsnTypeEnum.QC.getValue() ); } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/PickTypeEnum.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/PickTypeEnum.java index b12a430..a56f063 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/PickTypeEnum.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/constant/enums/PickTypeEnum.java @@ -20,6 +20,14 @@ public enum PickTypeEnum { JY(7, "检验出库"), + SC(1, "生产出库"), + + BF(2, "报废出库"), + + WX(3, "维修出库"), + + DJ(8, "点检出库"), + ; PickTypeEnum(Integer value, String desc) { @@ -41,7 +49,11 @@ public enum PickTypeEnum { PickTypeEnum.CP.getValue(), PickTypeEnum.PJ.getValue(), PickTypeEnum.FG.getValue(), - PickTypeEnum.JY.getValue() + PickTypeEnum.JY.getValue(), + PickTypeEnum.SC.getValue(), + PickTypeEnum.BF.getValue(), + PickTypeEnum.WX.getValue(), + PickTypeEnum.DJ.getValue() ); } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java index b8e6a8b..269cc80 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/impl/TaskServiceImpl.java @@ -230,11 +230,18 @@ public class TaskServiceImpl extends ServiceImpl implements IT } //目前是四个工作站 - List outPoints = pointService.queryPoints(null, null, AreaTypeEnum.CK_DOCK.getValue()); - if (CollectionUtils.isEmpty(outPoints)) { - log.info("没有出库工作站"); + List outCpPoints = pointService.queryPoints(null, null, AreaTypeEnum.CK_DOCK.getValue()); + if (CollectionUtils.isEmpty(outCpPoints)) { + log.info("没有成品出库工作站"); return; } + + List outMjPoints = pointService.queryPoints(null, null, AreaTypeEnum.MJCK_DOCK.getValue()); + if (CollectionUtils.isEmpty(outMjPoints)) { + log.info("没有模具出库工作站"); + return; + } + //当前所有工作站执行中的任务 Map pointTaskCountMap = queryPointTaskCount(); @@ -253,20 +260,28 @@ public class TaskServiceImpl extends ServiceImpl implements IT //获取所有出库单明细 List pickDetailId = taskList.stream().map(Task::getPickDetailId).distinct().toList(); Map pickDetailMap = pickDetailService.queryByPickDetailIdsToMap(pickDetailId); + List outPoints; for (Task task : taskList) { //起点 Point fromPoint = fromPointMap.get(task.getFromPointId()); + //出库单 + Pick pick = pickMap.get(task.getPickId()); //选择最优且任务数最少的工作站 - Point bestOutPoint = selectBestAvailableOutboundPoint(fromPoint, outPoints, pointTaskCountMap); + Point bestOutPoint; + if(Set.of(4, 5, 6, 7).contains(pick.getOrderType())){ + outPoints=outCpPoints; + bestOutPoint = selectBestAvailableOutboundPoint(fromPoint, outPoints, pointTaskCountMap); + }else{ + bestOutPoint=outMjPoints.get(0); + } task.setToPointId(bestOutPoint.getId()); task.setToPointCode(bestOutPoint.getPointCode()); //分配日志 Inventory inventory = inventoryMap.get(task.getInventoryId()); - Pick pick = pickMap.get(task.getPickId()); PickDetail pickDetail = pickDetailMap.get(task.getPickDetailId()); - if (inventory != null && pick != null && pickDetail != null) { + if (inventory != null && pickDetail != null) { inventoryLogService.addAllocInventoryLog(inventory, bestOutPoint.getId(), task.getPlanQty(), pick.getThirdOrderNo(), pickDetail.getId(), pickDetail.getDescription()); } diff --git a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/processor/PickProcessor.java b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/processor/PickProcessor.java index d9ccddf..e4a117e 100644 --- a/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/processor/PickProcessor.java +++ b/cpte-boot-module/cpte-module-wms/src/main/java/org/cpte/modules/shipping/service/processor/PickProcessor.java @@ -269,19 +269,88 @@ public class PickProcessor { * @param pickedQty 拣货数量 * @param pickDetailUpdateMap 拣货明细更新集合 */ - private void updatePickDetail(PickData data, Task task, BigDecimal pickedQty, - Map pickDetailUpdateMap) { - //出库明细 - PickDetail pickDetail = data.getPickDetailMap().get(task.getPickDetailId()); - //获取map最新的出库明细 - PickDetail targetPickDetail = pickDetailUpdateMap.getOrDefault(pickDetail.getId(), pickDetail); - //拣货数量 - BigDecimal newPickedQty = BigDecimalUtil.add(targetPickDetail.getPickedQty(), pickedQty, 0); - //状态 - Integer status = newPickedQty.compareTo(targetPickDetail.getOrderQty()) >= 0 ? PickStatusEnum.PICKED.getValue() : PickStatusEnum.PICKING.getValue(); - targetPickDetail.setPickedQty(newPickedQty); - targetPickDetail.setStatus(status); - pickDetailUpdateMap.put(targetPickDetail.getId(), targetPickDetail); + private void updatePickDetail( + PickData data, + Task task, + BigDecimal pickedQty, + Map pickDetailUpdateMap + ) { + // 从数据中获取原始 PickDetail + PickDetail originalPickDetail = data.getPickDetailMap().get(task.getPickDetailId()); + if (originalPickDetail == null) { + return; // 安全保护 + } + + // 从 Map 获取已累积的 PickDetail(可能是已经部分更新过的) + PickDetail currentPickDetail = pickDetailUpdateMap + .computeIfAbsent(originalPickDetail.getId(), id -> clonePickDetail(originalPickDetail)); + + // 累加拣货数量 + BigDecimal existingQty = currentPickDetail.getPickedQty() == null + ? BigDecimal.ZERO + : currentPickDetail.getPickedQty(); + + BigDecimal newPickedQty = existingQty.add(pickedQty); + + // 订单总数量 + BigDecimal orderQty = currentPickDetail.getOrderQty() == null + ? BigDecimal.ZERO + : currentPickDetail.getOrderQty(); + + // 确保 newPickedQty 不超过 orderQty + if (newPickedQty.compareTo(orderQty) > 0) { + newPickedQty = orderQty; + } + + // 更新数量 + currentPickDetail.setPickedQty(newPickedQty); + + // 计算状态:是否完全拣完 + Integer status; + if (newPickedQty.compareTo(orderQty) >= 0) { + status = PickStatusEnum.PICKED.getValue(); + } else if (newPickedQty.compareTo(BigDecimal.ZERO) > 0) { + status = PickStatusEnum.PICKING.getValue(); + }else { + status = currentPickDetail.getStatus(); + } + + currentPickDetail.setStatus(status); + + // 最终写回更新 Map + pickDetailUpdateMap.put(currentPickDetail.getId(), currentPickDetail); + } + + private PickDetail clonePickDetail(PickDetail src) { + PickDetail dst = PickDetail.builder() + .id(src.getId()) + .pickId(src.getPickId()) + .itemId(src.getItemId()) + .stockId(src.getStockId()) + .lineNo(src.getLineNo()) + .unit(src.getUnit()) + .project(src.getProject()) + .taskNo(src.getTaskNo()) + .orderQty(src.getOrderQty()) + .allocatedQty(src.getAllocatedQty()) + .pickedQty(src.getPickedQty()) + .status(src.getStatus()) + .propC1(src.getPropC1()) + .propC2(src.getPropC2()) + .propC3(src.getPropC3()) + .propC4(src.getPropC4()) + .propD1(src.getPropD1()) + .description(src.getDescription()) + .sourceId(src.getSourceId()) + .sourceName(src.getSourceName()) + .tenantId(src.getTenantId()) + .sysOrgCode(src.getSysOrgCode()) + .createBy(src.getCreateBy()) + .createTime(src.getCreateTime()) + .updateBy(src.getUpdateBy()) + .updateTime(src.getUpdateTime()) + .build(); + return dst; } /**