feat(oms,wms): 出库全链路物料明细/单头增加库存锁定模式字段(存储+回显)

- 出库业务单明细/执行单明细/WMS出库明细/拣货明细/复核明细新增stockLockMode; 业务单单头新增JSON数组字段、执行单单头新增单值字段
- 下单/编辑时按明细行仓库实时判定(1-下单冻结 2-分配库存冻结默认), 下发后沿 执行单→WMS推单→拣货→复核 逐级复制继承, 交接单回显内存组装
- 业务单单头JSON两段式: 下单按仓写入(无执行单号), 下发覆盖为执行单级(带CK执行单号)
- WMS自建/通知/调拨单明细固定2; TZPD外部推入/老预约单下发路径固定2
- 达梦SQL脚本(OMS库4表+WMS库3表), 明细列DEFAULT 2存量自动回填
This commit is contained in:
rcx
2026-09-15 09:30:54 +08:00
parent 50423b4e4b
commit be5e3fc5ee
34 changed files with 259 additions and 7 deletions
@@ -222,6 +222,8 @@ public class HandoverTaskOrderDomainService {
}
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
detail.setMaterialDetailId(omd.getMaterialDetailId());
// 库存锁定模式:回显取自出库单明细
detail.setStockLockMode(omd.getStockLockMode());
detail.setUniqueId(omd.getUniqueId());
detail.setTaskNumber(handoverTaskOrderPO.getTaskNumber());
detail.setOrganizationId(omd.getOrganizationId());
@@ -306,6 +308,8 @@ public class HandoverTaskOrderDomainService {
}
TaskHandoverMaterialDetailPO detail = new TaskHandoverMaterialDetailPO();
detail.setMaterialDetailId(omd.getMaterialDetailId());
// 库存锁定模式:回显取自出库单明细
detail.setStockLockMode(omd.getStockLockMode());
detail.setUniqueId(omd.getUniqueId());
detail.setTaskNumber(handoverTaskOrderPO.getTaskNumber());
detail.setOrganizationId(omd.getOrganizationId());
@@ -170,6 +170,9 @@ public class OutMaterialDetail extends BaseVOEntity {
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认), OMS推单复制/WMS自建为2")
private Integer stockLockMode;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@@ -228,6 +228,11 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
outMaterialDetail.setCreateByName(userRealName);
outMaterialDetail.setCreateTime(new Date());
outMaterialDetail.setQuantity(outMaterialDetail.getOutboundQuantity());
// 库存锁定模式:WMS自建/通知/调拨单不参与下单冻结,明细固定 2-分配库存冻结
// OMS推单走 omsOrderAddDetail 直存 saveBatch 不经此处,其值随推送携带,互不影响)
if (outMaterialDetail.getStockLockMode() == null) {
outMaterialDetail.setStockLockMode(2);
}
String materialNo = outMaterialDetail.getMaterialNo();
List<MaterialBaseInfo> materialBaseInfos = materialBaseInfoMapper.selectList(new QueryWrapper<MaterialBaseInfo>().lambda().eq(MaterialBaseInfo::getMaterialCode, materialNo));
if (!CollectionUtils.isEmpty(materialBaseInfos) && materialBaseInfos.size() > 0) {
@@ -282,6 +287,10 @@ public class OutMaterialDetailImpl extends ServiceImpl<OutMaterialDetailMapper,
outMaterialDetail.setOrganizationId(outMaterialDetailBaseDO.getOrganizationId());
outMaterialDetail.setOrganizationName(outMaterialDetailBaseDO.getOrganizationName());
outMaterialDetail.setTopOrganizationId(outMaterialDetailBaseDO.getTopOrganizationId());
// 编辑时新增行:未显式带值的固定 2-分配库存冻结(已存行不受影响,updateById 忽略 null
if (outMaterialDetail.getStockLockMode() == null) {
outMaterialDetail.setStockLockMode(2);
}
}else {
BeanUtils.copyProperties(outMaterialDetailDO, outMaterialDetail);
outMaterialDetail.setUpdateBy(loginUser.getUserid());
@@ -184,6 +184,9 @@ public class OutMaterialDetailPO extends StockOutOrderBaseDO {
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认)")
private Integer stockLockMode;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@@ -174,6 +174,9 @@ public class OutMaterialDetailDO extends BaseVOEntity {
@ApiModelProperty("分配仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认)")
private Integer stockLockMode;
@ApiModelProperty("分配仓库编码")
@Excel(name = "分配仓库编码")
private String warehouseCode;
@@ -161,6 +161,9 @@ public class PickingMaterialDetail extends BaseVOEntity {
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认), 生成时从出库单明细复制")
private Integer stockLockMode;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@@ -170,6 +170,9 @@ public class PickingMaterialDetailPO extends BaseVOEntity {
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认)")
private Integer stockLockMode;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@@ -158,6 +158,9 @@ public class PickingMaterialDetailDO extends BaseVOEntity {
@Excel(name = "仓库id")
private Long warehouseId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认)")
private Integer stockLockMode;
@ApiModelProperty("仓库编码")
@Excel(name = "仓库编码")
private String warehouseCode;
@@ -206,6 +206,8 @@ public class ReviewOrderDomainService {
d.setReviewOrderId(reviewOrderId);
d.setReviewOrderNumber(reviewOrderNumber);
d.setOutOrderNumber(outOrderNumber);
// 库存锁定模式:随拣货明细取值(拣货行未带出时从出库明细兜底)
d.setStockLockMode(line.getStockLockMode());
d.setOutUniqueId(line.getOutUniqueId());
d.setMaterialBaseInfoId(line.getMaterialBaseInfoId());
d.setMaterialCode(line.getMaterialCode());
@@ -265,6 +267,10 @@ public class ReviewOrderDomainService {
}
if (outMd != null) {
d.setMaterialDetailId(outMd.getMaterialDetailId());
// 库存锁定模式:拣货明细行未带出时,从出库明细兜底
if (d.getStockLockMode() == null) {
d.setStockLockMode(outMd.getStockLockMode());
}
// 物料编码/名称:拣货明细行若未落库或未映射出值,从出库明细兜底(避免复核单、复核作业任务明细为空)
if (!StringUtils.hasText(d.getMaterialCode())) {
d.setMaterialCode(outMd.getMaterialCode());
@@ -30,6 +30,9 @@ public class ReviewMaterialDetail extends BaseVOEntity {
private String outOrderNumber;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认), 生成时从拣货明细取值")
private Integer stockLockMode;
private Long outUniqueId;
private Long materialDetailId;
@@ -31,6 +31,9 @@ public class ReviewMaterialDetailPO extends BaseVOEntity {
@ApiModelProperty("出库单号")
private String outOrderNumber;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认)")
private Integer stockLockMode;
@ApiModelProperty("出库明细 unique_id")
private Long outUniqueId;
@@ -26,6 +26,9 @@ public class TaskHandoverMaterialDetailPO extends BaseVOEntity {
@ApiModelProperty("出库单物料明细id")
private Long materialDetailId;
@ApiModelProperty("库存锁定模式: 1-下单冻结 2-分配库存冻结(默认), 回显时取自出库单明细")
private Integer stockLockMode;
@ApiModelProperty("组织表ID")
@Excel(name = "组织表ID")
private Long organizationId;
@@ -32,6 +32,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="serialNumberManage" column="serial_number_manage" />
<result property="materialInventoryId" column="material_inventory_id" />
<result property="warehouseId" column="warehouse_id" />
<result property="stockLockMode" column="stock_lock_mode" />
<result property="warehouseCode" column="warehouse_code" />
<result property="warehouseName" column="warehouse_name" />
<result property="storageSectionId" column="storage_section_id" />
@@ -125,7 +126,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.material_detail_id, a.organization_id, a.organization_name, a.top_organization_id, a.unique_id, a.out_order_number, a.material_base_info_id, a.line_number, a.material_code, a.material_name, a.bar_code, a.weight_limit, a.volume_limit,
a.quantity, a.already_allocation_quantity, a.allocation_quantity, a.picking_quantity, a.check_quantity, ROUND(GREATEST(0, IFNULL(a.quantity, 0) - IFNULL(a.check_quantity, 0), IFNULL(a.picking_quantity, 0) - IFNULL(a.check_quantity, 0)), 2) AS wait_check_quantity,
a.pack_id, a.pack_code, a.pack_name, a.pack_detail_id, a.unit_code, a.unit_name, a.material_warehouse_control_id, a.serial_number_manage,
a.warehouse_id, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name, a.storage_location_id, a.storage_location_code, a.storage_location_name, a.level, a.parent_unique_id, a.allow_modify,
a.warehouse_id, a.stock_lock_mode, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name, a.storage_location_id, a.storage_location_code, a.storage_location_name, a.level, a.parent_unique_id, a.allow_modify,
a.material_inventory_id, a.batch_number, a.container_id, a.container_code, a.container_type, a.container_type_name, a.material_status_code, a.material_status_name,
a.remark, a.create_time, a.create_by,gen_picking_order,
a.create_by_name, a.update_time, a.update_by, a.update_by_name, a.del_flag, a.over_stock_id, a.over_stock_status, a.over_stock_type,
@@ -31,6 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="materialWarehouseControlId" column="material_warehouse_control_id" />
<result property="serialNumberManage" column="serial_number_manage" />
<result property="warehouseId" column="warehouse_id" />
<result property="stockLockMode" column="stock_lock_mode" />
<result property="warehouseCode" column="warehouse_code" />
<result property="warehouseName" column="warehouse_name" />
<result property="storageSectionId" column="storage_section_id" />
@@ -91,7 +92,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.volume_limit, a.quantity, a.picking_quantity, a.pack_id, a.pack_code, a.pack_name,
a.pack_detail_id, a.unit_code, a.unit_name, a.material_warehouse_control_id, a.serial_number_manage,
a.material_inventory_id, a.batch_number, a.container_id, a.container_code, a.container_type, a.container_type_name, a.material_status_code, a.material_status_name,
a.warehouse_id, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name,
a.warehouse_id, a.stock_lock_mode, a.warehouse_code, a.warehouse_name, a.storage_section_id, a.storage_code, a.storage_name,
a.storage_location_id, a.storage_location_code, a.storage_location_name, a.remark,
a.BATCH_REF_NO, a.SHEET_REF_NO, a.BOX_PALLET_NO, a.EXT_ATTR_1, a.EXT_ATTR_2,
a.PRODUCTION_DATE, a.EXPIRY_DATE, a.INVENTORY_DATE, a.EXT_ATTR_3, a.EXT_ATTR_4,
@@ -43,6 +43,7 @@
<result property="reviewOrderId" column="review_order_id"/>
<result property="reviewOrderNumber" column="review_order_number"/>
<result property="outOrderNumber" column="out_order_number"/>
<result property="stockLockMode" column="stock_lock_mode"/>
<result property="outUniqueId" column="out_unique_id"/>
<result property="materialDetailId" column="material_detail_id"/>
<result property="materialBaseInfoId" column="material_base_info_id"/>
@@ -268,6 +269,7 @@
d.review_order_id,
d.review_order_number,
d.out_order_number,
d.stock_lock_mode,
d.out_unique_id,
d.material_detail_id,
d.material_base_info_id,
@@ -446,6 +446,7 @@
SELECT b.lot_no,
b.warehouse_code,
b.warehouse_name,
b.stock_lock_mode,
b.material_name,
b.storage_location_name,
b.storage_location_code,
@@ -474,6 +475,7 @@
<result property="specificationModel" column="specification_model"/>
<result property="quantity" column="quantity"/>
<result property="warehouseId" column="warehouse_id"/>
<result property="stockLockMode" column="stock_lock_mode"/>
<result property="materialBaseInfoId" column="material_base_info_id"/>
<result property="copyCode" column="copy_code"/>
<result property="outboundQuantity" column="outbound_quantity"/>
@@ -516,6 +518,7 @@
b.warehouse_code,
b.warehouse_name,
b.warehouse_id,
b.stock_lock_mode,
b.storage_location_name,
b.lot_no,
b.piece_count,