fix(cargo-type): 修复导入失败明细列宽和样式问题
- decorator 仅操作 G 列「导入失败原因」字体颜色为黑色,无背景填充 - 修正失败明细列宽映射 key,确保与后端表头完全一致 - 恢复所有列的宽度设置,避免内容拥挤 - 后端添加事务控制,确保导入数据全部正确才提交,否则整体回滚
This commit is contained in:
@@ -12,3 +12,6 @@
|
|||||||
- 失败原因按 A./B./C. 编号、分号(;)隔开;并优化:错误文本已包含规则说明时不重复拼接(避免「备注不能超过200字,备注不能超过200字」)。
|
- 失败原因按 A./B./C. 编号、分号(;)隔开;并优化:错误文本已包含规则说明时不重复拼接(避免「备注不能超过200字,备注不能超过200字」)。
|
||||||
- 新增兜底:失败明细行若「备注」列文本长度 > 200 且失败原因未含备注错误,自动追加一条「备注不能超过200字」编号项(Node 验证通过)。
|
- 新增兜底:失败明细行若「备注」列文本长度 > 200 且失败原因未含备注错误,自动追加一条「备注不能超过200字」编号项(Node 验证通过)。
|
||||||
- 后端根因(已读 /Users/gxwebsoft/JAVA/tms-erp-api-ws/blade-service/blade-system/.../CargoTypeServiceImpl.java):validate() 用 throw 实现,一行多个错误时只抛第一个,备注超长校验(第238行)可能被前置的编码/名称/上级错误挡住,导致失败明细不显示备注原因。彻底方案需后端改收集式校验(列出全部错误),待用户确认是否改 Java。
|
- 后端根因(已读 /Users/gxwebsoft/JAVA/tms-erp-api-ws/blade-service/blade-system/.../CargoTypeServiceImpl.java):validate() 用 throw 实现,一行多个错误时只抛第一个,备注超长校验(第238行)可能被前置的编码/名称/上级错误挡住,导致失败明细不显示备注原因。彻底方案需后端改收集式校验(列出全部错误),待用户确认是否改 Java。
|
||||||
|
- **最终确认(样式)**:decorator 仅操作 G 列「导入失败原因」——黑色字体(argb `FF000000`)、无背景填充(fill→none);其余列单元格样式/内容不修改。
|
||||||
|
- **列宽修复(关键 bug)**:失败明细列宽之前全部失效,根因是 `CARGO_TYPE_FAIL_COL_WIDTH` 的 key 用了「类型/上级货物类型」等简写,而后端 `CargoTypeImportFailureExcel` 表头带 `*` 与括号说明(如 `*类型`、`上级货物类型(如为一级则不需填写)`),key 对不上导致走默认 18。已把 key 改为与后端表头完全一致,并恢复「给所有列设宽」逻辑。最终宽度:`*类型`16 / `上级货物类型(…)`22 / `上级货物类型编码(…)`26 / `*货物类型`18 / `*货物类型编码`18 / `备注`24 / `导入失败原因`70。Node 验证通过。
|
||||||
|
- **事务性导入(后端改动)**:`CargoTypeServiceImpl.importCargoType` 加 `@Transactional(rollbackFor=Exception.class)`,逐条 validate+save 后若有任一失败则 `TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()` 回滚整批,实现"全部正确才入库,任一错误则一条都不存"。需重新编译部署 tms-erp-api-ws 后端生效。
|
||||||
|
|||||||
@@ -170,15 +170,15 @@ const CARGO_TYPE_FAIL_RULES = [
|
|||||||
{ match: '备注不能超过200字', col: '备注', rule: '备注不能超过200字' },
|
{ match: '备注不能超过200字', col: '备注', rule: '备注不能超过200字' },
|
||||||
];
|
];
|
||||||
|
|
||||||
// 失败明细各列目标宽度(Excel 字符数),避免内容拥挤
|
// 失败明细各列目标宽度(Excel 字符数),key 与后端 CargoTypeImportFailureExcel 表头完全一致
|
||||||
const CARGO_TYPE_FAIL_COL_WIDTH = {
|
const CARGO_TYPE_FAIL_COL_WIDTH = {
|
||||||
类型: 14,
|
'*类型': 16,
|
||||||
上级货物类型: 16,
|
'上级货物类型(如为一级则不需填写)': 22,
|
||||||
上级货物类型编码: 20,
|
'上级货物类型编码(如为一级则不需填写)': 26,
|
||||||
货物类型: 16,
|
'*货物类型': 18,
|
||||||
货物类型编码: 16,
|
'*货物类型编码': 18,
|
||||||
备注: 18,
|
'备注': 24,
|
||||||
导入失败原因: 60,
|
'导入失败原因': 70,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -237,13 +237,15 @@ export const decorateCargoTypeFailDetail = async workbook => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
reasonCell.value = `第${rowNumber}行:${decorated.join(';')}`;
|
reasonCell.value = `第${rowNumber}行:${decorated.join(';')}`;
|
||||||
reasonCell.font = { color: { argb: 'FFFF0000' } };
|
// 仅操作 G 列:黑色字体、无背景填充,其余列保持后端原样
|
||||||
|
reasonCell.fill = { type: 'pattern', pattern: 'none' };
|
||||||
|
reasonCell.font = { color: { argb: 'FF000000' } };
|
||||||
reasonCell.alignment = { wrapText: true, vertical: 'top' };
|
reasonCell.alignment = { wrapText: true, vertical: 'top' };
|
||||||
});
|
});
|
||||||
// 加宽各列(未列在映射中的列给默认宽度)
|
// 加宽各列,避免内容拥挤(仅改列宽,不改动单元格样式)
|
||||||
Object.keys(colMap).forEach(name => {
|
Object.keys(colMap).forEach(name => {
|
||||||
const col = ws.getColumn(colMap[name]);
|
const col = ws.getColumn(colMap[name]);
|
||||||
col.width = CARGO_TYPE_FAIL_COL_WIDTH[name] || 18;
|
col.width = CARGO_TYPE_FAIL_COL_WIDTH[name] || 20;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user