feat(版本): 完善研发计划与预警已读

关键改动:

- 增加版本表单、发布校验和调研方向进度规则

- 扩展小宝预警已读状态、风险签名和今日证据

- 补充组长权限、加班查看范围、活动记录与相关测试

Co-Authored-By: Codex GPT-5 <codex@openai.com>
This commit is contained in:
Script Generator
2026-06-30 16:48:58 +08:00
parent 04520bd8c5
commit 3d3d56697a
41 changed files with 1701 additions and 121 deletions

View File

@@ -144,6 +144,14 @@ export function buildRiskInsightSignature(risk: XiaobaoVersionRisk): string {
});
}
export function buildRiskInsightDisplaySignature(risk: XiaobaoVersionRisk): string {
return normalizeRiskInsightDisplaySignature(buildRiskInsightSignature(risk)) ?? buildRiskInsightSignature(risk);
}
export function normalizeRiskInsightDisplaySignature(signature: string): string | undefined {
return buildDisplayCompatibilityKey(signature);
}
export function getReusableInsight(
cache: XiaobaoRiskInsightCacheItem[],
risk: XiaobaoVersionRisk,
@@ -365,7 +373,6 @@ function buildDisplayCompatibilityKey(signature: string): string | undefined {
progressNotes: normalizeCompatibilityEvidence(dailyEvidence.progressNotes),
needsProgressItems: normalizeCompatibilityEvidence(dailyEvidence.needsProgressItems),
totalActivityCount: normalizeInteger(dailyEvidence.totalActivityCount),
todayActualHours: normalizeNumber(dailyEvidence.todayActualHours),
},
});
} catch {
@@ -436,10 +443,6 @@ function normalizeInteger(value: unknown): number | null {
return typeof value === 'number' && Number.isFinite(value) ? Math.round(value) : null;
}
function normalizeNumber(value: unknown): number | null {
return typeof value === 'number' && Number.isFinite(value) ? Math.round(value * 10) / 10 : null;
}
function getTime(value: string): number {
const time = new Date(value).getTime();
return Number.isFinite(time) ? time : Number.NaN;