refactor(wms): 优化钢卷分卷操作的批量更新逻辑
- 移除循环中的重复更新操作,改为一次性批量处理所有子钢卷的child_coil_ids - 新增带childCoilIdsStr参数的updateQrcodeCoilId重载方法 - 在二维码内容中增加对分卷步骤new_coil_id和child_coil_ids字段的更新支持 - 重构初始新增操作检查逻辑的位置,提升代码可读性 - 添加详细的参数注释和方法说明文档
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user