fix(小宝预警): 过滤无效页面刷新建议

This commit is contained in:
Script Generator
2026-06-30 09:44:41 +08:00
parent 50e76c8068
commit 4cecf2d77a
6 changed files with 97 additions and 7 deletions

View File

@@ -21,7 +21,7 @@ import { calcXiaobaoVersionRisk, type XiaobaoVersionRisk } from '@/lib/xiaobao-r
import { buildRiskInsightSignature, findLatestRiskInsightForVersion, findPreviousRiskSnapshot, getReusableInsight, requestRiskInsight, shouldRequestRiskInsightWithCooldown } from '@/lib/xiaobao-risk-ai';
import { buildVersionDailyEvidence, buildXiaobaoWorkItems } from '@/lib/xiaobao-risk-evidence';
import { buildRiskSignature, findLatestDailySnapshot, shouldSaveRiskSnapshot } from '@/lib/xiaobao-risk-trend';
import { filterXiaobaoWarningVersions } from '@/lib/xiaobao-warning-view';
import { filterXiaobaoWarningVersions, sanitizeRiskInsight } from '@/lib/xiaobao-warning-view';
type RiskFilter = 'all' | 'attention' | 'high';
@@ -155,7 +155,7 @@ function XiaobaoWarningContent() {
saveInsight({
versionId: risk.versionId,
riskSignature: signature,
insight: response.result,
insight: sanitizeRiskInsight(response.result),
generatedAt: new Date().toISOString(),
providerInfo: { model: response.meta.model },
}).catch(() => {});
@@ -165,7 +165,7 @@ function XiaobaoWarningContent() {
const risksWithInsight = useMemo(() => risks.map((risk) => {
const cached = getReusableInsight(insights, risk);
return cached ? { ...risk, aiInsight: cached.insight } : risk;
return cached ? { ...risk, aiInsight: sanitizeRiskInsight(cached.insight) } : risk;
}), [insights, risks]);
const filteredRisks = useMemo(() => risksWithInsight.filter((risk) => {

View File

@@ -1,7 +1,7 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import type { VersionWithContext } from './derive';
import { filterXiaobaoWarningVersions, formatRemainingWork } from './xiaobao-warning-view';
import { filterXiaobaoWarningVersions, formatRemainingWork, sanitizeRiskInsight } from './xiaobao-warning-view';
function version(patch: Partial<VersionWithContext> = {}): VersionWithContext {
return {
@@ -52,3 +52,19 @@ test('formatRemainingWork keeps hours and adds work-day conversion', () => {
assert.equal(formatRemainingWork(12), '12h / 1.5天');
assert.equal(formatRemainingWork(0.5), '0.5h / 0.1天');
});
test('sanitizeRiskInsight filters invalid page refresh suggested actions', () => {
const result = sanitizeRiskInsight({
summary: '风险上升',
why: ['P1 Bug 增加'],
forecast: '预计延期 1 天',
suggestedActions: [
'手动触发页面刷新,等待小宝预警自动更新',
'优先处理 3 个 P1 Bug并同步测试负责人复测',
],
ownerHints: ['研发负责人协调修复顺序'],
generatedAt: '2026-06-30T10:00:00.000Z',
});
assert.deepEqual(result.suggestedActions, ['优先处理 3 个 P1 Bug并同步测试负责人复测']);
});

View File

@@ -1,7 +1,15 @@
import type { VersionWithContext } from './derive';
import type { XiaobaoRiskInsight } from './xiaobao-risk-cache';
import { WORK_HOURS } from './work-hours';
const UNFINISHED_VERSION_STATUSES = new Set(['planned', 'developing', 'paused']);
const PAGE_REFRESH_ADVICE_PATTERNS = [
/(刷新|重新加载|重载).*(页面|浏览器|小宝|预警)/i,
/(页面|浏览器|小宝|预警).*(刷新|重新加载|重载)/i,
/(手动|主动).*(触发|刷新).*(更新|预警|分析)/i,
/(manual|manually).*(refresh|reload|trigger)/i,
/(refresh|reload).*(page|browser|xiaobao|warning)/i,
];
export interface XiaobaoWarningVersionFilter {
canManage: boolean;
@@ -26,7 +34,19 @@ export function formatRemainingWork(hours: number): string {
return `${formatNumber(safeHours)}h / ${formatNumber(days)}`;
}
export function sanitizeRiskInsight(insight: XiaobaoRiskInsight): XiaobaoRiskInsight {
return {
...insight,
suggestedActions: insight.suggestedActions.filter((action) => !isPageRefreshAdvice(action)),
ownerHints: insight.ownerHints.filter((hint) => !isPageRefreshAdvice(hint)),
};
}
function formatNumber(value: number): string {
if (Number.isInteger(value)) return String(value);
return value.toFixed(1).replace(/\.0$/, '');
}
function isPageRefreshAdvice(text: string): boolean {
return PAGE_REFRESH_ADVICE_PATTERNS.some((pattern) => pattern.test(text));
}