Files
AIPortPilot/docs/1-prd.md
T
selfrelease 51feae55ba feat(backend): Phase 0 项目骨架完成 — 后端/前端/数据库/Docker
- 后端:FastAPI + SQLAlchemy + Alembic,7 张核心表迁移成功
- 前端:Next.js 16 + TailwindCSS 4 + 三端布局(投资人/创始人/Admin)
- 数据库:PostgreSQL 16,7 张核心实体表(tenants/users/companies/monthly_reports/health_scores/risk_events/audit_logs)
- Docker:docker-compose.yml + 前后端 Dockerfile
- 测试:健康检查 4 个测试全部 GREEN
- 文档:README/run.md/AGENTS.md/docs 体系完整
2026-07-18 21:50:15 +08:00

274 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PRD + 技术设计 (1-prd)
> 状态:待确认
> 范围:Phase 0 + Phase 1 MVP
---
## 一、产品概要
### 1.1 定位
AI+ Portfolio Operating System —— 投资人和创始人的共同操作系统。Phase 1 聚焦"投后信息与风险管理"。
### 1.2 核心用户旅程
**投资人端**
1. 登录 → 驾驶舱(Portfolio 全局视图)
2. 查看本周新增风险 → 进入风险工作台处理
3. 查看企业详情 → 审阅月报 AI 摘要 → 追加评论
4. 查看健康度趋势 → 识别下降企业
5. 导出投后报告
**创始人端**
1. 登录 → 企业经营概览
2. 提交月报(AI 辅助填充)
3. AI 副驾驶问答("投资人最关心什么")
4. 查看自身健康度评分和建议
---
## 二、技术架构
### 2.1 整体架构
```
┌─────────────────────────────────────────────┐
│ 前端 (Next.js) │
│ (investor) (founder) (admin) │
│ ↓ ↓ ↓ │
│ 统一 API Client + Auth │
└──────────────────┬──────────────────────────┘
│ REST API (JSON)
┌──────────────────┴──────────────────────────┐
│ 后端 (FastAPI) │
│ Routers → Services → Models │
│ AI Layer: Parser / Health / Risk / Report │
└──────┬──────────┬──────────┬────────────────┘
│ │ │
PostgreSQL Redis Ollama (本地AI)
+ PgVector
```
### 2.2 前端架构
**路由结构**
```
frontend/src/app/
├── (investor)/ # 投资人端(B 端专业风格)
│ ├── layout.tsx # 左 Sidebar + 灰色背景
│ ├── page.tsx # 驾驶舱
│ ├── companies/ # 企业列表 + 详情
│ ├── reports/ # 月报管理
│ ├── risks/ # 风险工作台
│ └── settings/
├── (founder)/ # 创始人端(C 端温暖风格)
│ ├── layout.tsx # 顶部 Header + indigo 主色
│ ├── page.tsx # 经营概览
│ ├── reports/submit/ # 月报提交
│ └── copilot/ # AI 副驾驶
├── (admin)/ # Admin 端
│ ├── layout.tsx # slate-950 Header + amber 主色
│ └── page.tsx # 管理后台
├── login/
└── layout.tsx # 根布局(字体 + Provider
```
**设计 Token**
- 字体:Geist Sans + Geist Mono
- 色彩:oklch 体系,CSS 变量定义
- 圆角:`--radius: 0.625rem`
- 投资人端:`--primary: oklch(0.21 0.006 285.885)` (gray-900)
- 创始人端:`--primary: oklch(0.546 0.245 262.881)` (indigo-600)
- Admin 端:`--primary: oklch(0.769 0.188 70.08)` (amber-400)
**共享组件**
- `LoadingSpinner` / `EmptyState` / `HealthScoreBadge`
- `HealthGauge`(仪表盘)/ `HealthRadar`(雷达图)/ `HealthTrend`sparkline
- `RiskCard` / `RiskTimeline`
- `AIChatDrawer`(底部抽屉式 AI 对话)
- `FilterBar`(筛选栏)
- `DataTable`(数据表格)
### 2.3 后端架构
**目录结构**
```
backend/
├── app/
│ ├── main.py # FastAPI app + 中间件 + 路由注册
│ ├── core/
│ │ ├── config.py # 环境变量配置 (pydantic-settings)
│ │ ├── database.py # SQLAlchemy engine + session
│ │ ├── security.py # JWT + 密码哈希
│ │ └── permissions.py # 权限中间件
│ ├── models/ # SQLAlchemy ORM 模型
│ │ ├── user.py
│ │ ├── company.py
│ │ ├── report.py
│ │ ├── health_score.py
│ │ └── risk.py
│ ├── schemas/ # Pydantic 请求/响应 schema
│ ├── routers/ # API 路由
│ │ ├── auth.py
│ │ ├── companies.py
│ │ ├── reports.py
│ │ ├── health.py
│ │ ├── risks.py
│ │ └── dashboard.py
│ └── services/ # 业务逻辑 + AI 服务
│ ├── ai_parser.py # 月报 AI 解析
│ ├── health_calculator.py
│ ├── risk_engine.py
│ └── report_generator.py
├── alembic/ # 数据库迁移
├── tests/ # 测试
├── pyproject.toml
└── Dockerfile
```
**API 设计**
- 版本:`/api/v1/`
- 响应壳:`{code, message, data, trace_id, timestamp}`
- 认证:Bearer JWT
- 分页:`?page=1&page_size=20&sort=-created_at`
### 2.4 数据库设计(Phase 1 核心表)
```sql
-- 租户
tenants (id, name, type, config_json, created_at, ...)
-- 用户
users (id, tenant_id, email, password_hash, role, name, phone, ...)
-- role: gp | partner | post_invest_lead | investor | founder | admin
-- 企业
companies (id, tenant_id, name, industry, stage, logo_url,
description, founded_at, total_funding, website, ...)
-- 月报
monthly_reports (id, company_id, period_year, period_month,
status, raw_content, ai_summary, ai_concerns,
submitted_by, submitted_at, reviewed_by, reviewed_at, ...)
-- 健康度
health_scores (id, company_id, total_score, financial_score,
operational_score, ai_commercial_score, ai_cost_score,
trend, evidence_json, recommendations_json,
calculated_at, ...)
-- 风险
risk_events (id, company_id, type, severity, status,
title, description, evidence_json,
suggested_action, assigned_to, due_at,
identified_at, closed_at, ...)
-- 审计
audit_logs (id, tenant_id, user_id, action, resource_type,
resource_id, detail_json, ip, created_at)
```
### 2.5 AI 服务设计
**月报解析 Agent**
- 输入:月报文件(Excel/PDF/结构化表单)
- 输出:结构化指标 JSON + 摘要文本 + 关注点列表
- 模型:Ollama 本地模型(qwen2.5 或 llama3.2
- 约束:Structured Output / JSON Schema
- 兜底:解析失败时返回原始文本 + 标记需人工审阅
**健康度计算引擎**
- 输入:月报指标 + 历史趋势
- 输出:分项评分 + 总分 + 趋势 + 扣分项 + 建议动作
- 实现:规则引擎(非 LLM),可配置权重
- AI+ 专项:商业化 + 成本维度,同样规则驱动
**风险检测引擎**
- 输入:最新指标 + 阈值规则
- 输出:RiskEvent 列表
- 实现:规则引擎,指标越界自动生成风险
- Phase 2 再加弱信号关联
---
## 三、UI/UX 设计
### 3.1 投资人端
**驾驶舱**
- 顶部:Portfolio 健康度分布热力图(企业 × 维度)
- 左中:本周新增风险卡片列表(红/黄/绿状态条)
- 右中:AI 周报摘要(可折叠)
- 底部:健康度趋势对比(多企业 sparkline)
**企业详情工作台**
- 左侧导航:基本信息 / 财务 / 经营 / 组织 / 风险 / AI+ 专项
- 中部:当前选中维度详情(表格 + 图表)
- 右侧:AI 建议 + 待办 + 风险预警(抽屉式)
- 底部:投后管理时间线
**风险工作台**
- 左侧:筛选栏(严重程度 / 类型 / 企业 / 状态)
- 中部:风险卡片列表(每张卡含证据链折叠面板)
- 右侧:选中风险的处理闭环时间线
### 3.2 创始人端
**经营概览**
- 顶部:大数字卡片(Runway / MRR / 客户数 / 健康度)
- 中部:关键指标趋势图
- 底部:AI 副驾驶入口(浮动按钮)
**月报提交**
- 分步表单:基本信息 → 财务数据 → 经营数据 → AI+ 专项
- AI 辅助:上传文件后自动填充建议值
- 提交前预览 AI 摘要
**AI 副驾驶**
- 底部抽屉式对话窗口
- 上下文感知:自动注入当前企业数据
- 快捷问题按钮:"投资人关心什么" / "融资建议" / "组织诊断"
### 3.3 响应式
- 投资人端:< md 时 Sidebar 折叠为抽屉,驾驶舱卡片单列
- 创始人端:移动端优先,卡片流 + 底部 Tab 导航
- Admin 端:< md 时表格横向滚动
---
## 四、部署架构
### 4.1 开发环境(Docker Compose
```yaml
services:
postgres: # PostgreSQL 16 + PgVector
redis: # Redis 7
ollama: # 本地 AI 推理
backend: # FastAPI + hot reload
frontend: # Next.js + hot reload
```
### 4.2 端口表
| 服务 | 端口 | 说明 |
|---|---|---|
| frontend | 3000 | Next.js dev server |
| backend | 8000 | FastAPI dev server |
| postgres | 5432 | PostgreSQL |
| redis | 6379 | Redis |
| ollama | 11434 | 本地 AI 推理 |
---
## 五、风险与对策
| 风险 | 对策 |
|---|---|
| AI 解析准确率不足 | Structured Output 约束 + 人工审阅兜底 |
| 月报格式差异大 | 先支持结构化表单,再支持文件上传 |
| 私有化部署复杂 | MVP 用 Docker Compose,长期才做边缘算力机 |
| 多租户数据隔离 | 从架构层面 tenant_id 贯穿,中间件强制 |