refactor(wms): 优化钢卷分卷操作的批量更新逻辑

- 移除循环中的重复更新操作,改为一次性批量处理所有子钢卷的child_coil_ids
- 新增带childCoilIdsStr参数的updateQrcodeCoilId重载方法
- 在二维码内容中增加对分卷步骤new_coil_id和child_coil_ids字段的更新支持
- 重构初始新增操作检查逻辑的位置,提升代码可读性
- 添加详细的参数注释和方法说明文档
This commit is contained in:
2026-01-20 10:59:25 +08:00
parent a3d7fb8313
commit 0e3d578e9c

View File

@@ -1337,6 +1337,20 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
// 更新实际库区的启用状态
updateActualWarehouseEnableStatus(oldCoil.getActualWarehouseId(), newCoilBo.getActualWarehouseId());
}
// ✅ 批量更新所有子钢卷的child_coil_ids移出循环只执行一次
List<Long> newCoilIds = newCoils.stream()
.map(WmsMaterialCoil::getCoilId)
.collect(Collectors.toList());
String childCoilIdsStr = newCoilIds.stream()
.map(String::valueOf)
.collect(Collectors.joining(","));
for (WmsMaterialCoil newChildCoil : newCoils) {
if (newChildCoil.getQrcodeRecordId() != null) {
// 传入childCoilIdsStr更新所有子钢卷ID
updateQrcodeCoilId(newChildCoil.getQrcodeRecordId(), newChildCoil.getCoilId(), childCoilIdsStr);
}
}
} else if (isMerge) {
// 合卷将bo作为合卷后的新钢卷newCoils中的对象作为参与合卷的原始钢卷
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
@@ -1616,9 +1630,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 更新二维码内容中的coilId
* 兼容原有调用的重载方法无childCoilIdsStr参数
*/
private void updateQrcodeCoilId(Long qrcodeRecordId, Long coilId) {
updateQrcodeCoilId(qrcodeRecordId, coilId, null);
}
/**
* 更新二维码内容中的coilId支持更新子钢卷ID
* @param qrcodeRecordId 二维码记录ID
* @param coilId 当前钢卷ID
* @param childCoilIdsStr 所有子钢卷ID字符串逗号分隔分卷场景使用
*/
private void updateQrcodeCoilId(Long qrcodeRecordId, Long coilId, String childCoilIdsStr) {
try {
// 获取二维码记录
WmsGenerateRecordVo record = generateRecordService.queryById(qrcodeRecordId);
@@ -1630,15 +1654,34 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> contentMap = objectMapper.readValue(record.getContent(), Map.class);
// 如果是第一次设置coilId从"null"变为实际ID则同时设置coil_id和current_coil_id
// 1. 原有逻辑:更新顶层的coil_id和current_coil_id
if ("null".equals(contentMap.get("coil_id"))) {
contentMap.put("coil_id", String.valueOf(coilId)); // 初始ID不再改变
}
// 始终更新current_coil_id为最新的钢卷ID
contentMap.put("current_coil_id", String.valueOf(coilId));
// 更新二维码记录
// 2. 新增逻辑更新分卷步骤中的new_coil_id和child_coil_ids
List<Map<String, Object>> steps = (List<Map<String, Object>>) contentMap.get("steps");
if (steps != null && !steps.isEmpty()) {
// 遍历所有步骤,找到分卷操作
for (Map<String, Object> step : steps) {
String operation = (String) step.get("operation");
if ("分卷".equals(operation)) {
// 更新当前子钢卷的new_coil_id
step.put("new_coil_id", String.valueOf(coilId));
// 如果传入了所有子钢卷ID更新child_coil_ids
if (childCoilIdsStr != null && !childCoilIdsStr.isEmpty()) {
step.put("child_coil_ids", childCoilIdsStr);
// 可选替换原有child_coils为ID如果业务需要
// step.put("child_coils", childCoilIdsStr);
}
break; // 分卷步骤只会有一个,找到后退出循环
}
}
}
// 3. 更新二维码记录
String newContentJson = objectMapper.writeValueAsString(contentMap);
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
updateBo.setRecordId(qrcodeRecordId);
@@ -2985,23 +3028,6 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
String currentCoilIdStr = currentCoilId.toString();
// 首先检查是否为初始新增操作
Map<String, Object> firstStep = steps.get(0);
String action = (String) firstStep.get("action");
if ("新增".equals(action)) {
Object coilIdObj = contentMap.get("coil_id");
Object currentCoilIdObj = contentMap.get("current_coil_id");
if (coilIdObj != null && currentCoilIdObj != null) {
String coilIdStr = coilIdObj.toString();
String currentCoilIdStrInContent = currentCoilIdObj.toString();
if (coilIdStr.equals(currentCoilIdStrInContent) && coilIdStr.equals(currentCoilIdStr)) {
return "INITIAL_CREATE";
}
}
}
// 检查是否为合卷或分卷的产物
// 2. 从后往前遍历steps最新操作优先检查合卷/分卷产物
// 倒序遍历,确保取到最新的操作状态
@@ -3027,6 +3053,25 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
}
// 首先检查是否为初始新增操作
Map<String, Object> firstStep = steps.get(0);
String action = (String) firstStep.get("action");
if ("新增".equals(action)) {
Object coilIdObj = contentMap.get("coil_id");
Object currentCoilIdObj = contentMap.get("current_coil_id");
if (coilIdObj != null && currentCoilIdObj != null) {
String coilIdStr = coilIdObj.toString();
String currentCoilIdStrInContent = currentCoilIdObj.toString();
if (coilIdStr.equals(currentCoilIdStrInContent) && coilIdStr.equals(currentCoilIdStr)) {
return "INITIAL_CREATE";
}
}
}
return "UNKNOWN";
} catch (Exception e) {
log.error("检查回滚阻止原因失败", e);