refactor(wms): 优化钢卷分卷步骤中child_coil_ids的更新逻辑

- 将child_coil_ids设置到对应的分卷步骤中,而不是最外层
- 支持多次分卷,每次的child_coil_ids都会记录在各自的分卷步骤中
- 修改注释明确更新的是分卷步骤中的child_coil_ids字段
- 添加查找最新分卷步骤的逻辑,确保在正确的步骤中设置child_coil_ids
- 更新日志信息以反映分卷步骤的child_coil_ids更新
- 添加对分卷步骤不存在时的警告处理
This commit is contained in:
2026-01-21 17:18:47 +08:00
parent a2ffe5cc73
commit 0724a6b0a8

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,19 +1345,16 @@ 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
log.debug("更新子钢卷二维码coilId: {}, qrcodeRecordId: {}", newChildCoil.getCoilId(), newChildCoil.getQrcodeRecordId());
// 更新该子钢卷的分卷步骤中的child_coil_ids字段
updateChildCoilIdsQrcodeCoilId(newChildCoil.getQrcodeRecordId(), newChildCoil.getCoilId(), childCoilIdsStr);
} else {
log.warn("子钢卷缺少二维码记录ID跳过child_coil_ids更新coilId: {}", newChildCoil.getCoilId());
log.warn("子钢卷缺少二维码记录ID跳过分卷步骤child_coil_ids更新coilId: {}", newChildCoil.getCoilId());
}
}
log.info("分卷操作所有子钢卷的child_coil_ids更新完成");
} else if (isMerge) {
// 合卷将bo作为合卷后的新钢卷newCoils中的对象作为参与合卷的原始钢卷
// 1. 将参与合卷的原始钢卷的二维码标记为失效,并将钢卷标记为历史数据
@@ -1517,6 +1514,7 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
splitStep.put("old_coil_id", String.valueOf(oldCoil.getCoilId()));
splitStep.put("new_current_coil_nos", String.join(",", allNewCoilNos));
splitStep.put("child_coils", allNewCoilNos);
// 分卷产生的子钢卷ID将在后续步骤中设置
splitStep.put("operator", LoginHelper.getUsername()); // 操作者
steps.add(splitStep);
@@ -1892,6 +1890,8 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
extractCoilId(step, "coil_id", allCoilNos);
extractCoilId(step, "old_coil_id", allCoilNos);
extractCoilId(step, "parent_coil_ids", allCoilNos);
// 从分卷步骤中提取子钢卷IDs
extractCoilId(step, "child_coil_ids", allCoilNos);
}
}
}
@@ -3046,14 +3046,15 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
/**
* 更新分卷子钢卷的二维码记录中的child_coil_ids字段
* 用于让每个子钢卷知道其他兄弟子钢卷的ID
* 将child_coil_ids设置到对应的分卷步骤中而不是最外层
* 支持多次分卷每次的child_coil_ids都会记录在各自的分卷步骤中
*
* @param qrcodeRecordId 二维码记录ID
* @param currentCoilId 当前子钢卷ID
* @param childCoilIdsStr 所有子钢卷ID的逗号分隔字符串
* @param childCoilIdsStr 本次分卷产生的所有子钢卷ID的逗号分隔字符串
*/
private void updateChildCoilIdsQrcodeCoilId(Long qrcodeRecordId, Long currentCoilId, String childCoilIdsStr) {
log.info("开始更新子钢卷二维码的child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
log.info("开始更新子钢卷二维码的分卷步骤child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr);
try {
@@ -3076,11 +3077,36 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
// 解析现有content
ObjectMapper objectMapper = new ObjectMapper();
@SuppressWarnings("unchecked")
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);
// 获取steps数组
@SuppressWarnings("unchecked")
List<Map<String, Object>> steps = (List<Map<String, Object>>) contentMap.get("steps");
if (steps == null || steps.isEmpty()) {
log.warn("二维码记录中没有steps信息跳过child_coil_ids更新qrcodeRecordId: {}", qrcodeRecordId);
return;
}
// 找到最后一个分卷步骤(最新的分卷操作)
Map<String, Object> lastSplitStep = null;
for (int i = steps.size() - 1; i >= 0; i--) {
Map<String, Object> step = steps.get(i);
String operation = (String) step.get("operation");
if ("分卷".equals(operation)) {
lastSplitStep = step;
break; // 找到最新的分卷步骤就停止
}
}
if (lastSplitStep == null) {
log.warn("未找到分卷步骤无法设置child_coil_idsqrcodeRecordId: {}", qrcodeRecordId);
return;
}
// 在分卷步骤中设置child_coil_ids
lastSplitStep.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"))) {
@@ -3095,11 +3121,11 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService {
updateBo.setContent(newContentJson);
generateRecordService.updateByBo(updateBo);
log.info("成功更新子钢卷二维码的child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
log.info("成功更新子钢卷二维码的分卷步骤child_coil_idsqrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr);
} catch (Exception e) {
log.error("更新子钢卷二维码的child_coil_ids失败qrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
log.error("更新子钢卷二维码的分卷步骤child_coil_ids失败qrcodeRecordId: {}, currentCoilId: {}, childCoilIdsStr: {}",
qrcodeRecordId, currentCoilId, childCoilIdsStr, e);
throw new RuntimeException("更新子钢卷二维码失败: " + e.getMessage());
}