Files
tms-erp-web/.workbuddy/memory/2026-07-28.md
赵忠林 d62f8bf320 fix(cargo-type): 恢复操作按钮区中的导出和模板按钮
- 修复紧凑搜索栏重构时误删的「下载模板」「批量导出」按钮
- 重新添加按钮区:添加分类、批量导入、下载模板、批量导出、批量删除
- 确保 handleExport 和 handleTemplate 方法有对应按钮入口
- 按钮权限控制保持与原有逻辑一致
- 修复界面交互完整性,提升操作便捷性
2026-07-29 00:53:11 +08:00

9.1 KiB
Raw Permalink Blame History

2026-07-28 工作日志

货物类型导入模板美化

  • 文件:src/views/base/cargo-type.vuehandleTemplate()
  • 改动(第一次):表头行加主色底色 #409EFF + 白色加粗字体 + 居中对齐 + 细边框;行高 42。
  • 改动(调整后):按用户反馈,表头底色改为统一灰色 #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.javavalidate() 用 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 后端生效。

国标 GB-T 42820-2023 数据 → cargo-type 导入(分析+转换)

  • 源文件:/Users/gxwebsoft/Downloads/副本货物类型导入模板_模拟数据(1).xlsx,单 SheetA1 是标题,真实表头在第 2 行。
  • 源列:一级编码(A,2位)、一级类型(B)、二级编码(C,仅序号)、二级类型(D)、完整国标编码(E,4位)、一级类型/编码(F)、(G空)、(H标注不可靠)。
  • 关键规则:二级真实编码 = E 列后 2 位,必须忽略 C 列序号E 前 2 位 = A。116 行全为二级明细,唯一一级 19 个01-99。无重码、名称≤14字、无备注。
  • 映射:系统 6 列模板(*类型/上级货物类型(…)/上级货物类型编码(…)/*货物类型/*货物类型编码/备注)。一级行=类型一级、上级空、名称=B、编码=A二级行=类型二级、上级名称=B、上级编码=A、名称=D、编码=E。
  • 已生成预览/导入文件(按系统模板表头,编码列设文本格式):/Users/gxwebsoft/VUE/tms-erp-web-ws/import-cargo-type/货物类型导入_一级.xlsx19 条)、货物类型导入_二级.xlsx116 条)。
  • 用户确认:一级+二级都导、手动页面上传、测试/空环境直接导。导入动作由用户在系统"货物类型-批量导入"完成(两阶段:先一级后二级)。
  • 后端导入机制补充(读 CargoTypeServiceImpl.importCargoType逐行 build→validate→save挂 @Transactional二级父级解析走 findParentByCode 查库。因同事务同连接,前面已 save 的一级对后续二级查询可见 → 单文件(一级行严格在前、二级在后)也能一次性成功。但整法"全有或全无":任一失败行触发 setRollbackOnly 回滚整批。分两文件主要规避"顺序依赖+全批回滚"两风险。
  • 已新增单文件版:/Users/gxwebsoft/VUE/tms-erp-web-ws/import-cargo-type/货物类型导入_单文件(一级在前).xlsx一级19条在前+二级116条在后共135数据行
  • 美化:对 import-cargo-type 下 3 个 xlsx 表头统一加样式(灰底 #D9D9D9 + 黑色加粗居中 + 细边框 #D0D7E2 + 行高30数据区细边框、编码列文本格式、列宽适配长表头表头文字保持不变以兼容后端解析。
  • 重新美化(按原始模板蓝色主题):提取 Downloads/副本货物类型导入模板_模拟数据(1).xlsx 样式(表头 #0070C0 蓝底白字微软雅黑11居中、数据行 #EBF1F8 浅蓝黑字微软雅黑10、边框 #D9D9D9 细线、表头行高24→因我表头更长设为30、数据行高19应用到 3 个导入文件。注意原始第1行是标题"GB-T 42820-2023…",但导入文件必须表头在 row1后端按 row1 读),故不照搬标题行,只复用表头+数据行样式。

模板下载改静态资源 + 导入两遍法加固(本次)

  • 模板下载:cargo-type.vuehandleTemplate() 不再用 exceljs 本地生成 2 行示例,改为 fetch 工程内置静态文件 public/cargo-type-import-template.xlsx(内容=已生成的标准"单文件一级在前"模板含一级19类+全部二级示例),下载名仍为 货物类型导入模板.xlsx。base 用 import.meta.env.BASE_URL(当前 /)拼路径,无需后端 export-template 接口、离线可用。
  • 后端加固(CargoTypeServiceImpl.importCargoType):由单遍逐行改为两遍法——第一遍先 validate+save 全部一级,第二遍再解析父级并 save 全部二级;父级解析仍走 findParentByCode 查库(第一遍已入库,同事务可见)。目的:让"完整导入"不受 Excel 行顺序影响(即使某二级行排在所属一级之前也不会整批失败);事务边界(@Transactional + 任一失败 setRollbackOnly 整批回滚)与失败明细 Excel表头=CargoTypeExcel+导入失败原因,与前端 decorator 列宽 key 完全一致)保持不变。
  • 注意:后端 Java 改动未在本机编译,需在 tms-erp-api-ws 重新编译部署生效;校验文案(请选择货物类型级别/货物类型编码格式不正确/二级编码前2位必须与上级货物类型编码一致/该货物类型编码已存在/该上级下已存在同名货物类型/货物类型名称不能超过50字符/备注不能超过200字保持不变以匹配前端 CARGO_TYPE_FAIL_RULES

货物类型页面搜索区紧凑化 + 展开/收缩功能

  • 文件: src/views/base/cargo-type.vue + src/option/base/cargo-type.js
  • 改动: 搜索区域紧凑化改造——两个搜索字段类别、货物类型编码改为单行并排searchSpan:12添加展开/收缩功能,默认收缩状态,通过 searchMenuSlot 在查询/重置按钮后追加「展开/收起」切换按钮带箭头图标动画option 配置中 searchShow 默认 false、searchMenuSlot 启用、移除 searchIcon。

cargo-type 搜索区重构为自定义紧凑单行搜索栏

  • 文件: src/views/base/cargo-type.vue + src/option/base/cargo-type.js
  • 改动: 将 Avue 默认搜索表单完全替换为自定义紧凑单行搜索栏(对齐设计稿截图风格):
    • 左侧:el-select 类型下拉(选择类型)+ el-input 搜索输入框(搜索分类名称,带搜索图标按钮)
    • 右侧:添加分类(主色按钮)、批量导入、批量删除操作按钮
    • 隐藏 Avue 内置搜索(searchShow: false),移除 menu-left 插槽中的按钮
    • 新增 handleCompactSearch 方法,支持回车/点击/清除/下拉切换触发搜索keyword 映射为 cargoName 参数
    • 引入 Element Plus 图标组件Search, Plus
    • 样式flex 单行布局、轻量阴影 0 2px 8px rgba(0,0,0,0.06)、select 160px / input 280px 固定宽度

cargo-type 操作按钮恢复(导出/模板)

  • 紧凑搜索栏重构时误删了「下载模板」「批量导出」两个按钮(原在 menu-left 插槽)。
  • 已重新加回按钮区:添加分类、批量导入、下载模板(cargo_type_template+handleTemplate)、批量导出(cargo_type_export+handleExport)、批量删除。
  • handleExport / handleTemplate 方法始终未删,仅缺按钮入口,现已恢复。