refactor(wms): 优化钢卷分卷操作的二维码更新逻辑
- 移除批量更新子钢卷child_coil_ids的注释标记 - 添加分卷操作的日志记录和调试信息 - 将原updateQrcodeCoilId方法拆分为专门的updateChildCoilIdsQrcodeCoilId方法 - 移除二维码内容中分卷步骤的复杂处理逻辑 - 新增独立方法处理子钢卷二维码的child_coil_ids字段更新 - 添加参数校验和异常处理机制 - 优化日志输出和错误处理流程
This commit is contained in:
@@ -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_ids,qrcodeRecordId: {}, 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_ids,qrcodeRecordId: {}, 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());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新二维码记录以记录回滚操作
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user