入库单明细上架数量,上架修改

This commit is contained in:
秦鸿展
2026-02-11 17:07:01 +08:00
parent 3d35fef0e8
commit 02a95d6095
5 changed files with 115 additions and 15 deletions
@@ -99,15 +99,10 @@ public class StockReceiptOrderApplicationService {
try { try {
AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
if (associationWarehouseCacheDO != null) { if (associationWarehouseCacheDO != null) {
if (associationWarehouseCacheDO.getWarehouseId() != null) { // 如果前端没有传仓库ID,则使用关联仓库ID;前端传了则以前端为准
if (stockReceiptOrderDO.getWarehouseId() == null && associationWarehouseCacheDO.getWarehouseId() != null) {
stockReceiptOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); stockReceiptOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId());
} }
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseCode())) {
stockReceiptOrderDO.setWarehouseCode(associationWarehouseCacheDO.getWarehouseCode());
}
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseName())) {
stockReceiptOrderDO.setWarehouseName(associationWarehouseCacheDO.getWarehouseName());
}
} }
} catch (Exception e) { } catch (Exception e) {
// 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库) // 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库)
@@ -105,15 +105,10 @@ public class StockShelfOrderApplicationService {
try { try {
AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid()); AssociationWarehouseCacheDO associationWarehouseCacheDO = SystemServiceCacheUtil.getAssociationWarehouseCache(loginUser.getUserid());
if (associationWarehouseCacheDO != null) { if (associationWarehouseCacheDO != null) {
if (associationWarehouseCacheDO.getWarehouseId() != null) { // 如果前端没有传仓库ID,则使用关联仓库ID;前端传了则以前端为准
if (stockShelfOrderDO.getWarehouseId() == null && associationWarehouseCacheDO.getWarehouseId() != null) {
stockShelfOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId()); stockShelfOrderDO.setWarehouseId(associationWarehouseCacheDO.getWarehouseId());
} }
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseCode())) {
stockShelfOrderDO.setWarehouseCode(associationWarehouseCacheDO.getWarehouseCode());
}
if (StringUtils.isNotBlank(associationWarehouseCacheDO.getWarehouseName())) {
stockShelfOrderDO.setWarehouseName(associationWarehouseCacheDO.getWarehouseName());
}
} }
} catch (Exception e) { } catch (Exception e) {
// 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库) // 如果获取仓库信息失败,记录日志但不影响查询(允许查询所有仓库)
@@ -22,6 +22,8 @@ import com.mhd.wms.domain.containerUsageRecord.repository.facade.IContainerUsage
import com.mhd.wms.domain.containerUsageRecord.repository.todo.ContainerUsageRecordDO; import com.mhd.wms.domain.containerUsageRecord.repository.todo.ContainerUsageRecordDO;
import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService; import com.mhd.wms.domain.deliveTask.repository.facade.IDeliveTaskService;
import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO; import com.mhd.wms.domain.deliveTask.repository.todo.DeliveTaskDO;
import com.mhd.wms.domain.inMaterialDetail.entity.InMaterialDetail;
import com.mhd.wms.domain.inMaterialDetail.repository.facade.IInMaterialDetailService;
import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.facade.IInMaterialDetailSerialNumberService; import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.facade.IInMaterialDetailSerialNumberService;
import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.po.InMaterialDetailSerialNumberPO; import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.po.InMaterialDetailSerialNumberPO;
import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.todo.InMaterialDetailSerialNumberDO; import com.mhd.wms.domain.inMaterialDetailSerialNumber.repository.todo.InMaterialDetailSerialNumberDO;
@@ -93,6 +95,8 @@ public class StockShelfOrderDomainService {
@Autowired @Autowired
private IMaterialBaseInfoService materialBaseInfoService; private IMaterialBaseInfoService materialBaseInfoService;
@Autowired @Autowired
private IInMaterialDetailService inMaterialDetailService;
@Autowired
private IInMaterialDetailSerialNumberService inMaterialDetailSerialNumberService; private IInMaterialDetailSerialNumberService inMaterialDetailSerialNumberService;
@Autowired @Autowired
private IStockInTaskOrderService stockInTaskOrderService; private IStockInTaskOrderService stockInTaskOrderService;
@@ -299,6 +303,8 @@ public class StockShelfOrderDomainService {
genContainerUsageRecord(stockShelfOrderDO); genContainerUsageRecord(stockShelfOrderDO);
//修改物料明细信息 //修改物料明细信息
shelfMaterialDetailService.batchShelfUpdate(stockShelfOrderDO); shelfMaterialDetailService.batchShelfUpdate(stockShelfOrderDO);
//同步更新入库单明细的上架数量/上架状态
syncShelvesQuantityToInMaterialDetail(stockShelfOrderDO);
//生成 上架作业单 //生成 上架作业单
genStockShelfTaskOrderByUpShelf(stockShelfOrderDO); genStockShelfTaskOrderByUpShelf(stockShelfOrderDO);
//修改入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库 //修改入库单状态: 1-已创建 2-已审核 3-收货中 4-上架中 5-已入库
@@ -309,6 +315,90 @@ public class StockShelfOrderDomainService {
return updateStockShelfOrder(stockShelfOrderDO, stockShelfOrderPO); return updateStockShelfOrder(stockShelfOrderDO, stockShelfOrderPO);
} }
/**
* @description 上架数量同步更新到入库单明细中(累计值)
* @author Auto
* @date 2026/2/11
*/
private void syncShelvesQuantityToInMaterialDetail(StockShelfOrderDO stockShelfOrderDO) {
List<ShelfMaterialDetailDO> detailDOList = stockShelfOrderDO.getMaterialDetailList();
if (CollectionUtils.isEmpty(detailDOList)) {
return;
}
LoginUser loginUser = SecurityUtils.getLoginUser();
// 收集所有需要同步的入库单明细 uniqueIdinUniqueId
Set<Long> inUniqueIdSet = new HashSet<>();
for (ShelfMaterialDetailDO d : detailDOList) {
// 只处理一级明细(子级是拆分库位的记录,不作为入库单明细的累计口径)
if (d.getLevel() != null && d.getLevel() == 2) {
continue;
}
if (d.getInUniqueId() != null) {
inUniqueIdSet.add(d.getInUniqueId());
}
}
if (inUniqueIdSet.isEmpty()) {
return;
}
// 从数据库查询所有相关的上架明细,按 inUniqueId 汇总本次上架数量(shelvesQuantity
// 这样可以确保即使一个入库单明细对应多个上架明细(多次上架),也能正确同步
Map<Long, BigDecimal> shelvesQuantityMap = new HashMap<>();
Map<Long, Integer> shelvesStatusMap = new HashMap<>();
for (Long inUniqueId : inUniqueIdSet) {
ShelfMaterialDetailDO queryDO = new ShelfMaterialDetailDO();
queryDO.setInUniqueId(inUniqueId);
queryDO.setLevel(1); // 只查询一级明细
List<ShelfMaterialDetailPO> shelfDetailPOList = shelfMaterialDetailService.queryList(queryDO);
if (!CollectionUtils.isEmpty(shelfDetailPOList)) {
BigDecimal totalShelvesQty = BigDecimal.ZERO;
Integer maxShelvesStatus = null;
for (ShelfMaterialDetailPO po : shelfDetailPOList) {
// 汇总本次上架数量(shelvesQuantity
BigDecimal shelvesQty = po.getShelvesQuantity();
if (shelvesQty != null && shelvesQty.compareTo(BigDecimal.ZERO) > 0) {
totalShelvesQty = totalShelvesQty.add(shelvesQty);
}
// 取最大的上架状态(3-已上架 > 2-上架中 > 1-待上架)
Integer status = po.getShelvesStatus();
if (status != null) {
if (maxShelvesStatus == null || status > maxShelvesStatus) {
maxShelvesStatus = status;
}
}
}
shelvesQuantityMap.put(inUniqueId, totalShelvesQty);
if (maxShelvesStatus != null) {
shelvesStatusMap.put(inUniqueId, maxShelvesStatus);
}
}
}
// 更新入库单明细的上架数量和上架状态
Date now = new Date();
for (Long inUniqueId : inUniqueIdSet) {
BigDecimal shelvesQty = shelvesQuantityMap.getOrDefault(inUniqueId, BigDecimal.ZERO);
Integer shelvesStatus = shelvesStatusMap.get(inUniqueId);
// 仅更新与上架相关字段
inMaterialDetailService.update(null, new UpdateWrapper<InMaterialDetail>().lambda()
.set(InMaterialDetail::getShelvesQuantity, shelvesQty)
.set(shelvesStatus != null, InMaterialDetail::getShelvesStatus, shelvesStatus)
.set(InMaterialDetail::getUpdateBy, loginUser.getUserid())
.set(InMaterialDetail::getUpdateByName, loginUser.getUsername())
.set(InMaterialDetail::getUpdateTime, now)
.eq(InMaterialDetail::getUniqueId, inUniqueId)
.eq(StringUtils.isNotBlank(stockShelfOrderDO.getInOrderNumber()), InMaterialDetail::getInOrderNumber, stockShelfOrderDO.getInOrderNumber())
);
}
}
/** /**
* @description 设置上架单上架需要更新的数据数据 * @description 设置上架单上架需要更新的数据数据
* @author ZhouGY * @author ZhouGY
@@ -313,4 +313,20 @@ public class ShelfMaterialDetailDTO extends BaseVOEntity {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") @Excel(name = "ExtAttr4", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
private Date extAttr4; private Date extAttr4;
@ApiModelProperty("总净重(KG)")
@Excel(name = "总净重(KG)")
private BigDecimal totalNetWeight;
@ApiModelProperty("总毛重(KG)")
@Excel(name = "总毛重(KG)")
private BigDecimal totalGrossWeight;
@ApiModelProperty("总体积(CBM)")
@Excel(name = "总体积(CBM)")
private BigDecimal totalVolume;
@ApiModelProperty("总面积(SQM)")
@Excel(name = "总面积(SQM)")
private BigDecimal totalArea;
} }
@@ -67,7 +67,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<sql id="selectShelfMaterialDetailPo"> <sql id="selectShelfMaterialDetailPo">
select material_detail_id, organization_id, organization_name, top_organization_id, unique_id, shelf_order_number, material_base_info_id, material_code, material_name, bar_code, quantity, already_shelves_quantity, shelves_quantity, shelves_status, pack_id, pack_code, pack_name, pack_detail_id, unit_code, unit_name, unit_number, material_warehouse_control_id, serial_number_manage, quality_inspection_manage, quality_inspection_stage, quality_inspection_rule, quality_inspection_ratio, quality_inspection_term, quality_inspection_results, allow_overcharge, overcharge_ratio, batch_number, material_status_code, material_status_name, distribute_rule_id, distribute_rule_code, distribute_rule_name, container_id, container_code, container_type, container_type_name, warehouse_id, warehouse_code, warehouse_name, storage_section_id, storage_code, storage_name, storage_location_id, storage_location_code, storage_location_name, level, parent_unique_id, in_unique_id, receipt_unique_id, allow_modify, remark, batch_ref_no, sheet_ref_no, box_pallet_no, ext_attr_1, ext_attr_2, production_date, expiry_date, inventory_date, ext_attr_3, ext_attr_4, create_time, create_by, create_by_name, update_time, update_by, update_by_name, del_flag,total_net_weight,total_gross_weight,total_volume,total_area from shelf_material_detail select material_detail_id, organization_id, organization_name, top_organization_id, unique_id, shelf_order_number, material_base_info_id, material_code, material_name, bar_code, quantity, already_shelves_quantity, shelves_quantity, shelves_status, pack_id, pack_code, pack_name,
CASE
WHEN pack_detail_id IS NULL OR TRIM(pack_detail_id) = '' THEN NULL
ELSE CAST(pack_detail_id AS BIGINT)
END as pack_detail_id, unit_code, unit_name, unit_number, material_warehouse_control_id, serial_number_manage, quality_inspection_manage, quality_inspection_stage, quality_inspection_rule, quality_inspection_ratio, quality_inspection_term, quality_inspection_results, allow_overcharge, overcharge_ratio, batch_number, material_status_code, material_status_name, distribute_rule_id, distribute_rule_code, distribute_rule_name, container_id, container_code, container_type, container_type_name, warehouse_id, warehouse_code, warehouse_name, storage_section_id, storage_code, storage_name, storage_location_id, storage_location_code, storage_location_name, level, parent_unique_id, in_unique_id, receipt_unique_id, allow_modify, remark, batch_ref_no, sheet_ref_no, box_pallet_no, ext_attr_1, ext_attr_2, production_date, expiry_date, inventory_date, ext_attr_3, ext_attr_4, create_time, create_by, create_by_name, update_time, update_by, update_by_name, del_flag,total_net_weight,total_gross_weight,total_volume,total_area from shelf_material_detail
</sql> </sql>
<sql id="selectShelfMaterialDetailPo1"> <sql id="selectShelfMaterialDetailPo1">