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());
|
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) {
|
} else if (isMerge) {
|
||||||
// 合卷:将bo作为合卷后的新钢卷,newCoils中的对象作为参与合卷的原始钢卷
|
// 合卷:将bo作为合卷后的新钢卷,newCoils中的对象作为参与合卷的原始钢卷
|
||||||
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
|
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
|
||||||
@@ -1616,9 +1630,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 更新二维码内容中的coilId
|
* 兼容原有调用的重载方法(无childCoilIdsStr参数)
|
||||||
*/
|
*/
|
||||||
private void updateQrcodeCoilId(Long qrcodeRecordId, Long coilId) {
|
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 {
|
try {
|
||||||
// 获取二维码记录
|
// 获取二维码记录
|
||||||
WmsGenerateRecordVo record = generateRecordService.queryById(qrcodeRecordId);
|
WmsGenerateRecordVo record = generateRecordService.queryById(qrcodeRecordId);
|
||||||
@@ -1630,15 +1654,34 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
|||||||
ObjectMapper objectMapper = new ObjectMapper();
|
ObjectMapper objectMapper = new ObjectMapper();
|
||||||
Map<String, Object> contentMap = objectMapper.readValue(record.getContent(), Map.class);
|
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"))) {
|
if ("null".equals(contentMap.get("coil_id"))) {
|
||||||
contentMap.put("coil_id", String.valueOf(coilId)); // 初始ID,不再改变
|
contentMap.put("coil_id", String.valueOf(coilId)); // 初始ID,不再改变
|
||||||
}
|
}
|
||||||
|
|
||||||
// 始终更新current_coil_id为最新的钢卷ID
|
|
||||||
contentMap.put("current_coil_id", String.valueOf(coilId));
|
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);
|
String newContentJson = objectMapper.writeValueAsString(contentMap);
|
||||||
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
|
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
|
||||||
updateBo.setRecordId(qrcodeRecordId);
|
updateBo.setRecordId(qrcodeRecordId);
|
||||||
@@ -2985,23 +3028,6 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
|
|||||||
|
|
||||||
String currentCoilIdStr = currentCoilId.toString();
|
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(最新操作优先),检查合卷/分卷产物
|
// 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";
|
return "UNKNOWN";
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("检查回滚阻止原因失败", e);
|
log.error("检查回滚阻止原因失败", e);
|
||||||
|
|||||||
Reference in New Issue
Block a user