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:
selfrelease
2026-07-19 19:06:43 +08:00
parent a4044baa31
commit 44cbdc9d62
9 changed files with 705 additions and 31 deletions
@@ -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>
);