From 38ce8fa2bcffdf63919e54081d2a01c58c0b6b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=B5=B5=E5=BF=A0=E6=9E=97?= <170083662@qq.com> Date: Tue, 28 Jul 2026 00:47:23 +0800 Subject: [PATCH] =?UTF-8?q?feat(cargo-type):=20=E4=BC=98=E5=8C=96=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=A4=B1=E8=B4=A5=E6=98=8E=E7=BB=86=E5=A4=87=E6=B3=A8?= =?UTF-8?q?=E8=B6=85=E9=95=BF=E4=B8=8E=E6=A0=87=E7=BA=A2=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 仅导入失败原因列显示红色字体,清除其他列红色样式 - 失败原因按 A./B./C. 编号,使用分号分隔 - 错误文本已包含规则说明则不重复添加 - 备注超长(>200字)自动追加“备注不能超过200字”提示 - Node 端验证通过,保证格式和样式正确 - 备注超长校验提醒后端改进收集式校验待确认 --- .workbuddy/memory/2026-07-28.md | 6 ++++++ src/views/base/cargo-type.vue | 14 +++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.workbuddy/memory/2026-07-28.md b/.workbuddy/memory/2026-07-28.md index 297ba6a..b7184ab 100644 --- a/.workbuddy/memory/2026-07-28.md +++ b/.workbuddy/memory/2026-07-28.md @@ -6,3 +6,9 @@ - 改动(调整后):按用户反馈,表头底色改为统一灰色 `#D9D9D9` + 黑色加粗字体,行高降为 30。 - 导入失败明细 `decorateCargoTypeFailDetail` 调整:仅「导入失败原因」列字体红色;错误按 `A./B./C.` 编号,分号(;)隔开,并去掉后端重复的「第N行:」前缀;最终格式示例 `第2行:A.该货物类型编码已存在,请更换唯一编码`。 - 验证:Node + exceljs 4.4.0 跑通生成逻辑,确认表头 fill/font/alignment/height、失败原因编号格式与红色字体均正确。 + +## 货物类型导入失败明细 - 备注超长与标红强化 +- 确认需求:除「导入失败原因」列外,其他列一律不标红;已增加 decorator 清除所有非失败原因列红色字体(含类型列,不论对错)。 +- 失败原因按 A./B./C. 编号、分号(;)隔开;并优化:错误文本已包含规则说明时不重复拼接(避免「备注不能超过200字,备注不能超过200字」)。 +- 新增兜底:失败明细行若「备注」列文本长度 > 200 且失败原因未含备注错误,自动追加一条「备注不能超过200字」编号项(Node 验证通过)。 +- 后端根因(已读 /Users/gxwebsoft/JAVA/tms-erp-api-ws/blade-service/blade-system/.../CargoTypeServiceImpl.java):validate() 用 throw 实现,一行多个错误时只抛第一个,备注超长校验(第238行)可能被前置的编码/名称/上级错误挡住,导致失败明细不显示备注原因。彻底方案需后端改收集式校验(列出全部错误),待用户确认是否改 Java。 diff --git a/src/views/base/cargo-type.vue b/src/views/base/cargo-type.vue index ec3d563..290ea4c 100644 --- a/src/views/base/cargo-type.vue +++ b/src/views/base/cargo-type.vue @@ -222,8 +222,20 @@ export const decorateCargoTypeFailDetail = async workbook => { const decorated = parts.map((part, index) => { const label = `${String.fromCharCode(65 + index)}.`; // A. B. C. const rule = CARGO_TYPE_FAIL_RULES.find(r => part.includes(r.match)); - return rule ? `${label}${part},${rule.rule}` : `${label}${part}`; + if (rule) { + // 规则说明若已包含在错误文本中则不再重复拼接 + return part.includes(rule.rule) ? `${label}${part}` : `${label}${part},${rule.rule}`; + } + return `${label}${part}`; }); + // 兜底:失败行的备注列超长(>200字)时,补充备注超长提示 + const remarkCol = colMap['备注']; + if (remarkCol) { + const remarkVal = String(row.getCell(remarkCol).value == null ? '' : row.getCell(remarkCol).value).trim(); + if (remarkVal.length > 200 && !decorated.some(d => d.includes('备注不能超过200字'))) { + decorated.push(`${String.fromCharCode(65 + decorated.length)}.备注不能超过200字`); + } + } reasonCell.value = `第${rowNumber}行:${decorated.join(';')}`; reasonCell.font = { color: { argb: 'FFFF0000' } }; reasonCell.alignment = { wrapText: true, vertical: 'top' };