数据目录 F2b / C1:清单筛选「全部已确认」改为「没有待确认项」,「有未确认项」改为「有待确认项」,概览、顶部摘要、排序同步改写——「已确认」专指人工确认,只有已验证项的表不再说全部已确认;悬停写明已验证的项由外键约束或数据剖析核实、不需要逐项确认;补检查脚本的断言

This commit is contained in:
ThearchyHelios
2026-10-04 02:00:48 +08:00
parent fe4f551d71
commit b9ce058848
4 changed files with 23 additions and 19 deletions
+9 -8
View File
@@ -1988,15 +1988,16 @@ export const CATALOG_TEXT = {
// ---- 表清单
search: '搜索表名或中文名',
filterLabel: '按状态筛选',
filter: { all: '全部', pending: '有未确认项', done: '全部已确认', none: '没有目录' },
// 「已确认」专指人工确认:只有已验证项(外键约束、数据剖析核实)的表不能说「全部已确认」,按「没有待确认项」说
filter: { all: '全部', pending: '有待确认项', done: '没有待确认项', none: '没有目录' },
filterHint: {
all: '全部表',
pending: '还有推断状态的项',
done: '有目录,且没有推断状态的项',
pending: '还有推断状态的项,需要逐项确认',
done: '有目录,没有推断状态的项。已验证的项由外键约束或数据剖析核实,不需要逐项确认',
none: '还没有任何目录项',
},
sortLabel: '排序',
sort: { usage: '按使用次数', pending: '按未确认项', name: '按表名' },
sort: { usage: '按使用次数', pending: '按待确认项', name: '按表名' },
tableCount: (shown: number, total: number) =>
(shown === total ? `${formatNumber(total)} 张表` : `${formatNumber(shown)} / ${formatNumber(total)} 张表`),
selectAll: '全选当前结果',
@@ -2017,16 +2018,16 @@ export const CATALOG_TEXT = {
usageLead: (used: number) => `运行中查询过的 ${formatNumber(used)} 张表里,`,
usagePending: (n: number) => `有 ${formatNumber(n)} 张还有推断项未确认`,
usageNone: (n: number) => `${formatNumber(n)} 张还没有目录`,
usageAllDone: (used: number) => `运行中查询过的 ${formatNumber(used)} 张表都已确认`,
usageHintPending: '筛选有未确认项的表,按使用次数排序',
usageAllDone: (used: number) => `运行中查询过的 ${formatNumber(used)} 张表都没有待确认项`,
usageHintPending: '筛选有待确认项的表,按使用次数排序',
usageHintNone: '筛选没有目录的表,按使用次数排序',
// ---- 概览(没有选中表时)
overviewTitle: '选择一张表开始审阅',
overviewBody: '按使用次数从高到低逐表确认。推断的项只作提示,确认后才参与 SQL 检查。',
overviewStats: (total: number, pending: number, done: number, none: number) =>
`共 ${formatNumber(total)} 张表:${formatNumber(pending)} 张有未确认项,${formatNumber(done)} 张全部已确认,${formatNumber(none)} 张没有目录`,
`共 ${formatNumber(total)} 张表:${formatNumber(pending)} 张有待确认项,${formatNumber(done)} 张没有待确认项,${formatNumber(none)} 张没有目录`,
reviewNext: (name: string) => `审阅「${name}」`,
reviewNextHint: '使用次数最多、还有未确认项的表',
reviewNextHint: '使用次数最多、还有待确认项的表',
legend: '状态说明',
// ---- 起草
draft: '起草',
+1 -1
View File
@@ -498,7 +498,7 @@ function Overview({ rows, empty, systemNotes, draft, onOpen }: {
)
}
/** 审阅进度:有未确认项 / 全部已确认 / 没有目录的表各占多少 */
/** 审阅进度:有待确认项 / 没有待确认项 / 没有目录的表各占多少 */
function ProgressBar({ pending, done, none }: { pending: number; done: number; none: number }) {
const total = pending + done + none || 1
const seg = (n: number, color: string, label: string) => (n > 0
+1 -1
View File
@@ -130,7 +130,7 @@ export function visibleRows(rows: CatalogTableRow[], q: string, filter: ListFilt
/**
* 「用到但没确认」:运行中查询过的表(使用次数大于 0、还在表结构里)一共几张,其中几张还有推断项、几张还没有目录。
* 页面顶部的摘要按它写,点进去复用清单的筛选(有未确认项 / 没有目录)和按使用次数排序,不另做一套
* 页面顶部的摘要按它写,点进去复用清单的筛选(有待确认项 / 没有目录)和按使用次数排序,不另做一套
*/
export function usageSummary(rows: CatalogTableRow[]): { used: number; pending: number; none: number } {
const out = { used: 0, pending: 0, none: 0 }
+12 -9
View File
@@ -552,26 +552,29 @@ await section('数据目录 · 表清单的排序与筛选', async () => {
// 按状态筛选
const counts = await page.locator('[data-catalog-filter] [data-filter]').evaluateAll((els) => els.map((e) => e.innerText.replace(/\s+/g, '')))
check('筛选按钮带数量:全部 152、有未确认项 5、全部已确认 3、没有目录 144', counts.join('|') === '全部152|有未确认项5|全部已确认3|没有目录144', counts.join('|'))
check('筛选按钮带数量:全部 152、有待确认项 5、没有待确认项 3、没有目录 144', counts.join('|') === '全部152|有待确认项5|没有待确认项3|没有目录144', counts.join('|'))
// 「已确认」专指人工确认:只有已验证项的表不说「全部已确认」,说「没有待确认项」,悬停写明已验证的不需要逐项确认
check('筛选不说「全部已确认」(只有已验证项的表也在这一组)', !counts.join('|').includes('全部已确认')
&& (await page.locator('[data-filter="done"]').getAttribute('title')).includes('已验证的项由外键约束或数据剖析核实'))
await page.locator('[data-filter="pending"]').click()
names = await rowNames(page)
check('「有未确认项」:只有还有推断项的表', names.join(',') === 'visits,order_items,ticket_types,store_sales,inventory_snapshots', names.join(','))
check('「有待确认项」:只有还有推断项的表', names.join(',') === 'visits,order_items,ticket_types,store_sales,inventory_snapshots', names.join(','))
await page.locator('[data-filter="done"]').click()
names = await rowNames(page)
check('「全部已确认」:订单、景区、只剩目录的旧表', names.join(',') === 'orders,parks,legacy_coupons', names.join(','))
check('「没有待确认项」:订单、景区、只剩目录的旧表', names.join(',') === 'orders,parks,legacy_coupons', names.join(','))
await page.locator('[data-filter="none"]').click()
check('「没有目录」:144 张', (await rowNames(page)).length === 144)
// 筛选组是单选组:方向键在组内移动并选中
await page.locator('[data-filter="none"]').focus()
await page.keyboard.press('ArrowLeft')
check('筛选组:← 选中前一项「全部已确认」', (await page.locator('[data-catalog-filter]').getAttribute('data-catalog-filter')) === 'done')
check('筛选组:← 选中前一项「没有待确认项」', (await page.locator('[data-catalog-filter]').getAttribute('data-catalog-filter')) === 'done')
await page.locator('[data-filter="all"]').click()
// 排序
await page.locator('[data-catalog-sort]').selectOption('pending')
names = await rowNames(page)
const proposedOf = (n) => countsOf(state.tables[S1].find((t) => t.name === n)?.notes).proposed
check('按未确认项排序:推断项最多的在前', proposedOf(names[0]) >= proposedOf(names[1]) && proposedOf(names[1]) >= proposedOf(names[2])
check('按待确认项排序:推断项最多的在前', proposedOf(names[0]) >= proposedOf(names[1]) && proposedOf(names[1]) >= proposedOf(names[2])
&& names.at(-1) === 'legacy_coupons', names.slice(0, 3).join(','))
await page.locator('[data-catalog-sort]').selectOption('name')
names = await rowNames(page)
@@ -642,7 +645,7 @@ await section('数据目录 · 用到但没确认(顶部摘要)', async () =
const text = await bar.innerText()
check('写成一句话', text.includes(`运行中查询过的 ${used.length} 张表里,有 ${pending} 张还有推断项未确认,${none} 张还没有目录`), text)
await bar.locator('[data-usage-focus="pending"]').click()
check('点「还有推断项未确认」:切到「有未确认项」筛选',
check('点「还有推断项未确认」:切到「有待确认项」筛选',
(await page.locator('[data-catalog-filter]').getAttribute('data-catalog-filter')) === 'pending')
check('……排序是按使用次数', await page.locator('[data-catalog-sort]').inputValue() === 'usage')
const shown = await rowNames(page)
@@ -671,7 +674,7 @@ await section('数据目录 · 用到但没确认(顶部摘要)', async () =
for (const t of state.tables[S1]) if (!t.notes && t.usage > 0) t.notes = { label: item(t.name, 'human') }
await goto(page, `/data/catalog/${S1}`)
await bar.waitFor({ timeout: 3000 })
check('都确认了:写「都已确认」,没有按钮', (await bar.innerText()).includes(`运行中查询过的 ${used.length} 张表都已确认`)
check('都确认了:写「都没有待确认项」,没有按钮', (await bar.innerText()).includes(`运行中查询过的 ${used.length} 张表都没有待确认项`)
&& await bar.locator('[data-usage-focus]').count() === 0, await bar.innerText())
check('没有运行时报错', errors.length === 0, errors.join(' | '))
await close()
@@ -948,7 +951,7 @@ await section('数据目录 · 批量确认', async () => {
check('……提交后按钮消失、表头计数没有推断', await until(async () => (await btn.count()) === 0)
&& (await detail(page).locator('header [data-counts]').getAttribute('data-counts')).startsWith('0,'))
await until(async () => (await rowCounts(page, 'order_items')).startsWith('0,'))
check('……清单上这张表移到「全部已确认」', (await page.locator('[data-catalog-row="order_items"]').getAttribute('data-progress')) === 'done')
check('……清单上这张表移到「没有待确认项」', (await page.locator('[data-catalog-row="order_items"]').getAttribute('data-progress')) === 'done')
// 确认本列推断:只动这一列
await openDetail(page, S1, 'store_sales')
@@ -1169,7 +1172,7 @@ await section('数据目录 · 空状态与导入表格', async () => {
await goto(page, `/data/catalog/${S1}`)
const ovt = await page.locator('[data-catalog-overview]').innerText()
check('有目录、没选表时:写审阅进度,给出使用最多、还有推断项的表', ovt.includes('共 152 张表:5 张有未确认项,3 张全部已确认,144 张没有目录')
check('有目录、没选表时:写审阅进度,给出使用最多、还有推断项的表', ovt.includes('共 152 张表:5 张有待确认项,3 张没有待确认项,144 张没有目录')
&& (await page.locator('[data-catalog-review-next]').getAttribute('data-catalog-review-next')) === 'visits', ovt.replace(/\s+/g, ' ').slice(0, 120))
// 导入表格的源:说明由系统生成,只读