diff --git a/frontend/src/app/(investor)/compare/page.tsx b/frontend/src/app/(investor)/compare/page.tsx index c8e2c6f..e8035a3 100644 --- a/frontend/src/app/(investor)/compare/page.tsx +++ b/frontend/src/app/(investor)/compare/page.tsx @@ -1,9 +1,57 @@ /** 多企业对比工作区 — 2-5 家企业并排对比。 */ +"use client"; + import { GitCompareArrows } from "lucide-react"; +import { CompareMode, type CompareColumn } from "@/components/workbench/CompareMode"; +import { useState } from "react"; /** 多企业对比页面。 */ export default function ComparePage() { + const [selected, setSelected] = useState(["智链科技", "云栈数据", "深瞳智能"]); + + const allCompanies = ["智链科技", "云栈数据", "深瞳智能", "量子芯微", "光合生物"]; + + const companyData: Record = { + "智链科技": { healthScore: 78.5, runway: 18, highRisks: 0 }, + "云栈数据": { healthScore: 62.0, runway: 15, highRisks: 1 }, + "深瞳智能": { healthScore: 85.5, runway: 24, highRisks: 0 }, + "量子芯微": { healthScore: 48.0, runway: 7, highRisks: 2 }, + "光合生物": { healthScore: 68.5, runway: 20, highRisks: 0 }, + }; + + const columns: CompareColumn[] = selected.map((name) => ({ + id: name, + name, + ...companyData[name], + content: ( +
+
+ 月营收 + 800万 +
+
+ 客户增长 + +15% +
+
+ AI 商业化 + 3 个 PoC +
+
+ ), + })); + + function toggleCompany(name: string) { + setSelected((prev) => { + if (prev.includes(name)) { + return prev.filter((n) => n !== name); + } + if (prev.length >= 5) return prev; + return [...prev, name]; + }); + } + return (
@@ -11,38 +59,27 @@ export default function ComparePage() {

多企业对比

-
-

- 选择 2-5 家企业进行并排对比,支持指标选择、差异高亮和趋势对比。 -

-
- - {/* 对比卡片占位 */} -
- {["智链科技", "云栈数据", "深瞳智能"].map((name) => ( -
-

{name}

-
-
- 健康度 - 78.5 -
-
- 月营收 - 800万 -
-
- Runway - 12月 -
-
- 高风险 - 0 -
-
-
+ {/* 企业选择器 */} +
+ 选择企业(2-5 家): + {allCompanies.map((name) => ( + ))}
+ + {/* 对比卡片 */} +
); } diff --git a/frontend/src/app/(investor)/nudges/page.tsx b/frontend/src/app/(investor)/nudges/page.tsx index 14a2b0c..5a4d732 100644 --- a/frontend/src/app/(investor)/nudges/page.tsx +++ b/frontend/src/app/(investor)/nudges/page.tsx @@ -4,7 +4,7 @@ import { useEffect, useState } from "react"; import { apiFetch } from "@/lib/api"; import { LoadingSpinner } from "@/components/shared/LoadingSpinner"; import { EmptyState } from "@/components/shared/EmptyState"; -import { Lightbulb, Sparkles, Check, X } from "lucide-react"; +import { Lightbulb, Sparkles, Check, X, TrendingUp, BarChart3 } from "lucide-react"; /** 行为助推引擎页面。 */ export default function NudgesPage() { @@ -117,6 +117,38 @@ export default function NudgesPage() { )}
+ + {/* 助推效果追踪 */} +
+
+ +

助推效果追踪

+
+
+
+
总推送数
+
{nudges.length}
+
+
+
采纳率
+
+ {nudges.length > 0 ? Math.round((nudges.filter((n) => n.accepted).length / nudges.length) * 100) : 0}% +
+
+
+
后续行动率
+
67%
+
+
+
助推疲劳度
+
+
+
+
+
+
); } diff --git a/frontend/src/app/(investor)/ooda/page.tsx b/frontend/src/app/(investor)/ooda/page.tsx new file mode 100644 index 0000000..0b067ef --- /dev/null +++ b/frontend/src/app/(investor)/ooda/page.tsx @@ -0,0 +1,104 @@ +/** OODA 决策循环可视化页面 — Observe/Orient/Decide/Act 循环图 + 决策延迟追踪。 */ + +"use client"; + +import { Eye, Compass, Brain, Zap, Clock } from "lucide-react"; + +/** OODA 阶段定义。 */ +interface OODAStage { + key: string; + label: string; + icon: typeof Eye; + color: string; + items: string[]; + avgDelay: string; +} + +/** OODA 决策循环可视化页面。 */ +export default function OODAPage() { + const stages: OODAStage[] = [ + { + key: "observe", + label: "Observe — 观察", + icon: Eye, + color: "border-blue-300 bg-blue-50", + items: ["健康度下降 5 分", "Runway 降至 7 月", "客户流失率上升"], + avgDelay: "实时", + }, + { + key: "orient", + label: "Orient — 定向", + icon: Compass, + color: "border-indigo-300 bg-indigo-50", + items: ["行业对标分析", "融资环境评估", "风险等级判定"], + avgDelay: "2.3 天", + }, + { + key: "decide", + label: "Decide — 决策", + icon: Brain, + color: "border-amber-300 bg-amber-50", + items: ["天使+ vs Pre-A 方案对比", "估值区间确定", "投资条款协商"], + avgDelay: "5.7 天", + }, + { + key: "act", + label: "Act — 行动", + icon: Zap, + color: "border-emerald-300 bg-emerald-50", + items: ["BP 准备", "投资人接触", "尽调配合"], + avgDelay: "12.4 天", + }, + ]; + + return ( +
+
+ +

OODA 决策循环

+
+ + {/* 决策延迟摘要 */} +
+
+
+
+ {stages.map((stage) => ( +
+
{stage.label.split(" — ")[0]}
+
{stage.avgDelay}
+
+ ))} +
+

+ 全循环平均耗时 20.4 天,较上季度缩短 3.2 天。定向阶段延迟最长,建议加强弱信号自动化分析。 +

+
+ + {/* OODA 循环图 */} +
+ {stages.map((stage, i) => ( +
+
+
+
    + {stage.items.map((item, j) => ( +
  • + + {item} +
  • + ))} +
+ {i < stages.length - 1 && ( +
+ )} +
+ ))} +
+
+ ); +} diff --git a/frontend/src/app/(investor)/threads/[id]/page.tsx b/frontend/src/app/(investor)/threads/[id]/page.tsx index 5942e13..0306505 100644 --- a/frontend/src/app/(investor)/threads/[id]/page.tsx +++ b/frontend/src/app/(investor)/threads/[id]/page.tsx @@ -1,52 +1,34 @@ /** 决策线程详情页 — 状态机时间线 + 关联事件 + AAR 链接。 */ -import { GitBranch, ArrowLeft } from "lucide-react"; -import Link from "next/link"; +"use client"; + +import { ThreadDetail } from "@/components/threads/ThreadDetail"; +import type { TimelineNode } from "@/components/threads/ThreadDetail"; +import type { RelatedEvent } from "@/components/threads/ThreadDetail"; /** 决策线程详情页面。 */ export default function ThreadDetailPage({ params }: { params: { id: string } }) { + const timeline: TimelineNode[] = [ + { status: "identified", label: "已识别", date: "2026-07-09", description: "Runway 不足 7 月,弱信号触发", active: true }, + { status: "analyzing", label: "分析中", date: "2026-07-12", description: "对比天使+ vs Pre-A 方案", active: true }, + { status: "acted", label: "已行动", date: "—", active: false }, + { status: "closed", label: "已关闭", date: "—", active: false }, + ]; + + const relatedEvents: RelatedEvent[] = [ + { type: "risk", title: "现金 Runway 不足 7 月", href: "/risks" }, + { type: "report", title: "2026 年 6 月月报", href: "/reports" }, + { type: "task", title: "准备天使+轮 BP", href: "/tasks" }, + ]; + return ( -
- - - 返回线程列表 - - -
- -

决策线程详情

-
- -
-
-

线程 #{params.id}

- 分析中 -
-

- 状态机时间线、关联事件和 AAR 链接将在 P1 #17 组件完成后集成。 -

-
- - {/* 时间线占位 */} -
-

状态机时间线

-
- {[ - { label: "已识别", date: "2026-07-09", active: true }, - { label: "分析中", date: "2026-07-12", active: true }, - { label: "已行动", date: "—", active: false }, - { label: "已关闭", date: "—", active: false }, - ].map((step, i) => ( -
-
- - {step.label} - - {step.date} -
- ))} -
-
-
+ ); } diff --git a/frontend/src/app/(investor)/threads/page.tsx b/frontend/src/app/(investor)/threads/page.tsx index 535d8d6..0bbf64d 100644 --- a/frontend/src/app/(investor)/threads/page.tsx +++ b/frontend/src/app/(investor)/threads/page.tsx @@ -1,9 +1,19 @@ /** 决策线程列表页 — 按状态/企业筛选 + 线程卡片。 */ +"use client"; + import { GitBranch } from "lucide-react"; +import { ThreadList, type ThreadItem } from "@/components/threads/ThreadList"; /** 决策线程列表页面。 */ export default function ThreadsPage() { + const threads: ThreadItem[] = [ + { id: "thread-001", title: "云栈数据 A+轮融资时机选择", company: "云栈数据", status: "analyzing", updatedAt: "2026-07-12", riskCount: 2 }, + { id: "thread-002", title: "深瞳智能 CTO retention 策略", company: "深瞳智能", status: "identified", updatedAt: "2026-07-10", riskCount: 1 }, + { id: "thread-003", title: "量子芯微 融资策略:天使+ vs Pre-A", company: "量子芯微", status: "acted", updatedAt: "2026-07-14", riskCount: 3 }, + { id: "thread-004", title: "智链科技 客户流失干预方案", company: "智链科技", status: "closed", updatedAt: "2026-06-28", riskCount: 1 }, + ]; + return (
@@ -17,26 +27,7 @@ export default function ThreadsPage() {

- {/* 线程卡片占位 */} -
- {[ - { title: "云栈数据 A+轮融资时机选择", status: "分析中", company: "云栈数据" }, - { title: "深瞳智能 CTO retention 策略", status: "已识别", company: "深瞳智能" }, - { title: "量子芯微 融资策略:天使+ vs Pre-A", status: "已行动", company: "量子芯微" }, - ].map((thread) => ( -
-
-
-

{thread.title}

-

{thread.company}

-
- - {thread.status} - -
-
- ))} -
+
); } diff --git a/frontend/src/app/(investor)/today/page.tsx b/frontend/src/app/(investor)/today/page.tsx index fd1a52a..335309e 100644 --- a/frontend/src/app/(investor)/today/page.tsx +++ b/frontend/src/app/(investor)/today/page.tsx @@ -1,109 +1,174 @@ /** 今日行动中心 — 投后负责人/投资经理默认首页。 */ -import { CalendarClock, AlertTriangle, FileText, ListTodo, TrendingUp } from "lucide-react"; +"use client"; + +import { CalendarClock, Sparkles, AlertTriangle, Eye, TrendingUp, Clock, CheckCircle2, ArrowRight } from "lucide-react"; +import Link from "next/link"; + +/** 优先级行动项。 */ +interface ActionItem { + title: string; + company: string; + priority: "critical" | "high" | "medium" | "low"; + confidence: number; + dueDate?: string; + href: string; +} + +/** 优先级颜色映射。 */ +const PRIORITY_COLORS: Record = { + critical: "bg-red-50 text-red-600 border-red-200", + high: "bg-amber-50 text-amber-600 border-amber-200", + medium: "bg-blue-50 text-blue-600 border-blue-200", + low: "bg-gray-50 text-gray-600 border-gray-200", +}; + +const PRIORITY_LABELS: Record = { + critical: "紧急", + high: "高", + medium: "中", + low: "低", +}; /** 今日行动中心页面。 */ export default function TodayPage() { + const mustHandle: ActionItem[] = [ + { title: "现金 Runway 不足 7 月,需启动融资", company: "量子芯微", priority: "critical", confidence: 0.92, dueDate: "3 天内", href: "/risks" }, + { title: "客户流失率连续 2 月上升", company: "智链科技", priority: "high", confidence: 0.85, href: "/risks" }, + { title: "营收增长停滞,需突破策略", company: "云栈数据", priority: "high", confidence: 0.78, href: "/risks" }, + { title: "月报逾期未提交", company: "量子芯微", priority: "high", confidence: 1.0, dueDate: "已逾期 3 天", href: "/reports" }, + ]; + + const watchItems: ActionItem[] = [ + { title: "竞品发布类似产品,市场份额可能受挤压", company: "深瞳智能", priority: "medium", confidence: 0.65, href: "/weak-signals" }, + { title: "CTO 技术路线分歧弱信号", company: "深瞳智能", priority: "medium", confidence: 0.58, href: "/weak-signals" }, + ]; + + const growthItems: ActionItem[] = [ + { title: "智链科技 × 云栈数据供应链协同机会", company: "智链科技", priority: "medium", confidence: 0.72, href: "/synergies" }, + { title: "光合生物半导体验证进展,可加速商业化", company: "光合生物", priority: "low", confidence: 0.68, href: "/milestones" }, + ]; + + const waitingItems: ActionItem[] = [ + { title: "等待创始人提交修正后月报", company: "云栈数据", priority: "medium", confidence: 1.0, href: "/reports" }, + { title: "等待董事会决议确认", company: "智链科技", priority: "low", confidence: 1.0, href: "/board" }, + ]; + + const completedItems: ActionItem[] = [ + { title: "审阅智链科技月报", company: "智链科技", priority: "low", confidence: 1.0, href: "/reports" }, + ]; + return (
-
- -

今日行动中心

+
+
+ +

今日行动中心

+
+ + 开始处理 {mustHandle.length + watchItems.length} 项 +
- {/* AI 简报 */} -
-

AI 简报

+ {/* 1. AI 早报 */} +
+
+

- 今日有 3 条待处理风险、2 份月报待审阅、5 个任务待完成。量子芯微现金 Runway 不足 7 月,需紧急关注。 + 自上次登录后:量子芯微健康度下降 5 分(Runway 7 月),智链科技客户流失率连续 2 月上升, + 深瞳智能 CTO 出现技术路线分歧弱信号。建议优先处理量子芯微融资问题。

- {/* 四象限概览 */} -
-
-
- -

风险队列

-
-
-
- 量子芯微 — 现金Runway不足7月 - 紧急 -
-
- 云栈数据 — 营收增长停滞 - -
-
- 智链科技 — 客户流失率上升 - -
-
-
+ {/* 2. 必须处理 */} + -
-
- -

月报状态

-
-
-
- 智链科技 — 已提交 - AI 解析完成 -
-
- 深瞳智能 — 已审阅 - 完成 -
-
- 量子芯微 — 草稿中 - 待提交 -
-
-
+ {/* 3. 建议关注 */} + -
-
- -

任务概览

-
-
-
- 联系流失客户进行回访 - 进行中 -
-
- 准备天使+轮 BP - 待办 -
-
- 审阅智链科技月报 - 已完成 -
-
-
+ {/* 4. 增长机会 */} + -
-
- -

健康度变化

-
-
-
- 智链科技 78.5 ↑ - +2.3 + {/* 5. 等待他人 */} + + + {/* 6. 已完成待验证 */} + +
+ ); +} + +/** 行动区块组件。 */ +function ActionSection({ + title, + icon: Icon, + iconColor, + items, +}: { + title: string; + icon: typeof AlertTriangle; + iconColor: string; + items: ActionItem[]; +}) { + if (items.length === 0) return null; + return ( +
+
+
+
+ {items.map((item, i) => ( + +
+ {item.title} + {item.company} + {item.confidence < 0.6 && ( + 需人工核对 + )}
-
- 量子芯微 48.0 ↓ - -5.0 +
+ {item.dueDate && {item.dueDate}} + {PRIORITY_LABELS[item.priority]}
-
- 云栈数据 62.0 → - 持平 -
-
-
+ + ))}
); diff --git a/frontend/src/components/shared/ClassificationBadge.tsx b/frontend/src/components/shared/ClassificationBadge.tsx new file mode 100644 index 0000000..f3cb601 --- /dev/null +++ b/frontend/src/components/shared/ClassificationBadge.tsx @@ -0,0 +1,46 @@ +/** 信息分级标识组件 — 4 级密级标签。 */ + +import { Shield, ShieldCheck, ShieldAlert, ShieldX } from "lucide-react"; + +/** 密级类型。 */ +export type ClassificationLevel = "public" | "internal" | "confidential" | "secret"; + +/** 密级配置。 */ +const LEVEL_CONFIG: Record = { + public: { label: "公开", icon: Shield, color: "text-gray-500 bg-gray-50 border-gray-200", description: "可对外公开" }, + internal: { label: "内部", icon: ShieldCheck, color: "text-blue-600 bg-blue-50 border-blue-200", description: "仅限内部使用" }, + confidential: { label: "机密", icon: ShieldAlert, color: "text-amber-600 bg-amber-50 border-amber-200", description: "限授权人员查看" }, + secret: { label: "绝密", icon: ShieldX, color: "text-rose-600 bg-rose-50 border-rose-200", description: "最高密级,查看留痕" }, +}; + +/** ClassificationBadge Props。 */ +interface ClassificationBadgeProps { + level: ClassificationLevel; + showDescription?: boolean; +} + +/** + * 信息分级标识组件 — 4 级密级标签。 + * + * 密级从低到高:公开 → 内部 → 机密 → 绝密。 + */ +export function ClassificationBadge({ level, showDescription = false }: ClassificationBadgeProps) { + const config = LEVEL_CONFIG[level]; + return ( + + + ); +} diff --git a/frontend/src/components/threads/ThreadDetail.tsx b/frontend/src/components/threads/ThreadDetail.tsx index 41a036f..c253128 100644 --- a/frontend/src/components/threads/ThreadDetail.tsx +++ b/frontend/src/components/threads/ThreadDetail.tsx @@ -7,7 +7,7 @@ import Link from "next/link"; import type { ThreadStatus } from "./ThreadList"; /** 时间线节点定义。 */ -interface TimelineNode { +export interface TimelineNode { status: ThreadStatus; label: string; date: string; @@ -16,7 +16,7 @@ interface TimelineNode { } /** 关联事件定义。 */ -interface RelatedEvent { +export interface RelatedEvent { type: "risk" | "report" | "task" | "aar"; title: string; href: string;