feat(wms): 扩展钢卷待处理动作查询功能并完善分卷合卷业务逻辑

- 在WmsCoilPendingActionMapper.xml中新增仓库名称、规格、材质、生产厂家等物料信息字段查询
- 为WmsCoilPendingActionVo添加specification、material、manufacturer等物料属性字段
- 完善分卷合卷业务逻辑,增加对历史卷的分卷限制验证
- 新增validateOriginalCoilsForMerge方法用于合卷前验证原始钢卷数据状态
- 优化实际库区ID更新条件,当状态为1时也清除实际库区绑定
- 移除分卷新卷继承母卷实际库区ID的逻辑
- 增强合卷操作前的原始钢卷数据校验机制
This commit is contained in:
2026-01-14 17:34:58 +08:00
parent f8e15af0fe
commit 7a38091468
3 changed files with 111 additions and 5 deletions

View File

@@ -163,5 +163,44 @@ public class WmsCoilPendingActionVo extends BaseEntity implements Serializable {
private String operatorByName;
/**
* 规格(原料/产品通用)
*/
private String specification;
/**
* 材质(原料/产品通用)
*/
private String material;
/**
* 生产厂家(原料/产品通用)
*/
private String manufacturer;
/**
* 表面处理说明(原料/产品通用)
*/
private String surfaceTreatmentDesc;
/**
* 锌层(原料/产品通用)
*/
private String zincLayer;
/**
* 物品名称(原料名称/产品名称)
*/
private String itemName;
/**
* 物品编码(原料编码/产品编码)
*/
private String itemCode;
private String actualWarehouseName;
}

View File

@@ -919,7 +919,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
baseMapper.update(null, updateWrapper);
}
// 如果实际库区id为-1或状态为1则清空钢卷上的实际库区绑定
if ((bo.getActualWarehouseId() != null && bo.getActualWarehouseId().equals(-1L))
if ((bo.getActualWarehouseId() != null && bo.getActualWarehouseId().equals(-1L))
|| (bo.getStatus() != null && bo.getStatus().equals(1))) {
clearActualWarehouseBinding(oldCoil.getActualWarehouseId(), bo.getCoilId());
}
@@ -1131,6 +1131,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
throw new RuntimeException("原钢卷不存在");
}
}
// oldCoil 如果是历史卷也就是date_type=0 的时候就不能分卷
if (oldCoil != null && oldCoil.getDataType() == 0) {
throw new RuntimeException("原钢卷已分卷,不能再分卷");
}
// 判断是分卷还是合卷
boolean isSplit = false;
@@ -1218,9 +1222,6 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
if (newCoil.getWarehouseId() == null) {
newCoil.setWarehouseId(oldCoil.getWarehouseId());
}
if (newCoil.getActualWarehouseId() == null){
newCoil.setActualWarehouseId(oldCoil.getActualWarehouseId());
}
// 在子卷的 parent_coil_nos 字段中记录母卷号
newCoil.setParentCoilNos(oldCoil.getCurrentCoilNo());
@@ -1242,6 +1243,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
} else if (isMerge) {
// 合卷将bo作为合卷后的新钢卷newCoils中的对象作为参与合卷的原始钢卷
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
//在合卷之前需要判断前端传来的bo.getNewCoils()中的所有原始钢卷的coilId是否已经是历史卷
validateOriginalCoilsForMerge(bo.getNewCoils());
for (WmsMaterialCoilBo originalCoilBo : bo.getNewCoils()) {
if (originalCoilBo.getCoilId() != null) {
WmsMaterialCoil originalCoil = baseMapper.selectById(originalCoilBo.getCoilId());
@@ -1326,6 +1329,39 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
return true;
}
/**
* 验证参与合卷的原始钢卷是否都是当前数据(而非历史数据)
* @param originalCoils 参与合卷的原始钢卷列表
*/
private void validateOriginalCoilsForMerge(List<WmsMaterialCoilBo> originalCoils) {
if (CollectionUtils.isEmpty(originalCoils)) {
return;
}
// 收集所有需要验证的coilId
List<Long> coilIds = originalCoils.stream()
.map(WmsMaterialCoilBo::getCoilId)
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(coilIds)) {
return;
}
// 批量查询钢卷数据避免N+1查询问题
List<WmsMaterialCoil> originalCoilsData = baseMapper.selectBatchIds(coilIds);
// 检查是否有历史数据
List<String> historyCoils = originalCoilsData.stream()
.filter(coil -> coil.getDataType() != null && coil.getDataType() == 0) // dataType=0表示历史数据
.map(coil -> ": " + coil.getCurrentCoilNo())
.collect(Collectors.toList());
if (!historyCoils.isEmpty()) {
String errorDetails = String.join(", ", historyCoils);
throw new RuntimeException("合卷操作需要所有原始钢卷为当前数据,以下卷号已被合卷" + errorDetails);
}
}
/**
* 为分卷生成新二维码(每个子钢卷一个)

View File

@@ -50,9 +50,40 @@
wmc.enter_coil_no as enterCoilNo,
wmc.supplier_coil_no as supplierCoilNo,
wmc.item_id as itemId,
wmc.item_type as itemType
wmc.item_type as itemType,
w.warehouse_name AS warehouseName,
aw.actual_warehouse_name AS actualWarehouseName,
CASE WHEN wmc.item_type = 'raw_material' THEN rm.specification
WHEN wmc.item_type = 'product' THEN p.specification
ELSE NULL END AS specification,
CASE WHEN wmc.item_type = 'raw_material' THEN rm.material
WHEN wmc.item_type = 'product' THEN p.material
ELSE NULL END AS material,
CASE WHEN wmc.item_type = 'raw_material' THEN rm.manufacturer
WHEN wmc.item_type = 'product' THEN p.manufacturer
ELSE NULL END AS manufacturer,
CASE WHEN wmc.item_type = 'raw_material' THEN rm.surface_treatment_desc
WHEN wmc.item_type = 'product' THEN p.surface_treatment_desc
ELSE NULL END AS surfaceTreatmentDesc,
CASE WHEN wmc.item_type = 'raw_material' THEN rm.zinc_layer
WHEN wmc.item_type = 'product' THEN p.zinc_layer
ELSE NULL END AS zincLayer,
CASE
WHEN wmc.item_type = 'raw_material' THEN rm.raw_material_name
WHEN wmc.item_type = 'product' THEN p.product_name
ELSE NULL
END as itemName,
CASE
WHEN wmc.item_type = 'raw_material' THEN rm.raw_material_code
WHEN wmc.item_type = 'product' THEN p.product_code
ELSE NULL
END as itemCode
from wms_coil_pending_action wcpa
inner join wms_material_coil wmc ON wcpa.coil_id = wmc.coil_id AND wmc.del_flag = 0
LEFT JOIN wms_warehouse w ON wmc.warehouse_id = w.warehouse_id
LEFT JOIN wms_actual_warehouse aw ON wmc.actual_warehouse_id = aw.actual_warehouse_id
LEFT JOIN wms_raw_material rm ON wmc.item_type = 'raw_material' AND wmc.item_id = rm.raw_material_id
LEFT JOIN wms_product p ON wmc.item_type = 'product' AND wmc.item_id = p.product_id
${ew.customSqlSegment}
</select>