feat(frontend): P3+P4 创始人端增强 + 企业战情室集成
P3 创始人端: - 经营驾驶舱: 6 KPI 卡片 + 风险提示 - 投资人沟通准备中心: 会议列表 + 准备清单 + AI 建议 - 里程碑自填: 进度滑块 + 新增表单 - OKR 对齐视图: 投资人期望对齐度 + KR 进度 - BML 认知追踪: 信念/心智模型/学习追踪 - 通知页面 + 个人中心页面 P4 企业战情室集成: - HighlightsPanel: 顶部 KPI 摘要栏 - WorkModeSwitcher: 4 种工作模式切换 - InsightRail: 右侧 AI 面板(默认风险预警 Agent) Admin: - 商业秘密保护配置: 密级/留痕/导出管控/审计日志
This commit is contained in:
@@ -6,6 +6,9 @@ import { TabNav, TabPanel, type TabId } from "@/components/workbench/TabNav";
|
||||
import { HealthRadar, DIMENSIONS_14, DIMENSIONS_14_DETAIL, HealthDimensionDetail } from "@/components/health/HealthRadar";
|
||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||
import { EmptyState } from "@/components/shared/EmptyState";
|
||||
import { HighlightsPanel } from "@/components/workbench/HighlightsPanel";
|
||||
import { WorkModeSwitcher, type WorkMode } from "@/components/shared/WorkModeSwitcher";
|
||||
import { InsightRail } from "@/components/shared/InsightRail";
|
||||
import { apiFetch } from "@/lib/api";
|
||||
import { AlertTriangle, FileText, ClipboardList, ScrollText, Network, DollarSign, Activity, Users, Bot } from "lucide-react";
|
||||
|
||||
@@ -16,6 +19,7 @@ export default function WorkbenchPage() {
|
||||
const [activeTab, setActiveTab] = useState<TabId>("overview");
|
||||
const [detail, setDetail] = useState<any>(null);
|
||||
const [loading, setLoading] = useState(true);
|
||||
const [workMode, setWorkMode] = useState<WorkMode>("overview");
|
||||
|
||||
useEffect(() => {
|
||||
if (!companyId) return;
|
||||
@@ -41,41 +45,48 @@ export default function WorkbenchPage() {
|
||||
|
||||
const { company, health_score, recent_reports, open_risks, recent_weak_signals, active_agreements, recent_board_meetings } = detail;
|
||||
|
||||
const highRisksCount = (open_risks || []).filter((r: any) => r.severity === "high" || r.severity === "critical").length;
|
||||
const pendingTasksCount = (recent_reports || []).filter((r: any) => r.status === "pending" || r.status === "draft").length;
|
||||
const runway = health_score?.runway_months ?? 12;
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-4">
|
||||
{/* 企业头部信息 */}
|
||||
<div className="flex items-center justify-between rounded-lg border border-[var(--border)] bg-white p-4">
|
||||
<div>
|
||||
<h1 className="text-xl font-bold">{company.name}</h1>
|
||||
<p className="text-sm text-muted-foreground">
|
||||
{company.industry || "未知行业"} · {company.stage || "未知阶段"}
|
||||
</p>
|
||||
</div>
|
||||
{health_score && (
|
||||
<div className="text-right">
|
||||
<div className="text-2xl font-bold text-[var(--investor-primary)]">
|
||||
{health_score.total_score.toFixed(0)}
|
||||
</div>
|
||||
<div className="text-xs text-muted-foreground">健康度总分</div>
|
||||
</div>
|
||||
)}
|
||||
{/* Highlights Panel — 企业 KPI 摘要 */}
|
||||
<HighlightsPanel
|
||||
companyName={company.name}
|
||||
healthScore={health_score?.total_score ?? 0}
|
||||
healthTrend={health_score?.trend ?? "stable"}
|
||||
runway={runway}
|
||||
highRisks={highRisksCount}
|
||||
pendingTasks={pendingTasksCount}
|
||||
/>
|
||||
|
||||
{/* Work Mode 切换器 */}
|
||||
<div className="flex items-center justify-between">
|
||||
<WorkModeSwitcher mode={workMode} onChange={setWorkMode} />
|
||||
</div>
|
||||
|
||||
{/* Tab 导航 + 内容 */}
|
||||
<div className="flex flex-col gap-4 md:flex-row">
|
||||
<TabNav active={activeTab} onChange={setActiveTab} />
|
||||
<TabPanel>
|
||||
{activeTab === "overview" && <OverviewTab detail={detail} />}
|
||||
{activeTab === "financial" && <FinancialTab detail={detail} />}
|
||||
{activeTab === "operational" && <OperationalTab detail={detail} />}
|
||||
{activeTab === "org" && <OrgTab detail={detail} />}
|
||||
{activeTab === "ai" && <AITab detail={detail} />}
|
||||
{activeTab === "risk" && <RiskTab risks={open_risks} signals={recent_weak_signals} />}
|
||||
{activeTab === "reports" && <ReportsTab reports={recent_reports} />}
|
||||
{activeTab === "board" && <BoardTab meetings={recent_board_meetings} />}
|
||||
{activeTab === "agreements" && <AgreementsTab agreements={active_agreements} />}
|
||||
{activeTab === "synergy" && <SynergyTab companyId={company.id} />}
|
||||
</TabPanel>
|
||||
{/* 主内容 + Insight Rail */}
|
||||
<div className="flex gap-0">
|
||||
{/* Tab 导航 + 内容 */}
|
||||
<div className="flex flex-1 flex-col gap-4 md:flex-row">
|
||||
<TabNav active={activeTab} onChange={setActiveTab} />
|
||||
<TabPanel>
|
||||
{activeTab === "overview" && <OverviewTab detail={detail} />}
|
||||
{activeTab === "financial" && <FinancialTab detail={detail} />}
|
||||
{activeTab === "operational" && <OperationalTab detail={detail} />}
|
||||
{activeTab === "org" && <OrgTab detail={detail} />}
|
||||
{activeTab === "ai" && <AITab detail={detail} />}
|
||||
{activeTab === "risk" && <RiskTab risks={open_risks} signals={recent_weak_signals} />}
|
||||
{activeTab === "reports" && <ReportsTab reports={recent_reports} />}
|
||||
{activeTab === "board" && <BoardTab meetings={recent_board_meetings} />}
|
||||
{activeTab === "agreements" && <AgreementsTab agreements={active_agreements} />}
|
||||
{activeTab === "synergy" && <SynergyTab companyId={company.id} />}
|
||||
</TabPanel>
|
||||
</div>
|
||||
|
||||
{/* Insight Rail — 右侧 AI 面板 */}
|
||||
<InsightRail defaultAgent="risk" />
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user