Commit b581e91a authored by Data Governance Dev's avatar Data Governance Dev

fix(web3): resultFields.key 小写化对齐 db_adapter 列名归一 + errTip 直接用 key

T4 任务(task_id=16,GJ_DWRYBD 表,39 字段全是大写 YWBH/FCRS/...)跑完查询,
前端表格所有单元格都显示 (NULL),但备注列能正确显示「fcrs: 100到200之间」。

根因(列名大小写不匹配):
  - 后端 db_adapter._rows_as_dicts 全局把列名归一为小写
    (normalize_column_name line 188)
  - row dict 的 key 全是小写(ywbh / fcrs / ...)
  - 后端 _evaluate_row 用 cf.field_key = f.field_key.lower() 访问,
    所以规则匹配正常(备注列能正确显示就是证据)
  - 但前端 resultFields.key 用了 f.field_key 原值(大写 FCRS)
  - ResultTable 里 row[col.key] → row['FCRS'] → undefined → (NULL)

两处表现是同一个根因:
  - 单元格全 (NULL):row[col.key] 大写找不到
  - 错误 tooltip 永远 fallback「该字段不合法」:
    原版 errTip 用 col.cn(大写)找 row.issues[].field(小写),
    永远匹配不上

改动:
  DataQualityView.vue resultFields 里:
    key: (f.field_key || '').toLowerCase()   // 跟 row dict 小写对齐
    cn: f.field_key                          // 表头显示保留原大小写

  ResultTable.vue errTip:
    直接用 col.key(小写)找 row.issues[].field(小写),
    去掉 col.cn 那一跳

教训:「DB 列名大小写 × 字段名大小写 × 后端归一化策略」是反复出现的坑。
db_adapter 全局归一为小写是契约,前端落 key 时必须主动 .toLowerCase()。
parent cde42969
...@@ -194,12 +194,12 @@ function formatCell(v) { ...@@ -194,12 +194,12 @@ function formatCell(v) {
function isErrorCell(row, key) { function isErrorCell(row, key) {
return Array.isArray(row.errorCells) && row.errorCells.includes(key) return Array.isArray(row.errorCells) && row.errorCells.includes(key)
} }
// 错误描述:优先按 col.cn 在 row.issues 里找匹配,找不到就给通用文案 // 错误描述:按 col.key(小写)在 row.issues 里找匹配,找不到给通用文案
// 注:后端 issues[].field 是小写 cf.field_key(db_adapter 归一过),
// 不用 col.cn(保留原大小写作为表头显示)
function errTip(row, key) { function errTip(row, key) {
if (!isErrorCell(row, key)) return '' if (!isErrorCell(row, key)) return ''
const col = allColumns.value.find((x) => x.key === key) const issue = (row.issues || []).find((it) => it.field === key)
const fieldLabel = col ? col.cn : key
const issue = (row.issues || []).find((it) => it.field === fieldLabel)
return issue ? issue.desc : '该字段不合法' return issue ? issue.desc : '该字段不合法'
} }
function cellClass(row, key) { function cellClass(row, key) {
......
...@@ -250,7 +250,11 @@ async function onQuery() { ...@@ -250,7 +250,11 @@ async function onQuery() {
totalPages.value = start.total_pages totalPages.value = start.total_pages
totalRows.value = start.total_rows totalRows.value = start.total_rows
resultFields.value = (start.field_list || []).map((f) => ({ resultFields.value = (start.field_list || []).map((f) => ({
key: f.field_key, // 关键:key 跟 db_adapter.normalize_column_name 对齐成小写
// —— 后端 fetchall() 走 _rows_as_dicts 会把所有列名 .lower(),
// row dict 里的 key 都是小写(如 'fcrs');这里不归一就查不到值,单元格里 (NULL)。
// cn 保留原始大小写作为表头显示(用户截图里的列头是 "FCRS" 这种大写字段名)。
key: (f.field_key || '').toLowerCase(),
cn: f.field_key, cn: f.field_key,
en: '', en: '',
comment: f.field_comment || '', comment: f.field_comment || '',
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment