From 0f5ad5b289438efa47c74f6be51d905771ecbd26 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Mon, 1 Sep 2025 17:00:55 +0800 Subject: [PATCH] =?UTF-8?q?2025-09-01=20pda=20=E8=B7=A8=E5=8C=BA=E8=B0=83?= =?UTF-8?q?=E6=8B=A8=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/CrossAreaTransferServiceImpl.java | 149 ++++++++++++++---- 1 file changed, 114 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/gaotao/modules/crossAreaTransfer/service/impl/CrossAreaTransferServiceImpl.java b/src/main/java/com/gaotao/modules/crossAreaTransfer/service/impl/CrossAreaTransferServiceImpl.java index cd0aa17..9a55087 100644 --- a/src/main/java/com/gaotao/modules/crossAreaTransfer/service/impl/CrossAreaTransferServiceImpl.java +++ b/src/main/java/com/gaotao/modules/crossAreaTransfer/service/impl/CrossAreaTransferServiceImpl.java @@ -7,8 +7,10 @@ import com.gaotao.modules.crossAreaTransfer.service.CrossAreaTransferService; import com.gaotao.modules.inboundNotification.dao.InboundNotificationHeadMapper; import com.gaotao.modules.trans.entity.TransDetail; import com.gaotao.modules.trans.entity.TransDetailDto; +import com.gaotao.modules.trans.entity.TransDetailSub; import com.gaotao.modules.trans.entity.TransHeader; import com.gaotao.modules.trans.service.TransDetailService; +import com.gaotao.modules.trans.service.TransDetailSubService; import com.gaotao.modules.trans.service.TransHeaderService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,6 +48,9 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl getTransferInfo(Map params) { logger.info("获取跨区调拨信息,参数: {}", params); @@ -130,12 +135,10 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl> stockInfoList = new ArrayList<>(); if ("label".equals(transferMode)) { @@ -155,18 +158,14 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl updateParams = new HashMap<>(); updateParams.put("site", site); updateParams.put("sourceLocation", sourceLocation); updateParams.put("targetLocation", targetLocation); - updateParams.put("targetWarehouseId", warehouseId); // 目标仓库ID + updateParams.put("targetWarehouseId", targetWarehouseId); // 目标仓库ID updateParams.put("operator", operator); updateParams.put("updateTime", new Date()); @@ -186,7 +185,7 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl> stockInfoList) { + private void generateTransferTransaction(String site, String sourceLocation, String warehouseId, String targetLocation, String targetWarehouseId, + String scanCode, String transferMode, String buNo, List> stockInfoList) { logger.info("开始生成跨区调拨事务记录,扫描码: {}", scanCode); try { @@ -209,24 +209,23 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl transDetailList = generateTransactionDetails(transHeader.getTransno(), stockInfoList, site, buNo, sourceLocation, warehouseId, targetLocation, targetWarehouseId); + logger.info("跨区调拨事务记录生成完成,事务单号: {}, 扫描码: {}, 明细记录数: {}", transHeader.getTransno(), scanCode, stockInfoList.size()); - logger.info("跨区调拨事务记录生成完成,事务单号: {}, 扫描码: {}, 明细记录数: {}", - transHeader.getTransno(), scanCode, stockInfoList.size()); + // 生成事务子明细记录 + addSubTransactionDetails(transHeader.getTransno(), stockInfoList, site, buNo, sourceLocation, warehouseId, targetLocation, targetWarehouseId, transDetailList); + logger.info("跨区调拨事务子记录生成完成,事务单号: {}", transHeader.getTransno()); } catch (Exception e) { logger.error("生成跨区调拨事务记录失败", e); @@ -237,37 +236,54 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl> stockInfoList, String site) { + private List generateTransactionDetails(String transNo, List> stockInfoList, String site, String buNo, + String sourceLocation, String warehouseId, String targetLocation, String targetWarehouseId) { logger.info("开始生成跨区调拨事务明细记录,事务单号: {}, 明细数量: {}", transNo, stockInfoList.size()); - List transDetailList = new ArrayList<>(); - double itemNo = 1.0; // 行号从1开始 - - for (Map stockInfo : stockInfoList) { - String labelCode = (String) stockInfo.get("label_code"); - String partNo = (String) stockInfo.get("part_no"); - String batchNo = (String) stockInfo.get("batch_no"); - Object quantityObj = stockInfo.get("quantity"); - // 转换数量 - BigDecimal quantity = convertToDecimal(quantityObj); + // 统计每个partNo的数量总和 + Map partNoQuantityMap = new HashMap<>(); + for (Map label : stockInfoList) { + String partNo = (String) label.get("partNo"); + Object quantityObj = label.get("quantity"); + BigDecimal quantity = BigDecimal.ZERO; + if (quantityObj != null) { + if (quantityObj instanceof BigDecimal) { + quantity = (BigDecimal) quantityObj; + } else if (quantityObj instanceof Number) { + quantity = new BigDecimal(quantityObj.toString()); + } else { + quantity = new BigDecimal(quantityObj.toString()); + } + } + partNoQuantityMap.put(partNo, partNoQuantityMap.getOrDefault(partNo, BigDecimal.ZERO).add(quantity)); + } + for (Map.Entry entry : partNoQuantityMap.entrySet()) { + String partNo = entry.getKey(); + BigDecimal quantity = entry.getValue(); // 构建事务明细记录 TransDetail transDetail = new TransDetail(); transDetail.setSite(site); transDetail.setTransno(transNo); - transDetail.setItemno(itemNo); + transDetail.setItemno(1.0); transDetail.setPartno(partNo); transDetail.setTransqty(quantity); - transDetail.setBatchno(batchNo); transDetail.setDirection("-"); // 调拨方向 - transDetail.setOrderref1(labelCode); // 标签条码 - transDetail.setOrderref2(partNo); // 物料编码 - transDetail.setOrderref3(batchNo); // 批次号 - transDetail.setRemark("跨区调拨 - 标签: " + labelCode); - + transDetail.setOrderref2(buNo); // bu + transDetail.setRemark("跨区调拨出库"); transDetailList.add(transDetail); - itemNo += 1.0; // 行号递增 + + TransDetail newTransDetail = new TransDetail(); + newTransDetail.setSite(site); + newTransDetail.setTransno(transNo); + newTransDetail.setItemno(2.0); + newTransDetail.setPartno(partNo); + newTransDetail.setTransqty(quantity); + newTransDetail.setDirection("+"); // 调拨方向 + newTransDetail.setOrderref2(buNo); // bu + newTransDetail.setRemark("跨区调拨入库"); + transDetailList.add(newTransDetail); } // 批量保存事务明细记录 @@ -278,6 +294,69 @@ public class CrossAreaTransferServiceImpl extends ServiceImpl> stockInfoList, String site, String buNo, + String sourceLocation, String warehouseId, String targetLocation, String targetWarehouseId, List transDetailList) { + logger.info("开始添加子明细数据,事务单号: {}", transNo); + + // 创建 partNo 到 itemNo 的映射 + Map partNoToItemNoMap = new HashMap<>(); + for (TransDetail detail : transDetailList) { + partNoToItemNoMap.put(detail.getPartno(), detail.getItemno()); + } + + List subDetailList = new ArrayList<>(); + for (Map label : stockInfoList) { + String partNo = (String) label.get("partNo"); + String labelCode = (String) label.get("labelCode"); // subNo + String batchNo = (String) label.get("batchNo"); // orderRef3 + Object quantityObj = label.get("quantity"); // 标签数量 + Double quantity = quantityObj == null ? 0.0 : Double.parseDouble(quantityObj.toString()); + // 获取对应的明细 itemNo + Double itemNo = partNoToItemNoMap.get(partNo); + if (itemNo == null) { + logger.warn("未找到物料 {} 对应的明细记录,跳过该标签 {}", partNo, labelCode); + continue; + } + + TransDetailSub transDetail = new TransDetailSub(); + transDetail.setSite(site); + transDetail.setTransNo(transNo); + transDetail.setItemNo(itemNo); // 使用明细的 itemNo + transDetail.setSubNo(labelCode); + transDetail.setSubQty(quantity); + transDetail.setDirection("-"); + transDetail.setOrderRef2(buNo); + transDetail.setOrderRef3(batchNo); + transDetail.setOrderRef4(warehouseId); + transDetail.setOrderRef5(sourceLocation); + subDetailList.add(transDetail); + + TransDetailSub newSubDetail = new TransDetailSub(); + newSubDetail.setSite(site); + newSubDetail.setTransNo(transNo); + newSubDetail.setItemNo(2.0); + newSubDetail.setSubNo(labelCode); + newSubDetail.setSubQty(quantity); + newSubDetail.setDirection("+"); + newSubDetail.setOrderRef2(buNo); + newSubDetail.setOrderRef3(batchNo); + newSubDetail.setOrderRef4(targetWarehouseId); + newSubDetail.setOrderRef5(targetLocation); + subDetailList.add(newSubDetail); + } + + // 批量保存子明细记录 + boolean success = transDetailSubService.saveBatch(subDetailList); + if (!success) { + throw new RuntimeException("子明细记录保存失败"); + } + logger.info("子明细记录生成成功,共生成 {} 条子明细记录", subDetailList.size()); } /**