入库管理修改bug1

This commit is contained in:
秦鸿展
2026-01-27 15:22:42 +08:00
parent da34a284d2
commit 0738c939ae
4 changed files with 192 additions and 16 deletions
@@ -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<String, Object> 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;
}
}
}
@@ -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<MaterialInventoryMapper, MaterialInventory> implements IMaterialInventoryService{
@Autowired
private MaterialInventoryMapper materialInventoryMapper;
@Autowired
private IMaterialBaseInfoService materialBaseInfoService;
/**
* 查询物料库存列表
@@ -136,16 +142,80 @@ public class MaterialInventoryImpl extends ServiceImpl<MaterialInventoryMapper,
List<MaterialInventory> materialInventoryList = new ArrayList<>();
List<MaterialInventoryDO> materialInventoryDOListByUpdate = new ArrayList<>();
Map<String, MaterialInventory> materialInventoryAddNowMap = new HashMap<>();
// 批量获取物料基础信息以获取货主ID用于查询和key生成
Map<Long, Long> materialBaseInfoIdToShipperIdMap = new HashMap<>();
if (!CollectionUtils.isEmpty(materialInventoryDOList)) {
Set<Long> 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<MaterialBaseInfoPO> 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<MaterialInventory>().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<MaterialBaseInfoPO> 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();
}
@@ -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<ShelfMaterialDetail> shelfMaterialDetailList = shelfMaterialDetailService.list(new QueryWrapper<ShelfMaterialDetail>().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<ShelfMaterialDetail> shelfMaterialDetailList){
public void shelfAddMaterialInventory(List<ShelfMaterialDetail> 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<com.mhd.wms.domain.stockInOrder.repository.po.StockInOrderPO> 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<com.mhd.wms.domain.materialBaseInfo.repository.po.MaterialBaseInfoPO> 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<MaterialInventoryDO> 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)) {
@@ -20,6 +20,9 @@ public class StockInOrderImportRowDTO {
// @Excel(name = "货主ID")
// private Long shipperId;
@Excel(name = "货主编号")
private String shipperCode;
// @Excel(name = "供应商ID")
// private Long supplierId;