fix(ai): 自动追加AI任务类型

This commit is contained in:
Script Generator
2026-07-02 18:01:38 +08:00
parent 04954356bb
commit a39dde3824
14 changed files with 241 additions and 78 deletions

View File

@@ -8,7 +8,7 @@ import { useDevTaskStore } from '@/stores/useDevTaskStore';
import { useTestCaseStore } from '@/stores/useTestCaseStore';
import { useTaskCategoryStore } from '@/stores/useTaskCategoryStore';
import { useAuthStore } from '@/stores/useAuthStore';
import { findCategoryByCode, resolveCategoryIdFromCode } from '@/lib/task-category';
import { findCategoryByCode, type CategoryGroup } from '@/lib/task-category';
import { clampDevAiEstimateHours, clampTestCaseAiEstimateHours } from '@/lib/ai-estimation-policy';
import { resolveDecomposeDraftRequirementFields } from '@/lib/ai-decompose-adoption';
import { formatReportRequirementLabel } from '@/lib/ai-decompose-report';
@@ -45,7 +45,7 @@ export function DecomposeReportModal({
}: Props) {
const { createTask } = useDevTaskStore();
const { createTestCase } = useTestCaseStore();
const { categories } = useTaskCategoryStore();
const { categories, ensureCategory } = useTaskCategoryStore();
const user = useAuthStore((s) => s.user);
const { result: data, meta } = result;
@@ -90,6 +90,18 @@ export function DecomposeReportModal({
setSelectedTcIdx(n);
};
const resolveDraftTaskTypeName = (
draft: AgentDevTaskDraft | AgentTestCaseDraft,
fallbackGroup: Extract<CategoryGroup, 'development' | 'testing'>,
) => {
const explicitName = draft.taskTypeName?.trim();
if (explicitName) return explicitName;
const mappedName = findCategoryByCode(categories, draft.categoryCode)?.name;
if (mappedName) return mappedName;
if (draft.categoryCode) return draft.categoryCode;
return fallbackGroup === 'testing' ? '功能测试' : '开发任务';
};
const handleAdopt = () => {
if (submitting) return;
setSubmitting(true);
@@ -111,7 +123,8 @@ export function DecomposeReportModal({
const draft = data.devTaskDrafts[i];
const refs = normalizeRefs(draft.references);
const requirementFields = resolveDecomposeDraftRequirementFields({ ...draft, references: refs }, requirements);
const categoryId = resolveCategoryIdFromCode(categories, draft.categoryCode, 'development');
const taskTypeName = resolveDraftTaskTypeName(draft, 'development');
const categoryId = ensureCategory(taskTypeName, 'development').id;
const aiEstimateHours = clampDevAiEstimateHours(draft.categoryCode, draft.aiEstimateHours);
const recommendedAssignee = resolveRecommendedAssignee(draft, version.members ?? []);
@@ -152,7 +165,8 @@ export function DecomposeReportModal({
const draft = data.testCaseDrafts[i];
const refs = normalizeRefs(draft.references);
const requirementFields = resolveDecomposeDraftRequirementFields({ ...draft, references: refs }, requirements);
const categoryId = resolveCategoryIdFromCode(categories, draft.categoryCode, 'testing');
const taskTypeName = resolveDraftTaskTypeName(draft, 'testing');
const categoryId = ensureCategory(taskTypeName, 'testing').id;
const aiEstimateHours = clampTestCaseAiEstimateHours(draft.categoryCode, draft.aiEstimateHours);
const recommendedAssignee = resolveRecommendedAssignee(draft, version.members ?? []);
@@ -337,7 +351,7 @@ export function DecomposeReportModal({
<div className="flex items-center gap-2 flex-wrap">
<span className="text-[13px] font-medium text-[var(--ink)]">{d.title}</span>
<span className="text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-subtle)] text-[var(--ink-soft)]">
{findCategoryByCode(categories, d.categoryCode)?.name ?? d.categoryCode}
{resolveDraftTaskTypeName(d, 'development')}
</span>
<span className="text-[10px] px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600">
{d.priority}
@@ -408,7 +422,7 @@ export function DecomposeReportModal({
<div className="flex items-center gap-2 flex-wrap">
<span className="text-[13px] font-medium text-[var(--ink)]">{d.title}</span>
<span className="text-[10px] px-1.5 py-0.5 rounded bg-[var(--bg-subtle)] text-[var(--ink-soft)]">
{findCategoryByCode(categories, d.categoryCode)?.name ?? d.categoryCode}
{resolveDraftTaskTypeName(d, 'testing')}
</span>
<span className="text-[10px] px-1.5 py-0.5 rounded bg-zinc-100 text-zinc-600">
{d.priority}