- 修复紧凑搜索栏重构时误删的「下载模板」「批量导出」按钮 - 重新添加按钮区:添加分类、批量导入、下载模板、批量导出、批量删除 - 确保 handleExport 和 handleTemplate 方法有对应按钮入口 - 按钮权限控制保持与原有逻辑一致 - 修复界面交互完整性,提升操作便捷性
9.1 KiB
9.1 KiB
2026-07-28 工作日志
货物类型导入模板美化
- 文件:
src/views/base/cargo-type.vue的handleTemplate() - 改动(第一次):表头行加主色底色
#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.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 后端生效。
国标 GB-T 42820-2023 数据 → cargo-type 导入(分析+转换)
- 源文件:
/Users/gxwebsoft/Downloads/副本货物类型导入模板_模拟数据(1).xlsx,单 Sheet,A1 是标题,真实表头在第 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/货物类型导入_一级.xlsx(19 条)、货物类型导入_二级.xlsx(116 条)。 - 用户确认:一级+二级都导、手动页面上传、测试/空环境直接导。导入动作由用户在系统"货物类型-批量导入"完成(两阶段:先一级后二级)。
- 后端导入机制补充(读 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.vue的handleTemplate()不再用 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方法始终未删,仅缺按钮入口,现已恢复。