diff --git a/frontend/src/lib/terms.ts b/frontend/src/lib/terms.ts index 2810b22d..0e1c6428 100644 --- a/frontend/src/lib/terms.ts +++ b/frontend/src/lib/terms.ts @@ -3082,7 +3082,11 @@ export const CATALOG_ASSISTANT_TEXT = { // - 「影响数字的项」:有效记录条件、去重规则、业务日期、关联关系、业务主键、度量类型——写错了查出来的数就不对,排在最前; // 「名称和含义」:中文名、含义、单位、码值、粒度、表类型。 // - 审阅过的项原地标出结果(已确认、已驳回、未生效),刷新队列后才移除;「撤销审阅」回到起草时的状态(推断)。 -// - 「常用 20 张表」:使用次数最多的 20 张。进度写「已确认 42%」。 +// - 每一项的位置写「列 status 的码值」「表的有效记录条件」「指向 parks 的关联关系」(同提案卡片),不只写字段名。 +// - 「常用 N 张表」:被运行用过、使用次数最多的前几张(最多 20 张),N 写实际张数;没有运行用过的表时写明。 +// - 进度写「已确认 42%」,三行同一个口径:已确认 ÷(已确认 + 待确认);已驳回的、有确证的(外键约束)不计入。 +// - 「使用 N 次」是所在表被运行查询过的次数(按查询算,同表清单);「用过这张表的运行」写「共 N 次运行」(按运行算), +// 两个数不一样,各自写明单位。 // =========================================================================== export const CATALOG_REVIEW_TEXT = { @@ -3120,7 +3124,7 @@ export const CATALOG_REVIEW_TEXT = { selected: (n: number) => `已选 ${formatNumber(n)} 项`, clearSelection: '取消选择', usage: (n: number) => `使用 ${formatNumber(n)} 次`, - usageHint: '所在表被运行查询过的次数', + usageHint: '所在表被运行查询过的次数,同一次运行中结果相同的重复查询只算一次', open: (where: string, table: string) => `打开「${table}」,查看${where}`, reasonsLabel: '排在这里的原因', // ---- 成批审阅 @@ -3151,15 +3155,25 @@ export const CATALOG_REVIEW_TEXT = { failedAll: (reason: string) => `未能提交:${reason}`, // ---- 进度 progressTitle: '审阅进度', + /** 常用表:被运行用过、使用次数最多的前几张(最多 topN 张),n 是实际张数 */ progressTop: (n: number) => `常用 ${formatNumber(n)} 张表`, - progressTopHint: (n: number) => `使用次数最多的 ${formatNumber(n)} 张表里的项`, + progressTopHint: (n: number, topN: number) => (n > 0 + ? `被运行用过、使用次数最多的 ${formatNumber(n)} 张表里的项(最多取 ${formatNumber(topN)} 张)` + : `被运行用过、使用次数最多的表里的项(最多取 ${formatNumber(topN)} 张)`), + progressTopNone: '常用表', + progressTopEmpty: '还没有运行用过的表', progressAll: '全部表', + progressAllHint: '这个数据源全部表里的项', progressFacts: '影响数字的项', progressFactsHint: '有效记录条件、去重规则、业务日期、关联关系、业务主键、度量类型', - confirmedPct: (pct: number | null) => (pct == null ? '还没有目录项' : `已确认 ${formatNumber(pct)}%`), - itemsOf: (confirmed: number, total: number) => `${formatNumber(confirmed)} / ${formatNumber(total)} 项`, - allDetail: (proposed: number, rejected: number) => `推断 ${formatNumber(proposed)} 项、已驳回 ${formatNumber(rejected)} 项`, - factsDetail: (proposed: number, confirmed: number) => `待确认 ${formatNumber(proposed)} 项、已确认 ${formatNumber(confirmed)} 项`, + progressRule: '已确认 ÷(已确认 + 待确认):已驳回的、有确证的(外键约束)不用再确认,不计入', + /** 一行进度:已确认百分比和待确认几项;不知道待确认几项时只写已确认几项 */ + progressText: (pct: number | null, confirmed: number, proposed: number | null, total: number | null) => { + if (total === 0) return '还没有目录项' + if (proposed == null) return `已确认 ${formatNumber(confirmed)} 项` + if (pct == null) return '没有待确认的项' + return `已确认 ${formatNumber(pct)}% · 待确认 ${formatNumber(proposed)} 项` + }, progressFailed: '无法读取审阅进度', // ---- 没选中项时的右栏 overviewTitle: '从左侧队列挑一项开始审阅', @@ -3178,8 +3192,10 @@ export const CATALOG_USAGE_TEXT = { show: '查看用过这张表的运行', hide: '收起', none: '还没有运行查询过这张表', + /** 按运行算(一次运行查询了几次这张表都只算一次),和表头按查询算的「使用 N 次」不是一个数 */ count: (shown: number, total: number) => (total > shown - ? `最近 ${formatNumber(shown)} 次,共 ${formatNumber(total)} 次` : `共 ${formatNumber(total)} 次`), + ? `共 ${formatNumber(total)} 次运行,显示最近 ${formatNumber(shown)} 次` : `共 ${formatNumber(total)} 次运行`), + countHint: '按运行算:一次运行查询了几次这张表都只算一次;表头的使用次数按查询算,两个数可能不一样', error: '无法读取用过这张表的运行', retry: '重试', unnamed: '未保存的工作流', diff --git a/frontend/src/pages/catalog/ReviewQueue.tsx b/frontend/src/pages/catalog/ReviewQueue.tsx index c1dda666..ba3a1d6c 100644 --- a/frontend/src/pages/catalog/ReviewQueue.tsx +++ b/frontend/src/pages/catalog/ReviewQueue.tsx @@ -10,15 +10,17 @@ import { errorMessage } from '../../lib/errors' import { CATALOG_REVIEW_TEXT as RT } from '../../lib/terms' import { StatusChip } from './parts' import { - REVIEW_BATCH_MAX, REVIEW_KINDS, REVIEW_PAGE, applyResults, batchTargets, itemKey, percentOf, statusOf, syncFromDetail, + REVIEW_BATCH_MAX, REVIEW_KINDS, REVIEW_PAGE, applyResults, batchTargets, confirmProgress, itemKey, reviewWhere, statusOf, + syncFromDetail, } from './review' import type { ItemOutcome } from './review' // =========================================================================== // 审阅队列(数据目录页的「审阅队列」视图,左栏):跨表列出推断项,顺序由服务端排好(所在表的使用次数 × 这一项对数字的 // 影响 × 来源),每一项写为什么排在这里。可以按项(影响数字的项 / 名称和含义)和表筛选;多选后成批确认、驳回,审阅过的 -// 原地标出结果(冲突的标出来),选中可以撤销审阅;刷新队列后审阅过的才移除。顶上是审阅进度:常用 20 张表、全部表、 -// 影响数字的项各确认了多少。点开一项,右栏是所在表的详情(滚到那一项、标出来)和用过这张表的运行。 +// 原地标出结果(冲突的标出来),选中可以撤销审阅;刷新队列后审阅过的才移除。顶上是审阅进度:常用表(使用次数最多、 +// 被运行用过的前 20 张)、全部表、影响数字的项各确认了多少,三行同一个口径。点开一项,右栏是所在表的详情(滚到那一项、 +// 标出来)和用过这张表的运行。 // =========================================================================== export function ReviewQueue({ sourceId, rows, kind, table, activeKey, detailSync, onParams, onOpenItem, onChanged }: { @@ -313,7 +315,8 @@ const QueueRow = memo(function QueueRow({ item: i, itemKeyText, tableLabel, outc onOpen: (item: CatalogReviewItem) => void }) { const status = statusOf(i, outcome) - const where = i.field_label || i.path + // 位置按 path 说(「列 status 的码值」):服务端的 field_label 只是字段的叫法,列级的项只写它分不清是哪一列 + const where = reviewWhere(i) const tableText = tableLabel ? `${tableLabel}(${i.table_name})` : i.table_name const mono = i.field === 'valid_filter' || i.field === 'keys' return ( @@ -327,7 +330,7 @@ const QueueRow = memo(function QueueRow({ item: i, itemKeyText, tableLabel, outc