'use client'; import { useState, useMemo, useEffect } from 'react'; import { Plus, Code2 } from 'lucide-react'; import { useDevTaskStore } from '@/stores/useDevTaskStore'; import { useTaskCategoryStore } from '@/stores/useTaskCategoryStore'; import { useTaskWorklogStore } from '@/stores/useTaskWorklogStore'; import { useRequirementStore } from '@/stores/useRequirementStore'; import { DevTaskRow } from './DevTaskRow'; import { DevTaskCreateModal } from './DevTaskCreateModal'; import { DevTaskDetailDrawer } from './DevTaskDetailDrawer'; import { calcGroupProgress } from '@/lib/dev-task'; import type { DevTask } from '@/lib/dev-task'; interface Props { versionId: string; requirementIds: string[]; } export function DevTaskTab({ versionId, requirementIds }: Props) { const { tasks, fetchTasks } = useDevTaskStore(); const { categories, fetchCategories } = useTaskCategoryStore(); const { fetchWorklogs } = useTaskWorklogStore(); const { requirements } = useRequirementStore(); useEffect(() => { fetchTasks(); }, [fetchTasks]); useEffect(() => { fetchCategories(); }, [fetchCategories]); useEffect(() => { fetchWorklogs(); }, [fetchWorklogs]); const versionTasks = useMemo( () => tasks.filter((t) => requirementIds.includes(t.requirementId)), [tasks, requirementIds], ); const progress = calcGroupProgress(versionTasks); const totalEstimate = versionTasks.reduce((s, t) => s + t.estimateHours, 0); const totalActual = versionTasks.reduce((s, t) => s + t.actualHours, 0); const blockedCount = versionTasks.filter((t) => t.isBlocked).length; const [showCreate, setShowCreate] = useState(false); const [selectedTask, setSelectedTask] = useState(null); const groupedByReq = useMemo(() => { const map = new Map(); for (const t of versionTasks) { const list = map.get(t.requirementId) || []; list.push(t); map.set(t.requirementId, list); } return map; }, [versionTasks]); return (
{/* 统计栏 */}
开发进度 {progress}%
{versionTasks.length} 任务 · 投入 {totalActual}h / 预计 {totalEstimate}h {blockedCount > 0 && ( {blockedCount} 阻塞 )}
{/* 按需求分组列表 */} {versionTasks.length === 0 ? (

暂无开发任务

) : ( Array.from(groupedByReq.entries()).map(([reqId, reqTasks]) => { const req = requirements.find((r) => r.id === reqId); const reqProgress = calcGroupProgress(reqTasks); return (
{req?.code} {req?.title} {reqProgress}%
{reqTasks.map((t) => ( c.id === t.categoryId)} onClick={() => setSelectedTask(t)} /> ))}
); }) )} {showCreate && setShowCreate(false)} />} {selectedTask && setSelectedTask(null)} />}
); }