数据回来了(2 条),但页面不渲染 —— 大概率是前端取值路径/格式对不上。去 dist 里找这段列表的渲染逻辑。前端已经重新打包过(dist 文件名变了)。看这段列表渲染代码具体怎么取值的。字段取值看着能对上,关键在拉取后的处理。看查询方法本身。找到关键了。看一下这个请求走的是哪个 axios 封装,以及字段映射。响应拦截器是 return e 直通,所以 t.data 就是那个 JSON。问题在数据路径 —— 前端只认 rows/list/data,后端给的是 Spring Page 的 content。再确认后端接口和前端传参。项目整体惯例就是返回 PageImpl。对比一下其它已正常工作的列表页前端怎么取。前端读取路径已确认:res.data.data.content(项目全局惯例),只有产险这两个 chunk 例外。再核对一下状态字典和时间格式是否也有坑。状态字典能匹配,但还有两处取值差异要确认。看下 normalizeListRow 完整字段。前端两个页面完全一致,确认是取值路径不匹配。由于你不动前端,我在后端做兼容(不动前端任何文件)。先确认可用 import。编译通过(仍是那 8 条 classpath 混入老 slf4j 导致的 logger.error 假错误,无新增)。记录一下本次排查结论。确认了:是前端取值路径写错,后端数据本身没问题。我按你的要求一个前端文件都没动,改成让后端兼容。

原因

后端 queryBatchPage 原本返回 Spring 的 PageImpl,JSON 结构是 {content, totalElements, number, size, totalPages} —— 这是本项目几十个列表页的统一契约。

但 dist 里产险这两个新 chunk(67.152afdf6*.js / 69.c08d881b*.js)是这么写的:

JavaScript
复制成功
var a = t.data.data || {},
o = Array.isArray(a) ? a : a.rows || a.list || a.data || [];
e.tableData = o.map(...);
e.totalRecords = null != a.total ? a.total : t.data.totalRecords || o.length || 0;

它只认 rows / list / data,不认 content。而你返回的正是 content → rows/list/data 全是 undefined → o = [] → 表格空,totalRecords 也算成 0。所以「有数据但什么都不展示」。

对比一下全项目其余页面,一眼就能看出这是新页面的写法跑偏了:

Code
复制成功
179.9155f80c.js: e.tableData = a.data.data.content; e.totalRecords = a.data.data.totalElements
24.f782e4b7.js: e.tableData = t.data.data.content; e.totalRecords = t.data.data.totalElements
90.bd31b232.js: e.tableData = t.data.data.content; e.totalRecords = t.data.data.totalElements
...(dist 里几十处,无一例外)
67/69.js: a.rows || a.list || a.data ← 仅这两个

顺带说一下:这不是网络/拦截器问题,request.js 的响应拦截器是 function(e){return e} 直通,t.data 就是你看到的那份 JSON;也不是 transformResponse 那种老坑(那是 tabyperf)。

我改了什么(后端,前端零改动)

PropertyInsuranceImportServiceImpl.queryBatchPage:

  1. 分页结构同时输出两套别名 —— content / rows / list / data 都指向同一个数组,totalElements / total / totalRecords 都指向总数;另外补了 number/current/size/pagesize/totalPages/first/last。这样前端按哪套取都能命中,也不影响将来谁按项目惯例去接。
  2. 时间列:后端原本输出 1790131919000 这种毫秒数(全站没配 jackson 日期格式),前端是原样渲染的,会显示一长串数字。新增 formatDateTime 把 uploadTime/approveTime 转成 yyyy-MM-dd HH:mm:ss。
  3. 备注列:前端读 remark,库里叫 approve_remark,行内补了 remark 别名。

编译验证过了(差分验证确认 javac 真的在做类型检查),无新增错误;只剩那 8 条 classpath 混入老版 slf4j 导致的 logger.error 假错误,与本次改动无关。改完需要重启应用。

还有两个同类的坑,先说一声(还没动)

  • 查看详情大概率也是空的:GET /import/batch/detail 前端读 a.batch(✓)+ a.rows||a.details||a.items||a.list,而后端给的是 carRows / noCarRows;而且 stg 表是 select *,字段名是下划线(policy_no),前端 normalizeDetailRow 读的是驼峰(policyNo/underwriteDate/effectDate…)。要不要我一并按同样方式加兼容 + 做驼峰别名,你说一声。
  • 页面上还有「审核历史」「删除」「任务详情导出」三个入口,对应后端 batch/auditHistory、batch/delete、导出接口都还没实现(前端自己提示"接口待后端提供")。

本页笔记

加载中…