From 0738c939ae62ed98721b0d3c0c56e9153f28392a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A7=A6=E9=B8=BF=E5=B1=95?= <18031053041@163.com> Date: Tue, 27 Jan 2026 15:22:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=85=A5=E5=BA=93=E7=AE=A1=E7=90=86=E4=BF=AE?= =?UTF-8?q?=E6=94=B9bug1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StockInOrderApplicationService.java | 59 +++++++++++--- .../persistence/MaterialInventoryImpl.java | 76 ++++++++++++++++++- .../service/StockShelfOrderDomainService.java | 70 ++++++++++++++++- .../StockInOrderImportRowDTO.java | 3 + 4 files changed, 192 insertions(+), 16 deletions(-) diff --git a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java index 59c8600aa..5f43f739c 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/application/service/stockInOrder/StockInOrderApplicationService.java @@ -934,6 +934,10 @@ public class StockInOrderApplicationService { if (StringUtils.isNotBlank(headerInfo.getShipperName())) { row.setShipperName(headerInfo.getShipperName()); } + // 应用表头中的货主编号(表头有货主编号时,强制应用到所有明细行) + if (StringUtils.isNotBlank(headerInfo.getShipperCode())) { + row.setShipperCode(headerInfo.getShipperCode()); + } // 应用其他表头字段(如果明细行为空,则使用表头值) if (StringUtils.isBlank(row.getTo()) && StringUtils.isNotBlank(headerInfo.getTo())) { row.setTo(headerInfo.getTo()); @@ -1058,10 +1062,16 @@ public class StockInOrderApplicationService { order.setWarehouseId(warehouseId); // 设置仓库完整信息(warehouseCode 和 warehouseName) setWarehouseInfo(order); - // 货主ID不需要,直接设置为null,使用客户名称作为货主名称 + // 货主信息:优先使用表头,如果表头为空则使用明细行 + String shipperName = StringUtils.isNotBlank(headerInfo.getShipperName()) ? headerInfo.getShipperName() : h.getShipperName(); + String shipperCode = StringUtils.isNotBlank(headerInfo.getShipperCode()) ? headerInfo.getShipperCode() : h.getShipperCode(); + // 货主ID先设置为null,后续在shipperParam方法中根据名称或编号查找 order.setShipperId(null); - if (StringUtils.isNotBlank(h.getShipperName())) { - order.setShipperName(h.getShipperName()); + if (StringUtils.isNotBlank(shipperName)) { + order.setShipperName(shipperName); + } + if (StringUtils.isNotBlank(shipperCode)) { + order.setShipperCode(shipperCode); } // order.setSupplierId(h.getSupplierId()); // order.setOrderTypeCode(h.getOrderTypeCode()); @@ -1292,6 +1302,21 @@ public class StockInOrderApplicationService { } order.setMaterialDetailList(details); + + // 在导入时,需要调用shipperParam、supplierParam和setDataDict方法,确保货主信息被正确填充 + // 注意:这里只调用shipperParam,因为导入时只提供了货主名称,需要根据名称查找货主ID和编号 + try { + shipperParam(order); + } catch (Exception e) { + log.error("导入入库单时设置货主信息失败,委托编号NO:{},货主名称:{},错误:{}", + h.getConsignmentNo(), order.getShipperName(), e.getMessage()); + throw new ServiceException("导入失败:设置货主信息失败(委托编号NO=" + h.getConsignmentNo() + ",货主名称=" + order.getShipperName() + ")。" + e.getMessage()); + } + // 设置供应商信息(如果提供了供应商ID) + supplierParam(order); + // 设置数据字典键值 + setDataDict(order); + orderList.add(order); } @@ -1477,15 +1502,29 @@ public class StockInOrderApplicationService { for (Map shipper : shipperList) { Object userId = shipper.get("userId"); Object userName = shipper.get("userName"); - // 根据名称匹配 - if (StringUtils.isNotEmpty(shipperName) && + Object userCode = shipper.get("userCode"); + Object userMemberCode = shipper.get("userMemberCode"); + + boolean matched = false; + // 优先根据编号匹配(更准确) + if (StringUtils.isNotEmpty(shipperCode)) { + if ((userCode != null && shipperCode.equals(String.valueOf(userCode))) || + (userMemberCode != null && shipperCode.equals(String.valueOf(userMemberCode)))) { + matched = true; + } + } + // 如果编号不匹配,再根据名称匹配 + if (!matched && StringUtils.isNotEmpty(shipperName) && userName != null && shipperName.equals(String.valueOf(userName))) { - if (userId != null) { - shipperId = Long.valueOf(String.valueOf(userId)); - log.info("根据货主名称找到货主ID,货主名称:{},货主ID:{}", shipperName, shipperId); - break; - } + matched = true; + } + + if (matched && userId != null) { + shipperId = Long.valueOf(String.valueOf(userId)); + log.info("根据货主信息找到货主ID,货主名称:{},货主编号:{},货主ID:{}", + shipperName, shipperCode, shipperId); + break; } } } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java index 93bb64ce4..51bf321b4 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/materialInventory/repository/persistence/MaterialInventoryImpl.java @@ -14,6 +14,9 @@ import com.mhd.wms.domain.materialInventory.repository.po.MaterialInventoryQuery import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryParentDO; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryQueryListDO; +import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService; +import com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO; +import com.mhd.wms.domain.materialBaseInfo.repository.todo.MaterialBaseInfoDO; import com.mhd.wms.domain.statementStatistics.po.ImmediateInventoryPO; import com.mhd.wms.domain.statementStatistics.todo.ImmediateInventoryDO; import org.springframework.beans.BeanUtils; @@ -24,6 +27,7 @@ import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.*; +import java.util.stream.Collectors; /** * 物料库存Service业务层处理 @@ -35,6 +39,8 @@ import java.util.*; public class MaterialInventoryImpl extends ServiceImpl implements IMaterialInventoryService{ @Autowired private MaterialInventoryMapper materialInventoryMapper; + @Autowired + private IMaterialBaseInfoService materialBaseInfoService; /** * 查询物料库存列表 @@ -136,16 +142,80 @@ public class MaterialInventoryImpl extends ServiceImpl materialInventoryList = new ArrayList<>(); List materialInventoryDOListByUpdate = new ArrayList<>(); Map materialInventoryAddNowMap = new HashMap<>(); + + // 批量获取物料基础信息,以获取货主ID(用于查询和key生成) + Map materialBaseInfoIdToShipperIdMap = new HashMap<>(); + if (!CollectionUtils.isEmpty(materialInventoryDOList)) { + Set materialBaseInfoIds = new HashSet<>(); + for (MaterialInventoryDO materialInventoryDO : materialInventoryDOList) { + if (materialInventoryDO.getMaterialBaseInfoId() != null) { + materialBaseInfoIds.add(materialInventoryDO.getMaterialBaseInfoId()); + } + } + // 批量查询物料基础信息,获取货主ID + for (Long materialBaseInfoId : materialBaseInfoIds) { + try { + MaterialBaseInfoDO materialBaseInfoDO = new MaterialBaseInfoDO(); + materialBaseInfoDO.setMaterialBaseInfoId(materialBaseInfoId); + List materialBaseInfoList = materialBaseInfoService.queryList(materialBaseInfoDO); + if (!CollectionUtils.isEmpty(materialBaseInfoList)) { + MaterialBaseInfoPO materialBaseInfoPO = materialBaseInfoList.get(0); + if (materialBaseInfoPO.getShipperId() != null) { + materialBaseInfoIdToShipperIdMap.put(materialBaseInfoId, materialBaseInfoPO.getShipperId()); + } + } + } catch (Exception e) { + // 如果查询失败,记录日志但继续处理 + // log.warn("查询物料基础信息失败,物料基础信息ID:{},错误:{}", materialBaseInfoId, e.getMessage()); + } + } + } + for (MaterialInventoryDO materialInventoryDO : materialInventoryDOList) { + // 获取货主ID(优先使用materialInventoryDO中的,如果没有则从物料基础信息中获取) + Long shipperId = materialInventoryDO.getShipperId(); + if (shipperId == null && materialInventoryDO.getMaterialBaseInfoId() != null) { + shipperId = materialBaseInfoIdToShipperIdMap.get(materialInventoryDO.getMaterialBaseInfoId()); + } + //TODO 若数据量升级 后期优化 + // 查询现有库存时,需要通过关联查询包含货主ID条件 + // 由于MaterialInventory实体没有shipperId字段,我们需要通过materialBaseInfoId来间接查询 + // 如果materialInventoryDO中有shipperId,我们需要确保查询到的库存记录的物料基础信息对应的货主ID匹配 MaterialInventory materialInventoryDb = materialInventoryMapper.selectOne(new QueryWrapper().lambda() .eq(MaterialInventory::getStorageSectionId, materialInventoryDO.getStorageSectionId()) .eq(MaterialInventory::getMaterialBaseInfoId, materialInventoryDO.getMaterialBaseInfoId()) .eq(MaterialInventory::getBatchNumber, materialInventoryDO.getBatchNumber()) - .eq(MaterialInventory::getContainerId, materialInventoryDO.getContainerId())); + .eq(MaterialInventory::getContainerId, materialInventoryDO.getContainerId()) + .eq(MaterialInventory::getDelFlag, 1)); + + // 如果查询到了库存记录,需要验证货主ID是否匹配 + if (ObjectUtil.isNotNull(materialInventoryDb) && shipperId != null) { + // 验证查询到的库存记录对应的物料基础信息的货主ID是否匹配 + try { + MaterialBaseInfoDO materialBaseInfoDO = new MaterialBaseInfoDO(); + materialBaseInfoDO.setMaterialBaseInfoId(materialInventoryDb.getMaterialBaseInfoId()); + List materialBaseInfoList = materialBaseInfoService.queryList(materialBaseInfoDO); + if (!CollectionUtils.isEmpty(materialBaseInfoList)) { + MaterialBaseInfoPO materialBaseInfoPO = materialBaseInfoList.get(0); + // 如果货主ID不匹配,说明这是不同货主的库存,应该创建新记录 + if (materialBaseInfoPO.getShipperId() == null || !materialBaseInfoPO.getShipperId().equals(shipperId)) { + materialInventoryDb = null; // 设置为null,后续会创建新记录 + } + } + } catch (Exception e) { + // 如果验证失败,记录日志但继续处理(创建新记录) + // log.warn("验证库存记录货主ID失败,物料基础信息ID:{},错误:{}", materialInventoryDb.getMaterialBaseInfoId(), e.getMessage()); + } + } + if (ObjectUtil.isNull(materialInventoryDb)){ - String key = materialInventoryDO.getStorageLocationId() + "_" + materialInventoryDO.getMaterialBaseInfoId() - + "_" + materialInventoryDO.getBatchNumber() + "_" + materialInventoryDO.getMaterialStatusCode(); + // 生成key时包含货主ID,确保不同货主的库存不会合并 + String key = (shipperId != null ? shipperId : "null") + "_" + + materialInventoryDO.getStorageLocationId() + "_" + + materialInventoryDO.getMaterialBaseInfoId() + + "_" + materialInventoryDO.getBatchNumber() + "_" + + materialInventoryDO.getMaterialStatusCode(); if (ObjectUtil.isNotNull(materialInventoryDO.getContainerId())){ key = key + "_" + materialInventoryDO.getContainerId(); } diff --git a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java index 264c9da99..32a8a61fe 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java +++ b/mhd_wms/src/main/java/com/mhd/wms/domain/stockShelfOrder/service/StockShelfOrderDomainService.java @@ -29,6 +29,7 @@ import com.mhd.wms.domain.inOrderAbnormal.repository.facade.IInOrderAbnormalServ import com.mhd.wms.domain.inOrderAbnormal.repository.todo.InOrderAbnormalBaseDO; import com.mhd.wms.domain.inventoryStandingDetail.repository.facade.IInventoryStandingDetailService; import com.mhd.wms.domain.inventoryStandingDetail.repository.todo.InventoryStandingDetailDO; +import com.mhd.wms.domain.materialBaseInfo.repository.facade.IMaterialBaseInfoService; import com.mhd.wms.domain.materialInventory.entity.MaterialInventory; import com.mhd.wms.domain.materialInventory.repository.facade.IMaterialInventoryService; import com.mhd.wms.domain.materialInventory.repository.todo.MaterialInventoryDO; @@ -80,6 +81,8 @@ public class StockShelfOrderDomainService { @Autowired private IMaterialInventoryService materialInventoryService; @Autowired + private IMaterialBaseInfoService materialBaseInfoService; + @Autowired private IInMaterialDetailSerialNumberService inMaterialDetailSerialNumberService; @Autowired private IStockInTaskOrderService stockInTaskOrderService; @@ -372,8 +375,8 @@ public class StockShelfOrderDomainService { updateStockInOrder(stockShelfOrderPO, 5); //上架修改物料库存 List shelfMaterialDetailList = shelfMaterialDetailService.list(new QueryWrapper().lambda().eq(ShelfMaterialDetail::getShelfOrderNumber, stockShelfOrderPO.getShelfOrderNumber())); - //组装上架修改库存参数 - shelfAddMaterialInventory(shelfMaterialDetailList); + //组装上架修改库存参数(传入上架单信息,用于获取货主信息) + shelfAddMaterialInventory(shelfMaterialDetailList, stockShelfOrderPO); //修改上架对应的序列号的库存信息 updateSerialNumberforInventory(shelfMaterialDetailList); //生成上架追溯记录 @@ -408,9 +411,58 @@ public class StockShelfOrderDomainService { * @author ZhouGY * @date 2024/6/19 10:07 * @param shelfMaterialDetailList + * @param stockShelfOrderPO 上架单信息,用于获取货主信息 * @return Boolean */ - public void shelfAddMaterialInventory(List shelfMaterialDetailList){ + public void shelfAddMaterialInventory(List shelfMaterialDetailList, StockShelfOrderPO stockShelfOrderPO){ + // 根据入库单号获取入库单信息,以获取货主信息 + Long shipperId = null; + String shipperCode = null; + String shipperName = null; + + if (stockShelfOrderPO != null && StringUtils.isNotBlank(stockShelfOrderPO.getInOrderNumber())) { + try { + // 根据入库单号查询入库单 + com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO stockInOrderDO = new com.mhd.wms.domain.stockInOrder.repository.todo.StockInOrderDO(); + stockInOrderDO.setInOrderNumber(stockShelfOrderPO.getInOrderNumber()); + List stockInOrderList = stockInOrderService.queryList(stockInOrderDO); + if (!CollectionUtils.isEmpty(stockInOrderList)) { + com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO stockInOrderPO = stockInOrderList.get(0); + shipperId = stockInOrderPO.getShipperId(); + shipperCode = stockInOrderPO.getShipperCode(); + shipperName = stockInOrderPO.getShipperName(); + } + } catch (Exception e) { + log.warn("根据入库单号获取货主信息失败,入库单号:{},错误:{}", stockShelfOrderPO.getInOrderNumber(), e.getMessage()); + } + } + + // 如果从入库单获取不到货主信息,尝试从物料基础信息获取 + if (shipperId == null && !CollectionUtils.isEmpty(shelfMaterialDetailList)) { + ShelfMaterialDetail firstDetail = shelfMaterialDetailList.get(0); + if (firstDetail.getMaterialBaseInfoId() != null) { + try { + com.mhd.wms.domain.materialBaseInfo.repository.todo.MaterialBaseInfoDO materialBaseInfoDO = new com.mhd.wms.domain.materialBaseInfo.repository.todo.MaterialBaseInfoDO(); + materialBaseInfoDO.setMaterialBaseInfoId(firstDetail.getMaterialBaseInfoId()); + List materialBaseInfoList = materialBaseInfoService.queryList(materialBaseInfoDO); + if (!CollectionUtils.isEmpty(materialBaseInfoList)) { + com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO materialBaseInfoPO = materialBaseInfoList.get(0); + shipperId = materialBaseInfoPO.getShipperId(); + shipperCode = materialBaseInfoPO.getShipperCode(); + shipperName = materialBaseInfoPO.getShipperName(); + } + } catch (Exception e) { + log.warn("根据物料基础信息获取货主信息失败,物料基础信息ID:{},错误:{}", firstDetail.getMaterialBaseInfoId(), e.getMessage()); + } + } + } + + if (shipperId == null) { + log.warn("上架时无法获取货主信息,上架单号:{},入库单号:{},将跳过货主信息设置", + stockShelfOrderPO != null ? stockShelfOrderPO.getShelfOrderNumber() : null, + stockShelfOrderPO != null ? stockShelfOrderPO.getInOrderNumber() : null); + } + List materialInventoryDOList = new ArrayList<>(); for (ShelfMaterialDetail shelfMaterialDetail : shelfMaterialDetailList){ // 使用shelvesQuantity(本次上架数量)来增加库存 @@ -430,6 +482,18 @@ public class StockShelfOrderDomainService { BeanUtils.copyProperties(shelfMaterialDetail, materialInventoryDO); materialInventoryDO.setInventoryQuantity(shelvesQuantity); materialInventoryDO.setAllocationQuantity(shelvesQuantity); + + // 设置货主信息(从入库单或物料基础信息获取) + if (shipperId != null) { + materialInventoryDO.setShipperId(shipperId); + if (StringUtils.isNotBlank(shipperCode)) { + materialInventoryDO.setShipperCode(shipperCode); + } + if (StringUtils.isNotBlank(shipperName)) { + materialInventoryDO.setShipperName(shipperName); + } + } + materialInventoryDOList.add(materialInventoryDO); } if (!CollectionUtils.isEmpty(materialInventoryDOList)) { diff --git a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderImportRowDTO.java b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderImportRowDTO.java index ec470acd3..c11526919 100644 --- a/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderImportRowDTO.java +++ b/mhd_wms/src/main/java/com/mhd/wms/interfaces/dto/stockInOrder/StockInOrderImportRowDTO.java @@ -20,6 +20,9 @@ public class StockInOrderImportRowDTO { // @Excel(name = "货主ID") // private Long shipperId; + @Excel(name = "货主编号") + private String shipperCode; + // @Excel(name = "供应商ID") // private Long supplierId;