rsf-admin/src/page/orders/asnOrder/orderWorkTypeInbound.js
@@ -2,9 +2,10 @@ * 订单业务类型(sys_order_work_type):入库通知单仅展示入库侧 * 与后端 OrderWorkType 枚举中的出库类 value 对齐 */ // 与后端 OrderWorkType.getOrderType:ORDER_OUT 一致(不含 D004) // 与后端 OrderWorkType.getOrderType:ORDER_OUT 一致(不含 D004 等入库字母码) export const OUTBOUND_ORDER_WORK_TYPE_VALUES = new Set([ '11', '12', '13', '14', '15', '18', '19', 'D001', 'A008', 'B003', 'C036', ]); export function filterInboundOrderWorkTypeRecords(records) { rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -387,6 +387,7 @@ item.setTrackCode(dto.getBarcode()) .setAreaName(areasItem.getName()) .setAreaId(areasItem.getId()) .setPlatItemId(orderItem.getPlatItemId()) .setAsnItemId(orderItem.getId()) .setAsnCode(wkOrder.getCode()) .setAsnId(wkOrder.getId()) @@ -414,16 +415,8 @@ //TODO 供应商标识未设置,标识由PO单供应商编码转换 LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new LambdaQueryWrapper<WarehouseAreasItem>() // .eq(WarehouseAreasItem::getAsnItemId, item.getAsnItemId()) .eq(WarehouseAreasItem::getMatnrCode, item.getMatnrCode()) .eq(!Cools.isEmpty(item.getFieldsIndex()), WarehouseAreasItem::getFieldsIndex, item.getFieldsIndex()) .eq(WarehouseAreasItem::getAsnCode, item.getAsnCode()) .eq(StringUtils.isNotBlank(item.getSplrBatch()), WarehouseAreasItem::getSplrBatch, item.getSplrBatch()); if (Objects.isNull(orderItem.getIsptResult())) { queryWrapper.isNull(WarehouseAreasItem::getIsptResult); } else { queryWrapper.eq(WarehouseAreasItem::getIsptResult, orderItem.getIsptResult()); } .eq(WarehouseAreasItem::getAsnItemId, item.getAsnItemId()) .eq(WarehouseAreasItem::getAsnId, wkOrder.getId()); WarehouseAreasItem serviceOne = warehouseAreasItemService.getOne(queryWrapper); @@ -661,6 +654,7 @@ if (!Cools.isEmpty(batch)) receiptWrapper.eq(WarehouseAreasItem::getSplrBatch, batch); if (!Objects.isNull(fieldIndex)) receiptWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex); if (!Cools.isEmpty(code)) receiptWrapper.eq(WarehouseAreasItem::getTrackCode, code); receiptWrapper.orderByAsc(WarehouseAreasItem::getPlatItemId).orderByAsc(WarehouseAreasItem::getAsnItemId); List<WarehouseAreasItem> receiptList = warehouseAreasItemService.list(receiptWrapper); // 组托通知档(WaitPakinItem)的已组托数量也要扣减:收货区 workQty 仅反映从收货区组托的部分,从订单直接组托的在此汇总 Map<Long, Double> waitPakinSumByItemId = new java.util.HashMap<>(); @@ -698,6 +692,7 @@ if (!Cools.isEmpty(batch)) itemWrapper.eq(WkOrderItem::getSplrBatch, batch); if (!Objects.isNull(fieldIndex)) itemWrapper.eq(WkOrderItem::getFieldsIndex, fieldIndex); if (!Cools.isEmpty(code)) itemWrapper.eq(WkOrderItem::getTrackCode, code); itemWrapper.orderByAsc(WkOrderItem::getPlatItemId).orderByAsc(WkOrderItem::getId); List<WkOrderItem> orderItems = asnOrderItemMapper.selectList(itemWrapper); List<WarehouseAreasItem> list = new ArrayList<>(); for (WkOrderItem oi : orderItems) { rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/PdaOutStockServiceImpl.java
@@ -406,64 +406,58 @@ return R.error("单据信息不存在!!"); } List<TaskItem> taskItems = params.getTaskItems(); Map<String, List<TaskItem>> listMap = taskItems.stream().collect(Collectors.groupingBy(TaskItem::getMatnrCode)); // 拣货完成仅扣减库位数量并累加 TaskItem.qty,不更新出库单/订单;待托盘全部拣完在 saveWavePick 再按顺序更新库存并校验 // 按订单明细行区分:同单同物料多行不得按 matnr 合并 Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.ALLOW_OVER_CHANGE)); listMap.keySet().forEach(code -> { List<TaskItem> items = listMap.get(code); WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>() .eq(WkOrderItem::getMatnrCode, code) .eq(WkOrderItem::getOrderId, order.getId())); Map<Long, Double> batchPickSumByOrderItem = new HashMap<>(); for (TaskItem taskItemParam : taskItems) { TaskItem item = taskItemService.getById(taskItemParam.getId()); if (Objects.isNull(item)) { throw new CoolException("任务明细不存在!!"); } WkOrderItem orderItem = resolveOrderItemForPick(item, order.getId()); if (Objects.isNull(orderItem)) { throw new CoolException("数据错误,拣料不在单据需求中!!"); } Double summed = items.stream().mapToDouble(ti -> ti.getAnfme() != null ? ti.getAnfme() : 0.0).sum(); Double pickQty = Math.round((orderItem.getQty() != null ? orderItem.getQty() : 0.0) + summed) * 1000000.0 / 1000000.0; Double pickInc = taskItemParam.getAnfme() != null ? taskItemParam.getAnfme() : 0.0; Double prevBatch = batchPickSumByOrderItem.getOrDefault(orderItem.getId(), 0.0); Double pickQty = Math.round((orderItem.getQty() != null ? orderItem.getQty() : 0.0) + prevBatch + pickInc) * 1000000.0 / 1000000.0; if (!Objects.isNull(config) && !Boolean.parseBoolean(config.getVal())) { if (pickQty.compareTo(orderItem.getAnfme()) > 0.0) { throw new CoolException("播种数量不能超出订单需求数量"); } Double v = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + pickInc) * 1000000.0) / 1000000.0; if (item.getAnfme() != null && item.getAnfme().compareTo(v) < 0.0) { throw new CoolException("当前物料已超出可拣范围,请核对后再操作!!"); } } items.forEach(taskItem -> { TaskItem item = taskItemService.getById(taskItem.getId()); if (Objects.isNull(item)) { throw new CoolException("任务明细不存在!!"); } if (!Objects.isNull(config) && !Boolean.parseBoolean(config.getVal())) { Double v = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + (taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0)) * 1000000.0) / 1000000.0; if (item.getAnfme() != null && item.getAnfme().compareTo(v) < 0.0) { throw new CoolException("当前物料已超出可拣范围,请核对后再操作!!"); } } Double picQty = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + (taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0)) * 1000000.0) / 1000000.0; item.setQty(picQty).setOrderId(order.getId()).setOrderItemId(orderItem.getId()); if (!taskItemService.updateById(item)) { throw new CoolException("拣货数量更新失败!!"); } if (StringUtils.isNotBlank(task.getOrgLoc())) { LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>() .eq(LocItem::getLocCode, task.getOrgLoc()) .eq(LocItem::getMatnrId, item.getMatnrId()) .eq(StringUtils.isNotBlank(item.getBatch()), LocItem::getBatch, item.getBatch()) .eq(StringUtils.isNotBlank(item.getFieldsIndex()), LocItem::getFieldsIndex, item.getFieldsIndex())); if (Objects.nonNull(locItem)) { Double pickAmt = taskItem.getAnfme() != null ? taskItem.getAnfme() : 0.0; Double newAnfme = Math.round((locItem.getAnfme() - pickAmt) * 1000000.0) / 1000000.0; if (newAnfme.compareTo(0.0) <= 0) { locItemService.removeById(locItem.getId()); } else { locItem.setAnfme(newAnfme) .setUpdateBy(SystemAuthUtils.getLoginUserId()) .setUpdateTime(new Date()); if (!locItemService.updateById(locItem)) { throw new CoolException("库位明细数量扣减失败!!"); } batchPickSumByOrderItem.merge(orderItem.getId(), pickInc, (a, b) -> (a != null ? a : 0.0) + (b != null ? b : 0.0)); Double picQty = Math.round(((item.getQty() != null ? item.getQty() : 0.0) + pickInc) * 1000000.0) / 1000000.0; item.setQty(picQty).setOrderId(order.getId()).setOrderItemId(orderItem.getId()); if (!taskItemService.updateById(item)) { throw new CoolException("拣货数量更新失败!!"); } if (StringUtils.isNotBlank(task.getOrgLoc())) { LocItem locItem = locItemService.getOne(new LambdaQueryWrapper<LocItem>() .eq(LocItem::getLocCode, task.getOrgLoc()) .eq(LocItem::getMatnrId, item.getMatnrId()) .eq(StringUtils.isNotBlank(item.getBatch()), LocItem::getBatch, item.getBatch()) .eq(StringUtils.isNotBlank(item.getFieldsIndex()), LocItem::getFieldsIndex, item.getFieldsIndex())); if (Objects.nonNull(locItem)) { Double pickAmt = pickInc; Double newAnfme = Math.round((locItem.getAnfme() - pickAmt) * 1000000.0) / 1000000.0; if (newAnfme.compareTo(0.0) <= 0) { locItemService.removeById(locItem.getId()); } else { locItem.setAnfme(newAnfme) .setUpdateBy(SystemAuthUtils.getLoginUserId()) .setUpdateTime(new Date()); if (!locItemService.updateById(locItem)) { throw new CoolException("库位明细数量扣减失败!!"); } } } }); }); } } return R.ok(); } @@ -607,18 +601,27 @@ WkOrder order = asnOrderService.getById(orderId); if (order == null) continue; List<TaskItem> items = byOrder.get(orderId); Map<String, List<TaskItem>> byMatnr = items.stream().collect(Collectors.groupingBy(TaskItem::getMatnrCode)); for (String code : byMatnr.keySet()) { List<TaskItem> matItems = byMatnr.get(code); WkOrderItem orderItem = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>() .eq(WkOrderItem::getMatnrCode, code) .eq(WkOrderItem::getOrderId, orderId)); if (orderItem == null) continue; Map<Long, List<TaskItem>> byOrderItem = new LinkedHashMap<>(); for (TaskItem ti : items) { WkOrderItem oi = resolveOrderItemForPick(ti, orderId); if (oi == null) { continue; } byOrderItem.computeIfAbsent(oi.getId(), k -> new ArrayList<>()).add(ti); } for (Map.Entry<Long, List<TaskItem>> e : byOrderItem.entrySet()) { WkOrderItem orderItem = asnOrderItemService.getById(e.getKey()); if (orderItem == null) { continue; } List<TaskItem> matItems = e.getValue(); Double summed = matItems.stream().mapToDouble(t -> t.getQty() != null ? t.getQty() : 0.0).sum(); orderItem.setQty(summed); asnOrderItemService.updateById(orderItem); String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null); if (StringUtils.isBlank(ruleCode)) continue; if (StringUtils.isBlank(ruleCode)) { continue; } Stock stock = new Stock(); stock.setCode(ruleCode) .setUpdateBy(loginUserId) @@ -630,7 +633,9 @@ .setSourceCode(orderItem.getOrderCode()) .setUpdateTime(new Date()) .setAnfme(summed); if (!stockService.save(stock)) continue; if (!stockService.save(stock)) { continue; } List<StockItem> stockItems = new ArrayList<>(); for (TaskItem ti : matItems) { StockItem si = new StockItem(); @@ -666,6 +671,31 @@ } /** * 波次拣货:任务明细与订单行对应(orderItemId 优先,否则行内码 platItemId),避免同单同料多行只命中一条 */ private WkOrderItem resolveOrderItemForPick(TaskItem taskItem, Long orderId) { if (taskItem.getOrderItemId() != null) { WkOrderItem oi = asnOrderItemService.getById(taskItem.getOrderItemId()); if (oi != null && orderId.equals(oi.getOrderId())) { return oi; } } if (StringUtils.isNotBlank(taskItem.getPlatItemId())) { WkOrderItem oi = asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>() .eq(WkOrderItem::getOrderId, orderId) .eq(WkOrderItem::getPlatItemId, taskItem.getPlatItemId()) .last("LIMIT 1")); if (oi != null) { return oi; } } return asnOrderItemService.getOne(new LambdaQueryWrapper<WkOrderItem>() .eq(WkOrderItem::getMatnrCode, taskItem.getMatnrCode()) .eq(WkOrderItem::getOrderId, orderId) .last("LIMIT 1")); } private Boolean checkWaveComplete(TaskItem taskItem) { Wave wave = waveService.getById(taskItem.getSourceId()); List<WkOrder> wkOrderList = asnOrderService.list(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getWaveId, wave.getId())); rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
@@ -12,10 +12,10 @@ ORDER_WORK_TYPE_DONE_IN("1", "采购入库单"), ORDER_WORK_TYPE_PROD("2", "生产入库单"), /** ERP 单别,生产入库(入库类) */ ORDER_WORK_TYPE_PROD_B017("B017", "生产入库"), ORDER_WORK_TYPE_PROD_B017("B017", "生产入库-工单入库"), ORDER_WORK_TYPE_PURCHASE("3", "领料退回入库单"), ORDER_WORK_TYPE_SALE("4", "销售退回入库单"), ORDER_WORK_TYPE_SALES_RETURN_D004("D004", "销售退货"), ORDER_WORK_TYPE_SALES_RETURN_D004("D004", "退货入库-销售退货"), ORDER_WORK_TYPE_OTHER_IN("5", "其它入库单"), ORDER_WORK_TYPE_OTHER_TERANSFER_IN("6", "调拔入库单"), ORDER_WORK_TYPE_OTHER_TERANSFER("8", "调拔入库单"),//项目临时修改 @@ -28,7 +28,18 @@ ORDER_WORK_TYPE_STOCK_OUT("15", "库存出库"), ORDER_WORK_TYPE_STOCK_CHECK("16", "盘点出库"), ORDER_WORK_TYPE_STOCK_TERANSFER("17", "调拔出库单"), ORDER_WORK_TYPE_OTHER("14", "其它出库单"); ORDER_WORK_TYPE_OTHER("14", "其它出库单"), ORDER_WORK_TYPE_D001("D001", "销售出库"), ORDER_WORK_TYPE_A008("A008", "采购仓退"), /** ERP 同码多场景时共用 B003 */ ORDER_WORK_TYPE_B003_ERP("B003", "领料出库-工单发料/超领"), ORDER_WORK_TYPE_C036("C036", "借出-出库"), ORDER_WORK_TYPE_A005("A005", "采购入库"), ORDER_WORK_TYPE_D022("D022", "退货入库-工单退料"), ORDER_WORK_TYPE_B042("B042", "生产入库-工单超入"), ORDER_WORK_TYPE_B007("B007", "生产入库-入库上架"), ORDER_WORK_TYPE_C037("C037", "调拨入库-借出归还"); OrderWorkType(String type, String desc) { @@ -48,6 +59,8 @@ return OrderWorkType.ORDER_WORK_TYPE_PROD_B017.type; } else if (desc.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_PROD_B017.type)) { return OrderWorkType.ORDER_WORK_TYPE_PROD_B017.type; } else if ("生产入库".equals(desc)) { return OrderWorkType.ORDER_WORK_TYPE_PROD_B017.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE.desc)) { return OrderWorkType.ORDER_WORK_TYPE_PURCHASE.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALE.desc)) { @@ -55,6 +68,8 @@ } else if (desc.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type)) { return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.desc)) { return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type; } else if ("销售退货".equals(desc)) { return OrderWorkType.ORDER_WORK_TYPE_SALES_RETURN_D004.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.desc)) { return OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type; @@ -78,8 +93,33 @@ return OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.desc)) { return OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_D001)) { return OrderWorkType.ORDER_WORK_TYPE_D001.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_A008)) { return OrderWorkType.ORDER_WORK_TYPE_A008.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B003_ERP)) { return OrderWorkType.ORDER_WORK_TYPE_B003_ERP.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_C036)) { return OrderWorkType.ORDER_WORK_TYPE_C036.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_A005)) { return OrderWorkType.ORDER_WORK_TYPE_A005.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_D022)) { return OrderWorkType.ORDER_WORK_TYPE_D022.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B042)) { return OrderWorkType.ORDER_WORK_TYPE_B042.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B007)) { return OrderWorkType.ORDER_WORK_TYPE_B007.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_C037)) { return OrderWorkType.ORDER_WORK_TYPE_C037.type; } return null; } private static boolean matchErpCode(String desc, OrderWorkType t) { if (desc == null) { return false; } return desc.equalsIgnoreCase(t.type) || desc.equals(t.desc); } /** @@ -93,9 +133,7 @@ return OrderType.ORDER_IN.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PROD.desc)) { return OrderType.ORDER_IN.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PROD_B017.desc)) { return OrderType.ORDER_IN.type; } else if (desc.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_PROD_B017.type)) { } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_PROD_B017) || "生产入库".equals(desc)) { return OrderType.ORDER_IN.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_PURCHASE.desc)) { return OrderType.ORDER_IN.type; @@ -125,6 +163,24 @@ return OrderType.ORDER_TRANSFER.type; } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.desc)) { return OrderType.ORDER_REVISE.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_D001)) { return OrderType.ORDER_OUT.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_A008)) { return OrderType.ORDER_OUT.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B003_ERP)) { return OrderType.ORDER_OUT.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_C036)) { return OrderType.ORDER_OUT.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_A005)) { return OrderType.ORDER_IN.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_D022)) { return OrderType.ORDER_IN.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B042)) { return OrderType.ORDER_IN.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_B007)) { return OrderType.ORDER_IN.type; } else if (matchErpCode(desc, OrderWorkType.ORDER_WORK_TYPE_C037)) { return OrderType.ORDER_IN.type; } return null; } @@ -164,6 +220,24 @@ return OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.desc; } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.type)) { return OrderWorkType.ORDER_WORK_TYPE_STOCK_REVISE.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_D001.type)) { return OrderWorkType.ORDER_WORK_TYPE_D001.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_A008.type)) { return OrderWorkType.ORDER_WORK_TYPE_A008.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_B003_ERP.type)) { return OrderWorkType.ORDER_WORK_TYPE_B003_ERP.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_C036.type)) { return OrderWorkType.ORDER_WORK_TYPE_C036.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_A005.type)) { return OrderWorkType.ORDER_WORK_TYPE_A005.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_D022.type)) { return OrderWorkType.ORDER_WORK_TYPE_D022.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_B042.type)) { return OrderWorkType.ORDER_WORK_TYPE_B042.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_B007.type)) { return OrderWorkType.ORDER_WORK_TYPE_B007.desc; } else if (type != null && type.equalsIgnoreCase(OrderWorkType.ORDER_WORK_TYPE_C037.type)) { return OrderWorkType.ORDER_WORK_TYPE_C037.desc; } return null; } rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/ScheduleJobs.java
@@ -2,7 +2,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.vincent.rsf.framework.common.Cools; import com.vincent.rsf.framework.exception.CoolException; import com.vincent.rsf.server.common.config.SysStockProperties; import com.vincent.rsf.server.common.utils.DateUtils; @@ -162,17 +161,10 @@ .setWeight(matnr.getWeight()) .setFieldsIndex(orderItem.getFieldsIndex()) .setShipperId(matnr.getShipperId()); // 同票号 fields_index 可能对应多条 ASN 明细(不同 plat_item),不得在此处整段 return;否则仅第一条写入收货区,其余数量丢失。合并逻辑见下方 queryWrapper。 // 按 ASN 明细唯一标识落收货区,同一单据不同行不因物料/票号相同而合并成一行 LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new LambdaQueryWrapper<WarehouseAreasItem>() .eq(WarehouseAreasItem::getMatnrCode, orderItem.getMatnrCode()) .eq(!Cools.isEmpty(orderItem.getFieldsIndex()), WarehouseAreasItem::getFieldsIndex, orderItem.getFieldsIndex()) .eq(WarehouseAreasItem::getAsnCode, orderItem.getOrderCode()) .eq(StringUtils.isNotBlank(orderItem.getSplrBatch()), WarehouseAreasItem::getSplrBatch, orderItem.getSplrBatch()); if (Objects.isNull(orderItem.getIsptResult())) { queryWrapper.isNull(WarehouseAreasItem::getIsptResult); } else { queryWrapper.eq(WarehouseAreasItem::getIsptResult, orderItem.getIsptResult()); } .eq(WarehouseAreasItem::getAsnItemId, orderItem.getId()) .eq(WarehouseAreasItem::getAsnId, wkOrder.getId()); WarehouseAreasItem serviceOne = warehouseAreasItemService.getOne(queryWrapper); if (Objects.nonNull(serviceOne)) { item.setId(serviceOne.getId());