feat: refine cutover operations board and monitoring performance

Protect previous wave coverage, normalize batch identities, cache shared metric evidence, and batch diff inserts. Add live continuity KPIs, server paging and filters, scoped business selection, and preserve legacy monitor rule metadata.

Validation: 198 backend tests passed with 1 opt-in benchmark skipped; 14 frontend unit tests and 24 browser checks passed; TypeScript and production build passed.
This commit is contained in:
oliver 2026-10-11 07:55:04 +08:00
parent fe4c1db763
commit 32d7d969f6
12 changed files with 731 additions and 151 deletions

View file

@ -696,6 +696,55 @@ const en = {
colChange: "Changes",
},
bizMigration: {
latestSnapshot: "Latest snapshot",
steadyOutside: "{{n}} stable items outside scope",
"followLive": "Follow live",
"historySnapshot": "Historical snapshot",
"evaluatedAt": "Evaluated",
"refreshBoard": "Refresh board",
"oldestSample": "Oldest sample",
"liveOverview": "Business migration overview",
"remaining": "Remaining items",
"anomalyInBatch": "Current wave anomalies",
"anomalyOutsideBatch": "Outside wave anomalies",
"coverageUnknown": "Uncertain coverage; acceptance cannot pass",
"coverageUnknownHint": "Resolve missing, stale or misaligned samples and duplicate keys. Healthy samples cover their own monitor items.",
"awaitingPeer": "Awaiting target sample",
"migratedPrevious": "Previous wave received",
"unfinishedPrevious": "Previous wave unfinished",
"sample_time_missing": "Sample time missing",
"sample_skew": "Samples too far apart",
"sample_stale": "Stale samples",
"duplicateKeys": "Duplicate business keys",
"uncoveredScope": "Missing scope sheets",
"refreshFailed": "Refresh failed; showing retained snapshot:",
"lastAcceptance": "Last acceptance",
"diffSearch": "Search business key / verdict / status",
"verdictFilter": "Verdict filter",
"allVerdicts": "All verdicts",
"warningVerdict": "In progress / warning",
"healthyVerdict": "Received / healthy",
"unknownVerdict": "Uncertain",
"loadingBoard": "Updating…",
"rowsMatched": "{{n}} matching items",
"showOutsideAnomalies": "Show outside anomalies",
"scopeCurrent": "Current wave",
"scopePrevious": "Previous wave",
"scopeOutside": "Outside scope",
"fieldChanges": "{{n}} changed fields",
"outsideProtection": "Protect businesses outside this wave",
"outsideProtectionHint": "Report drift outside this wave. Continue checking migrated businesses from previous waves without counting them in current progress.",
"reason_service_not_received": "Source departed; target not healthy",
"reason_target_unhealthy": "Target unhealthy",
"reason_old_service_not_in_baseline": "Business missing from source baseline",
"reason_service_content_changed": "Received business content differs",
"reason_old_service_still_present": "Business still on source",
"reason_target_sample_predates_source": "Target sample predates source departure",
"reason_previous_batch_received": "Previous wave remains healthy",
"reason_previous_batch_not_received": "Previous wave not received",
"reason_unmapped_same_iface": "Drift on unmapped interface",
"reason_out_of_expect:anomaly": "Business drift outside scope",
"reason_out_of_expect:lost": "Business lost outside scope",
title: "Cutover monitor",
hint: "Separate from business compare: baseline drift, expect set, dual-device verdict. Reuses collect tasks and port mappings.",
hintPort:
@ -862,8 +911,8 @@ const en = {
acceptFailedShort: "Fail",
colMapped: "Mapped new",
colDesc: "Description",
colOldPort: "Old port",
colNewPort: "New port",
colOldPort: "Old business key",
colNewPort: "New business key",
colOldStatus: "Old admin/phy/prot",
colNewStatus: "New admin/phy/prot",
colOld: "Old",

View file

@ -695,6 +695,55 @@ const zh = {
colChange: "变更",
},
bizMigration: {
latestSnapshot: "最新快照",
steadyOutside: "范围外稳定 {{n}} 条",
"followLive": "实时跟随",
"historySnapshot": "历史快照",
"evaluatedAt": "最近判定",
"refreshBoard": "刷新看板",
"oldestSample": "最早采集",
"liveOverview": "业务迁移概览",
"remaining": "待迁移条目",
"anomalyInBatch": "本批异常",
"anomalyOutsideBatch": "范围外异常",
"coverageUnknown": "数据待确认,不能视为验收通过",
"coverageUnknownHint": "采集缺失、过期、不同步或键冲突需要处理;正常样本仅代表对应监控条目。",
"awaitingPeer": "等待新侧采集确认",
"migratedPrevious": "前批已接续",
"unfinishedPrevious": "前批未接续",
"sample_time_missing": "采集时间缺失",
"sample_skew": "两侧采集间隔过大",
"sample_stale": "采集已过期",
"duplicateKeys": "重复业务键",
"uncoveredScope": "范围对应表已失效",
"refreshFailed": "获取失败,当前显示保留快照:",
"lastAcceptance": "上次终验",
"diffSearch": "搜索业务键 / 判定 / 状态",
"verdictFilter": "判定筛选",
"allVerdicts": "全部判定",
"warningVerdict": "迁移中 / 提示",
"healthyVerdict": "已接续 / 正常",
"unknownVerdict": "待确认",
"loadingBoard": "正在更新…",
"rowsMatched": "匹配 {{n}} 条",
"showOutsideAnomalies": "查看范围外异常",
"scopeCurrent": "本批范围",
"scopePrevious": "前批范围",
"scopeOutside": "范围之外",
"fieldChanges": "字段变化 {{n}} 项",
"outsideProtection": "范围外业务持续保护",
"outsideProtectionHint": "本批之外的业务漂移仍报异常;前批已迁移业务持续检查新侧健康,不计入本批进度。",
"reason_service_not_received": "老侧退出,新侧未健康接续",
"reason_target_unhealthy": "新侧业务状态异常",
"reason_old_service_not_in_baseline": "老基线中未找到业务",
"reason_service_content_changed": "接续业务内容不一致",
"reason_old_service_still_present": "老侧业务尚未退出",
"reason_target_sample_predates_source": "新侧样本早于老侧退出",
"reason_previous_batch_received": "前批业务持续健康",
"reason_previous_batch_not_received": "前批业务未正常接续",
"reason_unmapped_same_iface": "未映射端口发生迁移变化",
"reason_out_of_expect:anomaly": "范围外业务漂移",
"reason_out_of_expect:lost": "范围外业务丢失",
title: "割接监控",
hint: "与业务对比独立:相对基线漂移 + 本批预期 + 老/新双端判定。复用采集任务与端口映射。",
hintPort: "当前监控项:端口状态(interface_brief / admin·phy·prot)。选基线 → 勾选本批端口 → 判定看板。",
@ -857,8 +906,8 @@ const zh = {
acceptFailedShort: "未过",
colMapped: "映射新口",
colDesc: "描述",
colOldPort: "老端口",
colNewPort: "新端口",
colOldPort: "老侧业务标识",
colNewPort: "新侧业务标识",
colOldStatus: "老状态 admin/phy/prot",
colNewStatus: "新状态 admin/phy/prot",
colOld: "老侧",