refactor(wms): 优化钢卷分卷操作的二维码更新逻辑

- 移除批量更新子钢卷child_coil_ids的注释标记
- 添加分卷操作的日志记录和调试信息
- 将原updateQrcodeCoilId方法拆分为专门的updateChildCoilIdsQrcodeCoilId方法
- 移除二维码内容中分卷步骤的复杂处理逻辑
- 新增独立方法处理子钢卷二维码的child_coil_ids字段更新
- 添加参数校验和异常处理机制
- 优化日志输出和错误处理流程
This commit is contained in:
2026-01-20 13:00:15 +08:00
parent ebb631e3cc
commit 4cf6aa02a9

View File

@@ -1337,7 +1337,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
// 更新实际库区的启用状态
updateActualWarehouseEnableStatus(oldCoil.getActualWarehouseId(), newCoilBo.getActualWarehouseId());
}
// 批量更新所有子钢卷的child_coil_ids(移出循环,只执行一次)
// 批量更新所有子钢卷的child_coil_ids
List<Long> newCoilIds = newCoils.stream()
.map(WmsMaterialCoil::getCoilId)
.collect(Collectors.toList());
@@ -1345,12 +1345,19 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
.map(String::valueOf)
.collect(Collectors.joining(","));
log.info("分卷操作:准备更新{}个子钢卷的child_coil_ids子钢卷IDs: {}", newCoils.size(), childCoilIdsStr);
for (WmsMaterialCoil newChildCoil : newCoils) {
if (newChildCoil.getQrcodeRecordId() != null) {
// 传入childCoilIdsStr更新所有子钢卷ID
updateQrcodeCoilId(newChildCoil.getQrcodeRecordId(), newChildCoil.getCoilId(), childCoilIdsStr);
log.debug("更新子钢卷二维码coilId: {}, qrcodeRecordId: {}", newChildCoil.getCoilId(), newChildCoil.getQrcodeRecordId());
updateChildCoilIdsQrcodeCoilId(newChildCoil.getQrcodeRecordId(), newChildCoil.getCoilId(), childCoilIdsStr);
} else {
log.warn("子钢卷缺少二维码记录ID跳过child_coil_ids更新coilId: {}", newChildCoil.getCoilId());
}
}
log.info("分卷操作所有子钢卷的child_coil_ids更新完成");
} else if (isMerge) {
// 合卷将bo作为合卷后的新钢卷newCoils中的对象作为参与合卷的原始钢卷
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
@@ -1630,19 +1637,9 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
/**
* 兼容原有调用的重载方法无childCoilIdsStr参数
* 更新二维码内容中的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 {
// 获取二维码记录
WmsGenerateRecordVo record = generateRecordService.queryById(qrcodeRecordId);
@@ -1654,34 +1651,15 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> contentMap = objectMapper.readValue(record.getContent(), Map.class);
// 1. 原有逻辑:更新顶层的coil_id和current_coil_id
// 如果是第一次设置coilId从"null"变为实际ID则同时设置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);
@@ -3070,6 +3048,67 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
}
}
/**
* 更新分卷子钢卷的二维码记录中的child_coil_ids字段
* 用于让每个子钢卷知道其他兄弟子钢卷的ID
*
* @param qrcodeRecordId 二维码记录ID
* @param currentCoilId 当前子钢卷ID
* @param childCoilIdsStr 所有子钢卷ID的逗号分隔字符串
*/
private void updateChildCoilIdsQrcodeCoilId(Long qrcodeRecordId, Long currentCoilId, String childCoilIdsStr) {
log.info("开始更新子钢卷二维码的child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr);
try {
// 参数校验
if (qrcodeRecordId == null || currentCoilId == null) {
throw new RuntimeException("二维码记录ID和当前钢卷ID不能为空");
}
if (StringUtils.isBlank(childCoilIdsStr)) {
log.warn("childCoilIdsStr为空跳过更新qrcodeRecordId: {}, currentCoilId: {}", qrcodeRecordId, currentCoilId);
return;
}
// 获取二维码记录
WmsGenerateRecordVo record = generateRecordService.queryById(qrcodeRecordId);
if (record == null) {
throw new RuntimeException("二维码记录不存在recordId: " + qrcodeRecordId);
}
log.debug("获取到二维码记录recordId: {}, 原始content长度: {}", qrcodeRecordId, record.getContent().length());
// 解析现有content
ObjectMapper objectMapper = new ObjectMapper();
Map<String, Object> contentMap = objectMapper.readValue(record.getContent(), Map.class);
// 更新child_coil_ids字段
contentMap.put("child_coil_ids", childCoilIdsStr);
log.debug("已设置child_coil_ids字段: {}", childCoilIdsStr);
// 确保current_coil_id已设置虽然在前面应该已经设置过了但这里再确认一下
if (!contentMap.containsKey("current_coil_id") || "null".equals(contentMap.get("current_coil_id"))) {
contentMap.put("current_coil_id", String.valueOf(currentCoilId));
log.debug("已设置current_coil_id字段: {}", currentCoilId);
}
// 更新二维码记录
String newContentJson = objectMapper.writeValueAsString(contentMap);
WmsGenerateRecordBo updateBo = new WmsGenerateRecordBo();
updateBo.setRecordId(qrcodeRecordId);
updateBo.setContent(newContentJson);
generateRecordService.updateByBo(updateBo);
log.info("成功更新子钢卷二维码的child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr);
} catch (Exception e) {
log.error("更新子钢卷二维码的child_coil_ids失败qrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr, e);
throw new RuntimeException("更新子钢卷二维码失败: " + e.getMessage());
}
}
/**
* 更新二维码记录以记录回滚操作
*/