From 10ffb874aaaf1c6a9c99f905330578dfc56e24ec Mon Sep 17 00:00:00 2001 From: Script Generator Date: Fri, 12 Jun 2026 14:44:49 +0800 Subject: [PATCH] =?UTF-8?q?refactor(dev-task):=20=E5=8E=BB=E6=8E=89"?= =?UTF-8?q?=E5=B7=B2=E5=AE=8C=E6=88=90"=E7=8A=B6=E6=80=81=EF=BC=8C"?= =?UTF-8?q?=E5=B7=B2=E6=8F=90=E6=B5=8B"=E4=BD=9C=E4=B8=BA=E7=BB=88?= =?UTF-8?q?=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DevTask 状态简化为:待开发 → 开发中 → 自测 → 已提测(终态) - 提测即代表开发交付完成,不需要额外的"已完成" - 测试通过/失败产生的是 Bug,不影响 DevTask 状态 - 移除 TestCaseStore 中的自动完成副作用(不再需要) - 版本执行态推导规则同步更新 Co-Authored-By: Claude Opus 4.7 (1M context) --- apps/web/app/workspace/page.tsx | 2 +- apps/web/components/test-case/TestCaseTab.tsx | 4 ++-- apps/web/lib/dev-task.ts | 14 +++++-------- apps/web/lib/version-status.ts | 6 +----- apps/web/stores/useTestCaseStore.ts | 20 ------------------- 5 files changed, 9 insertions(+), 37 deletions(-) diff --git a/apps/web/app/workspace/page.tsx b/apps/web/app/workspace/page.tsx index 4c0b7a3..4ed7ecd 100644 --- a/apps/web/app/workspace/page.tsx +++ b/apps/web/app/workspace/page.tsx @@ -63,7 +63,7 @@ export default function WorkspacePage() { // 我负责的所有未完成开发任务 const myDevTasks = useMemo(() => - devTasks.filter((t) => t.assigneeId === userName && t.status !== 'done'), + devTasks.filter((t) => t.assigneeId === userName && t.status !== 'submitted'), [devTasks, userName] ); diff --git a/apps/web/components/test-case/TestCaseTab.tsx b/apps/web/components/test-case/TestCaseTab.tsx index a11bd44..86da422 100644 --- a/apps/web/components/test-case/TestCaseTab.tsx +++ b/apps/web/components/test-case/TestCaseTab.tsx @@ -37,7 +37,7 @@ export function TestCaseTab({ versionId, requirementIds }: Props) { // 提测状态判断 const versionDevTasks = useMemo(() => devTasks.filter((t) => requirementIds.includes(t.requirementId)), [devTasks, requirementIds]); - const allSubmitted = versionDevTasks.length > 0 && versionDevTasks.every((t) => t.status === 'submitted' || t.status === 'done'); + const allSubmitted = versionDevTasks.length > 0 && versionDevTasks.every((t) => t.status === 'submitted'); const stats = calcTestProgress(versionCases); @@ -89,7 +89,7 @@ export function TestCaseTab({ versionId, requirementIds }: Props) { )} {versionDevTasks.length > 0 && !allSubmitted && (
- 开发进行中,尚未全部提测({versionDevTasks.filter((t) => t.status === 'submitted' || t.status === 'done').length}/{versionDevTasks.length}) + 开发进行中,尚未全部提测({versionDevTasks.filter((t) => t.status === 'submitted').length}/{versionDevTasks.length})
)} {/* 统计栏 */} diff --git a/apps/web/lib/dev-task.ts b/apps/web/lib/dev-task.ts index eabe5f7..3881f9a 100644 --- a/apps/web/lib/dev-task.ts +++ b/apps/web/lib/dev-task.ts @@ -1,6 +1,6 @@ import type { Priority } from './derive'; -export type DevTaskStatus = 'todo' | 'in_progress' | 'testing' | 'submitted' | 'done'; +export type DevTaskStatus = 'todo' | 'in_progress' | 'testing' | 'submitted'; export interface DevTask { id: string; @@ -33,32 +33,28 @@ export const DEV_TASK_STATUS_LABEL: Record = { todo: '待开发', in_progress: '开发中', testing: '自测', - submitted: '提测', - done: '已完成', + submitted: '已提测', }; export const DEV_TASK_STATUS_COLOR: Record = { todo: 'bg-zinc-100 text-zinc-600', in_progress: 'bg-blue-50 text-blue-600', testing: 'bg-purple-50 text-purple-600', - submitted: 'bg-orange-50 text-orange-600', - done: 'bg-emerald-50 text-emerald-600', + submitted: 'bg-emerald-50 text-emerald-600', }; export const STATUS_PROGRESS: Record = { todo: 0, in_progress: 50, testing: 80, - submitted: 90, - done: 100, + submitted: 100, }; export const ALLOWED_TRANSITIONS: Record = { todo: ['in_progress'], in_progress: ['testing'], testing: ['submitted', 'in_progress'], - submitted: ['done', 'in_progress'], - done: [], + submitted: [], }; export function canTransition(from: DevTaskStatus, to: DevTaskStatus): boolean { diff --git a/apps/web/lib/version-status.ts b/apps/web/lib/version-status.ts index 3c83897..3498f0a 100644 --- a/apps/web/lib/version-status.ts +++ b/apps/web/lib/version-status.ts @@ -79,8 +79,7 @@ export function calcVersionExecutionStatus(input: ExecutionInput): VersionExecut // fallback: 没有 DevTask 则停留 planning if (devTasks.length === 0) return 'planning'; - const allDevDone = devTasks.every((t) => t.status === 'done'); - const allDevSubmitted = devTasks.every((t) => t.status === 'submitted' || t.status === 'done'); + const allDevSubmitted = devTasks.every((t) => t.status === 'submitted'); // 判断是否可发布 if (testCases.length > 0) { @@ -98,8 +97,5 @@ export function calcVersionExecutionStatus(input: ExecutionInput): VersionExecut // 已提测 if (allDevSubmitted) return 'submitted'; - // 开发完成但未全部提测 - if (allDevDone) return 'submitted'; - return 'developing'; } diff --git a/apps/web/stores/useTestCaseStore.ts b/apps/web/stores/useTestCaseStore.ts index 266c05e..35fbf7c 100644 --- a/apps/web/stores/useTestCaseStore.ts +++ b/apps/web/stores/useTestCaseStore.ts @@ -83,26 +83,6 @@ export const useTestCaseStore = create((set, get) => ({ if (to === 'blocked' && extra?.blockReason) patch.blockReason = extra.blockReason; if (to === 'running') { patch.failReason = undefined; patch.blockReason = undefined; } get().updateTestCase(id, patch); - - // 副作用:当版本所有用例通过 + Bug全关闭 → DevTask 自动完成 - if (to === 'passed' && tc.versionId) { - setTimeout(() => { - try { - const { useDevTaskStore } = require('@/stores/useDevTaskStore'); - const { useBugStore } = require('@/stores/useBugStore'); - const allCases = get().testCases.filter((c) => c.versionId === tc.versionId); - const allPassed = allCases.every((c) => c.id === id ? true : c.status === 'passed'); - if (!allPassed) return; - const allBugs = useBugStore.getState().bugs.filter((b: any) => b.versionId === tc.versionId); - const allBugsClosed = allBugs.every((b: any) => b.status === 'closed' || b.status === 'rejected'); - if (!allBugsClosed) return; - const devStore = useDevTaskStore.getState(); - const versionTasks = devStore.tasks.filter((t: any) => t.status === 'submitted'); - versionTasks.forEach((t: any) => devStore.changeStatus(t.id, 'done')); - } catch {} - }, 0); - } - return { ok: true }; },