feat(workspace): 在工作台接入今日日报列

This commit is contained in:
Script Generator
2026-06-26 15:19:42 +08:00
parent 952e13677c
commit 8c3fec221b

View File

@@ -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<TabKey>('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() {
</div>
{/* 右侧:任务列表 */}
<div className="flex-1 flex flex-col overflow-hidden">
<div className="min-w-0 flex-1 flex flex-col overflow-hidden">
<header className="flex h-14 shrink-0 items-center border-b border-[var(--line)] bg-[var(--bg-card)] px-5">
<h2 className="text-[14px] font-semibold text-[var(--ink)]">{TABS.find((t) => t.key === activeTab)?.label}</h2>
<span className="ml-2 text-[12px] text-[var(--ink-muted)]">{filteredItems.length} </span>
@@ -222,6 +239,8 @@ export default function WorkspacePage() {
</div>
</div>
<DailyReportPanel report={dailyReport} />
{/* Detail Drawers */}
{drawerItem && (drawerItem.type === 'plan_research' || drawerItem.type === 'plan_product' || drawerItem.type === 'plan_ui') && (
<PlanDetailDrawer planId={drawerItem.id} onClose={() => setDrawerItem(null)} contextLabel={`${drawerItem.productName} / ${drawerItem.projectName} / ${drawerItem.versionName}`} />