feat(小宝预警): 调整风险列表布局和导航徽标
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import type { VersionWithContext } from './derive';
|
||||
import type { XiaobaoRiskInsight } from './xiaobao-risk-cache';
|
||||
import type { XiaobaoVersionRisk } from './xiaobao-risk';
|
||||
import { WORK_HOURS } from './work-hours';
|
||||
|
||||
const UNFINISHED_VERSION_STATUSES = new Set(['planned', 'developing', 'paused']);
|
||||
const HIGH_RISK_LEVELS = new Set<XiaobaoVersionRisk['riskLevel']>(['at_risk', 'likely_delayed', 'blocked']);
|
||||
const PAGE_REFRESH_ADVICE_PATTERNS = [
|
||||
/(刷新|重新加载|重载).*(页面|浏览器|小宝|预警)/i,
|
||||
/(页面|浏览器|小宝|预警).*(刷新|重新加载|重载)/i,
|
||||
@@ -16,6 +18,14 @@ export interface XiaobaoWarningVersionFilter {
|
||||
userName?: string;
|
||||
}
|
||||
|
||||
export type XiaobaoWarningRiskFilter = 'all' | 'attention' | 'high';
|
||||
|
||||
export interface XiaobaoWarningRiskListFilter {
|
||||
riskFilter?: XiaobaoWarningRiskFilter;
|
||||
productId?: string;
|
||||
projectId?: string;
|
||||
}
|
||||
|
||||
export function filterXiaobaoWarningVersions(
|
||||
versions: VersionWithContext[],
|
||||
filter: XiaobaoWarningVersionFilter,
|
||||
@@ -28,6 +38,24 @@ export function filterXiaobaoWarningVersions(
|
||||
});
|
||||
}
|
||||
|
||||
export function filterXiaobaoRiskWarnings(
|
||||
risks: XiaobaoVersionRisk[],
|
||||
filter: XiaobaoWarningRiskListFilter = {},
|
||||
): XiaobaoVersionRisk[] {
|
||||
return risks.filter((risk) => {
|
||||
if (risk.riskLevel === 'on_track') return false;
|
||||
if (filter.productId && risk.productId !== filter.productId) return false;
|
||||
if (filter.projectId && risk.projectId !== filter.projectId) return false;
|
||||
if (filter.riskFilter === 'attention') return true;
|
||||
if (filter.riskFilter === 'high') return HIGH_RISK_LEVELS.has(risk.riskLevel);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
export function getXiaobaoWarningRiskCount(risks: XiaobaoVersionRisk[]): number {
|
||||
return filterXiaobaoRiskWarnings(risks).length;
|
||||
}
|
||||
|
||||
export function formatRemainingWork(hours: number): string {
|
||||
const safeHours = Number.isFinite(hours) && hours > 0 ? hours : 0;
|
||||
const days = safeHours / WORK_HOURS.hoursPerDay;
|
||||
|
||||
Reference in New Issue
Block a user