diff --git a/apps/web/app/workspace/page.tsx b/apps/web/app/workspace/page.tsx index 11d7d91..23cc555 100644 --- a/apps/web/app/workspace/page.tsx +++ b/apps/web/app/workspace/page.tsx @@ -10,9 +10,11 @@ import { useDevTaskStore } from '@/stores/useDevTaskStore'; import { useTestCaseStore } from '@/stores/useTestCaseStore'; import { useBugStore } from '@/stores/useBugStore'; import { useAuthStore } from '@/stores/useAuthStore'; +import { useTaskWorklogStore } from '@/stores/useTaskWorklogStore'; import { flattenVersions } from '@/lib/derive'; import { aggregateWorkItems, WORK_ITEM_TYPE_LABEL } from '@/lib/workspace-engine'; import type { WorkItem, WorkItemType } from '@/lib/workspace-engine'; +import { DailyReportPanel } from '@/components/workspace/DailyReportPanel'; import { PlanDetailDrawer } from '@/components/version/PlanDetailDrawer'; import { DevTaskDetailDrawer } from '@/components/dev-task/DevTaskDetailDrawer'; import { TestCaseDetailDrawer } from '@/components/test-case/TestCaseDetailDrawer'; @@ -23,6 +25,7 @@ import { formatDateTime } from '@/lib/format'; import { formatShortTime, formatWorkHours } from '@/lib/work-hours'; import { TEST_CASE_STATUS_LABEL, TEST_CASE_STATUS_COLOR } from '@/lib/test-case'; import { BUG_STATUS_LABEL, BUG_STATUS_COLOR, BUG_SEVERITY_LABEL, BUG_SEVERITY_COLOR } from '@/lib/bug'; +import { getWorkspaceDailyReport } from '@/lib/workspace-daily-report'; type TabKey = 'all' | 'plan_research' | 'plan_product' | 'plan_ui' | 'devTask' | 'testCase' | 'bug'; @@ -51,6 +54,7 @@ export default function WorkspacePage() { const { tasks: devTasks, fetchTasks } = useDevTaskStore(); const { testCases, fetchTestCases } = useTestCaseStore(); const { bugs, fetchBugs } = useBugStore(); + const { worklogs, fetchWorklogs } = useTaskWorklogStore(); const user = useAuthStore((s) => s.user); const [activeTab, setActiveTab] = useState('all'); const [showCompleted, setShowCompleted] = useState(true); @@ -64,6 +68,7 @@ export default function WorkspacePage() { useEffect(() => { fetchTasks(); }, [fetchTasks]); useEffect(() => { fetchTestCases(); }, [fetchTestCases]); useEffect(() => { fetchBugs(); }, [fetchBugs]); + useEffect(() => { fetchWorklogs(); }, [fetchWorklogs]); const userName = user?.name ?? ''; const allVersions = useMemo(() => flattenVersions(overview), [overview]); @@ -113,6 +118,18 @@ export default function WorkspacePage() { return items.sort((a, b) => (a.completed !== b.completed ? (a.completed ? 1 : -1) : 0)); }, [workItems, activeTab, showCompleted, selectedVersionId]); + const today = useMemo(() => new Date().toISOString().slice(0, 10), []); + + const dailyReport = useMemo(() => + getWorkspaceDailyReport({ + worklogs, + workItems, + userId: userName, + date: today, + }), + [worklogs, workItems, userName, today] + ); + // 待办数量按 tab 分(受 version filter 影响) const pendingByTab = useMemo(() => { const base = selectedVersionId ? workItems.filter((i) => i.versionId === selectedVersionId) : workItems; @@ -191,7 +208,7 @@ export default function WorkspacePage() { {/* 右侧:任务列表 */} -
+

{TABS.find((t) => t.key === activeTab)?.label}

{filteredItems.length} 项 @@ -222,6 +239,8 @@ export default function WorkspacePage() {
+ + {/* Detail Drawers */} {drawerItem && (drawerItem.type === 'plan_research' || drawerItem.type === 'plan_product' || drawerItem.type === 'plan_ui') && ( setDrawerItem(null)} contextLabel={`${drawerItem.productName} / ${drawerItem.projectName} / ${drawerItem.versionName}`} />