🐛 修复码头导入父港口取列不一致导致的静默丢数据

importTerminals 中 setParentCode 取「港口编码」列,而抑制连带报错时
却用「上级港口编码」判断父行是否已声明。用户若把完整编码填入
「码头编码」并让「港口编码」留空,父港口解析失败的异常会被误判为
「父行已声明」而吞掉,码头被静默丢弃且接口返回成功。

- splitByCategory 增加码头行「港口编码」非空校验,明确报错
- 抑制逻辑改为与 setParentCode 取同一列
This commit is contained in:
2026-09-21 05:34:59 +08:00
parent 8485efe00d
commit 4c96583701
@@ -186,6 +186,13 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
failureList.add(buildFailure(data, index, "类型只能为港口或码头"));
continue;
}
// 码头行的「港口编码」既是编号前缀,也是"所属港口"的来源(见 importTerminals)。
// 缺失时下游解析不到父港口,而该异常又会被"父行已声明"的抑制逻辑吞掉,
// 导致码头被静默丢弃、接口却返回成功——所以必须在这里明确拦下。
if (CATEGORY_TERMINAL.equals(category) && Func.isEmpty(trimToEmpty(excel.getPortCode()))) {
failureList.add(buildFailure(data, index, "码头必须填写所属港口编码"));
continue;
}
// 只要类型是港口就登记为"本文件已声明",即使它的编码格式不合法:
// 这样引用它的码头行不会被连带报错,用户只需修正这一个港口行。
if (CATEGORY_PORT.equals(category)) {
@@ -263,7 +270,9 @@ public class PortTerminalServiceImpl extends BaseServiceImpl<PortTerminalMapper,
} catch (ParentPortNotFoundException exception) {
// 上级港口就声明在本文件里,只是那一行自己校验失败(已被标红)。
// 此时码头行本身没有问题,不再连带报错,避免用户看到"两行都错"的假象。
if (!declaredPortCodeSet.contains(trimToEmpty(excel.getParentCode()).toUpperCase(Locale.ROOT))) {
// 注意这里必须与上面 setParentCode 取同一列(港口编码);
// 若改用「上级港口编码」,父港口取不到时会被误判为"已声明"而吞掉异常。
if (!declaredPortCodeSet.contains(trimToEmpty(excel.getPortCode()).toUpperCase(Locale.ROOT))) {
failureList.add(buildFailure(data, index, resolveMessage(exception)));
}
} catch (Exception exception) {