Files
tms-erp-web/.workbuddy/memory/2026-09-17.md
T
gxwebsoft 3d6e297147 feat(vehicle): 归一化保险记录导入日期格式,修复设备台账批量删除按钮
- 保险记录批量导入时,前端读取 Excel 并规范日期格式为 YYYY-MM-DD,兼容多种日期写法
- 重写 `handleImport` 支持自定义上传逻辑,调用归一化处理后再上传文件
- 添加日期归一化相关方法,确保不合法或已标准格式保持原值
- 设备台账界面新增批量删除按钮及相关逻辑,支持多选数据批量删除并提示确认
- 补充导出含创建时间和更新时间的后端修复说明,避免导出时间字段为空问题
- 说明后端导出分配逻辑,强调导出字段由后端控制,前端修改导出列无效
2026-09-17 21:21:33 +08:00

5.5 KiB
Raw Blame History

2026-09-17 工作日志

运单管理详情:打卡时间轴改为按打卡顺序展示

  • 文件:src/views/business/components/waybill-manage-page.vue(详情页「执行详情 → 打卡详情」tab)
  • 需求:时间轴不再固定按流程节点顺序(发货/在途/到货/卸货/签收/回单),改为按打卡时间先后展示。
  • 实现(不改后端、不改原始数据):
    1. 新增 computed orderedWaybillPunchRecords:映射出 punchedAt(毫秒时间戳)后排序 —— 已打卡记录按打卡时间升序排在前,未打卡记录保持后端返回的节点顺序排在其后;时间相同用原索引稳定排序。
    2. 新增 method waybillPunchRecordTimestamp(record)punched === falsestatusName === '未打卡' 直接返回 null(防止后端返回计划时间造成误序);优先 this.$dayjs(text).valueOf(),失败兜底 new Date(text.replace(/-/g,'/'))(兼容 Safari)。
    3. 模板 el-timelinev-for 改用 orderedWaybillPunchRecordskeyrecord.nodeCode || record.id || index 改为 ${nodeCode||id||'punch'}-${index},避免同节点多次打卡(在途)时 key 重复。
  • 校验:项目根目录临时脚本 _verify-sfc.mjs@vue/compiler-sfc parse + compileScript + compileTemplate)通过,已删除脚本。
  • 注意:getPunchRecordssrc/api/business/waybill-manage.js/punch-records)后端未提供节点排序字段,排序只能在前端做。

保险记录批量导入:前端归一化日期格式

  • 文件:src/views/vehicle/insurance-record.vue(仅此一个文件)
  • 背景:保险记录批量导入是后端驱动——前端 handleImportimportBlob 把原始 Excel 直接 POST 到 /blade-transport/insurance-record/import-insurance-record,前端不解析行。后端只认 2026-09-012026-9-1 导入失败。
  • 决策:用户选择前端归一化(不动后端)。把 openImportDialog 改为自写 httpRequest:用 xlsx 读取 Excel → 把日期列(开始日期/结束日期/开票日期)2026-9-1 归一为 2026-09-01 → 重写成新 File 再交给 handleImportExcel 上传;复用其失败明细下载与成功刷新逻辑。无日期列时回退为原文件(行为不变)。
  • 关键方法:normalizeExcelDates / readExcelRows / writeExcelFile / normalizeDateString(正则 ^(\d{4})[-/.年](\d{1,2})[-/.月](\d{1,2})日?$,用 new Date 校验合法性后补零;非法/已标准格式返回 null 保持原值)。
  • 校验:本机 devlocalhost:2889)待用户部署自测。注意所有单元格经 sheet_to_json(raw:false) 后均为字符串,与 transport-plan-import 的客户端解析模式一致。

车/船务模块导出 xlsx「创建时间/更新时间」为空(后端 tms-api 修复)

  • 现象:/vehicle/insurance-record 批量导出的 xlsx 里「创建时间」「更新时间」两列空白,「更新人」有值。用户要求车/船务模块所有页面统一修。
  • 定位:导出由后端生成(前端只传查询参数,exportColumns 参数后端未使用)。实测 ~/Downloads/保险记录2026-09-17 20_46_08.xlsxK/M 列单元格无 <v> 节点(值 null),E/F/J 日期列是数值 46266.0(带 numFmt yyyy-MM-ddWPS 显示为日期)。
  • 根因:Service 用 BladeX org.springblade.core.tool.utils.BeanUtil继承 Spring BeanUtils)做 copyProperties。实体 TenantEntity.createTime/updateTimejava.util.Date,导出类字段是 java.time.LocalDateTime → Spring BeanUtils 类型不兼容静默跳过,值为 null。而「更新人」是手动 UserCache.getUserRealName(...) 赋值的,所以有值。(Hutool 的 BeanUtil 能转 Date→LocalDateTime,但本项目用的是 BladeX 版本,不能。)
  • 佐证:项目里正常的导出(Waybill / LoadingManage / CustomerArchive / CommonCargo)时间字段一律用 java.util.Date,并在 Service 里手动 excel.setCreateTime(record.getCreateTime())
  • 修复(后端仓库 /Users/gxwebsoft/JAVA/tms-apiblade-transport 模块):在 13 个导出方法里补显式赋值(Date→LocalDateTime 用 BladeX DateUtil.fromDateFunc.isEmpty 判空),不改 Excel 类字段类型(避免影响自定义 converter 与导入模板)。
    excel.setCreateTime(Func.isEmpty(x.getCreateTime()) ? null : DateUtil.fromDate(x.getCreateTime()));
    excel.setUpdateTime(Func.isEmpty(x.getUpdateTime()) ? null : DateUtil.fromDate(x.getUpdateTime()));
    
  • 涉及文件(13 个 Service + 1 新建 Excel 类 + 设备台账 controller/接口):InsuranceRecord / ViolationRecord / MaintenanceRecord / MaintenancePlan / TireReplacementRecord / AccidentRecord / AnnualInspectionRecord / MileageRecord / TransportChangeRecord / EtcRecord / OilElectricRecord / OtherExpenseRecord / EquipmentLedger。
  • 设备台账特殊:原 EquipmentLedgerExcel 根本没有审计列(前端列表有),新建 EquipmentLedgerExportExcel extends EquipmentLedgerExcel(创建时间/更新人/更新时间),导出链路改用新类,导入模板仍用旧类不受影响
  • 未验证:本机无 mvn(仅 IDEA 内置),且离线模式缺 blade-bom 无法编译;用 javap 确认 DateUtil.fromDate(Date) 存在 + 逐行 grep 复核代替。需用户在 IDEA 里编译并重新部署后自测。
  • 同类隐患(本次未改,其他模块):TemporaryCreditLimit、ProcessConfig、CommonRoute、CommonAddress、ContractManage、ProjectApply、ShippingTemplate 的导出 Excel 也是 LocalDateTime 且未手动 set 时间。