fix(小宝预警): 稳定风险证据与建议更新

关键改动:

- 优化风险证据的日报工时与静默风险计算

- 稳定 AI 触发签名,避免证据细节变化造成重复请求

- 调整预警建议更新状态与相关测试

Co-Authored-By: Codex GPT-5 <codex@openai.com>
This commit is contained in:
Script Generator
2026-07-01 11:26:16 +08:00
parent 8947aeaac7
commit e5ef9ee28b
7 changed files with 421 additions and 43 deletions

View File

@@ -11,9 +11,13 @@ import { sanitizeRiskInsight } from './xiaobao-warning-view';
interface AttachXiaobaoRiskSuggestionInput {
insights: XiaobaoRiskInsightCacheItem[];
pendingInsightKeys: string[];
pendingInsightAttempts?: Record<string, string>;
pendingInsightVisibleMs?: number;
now?: Date;
}
const DEFAULT_PENDING_INSIGHT_VISIBLE_MS = 3 * 60 * 1000;
const RISK_LEVEL_LABEL: Record<XiaobaoVersionRisk['riskLevel'], string> = {
on_track: '按期',
attention: '需关注',
@@ -31,7 +35,7 @@ export function attachXiaobaoRiskSuggestion(
input: AttachXiaobaoRiskSuggestionInput,
): XiaobaoVersionRisk {
const pendingKey = buildXiaobaoRiskInsightPendingKey(risk);
const isUpdating = input.pendingInsightKeys.includes(pendingKey);
const isUpdating = isFreshPendingInsight(pendingKey, input);
const reusable = getReusableInsight(input.insights, risk);
if (reusable) {
return {
@@ -60,6 +64,19 @@ export function attachXiaobaoRiskSuggestion(
};
}
function isFreshPendingInsight(pendingKey: string, input: AttachXiaobaoRiskSuggestionInput): boolean {
if (!input.pendingInsightKeys.includes(pendingKey)) return false;
const requestedAt = input.pendingInsightAttempts?.[pendingKey];
if (!requestedAt) return true;
const requestedTime = new Date(requestedAt).getTime();
const nowTime = (input.now ?? new Date()).getTime();
if (!Number.isFinite(requestedTime) || !Number.isFinite(nowTime)) return false;
const visibleMs = input.pendingInsightVisibleMs ?? DEFAULT_PENDING_INSIGHT_VISIBLE_MS;
return nowTime - requestedTime < visibleMs;
}
export function buildRuleBasedRiskInsight(risk: XiaobaoVersionRisk, now = new Date()): XiaobaoRiskInsight {
const firstReason = risk.reasons[0];
const why = risk.reasons.length > 0