feat(版本详情): 完善流程日志与需求覆盖

This commit is contained in:
Script Generator
2026-06-30 11:00:07 +08:00
parent d754585fe0
commit 1cd595c42e
38 changed files with 4123 additions and 237 deletions

View File

@@ -2,6 +2,7 @@
import { useEffect, useRef, useState } from 'react';
import { Sparkles, Loader2, AlertCircle, RotateCw } from 'lucide-react';
import { appendPlanLog } from '@/lib/version-plan';
import type { VersionPlan } from '@/lib/version-plan';
import type { VersionWithContext } from '@/lib/derive';
import { useVersionPlanStore } from '@/stores/useVersionPlanStore';
@@ -102,6 +103,23 @@ export function AiDecomposeButton({ plan, version }: Props) {
return '任务和用例';
};
const appendAiLog = (
target: AgentDecomposeTarget,
status: 'started' | 'completed' | 'error',
detail?: string,
) => {
const currentPlan = useVersionPlanStore.getState().plans.find((item) => item.id === plan.id) ?? plan;
const statusText = status === 'started' ? '已触发' : status === 'completed' ? '已完成' : '失败';
return appendPlanLog(currentPlan, {
type: 'ai_decompose',
actor: user?.name ?? plan.owner,
title: `AI 拆解${targetText(target)}${statusText}`,
detail,
aiTarget: target,
aiStatus: status,
});
};
const handleClick = async (target: AgentDecomposeTarget) => {
if (loading) return;
// 即便 persistStatus 是 in_progress只要超过阈值就允许重新点
@@ -117,6 +135,7 @@ export function AiDecomposeButton({ plan, version }: Props) {
aiDecomposeAt: new Date().toISOString(),
aiDecomposeTarget: target,
aiDecomposeError: undefined,
logs: appendAiLog(target, 'started'),
});
const members = (version.members ?? []).map((m) => ({
@@ -144,6 +163,7 @@ export function AiDecomposeButton({ plan, version }: Props) {
aiDecomposeStatus: 'error',
aiDecomposeTarget: target,
aiDecomposeError: resp.error,
logs: appendAiLog(target, 'error', resp.error),
});
} else {
const targetFilteredResult = filterDecomposeResultByTarget(resp.result, target);
@@ -166,6 +186,11 @@ export function AiDecomposeButton({ plan, version }: Props) {
aiDecomposeStatus: 'completed',
aiDecomposeTarget: target,
aiDecomposeError: undefined,
logs: appendAiLog(
target,
'completed',
`生成开发任务 ${deduped.result.devTaskDrafts.length} 条,测试用例 ${deduped.result.testCaseDrafts.length} 条。已过滤重复开发任务 ${deduped.removedDevTaskCount} 条,重复测试用例 ${deduped.removedTestCaseCount} 条。`,
),
});
}
} catch (e: any) {
@@ -174,6 +199,7 @@ export function AiDecomposeButton({ plan, version }: Props) {
aiDecomposeStatus: 'error',
aiDecomposeTarget: target,
aiDecomposeError: msg,
logs: appendAiLog(target, 'error', msg),
});
} finally {
setActiveTarget(null);