From 5e8d2c9c362ec20d0b9f48cbf99af486f119035a Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Tue, 6 Oct 2026 08:49:10 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=AF=B9=E6=AF=94=E5=A4=8D=E6=A0=B8=E6=95=B4=E6=94=B9?= =?UTF-8?q?=EF=BC=88=E5=89=8D=E7=AB=AF=EF=BC=89=EF=BC=9A=E9=A1=B5=E5=A4=B4?= =?UTF-8?q?=E7=9A=84=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1=E9=93=BE=E6=8E=A5?= =?UTF-8?q?=E5=9C=A8=E7=AA=84=E7=AA=97=E5=8F=A3=E9=87=8C=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E8=A2=AB=E6=8C=A4=E6=B2=A1=E3=80=81=E5=B8=A6=E6=97=A5=E5=8E=86?= =?UTF-8?q?=E5=9B=BE=E6=A0=87=E3=80=81=E4=BB=BB=E5=8A=A1=E5=88=A0=E4=BA=86?= =?UTF-8?q?=E5=86=99=E7=BA=AF=E6=96=87=E6=9C=AC=EF=BC=9B=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E7=9A=84=E5=AF=B9=E6=AF=94=E5=85=A5=E5=8F=A3?= =?UTF-8?q?=E6=94=B9=E5=8F=AB=E3=80=8C=E4=B8=8E=E4=B8=8A=E4=B8=80=E6=AC=A1?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E3=80=8D=E5=B9=B6=E5=86=99=E5=87=BA=E6=9C=89?= =?UTF-8?q?=E5=87=A0=E4=B8=AA=E6=8C=87=E6=A0=87=E6=9C=89=E5=8F=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 运行详情页头:元信息这一行改成可换行,定时任务链接至少留 7 个字宽。以前这一行不换行、只有链接能缩,820 宽的探索 运行只剩「由…」,768 宽为 0,Tab 停在看不见的链接上,「2 条事件」被压成竖排。链接前加和「定时」标记一样的日历 图标,平时看得出能点。取回的定时任务列表里没有这个任务(已删除)时写成纯文本「由定时任务「X」发起(已删除)」, 不再链到「不存在」页;列表取不到时不算删除 - 触发历史:「对比上一次」改成和运行详情「更多」菜单同一个叫法「与上一次对比」(复用 RUN_COMPARE_TEXT.menu),旁边 写「N 个指标有变化」,触屏和键盘也看得到变化的规模,悬停照旧写各类个数。基准不是紧挨着的上一次(服务端给 previous: false)时悬停写明是哪一次,也不再带「默认基准:同一定时任务的上一次运行」的来历 - 「通知中的运行链接」改成「通知中的链接」,说明里写清对比页链接也靠这个地址 - check-schedules:对比入口的叫法、计数、previous 为 false 时的悬停和来历;页头链接在 768、820 宽(含「提取为草稿」 的探索运行、署名的立即运行)写得下「由定时任务」且「条事件」不竖排、Tab 到时看得见;图标;定时任务删除后的纯文本 和列表取不到时照旧是链接;390 宽深浅色下计数在屏幕里、对比度够 --- frontend/src/lib/terms.ts | 46 ++++- frontend/src/pages/runs/RunDetailView.tsx | 3 +- frontend/src/pages/schedules/FireHistory.tsx | 26 ++- .../src/pages/schedules/WebhookFields.tsx | 4 +- frontend/src/pages/schedules/parts.tsx | 59 ++++-- frontend/src/types.ts | 12 +- scripts/check-schedules.mjs | 187 ++++++++++++++---- 7 files changed, 268 insertions(+), 69 deletions(-) diff --git a/frontend/src/lib/terms.ts b/frontend/src/lib/terms.ts index c5645c78..7d850bd5 100644 --- a/frontend/src/lib/terms.ts +++ b/frontend/src/lib/terms.ts @@ -2968,14 +2968,14 @@ export const SCHEDULE_TEXT = { testResult: (head: string, status: number | null, detail: string) => `${head}${status != null ? `(HTTP ${status})` : ''}${detail ? `:${detail}` : ''}`, - // ---- 通知里的运行链接(设置 notify 组,所有定时任务共用) - linkBase: '通知中的运行链接', + // ---- 通知里的链接:运行、对比页都按这个地址拼(设置 notify 组,所有定时任务共用) + linkBase: '通知中的链接', linkBaseValue: (url: string) => `按 ${url} 拼接`, - linkBaseUnset: '未设置服务访问地址,通知中不附带运行链接', + linkBaseUnset: '未设置服务访问地址,通知中不附带运行和对比页链接', linkBaseEdit: '修改', linkBaseSet: '设置', linkBaseLabel: '服务访问地址', - linkBaseHint: '收件人打开运行链接用的地址,例如 https://agentlab.example.com。所有定时任务共用', + linkBaseHint: '收件人打开运行、对比页链接用的地址,例如 https://agentlab.example.com。所有定时任务共用', linkBasePlaceholder: 'https://agentlab.example.com', linkBaseInvalid: '请输入以 http:// 或 https:// 开头的地址', linkBaseSaved: '已保存服务访问地址', @@ -3050,21 +3050,40 @@ export const SCHEDULE_TEXT = { allLoaded: '已全部加载', shown: (n: number) => `已显示 ${n} 条`, - // ---- 触发历史里的对比:运行结束后服务端自动和同一定时任务的上一次比一次 - compareLink: '对比上一次', + // ---- 触发历史里的对比:运行成功结束后,服务端自动和同一定时任务上一次成功的运行比一次 + /** + * 和运行详情「更多」菜单里的入口是同一件事,用同一个叫法。RUN_COMPARE_TEXT 定义在本对象之后,模块初始化时还取不到, + * 写成 getter 用到时再取 + */ + get compareLink() { return RUN_COMPARE_TEXT.menu }, /** * 悬停写各类指标的个数,和 Webhook 通知里那一行同一个写法(服务端 scheduler/auto_compare.py 的 summary_text): * 变化三分法的三类总写上,0 个也写;其余各类有才写,次序同对比页;两边都没有指标时不写一串 0 个。只有个数, - * 不写数值。各类的叫法用对比页那一套(RUN_COMPARE_TEXT.classLabel) + * 不写数值。各类的叫法用对比页那一套(RUN_COMPARE_TEXT.classLabel)。base 是基准的短编号,基准不是紧挨着的 + * 上一次(上一次失败了、取消了)时给,写明比的是哪一次,同通知 */ - compareTitle: (summary: Partial>) => { + compareTitle: (summary: Partial>, base?: string | null) => { const n = (key: string) => (typeof summary[key] === 'number' ? summary[key] as number : 0) const core = ['data_only', 'caliber_and_data', 'sql_changed'] const rest = ['params_only', 'added', 'removed', 'incomparable', 'unchanged'] - if (![...core, ...rest].some((key) => n(key) > 0)) return '与上一次相比:两次运行都没有指标' + const head = base ? `与上一次成功的运行(${base})相比` : '与上一次相比' + if (![...core, ...rest].some((key) => n(key) > 0)) return `${head}:两次运行都没有指标` const parts = [...core, ...rest.filter((key) => n(key) > 0)] .map((key) => `${RUN_COMPARE_TEXT.classLabel[key] ?? key} ${n(key)} 个`) - return `与上一次相比:${parts.join('、')}` + return `${head}:${parts.join('、')}` + }, + /** + * 链接旁看得见的简短计数:触屏没有悬停,键盘聚焦时也不显示 title,只靠悬停看不出变化的规模。有变化的几类(只数据变、 + * 口径与数据都变、SQL 结构变、只参数变、新增、移除)合起来写一个数;都没变化时说有几个无法比较,或者都未变;两边都 + * 没有指标时不写(悬停里有) + */ + compareCount: (summary: Partial>) => { + const n = (key: string) => (typeof summary[key] === 'number' ? summary[key] as number : 0) + const changed = ['data_only', 'caliber_and_data', 'sql_changed', 'params_only', 'added', 'removed'] + .reduce((sum, key) => sum + n(key), 0) + if (changed) return `${changed} 个指标有变化` + if (n('incomparable')) return `${n('incomparable')} 个指标无法比较` + return n('unchanged') ? '指标都未变' : null }, // ---- 运行详情页头的来源 @@ -3080,6 +3099,13 @@ export const SCHEDULE_TEXT = { /** 悬停写全名(页头窄时链接会截断)和点开去哪 */ runSourceTitle: (name?: string | null) => (name ? `定时任务「${name}」:查看设置和触发历史` : '查看这个定时任务的设置和触发历史'), + /** + * 定时任务已经删除(取回的定时任务列表里没有它):不再链过去——只会落到「不存在」页,页上的返回又回到定时任务列表。 + * 和同一行的「工作流已删除」一样写成纯文本 + */ + runSourceGone: (name?: string | null) => (name ? `由定时任务「${name}」发起(已删除)` : '由已删除的定时任务发起'), + runSourceManualGone: (name?: string | null) => (name ? `来自定时任务「${name}」(已删除)` : '来自已删除的定时任务'), + runSourceGoneTitle: '这个定时任务已删除,它发起的运行记录仍然保留', // ---- 记录页的定时标记 runTag: '定时', diff --git a/frontend/src/pages/runs/RunDetailView.tsx b/frontend/src/pages/runs/RunDetailView.tsx index 3a32e12d..271f0ef8 100644 --- a/frontend/src/pages/runs/RunDetailView.tsx +++ b/frontend/src/pages/runs/RunDetailView.tsx @@ -555,7 +555,8 @@ export function RunDetailView({ runId, onChange, onDeleted }: { -
+ {/* 窄时换行:不换行时这一行只有定时任务链接能缩,会被挤成 0 宽,其余各项被压成竖排 */} +
{shortId(run.id)} ·