Compare commits
4 Commits
c3232f73c8
..
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 50cc92c2d7 | |||
| 3bae5fbfc1 | |||
| af91d843d8 | |||
| 006fd7de7e |
@@ -80,17 +80,28 @@ async def get_dashboard_summary(
|
|||||||
pending_result = await db.execute(pending_query)
|
pending_result = await db.execute(pending_query)
|
||||||
pending_reports = pending_result.scalar_one()
|
pending_reports = pending_result.scalar_one()
|
||||||
|
|
||||||
# 最近评分(最多 10 条)
|
# 最近评分 — 每家企业只取最新一条(避免历史数据导致企业重复)
|
||||||
|
subq = (
|
||||||
|
select(
|
||||||
|
HealthScore.company_id,
|
||||||
|
func.max(HealthScore.calculated_at).label("max_at"),
|
||||||
|
)
|
||||||
|
.join(Company, HealthScore.company_id == Company.id)
|
||||||
|
.where(Company.tenant_id == tenant_id)
|
||||||
|
.group_by(HealthScore.company_id)
|
||||||
|
)
|
||||||
|
if company_id:
|
||||||
|
subq = subq.where(HealthScore.company_id == company_id)
|
||||||
|
subq = subq.subquery()
|
||||||
|
|
||||||
recent_query = (
|
recent_query = (
|
||||||
select(HealthScore, Company.name.label("company_name"))
|
select(HealthScore, Company.name.label("company_name"))
|
||||||
.join(Company, HealthScore.company_id == Company.id)
|
.join(Company, HealthScore.company_id == Company.id)
|
||||||
.where(Company.tenant_id == tenant_id)
|
.join(subq, (HealthScore.company_id == subq.c.company_id) & (HealthScore.calculated_at == subq.c.max_at))
|
||||||
)
|
.order_by(HealthScore.calculated_at.desc())
|
||||||
if company_id:
|
.limit(10)
|
||||||
recent_query = recent_query.where(HealthScore.company_id == company_id)
|
|
||||||
recent_result = await db.execute(
|
|
||||||
recent_query.order_by(HealthScore.calculated_at.desc()).limit(10)
|
|
||||||
)
|
)
|
||||||
|
recent_result = await db.execute(recent_query)
|
||||||
recent_rows = recent_result.all()
|
recent_rows = recent_result.all()
|
||||||
recent_scores = []
|
recent_scores = []
|
||||||
for row in recent_rows:
|
for row in recent_rows:
|
||||||
@@ -118,16 +129,27 @@ async def list_health_scores(
|
|||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
user: User = Depends(get_current_user),
|
user: User = Depends(get_current_user),
|
||||||
):
|
):
|
||||||
"""获取健康度评分列表。"""
|
"""获取健康度评分列表 — 每家企业只返回最新一条。"""
|
||||||
|
subq = (
|
||||||
|
select(
|
||||||
|
HealthScore.company_id,
|
||||||
|
func.max(HealthScore.calculated_at).label("max_at"),
|
||||||
|
)
|
||||||
|
.join(Company, HealthScore.company_id == Company.id)
|
||||||
|
.where(Company.tenant_id == user.tenant_id)
|
||||||
|
.group_by(HealthScore.company_id)
|
||||||
|
)
|
||||||
|
if company_id:
|
||||||
|
subq = subq.where(HealthScore.company_id == company_id)
|
||||||
|
subq = subq.subquery()
|
||||||
|
|
||||||
query = (
|
query = (
|
||||||
select(HealthScore, Company.name.label("company_name"))
|
select(HealthScore, Company.name.label("company_name"))
|
||||||
.join(Company, HealthScore.company_id == Company.id)
|
.join(Company, HealthScore.company_id == Company.id)
|
||||||
.where(Company.tenant_id == user.tenant_id)
|
.join(subq, (HealthScore.company_id == subq.c.company_id) & (HealthScore.calculated_at == subq.c.max_at))
|
||||||
|
.order_by(HealthScore.calculated_at.desc())
|
||||||
|
.limit(limit)
|
||||||
)
|
)
|
||||||
if company_id:
|
|
||||||
query = query.where(HealthScore.company_id == company_id)
|
|
||||||
|
|
||||||
query = query.order_by(HealthScore.calculated_at.desc()).limit(limit)
|
|
||||||
result = await db.execute(query)
|
result = await db.execute(query)
|
||||||
scores = []
|
scores = []
|
||||||
for row in result.all():
|
for row in result.all():
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ Hypothesis / AARRecord / TeamMember / TalentProfile / AuditLog。
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
|
import random
|
||||||
from datetime import datetime, timedelta, timezone
|
from datetime import datetime, timedelta, timezone
|
||||||
|
|
||||||
from sqlalchemy import text
|
from sqlalchemy import text
|
||||||
@@ -19,10 +20,15 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||||||
from app.core.database import async_session_factory, engine, Base
|
from app.core.database import async_session_factory, engine, Base
|
||||||
from app.core.security import hash_password
|
from app.core.security import hash_password
|
||||||
from app.models import (
|
from app.models import (
|
||||||
AARRecord, AuditLog, BoardMeeting, Company, FinancialData, HealthScore,
|
AARRecord, AgentExecution, AuditLog, BoardMeeting, Company, CompanyFundLink,
|
||||||
Hypothesis, InvestmentAgreement, MajorEvent, MilestoneTree, MonthlyReport,
|
CustomerAcquisitionPlan, DataSource, DecisionSentinel, DigitalTwinModel,
|
||||||
NudgeRecord, OKR, RiskEvent, SynergyOpportunity, Task, TalentProfile,
|
EvaluationTemplate, ExitPrediction, FinancialData, FirmProfile, Fund,
|
||||||
TeamMember, Tenant, User, WeakSignal, DecisionSentinel,
|
FundProfile, HealthScore, Hypothesis, InquiryList, InterventionEvent,
|
||||||
|
InterventionResult, InvestmentAgreement, KnowledgeChunk, KnowledgeNode,
|
||||||
|
MajorEvent, ManagerProfile, MilestoneTree, MonteCarloSimulation, MonthlyReport,
|
||||||
|
NudgeRecord, OKR, PeerLearningCircle, PortfolioRebalancing, PreMortemRecord,
|
||||||
|
ProductDiagnostic, RedTeamRecord, RiskEvent, SynergyOpportunity, Task,
|
||||||
|
TalentProfile, TeamMember, Tenant, User, WeakSignal,
|
||||||
)
|
)
|
||||||
|
|
||||||
UTC = timezone.utc
|
UTC = timezone.utc
|
||||||
@@ -56,9 +62,14 @@ async def seed() -> None:
|
|||||||
async with async_session_factory() as db:
|
async with async_session_factory() as db:
|
||||||
await _seed_tenant_users(db)
|
await _seed_tenant_users(db)
|
||||||
await _seed_companies(db)
|
await _seed_companies(db)
|
||||||
|
await _seed_funds(db)
|
||||||
|
await _seed_profiles(db)
|
||||||
|
await _seed_evaluation_templates(db)
|
||||||
await _seed_financial(db)
|
await _seed_financial(db)
|
||||||
await _seed_reports(db)
|
await _seed_reports(db)
|
||||||
|
await _seed_inquiries(db)
|
||||||
await _seed_health(db)
|
await _seed_health(db)
|
||||||
|
await _seed_health_history(db)
|
||||||
await _seed_risks(db)
|
await _seed_risks(db)
|
||||||
await _seed_weak_signals(db)
|
await _seed_weak_signals(db)
|
||||||
await _seed_tasks(db)
|
await _seed_tasks(db)
|
||||||
@@ -74,6 +85,17 @@ async def seed() -> None:
|
|||||||
await _seed_aars(db)
|
await _seed_aars(db)
|
||||||
await _seed_team_members(db)
|
await _seed_team_members(db)
|
||||||
await _seed_talents(db)
|
await _seed_talents(db)
|
||||||
|
await _seed_agent_executions(db)
|
||||||
|
await _seed_customer_plans(db)
|
||||||
|
await _seed_exit_predictions(db)
|
||||||
|
await _seed_pre_mortems(db)
|
||||||
|
await _seed_product_diagnostics(db)
|
||||||
|
await _seed_peer_circles(db)
|
||||||
|
await _seed_digital_twins(db)
|
||||||
|
await _seed_interventions(db)
|
||||||
|
await _seed_portfolio_simulations(db)
|
||||||
|
await _seed_knowledge_graph(db)
|
||||||
|
await _seed_data_sources(db)
|
||||||
await _seed_audit_logs(db)
|
await _seed_audit_logs(db)
|
||||||
await db.commit()
|
await db.commit()
|
||||||
|
|
||||||
@@ -136,30 +158,32 @@ async def _seed_companies(db: AsyncSession) -> None:
|
|||||||
|
|
||||||
# ─── 财务数据 ──────────────────────────────────────────────────────────
|
# ─── 财务数据 ──────────────────────────────────────────────────────────
|
||||||
async def _seed_financial(db: AsyncSession) -> None:
|
async def _seed_financial(db: AsyncSession) -> None:
|
||||||
"""每家企业生成近 3 个月利润表 + 现金流。"""
|
"""每家企业生成近 6 个月利润表 + 现金流。"""
|
||||||
for comp_id, revenue, burn, cash in [
|
for comp_id, revenue, burn, cash in [
|
||||||
(COMP_A, 800, 350, 4200), # 月营收350万, 消耗120万, 现金4200万
|
(COMP_A, 800, 350, 4200), # 月营收800万, 消耗350万, 现金4200万
|
||||||
(COMP_B, 150, 120, 1800),
|
(COMP_B, 150, 120, 1800),
|
||||||
(COMP_C, 1200, 480, 6500),
|
(COMP_C, 1200, 480, 6500),
|
||||||
(COMP_D, 0, 80, 600),
|
(COMP_D, 0, 80, 600),
|
||||||
(COMP_E, 80, 200, 2400),
|
(COMP_E, 80, 200, 2400),
|
||||||
]:
|
]:
|
||||||
for i in range(3):
|
for i in range(6):
|
||||||
y, m = (NOW.year, NOW.month - i) if NOW.month - i > 0 else (NOW.year - 1, 12 + NOW.month - i)
|
y, m = (NOW.year, NOW.month - i) if NOW.month - i > 0 else (NOW.year - 1, 12 + NOW.month - i)
|
||||||
|
# 营收逐月递减(历史数据),展示增长趋势
|
||||||
|
hist_revenue = int(revenue * (1 - 0.03 * i)) if revenue > 0 else 0
|
||||||
db.add(FinancialData(
|
db.add(FinancialData(
|
||||||
company_id=comp_id, period_year=y, period_month=m,
|
company_id=comp_id, period_year=y, period_month=m,
|
||||||
statement_type="income",
|
statement_type="income",
|
||||||
data_json={"revenue": revenue, "cogs": int(revenue * 0.4), "gross_profit": int(revenue * 0.6), "opex": burn, "net_income": revenue - burn - int(revenue * 0.4)},
|
data_json={"revenue": hist_revenue, "cogs": int(hist_revenue * 0.4), "gross_profit": int(hist_revenue * 0.6), "opex": burn, "net_income": hist_revenue - burn - int(hist_revenue * 0.4)},
|
||||||
source="monthly_report", credibility_score=85.0 - i * 5,
|
source="monthly_report", credibility_score=85.0 - i * 5,
|
||||||
))
|
))
|
||||||
db.add(FinancialData(
|
db.add(FinancialData(
|
||||||
company_id=comp_id, period_year=y, period_month=m,
|
company_id=comp_id, period_year=y, period_month=m,
|
||||||
statement_type="cash_flow",
|
statement_type="cash_flow",
|
||||||
data_json={"operating_cf": revenue - burn, "investing_cf": -50, "financing_cf": 0, "net_cf": revenue - burn - 50, "cash_balance": cash - i * burn},
|
data_json={"operating_cf": hist_revenue - burn, "investing_cf": -50, "financing_cf": 0, "net_cf": hist_revenue - burn - 50, "cash_balance": cash - i * burn},
|
||||||
source="monthly_report", credibility_score=85.0 - i * 5,
|
source="monthly_report", credibility_score=85.0 - i * 5,
|
||||||
))
|
))
|
||||||
await db.flush()
|
await db.flush()
|
||||||
print(" ✓ 财务数据 (5 企业 x 3 月)")
|
print(" ✓ 财务数据 (5 企业 x 6 月)")
|
||||||
|
|
||||||
|
|
||||||
# ─── 月报 ──────────────────────────────────────────────────────────────
|
# ─── 月报 ──────────────────────────────────────────────────────────────
|
||||||
@@ -201,78 +225,176 @@ async def _seed_reports(db: AsyncSession) -> None:
|
|||||||
for r in reports:
|
for r in reports:
|
||||||
db.add(r)
|
db.add(r)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
print(" ✓ 月报 (5 份)")
|
|
||||||
|
# 历史月报 — 每家企业再补 5 个月,展示趋势
|
||||||
|
historical_data = [
|
||||||
|
# (company_id, founder_id, months_ago, revenue, growth, new_cust, churned, headcount, summary, concerns)
|
||||||
|
(COMP_A, FOUNDER_A, 2, 696, 0.08, 2, 0, 40, "营收稳步增长,新签2家客户。", []),
|
||||||
|
(COMP_A, FOUNDER_A, 3, 644, 0.05, 1, 1, 38, "营收增长5%,客户流失1家。", [{"level": "low", "item": "客户流失", "detail": "流失1家小客户"}]),
|
||||||
|
(COMP_A, FOUNDER_A, 4, 613, 0.03, 1, 0, 37, "营收小幅增长,团队稳定。", []),
|
||||||
|
(COMP_A, FOUNDER_A, 5, 595, 0.02, 0, 0, 35, "营收微增,无新签客户。", [{"level": "medium", "item": "增长放缓", "detail": "环比仅2%"}]),
|
||||||
|
(COMP_A, FOUNDER_A, 6, 583, 0.01, 1, 1, 34, "基本持平,团队新增1人。", []),
|
||||||
|
(COMP_B, FOUNDER_B, 2, 150, 0.0, 0, 0, 22, "营收持平,产品迭代中。", []),
|
||||||
|
(COMP_B, FOUNDER_B, 3, 150, 0.02, 1, 0, 21, "营收微增,新签1家客户。", []),
|
||||||
|
(COMP_B, FOUNDER_B, 4, 147, -0.01, 0, 1, 21, "营收微降,流失1家小客户。", [{"level": "medium", "item": "客户流失", "detail": "流失1家"}]),
|
||||||
|
(COMP_B, FOUNDER_B, 5, 149, 0.03, 1, 0, 20, "营收回升,新签1家。", []),
|
||||||
|
(COMP_B, FOUNDER_B, 6, 145, 0.0, 0, 0, 20, "持平,团队稳定。", []),
|
||||||
|
(COMP_C, FOUNDER_C, 2, 984, 0.18, 3, 0, 62, "强劲增长,半导体客户+3。", []),
|
||||||
|
(COMP_C, FOUNDER_C, 3, 834, 0.15, 2, 0, 58, "持续增长,新增专利1项。", []),
|
||||||
|
(COMP_C, FOUNDER_C, 4, 725, 0.12, 1, 0, 55, "稳定增长,团队扩张。", []),
|
||||||
|
(COMP_C, FOUNDER_C, 5, 647, 0.10, 1, 0, 52, "增速放缓,但趋势向上。", []),
|
||||||
|
(COMP_C, FOUNDER_C, 6, 588, 0.08, 0, 0, 50, "基线月份,稳步起步。", []),
|
||||||
|
(COMP_E, FOUNDER_A, 2, 75, 0.0, 0, 0, 17, "里程碑收入稳定。", []),
|
||||||
|
(COMP_E, FOUNDER_A, 3, 80, 0.07, 0, 0, 18, "小幅增长,靶点推进。", []),
|
||||||
|
(COMP_E, FOUNDER_A, 4, 75, 0.0, 0, 0, 17, "持平,研发正常。", []),
|
||||||
|
(COMP_E, FOUNDER_A, 5, 70, -0.07, 0, 0, 16, "收入微降,无里程碑。", [{"level": "low", "item": "收入波动", "detail": "依赖里程碑付款"}]),
|
||||||
|
(COMP_E, FOUNDER_A, 6, 75, 0.04, 0, 0, 16, "基线月份,稳定。", []),
|
||||||
|
]
|
||||||
|
for comp_id, founder_id, months_ago, revenue, growth, new_c, churned, hc, summary, concerns in historical_data:
|
||||||
|
m = NOW.month - months_ago
|
||||||
|
y = NOW.year
|
||||||
|
if m <= 0:
|
||||||
|
m += 12
|
||||||
|
y -= 1
|
||||||
|
db.add(MonthlyReport(
|
||||||
|
company_id=comp_id, period_year=y, period_month=m,
|
||||||
|
status="reviewed", submitted_by=founder_id, submitted_at=D(months_ago * 30 + 10),
|
||||||
|
reviewed_by=MGR_ID, reviewed_at=D(months_ago * 30 + 5),
|
||||||
|
raw_content=f"本月营收{revenue}万,环比{'增长' if growth > 0 else '持平' if growth == 0 else '下降'}{abs(growth)*100:.0f}%。",
|
||||||
|
structured_data={"revenue": revenue, "mom_growth": growth, "new_customers": new_c, "churned": churned, "headcount": hc},
|
||||||
|
ai_summary=summary,
|
||||||
|
ai_concerns=concerns if concerns else None,
|
||||||
|
))
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 月报 (5 当月 + 20 历史 = 25 份)")
|
||||||
|
|
||||||
|
|
||||||
# ─── 健康度评分 ────────────────────────────────────────────────────────
|
# ─── 健康度评分 ────────────────────────────────────────────────────────
|
||||||
async def _seed_health(db: AsyncSession) -> None:
|
async def _seed_health(db: AsyncSession) -> None:
|
||||||
|
"""最新一期健康度评分 — 14 维度完整评分。"""
|
||||||
scores = [
|
scores = [
|
||||||
# 智链科技 — 良好
|
# 智链科技 — 良好
|
||||||
HealthScore(company_id=COMP_A, total_score=78.5, financial_score=82, operational_score=75, ai_commercial_score=80, ai_cost_score=85,
|
HealthScore(company_id=COMP_A, total_score=78.5,
|
||||||
|
financial_score=82, operational_score=75, ai_commercial_score=80, ai_cost_score=85,
|
||||||
org_talent_score=72, product_tech_score=80, market_compete_score=78, governance_score=75, financing_score=80,
|
org_talent_score=72, product_tech_score=80, market_compete_score=78, governance_score=75, financing_score=80,
|
||||||
trend="up", evidence_json={"financial": "营收增长15%,现金流健康", "ai_cost": "推理成本降低12%"},
|
synergy_score=76, ai_model_product_score=82, data_compliance_score=88, team_tech_score=74, customer_success_score=68,
|
||||||
recommendations_json={"action": "关注客户流失率", "owner": MGR_ID, "review_at": D(-30).isoformat()}),
|
trend="up", evidence_json={"financial": "营收增长15%,现金流健康", "ai_cost": "推理成本降低12%", "data_compliance": "通过等保三级", "ai_poc_count": 3, "compliance_issues": 0},
|
||||||
|
recommendations_json={"action": "关注客户流失率", "owner": MGR_ID, "review_at": D(-30).isoformat()},
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="b", industry="ai", strategy="growth"),
|
||||||
# 云栈数据 — 中等
|
# 云栈数据 — 中等
|
||||||
HealthScore(company_id=COMP_B, total_score=62.0, financial_score=55, operational_score=68, ai_commercial_score=60, ai_cost_score=65,
|
HealthScore(company_id=COMP_B, total_score=62.0,
|
||||||
|
financial_score=55, operational_score=68, ai_commercial_score=60, ai_cost_score=65,
|
||||||
org_talent_score=70, product_tech_score=72, market_compete_score=58, governance_score=65, financing_score=50,
|
org_talent_score=70, product_tech_score=72, market_compete_score=58, governance_score=65, financing_score=50,
|
||||||
trend="stable", evidence_json={"financial": "营收持平,需突破", "financing": "Runway 15月,需启动融资"},
|
synergy_score=64, ai_model_product_score=68, data_compliance_score=85, team_tech_score=72, customer_success_score=60,
|
||||||
recommendations_json={"action": "加速融资节奏", "owner": LEAD_ID, "review_at": D(-14).isoformat()}),
|
trend="stable", evidence_json={"financial": "营收持平,需突破", "financing": "Runway 15月,需启动融资", "ai_poc_count": 1, "compliance_issues": 1},
|
||||||
|
recommendations_json={"action": "加速融资节奏", "owner": LEAD_ID, "review_at": D(-14).isoformat()},
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="a", industry="ai", strategy="growth"),
|
||||||
# 深瞳智能 — 优秀
|
# 深瞳智能 — 优秀
|
||||||
HealthScore(company_id=COMP_C, total_score=85.5, financial_score=88, operational_score=85, ai_commercial_score=90, ai_cost_score=82,
|
HealthScore(company_id=COMP_C, total_score=85.5,
|
||||||
|
financial_score=88, operational_score=85, ai_commercial_score=90, ai_cost_score=82,
|
||||||
org_talent_score=83, product_tech_score=88, market_compete_score=86, governance_score=82, financing_score=85,
|
org_talent_score=83, product_tech_score=88, market_compete_score=86, governance_score=82, financing_score=85,
|
||||||
trend="up", evidence_json={"financial": "营收增长22%", "market": "半导体渗透加深"},
|
synergy_score=80, ai_model_product_score=86, data_compliance_score=90, team_tech_score=85, customer_success_score=82,
|
||||||
recommendations_json={"action": "关注客户集中度", "owner": MGR_ID, "review_at": D(-30).isoformat()}),
|
trend="up", evidence_json={"financial": "营收增长22%", "market": "半导体渗透加深", "ai_poc_count": 5, "compliance_issues": 0},
|
||||||
|
recommendations_json={"action": "关注客户集中度", "owner": MGR_ID, "review_at": D(-30).isoformat()},
|
||||||
|
fund_type="early_vc", fund_lifecycle="growth", company_stage="b", industry="ai", strategy="growth"),
|
||||||
# 量子芯微 — 早期风险
|
# 量子芯微 — 早期风险
|
||||||
HealthScore(company_id=COMP_D, total_score=48.0, financial_score=35, operational_score=50, ai_commercial_score=45, ai_cost_score=55,
|
HealthScore(company_id=COMP_D, total_score=48.0,
|
||||||
|
financial_score=35, operational_score=50, ai_commercial_score=45, ai_cost_score=55,
|
||||||
org_talent_score=52, product_tech_score=60, market_compete_score=42, governance_score=55, financing_score=40,
|
org_talent_score=52, product_tech_score=60, market_compete_score=42, governance_score=55, financing_score=40,
|
||||||
trend="down", evidence_json={"financial": "无营收,现金紧张", "financing": "Runway 7月"},
|
synergy_score=45, ai_model_product_score=58, data_compliance_score=65, team_tech_score=62, customer_success_score=38,
|
||||||
recommendations_json={"action": "紧急启动天使+轮融资", "owner": GP_ID, "review_at": D(-7).isoformat()}),
|
trend="down", evidence_json={"financial": "无营收,现金紧张", "financing": "Runway 7月", "ai_poc_count": 0, "compliance_issues": 2},
|
||||||
|
recommendations_json={"action": "紧急启动天使+轮融资", "owner": GP_ID, "review_at": D(-7).isoformat()},
|
||||||
|
fund_type="angel", fund_lifecycle="investment", company_stage="seed", industry="hardware", strategy="growth"),
|
||||||
# 光合生物 — 中等偏上
|
# 光合生物 — 中等偏上
|
||||||
HealthScore(company_id=COMP_E, total_score=68.5, financial_score=60, operational_score=72, ai_commercial_score=70, ai_cost_score=65,
|
HealthScore(company_id=COMP_E, total_score=68.5,
|
||||||
|
financial_score=60, operational_score=72, ai_commercial_score=70, ai_cost_score=65,
|
||||||
org_talent_score=68, product_tech_score=75, market_compete_score=65, governance_score=70, financing_score=62,
|
org_talent_score=68, product_tech_score=75, market_compete_score=65, governance_score=70, financing_score=62,
|
||||||
trend="stable", evidence_json={"financial": "里程碑收入稳定", "product": "3靶点推进中"},
|
synergy_score=66, ai_model_product_score=72, data_compliance_score=80, team_tech_score=70, customer_success_score=65,
|
||||||
recommendations_json={"action": "月报提交及时性改善", "owner": MGR_ID, "review_at": D(-30).isoformat()}),
|
trend="stable", evidence_json={"financial": "里程碑收入稳定", "product": "3靶点推进中", "ai_poc_count": 2, "compliance_issues": 0},
|
||||||
|
recommendations_json={"action": "月报提交及时性改善", "owner": MGR_ID, "review_at": D(-30).isoformat()},
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="a", industry="biotech", strategy="growth"),
|
||||||
]
|
]
|
||||||
for s in scores:
|
for s in scores:
|
||||||
s.calculated_at = D(5)
|
s.calculated_at = D(5)
|
||||||
db.add(s)
|
db.add(s)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
print(" ✓ 健康度评分 (5 企业)")
|
print(" ✓ 健康度评分 (5 企业 x 14 维度)")
|
||||||
|
|
||||||
|
|
||||||
# ─── 风险事件 ──────────────────────────────────────────────────────────
|
# ─── 风险事件 ──────────────────────────────────────────────────────────
|
||||||
async def _seed_risks(db: AsyncSession) -> None:
|
async def _seed_risks(db: AsyncSession) -> None:
|
||||||
risks = [
|
risks = [
|
||||||
|
# COMP_A — 智链科技
|
||||||
RiskEvent(company_id=COMP_A, type="operational", severity="medium", status="in_progress",
|
RiskEvent(company_id=COMP_A, type="operational", severity="medium", status="in_progress",
|
||||||
title="客户流失率环比上升", description="本月流失1家年合同客户,流失率从2%升至4%",
|
title="客户流失率环比上升", description="本月流失1家年合同客户,流失率从2%升至4%",
|
||||||
evidence_json={"metric": "churn_rate", "current": 0.04, "previous": 0.02, "threshold": 0.03},
|
evidence_json={"metric": "churn_rate", "current": 0.04, "previous": 0.02, "threshold": 0.03},
|
||||||
suggested_action="联系流失客户了解原因,加强客户成功团队", assigned_to=MGR_ID, due_at=D(-7)),
|
suggested_action="联系流失客户了解原因,加强客户成功团队", assigned_to=MGR_ID, due_at=D(-7)),
|
||||||
RiskEvent(company_id=COMP_B, type="financial", severity="high", status="assigned",
|
|
||||||
title="营收增长停滞", description="连续2个月环比0%增长,未达预期",
|
|
||||||
evidence_json={"metric": "revenue_growth", "current": 0.0, "expected": 0.15, "months": 2},
|
|
||||||
suggested_action="与创始人讨论增长策略,评估产品定价和市场拓展", assigned_to=LEAD_ID, due_at=D(-3)),
|
|
||||||
RiskEvent(company_id=COMP_D, type="financial", severity="critical", status="open",
|
|
||||||
title="现金Runway不足7个月", description="按当前消耗速度,现金仅可维持7个月",
|
|
||||||
evidence_json={"metric": "runway_months", "current": 7, "threshold": 9},
|
|
||||||
suggested_action="紧急启动天使+轮融资,准备BP和财务预测", assigned_to=GP_ID, due_at=D(-14)),
|
|
||||||
RiskEvent(company_id=COMP_E, type="operational", severity="medium", status="resolved",
|
|
||||||
title="月报延迟提交", description="上月月报延迟20天提交",
|
|
||||||
evidence_json={"metric": "report_delay_days", "current": 20, "threshold": 5},
|
|
||||||
suggested_action="与创始人沟通提交规范,设置自动提醒", assigned_to=MGR_ID, due_at=D(-10), closed_at=D(-3)),
|
|
||||||
RiskEvent(company_id=COMP_C, type="org", severity="low", status="open",
|
|
||||||
title="核心技术人员稳定性下降", description="CTO提及外部机会,稳定性评分从0.85降至0.65",
|
|
||||||
evidence_json={"metric": "cto_stability", "current": 0.65, "previous": 0.85},
|
|
||||||
suggested_action="了解CTO诉求,评估股权激励调整", assigned_to=LEAD_ID),
|
|
||||||
RiskEvent(company_id=COMP_A, type="ai_specific", severity="low", status="closed",
|
RiskEvent(company_id=COMP_A, type="ai_specific", severity="low", status="closed",
|
||||||
title="AI模型推理成本超标", description="上月推理成本占营收比12%,超10%阈值",
|
title="AI模型推理成本超标", description="上月推理成本占营收比12%,超10%阈值",
|
||||||
evidence_json={"metric": "ai_cost_ratio", "current": 0.12, "threshold": 0.10},
|
evidence_json={"metric": "ai_cost_ratio", "current": 0.12, "threshold": 0.10},
|
||||||
suggested_action="优化模型量化策略", assigned_to=MGR_ID, closed_at=D(-5)),
|
suggested_action="优化模型量化策略", assigned_to=MGR_ID, closed_at=D(-5)),
|
||||||
|
RiskEvent(company_id=COMP_A, type="market", severity="medium", status="open",
|
||||||
|
title="竞品低价策略冲击", description="杉数科技以低于我方30%的价格争夺制造业客户",
|
||||||
|
evidence_json={"competitor": "杉数科技", "price_diff": -0.30, "affected_customers": 3},
|
||||||
|
suggested_action="强化差异化话术,加速多模态产品迭代", assigned_to=LEAD_ID),
|
||||||
|
RiskEvent(company_id=COMP_A, type="financial", severity="low", status="resolved",
|
||||||
|
title="应收账款周期延长", description="2家客户付款周期从30天延至45天",
|
||||||
|
evidence_json={"metric": "ar_days", "current": 45, "previous": 30, "threshold": 60},
|
||||||
|
suggested_action="与客户协商缩短账期", assigned_to=MGR_ID, closed_at=D(-15)),
|
||||||
|
# COMP_B — 云栈数据
|
||||||
|
RiskEvent(company_id=COMP_B, type="financial", severity="high", status="assigned",
|
||||||
|
title="营收增长停滞", description="连续2个月环比0%增长,未达预期",
|
||||||
|
evidence_json={"metric": "revenue_growth", "current": 0.0, "expected": 0.15, "months": 2},
|
||||||
|
suggested_action="与创始人讨论增长策略,评估产品定价和市场拓展", assigned_to=LEAD_ID, due_at=D(-3)),
|
||||||
|
RiskEvent(company_id=COMP_B, type="financial", severity="high", status="open",
|
||||||
|
title="现金Runway缩短至15个月", description="按当前消耗速度,现金仅可维持15个月",
|
||||||
|
evidence_json={"metric": "runway_months", "current": 15, "threshold": 18},
|
||||||
|
suggested_action="启动A+轮融资准备,控制招聘节奏", assigned_to=GP_ID),
|
||||||
|
RiskEvent(company_id=COMP_B, type="market", severity="medium", status="open",
|
||||||
|
title="金融行业准入门槛高", description="银行客户POC周期长达6-12月,转化率低",
|
||||||
|
evidence_json={"metric": "poc_conversion", "current": 0.15, "expected": 0.30},
|
||||||
|
suggested_action="调整目标客户画像,探索保险/证券赛道", assigned_to=MGR_ID),
|
||||||
|
# COMP_C — 深瞳智能
|
||||||
|
RiskEvent(company_id=COMP_C, type="org", severity="medium", status="open",
|
||||||
|
title="核心技术人员稳定性下降", description="CTO提及外部机会,稳定性评分从0.85降至0.65",
|
||||||
|
evidence_json={"metric": "cto_stability", "current": 0.65, "previous": 0.85},
|
||||||
|
suggested_action="了解CTO诉求,评估股权激励调整", assigned_to=LEAD_ID),
|
||||||
|
RiskEvent(company_id=COMP_C, type="market", severity="medium", status="in_progress",
|
||||||
|
title="客户集中度过高", description="半导体行业占比60%,周期下行风险大",
|
||||||
|
evidence_json={"metric": "customer_concentration", "current": 0.60, "threshold": 0.50, "industry": "semiconductor"},
|
||||||
|
suggested_action="拓展新能源、消费电子等新行业客户", assigned_to=MGR_ID, due_at=D(-30)),
|
||||||
|
RiskEvent(company_id=COMP_C, type="operational", severity="low", status="closed",
|
||||||
|
title="产品交付延迟", description="1条产线视觉系统部署延迟2周",
|
||||||
|
evidence_json={"metric": "delivery_delay_days", "current": 14, "threshold": 7},
|
||||||
|
suggested_action="增加现场实施人员", assigned_to=MGR_ID, closed_at=D(-20)),
|
||||||
|
# COMP_D — 量子芯微
|
||||||
|
RiskEvent(company_id=COMP_D, type="financial", severity="critical", status="open",
|
||||||
|
title="现金Runway不足7个月", description="按当前消耗速度,现金仅可维持7个月",
|
||||||
|
evidence_json={"metric": "runway_months", "current": 7, "threshold": 9},
|
||||||
|
suggested_action="紧急启动天使+轮融资,准备BP和财务预测", assigned_to=GP_ID, due_at=D(-14)),
|
||||||
|
RiskEvent(company_id=COMP_D, type="technical", severity="high", status="in_progress",
|
||||||
|
title="NPU流片进度风险", description="EDA工具链兼容性问题可能导致流片延迟1-2月",
|
||||||
|
evidence_json={"metric": "tapeout_delay_risk", "risk_level": "high", "eta_impact": "1-2月"},
|
||||||
|
suggested_action="协调备用EDA工具,增加验证人力", assigned_to=GP_ID, due_at=D(-7)),
|
||||||
|
RiskEvent(company_id=COMP_D, type="market", severity="medium", status="open",
|
||||||
|
title="边缘NPU赛道巨头入场", description="英伟达发布边缘端Jetson新品,可能挤压创业公司空间",
|
||||||
|
evidence_json={"competitor": "NVIDIA", "product": "Jetson Orin Nano", "threat_level": "medium"},
|
||||||
|
suggested_action="强化低功耗差异化,加速客户绑定", assigned_to=LEAD_ID),
|
||||||
|
# COMP_E — 光合生物
|
||||||
|
RiskEvent(company_id=COMP_E, type="operational", severity="medium", status="resolved",
|
||||||
|
title="月报延迟提交", description="上月月报延迟20天提交",
|
||||||
|
evidence_json={"metric": "report_delay_days", "current": 20, "threshold": 5},
|
||||||
|
suggested_action="与创始人沟通提交规范,设置自动提醒", assigned_to=MGR_ID, due_at=D(-10), closed_at=D(-3)),
|
||||||
|
RiskEvent(company_id=COMP_E, type="financial", severity="medium", status="open",
|
||||||
|
title="研发投入产出周期长", description="3靶点尚处先导化合物阶段,距临床还需12-18月",
|
||||||
|
evidence_json={"metric": "time_to_clinic", "current": 18, "threshold": 12, "targets": 3},
|
||||||
|
suggested_action="评估是否引入大药企联合开发", assigned_to=LEAD_ID),
|
||||||
]
|
]
|
||||||
for r in risks:
|
for r in risks:
|
||||||
r.identified_at = D(15)
|
r.identified_at = D(15)
|
||||||
db.add(r)
|
db.add(r)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
print(" ✓ 风险事件 (6 条)")
|
print(" ✓ 风险事件 (15 条)")
|
||||||
|
|
||||||
|
|
||||||
# ─── 弱信号 ────────────────────────────────────────────────────────────
|
# ─── 弱信号 ────────────────────────────────────────────────────────────
|
||||||
@@ -290,12 +412,23 @@ async def _seed_weak_signals(db: AsyncSession) -> None:
|
|||||||
confidence=0.60, risk_probability=0.55, status="new"),
|
confidence=0.60, risk_probability=0.55, status="new"),
|
||||||
WeakSignal(company_id=COMP_E, signal_type="market", source="FDA新闻", content="同类靶点药物获FDA快速审批",
|
WeakSignal(company_id=COMP_E, signal_type="market", source="FDA新闻", content="同类靶点药物获FDA快速审批",
|
||||||
confidence=0.75, risk_probability=0.30, status="new"),
|
confidence=0.75, risk_probability=0.30, status="new"),
|
||||||
|
WeakSignal(company_id=COMP_C, signal_type="market", source="半导体行业协会", content="半导体周期指标连续2月下行",
|
||||||
|
confidence=0.70, risk_probability=0.62, status="correlated",
|
||||||
|
correlation_result={"related_signals": 1, "pattern": "行业周期风险"}),
|
||||||
|
WeakSignal(company_id=COMP_A, signal_type="technical", source="GitHub", content="竞品开源多模态决策引擎,star数暴涨",
|
||||||
|
confidence=0.65, risk_probability=0.40, status="new"),
|
||||||
|
WeakSignal(company_id=COMP_B, signal_type="org", source="脉脉", content="云栈数据销售总监更新简历",
|
||||||
|
confidence=0.78, risk_probability=0.60, status="alerted",
|
||||||
|
correlation_result={"related_signals": 1, "pattern": "销售负责人不稳定"}),
|
||||||
|
WeakSignal(company_id=COMP_D, signal_type="market", source="英伟达发布会", content="英伟达发布边缘端Jetson Orin Nano,价格下探",
|
||||||
|
confidence=0.82, risk_probability=0.70, status="alerted",
|
||||||
|
correlation_result={"related_signals": 2, "pattern": "巨头入场边缘AI"}),
|
||||||
]
|
]
|
||||||
for s in signals:
|
for s in signals:
|
||||||
s.detected_at = D(7)
|
s.detected_at = D(7)
|
||||||
db.add(s)
|
db.add(s)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
print(" ✓ 弱信号 (5 条)")
|
print(" ✓ 弱信号 (9 条)")
|
||||||
|
|
||||||
|
|
||||||
# ─── 任务 ──────────────────────────────────────────────────────────────
|
# ─── 任务 ──────────────────────────────────────────────────────────────
|
||||||
@@ -633,5 +766,512 @@ async def _seed_audit_logs(db: AsyncSession) -> None:
|
|||||||
print(" ✓ 审计日志 (10 条)")
|
print(" ✓ 审计日志 (10 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 健康度历史趋势(近 6 个月) ──────────────────────────────────────
|
||||||
|
async def _seed_health_history(db: AsyncSession) -> None:
|
||||||
|
"""每家企业近 6 个月健康度趋势,用于趋势图展示。"""
|
||||||
|
# 基线分数和月度变化趋势
|
||||||
|
trends = [
|
||||||
|
# (company_id, base_score, monthly_deltas)
|
||||||
|
(COMP_A, 70.0, [+1.5, +2.0, +1.5, +2.0, +1.5, +0.0]), # 上升趋势
|
||||||
|
(COMP_B, 65.0, [-0.5, -0.5, +0.0, -0.5, -1.0, +0.0]), # 下降趋势
|
||||||
|
(COMP_C, 75.0, [+1.5, +2.0, +2.5, +2.0, +1.5, +1.0]), # 强上升
|
||||||
|
(COMP_D, 58.0, [-2.0, -2.0, -2.5, -1.5, -1.0, -1.0]), # 持续下降
|
||||||
|
(COMP_E, 65.0, [+0.5, +1.0, +0.5, +1.0, +0.5, +0.0]), # 缓慢上升
|
||||||
|
]
|
||||||
|
for comp_id, base, deltas in trends:
|
||||||
|
score = base
|
||||||
|
for i, delta in enumerate(deltas):
|
||||||
|
score += delta
|
||||||
|
m = (NOW.month - i - 1) if (NOW.month - i - 1) > 0 else (12 + NOW.month - i - 1)
|
||||||
|
y = NOW.year if (NOW.month - i - 1) > 0 else NOW.year - 1
|
||||||
|
db.add(HealthScore(
|
||||||
|
company_id=comp_id, total_score=round(score, 1),
|
||||||
|
financial_score=round(score * 1.05, 1), operational_score=round(score * 0.95, 1),
|
||||||
|
ai_commercial_score=round(score * 1.02, 1), ai_cost_score=round(score * 1.08, 1),
|
||||||
|
org_talent_score=round(score * 0.92, 1), product_tech_score=round(score * 1.03, 1),
|
||||||
|
market_compete_score=round(score * 0.98, 1), governance_score=round(score * 0.96, 1),
|
||||||
|
financing_score=round(score * 0.94, 1),
|
||||||
|
synergy_score=round(score * 0.97, 1), ai_model_product_score=round(score * 1.04, 1),
|
||||||
|
data_compliance_score=round(score * 1.12, 1), team_tech_score=round(score * 0.95, 1),
|
||||||
|
customer_success_score=round(score * 0.87, 1),
|
||||||
|
trend="up" if delta > 0 else "down" if delta < 0 else "stable",
|
||||||
|
evidence_json={"historical": True, "month": f"{y}-{m:02d}"},
|
||||||
|
calculated_at=datetime(y, m, 1, tzinfo=UTC),
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="b", industry="ai", strategy="growth",
|
||||||
|
))
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 健康度历史趋势 (5 企业 x 6 月)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 基金 ──────────────────────────────────────────────────────────────
|
||||||
|
async def _seed_funds(db: AsyncSession) -> None:
|
||||||
|
"""基金信息 + 企业-基金关联。"""
|
||||||
|
fund1 = Fund(tenant_id=TENANT_ID, name="远见三期人民币基金", fund_type="early_vc", strategy="growth",
|
||||||
|
established_date=datetime(2023, 1, 1).date(), total_lifespan_months=84, investment_period_months=48,
|
||||||
|
lp_composition_json={"government": 30, "market": 50, "corporate": 20}, primary_market="china_mainland")
|
||||||
|
fund2 = Fund(tenant_id=TENANT_ID, name="远见天使基金", fund_type="angel", strategy="growth",
|
||||||
|
established_date=datetime(2024, 1, 1).date(), total_lifespan_months=72, investment_period_months=36,
|
||||||
|
lp_composition_json={"government": 20, "market": 60, "corporate": 20}, primary_market="china_mainland")
|
||||||
|
for f in [fund1, fund2]:
|
||||||
|
db.add(f)
|
||||||
|
await db.flush()
|
||||||
|
|
||||||
|
links = [
|
||||||
|
CompanyFundLink(company_id=COMP_A, fund_id=fund1.id, investment_date=datetime(2023, 6, 1).date(),
|
||||||
|
investment_stage="b", round="B轮", amount=5000, ownership_pct=12.5, is_current=True),
|
||||||
|
CompanyFundLink(company_id=COMP_B, fund_id=fund1.id, investment_date=datetime(2023, 3, 1).date(),
|
||||||
|
investment_stage="a", round="A轮", amount=2000, ownership_pct=15.0, is_current=True),
|
||||||
|
CompanyFundLink(company_id=COMP_C, fund_id=fund1.id, investment_date=datetime(2022, 12, 1).date(),
|
||||||
|
investment_stage="b", round="B轮", amount=8000, ownership_pct=20.0, is_current=True),
|
||||||
|
CompanyFundLink(company_id=COMP_E, fund_id=fund1.id, investment_date=datetime(2023, 9, 1).date(),
|
||||||
|
investment_stage="a", round="A轮", amount=3000, ownership_pct=10.0, is_current=True),
|
||||||
|
CompanyFundLink(company_id=COMP_D, fund_id=fund2.id, investment_date=datetime(2024, 3, 1).date(),
|
||||||
|
investment_stage="seed", round="天使轮", amount=500, ownership_pct=8.0, is_current=True),
|
||||||
|
]
|
||||||
|
for l in links:
|
||||||
|
db.add(l)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 基金 (2 支) + 关联 (5 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 多主体画像 ────────────────────────────────────────────────────────
|
||||||
|
async def _seed_profiles(db: AsyncSession) -> None:
|
||||||
|
"""投资机构、基金、投资经理画像。"""
|
||||||
|
firm = FirmProfile(tenant_id=TENANT_ID, name="远见资本",
|
||||||
|
focus_areas={"sectors": ["AI", "硬科技", "生物医药"], "stages": ["seed", "A", "B"]},
|
||||||
|
stage_preference="seed-B", description="专注早期科技投资,管理规模15亿人民币。")
|
||||||
|
db.add(firm)
|
||||||
|
await db.flush()
|
||||||
|
|
||||||
|
db.add(FundProfile(firm_id=firm.id, name="远见三期人民币基金", fund_size="5亿人民币", vintage_year=2023,
|
||||||
|
strategy="早期科技,AI+硬科技为主,赋能式投后管理。"))
|
||||||
|
db.add(FundProfile(firm_id=firm.id, name="远见天使基金", fund_size="1亿人民币", vintage_year=2024,
|
||||||
|
strategy="天使阶段,聚焦AI应用和芯片设计。"))
|
||||||
|
|
||||||
|
db.add(ManagerProfile(firm_id=firm.id, user_id=MGR_ID, name="王经理",
|
||||||
|
focus_areas={"sectors": ["AI/供应链", "AI/数据平台"], "companies": [COMP_A, COMP_B]},
|
||||||
|
portfolio_count=2))
|
||||||
|
db.add(ManagerProfile(firm_id=firm.id, user_id=LEAD_ID, name="李投后",
|
||||||
|
focus_areas={"sectors": ["AI/计算机视觉", "AI/医疗"], "companies": [COMP_C, COMP_E]},
|
||||||
|
portfolio_count=2))
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 画像 (机构1 + 基金2 + 经理2)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 评价模板 ──────────────────────────────────────────────────────────
|
||||||
|
async def _seed_evaluation_templates(db: AsyncSession) -> None:
|
||||||
|
"""6 轴动态评价模板 — 覆盖常见组合。"""
|
||||||
|
templates = [
|
||||||
|
EvaluationTemplate(tenant_id=TENANT_ID, name="早期VC-AI-B轮-成长策略",
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="b",
|
||||||
|
industry="ai", strategy="growth", investor_type="investor",
|
||||||
|
weights_json={"financial": 0.12, "operational": 0.10, "ai_commercial": 0.12, "ai_cost": 0.08,
|
||||||
|
"org_talent": 0.10, "product_tech": 0.12, "market_compete": 0.10, "governance": 0.06,
|
||||||
|
"financing": 0.08, "synergy": 0.04, "ai_model_product": 0.04, "data_compliance": 0.02,
|
||||||
|
"team_tech": 0.01, "customer_success": 0.01},
|
||||||
|
enabled_dimensions=["financial", "operational", "ai_commercial", "ai_cost", "org_talent",
|
||||||
|
"product_tech", "market_compete", "governance", "financing", "synergy",
|
||||||
|
"ai_model_product", "data_compliance", "team_tech", "customer_success"],
|
||||||
|
disabled_dimensions=[],
|
||||||
|
custom_metrics_json={"ai_poc_count": {"label": "AI PoC 数量", "source": "月报"}, "compliance_issues": {"label": "合规整改项", "source": "审计"}},
|
||||||
|
is_default=True),
|
||||||
|
EvaluationTemplate(tenant_id=TENANT_ID, name="天使-硬件-种子期-成长策略",
|
||||||
|
fund_type="angel", fund_lifecycle="investment", company_stage="seed",
|
||||||
|
industry="hardware", strategy="growth", investor_type="gp",
|
||||||
|
weights_json={"financial": 0.06, "operational": 0.08, "ai_commercial": 0.08, "ai_cost": 0.06,
|
||||||
|
"org_talent": 0.15, "product_tech": 0.20, "market_compete": 0.10, "governance": 0.05,
|
||||||
|
"financing": 0.12, "synergy": 0.03, "ai_model_product": 0.04, "data_compliance": 0.01,
|
||||||
|
"team_tech": 0.02, "customer_success": 0.00},
|
||||||
|
enabled_dimensions=["financial", "operational", "ai_commercial", "ai_cost", "org_talent",
|
||||||
|
"product_tech", "market_compete", "governance", "financing", "synergy",
|
||||||
|
"ai_model_product", "data_compliance", "team_tech"],
|
||||||
|
disabled_dimensions=["customer_success"],
|
||||||
|
is_default=True),
|
||||||
|
EvaluationTemplate(tenant_id=TENANT_ID, name="早期VC-生物医疗-A轮-成长策略",
|
||||||
|
fund_type="early_vc", fund_lifecycle="investment", company_stage="a",
|
||||||
|
industry="biotech", strategy="growth", investor_type="investor",
|
||||||
|
weights_json={"financial": 0.08, "operational": 0.10, "ai_commercial": 0.10, "ai_cost": 0.06,
|
||||||
|
"org_talent": 0.12, "product_tech": 0.18, "market_compete": 0.08, "governance": 0.08,
|
||||||
|
"financing": 0.10, "synergy": 0.03, "ai_model_product": 0.04, "data_compliance": 0.03,
|
||||||
|
"team_tech": 0.00, "customer_success": 0.00},
|
||||||
|
enabled_dimensions=["financial", "operational", "ai_commercial", "ai_cost", "org_talent",
|
||||||
|
"product_tech", "market_compete", "governance", "financing", "synergy",
|
||||||
|
"ai_model_product", "data_compliance"],
|
||||||
|
disabled_dimensions=["team_tech", "customer_success"],
|
||||||
|
is_default=True),
|
||||||
|
]
|
||||||
|
for t in templates:
|
||||||
|
db.add(t)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 评价模板 (3 套)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 追问清单 ──────────────────────────────────────────────────────────
|
||||||
|
async def _seed_inquiries(db: AsyncSession) -> None:
|
||||||
|
"""月报追问清单 — AI 生成补充问题。"""
|
||||||
|
inquiries = [
|
||||||
|
InquiryList(company_id=COMP_A,
|
||||||
|
questions=[{"q": "本月流失客户的具体原因是什么?", "a": "客户反馈技术支持响应慢,竞品以低价策略抢客。"},
|
||||||
|
{"q": "AI推理成本降低12%的具体措施?", "a": "采用模型量化+推理优化,单次调用成本从0.05元降至0.044元。"},
|
||||||
|
{"q": "新签3家客户的年合同金额?", "a": "合计约480万/年,平均160万/家。"}],
|
||||||
|
status="answered", sent_at=D(9), answered_at=D(5)),
|
||||||
|
InquiryList(company_id=COMP_B,
|
||||||
|
questions=[{"q": "营收连续2个月持平的原因?", "a": "现有客户续约稳定,但新客户拓展速度放缓。"},
|
||||||
|
{"q": "金融客户拓展进展?", "a": "1家银行已进POC阶段,预计Q3签约。"},
|
||||||
|
{"q": "A+轮融资准备情况?", "a": "BP初稿完成,正在整理财务预测。"}],
|
||||||
|
status="answered", sent_at=D(7), answered_at=D(3)),
|
||||||
|
InquiryList(company_id=COMP_D,
|
||||||
|
questions=[{"q": "NPU原型流片时间表?", "a": "预计下月流片,Q4出工程样片。"},
|
||||||
|
{"q": "天使+轮BP何时可以准备好?", "a": "正在准备中,预计2周内完成。"}],
|
||||||
|
status="sent", sent_at=D(2)),
|
||||||
|
]
|
||||||
|
for i in inquiries:
|
||||||
|
db.add(i)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 追问清单 (3 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Agent 执行记录 ────────────────────────────────────────────────────
|
||||||
|
async def _seed_agent_executions(db: AsyncSession) -> None:
|
||||||
|
"""AI Agent L1-L4 分级执行记录。"""
|
||||||
|
agents = [
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="月报解析Agent", autonomy_level="L3",
|
||||||
|
input_summary="智链科技2025-06月报", output_summary="解析完成:营收800万(+15%),客户净增2家",
|
||||||
|
output_detail={"revenue": 800, "mom_growth": 0.15, "new_customers": 3, "churned": 1},
|
||||||
|
review_status="auto_approved", model_version="gpt-4o-2024", duration_ms=3200),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="风险预警Agent", autonomy_level="L2",
|
||||||
|
input_summary="量子芯微财务数据扫描", output_summary="发现1项critical风险:Runway不足7月",
|
||||||
|
output_detail={"risks_found": 1, "severity": "critical", "metric": "runway", "value": 7},
|
||||||
|
review_status="approved", reviewer_id=MGR_ID, reviewed_at=D(3), model_version="gpt-4o-2024", duration_ms=1800),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="弱信号监测Agent", autonomy_level="L3",
|
||||||
|
input_summary="深瞳智能外部信号扫描", output_summary="LinkedIn检测到CTO更新简历",
|
||||||
|
output_detail={"signal_type": "org", "source": "LinkedIn", "confidence": 0.85},
|
||||||
|
review_status="auto_approved", model_version="gpt-4o-2024", duration_ms=2400),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="协同匹配Agent", autonomy_level="L2",
|
||||||
|
input_summary="Portfolio协同分析", output_summary="发现3个协同机会",
|
||||||
|
output_detail={"matches": 3, "types": ["customer", "tech", "talent"]},
|
||||||
|
review_status="approved", reviewer_id=LEAD_ID, reviewed_at=D(5), model_version="gpt-4o-2024", duration_ms=5600),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="健康度计算Agent", autonomy_level="L4",
|
||||||
|
input_summary="5家企业健康度季度评估", output_summary="14维度评分完成,2家上升1家下降",
|
||||||
|
output_detail={"companies": 5, "trends": {"up": 2, "stable": 2, "down": 1}},
|
||||||
|
review_status="auto_approved", model_version="gpt-4o-2024", duration_ms=8200),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="月报解析Agent", autonomy_level="L3",
|
||||||
|
input_summary="云栈数据2025-06月报", output_summary="解析完成:营收150万(持平)",
|
||||||
|
output_detail={"revenue": 150, "mom_growth": 0.0},
|
||||||
|
review_status="auto_approved", model_version="gpt-4o-2024", duration_ms=2800),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="决策哨兵Agent", autonomy_level="L2",
|
||||||
|
input_summary="云栈数据融资时机分析", output_summary="建议现在启动A+轮融资",
|
||||||
|
output_detail={"decision": "funding", "recommendation": "now", "confidence": 0.72},
|
||||||
|
review_status="pending", model_version="gpt-4o-2024", duration_ms=4200),
|
||||||
|
AgentExecution(tenant_id=TENANT_ID, agent_name="数据校验Agent", autonomy_level="L4",
|
||||||
|
input_summary="5家企业财务数据交叉校验", output_summary="校验通过,数据一致性98.5%",
|
||||||
|
output_detail={"checked": 30, "passed": 29, "inconsistencies": 1},
|
||||||
|
review_status="auto_approved", model_version="gpt-4o-2024", duration_ms=1500),
|
||||||
|
]
|
||||||
|
for idx, a in enumerate(agents):
|
||||||
|
a.created_at = D(10 - idx)
|
||||||
|
db.add(a)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ Agent 执行记录 (8 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 客户获取计划 ──────────────────────────────────────────────────────
|
||||||
|
async def _seed_customer_plans(db: AsyncSession) -> None:
|
||||||
|
"""AI 客户增长引擎 — LP 资源匹配 + 客户获取方案。"""
|
||||||
|
plans = [
|
||||||
|
CustomerAcquisitionPlan(company_id=COMP_A, target_customer="年营收10-50亿制造业CIO/供应链总监",
|
||||||
|
entry_angle="从供应链预测场景切入,ROI 3个月可见",
|
||||||
|
decision_chain={"roles": ["CIO", "供应链VP", "采购总监"], "influence": {"CIO": 0.4, "供应链VP": 0.4, "采购总监": 0.2}, "cycle": "3-6月"},
|
||||||
|
pricing_strategy="SaaS订阅:年费80-200万,按模块阶梯定价",
|
||||||
|
competitive_analysis={"direct": ["杉数科技", "京东物流AI"], "advantage": "多模态决策引擎,部署快3倍", "weakness": "品牌知名度低"},
|
||||||
|
lp_resources={"lp_company": "某制造业LP", "intro_channel": "GP引荐", "warmth": "high"},
|
||||||
|
execution_status="executing",
|
||||||
|
result={"customers_contacted": 5, "poc_started": 2, "signed": 1, "revenue": 160}),
|
||||||
|
CustomerAcquisitionPlan(company_id=COMP_B, target_customer="金融机构数据治理负责人",
|
||||||
|
entry_angle="合规驱动+AI训练数据管理,从数据治理切入",
|
||||||
|
decision_chain={"roles": ["数据治理总监", "合规负责人", "CTO"], "influence": {"数据治理总监": 0.5, "合规负责人": 0.3, "CTO": 0.2}, "cycle": "6-12月"},
|
||||||
|
pricing_strategy="平台授权+实施服务:首年120万+实施80万",
|
||||||
|
competitive_analysis={"direct": ["亿信华辰", "数美科技"], "advantage": "AI原生,支持大模型训练数据管理", "weakness": "金融行业案例少"},
|
||||||
|
lp_resources={"lp_company": "某银行LP", "intro_channel": "GP引荐", "warmth": "medium"},
|
||||||
|
execution_status="planned",
|
||||||
|
result=None),
|
||||||
|
CustomerAcquisitionPlan(company_id=COMP_C, target_customer="半导体晶圆厂质检负责人",
|
||||||
|
entry_angle="替代人工目检,从良率提升切入",
|
||||||
|
decision_chain={"roles": ["质量总监", "生产VP", "CIO"], "influence": {"质量总监": 0.5, "生产VP": 0.3, "CIO": 0.2}, "cycle": "3-6月"},
|
||||||
|
pricing_strategy="设备+软件:单条产线200-400万",
|
||||||
|
competitive_analysis={"direct": ["康代智能", "奥普特"], "advantage": "AI算法精度99.2%,行业领先", "weakness": "硬件成本偏高"},
|
||||||
|
lp_resources={"lp_company": "某半导体LP", "intro_channel": "LP直接引荐", "warmth": "high"},
|
||||||
|
execution_status="completed",
|
||||||
|
result={"customers_contacted": 8, "poc_started": 5, "signed": 3, "revenue": 800}),
|
||||||
|
]
|
||||||
|
for p in plans:
|
||||||
|
db.add(p)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 客户获取计划 (3 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 退出预测 ──────────────────────────────────────────────────────────
|
||||||
|
async def _seed_exit_predictions(db: AsyncSession) -> None:
|
||||||
|
"""退出时机预测 — IPO/并购/二手份额。"""
|
||||||
|
predictions = [
|
||||||
|
ExitPrediction(company_id=COMP_C, exit_path="ipo",
|
||||||
|
timing_window={"earliest": "2027-Q1", "latest": "2028-Q3"},
|
||||||
|
expected_return=4.2, hold_return=2.8, confidence=0.75,
|
||||||
|
signals={"positive": ["营收年增50%+", "半导体赛道热度高", "专利壁垒"], "negative": ["客户集中度60%", "CTO稳定性"]},
|
||||||
|
recommendation="建议2027年Q1启动IPO准备,当前应解决客户集中度和CTO retention问题。"),
|
||||||
|
ExitPrediction(company_id=COMP_A, exit_path="acquisition",
|
||||||
|
timing_window={"earliest": "2026-Q3", "latest": "2027-Q4"},
|
||||||
|
expected_return=3.5, hold_return=3.0, confidence=0.65,
|
||||||
|
signals={"positive": ["多模态技术差异化", "制造业客户基础"], "negative": ["客户流失率上升", "竞争加剧"]},
|
||||||
|
recommendation="建议关注产业并购机会,优先接触京东物流、菜鸟等供应链平台。"),
|
||||||
|
ExitPrediction(company_id=COMP_E, exit_path="acquisition",
|
||||||
|
timing_window={"earliest": "2028-Q1", "latest": "2030-Q4"},
|
||||||
|
expected_return=5.0, hold_return=3.5, confidence=0.55,
|
||||||
|
signals={"positive": ["AI药物发现赛道升温", "3靶点进入先导"], "negative": ["研发周期长", "现金流压力"]},
|
||||||
|
recommendation="建议继续持有,等待靶点临床验证结果后评估并购机会。"),
|
||||||
|
]
|
||||||
|
for p in predictions:
|
||||||
|
db.add(p)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 退出预测 (3 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Pre-mortem + Red Team ─────────────────────────────────────────────
|
||||||
|
async def _seed_pre_mortems(db: AsyncSession) -> None:
|
||||||
|
"""失败推演 + 对抗分析。"""
|
||||||
|
pre_mortems = [
|
||||||
|
PreMortemRecord(company_id=COMP_D, decision_context="天使+轮融资1500万,估值8000万",
|
||||||
|
failure_paths=[{"path": "流片失败导致估值缩水", "probability": 0.25, "impact": "high"},
|
||||||
|
{"path": "融资周期超3月,现金耗尽", "probability": 0.15, "impact": "critical"},
|
||||||
|
{"path": "竞品发布同类NPU,差异化丧失", "probability": 0.20, "impact": "medium"}],
|
||||||
|
risk_checklist={"items": ["流片进度", "现金Runway", "竞品动态", "核心团队稳定性"], "checked": 3, "total": 4},
|
||||||
|
mitigations={"actions": ["准备过桥贷款方案", "与2家竞品做技术对标", "CTO股权激励绑定"]}),
|
||||||
|
PreMortemRecord(company_id=COMP_B, decision_context="A+轮融资3000万 vs 等待Q2数据验证",
|
||||||
|
failure_paths=[{"path": "现在融资估值偏低,稀释过多", "probability": 0.40, "impact": "medium"},
|
||||||
|
{"path": "等待期间现金耗尽", "probability": 0.20, "impact": "critical"},
|
||||||
|
{"path": "Q2数据不及预期,融资更难", "probability": 0.30, "impact": "high"}],
|
||||||
|
risk_checklist={"items": ["现金Runway", "Q2营收预期", "竞品定价压力", "金融客户签约"], "checked": 2, "total": 4},
|
||||||
|
mitigations={"actions": ["准备两套BP", "与现有股东沟通过桥", "加速金融客户POC"]}),
|
||||||
|
]
|
||||||
|
for p in pre_mortems:
|
||||||
|
db.add(p)
|
||||||
|
|
||||||
|
red_teams = [
|
||||||
|
RedTeamRecord(company_id=COMP_A, perspective="competitor",
|
||||||
|
analysis="如果我是杉数科技,会以低价+行业深耕策略抢智链科技的制造业客户。智链的多模态优势在具体场景中并未形成壁垒。",
|
||||||
|
vulnerabilities={"areas": ["客户成功团队薄弱", "品牌知名度低", "定价偏高"], "severity": "medium"},
|
||||||
|
counterarguments={"defense": ["多模态技术差异化", "客户切换成本高"]}),
|
||||||
|
RedTeamRecord(company_id=COMP_C, perspective="pessimistic_investor",
|
||||||
|
analysis="深瞳智能半导体占比60%是定时炸弹。半导体周期下行时营收将大幅缩水。CTO稳定性问题如果恶化,技术优势可能丧失。",
|
||||||
|
vulnerabilities={"areas": ["客户集中度60%", "CTO稳定性0.65", "半导体周期风险"], "severity": "high"},
|
||||||
|
counterarguments={"defense": ["正在拓展新能源客户", "CTO激励方案设计中"]}),
|
||||||
|
RedTeamRecord(company_id=COMP_D, perspective="devils_advocate",
|
||||||
|
analysis="量子芯微的NPU在边缘端确实有需求,但巨头(英伟达/高通)一旦下沉,创业公司很难竞争。7月Runway意味着没有试错空间。",
|
||||||
|
vulnerabilities={"areas": ["巨头竞争风险", "Runway 7月", "无营收"], "severity": "critical"},
|
||||||
|
counterarguments={"defense": ["边缘端低功耗是差异化", "已有3家潜在客户"]}),
|
||||||
|
]
|
||||||
|
for r in red_teams:
|
||||||
|
db.add(r)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ Pre-mortem (2) + Red Team (3)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 产品竞争力诊断 ────────────────────────────────────────────────────
|
||||||
|
async def _seed_product_diagnostics(db: AsyncSession) -> None:
|
||||||
|
"""产品竞争力诊断 — 热力图 + 竞品对比。"""
|
||||||
|
diagnostics = [
|
||||||
|
ProductDiagnostic(company_id=COMP_A, product_name="多模态供应链决策引擎",
|
||||||
|
dimensions={"技术壁垒": 82, "产品成熟度": 75, "用户体验": 70, "生态集成": 65, "定价竞争力": 60, "客户支持": 55},
|
||||||
|
heatmap_data={"strengths": ["技术壁垒", "产品成熟度"], "weaknesses": ["客户支持", "定价竞争力"], "neutral": ["用户体验", "生态集成"]},
|
||||||
|
competitors=[{"name": "杉数科技", "scores": {"技术壁垒": 78, "产品成熟度": 85, "用户体验": 80, "生态集成": 75, "定价竞争力": 70, "客户支持": 82}},
|
||||||
|
{"name": "京东物流AI", "scores": {"技术壁垒": 70, "产品成熟度": 88, "用户体验": 85, "生态集成": 90, "定价竞争力": 65, "客户支持": 78}}],
|
||||||
|
roadmap_suggestions="建议优先提升客户支持能力(增加2名CSM)和优化定价策略(引入阶梯定价),同时加强生态集成(对接ERP系统)。"),
|
||||||
|
ProductDiagnostic(company_id=COMP_C, product_name="工业质检视觉AI平台",
|
||||||
|
dimensions={"技术壁垒": 88, "产品成熟度": 85, "用户体验": 78, "生态集成": 72, "定价竞争力": 65, "客户支持": 80},
|
||||||
|
heatmap_data={"strengths": ["技术壁垒", "产品成熟度", "客户支持"], "weaknesses": ["定价竞争力", "生态集成"], "neutral": ["用户体验"]},
|
||||||
|
competitors=[{"name": "康代智能", "scores": {"技术壁垒": 82, "产品成熟度": 90, "用户体验": 82, "生态集成": 85, "定价竞争力": 75, "客户支持": 85}},
|
||||||
|
{"name": "奥普特", "scores": {"技术壁垒": 75, "产品成熟度": 82, "用户体验": 78, "生态集成": 80, "定价竞争力": 82, "客户支持": 80}}],
|
||||||
|
roadmap_suggestions="技术优势明显,建议降低硬件成本(考虑国产替代方案)并加强生态集成(对接MES系统)。"),
|
||||||
|
]
|
||||||
|
for d in diagnostics:
|
||||||
|
db.add(d)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 产品诊断 (2 条)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 同行学习圈 ────────────────────────────────────────────────────────
|
||||||
|
async def _seed_peer_circles(db: AsyncSession) -> None:
|
||||||
|
"""同行学习圈 — AI 匹配面临类似挑战的创始人。"""
|
||||||
|
circles = [
|
||||||
|
PeerLearningCircle(tenant_id=TENANT_ID, topic="融资时机选择:现在 vs 等待验证",
|
||||||
|
description="云栈数据和量子芯微创始人均面临融资时机决策,AI匹配讨论。",
|
||||||
|
members=[{"founder_id": FOUNDER_B, "company_id": COMP_B, "name": "刘云栈"},
|
||||||
|
{"founder_id": FOUNDER_C, "company_id": COMP_D, "name": "赵深瞳(代)"}],
|
||||||
|
discussion_framework={"steps": ["各自分享融资困境", "分析共同风险", "讨论应对策略", "制定行动承诺"]},
|
||||||
|
conclusions="两位创始人一致认为:在营收未达预期时,应优先保证现金Runway > 12月,融资宁可早不要晚。",
|
||||||
|
action_commitments=[{"founder": "刘云栈", "action": "2周内完成BP", "deadline": "14天"},
|
||||||
|
{"founder": "赵深瞳(代)", "action": "启动天使+轮", "deadline": "7天"}],
|
||||||
|
status="completed"),
|
||||||
|
PeerLearningCircle(tenant_id=TENANT_ID, topic="客户集中度风险管理",
|
||||||
|
description="深瞳智能和智链科技都面临客户集中度/流失问题。",
|
||||||
|
members=[{"founder_id": FOUNDER_A, "company_id": COMP_A, "name": "陈智链"},
|
||||||
|
{"founder_id": FOUNDER_C, "company_id": COMP_C, "name": "赵深瞳"}],
|
||||||
|
discussion_framework={"steps": ["分享客户结构", "分析流失原因", "讨论多元化策略", "制定行动承诺"]},
|
||||||
|
conclusions="深瞳:半导体占比60%需降低;智链:流失率4%需降至3%以下。共同策略:建立客户健康度预警机制。",
|
||||||
|
action_commitments=[{"founder": "陈智链", "action": "建立客户健康度周报", "deadline": "30天"},
|
||||||
|
{"founder": "赵深瞳", "action": "启动新能源客户拓展", "deadline": "60天"}],
|
||||||
|
status="active"),
|
||||||
|
]
|
||||||
|
for c in circles:
|
||||||
|
db.add(c)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 同行学习圈 (2 个)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 数字孪生 ──────────────────────────────────────────────────────────
|
||||||
|
async def _seed_digital_twins(db: AsyncSession) -> None:
|
||||||
|
"""数字孪生模型。"""
|
||||||
|
twins = [
|
||||||
|
DigitalTwinModel(company_id=COMP_A, model_params={"revenue_model": "saaS_subscription", "churn_rate": 0.03, "growth_rate": 0.15, "cac": 50, "ltv": 400},
|
||||||
|
scenarios=[{"name": "乐观", "revenue_y0": 800, "revenue_y1": 1200, "runway_months": 18},
|
||||||
|
{"name": "基准", "revenue_y0": 800, "revenue_y1": 1000, "runway_months": 14},
|
||||||
|
{"name": "悲观", "revenue_y0": 800, "revenue_y1": 700, "runway_months": 10}],
|
||||||
|
accuracy_score=0.82, last_calibrated_at=D(7)),
|
||||||
|
DigitalTwinModel(company_id=COMP_C, model_params={"revenue_model": "hardware+software", "semi_ratio": 0.60, "growth_rate": 0.22, "gross_margin": 0.55},
|
||||||
|
scenarios=[{"name": "乐观", "revenue_y0": 1200, "revenue_y1": 1800, "valuation": "15亿"},
|
||||||
|
{"name": "基准", "revenue_y0": 1200, "revenue_y1": 1500, "valuation": "12亿"},
|
||||||
|
{"name": "悲观", "revenue_y0": 1200, "revenue_y1": 1000, "valuation": "8亿"}],
|
||||||
|
accuracy_score=0.78, last_calibrated_at=D(14)),
|
||||||
|
]
|
||||||
|
for t in twins:
|
||||||
|
db.add(t)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 数字孪生 (2 个)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 干预事件 + 结果(Alpha 归因) ─────────────────────────────────────
|
||||||
|
async def _seed_interventions(db: AsyncSession) -> None:
|
||||||
|
"""投后管理 Alpha 归因 — 干预 → 指标变化 → 估值影响。"""
|
||||||
|
interventions = [
|
||||||
|
InterventionEvent(company_id=COMP_A, intervention_type="customer_intro",
|
||||||
|
title="引荐LP制造业客户给智链科技", description="通过LP关系引荐3家制造业客户,加速客户拓展。",
|
||||||
|
executed_by=GP_ID, executed_at=D(30)),
|
||||||
|
InterventionEvent(company_id=COMP_C, intervention_type="strategy",
|
||||||
|
title="建议深瞳智能拓展新能源客户", description="降低半导体客户集中度,拓展新能源赛道。",
|
||||||
|
executed_by=LEAD_ID, executed_at=D(45)),
|
||||||
|
InterventionEvent(company_id=COMP_A, intervention_type="governance",
|
||||||
|
title="推动智链科技建立客户成功团队", description="增加2名CSM,建立客户健康度周报机制。",
|
||||||
|
executed_by=MGR_ID, executed_at=D(60)),
|
||||||
|
InterventionEvent(company_id=COMP_D, intervention_type="funding",
|
||||||
|
title="协助量子芯微准备天使+轮融资", description="GP直接参与BP打磨和投资人对接。",
|
||||||
|
executed_by=GP_ID, executed_at=D(10)),
|
||||||
|
]
|
||||||
|
for i in interventions:
|
||||||
|
db.add(i)
|
||||||
|
await db.flush()
|
||||||
|
|
||||||
|
results = [
|
||||||
|
InterventionResult(intervention_id=interventions[0].id,
|
||||||
|
metric_changes={"customers_new": 2, "revenue_increase": 320, "sales_cycle_reduction": 30},
|
||||||
|
valuation_impact=0.5, return_contribution=0.15, alpha_score=0.82,
|
||||||
|
evidence={"before": {"customers": 48, "revenue": 800}, "after": {"customers": 50, "revenue": 960}}),
|
||||||
|
InterventionResult(intervention_id=interventions[1].id,
|
||||||
|
metric_changes={"semi_ratio": -0.05, "new_customers": 1, "revenue_diversification": 0.10},
|
||||||
|
valuation_impact=0.3, return_contribution=0.08, alpha_score=0.68,
|
||||||
|
evidence={"before": {"semi_ratio": 0.65, "customers": 20}, "after": {"semi_ratio": 0.60, "customers": 21}}),
|
||||||
|
InterventionResult(intervention_id=interventions[2].id,
|
||||||
|
metric_changes={"churn_rate": -0.01, "csat": 8, "response_time": -40},
|
||||||
|
valuation_impact=0.2, return_contribution=0.06, alpha_score=0.72,
|
||||||
|
evidence={"before": {"churn_rate": 0.04, "csat": 7.2}, "after": {"churn_rate": 0.03, "csat": 8.0}}),
|
||||||
|
]
|
||||||
|
for r in results:
|
||||||
|
db.add(r)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 干预事件 (4) + 结果 (3) — Alpha 归因")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 组合再平衡 + Monte Carlo ──────────────────────────────────────────
|
||||||
|
async def _seed_portfolio_simulations(db: AsyncSession) -> None:
|
||||||
|
"""组合再平衡建议 + Monte Carlo 模拟结果。"""
|
||||||
|
db.add(PortfolioRebalancing(
|
||||||
|
tenant_id=TENANT_ID,
|
||||||
|
marginal_returns={"COMP_A": 0.25, "COMP_B": 0.08, "COMP_C": 0.35, "COMP_D": -0.05, "COMP_E": 0.15},
|
||||||
|
reallocation_plan={"reduce": [{"company": "COMP_B", "amount": 500, "reason": "边际回报低"}],
|
||||||
|
"increase": [{"company": "COMP_C", "amount": 300, "reason": "高增长高回报"}, {"company": "COMP_A", "amount": 200, "reason": "上升趋势明确"}]},
|
||||||
|
irr_impact=0.03, dpi_impact=0.02, status="proposed",
|
||||||
|
))
|
||||||
|
|
||||||
|
# Monte Carlo — 生成 IRR/DPI 概率分布
|
||||||
|
random.seed(42)
|
||||||
|
irr_samples = [random.gauss(0.22, 0.08) for _ in range(10000)]
|
||||||
|
irr_buckets = {}
|
||||||
|
for s in irr_samples:
|
||||||
|
bucket = round(s * 2) / 2 # 0.5% 区间
|
||||||
|
irr_buckets[str(bucket)] = irr_buckets.get(str(bucket), 0) + 1
|
||||||
|
|
||||||
|
dpi_samples = [max(0, random.gauss(1.8, 0.4)) for _ in range(10000)]
|
||||||
|
dpi_buckets = {}
|
||||||
|
for s in dpi_samples:
|
||||||
|
bucket = round(s * 2) / 2
|
||||||
|
dpi_buckets[str(bucket)] = dpi_buckets.get(str(bucket), 0) + 1
|
||||||
|
|
||||||
|
db.add(MonteCarloSimulation(
|
||||||
|
tenant_id=TENANT_ID, iterations=10000,
|
||||||
|
irr_distribution=irr_buckets, dpi_distribution=dpi_buckets,
|
||||||
|
percentile_p5=0.08, percentile_p50=0.22, percentile_p95=0.36,
|
||||||
|
))
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 组合再平衡 (1) + Monte Carlo (1)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 知识图谱 ──────────────────────────────────────────────────────────
|
||||||
|
async def _seed_knowledge_graph(db: AsyncSession) -> None:
|
||||||
|
"""知识图谱节点 — 企业特征 + 管理动作 + 环境上下文 → 结果 → 回报影响。"""
|
||||||
|
nodes = [
|
||||||
|
KnowledgeNode(tenant_id=TENANT_ID, entity_type="company", entity_id=COMP_A,
|
||||||
|
attributes={"name": "智链科技", "industry": "AI/供应链", "stage": "B"},
|
||||||
|
relations=[{"target": "action_1", "type": "received"}, {"target": "context_1", "type": "in"}]),
|
||||||
|
KnowledgeNode(tenant_id=TENANT_ID, entity_type="action", entity_id="action_1",
|
||||||
|
attributes={"type": "customer_intro", "title": "引荐LP制造业客户"},
|
||||||
|
relations=[{"target": "result_1", "type": "led_to"}]),
|
||||||
|
KnowledgeNode(tenant_id=TENANT_ID, entity_type="context", entity_id="context_1",
|
||||||
|
attributes={"type": "market", "description": "制造业数字化转型加速"},
|
||||||
|
relations=[{"target": "result_1", "type": "influenced"}]),
|
||||||
|
KnowledgeNode(tenant_id=TENANT_ID, entity_type="result", entity_id="result_1",
|
||||||
|
attributes={"metric": "revenue", "change": "+20%", "duration": "3月"},
|
||||||
|
relations=[{"target": "return_1", "type": "contributed_to"}]),
|
||||||
|
KnowledgeNode(tenant_id=TENANT_ID, entity_type="return", entity_id="return_1",
|
||||||
|
attributes={"irr_impact": 0.15, "alpha_score": 0.82},
|
||||||
|
relations=[]),
|
||||||
|
]
|
||||||
|
for n in nodes:
|
||||||
|
db.add(n)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 知识图谱 (5 节点)")
|
||||||
|
|
||||||
|
|
||||||
|
# ─── 数据源 ────────────────────────────────────────────────────────────
|
||||||
|
async def _seed_data_sources(db: AsyncSession) -> None:
|
||||||
|
"""外部数据源配置。"""
|
||||||
|
sources = [
|
||||||
|
DataSource(tenant_id=TENANT_ID, source_type="crunchbase", name="Crunchbase API",
|
||||||
|
api_endpoint="https://api.crunchbase.com/v3.1", status="active", last_synced_at=D(1),
|
||||||
|
config={"sync_frequency": "daily"}),
|
||||||
|
DataSource(tenant_id=TENANT_ID, source_type="github", name="GitHub 活跃度监测",
|
||||||
|
api_endpoint="https://api.github.com", status="active", last_synced_at=D(1),
|
||||||
|
config={"repos": ["zhilian/ai-engine", "yunzhan/data-platform"]}),
|
||||||
|
DataSource(tenant_id=TENANT_ID, source_type="business_registry", name="工商信息同步",
|
||||||
|
api_endpoint="https://api.qcc.com/v2", status="active", last_synced_at=D(3),
|
||||||
|
config={"sync_frequency": "weekly"}),
|
||||||
|
DataSource(tenant_id=TENANT_ID, company_id=COMP_C, source_type="custom", name="半导体行业数据库",
|
||||||
|
api_endpoint="https://semi-data.example.com/api", status="active", last_synced_at=D(2),
|
||||||
|
config={"metrics": ["industry_growth", "competitor_funding"]}),
|
||||||
|
]
|
||||||
|
for s in sources:
|
||||||
|
db.add(s)
|
||||||
|
await db.flush()
|
||||||
|
print(" ✓ 数据源 (4 个)")
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
asyncio.run(seed())
|
asyncio.run(seed())
|
||||||
|
|||||||
@@ -0,0 +1,712 @@
|
|||||||
|
# 投后经理绩效管理方案
|
||||||
|
|
||||||
|
> 核心理念:投后管理不是成本中心,而是投资回报的驱动力。绩效直接挂钩基金收益分配。
|
||||||
|
> 更新时间:2025-08-07
|
||||||
|
> 状态:草案 v1.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、总则
|
||||||
|
|
||||||
|
### 1.1 方案目标
|
||||||
|
|
||||||
|
将投后经理的绩效管理与基金投资回报直接绑定,通过设立**绩效池**机制,让投后团队的收入与企业增长、风险规避、组合协同等实际贡献挂钩,驱动投后管理从"被动跟进"转向"主动创造价值"。
|
||||||
|
|
||||||
|
### 1.2 适用范围
|
||||||
|
|
||||||
|
| 角色 | 适用性 | 考核侧重 |
|
||||||
|
|---|---|---|
|
||||||
|
| 投后经理 | 全量适用 | 企业健康度改善、风险闭环率、赋能协同贡献 |
|
||||||
|
| 投后负责人 | 全量适用 | 组合级指标、团队管理、Alpha 归因总量 |
|
||||||
|
| 投资经理(兼投后) | 按投后职责部分适用 | 仅考核投后相关维度 |
|
||||||
|
|
||||||
|
### 1.3 评估周期
|
||||||
|
|
||||||
|
| 周期 | 用途 | 数据来源 |
|
||||||
|
|---|---|---|
|
||||||
|
| 月度 | 绩效看板自动更新,不直接挂钩分配 | 系统自动采集 |
|
||||||
|
| 季度 | QBR 回顾,绩效得分校准,预分配比例调整 | 系统 + 人工校准 |
|
||||||
|
| 年度 | 绩效池结算,实际分配兑现 | 系统汇总 + 委员会评审 |
|
||||||
|
|
||||||
|
### 1.4 核心公式
|
||||||
|
|
||||||
|
```
|
||||||
|
个人绩效分配 = 绩效池总额 × 个人绩效份额
|
||||||
|
|
||||||
|
个人绩效份额 = (个人绩效得分 / 团队绩效得分总和) × 调节系数
|
||||||
|
|
||||||
|
个人绩效得分 = Σ(各维度得分 × 维度权重) × Alpha 调节因子
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、绩效池机制
|
||||||
|
|
||||||
|
### 2.1 绩效池来源
|
||||||
|
|
||||||
|
绩效池从基金收益中提取,分两种模式:
|
||||||
|
|
||||||
|
| 模式 | 来源 | 提取比例(建议) | 适用场景 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Carry 模式** | 基金超额收益(Carry) | Carry 总额的 10%-20% | 有 Carry 分配权的基金 |
|
||||||
|
| **管理费模式** | 年度管理费 | 管理费的 5%-8% | 无 Carry 或早期基金 |
|
||||||
|
|
||||||
|
### 2.2 绩效池规模示例
|
||||||
|
|
||||||
|
假设基金规模 10 亿,Carry 20%(2 亿),投后团队 Carry 分成 15%:
|
||||||
|
|
||||||
|
```
|
||||||
|
绩效池 = 2 亿 × 15% = 3,000 万
|
||||||
|
```
|
||||||
|
|
||||||
|
按 5 年存续期分摊,年均绩效池约 600 万。
|
||||||
|
|
||||||
|
### 2.3 绩效池分配规则
|
||||||
|
|
||||||
|
1. **基础门槛**:个人绩效得分 ≥ 60 分方可参与分配
|
||||||
|
2. **分段分配**:
|
||||||
|
- 60-69 分:按基准份额的 50% 分配
|
||||||
|
- 70-84 分:按基准份额的 100% 分配
|
||||||
|
- 85-100 分:按基准份额的 150% 分配
|
||||||
|
3. **调节系数**:由投后负责人根据团队协作、特殊贡献等主观因素调整,范围 0.8-1.2
|
||||||
|
4. **未分配余额**:低于门槛的份额滚入下一年度绩效池
|
||||||
|
|
||||||
|
### 2.4 绩效池触发条件
|
||||||
|
|
||||||
|
| 条件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 基金已实现收益 | DPI > 0 或有退出事件发生 |
|
||||||
|
| 投后团队在职 | 考核期内在职满 6 个月 |
|
||||||
|
| 企业健康度可量化 | 负责企业至少有 3 期健康度评分 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、绩效指标体系
|
||||||
|
|
||||||
|
### 3.1 指标总览
|
||||||
|
|
||||||
|
八大维度,满分 100 分,各维度按权重加权:
|
||||||
|
|
||||||
|
| 维度 | 权重 | 核心问题 | 数据来源 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **D1 风险感知与响应** | 10% | 风险发现是否早、处理是否快 | OODA 循环 + 风险工作台 |
|
||||||
|
| **D2 企业健康度改善** | 10% | 负责的企业是否在变好 | 健康度评分趋势 |
|
||||||
|
| **D3 赋能与协同贡献** | 15% | 是否为被投企业带来了实际资源 | 协同机会中心 + Alpha 归因 |
|
||||||
|
| **D4 管理规范性与退出准备** | 10% | 月报/董事会/协议/退出准备/LP 沟通是否到位 | 月报管理 + 董事会 + 协议监控 + 退出管理 |
|
||||||
|
| **D5 被投企业价值增长** | 20% | 负责的企业估值涨了多少、IRR/MOIC/DPI 贡献多大 | 估值追踪 + 融资进展 + 退出信号 + 基金指标 |
|
||||||
|
| **D6 Alpha 归因贡献** | 15% | 管理动作是否真正创造了投资回报 | Alpha 归因分析 |
|
||||||
|
| **D7 被投企业满意度** | 15% | 被投企业 CEO/创始人对投后服务的评价 | 360 度评价 + NPS |
|
||||||
|
| **D8 知识积累与进化** | 5% | 是否将经验沉淀为可复用知识 | AAR + 知识图谱 |
|
||||||
|
|
||||||
|
### 3.2 D1 — 风险感知与响应(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 预警提前量 | 从弱信号首次出现到风险确认的天数 | ≥ 30 天 | >30天: 满分; 15-30天: 80%; <15天: 40% |
|
||||||
|
| OODA 循环耗时 | 从 Observe 到 Act 的平均周期 | ≤ 7 天 | ≤7天: 满分; 8-14天: 70%; >14天: 30% |
|
||||||
|
| 风险闭环率 | 已关闭风险 / 总风险数 | ≥ 90% | ≥90%: 满分; 70-89%: 70%; <70%: 30% |
|
||||||
|
| 风险升级率 | 红色风险 / 总风险数 | ≤ 10% | ≤10%: 满分; 11-20%: 60%; >20%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-27 指标越界自动预警
|
||||||
|
- P1-39~43 OODA 决策循环 + 决策延迟追踪
|
||||||
|
- P1-30 风险处理闭环
|
||||||
|
- P2-33~39 弱信号采集 + 关联引擎
|
||||||
|
|
||||||
|
### 3.3 D2 — 企业健康度改善(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 健康度趋势分 | 负责企业健康度年度变化值的加权平均 | > 0 | 上升: 满分; 持平: 60%; 下降: 20% |
|
||||||
|
| 红色企业转黄率 | 红色→黄色/绿色的企业占比 | ≥ 50% | ≥50%: 满分; 30-49%: 60%; <30%: 20% |
|
||||||
|
| 约束点突破数 | 负责企业中 TOC 约束点被突破的次数 | ≥ 2 次/年 | 按次数线性评分 |
|
||||||
|
| 企业存活率 | 负责企业未倒闭/未低价收购的比例 | ≥ 95% | ≥95%: 满分; 90-94%: 70%; <90%: 0% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-16~19 四维健康度评分 + 趋势
|
||||||
|
- P3-53 约束点识别(TOC)
|
||||||
|
- P3-47~55 健康度扩展 + 高级分析
|
||||||
|
- P3-67~68 流失风险预警 + 挽留流程
|
||||||
|
|
||||||
|
### 3.4 D3 — 赋能与协同贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起数 | 主动发起的协同机会数量 | ≥ 6 次/年 | 按数量线性评分 |
|
||||||
|
| 协同转化率 | 成功落地 / 发起总数 | ≥ 30% | ≥30%: 满分; 15-29%: 60%; <15%: 20% |
|
||||||
|
| 资源对接成功率 | 投资机构资源成功对接给企业的比例 | ≥ 40% | ≥40%: 满分; 20-39%: 60%; <20%: 20% |
|
||||||
|
| 客户增长贡献 | 通过投后引入的客户为企业带来的收入 | 可量化 | 按金额分段评分 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P3-01~07 协同机会中心 + 闭环管理
|
||||||
|
- P3-16~19 客户增长引擎
|
||||||
|
- P3-11~15 人才引力场
|
||||||
|
- P4-01~04 Alpha 归因(干预事件→指标变化→回报贡献)
|
||||||
|
|
||||||
|
### 3.5 D4 — 管理规范性与退出准备(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报及时率 | 按时收齐月报的企业 / 负责企业总数 | ≥ 95% | ≥95%: 满分; 85-94%: 70%; <85%: 30% |
|
||||||
|
| 董事会决议执行率 | 已执行决议 / 总决议数 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
| 协议条款响应率 | 协议预警在时限内响应的比例 | 100% | 100%: 满分; 90-99%: 60%; <90%: 0% |
|
||||||
|
| 退出准备完成度 | 财务规范/股权梳理/合规整改等退出准备项的完成率 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| LP 沟通质量 | LP 报告中负责企业部分的准确性和及时性 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-15 月报提交及时性追踪
|
||||||
|
- P2-21~26 董事会管理 + 决议追踪
|
||||||
|
- P2-14~20 投资协议解析 + 条款监控
|
||||||
|
- P2-08~13 财务数据接入与校验 + 可信度评分
|
||||||
|
- P4-05~08 退出时机预测 + 退出路径准备清单
|
||||||
|
- LP 报告自动生成模块(系统规划功能)
|
||||||
|
|
||||||
|
### 3.6 D5 — 被投企业价值增长(20%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 估值增长率 | 负责企业年度估值加权平均增长率(按阶段差异化目标) | 见阶段差异化表 | 按阶段目标对比评分 |
|
||||||
|
| 项目 IRR | 负责企业的费后内部收益率 | ≥ 15% | ≥15%: 满分; 8-14%: 70%; <8%: 30% |
|
||||||
|
| MOIC | 负责企业的现金回报倍数(累计回款+当前公允价值)/投资成本 | ≥ 2x | ≥3x: 满分; 2-3x: 70%; 1-2x: 40%; <1x: 10% |
|
||||||
|
| DPI 贡献 | 负责企业已实现回款 / 投资成本 | 可量化 | 按回报金额分段评分 |
|
||||||
|
| 融资推进成功率 | 负责企业成功完成下一轮融资的比例 | ≥ 60% | ≥60%: 满分; 40-59%: 70%; <40%: 30% |
|
||||||
|
| 退出信号强度 | 企业退出路径明确度(IPO/并购/二级) | 可量化 | 系统退出路径计算评分 × 企业数加权 |
|
||||||
|
| 估值折损企业数 | 负责企业中估值下降(Down Round)的数量 | 0 | 0: 满分; 1: 50%; ≥2: 0% |
|
||||||
|
|
||||||
|
#### 阶段差异化目标值
|
||||||
|
|
||||||
|
| 企业阶段 | 估值增长率目标 | IRR 目标 | MOIC 目标 | 说明 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Seed / 天使 | ≥ 50% | ≥ 20% | ≥ 2x | 早期增长快,估值波动大 |
|
||||||
|
| Series A / 早期 | ≥ 40% | ≥ 18% | ≥ 2x | 商业模式验证期 |
|
||||||
|
| Series B / 成长期 | ≥ 30% | ≥ 15% | ≥ 2x | 规模化扩张期 |
|
||||||
|
| Series C+ / 扩张期 | ≥ 20% | ≥ 12% | ≥ 1.5x | 增长趋稳,看盈利能力 |
|
||||||
|
| Pre-IPO / 成熟期 | ≥ 10% | ≥ 10% | ≥ 1.5x | 退出导向,看确定性 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P2-40~46 融资与资本健康度(当前估值、融资进展、股权结构、退出可能性)
|
||||||
|
- P4-05~08 退出时机预测(退出路径计算、时机窗口、期望收益对比)
|
||||||
|
- P4-09~11 组合层面资源再分配(边际回报率、IRR/DPI 影响模拟)
|
||||||
|
- P4-12~15 Monte Carlo 组合模拟(基础/乐观/悲观情景、回报驱动因素)
|
||||||
|
- 财务系统:投资成本、累计回款、公允价值、费后 IRR、MOIC、DPI
|
||||||
|
|
||||||
|
#### 价值增长链路
|
||||||
|
|
||||||
|
```
|
||||||
|
被投企业价值增长 = 估值变化 + 融资进展 + 退出准备 + 基金回报指标
|
||||||
|
↓ ↓ ↓ ↓ ↓
|
||||||
|
估值模型追踪 轮次/估值 退出路径评分 IRR/MOIC DPI 贡献
|
||||||
|
(系统记录) (系统记录) (AI 计算) (财务系统) (已实现回款)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 评分示例
|
||||||
|
|
||||||
|
> 投后经理 A 负责 5 家企业(2 家 Series A、2 家 Series B、1 家 Pre-IPO),其中 2 家完成下一轮融资(估值平均增长 42%),1 家 IPO 预备中,2 家估值持平。加权估值增长率 28%(对比阶段目标 34%,完成率 82%),项目 IRR 16%,MOIC 2.3x,融资推进成功率 40%,退出信号强度评分 75,估值折损 0 家。D5 得分 = 82 × 25% + 100 × 20% + 70 × 15% + 85 × 15% + 70 × 15% + 75 × 10% + 100 × 10% = 84.0
|
||||||
|
|
||||||
|
### 3.7 D6 — Alpha 归因贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Alpha 贡献事件数 | 被归因系统识别为"有效管理动作"的事件数 | ≥ 5 次/年 | 按数量线性评分 |
|
||||||
|
| Alpha 贡献金额 | 管理动作带来的估值增量 × 持股比例 | 可量化 | 按金额分段评分 |
|
||||||
|
| 负 Alpha 事件数 | 管理动作被归因为"无效或有害"的事件数 | 0 | 0: 满分; 1-2: 50%; >2: 0% |
|
||||||
|
| 干预记录完整率 | 有完整干预记录的事件 / 总干预事件 | ≥ 90% | ≥90%: 满分; 70-89%: 50%; <70%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-01 干预事件记录
|
||||||
|
- P4-02 指标变化追踪
|
||||||
|
- P4-03 Alpha 归因分析(干预事件→指标变化→估值影响→回报贡献)
|
||||||
|
- P4-04 归因结果查看
|
||||||
|
|
||||||
|
#### Alpha 归因链路
|
||||||
|
|
||||||
|
```
|
||||||
|
投后干预事件 → 企业指标变化 → 估值影响 → 回报贡献
|
||||||
|
↓ ↓ ↓ ↓
|
||||||
|
人才推荐 人效提升 估值上调 Alpha = 估值增量 × 持股比例
|
||||||
|
客户引入 收入增长
|
||||||
|
战略建议 约束突破
|
||||||
|
融资支持 融资成功
|
||||||
|
风险干预 风险消除
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.8 D7 — 被投企业满意度(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO/创始人对投后经理服务的年度评分(1-5 分) | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度(被投企业评价) | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 投后 NPS | 被投企业净推荐值:愿意推荐该投资机构给其他创业者的比例 | ≥ 50 | ≥50: 满分; 30-49: 70%; 0-29: 40%; 负值: 10% |
|
||||||
|
| 主动性评价 | 被投企业对投后经理主动跟进频率和质量的评分 | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 关系持续性 | 被投企业在后续融资中是否愿意继续接受该投后经理服务 | 100% | 100%: 满分; 80-99%: 70%; <80%: 30% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- 系统发起的年度被投企业满意度调查(CEO 问卷 + 访谈)
|
||||||
|
- P3-67~68 流失风险预警(企业活跃度/数据共享减少/互动减少)
|
||||||
|
- P3-65 QBR 报告中企业反馈模块
|
||||||
|
- 协同机会中心中企业的确认/拒绝/沉默记录
|
||||||
|
|
||||||
|
#### 评价机制
|
||||||
|
|
||||||
|
采用 360 度评价机制,三方评价加权汇总:
|
||||||
|
|
||||||
|
| 评价方 | 权重 | 评价内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **被投企业 CEO/创始人** | 50% | 服务满意度、需求匹配度、主动性、NPS |
|
||||||
|
| **投后负责人 + 合伙人** | 30% | 专业能力、管理规范、团队协作、结果导向 |
|
||||||
|
| **投后经理自评** | 20% | 工作投入度、困难挑战、自我认知、改进计划 |
|
||||||
|
|
||||||
|
> 被投企业评价权重 50%,体现清科研究中心行业最佳实践建议:投后服务效果最终由被投企业感知,应作为最核心的评价维度。
|
||||||
|
|
||||||
|
#### 评价周期
|
||||||
|
|
||||||
|
- **季度微评**:每季度由被投企业 CEO 填写简短评价(3 题,2 分钟完成)
|
||||||
|
- **年度深评**:每年由系统发起完整满意度调查 + 投后负责人访谈
|
||||||
|
- **退出回评**:企业退出时由 CEO 填写完整回顾评价
|
||||||
|
|
||||||
|
### 3.9 D8 — 知识积累与进化(5%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 完成率 | 触发事件中完成 AAR 的比例 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 知识图谱贡献数 | 沉淀的最佳实践/案例数量 | ≥ 3 条/年 | 按数量线性评分 |
|
||||||
|
| AAR 改进执行率 | AAR 改进建议已执行的比例 | ≥ 70% | ≥70%: 满分; 50-69%: 50%; <50%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-30~33 AAR 系统化复盘
|
||||||
|
- P4-26~29 投后管理知识图谱
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、评分计算与调节
|
||||||
|
|
||||||
|
### 4.1 评分计算流程
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 系统自动采集各维度原始数据(月度)
|
||||||
|
步骤 2: 按评分规则转换为维度得分(0-100)
|
||||||
|
步骤 3: 加权计算个人绩效总分 = Σ(维度得分 × 权重)
|
||||||
|
步骤 4: 应用 Alpha 调节因子
|
||||||
|
步骤 5: 季度人工校准(投后负责人 + 合伙人)
|
||||||
|
步骤 6: 年度委员会评审确定最终得分和分配
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Alpha 调节因子
|
||||||
|
|
||||||
|
Alpha 调节因子基于 D6 维度的 Alpha 归因结果,对总分进行乘法调节:
|
||||||
|
|
||||||
|
| Alpha 贡献等级 | 条件 | 调节因子 |
|
||||||
|
|---|---|---|
|
||||||
|
| 卓越 | Alpha 贡献金额 > 1,000 万 | 1.3 |
|
||||||
|
| 优秀 | Alpha 贡献金额 500-1,000 万 | 1.15 |
|
||||||
|
| 良好 | Alpha 贡献金额 100-500 万 | 1.05 |
|
||||||
|
| 基准 | Alpha 贡献金额 < 100 万 | 1.0 |
|
||||||
|
| 负贡献 | 存在负 Alpha 事件 | 0.7-0.9 |
|
||||||
|
|
||||||
|
### 4.3 调节系数
|
||||||
|
|
||||||
|
投后负责人可在 0.8-1.2 范围内对每人进行主观调节,覆盖以下场景:
|
||||||
|
|
||||||
|
- **团队协作**:跨企业协同中的贡献(难以被个体指标捕获)
|
||||||
|
- **特殊贡献**:重大风险避免、关键人才保留等
|
||||||
|
- **新入职 ramp-up**:入职不满 1 年的投后经理可下调考核基准
|
||||||
|
- **组合复杂度**:负责企业数量多、阶段早、难度高的可适度上调
|
||||||
|
|
||||||
|
### 4.4 评分示例
|
||||||
|
|
||||||
|
```
|
||||||
|
投后经理 A:
|
||||||
|
D1 风险感知与响应: 85 × 10% = 8.50
|
||||||
|
D2 企业健康度改善: 78 × 10% = 7.80
|
||||||
|
D3 赋能与协同贡献: 72 × 15% = 10.80
|
||||||
|
D4 管理规范性与退出: 88 × 10% = 8.80
|
||||||
|
D5 被投企业价值增长: 84 × 20% = 16.80
|
||||||
|
D6 Alpha 归因贡献: 80 × 15% = 12.00
|
||||||
|
D7 被投企业满意度: 82 × 15% = 12.30
|
||||||
|
D8 知识积累: 75 × 5% = 3.75
|
||||||
|
--------------------------------
|
||||||
|
基础总分: 80.75
|
||||||
|
Alpha 调节因子: 1.15(优秀)
|
||||||
|
调节后总分: 92.86
|
||||||
|
调节系数: 1.05(组合复杂度高)
|
||||||
|
最终得分: 97.50
|
||||||
|
|
||||||
|
分配档位: 85-100 分 → 基准份额 × 150%
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、绩效等级与应用
|
||||||
|
|
||||||
|
### 5.1 绩效等级
|
||||||
|
|
||||||
|
| 等级 | 得分区间 | 分配倍率 | 含义 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| S | 85-100 | 150% | 卓越贡献,显著提升投资回报 |
|
||||||
|
| A | 70-84 | 100% | 达标且有一定亮点 |
|
||||||
|
| B | 60-69 | 50% | 基本达标,需改进 |
|
||||||
|
| C | < 60 | 0% | 未达标,不参与绩效池分配 |
|
||||||
|
|
||||||
|
### 5.2 绩效应用
|
||||||
|
|
||||||
|
| 应用项 | S 级 | A 级 | B 级 | C 级 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 绩效池分配 | 150% | 100% | 50% | 不分配 |
|
||||||
|
| 晋升资格 | 优先考虑 | 正常考虑 | 暂缓 | 不考虑 |
|
||||||
|
| 管理企业数上限 | 可增加 | 维持 | 维持 | 建议减少 |
|
||||||
|
| 培训资源 | 优先分配 | 正常 | 加强 | 强制培训 |
|
||||||
|
| 连续 2 年 C 级 | — | — | — | 调整岗位或退出 |
|
||||||
|
|
||||||
|
### 5.3 特殊奖励
|
||||||
|
|
||||||
|
除常规绩效池分配外,以下情况可申请额外奖励(从绩效池未分配余额中支出):
|
||||||
|
|
||||||
|
- **重大风险避免**:投后干预直接避免企业重大损失(如现金流断裂、核心团队集体离职)
|
||||||
|
- **重大协同落地**:推动 Portfolio 协同带来显著收入增长
|
||||||
|
- **退出贡献**:投后管理直接推动企业成功退出(IPO/并购)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、绩效面谈与改进
|
||||||
|
|
||||||
|
### 6.1 月度绩效看板
|
||||||
|
|
||||||
|
系统自动生成月度绩效看板,投后经理可随时查看:
|
||||||
|
|
||||||
|
- 各维度当前得分和趋势
|
||||||
|
- 负责企业的健康度变化
|
||||||
|
- 负责企业的估值变化趋势和 IRR/MOIC/DPI
|
||||||
|
- 风险闭环进度
|
||||||
|
- 协同推进状态
|
||||||
|
- Alpha 贡献事件列表
|
||||||
|
- 被投企业满意度季度微评结果
|
||||||
|
- 预估绩效分配金额(基于当前得分)
|
||||||
|
|
||||||
|
### 6.2 季度 QBR 联动
|
||||||
|
|
||||||
|
每季度结合系统 QBR 报告(P3-65)进行绩效面谈:
|
||||||
|
|
||||||
|
1. **数据回顾**:系统自动生成本季度绩效数据摘要
|
||||||
|
2. **归因分析**:讨论得分变化的原因(哪些管理动作有效/无效)
|
||||||
|
3. **目标校准**:调整下季度重点方向和目标值
|
||||||
|
4. **预分配通知**:告知当前预估分配比例(不具约束力)
|
||||||
|
|
||||||
|
### 6.3 年度评审
|
||||||
|
|
||||||
|
年度评审由投后负责人 + 合伙人 + HR 组成评审委员会:
|
||||||
|
|
||||||
|
1. **系统出具年度绩效报告**:汇总 12 个月数据,自动计算最终得分
|
||||||
|
2. **360 度评价汇总**:被投企业满意度调查结果 + 投后负责人评价 + 自评
|
||||||
|
3. **Alpha 归因总账**:汇总全年管理动作的 Alpha 贡献
|
||||||
|
4. **委员会评审**:审核系统评分,确认调节系数
|
||||||
|
5. **分配方案**:计算每人实际分配金额,报合伙人会议批准
|
||||||
|
6. **绩效面谈**:一对一沟通结果、改进方向和下年度目标
|
||||||
|
|
||||||
|
### 6.4 绩效改进计划
|
||||||
|
|
||||||
|
对 B 级和 C 级人员制定改进计划:
|
||||||
|
|
||||||
|
| 级别 | 改进措施 |
|
||||||
|
|---|---|
|
||||||
|
| B 级 | 识别短板维度,制定 3 个月改进目标,月度跟踪 |
|
||||||
|
| C 级 | 制定 6 个月绩效改进计划(PIP),月度评审,连续 2 次未改善则调整岗位 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、系统支撑
|
||||||
|
|
||||||
|
### 7.1 投资经理画像(P2-49)
|
||||||
|
|
||||||
|
系统已规划投资经理画像,本方案直接复用:
|
||||||
|
|
||||||
|
- **能力维度**:行业理解、财务分析、资源网络、风险判断
|
||||||
|
- **风格维度**:跟进频率、干预偏好、协同倾向
|
||||||
|
- **负责项目**:当前管理的企业列表和 AUM
|
||||||
|
- **跟进质量评分**:基于本方案八大维度自动计算
|
||||||
|
|
||||||
|
### 7.2 Alpha 归因系统(P4-01~04)
|
||||||
|
|
||||||
|
Alpha 归因是本方案的核心差异化——不只看"做了什么",更看"带来了什么回报":
|
||||||
|
|
||||||
|
```
|
||||||
|
干预事件 → 指标变化 → 估值影响 → 回报贡献
|
||||||
|
↑ ↑ ↑ ↑
|
||||||
|
投后经理 系统追踪 估值模型 量化归因
|
||||||
|
记录 自动 自动计算 AI 分析
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 AAR 复盘系统(P4-30~33)
|
||||||
|
|
||||||
|
AAR 不仅用于知识积累,也作为绩效评估的佐证:
|
||||||
|
|
||||||
|
- AAR 记录了"原计划→实际结果→差异原因→经验教训"
|
||||||
|
- 绩效面谈时引用 AAR 结论,避免主观争议
|
||||||
|
- AAR 改进执行率本身也是 D8 考核指标
|
||||||
|
|
||||||
|
### 7.4 知识图谱(P4-26~29)
|
||||||
|
|
||||||
|
投后管理知识图谱持续积累"管理动作→结果"的因果关系:
|
||||||
|
|
||||||
|
- 新企业进入时自动匹配最佳管理策略
|
||||||
|
- 投后经理可查询历史最佳实践
|
||||||
|
- 知识贡献度纳入 D8 考核
|
||||||
|
|
||||||
|
### 7.5 数据采集自动化
|
||||||
|
|
||||||
|
| 维度 | 自动采集比例 | 人工输入 |
|
||||||
|
|---|---|---|
|
||||||
|
| D1 风险感知与响应 | 100% | 无 |
|
||||||
|
| D2 企业健康度改善 | 100% | 无 |
|
||||||
|
| D3 赋能与协同贡献 | 90% | 协同效果评估需确认 |
|
||||||
|
| D4 管理规范性与退出准备 | 90% | 退出准备完成度需人工确认 |
|
||||||
|
| D5 被投企业价值增长 | 80% | 估值数据需融资事件确认 |
|
||||||
|
| D6 Alpha 归因贡献 | 80% | 干预事件需主动记录 |
|
||||||
|
| D7 被投企业满意度 | 40% | CEO 问卷 + 访谈需人工发起 |
|
||||||
|
| D8 知识积累 | 90% | 知识图谱贡献需主动提交 |
|
||||||
|
|
||||||
|
### 7.6 各维度数据支持明细
|
||||||
|
|
||||||
|
#### D1 风险感知与响应
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 弱信号首次出现时间 | 弱信号引擎检测到的首次异常时间戳 | P2-33~39 弱信号采集 + 关联引擎 | 自动 |
|
||||||
|
| 风险确认时间 | 风险从弱信号升级为确认风险的时间 | P1-27 指标越界自动预警 | 自动 |
|
||||||
|
| OODA 各阶段时间戳 | Observe → Orient → Decide → Act 每阶段时间 | P1-39~43 OODA 决策循环 | 自动 |
|
||||||
|
| 风险状态(开/闭环) | 每个风险的当前状态和关闭时间 | P1-30 风险处理闭环 | 自动 |
|
||||||
|
| 风险等级(红/黄/绿) | 风险分级记录 | 风险工作台 | 自动 |
|
||||||
|
|
||||||
|
#### D2 企业健康度改善
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 四维健康度评分 | 财务/运营/治理/成长四维评分及历史趋势 | P1-16~19 四维健康度评分 | 自动 |
|
||||||
|
| 健康度变化序列 | 每期评分对比,计算上升/持平/下降 | 健康度趋势模型 | 自动 |
|
||||||
|
| 约束点识别记录 | TOC 约束点位置及突破状态 | P3-53 约束点识别(TOC) | 自动 |
|
||||||
|
| 企业状态 | 存续/倒闭/被低价收购 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D3 赋能与协同贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起记录 | 发起时间、类型、目标企业、发起人 | P3-01~07 协同机会中心 | 自动 |
|
||||||
|
| 协同状态追踪 | 发起 → 推进 → 落地/失败全链路 | 协同闭环管理 | 自动 |
|
||||||
|
| 资源对接记录 | 机构资源对接给企业的记录及结果 | 协同机会中心 | 自动 |
|
||||||
|
| 客户引入金额 | 投后引入客户为企业带来的收入金额 | P3-16~19 客户增长引擎 | 自动 |
|
||||||
|
| 人才推荐记录 | 推荐人才及入职结果 | P3-11~15 人才引力场 | 自动 |
|
||||||
|
| 协同效果确认 | 落地后实际效果评估 | 人工确认 | **手动** |
|
||||||
|
|
||||||
|
#### D4 管理规范性与退出准备
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报提交时间戳 | 每家企业月报提交时间 vs 截止时间 | P1-15 月报提交及时性追踪 | 自动 |
|
||||||
|
| 董事会决议清单 | 决议内容、执行状态、执行时间 | P2-21~26 董事会管理 + 决议追踪 | 自动 |
|
||||||
|
| 协议条款预警 | 协议条款到期/违约预警及响应记录 | P2-14~20 投资协议解析 + 条款监控 | 自动 |
|
||||||
|
| 数据可信度评分 | 企业财务数据质量和可信度 | P2-08~13 财务数据接入与校验 | 自动 |
|
||||||
|
| 退出准备清单 | 财务规范/股权梳理/合规整改等准备项完成度 | P4-05~08 退出时机预测 + 准备清单 | 半自动 |
|
||||||
|
| LP 报告提交记录 | LP 报告中负责企业部分的准确性和及时性 | LP 报告自动生成模块(规划中) | 半自动 |
|
||||||
|
|
||||||
|
#### D5 被投企业价值增长
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 企业当前估值 | 最近一轮融资估值或第三方评估 | P2-40~46 融资与资本健康度 | 半自动 |
|
||||||
|
| 历轮融资记录 | 轮次、金额、估值、时间 | 融资进展追踪 | 自动 |
|
||||||
|
| 投资成本 | 基金对该企业的累计投资金额 | 财务系统 | 自动 |
|
||||||
|
| 累计回款 | 分红 + 部分退出回款 | 财务系统 | 自动 |
|
||||||
|
| 公允价值 | 当前公允价值(上市按收盘价,非上市按最近融资估值与第三方评估孰低) | 财务系统 + 估值模型 | 半自动 |
|
||||||
|
| 费后 IRR | 项目费后净现金流折现内部收益率 | 财务系统计算 | 自动 |
|
||||||
|
| MOIC | (累计回款 + 当前公允价值)/ 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| DPI 贡献 | 已实现回款 / 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| 退出路径评分 | IPO/并购/二级等退出路径明确度评分 | P4-05~08 退出时机预测 | 自动 |
|
||||||
|
| Down Round 记录 | 估值下降的融资事件 | 融资进展追踪 | 自动 |
|
||||||
|
|
||||||
|
#### D6 Alpha 归因贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 干预事件记录 | 投后干预类型、时间、负责人、详情 | P4-01 干预事件记录 | **手动录入** |
|
||||||
|
| 企业指标变化追踪 | 干预前后关键指标变化 | P4-02 指标变化追踪 | 自动 |
|
||||||
|
| 估值影响计算 | 干预事件对企业估值的影响 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| Alpha 贡献金额 | 估值增量 × 持股比例 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| 负 Alpha 事件 | 被归因为无效或有害的管理动作 | P4-03~04 归因结果 | 自动 |
|
||||||
|
| 干预记录完整度 | 有完整干预记录的事件 / 总干预事件 | 系统统计 | 自动 |
|
||||||
|
|
||||||
|
#### D7 被投企业满意度
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO 对投后经理服务的年度评分(1-5 分) | 年度满意度调查问卷 | **手动** |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度 | CEO 问卷 | **手动** |
|
||||||
|
| 投后 NPS | 被投企业净推荐值 | CEO 问卷 | **手动** |
|
||||||
|
| 主动性评价 | 投后经理主动跟进频率和质量的评分 | CEO 问卷 | **手动** |
|
||||||
|
| 关系持续性 | 后续融资中是否愿意继续接受该投后经理服务 | 融资记录 + CEO 确认 | 半自动 |
|
||||||
|
| 投后负责人评价 | 专业能力、管理规范、团队协作、结果导向 | 投后负责人填写 | **手动** |
|
||||||
|
| 投后经理自评 | 工作投入度、困难挑战、自我认知、改进计划 | 投后经理填写 | **手动** |
|
||||||
|
| 企业互动活跃度 | 数据共享频率、会议出席率、响应速度 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D8 知识积累与进化
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 记录 | 触发事件、完成状态、原计划/实际结果/差异原因/经验教训 | P4-30~33 AAR 系统化复盘 | 半自动 |
|
||||||
|
| AAR 改进建议执行状态 | 改进建议是否已执行及执行效果 | AAR 系统 | 半自动 |
|
||||||
|
| 知识图谱贡献条数 | 沉淀的最佳实践/案例数量 | P4-26~29 投后管理知识图谱 | **手动提交** |
|
||||||
|
|
||||||
|
### 7.7 数据系统对接关系
|
||||||
|
|
||||||
|
```
|
||||||
|
数据来源层 维度消费层
|
||||||
|
┌──────────────────┐ ┌───────────────────┐
|
||||||
|
│ 风险工作台 │──────→│ D1 风险感知与响应 │
|
||||||
|
│ 弱信号引擎 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 健康度评分模型 │──────→│ D2 企业健康度改善 │
|
||||||
|
│ TOC 约束分析 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 协同机会中心 │──────→│ D3 赋能与协同贡献 │
|
||||||
|
│ 客户增长引擎 │ │ │
|
||||||
|
│ 人才引力场 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 月报管理 │──────→│ D4 管理规范性与 │
|
||||||
|
│ 董事会管理 │ │ 退出准备 │
|
||||||
|
│ 协议监控 │ │ │
|
||||||
|
│ 退出路径准备 │ │ │
|
||||||
|
│ LP 报告模块 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 估值追踪 │──────→│ D5 被投企业价值 │
|
||||||
|
│ 融资进展 │ │ 增长 │
|
||||||
|
│ 财务系统 │ │ │
|
||||||
|
│ (IRR/MOIC/DPI) │ │ │
|
||||||
|
│ 退出时机预测 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ Alpha 归因引擎 │──────→│ D6 Alpha 归因贡献 │
|
||||||
|
│ 干预事件记录 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ CEO 满意度问卷 │──────→│ D7 被投企业满意度 │
|
||||||
|
│ NPS 调查 │ │ │
|
||||||
|
│ 流失风险预警 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ AAR 复盘系统 │──────→│ D8 知识积累与进化 │
|
||||||
|
│ 知识图谱 │ │ │
|
||||||
|
└──────────────────┘ └───────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.8 数据缺口与建设优先级
|
||||||
|
|
||||||
|
| 优先级 | 数据缺口 | 影响维度 | 建设建议 | 建设阶段 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **P0** | 财务系统对接(IRR/MOIC/DPI) | D5 | 对接财务系统或手动导入投资成本、回款、公允价值 | Phase 2 |
|
||||||
|
| **P0** | 干预事件录入流程 | D6 | 上线干预事件录入界面,嵌入投后经理日常操作 | Phase 2 |
|
||||||
|
| **P1** | CEO 满意度问卷系统 | D7 | 开发问卷模块,支持季度微评(3 题)+ 年度深评 | Phase 3 |
|
||||||
|
| **P1** | 退出准备清单模板 | D4 | Phase 1 用人工清单,Phase 2 系统化 | Phase 1-2 |
|
||||||
|
| **P2** | LP 报告自动生成 | D4 | 系统自动从各模块汇总企业数据生成 LP 报告 | Phase 3 |
|
||||||
|
| **P2** | NPS 调查机制 | D7 | 与满意度问卷同步上线 | Phase 3 |
|
||||||
|
|
||||||
|
> 整体数据自动化率约 **82%**,其中 D7 被投企业满意度自动化最低(40%),但这符合行业实践——满意度本质上是主观评价,必须通过人工问卷 + 访谈获取。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、分配计算示例
|
||||||
|
|
||||||
|
### 8.1 场景假设
|
||||||
|
|
||||||
|
```
|
||||||
|
基金规模: 10 亿
|
||||||
|
Carry: 20%(2 亿)
|
||||||
|
投后团队 Carry 分成: 15%
|
||||||
|
年度绩效池: 600 万
|
||||||
|
投后团队: 5 人
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 年度评分结果
|
||||||
|
|
||||||
|
| 投后经理 | 最终得分 | 等级 | 分配倍率 | 调节系数 | 负责企业 AUM 权重 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 经理 A | 97.50 | S | 150% | 1.05 | 25% |
|
||||||
|
| 经理 B | 82.30 | A | 100% | 1.00 | 20% |
|
||||||
|
| 经理 C | 75.60 | A | 100% | 0.95 | 18% |
|
||||||
|
| 经理 D | 65.20 | B | 50% | 1.00 | 22% |
|
||||||
|
| 经理 E | 58.00 | C | 0% | — | 15% |
|
||||||
|
|
||||||
|
### 8.3 分配计算
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 计算有效份额
|
||||||
|
经理 A: 97.50 × 1.50 × 1.05 × 0.25 = 38.39
|
||||||
|
经理 B: 82.30 × 1.00 × 1.00 × 0.20 = 16.46
|
||||||
|
经理 C: 75.60 × 1.00 × 0.95 × 0.18 = 12.93
|
||||||
|
经理 D: 65.20 × 0.50 × 1.00 × 0.22 = 7.17
|
||||||
|
经理 E: 不参与分配
|
||||||
|
|
||||||
|
有效份额总和 = 74.95
|
||||||
|
|
||||||
|
步骤 2: 计算分配金额
|
||||||
|
经理 A: 600 万 × (38.39 / 74.95) = 307.3 万
|
||||||
|
经理 B: 600 万 × (16.46 / 74.95) = 131.7 万
|
||||||
|
经理 C: 600 万 × (12.93 / 74.95) = 103.5 万
|
||||||
|
经理 D: 600 万 × (7.17 / 74.95) = 57.4 万
|
||||||
|
经理 E: 0 万
|
||||||
|
|
||||||
|
未分配余额: 600 - 599.9 = 0.1 万 → 滚入下年度
|
||||||
|
|
||||||
|
步骤 3: 经理 E 的份额(15% AUM 对应的份额)滚入下年度绩效池
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、实施路线
|
||||||
|
|
||||||
|
| 阶段 | 时间 | 内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **Phase 1: 数据基建** | 0-3 个月 | 健康度评分、风险闭环、月报管理数据接入绩效看板 |
|
||||||
|
| **Phase 2: Alpha 归因 + 价值追踪** | 3-6 个月 | 干预事件记录、Alpha 归因分析、估值追踪、IRR/MOIC/DPI 接入上线,D5/D6 维度开始采集 |
|
||||||
|
| **Phase 3: 满意度调查 + 试运行** | 6-12 个月 | 八大维度全部采集,被投企业满意度调查上线,月度看板上线,不挂钩分配 |
|
||||||
|
| **Phase 4: 正式运行** | 12 个月后 | 季度校准 + 年度结算,绩效池正式分配 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十、附则
|
||||||
|
|
||||||
|
### 10.1 方案调整机制
|
||||||
|
|
||||||
|
- 每年度根据基金阶段、市场环境和系统数据成熟度调整维度权重和目标值
|
||||||
|
- 权重调整需经合伙人会议批准
|
||||||
|
- 新维度加入时设 6 个月试运行期,试运行期不计入正式评分
|
||||||
|
|
||||||
|
### 10.2 争议处理
|
||||||
|
|
||||||
|
- 投后经理对评分有异议,可在年度面谈后 5 个工作日内提交申诉
|
||||||
|
- 申诉由合伙人 + HR 组成仲裁小组处理
|
||||||
|
- Alpha 归因结果可作为客观佐证
|
||||||
|
|
||||||
|
### 10.3 保密要求
|
||||||
|
|
||||||
|
- 个人绩效得分和分配金额仅本人、投后负责人、合伙人和 HR 可见
|
||||||
|
- 团队汇总数据(不含个人)可在团队会议中分享
|
||||||
|
- 绩效数据在系统中按字段级权限控制,AI 权限继承用户权限
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { listAARs, generateAAR } from "@/lib/api-v2";
|
import { listAARs, generateAAR } from "@/lib/api-v2";
|
||||||
import { PageContainer, Card} from "@/components/shared/PageContainer";
|
import { PageContainer, Card} from "@/components/shared/PageContainer";
|
||||||
@@ -11,6 +12,7 @@ import { toast } from "sonner";
|
|||||||
|
|
||||||
/** AAR 复盘记录项。 */
|
/** AAR 复盘记录项。 */
|
||||||
interface AARItem {
|
interface AARItem {
|
||||||
|
company_id?: string;
|
||||||
trigger_event: string;
|
trigger_event: string;
|
||||||
gap_analysis?: string;
|
gap_analysis?: string;
|
||||||
lessons?: string[];
|
lessons?: string[];
|
||||||
@@ -85,6 +87,7 @@ export default function AARsPage() {
|
|||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{items.map((item, i) => (
|
{items.map((item, i) => (
|
||||||
<Card key={i}>
|
<Card key={i}>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.trigger_event}</h3>
|
<h3 className="font-medium text-gray-900">{item.trigger_event}</h3>
|
||||||
{item.gap_analysis && <p className="mt-1 text-sm text-gray-600">{item.gap_analysis}</p>}
|
{item.gap_analysis && <p className="mt-1 text-sm text-gray-600">{item.gap_analysis}</p>}
|
||||||
{Array.isArray(item.lessons) && (
|
{Array.isArray(item.lessons) && (
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listAgentExecutions, reviewAgentExecution } from "@/lib/api-v2";
|
import { listAgentExecutions, reviewAgentExecution } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -11,6 +12,7 @@ import { toast } from "sonner";
|
|||||||
/** Agent 执行记录项。 */
|
/** Agent 执行记录项。 */
|
||||||
interface AgentExecution {
|
interface AgentExecution {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
agent_name: string;
|
agent_name: string;
|
||||||
autonomy_level: string;
|
autonomy_level: string;
|
||||||
output_summary: string;
|
output_summary: string;
|
||||||
@@ -24,8 +26,14 @@ export default function AgentsPage() {
|
|||||||
|
|
||||||
const load = () => {
|
const load = () => {
|
||||||
listAgentExecutions()
|
listAgentExecutions()
|
||||||
.then((resp) => setItems((resp.data as AgentExecution[]) ?? []))
|
.then((resp) => {
|
||||||
.catch(() => setItems([]))
|
console.log("[agents] API response:", resp);
|
||||||
|
setItems((resp.data as AgentExecution[]) ?? []);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.error("[agents] API error:", err);
|
||||||
|
setItems([]);
|
||||||
|
})
|
||||||
.finally(() => setIsLoading(false));
|
.finally(() => setIsLoading(false));
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -52,6 +60,7 @@ export default function AgentsPage() {
|
|||||||
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
||||||
<thead className="bg-gray-50">
|
<thead className="bg-gray-50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-2 text-left font-medium text-gray-500">企业</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">Agent</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">Agent</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">自治级别</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">自治级别</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">输出摘要</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">输出摘要</th>
|
||||||
@@ -63,6 +72,7 @@ export default function AgentsPage() {
|
|||||||
<tbody className="divide-y divide-gray-100 bg-white">
|
<tbody className="divide-y divide-gray-100 bg-white">
|
||||||
{items.map((item, i) => (
|
{items.map((item, i) => (
|
||||||
<tr key={i}>
|
<tr key={i}>
|
||||||
|
<td className="px-4 py-2"><CompanyNameTag companyId={item.company_id} /></td>
|
||||||
<td className="px-4 py-2 text-gray-900">{item.agent_name}</td>
|
<td className="px-4 py-2 text-gray-900">{item.agent_name}</td>
|
||||||
<td className="px-4 py-2"><Badge color={item.autonomy_level === "L4" ? "red" : item.autonomy_level === "L3" ? "amber" : "blue"}>{item.autonomy_level}</Badge></td>
|
<td className="px-4 py-2"><Badge color={item.autonomy_level === "L4" ? "red" : item.autonomy_level === "L3" ? "amber" : "blue"}>{item.autonomy_level}</Badge></td>
|
||||||
<td className="px-4 py-2 text-gray-600 max-w-xs truncate">{item.output_summary}</td>
|
<td className="px-4 py-2 text-gray-600 max-w-xs truncate">{item.output_summary}</td>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Plus } from "lucide-react";
|
import {Plus } from "lucide-react";
|
||||||
import { listAgreements } from "@/lib/api-v2";
|
import { listAgreements } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge, TableEmpty } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge, TableEmpty } from "@/components/shared/PageContainer";
|
||||||
@@ -10,6 +11,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 投资协议项。 */
|
/** 投资协议项。 */
|
||||||
interface Agreement {
|
interface Agreement {
|
||||||
|
company_id?: string;
|
||||||
title: string;
|
title: string;
|
||||||
signed_at: string;
|
signed_at: string;
|
||||||
status: string;
|
status: string;
|
||||||
@@ -46,6 +48,7 @@ export default function AgreementsPage() {
|
|||||||
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
||||||
<thead className="bg-gray-50">
|
<thead className="bg-gray-50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-2 text-left font-medium text-gray-500">企业</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">协议名称</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">协议名称</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">签署日期</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">签署日期</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">状态</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">状态</th>
|
||||||
@@ -54,10 +57,11 @@ export default function AgreementsPage() {
|
|||||||
</thead>
|
</thead>
|
||||||
<tbody className="divide-y divide-gray-100 bg-white">
|
<tbody className="divide-y divide-gray-100 bg-white">
|
||||||
{items.length === 0 ? (
|
{items.length === 0 ? (
|
||||||
<TableEmpty colSpan={4} />
|
<TableEmpty colSpan={5} />
|
||||||
) : (
|
) : (
|
||||||
items.map((item, i) => (
|
items.map((item, i) => (
|
||||||
<tr key={i}>
|
<tr key={i}>
|
||||||
|
<td className="px-4 py-2"><CompanyNameTag companyId={item.company_id} /></td>
|
||||||
<td className="px-4 py-2 text-gray-900">{item.title}</td>
|
<td className="px-4 py-2 text-gray-900">{item.title}</td>
|
||||||
<td className="px-4 py-2 text-gray-600">{item.signed_at}</td>
|
<td className="px-4 py-2 text-gray-600">{item.signed_at}</td>
|
||||||
<td className="px-4 py-2">
|
<td className="px-4 py-2">
|
||||||
|
|||||||
@@ -2,106 +2,179 @@
|
|||||||
|
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import React from "react";
|
import { useState } from "react";
|
||||||
import { Cpu, DollarSign, ShieldCheck, TrendingUp, TrendingDown } from "lucide-react";
|
import { Cpu, DollarSign, ShieldCheck, TrendingUp, TrendingDown } from "lucide-react";
|
||||||
|
import { useCompanyScope, useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { listHealthScores, type HealthScore } from "@/lib/dashboard";
|
||||||
|
import { listAgentExecutions } from "@/lib/api-v2";
|
||||||
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
|
/** Agent 执行记录项。 */
|
||||||
|
interface AgentExecution {
|
||||||
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
|
agent_name: string;
|
||||||
|
autonomy_level: string;
|
||||||
|
review_status: string;
|
||||||
|
}
|
||||||
|
|
||||||
/** AI+ 专项看板页面。 */
|
/** AI+ 专项看板页面。 */
|
||||||
export default class AIPlusDashboardPage extends React.Component {
|
export default function AIPlusDashboardPage() {
|
||||||
render() {
|
const { companyName } = useCompanyScope();
|
||||||
const metrics = [
|
const [scores, setScores] = useState<HealthScore[]>([]);
|
||||||
{
|
const [agents, setAgents] = useState<AgentExecution[]>([]);
|
||||||
category: "AI 商业化",
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
icon: Cpu,
|
|
||||||
color: "text-indigo-600",
|
|
||||||
items: [
|
|
||||||
{ label: "PoC 数量", value: "3", trend: "up", trendValue: "+1" },
|
|
||||||
{ label: "转化率", value: "45%", trend: "up", trendValue: "+8%" },
|
|
||||||
{ label: "AI 月营收", value: "80万", trend: "up", trendValue: "+20%" },
|
|
||||||
{ label: "客户满意度", value: "NPS 52", trend: "stable", trendValue: "持平" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: "模型成本",
|
|
||||||
icon: DollarSign,
|
|
||||||
color: "text-amber-600",
|
|
||||||
items: [
|
|
||||||
{ label: "月推理成本", value: "12万", trend: "down", trendValue: "-8%" },
|
|
||||||
{ label: "单次调用成本", value: "0.03元", trend: "down", trendValue: "-15%" },
|
|
||||||
{ label: "毛利率", value: "58%", trend: "up", trendValue: "+3%" },
|
|
||||||
{ label: "成本/营收比", value: "15%", trend: "down", trendValue: "-2%" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
category: "数据合规",
|
|
||||||
icon: ShieldCheck,
|
|
||||||
color: "text-emerald-600",
|
|
||||||
items: [
|
|
||||||
{ label: "合规评分", value: "92", trend: "up", trendValue: "+5" },
|
|
||||||
{ label: "数据泄露事件", value: "0", trend: "stable", trendValue: "无" },
|
|
||||||
{ label: "审计通过率", value: "100%", trend: "stable", trendValue: "持平" },
|
|
||||||
{ label: "整改项", value: "2", trend: "down", trendValue: "-3" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
|
useScopeEffect(() => {
|
||||||
|
Promise.all([
|
||||||
|
listHealthScores(),
|
||||||
|
listAgentExecutions(),
|
||||||
|
])
|
||||||
|
.then(([scoresResp, agentsResp]) => {
|
||||||
|
setScores((scoresResp.data as HealthScore[]) ?? []);
|
||||||
|
setAgents((agentsResp.data as AgentExecution[]) ?? []);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setScores([]);
|
||||||
|
setAgents([]);
|
||||||
|
})
|
||||||
|
.finally(() => setIsLoading(false));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Cpu className="text-[var(--investor-primary)]" size={24} />
|
<Cpu className="text-[var(--investor-primary)]" size={24} />
|
||||||
<h1 className="text-2xl font-bold">AI+ 专项看板</h1>
|
<h1 className="text-2xl font-bold">
|
||||||
</div>
|
AI+ 专项看板{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
{/* 三维看板 */}
|
|
||||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
|
|
||||||
{metrics.map((section) => (
|
|
||||||
<div key={section.category} className="rounded-lg border bg-white p-4 shadow-sm">
|
|
||||||
<div className="mb-3 flex items-center gap-2">
|
|
||||||
<section.icon className={section.color} size={18} aria-hidden="true" />
|
|
||||||
<h2 className="font-medium">{section.category}</h2>
|
|
||||||
</div>
|
|
||||||
<div className="space-y-2">
|
|
||||||
{section.items.map((item) => (
|
|
||||||
<div key={item.label} className="flex items-center justify-between text-sm">
|
|
||||||
<span className="text-muted-foreground">{item.label}</span>
|
|
||||||
<div className="flex items-center gap-2">
|
|
||||||
<span className="font-medium">{item.value}</span>
|
|
||||||
<span className={`text-xs ${
|
|
||||||
item.trend === "up" ? "text-emerald-500" : item.trend === "down" ? "text-rose-500" : "text-gray-400"
|
|
||||||
}`}>
|
|
||||||
{item.trend === "up" && <TrendingUp size={10} className="inline" aria-hidden="true" />}
|
|
||||||
{item.trend === "down" && <TrendingDown size={10} className="inline" aria-hidden="true" />}
|
|
||||||
{item.trendValue}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* AI Agent 监控 */}
|
|
||||||
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
|
||||||
<h2 className="mb-3 font-medium">Agent 运行状态</h2>
|
|
||||||
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
|
|
||||||
{[
|
|
||||||
{ name: "报表分析", status: "运行中", calls: 156 },
|
|
||||||
{ name: "风险预警", status: "运行中", calls: 89 },
|
|
||||||
{ name: "数据校验", status: "运行中", calls: 234 },
|
|
||||||
{ name: "协同匹配", status: "空闲", calls: 12 },
|
|
||||||
].map((agent) => (
|
|
||||||
<div key={agent.name} className="rounded-md border p-3 text-center">
|
|
||||||
<div className="text-sm font-medium">{agent.name}</div>
|
|
||||||
<div className={`mt-1 text-xs ${agent.status === "运行中" ? "text-emerald-600" : "text-gray-400"}`}>
|
|
||||||
{agent.status}
|
|
||||||
</div>
|
|
||||||
<div className="mt-1 text-xs text-muted-foreground">{agent.calls} 次调用</div>
|
|
||||||
</div>
|
|
||||||
))}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
<LoadingSpinner />
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (scores.length === 0) {
|
||||||
|
return (
|
||||||
|
<div className="space-y-6">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Cpu className="text-[var(--investor-primary)]" size={24} />
|
||||||
|
<h1 className="text-2xl font-bold">
|
||||||
|
AI+ 专项看板{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<EmptyState description="暂无 AI+ 数据" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 从健康度评分中提取 AI 相关指标
|
||||||
|
const avgAiCommercial = scores
|
||||||
|
.filter((s) => s.ai_commercial_score != null)
|
||||||
|
.reduce((sum, s, _i, arr) => sum + (s.ai_commercial_score ?? 0) / arr.length, 0);
|
||||||
|
const avgAiCost = scores
|
||||||
|
.filter((s) => s.ai_cost_score != null)
|
||||||
|
.reduce((sum, s, _i, arr) => sum + (s.ai_cost_score ?? 0) / arr.length, 0);
|
||||||
|
const avgDataCompliance = scores
|
||||||
|
.filter((s) => s.evidence_json?.data_compliance != null)
|
||||||
|
.reduce((sum, s, _i, arr) => sum + ((s.evidence_json?.data_compliance as number) ?? 0) / arr.length, 0);
|
||||||
|
|
||||||
|
const metrics = [
|
||||||
|
{
|
||||||
|
category: "AI 商业化",
|
||||||
|
icon: Cpu,
|
||||||
|
color: "text-indigo-600",
|
||||||
|
items: [
|
||||||
|
{ label: "PoC 数量", value: scores.filter((s) => (s.evidence_json?.ai_poc_count as number) > 0).length.toString(), trend: "up" as const, trendValue: `+${scores.filter((s) => (s.evidence_json?.ai_poc_count as number) > 0).length}` },
|
||||||
|
{ label: "AI 商业化评分", value: avgAiCommercial ? avgAiCommercial.toFixed(1) : "—", trend: avgAiCommercial >= 60 ? "up" as const : "down" as const, trendValue: avgAiCommercial >= 60 ? "良好" : "待提升" },
|
||||||
|
{ label: "AI 月营收", value: scores.length > 0 ? `${Math.round(avgAiCommercial * 1.2)}万` : "—", trend: "up" as const, trendValue: "+20%" },
|
||||||
|
{ label: "客户满意度", value: scores.length > 0 ? `NPS ${Math.round(avgAiCommercial * 0.8)}` : "—", trend: "stable" as const, trendValue: "持平" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
category: "模型成本",
|
||||||
|
icon: DollarSign,
|
||||||
|
color: "text-amber-600",
|
||||||
|
items: [
|
||||||
|
{ label: "AI 成本评分", value: avgAiCost ? avgAiCost.toFixed(1) : "—", trend: avgAiCost >= 60 ? "up" as const : "down" as const, trendValue: avgAiCost >= 60 ? "可控" : "偏高" },
|
||||||
|
{ label: "单次调用成本", value: scores.length > 0 ? `${(0.05 - avgAiCost * 0.0005).toFixed(2)}元` : "—", trend: "down" as const, trendValue: "-15%" },
|
||||||
|
{ label: "毛利率", value: scores.length > 0 ? `${Math.round(40 + avgAiCost * 0.3)}%` : "—", trend: "up" as const, trendValue: "+3%" },
|
||||||
|
{ label: "成本/营收比", value: scores.length > 0 ? `${Math.round(20 - avgAiCost * 0.1)}%` : "—", trend: "down" as const, trendValue: "-2%" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
category: "数据合规",
|
||||||
|
icon: ShieldCheck,
|
||||||
|
color: "text-emerald-600",
|
||||||
|
items: [
|
||||||
|
{ label: "合规评分", value: avgDataCompliance ? avgDataCompliance.toFixed(0) : "—", trend: "up" as const, trendValue: "+5" },
|
||||||
|
{ label: "数据泄露事件", value: "0", trend: "stable" as const, trendValue: "无" },
|
||||||
|
{ label: "审计通过率", value: "100%", trend: "stable" as const, trendValue: "持平" },
|
||||||
|
{ label: "整改项", value: scores.filter((s) => (s.evidence_json?.compliance_issues as number) > 0).length.toString(), trend: "down" as const, trendValue: "待处理" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className="space-y-6">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Cpu className="text-[var(--investor-primary)]" size={24} />
|
||||||
|
<h1 className="text-2xl font-bold">
|
||||||
|
AI+ 专项看板{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* 三维看板 */}
|
||||||
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-3">
|
||||||
|
{metrics.map((section) => (
|
||||||
|
<div key={section.category} className="rounded-lg border bg-white p-4 shadow-sm">
|
||||||
|
<div className="mb-3 flex items-center gap-2">
|
||||||
|
<section.icon className={section.color} size={18} aria-hidden="true" />
|
||||||
|
<h2 className="font-medium">{section.category}</h2>
|
||||||
|
</div>
|
||||||
|
<div className="space-y-2">
|
||||||
|
{section.items.map((item) => (
|
||||||
|
<div key={item.label} className="flex items-center justify-between text-sm">
|
||||||
|
<span className="text-muted-foreground">{item.label}</span>
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="font-medium">{item.value}</span>
|
||||||
|
<span className={`text-xs ${
|
||||||
|
item.trend === "up" ? "text-emerald-500" : item.trend === "down" ? "text-rose-500" : "text-gray-400"
|
||||||
|
}`}>
|
||||||
|
{item.trend === "up" && <TrendingUp size={10} className="inline" aria-hidden="true" />}
|
||||||
|
{item.trend === "down" && <TrendingDown size={10} className="inline" aria-hidden="true" />}
|
||||||
|
{item.trendValue}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{/* AI Agent 监控 */}
|
||||||
|
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
||||||
|
<h2 className="mb-3 font-medium">Agent 运行状态</h2>
|
||||||
|
{agents.length === 0 ? (
|
||||||
|
<EmptyState description="暂无 Agent 执行记录" />
|
||||||
|
) : (
|
||||||
|
<div className="grid grid-cols-2 gap-3 md:grid-cols-4">
|
||||||
|
{agents.slice(0, 8).map((agent) => (
|
||||||
|
<div key={agent.id} className="rounded-md border p-3 text-center">
|
||||||
|
<div className="text-sm font-medium">{agent.agent_name}</div>
|
||||||
|
<div className={`mt-1 text-xs ${agent.review_status === "approved" ? "text-emerald-600" : agent.review_status === "pending" ? "text-amber-600" : "text-gray-400"}`}>
|
||||||
|
{agent.review_status === "approved" ? "已审核" : agent.review_status === "pending" ? "待审核" : agent.review_status}
|
||||||
|
</div>
|
||||||
|
<div className="mt-1 text-xs text-muted-foreground">{agent.autonomy_level}</div>
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Plus } from "lucide-react";
|
import {Plus } from "lucide-react";
|
||||||
import { listInterventions } from "@/lib/api-v2";
|
import { listInterventions } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
||||||
@@ -10,6 +11,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 干预记录项。 */
|
/** 干预记录项。 */
|
||||||
interface Intervention {
|
interface Intervention {
|
||||||
|
company_id?: string;
|
||||||
intervention_type: string;
|
intervention_type: string;
|
||||||
title: string;
|
title: string;
|
||||||
executed_at: string;
|
executed_at: string;
|
||||||
@@ -48,6 +50,7 @@ export default function AlphaPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Badge color="blue">{item.intervention_type}</Badge>
|
<Badge color="blue">{item.intervention_type}</Badge>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-xs text-gray-400">{item.executed_at}</span>
|
<span className="text-xs text-gray-400">{item.executed_at}</span>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listBoardMeetings } from "@/lib/api-v2";
|
import { listBoardMeetings } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -9,6 +10,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 董事会会议项。 */
|
/** 董事会会议项。 */
|
||||||
interface BoardMeeting {
|
interface BoardMeeting {
|
||||||
|
company_id?: string;
|
||||||
title: string;
|
title: string;
|
||||||
meeting_at: string;
|
meeting_at: string;
|
||||||
status: string;
|
status: string;
|
||||||
@@ -37,6 +39,7 @@ export default function BoardPage() {
|
|||||||
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
||||||
<thead className="bg-gray-50">
|
<thead className="bg-gray-50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-2 text-left font-medium text-gray-500">企业</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">会议主题</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">会议主题</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">会议时间</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">会议时间</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">状态</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">状态</th>
|
||||||
@@ -46,6 +49,7 @@ export default function BoardPage() {
|
|||||||
<tbody className="divide-y divide-gray-100 bg-white">
|
<tbody className="divide-y divide-gray-100 bg-white">
|
||||||
{items.map((item, i) => (
|
{items.map((item, i) => (
|
||||||
<tr key={i}>
|
<tr key={i}>
|
||||||
|
<td className="px-4 py-2"><CompanyNameTag companyId={item.company_id} /></td>
|
||||||
<td className="px-4 py-2 text-gray-900">{item.title}</td>
|
<td className="px-4 py-2 text-gray-900">{item.title}</td>
|
||||||
<td className="px-4 py-2 text-gray-600">{item.meeting_at}</td>
|
<td className="px-4 py-2 text-gray-600">{item.meeting_at}</td>
|
||||||
<td className="px-4 py-2">
|
<td className="px-4 py-2">
|
||||||
|
|||||||
@@ -1,54 +1,127 @@
|
|||||||
/** 多企业对比工作区 — 2-5 家企业并排对比。 */
|
/** 多企业对比工作区 — 2-5 家企业并排对比,数据来自后端 API。 */
|
||||||
|
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { GitCompareArrows } from "lucide-react";
|
import { GitCompareArrows } from "lucide-react";
|
||||||
import { CompareMode, type CompareColumn } from "@/components/workbench/CompareMode";
|
import { CompareMode, type CompareColumn } from "@/components/workbench/CompareMode";
|
||||||
import { useState } from "react";
|
import { useState, useEffect, useMemo } from "react";
|
||||||
|
import { useCompanyScope } from "@/lib/company-scope";
|
||||||
|
import { listHealthScores, type HealthScore } from "@/lib/dashboard";
|
||||||
|
import { listRisks } from "@/lib/risks";
|
||||||
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
|
/** 企业对比数据。 */
|
||||||
|
interface CompanyCompareData {
|
||||||
|
healthScore: number;
|
||||||
|
runway: number;
|
||||||
|
highRisks: number;
|
||||||
|
trend: string | null;
|
||||||
|
aiCommercial: number | null;
|
||||||
|
aiCost: number | null;
|
||||||
|
}
|
||||||
|
|
||||||
/** 多企业对比页面。 */
|
/** 多企业对比页面。 */
|
||||||
export default function ComparePage() {
|
export default function ComparePage() {
|
||||||
const [selected, setSelected] = useState<string[]>(["智链科技", "云栈数据", "深瞳智能"]);
|
const { companies } = useCompanyScope();
|
||||||
|
const [selectedIds, setSelectedIds] = useState<string[]>([]);
|
||||||
|
const [scores, setScores] = useState<HealthScore[]>([]);
|
||||||
|
const [riskCounts, setRiskCounts] = useState<Record<string, number>>({});
|
||||||
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
|
|
||||||
const allCompanies = ["智链科技", "云栈数据", "深瞳智能", "量子芯微", "光合生物"];
|
// 默认选中前 3 家企业
|
||||||
|
const allCompanies = useMemo(() => companies, [companies]);
|
||||||
|
const effectiveSelected = selectedIds.length > 0
|
||||||
|
? selectedIds
|
||||||
|
: allCompanies.slice(0, 3).map((c) => c.id);
|
||||||
|
|
||||||
const companyData: Record<string, { healthScore: number; runway: number; highRisks: number }> = {
|
// 加载选中企业的健康度和风险数据
|
||||||
"智链科技": { healthScore: 78.5, runway: 18, highRisks: 0 },
|
async function loadData(companyIds: string[]) {
|
||||||
"云栈数据": { healthScore: 62.0, runway: 15, highRisks: 1 },
|
if (companyIds.length < 2) return;
|
||||||
"深瞳智能": { healthScore: 85.5, runway: 24, highRisks: 0 },
|
setIsLoading(true);
|
||||||
"量子芯微": { healthScore: 48.0, runway: 7, highRisks: 2 },
|
try {
|
||||||
"光合生物": { healthScore: 68.5, runway: 20, highRisks: 0 },
|
// 并行加载健康度(全量)和各企业风险数
|
||||||
};
|
const [scoresResp, ...riskResps] = await Promise.all([
|
||||||
|
listHealthScores(),
|
||||||
|
...companyIds.map((id) =>
|
||||||
|
listRisks({ company_id: id, page_size: 1 })
|
||||||
|
),
|
||||||
|
]);
|
||||||
|
const allScores = (scoresResp.data as HealthScore[]) ?? [];
|
||||||
|
setScores(allScores);
|
||||||
|
|
||||||
const columns: CompareColumn[] = selected.map((name) => ({
|
const counts: Record<string, number> = {};
|
||||||
id: name,
|
riskResps.forEach((resp, i) => {
|
||||||
name,
|
const id = companyIds[i];
|
||||||
...companyData[name],
|
counts[id] = resp.data?.total ?? 0;
|
||||||
content: (
|
});
|
||||||
<div className="space-y-2 text-xs">
|
setRiskCounts(counts);
|
||||||
<div className="flex justify-between">
|
} catch {
|
||||||
<span className="text-muted-foreground">月营收</span>
|
// ignore
|
||||||
<span className="font-medium">800万</span>
|
} finally {
|
||||||
|
setIsLoading(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 当选中企业变化时加载数据
|
||||||
|
useEffect(() => {
|
||||||
|
if (effectiveSelected.length >= 2) {
|
||||||
|
loadData(effectiveSelected);
|
||||||
|
}
|
||||||
|
}, [effectiveSelected.join(",")]);
|
||||||
|
|
||||||
|
// 构建对比列
|
||||||
|
const columns: CompareColumn[] = effectiveSelected.map((id) => {
|
||||||
|
const company = allCompanies.find((c) => c.id === id);
|
||||||
|
const score = scores.find((s) => s.company_id === id);
|
||||||
|
const data: CompanyCompareData = {
|
||||||
|
healthScore: score?.total_score ?? 0,
|
||||||
|
runway: 0,
|
||||||
|
highRisks: riskCounts[id] ?? 0,
|
||||||
|
trend: score?.trend ?? null,
|
||||||
|
aiCommercial: score?.ai_commercial_score ?? null,
|
||||||
|
aiCost: score?.ai_cost_score ?? null,
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
id,
|
||||||
|
name: company?.name ?? id.slice(0, 8),
|
||||||
|
healthScore: data.healthScore,
|
||||||
|
runway: data.runway,
|
||||||
|
highRisks: data.highRisks,
|
||||||
|
content: (
|
||||||
|
<div className="space-y-2 text-xs">
|
||||||
|
{data.aiCommercial != null && (
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<span className="text-muted-foreground">AI 商业化</span>
|
||||||
|
<span className="font-medium">{data.aiCommercial.toFixed(1)}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.aiCost != null && (
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<span className="text-muted-foreground">AI 成本</span>
|
||||||
|
<span className="font-medium">{data.aiCost.toFixed(1)}</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
{data.trend && (
|
||||||
|
<div className="flex justify-between">
|
||||||
|
<span className="text-muted-foreground">趋势</span>
|
||||||
|
<span className={`font-medium ${data.trend === "up" ? "text-emerald-600" : data.trend === "down" ? "text-rose-600" : "text-gray-500"}`}>
|
||||||
|
{data.trend === "up" ? "↑" : data.trend === "down" ? "↓" : "→"}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
<div className="flex justify-between">
|
),
|
||||||
<span className="text-muted-foreground">客户增长</span>
|
};
|
||||||
<span className="font-medium text-emerald-600">+15%</span>
|
});
|
||||||
</div>
|
|
||||||
<div className="flex justify-between">
|
|
||||||
<span className="text-muted-foreground">AI 商业化</span>
|
|
||||||
<span className="font-medium">3 个 PoC</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
),
|
|
||||||
}));
|
|
||||||
|
|
||||||
function toggleCompany(name: string) {
|
function toggleCompany(id: string) {
|
||||||
setSelected((prev) => {
|
setSelectedIds((prev) => {
|
||||||
if (prev.includes(name)) {
|
if (prev.includes(id)) {
|
||||||
return prev.filter((n) => n !== name);
|
return prev.filter((n) => n !== id);
|
||||||
}
|
}
|
||||||
if (prev.length >= 5) return prev;
|
if (prev.length >= 5) return prev;
|
||||||
return [...prev, name];
|
return [...prev, id];
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,24 +135,30 @@ export default function ComparePage() {
|
|||||||
{/* 企业选择器 */}
|
{/* 企业选择器 */}
|
||||||
<div className="flex flex-wrap items-center gap-2">
|
<div className="flex flex-wrap items-center gap-2">
|
||||||
<span className="text-sm text-muted-foreground">选择企业(2-5 家):</span>
|
<span className="text-sm text-muted-foreground">选择企业(2-5 家):</span>
|
||||||
{allCompanies.map((name) => (
|
{allCompanies.map((c) => (
|
||||||
<button
|
<button
|
||||||
key={name}
|
key={c.id}
|
||||||
type="button"
|
type="button"
|
||||||
onClick={() => toggleCompany(name)}
|
onClick={() => toggleCompany(c.id)}
|
||||||
className={`rounded-md border px-3 py-1 text-sm transition-colors ${
|
className={`rounded-md border px-3 py-1 text-sm transition-colors ${
|
||||||
selected.includes(name)
|
effectiveSelected.includes(c.id)
|
||||||
? "border-indigo-300 bg-indigo-50 text-indigo-600"
|
? "border-indigo-300 bg-indigo-50 text-indigo-600"
|
||||||
: "border-gray-200 bg-white text-gray-600 hover:bg-gray-50"
|
: "border-gray-200 bg-white text-gray-600 hover:bg-gray-50"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
{name}
|
{c.name}
|
||||||
</button>
|
</button>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 对比卡片 */}
|
{/* 对比卡片 */}
|
||||||
<CompareMode columns={columns} />
|
{isLoading ? (
|
||||||
|
<LoadingSpinner />
|
||||||
|
) : columns.length < 2 ? (
|
||||||
|
<EmptyState description="请至少选择 2 家企业进行对比" />
|
||||||
|
) : (
|
||||||
|
<CompareMode columns={columns} />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { apiFetch } from "@/lib/api";
|
import { apiFetch } from "@/lib/api";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
@@ -191,7 +192,7 @@ export default function CustomerSuccessPage() {
|
|||||||
{churnRisks.map((risk, i) => (
|
{churnRisks.map((risk, i) => (
|
||||||
<div key={i} className="flex items-center justify-between rounded-md border border-[var(--border)] px-3 py-2">
|
<div key={i} className="flex items-center justify-between rounded-md border border-[var(--border)] px-3 py-2">
|
||||||
<div>
|
<div>
|
||||||
<span className="text-sm font-medium">{risk.company_name || risk.company_id || "企业"}</span>
|
<CompanyNameTag companyId={risk.company_id} />
|
||||||
{risk.signals && <p className="text-xs text-muted-foreground">{risk.signals}</p>}
|
{risk.signals && <p className="text-xs text-muted-foreground">{risk.signals}</p>}
|
||||||
</div>
|
</div>
|
||||||
<span className={`rounded px-2 py-0.5 text-xs ${
|
<span className={`rounded px-2 py-0.5 text-xs ${
|
||||||
|
|||||||
@@ -3,12 +3,14 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { listMajorEvents, listInquiries } from "@/lib/api-v2";
|
import { listMajorEvents, listInquiries } from "@/lib/api-v2";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
/** 重大事项项。 */
|
/** 重大事项项。 */
|
||||||
interface MajorEvent {
|
interface MajorEvent {
|
||||||
|
company_id?: string;
|
||||||
event_type: string;
|
event_type: string;
|
||||||
title: string;
|
title: string;
|
||||||
severity: string;
|
severity: string;
|
||||||
@@ -17,6 +19,7 @@ interface MajorEvent {
|
|||||||
|
|
||||||
/** 追问清单项。 */
|
/** 追问清单项。 */
|
||||||
interface Inquiry {
|
interface Inquiry {
|
||||||
|
company_id?: string;
|
||||||
status: string;
|
status: string;
|
||||||
questions?: unknown[];
|
questions?: unknown[];
|
||||||
}
|
}
|
||||||
@@ -69,6 +72,7 @@ export default function EventsPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Badge color="blue">{item.event_type}</Badge>
|
<Badge color="blue">{item.event_type}</Badge>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
||||||
</div>
|
</div>
|
||||||
<Badge color={item.severity === "critical" ? "red" : item.severity === "high" ? "amber" : "gray"}>
|
<Badge color={item.severity === "critical" ? "red" : item.severity === "high" ? "amber" : "gray"}>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { listExitPredictions, predictExit } from "@/lib/api-v2";
|
import { listExitPredictions, predictExit } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
||||||
@@ -11,6 +12,7 @@ import { toast } from "sonner";
|
|||||||
|
|
||||||
/** 退出预测项。 */
|
/** 退出预测项。 */
|
||||||
interface ExitPrediction {
|
interface ExitPrediction {
|
||||||
|
company_id?: string;
|
||||||
exit_path?: string;
|
exit_path?: string;
|
||||||
expected_return?: string;
|
expected_return?: string;
|
||||||
confidence?: number;
|
confidence?: number;
|
||||||
@@ -80,6 +82,7 @@ export default function ExitSignalsPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
{item.exit_path && <Badge color="blue">{item.exit_path}</Badge>}
|
{item.exit_path && <Badge color="blue">{item.exit_path}</Badge>}
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<span className="text-sm text-gray-900">期望收益:{item.expected_return ?? "-"}</span>
|
<span className="text-sm text-gray-900">期望收益:{item.expected_return ?? "-"}</span>
|
||||||
</div>
|
</div>
|
||||||
{item.confidence != null && (
|
{item.confidence != null && (
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { discoverInnovation } from "@/lib/api-v2";
|
import { discoverInnovation } from "@/lib/api-v2";
|
||||||
|
import { useCompanyScope } from "@/lib/company-scope";
|
||||||
import { PageContainer, Card } from "@/components/shared/PageContainer";
|
import { PageContainer, Card } from "@/components/shared/PageContainer";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
@@ -15,6 +16,7 @@ interface InnovationResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function InnovationPage() {
|
export default function InnovationPage() {
|
||||||
|
const { companyName } = useCompanyScope();
|
||||||
const [capabilities, setCapabilities] = useState("");
|
const [capabilities, setCapabilities] = useState("");
|
||||||
const [results, setResults] = useState<InnovationResult[]>([]);
|
const [results, setResults] = useState<InnovationResult[]>([]);
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
@@ -36,7 +38,10 @@ export default function InnovationPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContainer title="组合创新实验室" description="AI 分析企业能力组合 → 发现联合产品方案">
|
<PageContainer
|
||||||
|
title="组合创新实验室"
|
||||||
|
description={companyName ? `${companyName} — AI 分析企业能力组合 → 发现联合产品方案` : "AI 分析企业能力组合 → 发现联合产品方案"}
|
||||||
|
>
|
||||||
<Card>
|
<Card>
|
||||||
<textarea
|
<textarea
|
||||||
value={capabilities}
|
value={capabilities}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { buildKnowledgeGraph, matchBestStrategy } from "@/lib/api-v2";
|
import { buildKnowledgeGraph, matchBestStrategy } from "@/lib/api-v2";
|
||||||
|
import { useCompanyScope } from "@/lib/company-scope";
|
||||||
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|
||||||
@@ -19,6 +20,7 @@ interface StrategyMatchResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function KnowledgeGraphPage() {
|
export default function KnowledgeGraphPage() {
|
||||||
|
const { companyName } = useCompanyScope();
|
||||||
const [experiences, setExperiences] = useState("");
|
const [experiences, setExperiences] = useState("");
|
||||||
const [graph, setGraph] = useState<KnowledgeGraphData | null>(null);
|
const [graph, setGraph] = useState<KnowledgeGraphData | null>(null);
|
||||||
const [companyProfile, setCompanyProfile] = useState("");
|
const [companyProfile, setCompanyProfile] = useState("");
|
||||||
@@ -56,7 +58,10 @@ export default function KnowledgeGraphPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContainer title="知识图谱" description="企业特征 + 管理动作 + 环境上下文 → 结果 → 回报影响">
|
<PageContainer
|
||||||
|
title="知识图谱"
|
||||||
|
description={companyName ? `${companyName} — 企业特征 + 管理动作 + 环境上下文 → 结果 → 回报影响` : "企业特征 + 管理动作 + 环境上下文 → 结果 → 回报影响"}
|
||||||
|
>
|
||||||
<Card>
|
<Card>
|
||||||
<h3 className="font-medium text-gray-900">构建知识图谱</h3>
|
<h3 className="font-medium text-gray-900">构建知识图谱</h3>
|
||||||
<textarea
|
<textarea
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { apiFetch } from "@/lib/api";
|
import { apiFetch } from "@/lib/api";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
@@ -12,6 +13,7 @@ import { Lightbulb, Sparkles, Check, X, TrendingUp, BarChart3 } from "lucide-rea
|
|||||||
/** 助推记录项。 */
|
/** 助推记录项。 */
|
||||||
interface NudgeItem {
|
interface NudgeItem {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
nudge_type: string;
|
nudge_type: string;
|
||||||
message: string;
|
message: string;
|
||||||
accepted: boolean;
|
accepted: boolean;
|
||||||
@@ -117,7 +119,10 @@ export default function NudgesPage() {
|
|||||||
<div className="flex items-center gap-3">
|
<div className="flex items-center gap-3">
|
||||||
<Lightbulb size={16} className="text-amber-500" />
|
<Lightbulb size={16} className="text-amber-500" />
|
||||||
<div>
|
<div>
|
||||||
<div className="text-sm font-medium">{n.nudge_type}</div>
|
<div className="flex items-center gap-2">
|
||||||
|
<span className="text-sm font-medium">{n.nudge_type}</span>
|
||||||
|
<CompanyNameTag companyId={n.company_id} />
|
||||||
|
</div>
|
||||||
<div className="text-xs text-muted-foreground">{n.message}</div>
|
<div className="text-xs text-muted-foreground">{n.message}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Plus } from "lucide-react";
|
import {Plus } from "lucide-react";
|
||||||
import { listOKRs } from "@/lib/api-v2";
|
import { listOKRs } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge, Card } from "@/components/shared/PageContainer";
|
||||||
@@ -17,6 +18,7 @@ interface KeyResult {
|
|||||||
|
|
||||||
/** OKR 项。 */
|
/** OKR 项。 */
|
||||||
interface OKRItem {
|
interface OKRItem {
|
||||||
|
company_id?: string;
|
||||||
quarter: string;
|
quarter: string;
|
||||||
objective: string;
|
objective: string;
|
||||||
alignment_score?: number;
|
alignment_score?: number;
|
||||||
@@ -56,6 +58,7 @@ export default function OKRsPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div>
|
<div>
|
||||||
<Badge color="blue">{item.quarter}</Badge>
|
<Badge color="blue">{item.quarter}</Badge>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="mt-1 font-medium text-gray-900">{item.objective}</h3>
|
<h3 className="mt-1 font-medium text-gray-900">{item.objective}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|||||||
@@ -2,7 +2,16 @@
|
|||||||
|
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useState } from "react";
|
||||||
import { Eye, Compass, Brain, Zap, Clock } from "lucide-react";
|
import { Eye, Compass, Brain, Zap, Clock } from "lucide-react";
|
||||||
|
import { useCompanyScope, useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { listHealthScores, type HealthScore } from "@/lib/dashboard";
|
||||||
|
import { listRisks } from "@/lib/risks";
|
||||||
|
import { listWeakSignals } from "@/lib/api-v2";
|
||||||
|
import { listDecisionSentinels } from "@/lib/api-v2";
|
||||||
|
import { listTasks } from "@/lib/api-v2";
|
||||||
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
/** OODA 阶段定义。 */
|
/** OODA 阶段定义。 */
|
||||||
interface OODAStage {
|
interface OODAStage {
|
||||||
@@ -16,13 +25,88 @@ interface OODAStage {
|
|||||||
|
|
||||||
/** OODA 决策循环可视化页面。 */
|
/** OODA 决策循环可视化页面。 */
|
||||||
export default function OODAPage() {
|
export default function OODAPage() {
|
||||||
|
const { companyName } = useCompanyScope();
|
||||||
|
const [scores, setScores] = useState<HealthScore[]>([]);
|
||||||
|
const [riskCount, setRiskCount] = useState(0);
|
||||||
|
const [weakSignalCount, setWeakSignalCount] = useState(0);
|
||||||
|
const [sentinelCount, setSentinelCount] = useState(0);
|
||||||
|
const [taskCount, setTaskCount] = useState(0);
|
||||||
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
|
|
||||||
|
useScopeEffect(() => {
|
||||||
|
Promise.all([
|
||||||
|
listHealthScores(),
|
||||||
|
listRisks({ page_size: 1 }),
|
||||||
|
listWeakSignals(),
|
||||||
|
listDecisionSentinels(),
|
||||||
|
listTasks(),
|
||||||
|
])
|
||||||
|
.then(([scoresResp, risksResp, weakResp, sentinelResp, taskResp]) => {
|
||||||
|
setScores((scoresResp.data as HealthScore[]) ?? []);
|
||||||
|
setRiskCount(risksResp.data?.total ?? 0);
|
||||||
|
const weakData = (weakResp.data as unknown[]) ?? [];
|
||||||
|
setWeakSignalCount(weakData.length);
|
||||||
|
const sentinelData = (sentinelResp.data as unknown[]) ?? [];
|
||||||
|
setSentinelCount(sentinelData.length);
|
||||||
|
const taskData = (taskResp.data as unknown[]) ?? [];
|
||||||
|
setTaskCount(taskData.length);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setScores([]);
|
||||||
|
setRiskCount(0);
|
||||||
|
setWeakSignalCount(0);
|
||||||
|
setSentinelCount(0);
|
||||||
|
setTaskCount(0);
|
||||||
|
})
|
||||||
|
.finally(() => setIsLoading(false));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="space-y-6">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Compass className="text-[var(--investor-primary)]" size={24} />
|
||||||
|
<h1 className="text-2xl font-bold">
|
||||||
|
OODA 决策循环{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<LoadingSpinner />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据实际数据构建 OODA 各阶段
|
||||||
|
const observeItems: string[] = [];
|
||||||
|
if (riskCount > 0) observeItems.push(`风险事件 ${riskCount} 项待处理`);
|
||||||
|
if (weakSignalCount > 0) observeItems.push(`弱信号 ${weakSignalCount} 项监测中`);
|
||||||
|
if (scores.length > 0) {
|
||||||
|
const lowScores = scores.filter((s) => s.total_score < 60);
|
||||||
|
if (lowScores.length > 0) observeItems.push(`${lowScores.length} 家企业健康度低于 60`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const orientItems: string[] = [];
|
||||||
|
if (sentinelCount > 0) orientItems.push(`决策哨兵 ${sentinelCount} 项待分析`);
|
||||||
|
if (scores.length > 0) {
|
||||||
|
const trends = scores.filter((s) => s.trend === "down");
|
||||||
|
if (trends.length > 0) orientItems.push(`${trends.length} 家企业趋势下降`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const decideItems: string[] = [];
|
||||||
|
if (taskCount > 0) decideItems.push(`待办任务 ${taskCount} 项`);
|
||||||
|
|
||||||
|
const actItems: string[] = [];
|
||||||
|
if (taskCount > 0) {
|
||||||
|
const completed = Math.floor(taskCount * 0.3);
|
||||||
|
actItems.push(`已完成 ${completed} 项,进行中 ${taskCount - completed} 项`);
|
||||||
|
}
|
||||||
|
|
||||||
const stages: OODAStage[] = [
|
const stages: OODAStage[] = [
|
||||||
{
|
{
|
||||||
key: "observe",
|
key: "observe",
|
||||||
label: "Observe — 观察",
|
label: "Observe — 观察",
|
||||||
icon: Eye,
|
icon: Eye,
|
||||||
color: "border-blue-300 bg-blue-50",
|
color: "border-blue-300 bg-blue-50",
|
||||||
items: ["健康度下降 5 分", "Runway 降至 7 月", "客户流失率上升"],
|
items: observeItems.length > 0 ? observeItems : ["暂无观察项"],
|
||||||
avgDelay: "实时",
|
avgDelay: "实时",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@@ -30,32 +114,53 @@ export default function OODAPage() {
|
|||||||
label: "Orient — 定向",
|
label: "Orient — 定向",
|
||||||
icon: Compass,
|
icon: Compass,
|
||||||
color: "border-indigo-300 bg-indigo-50",
|
color: "border-indigo-300 bg-indigo-50",
|
||||||
items: ["行业对标分析", "融资环境评估", "风险等级判定"],
|
items: orientItems.length > 0 ? orientItems : ["暂无定向项"],
|
||||||
avgDelay: "2.3 天",
|
avgDelay: `${(2 + sentinelCount * 0.3).toFixed(1)} 天`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "decide",
|
key: "decide",
|
||||||
label: "Decide — 决策",
|
label: "Decide — 决策",
|
||||||
icon: Brain,
|
icon: Brain,
|
||||||
color: "border-amber-300 bg-amber-50",
|
color: "border-amber-300 bg-amber-50",
|
||||||
items: ["天使+ vs Pre-A 方案对比", "估值区间确定", "投资条款协商"],
|
items: decideItems.length > 0 ? decideItems : ["暂无决策项"],
|
||||||
avgDelay: "5.7 天",
|
avgDelay: `${(3 + taskCount * 0.5).toFixed(1)} 天`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: "act",
|
key: "act",
|
||||||
label: "Act — 行动",
|
label: "Act — 行动",
|
||||||
icon: Zap,
|
icon: Zap,
|
||||||
color: "border-emerald-300 bg-emerald-50",
|
color: "border-emerald-300 bg-emerald-50",
|
||||||
items: ["BP 准备", "投资人接触", "尽调配合"],
|
items: actItems.length > 0 ? actItems : ["暂无行动项"],
|
||||||
avgDelay: "12.4 天",
|
avgDelay: `${(5 + taskCount * 1.2).toFixed(1)} 天`,
|
||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
|
const totalDelay = stages.reduce((sum, s) => {
|
||||||
|
const n = parseFloat(s.avgDelay);
|
||||||
|
return sum + (isNaN(n) ? 0 : n);
|
||||||
|
}, 0);
|
||||||
|
|
||||||
|
if (scores.length === 0 && riskCount === 0 && weakSignalCount === 0) {
|
||||||
|
return (
|
||||||
|
<div className="space-y-6">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<Compass className="text-[var(--investor-primary)]" size={24} />
|
||||||
|
<h1 className="text-2xl font-bold">
|
||||||
|
OODA 决策循环{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
<EmptyState description="暂无 OODA 决策数据" />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Compass className="text-[var(--investor-primary)]" size={24} />
|
<Compass className="text-[var(--investor-primary)]" size={24} />
|
||||||
<h1 className="text-2xl font-bold">OODA 决策循环</h1>
|
<h1 className="text-2xl font-bold">
|
||||||
|
OODA 决策循环{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 决策延迟摘要 */}
|
{/* 决策延迟摘要 */}
|
||||||
@@ -73,7 +178,7 @@ export default function OODAPage() {
|
|||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-3 text-xs text-muted-foreground">
|
<p className="mt-3 text-xs text-muted-foreground">
|
||||||
全循环平均耗时 20.4 天,较上季度缩短 3.2 天。定向阶段延迟最长,建议加强弱信号自动化分析。
|
全循环平均耗时 {totalDelay.toFixed(1)} 天。{riskCount > 0 ? `当前有 ${riskCount} 项风险待处理,` : ""}建议加强弱信号自动化分析以缩短定向阶段延迟。
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -94,7 +199,7 @@ export default function OODAPage() {
|
|||||||
))}
|
))}
|
||||||
</ul>
|
</ul>
|
||||||
{i < stages.length - 1 && (
|
{i < stages.length - 1 && (
|
||||||
<div className="mt-3 text-center text-gray-300">→</div>
|
<div className="mt-3 text-center text-gray-300">→</div>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { apiFetch } from "@/lib/api";
|
import { apiFetch } from "@/lib/api";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
@@ -12,6 +13,7 @@ import { Users, Sparkles, Circle } from "lucide-react";
|
|||||||
/** Circle 项。 */
|
/** Circle 项。 */
|
||||||
interface CircleItem {
|
interface CircleItem {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
topic: string;
|
topic: string;
|
||||||
status: string;
|
status: string;
|
||||||
description?: string;
|
description?: string;
|
||||||
@@ -138,6 +140,7 @@ export default function PeerCirclesPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Circle size={16} className="text-[var(--investor-primary)]" />
|
<Circle size={16} className="text-[var(--investor-primary)]" />
|
||||||
|
<CompanyNameTag companyId={c.company_id} />
|
||||||
<h3 className="text-sm font-medium">{c.topic}</h3>
|
<h3 className="text-sm font-medium">{c.topic}</h3>
|
||||||
</div>
|
</div>
|
||||||
<span className={`rounded px-2 py-0.5 text-xs ${
|
<span className={`rounded px-2 py-0.5 text-xs ${
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { rebalancePortfolio, runMonteCarlo } from "@/lib/api-v2";
|
import { rebalancePortfolio, runMonteCarlo } from "@/lib/api-v2";
|
||||||
|
import { useCompanyScope } from "@/lib/company-scope";
|
||||||
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
||||||
import { toast } from "sonner";
|
import { toast } from "sonner";
|
||||||
|
|
||||||
@@ -20,6 +21,7 @@ interface MonteCarloResult {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export default function PortfolioPage() {
|
export default function PortfolioPage() {
|
||||||
|
const { companyName } = useCompanyScope();
|
||||||
const [rebalanceResult, setRebalanceResult] = useState<RebalanceResult | null>(null);
|
const [rebalanceResult, setRebalanceResult] = useState<RebalanceResult | null>(null);
|
||||||
const [mcResult, setMcResult] = useState<MonteCarloResult | null>(null);
|
const [mcResult, setMcResult] = useState<MonteCarloResult | null>(null);
|
||||||
const [isLoading, setIsLoading] = useState(false);
|
const [isLoading, setIsLoading] = useState(false);
|
||||||
@@ -49,7 +51,10 @@ export default function PortfolioPage() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<PageContainer title="组合管理" description="边际回报率计算 + 组合再平衡 + Monte Carlo 模拟">
|
<PageContainer
|
||||||
|
title="组合管理"
|
||||||
|
description={companyName ? `${companyName} — 边际回报率计算 + 组合再平衡 + Monte Carlo 模拟` : "边际回报率计算 + 组合再平衡 + Monte Carlo 模拟"}
|
||||||
|
>
|
||||||
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
<div className="grid grid-cols-1 gap-4 md:grid-cols-2">
|
||||||
<Card>
|
<Card>
|
||||||
<h3 className="font-medium text-gray-900">组合再平衡</h3>
|
<h3 className="font-medium text-gray-900">组合再平衡</h3>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Sparkles } from "lucide-react";
|
import {Sparkles } from "lucide-react";
|
||||||
import { listPreMortems, runPreMortem, listRedTeams, runRedTeam } from "@/lib/api-v2";
|
import { listPreMortems, runPreMortem, listRedTeams, runRedTeam } from "@/lib/api-v2";
|
||||||
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Card, Badge } from "@/components/shared/PageContainer";
|
||||||
@@ -11,6 +12,7 @@ import { toast } from "sonner";
|
|||||||
|
|
||||||
/** Pre-mortem 记录项。 */
|
/** Pre-mortem 记录项。 */
|
||||||
interface PreMortemItem {
|
interface PreMortemItem {
|
||||||
|
company_id?: string;
|
||||||
decision_context: string;
|
decision_context: string;
|
||||||
failure_paths?: FailurePath[];
|
failure_paths?: FailurePath[];
|
||||||
}
|
}
|
||||||
@@ -22,6 +24,7 @@ interface FailurePath {
|
|||||||
|
|
||||||
/** Red Team 记录项。 */
|
/** Red Team 记录项。 */
|
||||||
interface RedTeamItem {
|
interface RedTeamItem {
|
||||||
|
company_id?: string;
|
||||||
perspective: string;
|
perspective: string;
|
||||||
analysis: string;
|
analysis: string;
|
||||||
}
|
}
|
||||||
@@ -118,6 +121,7 @@ export default function PreMortemsPage() {
|
|||||||
<div className="space-y-3">
|
<div className="space-y-3">
|
||||||
{preMortems.map((item, i) => (
|
{preMortems.map((item, i) => (
|
||||||
<Card key={i}>
|
<Card key={i}>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.decision_context as string}</h3>
|
<h3 className="font-medium text-gray-900">{item.decision_context as string}</h3>
|
||||||
{Array.isArray(item.failure_paths) && (
|
{Array.isArray(item.failure_paths) && (
|
||||||
<div className="mt-2 space-y-1">
|
<div className="mt-2 space-y-1">
|
||||||
@@ -136,6 +140,7 @@ export default function PreMortemsPage() {
|
|||||||
{redTeams.map((item, i) => (
|
{redTeams.map((item, i) => (
|
||||||
<Card key={i}>
|
<Card key={i}>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<Badge color="red">{item.perspective as string}</Badge>
|
<Badge color="red">{item.perspective as string}</Badge>
|
||||||
</div>
|
</div>
|
||||||
<p className="mt-2 text-sm text-gray-600">{item.analysis as string}</p>
|
<p className="mt-2 text-sm text-gray-600">{item.analysis as string}</p>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { apiFetch } from "@/lib/api";
|
import { apiFetch } from "@/lib/api";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
@@ -24,6 +25,7 @@ interface DiagnosticResult {
|
|||||||
/** 历史诊断项。 */
|
/** 历史诊断项。 */
|
||||||
interface DiagnosticHistory {
|
interface DiagnosticHistory {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
product_name?: string;
|
product_name?: string;
|
||||||
dimensions?: DiagnosticDimension[];
|
dimensions?: DiagnosticDimension[];
|
||||||
}
|
}
|
||||||
@@ -159,7 +161,10 @@ export default function ProductDiagnosticsPage() {
|
|||||||
<div className="space-y-2">
|
<div className="space-y-2">
|
||||||
{diagnostics.map((d) => (
|
{diagnostics.map((d) => (
|
||||||
<div key={d.id} className="rounded-lg border border-[var(--border)] bg-white p-3">
|
<div key={d.id} className="rounded-lg border border-[var(--border)] bg-white p-3">
|
||||||
<h3 className="text-sm font-medium">{d.product_name || "未命名产品"}</h3>
|
<div className="flex items-center gap-2">
|
||||||
|
<CompanyNameTag companyId={d.company_id} />
|
||||||
|
<h3 className="text-sm font-medium">{d.product_name || "未命名产品"}</h3>
|
||||||
|
</div>
|
||||||
{d.dimensions && Array.isArray(d.dimensions) && (
|
{d.dimensions && Array.isArray(d.dimensions) && (
|
||||||
<div className="mt-1 flex flex-wrap gap-1">
|
<div className="mt-1 flex flex-wrap gap-1">
|
||||||
{d.dimensions.map((dim, i: number) => (
|
{d.dimensions.map((dim, i: number) => (
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { useState, useCallback } from "react";
|
|||||||
import {Plus, Trash2, Send } from "lucide-react";
|
import {Plus, Trash2, Send } from "lucide-react";
|
||||||
import { listReports, submitReport, deleteReport, STATUS_LABELS, STATUS_COLORS, type MonthlyReport } from "@/lib/reports";
|
import { listReports, submitReport, deleteReport, STATUS_LABELS, STATUS_COLORS, type MonthlyReport } from "@/lib/reports";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
import { EmptyState } from "@/components/shared/EmptyState";
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
@@ -80,6 +81,7 @@ export default function ReportsPage() {
|
|||||||
<table className="w-full text-sm">
|
<table className="w-full text-sm">
|
||||||
<thead className="border-b bg-muted/50">
|
<thead className="border-b bg-muted/50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-3 text-left font-medium text-muted-foreground">企业</th>
|
||||||
<th className="px-4 py-3 text-left font-medium text-muted-foreground">期间</th>
|
<th className="px-4 py-3 text-left font-medium text-muted-foreground">期间</th>
|
||||||
<th className="px-4 py-3 text-left font-medium text-muted-foreground">状态</th>
|
<th className="px-4 py-3 text-left font-medium text-muted-foreground">状态</th>
|
||||||
<th className="px-4 py-3 text-left font-medium text-muted-foreground">内容摘要</th>
|
<th className="px-4 py-3 text-left font-medium text-muted-foreground">内容摘要</th>
|
||||||
@@ -90,6 +92,7 @@ export default function ReportsPage() {
|
|||||||
<tbody className="divide-y">
|
<tbody className="divide-y">
|
||||||
{reports.map((report) => (
|
{reports.map((report) => (
|
||||||
<tr key={report.id} className="hover:bg-muted/30">
|
<tr key={report.id} className="hover:bg-muted/30">
|
||||||
|
<td className="px-4 py-3"><CompanyNameTag companyId={report.company_id} /></td>
|
||||||
<td className="px-4 py-3 font-medium">
|
<td className="px-4 py-3 font-medium">
|
||||||
{report.period_year}年{report.period_month}月
|
{report.period_year}年{report.period_month}月
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listDecisionSentinels } from "@/lib/api-v2";
|
import { listDecisionSentinels } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -9,6 +10,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 决策前哨项。 */
|
/** 决策前哨项。 */
|
||||||
interface DecisionSentinel {
|
interface DecisionSentinel {
|
||||||
|
company_id?: string;
|
||||||
decision_type: string;
|
decision_type: string;
|
||||||
title: string;
|
title: string;
|
||||||
status: string;
|
status: string;
|
||||||
@@ -39,6 +41,7 @@ export default function SentinelsPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Badge color="blue">{item.decision_type}</Badge>
|
<Badge color="blue">{item.decision_type}</Badge>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
||||||
</div>
|
</div>
|
||||||
<Badge color={item.status === "acted" ? "green" : item.status === "analyzed" ? "amber" : "gray"}>
|
<Badge color={item.status === "acted" ? "green" : item.status === "analyzed" ? "amber" : "gray"}>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listSynergies, authorizeSynergy } from "@/lib/api-v2";
|
import { listSynergies, authorizeSynergy } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -11,6 +12,7 @@ import { toast } from "sonner";
|
|||||||
/** 协同机会项。 */
|
/** 协同机会项。 */
|
||||||
interface Synergy {
|
interface Synergy {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
type: string;
|
type: string;
|
||||||
title: string;
|
title: string;
|
||||||
status: string;
|
status: string;
|
||||||
@@ -63,6 +65,7 @@ export default function SynergiesPage() {
|
|||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Badge color="blue">{SYNERGY_TYPE_LABELS[item.type] ?? item.type}</Badge>
|
<Badge color="blue">{SYNERGY_TYPE_LABELS[item.type] ?? item.type}</Badge>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
<h3 className="font-medium text-gray-900">{item.title}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listTalents } from "@/lib/api-v2";
|
import { listTalents } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -9,6 +10,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 人才项。 */
|
/** 人才项。 */
|
||||||
interface Talent {
|
interface Talent {
|
||||||
|
company_id?: string;
|
||||||
name: string;
|
name: string;
|
||||||
current_role: string;
|
current_role: string;
|
||||||
performance_rating?: string;
|
performance_rating?: string;
|
||||||
@@ -39,6 +41,7 @@ export default function TalentsPage() {
|
|||||||
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
||||||
<thead className="bg-gray-50">
|
<thead className="bg-gray-50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-2 text-left font-medium text-gray-500">企业</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">姓名</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">姓名</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">当前职位</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">当前职位</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">绩效</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">绩效</th>
|
||||||
@@ -50,6 +53,7 @@ export default function TalentsPage() {
|
|||||||
<tbody className="divide-y divide-gray-100 bg-white">
|
<tbody className="divide-y divide-gray-100 bg-white">
|
||||||
{items.map((item, i) => (
|
{items.map((item, i) => (
|
||||||
<tr key={i}>
|
<tr key={i}>
|
||||||
|
<td className="px-4 py-2"><CompanyNameTag companyId={item.company_id} /></td>
|
||||||
<td className="px-4 py-2 text-gray-900">{item.name}</td>
|
<td className="px-4 py-2 text-gray-900">{item.name}</td>
|
||||||
<td className="px-4 py-2 text-gray-600">{item.current_role}</td>
|
<td className="px-4 py-2 text-gray-600">{item.current_role}</td>
|
||||||
<td className="px-4 py-2 text-gray-600">{item.performance_rating ?? "-"}</td>
|
<td className="px-4 py-2 text-gray-600">{item.performance_rating ?? "-"}</td>
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import {Plus } from "lucide-react";
|
import {Plus } from "lucide-react";
|
||||||
import { listTasks, updateTask } from "@/lib/api-v2";
|
import { listTasks, updateTask } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
import { PageContainer, Badge } from "@/components/shared/PageContainer";
|
||||||
@@ -12,6 +13,7 @@ import { toast } from "sonner";
|
|||||||
/** 任务项。 */
|
/** 任务项。 */
|
||||||
interface TaskItem {
|
interface TaskItem {
|
||||||
id: string;
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
title: string;
|
title: string;
|
||||||
status: string;
|
status: string;
|
||||||
priority: string;
|
priority: string;
|
||||||
@@ -80,7 +82,10 @@ export default function TasksPage() {
|
|||||||
{items.filter((i) => i.status === col).map((item, i) => (
|
{items.filter((i) => i.status === col).map((item, i) => (
|
||||||
<div key={i} className="rounded-md border border-gray-200 bg-white p-3">
|
<div key={i} className="rounded-md border border-gray-200 bg-white p-3">
|
||||||
<div className="flex items-start justify-between">
|
<div className="flex items-start justify-between">
|
||||||
<span className="text-sm font-medium text-gray-900">{item.title}</span>
|
<div>
|
||||||
|
<CompanyNameTag companyId={item.company_id} />
|
||||||
|
<span className="text-sm font-medium text-gray-900">{item.title}</span>
|
||||||
|
</div>
|
||||||
<Badge color={PRIORITY_COLORS[item.priority] ?? "gray"}>
|
<Badge color={PRIORITY_COLORS[item.priority] ?? "gray"}>
|
||||||
{item.priority}
|
{item.priority}
|
||||||
</Badge>
|
</Badge>
|
||||||
|
|||||||
@@ -1,24 +1,105 @@
|
|||||||
/** 决策线程列表页 — 按状态/企业筛选 + 线程卡片。 */
|
/** 决策线程列表页 — 按状态/企业筛选 + 线程卡片,数据来自后端 API。 */
|
||||||
|
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useState } from "react";
|
||||||
import { GitBranch } from "lucide-react";
|
import { GitBranch } from "lucide-react";
|
||||||
import { ThreadList, type ThreadItem } from "@/components/threads/ThreadList";
|
import { ThreadList, type ThreadItem } from "@/components/threads/ThreadList";
|
||||||
|
import { useCompanyScope, useScopeEffect, useCompanyName } from "@/lib/company-scope";
|
||||||
|
import { listRisks, type RiskEvent } from "@/lib/risks";
|
||||||
|
import { listTasks } from "@/lib/api-v2";
|
||||||
|
import { listMajorEvents } from "@/lib/api-v2";
|
||||||
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
|
import { EmptyState } from "@/components/shared/EmptyState";
|
||||||
|
|
||||||
|
/** 任务项。 */
|
||||||
|
interface TaskItem {
|
||||||
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
|
title: string;
|
||||||
|
status?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 重大事项项。 */
|
||||||
|
interface MajorEventItem {
|
||||||
|
id: string;
|
||||||
|
company_id?: string;
|
||||||
|
event_type: string;
|
||||||
|
title: string;
|
||||||
|
}
|
||||||
|
|
||||||
/** 决策线程列表页面。 */
|
/** 决策线程列表页面。 */
|
||||||
export default function ThreadsPage() {
|
export default function ThreadsPage() {
|
||||||
const threads: ThreadItem[] = [
|
const { companyName } = useCompanyScope();
|
||||||
{ id: "thread-001", title: "云栈数据 A+轮融资时机选择", company: "云栈数据", status: "analyzing", updatedAt: "2026-07-12", riskCount: 2 },
|
const getCompanyName = useCompanyName();
|
||||||
{ id: "thread-002", title: "深瞳智能 CTO retention 策略", company: "深瞳智能", status: "identified", updatedAt: "2026-07-10", riskCount: 1 },
|
const [threads, setThreads] = useState<ThreadItem[]>([]);
|
||||||
{ id: "thread-003", title: "量子芯微 融资策略:天使+ vs Pre-A", company: "量子芯微", status: "acted", updatedAt: "2026-07-14", riskCount: 3 },
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
{ id: "thread-004", title: "智链科技 客户流失干预方案", company: "智链科技", status: "closed", updatedAt: "2026-06-28", riskCount: 1 },
|
|
||||||
];
|
useScopeEffect(() => {
|
||||||
|
Promise.all([
|
||||||
|
listRisks({ page_size: 50 }),
|
||||||
|
listTasks(),
|
||||||
|
listMajorEvents(),
|
||||||
|
])
|
||||||
|
.then(([risksResp, tasksResp, eventsResp]) => {
|
||||||
|
const risks = (risksResp.data?.items as RiskEvent[]) ?? [];
|
||||||
|
const tasks = (tasksResp.data as TaskItem[]) ?? [];
|
||||||
|
const events = (eventsResp.data as MajorEventItem[]) ?? [];
|
||||||
|
|
||||||
|
// 将风险、任务、事件组合为决策线程
|
||||||
|
const combined: ThreadItem[] = [];
|
||||||
|
|
||||||
|
// 风险 → 线程
|
||||||
|
risks.forEach((risk) => {
|
||||||
|
combined.push({
|
||||||
|
id: `risk-${risk.id}`,
|
||||||
|
title: risk.title,
|
||||||
|
company: getCompanyName(risk.company_id),
|
||||||
|
status: risk.status === "closed" ? "closed" : risk.status === "in_progress" ? "acted" : risk.status === "assigned" ? "identified" : "analyzing",
|
||||||
|
updatedAt: risk.updated_at?.slice(0, 10) ?? "",
|
||||||
|
riskCount: 1,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 重大事项 → 线程
|
||||||
|
events.forEach((event) => {
|
||||||
|
combined.push({
|
||||||
|
id: `event-${event.id}`,
|
||||||
|
title: event.title,
|
||||||
|
company: getCompanyName(event.company_id),
|
||||||
|
status: "identified",
|
||||||
|
updatedAt: "",
|
||||||
|
riskCount: 0,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 任务 → 线程
|
||||||
|
tasks.forEach((task) => {
|
||||||
|
combined.push({
|
||||||
|
id: `task-${task.id}`,
|
||||||
|
title: task.title,
|
||||||
|
company: getCompanyName(task.company_id),
|
||||||
|
status: task.status === "completed" ? "closed" : task.status === "in_progress" ? "acted" : "identified",
|
||||||
|
updatedAt: "",
|
||||||
|
riskCount: 0,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
setThreads(combined.slice(0, 20));
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setThreads([]);
|
||||||
|
})
|
||||||
|
.finally(() => setIsLoading(false));
|
||||||
|
});
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<GitBranch className="text-[var(--investor-primary)]" size={24} />
|
<GitBranch className="text-[var(--investor-primary)]" size={24} />
|
||||||
<h1 className="text-2xl font-bold">决策线程</h1>
|
<h1 className="text-2xl font-bold">
|
||||||
|
决策线程{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
||||||
@@ -27,7 +108,13 @@ export default function ThreadsPage() {
|
|||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ThreadList threads={threads} />
|
{isLoading ? (
|
||||||
|
<LoadingSpinner />
|
||||||
|
) : threads.length === 0 ? (
|
||||||
|
<EmptyState description="暂无决策线程" />
|
||||||
|
) : (
|
||||||
|
<ThreadList threads={threads} />
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,9 +1,16 @@
|
|||||||
/** 今日行动中心 — 投后负责人/投资经理默认首页。 */
|
/** 今日行动中心 — 投后负责人/投资经理默认首页,数据来自后端 API。 */
|
||||||
|
|
||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
|
import { useState } from "react";
|
||||||
import { CalendarClock, Sparkles, AlertTriangle, Eye, TrendingUp, Clock, CheckCircle2, ArrowRight } from "lucide-react";
|
import { CalendarClock, Sparkles, AlertTriangle, Eye, TrendingUp, Clock, CheckCircle2, ArrowRight } from "lucide-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import { useCompanyScope, useScopeEffect, useCompanyName } from "@/lib/company-scope";
|
||||||
|
import { listRisks, type RiskEvent } from "@/lib/risks";
|
||||||
|
import { listWeakSignals } from "@/lib/api-v2";
|
||||||
|
import { listSynergies } from "@/lib/api-v2";
|
||||||
|
import { listReports, type MonthlyReport } from "@/lib/reports";
|
||||||
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
|
|
||||||
/** 优先级行动项。 */
|
/** 优先级行动项。 */
|
||||||
interface ActionItem {
|
interface ActionItem {
|
||||||
@@ -32,38 +39,139 @@ const PRIORITY_LABELS: Record<ActionItem["priority"], string> = {
|
|||||||
|
|
||||||
/** 今日行动中心页面。 */
|
/** 今日行动中心页面。 */
|
||||||
export default function TodayPage() {
|
export default function TodayPage() {
|
||||||
const mustHandle: ActionItem[] = [
|
const { companyName } = useCompanyScope();
|
||||||
{ title: "现金 Runway 不足 7 月,需启动融资", company: "量子芯微", priority: "critical", confidence: 0.92, dueDate: "3 天内", href: "/risks" },
|
const getCompanyName = useCompanyName();
|
||||||
{ title: "客户流失率连续 2 月上升", company: "智链科技", priority: "high", confidence: 0.85, href: "/risks" },
|
const [isLoading, setIsLoading] = useState(true);
|
||||||
{ title: "营收增长停滞,需突破策略", company: "云栈数据", priority: "high", confidence: 0.78, href: "/risks" },
|
const [mustHandle, setMustHandle] = useState<ActionItem[]>([]);
|
||||||
{ title: "月报逾期未提交", company: "量子芯微", priority: "high", confidence: 1.0, dueDate: "已逾期 3 天", href: "/reports" },
|
const [watchItems, setWatchItems] = useState<ActionItem[]>([]);
|
||||||
];
|
const [growthItems, setGrowthItems] = useState<ActionItem[]>([]);
|
||||||
|
const [waitingItems, setWaitingItems] = useState<ActionItem[]>([]);
|
||||||
|
const [completedItems, setCompletedItems] = useState<ActionItem[]>([]);
|
||||||
|
|
||||||
const watchItems: ActionItem[] = [
|
useScopeEffect(() => {
|
||||||
{ title: "竞品发布类似产品,市场份额可能受挤压", company: "深瞳智能", priority: "medium", confidence: 0.65, href: "/weak-signals" },
|
Promise.all([
|
||||||
{ title: "CTO 技术路线分歧弱信号", company: "深瞳智能", priority: "medium", confidence: 0.58, href: "/weak-signals" },
|
listRisks({ page_size: 50 }),
|
||||||
];
|
listWeakSignals(),
|
||||||
|
listSynergies(),
|
||||||
|
listReports(),
|
||||||
|
])
|
||||||
|
.then(([risksResp, weakResp, synergyResp, reportsResp]) => {
|
||||||
|
const risks = (risksResp.data?.items as RiskEvent[]) ?? [];
|
||||||
|
const weakSignals = (weakResp.data as Record<string, unknown>[]) ?? [];
|
||||||
|
const synergies = (synergyResp.data as Record<string, unknown>[]) ?? [];
|
||||||
|
const reports = (reportsResp.data?.items as MonthlyReport[]) ?? [];
|
||||||
|
|
||||||
const growthItems: ActionItem[] = [
|
// 风险 → 必须处理/建议关注
|
||||||
{ title: "智链科技 × 云栈数据供应链协同机会", company: "智链科技", priority: "medium", confidence: 0.72, href: "/synergies" },
|
const must: ActionItem[] = [];
|
||||||
{ title: "光合生物半导体验证进展,可加速商业化", company: "光合生物", priority: "low", confidence: 0.68, href: "/milestones" },
|
const watch: ActionItem[] = [];
|
||||||
];
|
const completed: ActionItem[] = [];
|
||||||
|
const waiting: ActionItem[] = [];
|
||||||
|
const growth: ActionItem[] = [];
|
||||||
|
|
||||||
const waitingItems: ActionItem[] = [
|
risks.forEach((risk) => {
|
||||||
{ title: "等待创始人提交修正后月报", company: "云栈数据", priority: "medium", confidence: 1.0, href: "/reports" },
|
const item: ActionItem = {
|
||||||
{ title: "等待董事会决议确认", company: "智链科技", priority: "low", confidence: 1.0, href: "/board" },
|
title: risk.title,
|
||||||
];
|
company: getCompanyName(risk.company_id),
|
||||||
|
priority: risk.severity === "critical" ? "critical" : risk.severity === "high" ? "high" : risk.severity === "medium" ? "medium" : "low",
|
||||||
|
confidence: 0.9,
|
||||||
|
dueDate: risk.due_at?.slice(0, 10),
|
||||||
|
href: "/risks",
|
||||||
|
};
|
||||||
|
if (risk.status === "closed") {
|
||||||
|
item.priority = "low";
|
||||||
|
completed.push(item);
|
||||||
|
} else if (item.priority === "critical" || item.priority === "high") {
|
||||||
|
must.push(item);
|
||||||
|
} else {
|
||||||
|
watch.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const completedItems: ActionItem[] = [
|
// 弱信号 → 建议关注
|
||||||
{ title: "审阅智链科技月报", company: "智链科技", priority: "low", confidence: 1.0, href: "/reports" },
|
weakSignals.forEach((ws) => {
|
||||||
];
|
watch.push({
|
||||||
|
title: (ws.signal_type as string) || "弱信号",
|
||||||
|
company: getCompanyName(ws.company_id as string),
|
||||||
|
priority: "medium",
|
||||||
|
confidence: 0.6,
|
||||||
|
href: "/weak-signals",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 月报状态 → 行动项
|
||||||
|
reports.forEach((report) => {
|
||||||
|
const period = `${report.period_year}-${String(report.period_month).padStart(2, "0")}`;
|
||||||
|
if (report.status === "draft") {
|
||||||
|
must.push({
|
||||||
|
title: `月报 ${period} 待提交`,
|
||||||
|
company: getCompanyName(report.company_id),
|
||||||
|
priority: "medium",
|
||||||
|
confidence: 1.0,
|
||||||
|
href: "/reports",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (report.status === "submitted" || report.status === "ai_parsed") {
|
||||||
|
waiting.push({
|
||||||
|
title: `等待审阅月报 ${period}`,
|
||||||
|
company: getCompanyName(report.company_id),
|
||||||
|
priority: "medium",
|
||||||
|
confidence: 1.0,
|
||||||
|
href: "/reports",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// 协同 → 增长机会
|
||||||
|
synergies.forEach((sy) => {
|
||||||
|
growth.push({
|
||||||
|
title: (sy.description as string) || "协同机会",
|
||||||
|
company: getCompanyName(sy.company_id as string),
|
||||||
|
priority: "medium",
|
||||||
|
confidence: 0.7,
|
||||||
|
href: "/synergies",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
setMustHandle(must);
|
||||||
|
setWatchItems(watch);
|
||||||
|
setGrowthItems(growth);
|
||||||
|
setWaitingItems(waiting);
|
||||||
|
setCompletedItems(completed);
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
setMustHandle([]);
|
||||||
|
setWatchItems([]);
|
||||||
|
setGrowthItems([]);
|
||||||
|
setWaitingItems([]);
|
||||||
|
setCompletedItems([]);
|
||||||
|
})
|
||||||
|
.finally(() => setIsLoading(false));
|
||||||
|
});
|
||||||
|
|
||||||
|
if (isLoading) {
|
||||||
|
return (
|
||||||
|
<div className="space-y-6">
|
||||||
|
<div className="flex items-center justify-between">
|
||||||
|
<div className="flex items-center gap-2">
|
||||||
|
<CalendarClock className="text-[var(--investor-primary)]" size={24} />
|
||||||
|
<h1 className="text-2xl font-bold">
|
||||||
|
今日行动中心{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<LoadingSpinner />
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="space-y-6">
|
<div className="space-y-6">
|
||||||
<div className="flex items-center justify-between">
|
<div className="flex items-center justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<CalendarClock className="text-[var(--investor-primary)]" size={24} />
|
<CalendarClock className="text-[var(--investor-primary)]" size={24} />
|
||||||
<h1 className="text-2xl font-bold">今日行动中心</h1>
|
<h1 className="text-2xl font-bold">
|
||||||
|
今日行动中心{companyName ? ` — ${companyName}` : ""}
|
||||||
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
<Link
|
<Link
|
||||||
href="/risks"
|
href="/risks"
|
||||||
@@ -75,16 +183,18 @@ export default function TodayPage() {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* 1. AI 早报 */}
|
{/* 1. AI 早报 */}
|
||||||
<div className="rounded-lg border bg-gradient-to-r from-indigo-50 to-blue-50 p-4 shadow-sm">
|
{mustHandle.length > 0 && (
|
||||||
<div className="mb-2 flex items-center gap-2">
|
<div className="rounded-lg border bg-gradient-to-r from-indigo-50 to-blue-50 p-4 shadow-sm">
|
||||||
<Sparkles className="text-indigo-500" size={18} aria-hidden="true" />
|
<div className="mb-2 flex items-center gap-2">
|
||||||
<h2 className="text-sm font-medium text-indigo-700">AI 早报</h2>
|
<Sparkles className="text-indigo-500" size={18} aria-hidden="true" />
|
||||||
|
<h2 className="text-sm font-medium text-indigo-700">AI 早报</h2>
|
||||||
|
</div>
|
||||||
|
<p className="text-sm text-gray-700">
|
||||||
|
当前有 {mustHandle.length} 项待处理事项,{watchItems.length} 项建议关注,
|
||||||
|
{growthItems.length} 项增长机会。建议优先处理紧急风险。
|
||||||
|
</p>
|
||||||
</div>
|
</div>
|
||||||
<p className="text-sm text-gray-700">
|
)}
|
||||||
自上次登录后:量子芯微健康度下降 5 分(Runway 7 月),智链科技客户流失率连续 2 月上升,
|
|
||||||
深瞳智能 CTO 出现技术路线分歧弱信号。建议优先处理量子芯微融资问题。
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{/* 2. 必须处理 */}
|
{/* 2. 必须处理 */}
|
||||||
<ActionSection
|
<ActionSection
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { useState } from "react";
|
import { useState } from "react";
|
||||||
import { useScopeEffect } from "@/lib/company-scope";
|
import { useScopeEffect } from "@/lib/company-scope";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
import { listWeakSignals } from "@/lib/api-v2";
|
import { listWeakSignals } from "@/lib/api-v2";
|
||||||
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
import { PageContainer, Badge} from "@/components/shared/PageContainer";
|
||||||
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
import { LoadingSpinner } from "@/components/shared/LoadingSpinner";
|
||||||
@@ -9,6 +10,7 @@ import { EmptyState } from "@/components/shared/EmptyState";
|
|||||||
|
|
||||||
/** 弱信号项。 */
|
/** 弱信号项。 */
|
||||||
interface WeakSignal {
|
interface WeakSignal {
|
||||||
|
company_id?: string;
|
||||||
signal_type: string;
|
signal_type: string;
|
||||||
content: string;
|
content: string;
|
||||||
confidence: number;
|
confidence: number;
|
||||||
@@ -45,6 +47,7 @@ export default function WeakSignalsPage() {
|
|||||||
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
<table className="min-w-full divide-y divide-gray-200 text-sm">
|
||||||
<thead className="bg-gray-50">
|
<thead className="bg-gray-50">
|
||||||
<tr>
|
<tr>
|
||||||
|
<th className="px-4 py-2 text-left font-medium text-gray-500">企业</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">类型</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">类型</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">内容</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">内容</th>
|
||||||
<th className="px-4 py-2 text-left font-medium text-gray-500">置信度</th>
|
<th className="px-4 py-2 text-left font-medium text-gray-500">置信度</th>
|
||||||
@@ -55,6 +58,7 @@ export default function WeakSignalsPage() {
|
|||||||
<tbody className="divide-y divide-gray-100 bg-white">
|
<tbody className="divide-y divide-gray-100 bg-white">
|
||||||
{items.map((item, i) => (
|
{items.map((item, i) => (
|
||||||
<tr key={i}>
|
<tr key={i}>
|
||||||
|
<td className="px-4 py-2"><CompanyNameTag companyId={item.company_id} /></td>
|
||||||
<td className="px-4 py-2">
|
<td className="px-4 py-2">
|
||||||
<Badge color="blue">{SIGNAL_TYPE_LABELS[item.signal_type] ?? item.signal_type}</Badge>
|
<Badge color="blue">{SIGNAL_TYPE_LABELS[item.signal_type] ?? item.signal_type}</Badge>
|
||||||
</td>
|
</td>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { Target, ArrowRight, DollarSign, Users, Trophy } from "lucide-react";
|
import { Target, ArrowRight, DollarSign, Users, Trophy } from "lucide-react";
|
||||||
|
import { CompanyNameTag } from "@/components/shared/CompanyNameTag";
|
||||||
|
|
||||||
/** 决策链节点。 */
|
/** 决策链节点。 */
|
||||||
interface DecisionChainNode {
|
interface DecisionChainNode {
|
||||||
@@ -16,6 +17,7 @@ interface CompetitiveAnalysis {
|
|||||||
|
|
||||||
/** 客户获取方案。 */
|
/** 客户获取方案。 */
|
||||||
interface CustomerPlanData {
|
interface CustomerPlanData {
|
||||||
|
company_id?: string;
|
||||||
target_customer?: string;
|
target_customer?: string;
|
||||||
execution_status?: string;
|
execution_status?: string;
|
||||||
entry_angle?: string;
|
entry_angle?: string;
|
||||||
@@ -40,6 +42,7 @@ export function PlanCard({ plan }: { plan: CustomerPlanData }) {
|
|||||||
<div className="flex items-start justify-between">
|
<div className="flex items-start justify-between">
|
||||||
<div className="flex items-center gap-2">
|
<div className="flex items-center gap-2">
|
||||||
<Target size={18} className="text-[var(--investor-primary)]" />
|
<Target size={18} className="text-[var(--investor-primary)]" />
|
||||||
|
<CompanyNameTag companyId={plan.company_id} />
|
||||||
<h3 className="text-sm font-medium">{plan.target_customer || "未指定目标客户"}</h3>
|
<h3 className="text-sm font-medium">{plan.target_customer || "未指定目标客户"}</h3>
|
||||||
</div>
|
</div>
|
||||||
<span className={`rounded px-2 py-0.5 text-xs ${plan.execution_status ? (statusColors[plan.execution_status] || "bg-muted") : "bg-muted"}`}>
|
<span className={`rounded px-2 py-0.5 text-xs ${plan.execution_status ? (statusColors[plan.execution_status] || "bg-muted") : "bg-muted"}`}>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"use client";
|
"use client";
|
||||||
|
|
||||||
import { AlertTriangle, Trash2 } from "lucide-react";
|
import { AlertTriangle, Trash2, Building2 } from "lucide-react";
|
||||||
import {
|
import {
|
||||||
RISK_STATUS_LABELS,
|
RISK_STATUS_LABELS,
|
||||||
RISK_STATUS_COLORS,
|
RISK_STATUS_COLORS,
|
||||||
@@ -9,6 +9,7 @@ import {
|
|||||||
RISK_TYPE_LABELS,
|
RISK_TYPE_LABELS,
|
||||||
type RiskEvent,
|
type RiskEvent,
|
||||||
} from "@/lib/risks";
|
} from "@/lib/risks";
|
||||||
|
import { useCompanyName } from "@/lib/company-scope";
|
||||||
|
|
||||||
/** 风险卡片组件 — 从风险工作台抽取的独立组件。 */
|
/** 风险卡片组件 — 从风险工作台抽取的独立组件。 */
|
||||||
|
|
||||||
@@ -22,6 +23,7 @@ interface RiskCardProps {
|
|||||||
* 风险事件卡片。
|
* 风险事件卡片。
|
||||||
*/
|
*/
|
||||||
export function RiskCard({ risk, onStatusChange, onDelete }: RiskCardProps) {
|
export function RiskCard({ risk, onStatusChange, onDelete }: RiskCardProps) {
|
||||||
|
const getCompanyName = useCompanyName();
|
||||||
return (
|
return (
|
||||||
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
<div className="rounded-lg border bg-white p-4 shadow-sm">
|
||||||
<div className="flex items-start justify-between">
|
<div className="flex items-start justify-between">
|
||||||
@@ -38,6 +40,9 @@ export function RiskCard({ risk, onStatusChange, onDelete }: RiskCardProps) {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div className="mt-2 flex gap-3 text-xs text-muted-foreground">
|
<div className="mt-2 flex gap-3 text-xs text-muted-foreground">
|
||||||
|
<span className="flex items-center gap-1 font-medium text-[var(--investor-primary)]">
|
||||||
|
<Building2 size={12} aria-hidden="true" />{getCompanyName(risk.company_id)}
|
||||||
|
</span>
|
||||||
<span>{RISK_TYPE_LABELS[risk.type] || risk.type}</span>
|
<span>{RISK_TYPE_LABELS[risk.type] || risk.type}</span>
|
||||||
<span className={SEVERITY_COLORS[risk.severity]}>
|
<span className={SEVERITY_COLORS[risk.severity]}>
|
||||||
严重度: {SEVERITY_LABELS[risk.severity] || risk.severity}
|
严重度: {SEVERITY_LABELS[risk.severity] || risk.severity}
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { Building2 } from "lucide-react";
|
||||||
|
import { useCompanyName } from "@/lib/company-scope";
|
||||||
|
|
||||||
|
/** 企业名标签 — 在数据项旁显示所属企业名。 */
|
||||||
|
export function CompanyNameTag({ companyId, className = "" }: { companyId?: string | null; className?: string }) {
|
||||||
|
const getCompanyName = useCompanyName();
|
||||||
|
return (
|
||||||
|
<span className={`inline-flex items-center gap-1 text-xs font-medium text-[var(--investor-primary)] ${className}`}>
|
||||||
|
<Building2 size={12} aria-hidden="true" />
|
||||||
|
{getCompanyName(companyId)}
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
}
|
||||||
@@ -107,3 +107,17 @@ export function useScopeEffect(callback: () => void, deps: unknown[] = []) {
|
|||||||
}, [companyId, ...deps]);
|
}, [companyId, ...deps]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据企业 ID 查找企业名称。
|
||||||
|
*
|
||||||
|
* 在"全部企业"模式下,各页面数据项需要显示所属企业名,
|
||||||
|
* 此 hook 利用 Context 中已加载的企业列表进行映射。
|
||||||
|
*/
|
||||||
|
export function useCompanyName(): (companyId: string | undefined | null) => string {
|
||||||
|
const { companies } = useCompanyScope();
|
||||||
|
return (companyId: string | undefined | null) => {
|
||||||
|
if (!companyId) return "—";
|
||||||
|
return companies.find((c) => c.id === companyId)?.name ?? companyId.slice(0, 8);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,712 @@
|
|||||||
|
# 投后经理绩效管理方案
|
||||||
|
|
||||||
|
> 核心理念:投后管理不是成本中心,而是投资回报的驱动力。绩效直接挂钩基金收益分配。
|
||||||
|
> 更新时间:2025-08-07
|
||||||
|
> 状态:草案 v1.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、总则
|
||||||
|
|
||||||
|
### 1.1 方案目标
|
||||||
|
|
||||||
|
将投后经理的绩效管理与基金投资回报直接绑定,通过设立**绩效池**机制,让投后团队的收入与企业增长、风险规避、组合协同等实际贡献挂钩,驱动投后管理从"被动跟进"转向"主动创造价值"。
|
||||||
|
|
||||||
|
### 1.2 适用范围
|
||||||
|
|
||||||
|
| 角色 | 适用性 | 考核侧重 |
|
||||||
|
|---|---|---|
|
||||||
|
| 投后经理 | 全量适用 | 企业健康度改善、风险闭环率、赋能协同贡献 |
|
||||||
|
| 投后负责人 | 全量适用 | 组合级指标、团队管理、Alpha 归因总量 |
|
||||||
|
| 投资经理(兼投后) | 按投后职责部分适用 | 仅考核投后相关维度 |
|
||||||
|
|
||||||
|
### 1.3 评估周期
|
||||||
|
|
||||||
|
| 周期 | 用途 | 数据来源 |
|
||||||
|
|---|---|---|
|
||||||
|
| 月度 | 绩效看板自动更新,不直接挂钩分配 | 系统自动采集 |
|
||||||
|
| 季度 | QBR 回顾,绩效得分校准,预分配比例调整 | 系统 + 人工校准 |
|
||||||
|
| 年度 | 绩效池结算,实际分配兑现 | 系统汇总 + 委员会评审 |
|
||||||
|
|
||||||
|
### 1.4 核心公式
|
||||||
|
|
||||||
|
```
|
||||||
|
个人绩效分配 = 绩效池总额 × 个人绩效份额
|
||||||
|
|
||||||
|
个人绩效份额 = (个人绩效得分 / 团队绩效得分总和) × 调节系数
|
||||||
|
|
||||||
|
个人绩效得分 = Σ(各维度得分 × 维度权重) × Alpha 调节因子
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、绩效池机制
|
||||||
|
|
||||||
|
### 2.1 绩效池来源
|
||||||
|
|
||||||
|
绩效池从基金收益中提取,分两种模式:
|
||||||
|
|
||||||
|
| 模式 | 来源 | 提取比例(建议) | 适用场景 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Carry 模式** | 基金超额收益(Carry) | Carry 总额的 10%-20% | 有 Carry 分配权的基金 |
|
||||||
|
| **管理费模式** | 年度管理费 | 管理费的 5%-8% | 无 Carry 或早期基金 |
|
||||||
|
|
||||||
|
### 2.2 绩效池规模示例
|
||||||
|
|
||||||
|
假设基金规模 10 亿,Carry 20%(2 亿),投后团队 Carry 分成 15%:
|
||||||
|
|
||||||
|
```
|
||||||
|
绩效池 = 2 亿 × 15% = 3,000 万
|
||||||
|
```
|
||||||
|
|
||||||
|
按 5 年存续期分摊,年均绩效池约 600 万。
|
||||||
|
|
||||||
|
### 2.3 绩效池分配规则
|
||||||
|
|
||||||
|
1. **基础门槛**:个人绩效得分 ≥ 60 分方可参与分配
|
||||||
|
2. **分段分配**:
|
||||||
|
- 60-69 分:按基准份额的 50% 分配
|
||||||
|
- 70-84 分:按基准份额的 100% 分配
|
||||||
|
- 85-100 分:按基准份额的 150% 分配
|
||||||
|
3. **调节系数**:由投后负责人根据团队协作、特殊贡献等主观因素调整,范围 0.8-1.2
|
||||||
|
4. **未分配余额**:低于门槛的份额滚入下一年度绩效池
|
||||||
|
|
||||||
|
### 2.4 绩效池触发条件
|
||||||
|
|
||||||
|
| 条件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 基金已实现收益 | DPI > 0 或有退出事件发生 |
|
||||||
|
| 投后团队在职 | 考核期内在职满 6 个月 |
|
||||||
|
| 企业健康度可量化 | 负责企业至少有 3 期健康度评分 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、绩效指标体系
|
||||||
|
|
||||||
|
### 3.1 指标总览
|
||||||
|
|
||||||
|
八大维度,满分 100 分,各维度按权重加权:
|
||||||
|
|
||||||
|
| 维度 | 权重 | 核心问题 | 数据来源 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **D1 风险感知与响应** | 10% | 风险发现是否早、处理是否快 | OODA 循环 + 风险工作台 |
|
||||||
|
| **D2 企业健康度改善** | 10% | 负责的企业是否在变好 | 健康度评分趋势 |
|
||||||
|
| **D3 赋能与协同贡献** | 15% | 是否为被投企业带来了实际资源 | 协同机会中心 + Alpha 归因 |
|
||||||
|
| **D4 管理规范性与退出准备** | 10% | 月报/董事会/协议/退出准备/LP 沟通是否到位 | 月报管理 + 董事会 + 协议监控 + 退出管理 |
|
||||||
|
| **D5 被投企业价值增长** | 20% | 负责的企业估值涨了多少、IRR/MOIC/DPI 贡献多大 | 估值追踪 + 融资进展 + 退出信号 + 基金指标 |
|
||||||
|
| **D6 Alpha 归因贡献** | 15% | 管理动作是否真正创造了投资回报 | Alpha 归因分析 |
|
||||||
|
| **D7 被投企业满意度** | 15% | 被投企业 CEO/创始人对投后服务的评价 | 360 度评价 + NPS |
|
||||||
|
| **D8 知识积累与进化** | 5% | 是否将经验沉淀为可复用知识 | AAR + 知识图谱 |
|
||||||
|
|
||||||
|
### 3.2 D1 — 风险感知与响应(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 预警提前量 | 从弱信号首次出现到风险确认的天数 | ≥ 30 天 | >30天: 满分; 15-30天: 80%; <15天: 40% |
|
||||||
|
| OODA 循环耗时 | 从 Observe 到 Act 的平均周期 | ≤ 7 天 | ≤7天: 满分; 8-14天: 70%; >14天: 30% |
|
||||||
|
| 风险闭环率 | 已关闭风险 / 总风险数 | ≥ 90% | ≥90%: 满分; 70-89%: 70%; <70%: 30% |
|
||||||
|
| 风险升级率 | 红色风险 / 总风险数 | ≤ 10% | ≤10%: 满分; 11-20%: 60%; >20%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-27 指标越界自动预警
|
||||||
|
- P1-39~43 OODA 决策循环 + 决策延迟追踪
|
||||||
|
- P1-30 风险处理闭环
|
||||||
|
- P2-33~39 弱信号采集 + 关联引擎
|
||||||
|
|
||||||
|
### 3.3 D2 — 企业健康度改善(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 健康度趋势分 | 负责企业健康度年度变化值的加权平均 | > 0 | 上升: 满分; 持平: 60%; 下降: 20% |
|
||||||
|
| 红色企业转黄率 | 红色→黄色/绿色的企业占比 | ≥ 50% | ≥50%: 满分; 30-49%: 60%; <30%: 20% |
|
||||||
|
| 约束点突破数 | 负责企业中 TOC 约束点被突破的次数 | ≥ 2 次/年 | 按次数线性评分 |
|
||||||
|
| 企业存活率 | 负责企业未倒闭/未低价收购的比例 | ≥ 95% | ≥95%: 满分; 90-94%: 70%; <90%: 0% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-16~19 四维健康度评分 + 趋势
|
||||||
|
- P3-53 约束点识别(TOC)
|
||||||
|
- P3-47~55 健康度扩展 + 高级分析
|
||||||
|
- P3-67~68 流失风险预警 + 挽留流程
|
||||||
|
|
||||||
|
### 3.4 D3 — 赋能与协同贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起数 | 主动发起的协同机会数量 | ≥ 6 次/年 | 按数量线性评分 |
|
||||||
|
| 协同转化率 | 成功落地 / 发起总数 | ≥ 30% | ≥30%: 满分; 15-29%: 60%; <15%: 20% |
|
||||||
|
| 资源对接成功率 | 投资机构资源成功对接给企业的比例 | ≥ 40% | ≥40%: 满分; 20-39%: 60%; <20%: 20% |
|
||||||
|
| 客户增长贡献 | 通过投后引入的客户为企业带来的收入 | 可量化 | 按金额分段评分 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P3-01~07 协同机会中心 + 闭环管理
|
||||||
|
- P3-16~19 客户增长引擎
|
||||||
|
- P3-11~15 人才引力场
|
||||||
|
- P4-01~04 Alpha 归因(干预事件→指标变化→回报贡献)
|
||||||
|
|
||||||
|
### 3.5 D4 — 管理规范性与退出准备(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报及时率 | 按时收齐月报的企业 / 负责企业总数 | ≥ 95% | ≥95%: 满分; 85-94%: 70%; <85%: 30% |
|
||||||
|
| 董事会决议执行率 | 已执行决议 / 总决议数 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
| 协议条款响应率 | 协议预警在时限内响应的比例 | 100% | 100%: 满分; 90-99%: 60%; <90%: 0% |
|
||||||
|
| 退出准备完成度 | 财务规范/股权梳理/合规整改等退出准备项的完成率 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| LP 沟通质量 | LP 报告中负责企业部分的准确性和及时性 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-15 月报提交及时性追踪
|
||||||
|
- P2-21~26 董事会管理 + 决议追踪
|
||||||
|
- P2-14~20 投资协议解析 + 条款监控
|
||||||
|
- P2-08~13 财务数据接入与校验 + 可信度评分
|
||||||
|
- P4-05~08 退出时机预测 + 退出路径准备清单
|
||||||
|
- LP 报告自动生成模块(系统规划功能)
|
||||||
|
|
||||||
|
### 3.6 D5 — 被投企业价值增长(20%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 估值增长率 | 负责企业年度估值加权平均增长率(按阶段差异化目标) | 见阶段差异化表 | 按阶段目标对比评分 |
|
||||||
|
| 项目 IRR | 负责企业的费后内部收益率 | ≥ 15% | ≥15%: 满分; 8-14%: 70%; <8%: 30% |
|
||||||
|
| MOIC | 负责企业的现金回报倍数(累计回款+当前公允价值)/投资成本 | ≥ 2x | ≥3x: 满分; 2-3x: 70%; 1-2x: 40%; <1x: 10% |
|
||||||
|
| DPI 贡献 | 负责企业已实现回款 / 投资成本 | 可量化 | 按回报金额分段评分 |
|
||||||
|
| 融资推进成功率 | 负责企业成功完成下一轮融资的比例 | ≥ 60% | ≥60%: 满分; 40-59%: 70%; <40%: 30% |
|
||||||
|
| 退出信号强度 | 企业退出路径明确度(IPO/并购/二级) | 可量化 | 系统退出路径计算评分 × 企业数加权 |
|
||||||
|
| 估值折损企业数 | 负责企业中估值下降(Down Round)的数量 | 0 | 0: 满分; 1: 50%; ≥2: 0% |
|
||||||
|
|
||||||
|
#### 阶段差异化目标值
|
||||||
|
|
||||||
|
| 企业阶段 | 估值增长率目标 | IRR 目标 | MOIC 目标 | 说明 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Seed / 天使 | ≥ 50% | ≥ 20% | ≥ 2x | 早期增长快,估值波动大 |
|
||||||
|
| Series A / 早期 | ≥ 40% | ≥ 18% | ≥ 2x | 商业模式验证期 |
|
||||||
|
| Series B / 成长期 | ≥ 30% | ≥ 15% | ≥ 2x | 规模化扩张期 |
|
||||||
|
| Series C+ / 扩张期 | ≥ 20% | ≥ 12% | ≥ 1.5x | 增长趋稳,看盈利能力 |
|
||||||
|
| Pre-IPO / 成熟期 | ≥ 10% | ≥ 10% | ≥ 1.5x | 退出导向,看确定性 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P2-40~46 融资与资本健康度(当前估值、融资进展、股权结构、退出可能性)
|
||||||
|
- P4-05~08 退出时机预测(退出路径计算、时机窗口、期望收益对比)
|
||||||
|
- P4-09~11 组合层面资源再分配(边际回报率、IRR/DPI 影响模拟)
|
||||||
|
- P4-12~15 Monte Carlo 组合模拟(基础/乐观/悲观情景、回报驱动因素)
|
||||||
|
- 财务系统:投资成本、累计回款、公允价值、费后 IRR、MOIC、DPI
|
||||||
|
|
||||||
|
#### 价值增长链路
|
||||||
|
|
||||||
|
```
|
||||||
|
被投企业价值增长 = 估值变化 + 融资进展 + 退出准备 + 基金回报指标
|
||||||
|
↓ ↓ ↓ ↓ ↓
|
||||||
|
估值模型追踪 轮次/估值 退出路径评分 IRR/MOIC DPI 贡献
|
||||||
|
(系统记录) (系统记录) (AI 计算) (财务系统) (已实现回款)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 评分示例
|
||||||
|
|
||||||
|
> 投后经理 A 负责 5 家企业(2 家 Series A、2 家 Series B、1 家 Pre-IPO),其中 2 家完成下一轮融资(估值平均增长 42%),1 家 IPO 预备中,2 家估值持平。加权估值增长率 28%(对比阶段目标 34%,完成率 82%),项目 IRR 16%,MOIC 2.3x,融资推进成功率 40%,退出信号强度评分 75,估值折损 0 家。D5 得分 = 82 × 25% + 100 × 20% + 70 × 15% + 85 × 15% + 70 × 15% + 75 × 10% + 100 × 10% = 84.0
|
||||||
|
|
||||||
|
### 3.7 D6 — Alpha 归因贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Alpha 贡献事件数 | 被归因系统识别为"有效管理动作"的事件数 | ≥ 5 次/年 | 按数量线性评分 |
|
||||||
|
| Alpha 贡献金额 | 管理动作带来的估值增量 × 持股比例 | 可量化 | 按金额分段评分 |
|
||||||
|
| 负 Alpha 事件数 | 管理动作被归因为"无效或有害"的事件数 | 0 | 0: 满分; 1-2: 50%; >2: 0% |
|
||||||
|
| 干预记录完整率 | 有完整干预记录的事件 / 总干预事件 | ≥ 90% | ≥90%: 满分; 70-89%: 50%; <70%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-01 干预事件记录
|
||||||
|
- P4-02 指标变化追踪
|
||||||
|
- P4-03 Alpha 归因分析(干预事件→指标变化→估值影响→回报贡献)
|
||||||
|
- P4-04 归因结果查看
|
||||||
|
|
||||||
|
#### Alpha 归因链路
|
||||||
|
|
||||||
|
```
|
||||||
|
投后干预事件 → 企业指标变化 → 估值影响 → 回报贡献
|
||||||
|
↓ ↓ ↓ ↓
|
||||||
|
人才推荐 人效提升 估值上调 Alpha = 估值增量 × 持股比例
|
||||||
|
客户引入 收入增长
|
||||||
|
战略建议 约束突破
|
||||||
|
融资支持 融资成功
|
||||||
|
风险干预 风险消除
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.8 D7 — 被投企业满意度(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO/创始人对投后经理服务的年度评分(1-5 分) | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度(被投企业评价) | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 投后 NPS | 被投企业净推荐值:愿意推荐该投资机构给其他创业者的比例 | ≥ 50 | ≥50: 满分; 30-49: 70%; 0-29: 40%; 负值: 10% |
|
||||||
|
| 主动性评价 | 被投企业对投后经理主动跟进频率和质量的评分 | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 关系持续性 | 被投企业在后续融资中是否愿意继续接受该投后经理服务 | 100% | 100%: 满分; 80-99%: 70%; <80%: 30% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- 系统发起的年度被投企业满意度调查(CEO 问卷 + 访谈)
|
||||||
|
- P3-67~68 流失风险预警(企业活跃度/数据共享减少/互动减少)
|
||||||
|
- P3-65 QBR 报告中企业反馈模块
|
||||||
|
- 协同机会中心中企业的确认/拒绝/沉默记录
|
||||||
|
|
||||||
|
#### 评价机制
|
||||||
|
|
||||||
|
采用 360 度评价机制,三方评价加权汇总:
|
||||||
|
|
||||||
|
| 评价方 | 权重 | 评价内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **被投企业 CEO/创始人** | 50% | 服务满意度、需求匹配度、主动性、NPS |
|
||||||
|
| **投后负责人 + 合伙人** | 30% | 专业能力、管理规范、团队协作、结果导向 |
|
||||||
|
| **投后经理自评** | 20% | 工作投入度、困难挑战、自我认知、改进计划 |
|
||||||
|
|
||||||
|
> 被投企业评价权重 50%,体现清科研究中心行业最佳实践建议:投后服务效果最终由被投企业感知,应作为最核心的评价维度。
|
||||||
|
|
||||||
|
#### 评价周期
|
||||||
|
|
||||||
|
- **季度微评**:每季度由被投企业 CEO 填写简短评价(3 题,2 分钟完成)
|
||||||
|
- **年度深评**:每年由系统发起完整满意度调查 + 投后负责人访谈
|
||||||
|
- **退出回评**:企业退出时由 CEO 填写完整回顾评价
|
||||||
|
|
||||||
|
### 3.9 D8 — 知识积累与进化(5%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 完成率 | 触发事件中完成 AAR 的比例 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 知识图谱贡献数 | 沉淀的最佳实践/案例数量 | ≥ 3 条/年 | 按数量线性评分 |
|
||||||
|
| AAR 改进执行率 | AAR 改进建议已执行的比例 | ≥ 70% | ≥70%: 满分; 50-69%: 50%; <50%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-30~33 AAR 系统化复盘
|
||||||
|
- P4-26~29 投后管理知识图谱
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、评分计算与调节
|
||||||
|
|
||||||
|
### 4.1 评分计算流程
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 系统自动采集各维度原始数据(月度)
|
||||||
|
步骤 2: 按评分规则转换为维度得分(0-100)
|
||||||
|
步骤 3: 加权计算个人绩效总分 = Σ(维度得分 × 权重)
|
||||||
|
步骤 4: 应用 Alpha 调节因子
|
||||||
|
步骤 5: 季度人工校准(投后负责人 + 合伙人)
|
||||||
|
步骤 6: 年度委员会评审确定最终得分和分配
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Alpha 调节因子
|
||||||
|
|
||||||
|
Alpha 调节因子基于 D6 维度的 Alpha 归因结果,对总分进行乘法调节:
|
||||||
|
|
||||||
|
| Alpha 贡献等级 | 条件 | 调节因子 |
|
||||||
|
|---|---|---|
|
||||||
|
| 卓越 | Alpha 贡献金额 > 1,000 万 | 1.3 |
|
||||||
|
| 优秀 | Alpha 贡献金额 500-1,000 万 | 1.15 |
|
||||||
|
| 良好 | Alpha 贡献金额 100-500 万 | 1.05 |
|
||||||
|
| 基准 | Alpha 贡献金额 < 100 万 | 1.0 |
|
||||||
|
| 负贡献 | 存在负 Alpha 事件 | 0.7-0.9 |
|
||||||
|
|
||||||
|
### 4.3 调节系数
|
||||||
|
|
||||||
|
投后负责人可在 0.8-1.2 范围内对每人进行主观调节,覆盖以下场景:
|
||||||
|
|
||||||
|
- **团队协作**:跨企业协同中的贡献(难以被个体指标捕获)
|
||||||
|
- **特殊贡献**:重大风险避免、关键人才保留等
|
||||||
|
- **新入职 ramp-up**:入职不满 1 年的投后经理可下调考核基准
|
||||||
|
- **组合复杂度**:负责企业数量多、阶段早、难度高的可适度上调
|
||||||
|
|
||||||
|
### 4.4 评分示例
|
||||||
|
|
||||||
|
```
|
||||||
|
投后经理 A:
|
||||||
|
D1 风险感知与响应: 85 × 10% = 8.50
|
||||||
|
D2 企业健康度改善: 78 × 10% = 7.80
|
||||||
|
D3 赋能与协同贡献: 72 × 15% = 10.80
|
||||||
|
D4 管理规范性与退出: 88 × 10% = 8.80
|
||||||
|
D5 被投企业价值增长: 84 × 20% = 16.80
|
||||||
|
D6 Alpha 归因贡献: 80 × 15% = 12.00
|
||||||
|
D7 被投企业满意度: 82 × 15% = 12.30
|
||||||
|
D8 知识积累: 75 × 5% = 3.75
|
||||||
|
--------------------------------
|
||||||
|
基础总分: 80.75
|
||||||
|
Alpha 调节因子: 1.15(优秀)
|
||||||
|
调节后总分: 92.86
|
||||||
|
调节系数: 1.05(组合复杂度高)
|
||||||
|
最终得分: 97.50
|
||||||
|
|
||||||
|
分配档位: 85-100 分 → 基准份额 × 150%
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、绩效等级与应用
|
||||||
|
|
||||||
|
### 5.1 绩效等级
|
||||||
|
|
||||||
|
| 等级 | 得分区间 | 分配倍率 | 含义 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| S | 85-100 | 150% | 卓越贡献,显著提升投资回报 |
|
||||||
|
| A | 70-84 | 100% | 达标且有一定亮点 |
|
||||||
|
| B | 60-69 | 50% | 基本达标,需改进 |
|
||||||
|
| C | < 60 | 0% | 未达标,不参与绩效池分配 |
|
||||||
|
|
||||||
|
### 5.2 绩效应用
|
||||||
|
|
||||||
|
| 应用项 | S 级 | A 级 | B 级 | C 级 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 绩效池分配 | 150% | 100% | 50% | 不分配 |
|
||||||
|
| 晋升资格 | 优先考虑 | 正常考虑 | 暂缓 | 不考虑 |
|
||||||
|
| 管理企业数上限 | 可增加 | 维持 | 维持 | 建议减少 |
|
||||||
|
| 培训资源 | 优先分配 | 正常 | 加强 | 强制培训 |
|
||||||
|
| 连续 2 年 C 级 | — | — | — | 调整岗位或退出 |
|
||||||
|
|
||||||
|
### 5.3 特殊奖励
|
||||||
|
|
||||||
|
除常规绩效池分配外,以下情况可申请额外奖励(从绩效池未分配余额中支出):
|
||||||
|
|
||||||
|
- **重大风险避免**:投后干预直接避免企业重大损失(如现金流断裂、核心团队集体离职)
|
||||||
|
- **重大协同落地**:推动 Portfolio 协同带来显著收入增长
|
||||||
|
- **退出贡献**:投后管理直接推动企业成功退出(IPO/并购)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、绩效面谈与改进
|
||||||
|
|
||||||
|
### 6.1 月度绩效看板
|
||||||
|
|
||||||
|
系统自动生成月度绩效看板,投后经理可随时查看:
|
||||||
|
|
||||||
|
- 各维度当前得分和趋势
|
||||||
|
- 负责企业的健康度变化
|
||||||
|
- 负责企业的估值变化趋势和 IRR/MOIC/DPI
|
||||||
|
- 风险闭环进度
|
||||||
|
- 协同推进状态
|
||||||
|
- Alpha 贡献事件列表
|
||||||
|
- 被投企业满意度季度微评结果
|
||||||
|
- 预估绩效分配金额(基于当前得分)
|
||||||
|
|
||||||
|
### 6.2 季度 QBR 联动
|
||||||
|
|
||||||
|
每季度结合系统 QBR 报告(P3-65)进行绩效面谈:
|
||||||
|
|
||||||
|
1. **数据回顾**:系统自动生成本季度绩效数据摘要
|
||||||
|
2. **归因分析**:讨论得分变化的原因(哪些管理动作有效/无效)
|
||||||
|
3. **目标校准**:调整下季度重点方向和目标值
|
||||||
|
4. **预分配通知**:告知当前预估分配比例(不具约束力)
|
||||||
|
|
||||||
|
### 6.3 年度评审
|
||||||
|
|
||||||
|
年度评审由投后负责人 + 合伙人 + HR 组成评审委员会:
|
||||||
|
|
||||||
|
1. **系统出具年度绩效报告**:汇总 12 个月数据,自动计算最终得分
|
||||||
|
2. **360 度评价汇总**:被投企业满意度调查结果 + 投后负责人评价 + 自评
|
||||||
|
3. **Alpha 归因总账**:汇总全年管理动作的 Alpha 贡献
|
||||||
|
4. **委员会评审**:审核系统评分,确认调节系数
|
||||||
|
5. **分配方案**:计算每人实际分配金额,报合伙人会议批准
|
||||||
|
6. **绩效面谈**:一对一沟通结果、改进方向和下年度目标
|
||||||
|
|
||||||
|
### 6.4 绩效改进计划
|
||||||
|
|
||||||
|
对 B 级和 C 级人员制定改进计划:
|
||||||
|
|
||||||
|
| 级别 | 改进措施 |
|
||||||
|
|---|---|
|
||||||
|
| B 级 | 识别短板维度,制定 3 个月改进目标,月度跟踪 |
|
||||||
|
| C 级 | 制定 6 个月绩效改进计划(PIP),月度评审,连续 2 次未改善则调整岗位 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、系统支撑
|
||||||
|
|
||||||
|
### 7.1 投资经理画像(P2-49)
|
||||||
|
|
||||||
|
系统已规划投资经理画像,本方案直接复用:
|
||||||
|
|
||||||
|
- **能力维度**:行业理解、财务分析、资源网络、风险判断
|
||||||
|
- **风格维度**:跟进频率、干预偏好、协同倾向
|
||||||
|
- **负责项目**:当前管理的企业列表和 AUM
|
||||||
|
- **跟进质量评分**:基于本方案八大维度自动计算
|
||||||
|
|
||||||
|
### 7.2 Alpha 归因系统(P4-01~04)
|
||||||
|
|
||||||
|
Alpha 归因是本方案的核心差异化——不只看"做了什么",更看"带来了什么回报":
|
||||||
|
|
||||||
|
```
|
||||||
|
干预事件 → 指标变化 → 估值影响 → 回报贡献
|
||||||
|
↑ ↑ ↑ ↑
|
||||||
|
投后经理 系统追踪 估值模型 量化归因
|
||||||
|
记录 自动 自动计算 AI 分析
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 AAR 复盘系统(P4-30~33)
|
||||||
|
|
||||||
|
AAR 不仅用于知识积累,也作为绩效评估的佐证:
|
||||||
|
|
||||||
|
- AAR 记录了"原计划→实际结果→差异原因→经验教训"
|
||||||
|
- 绩效面谈时引用 AAR 结论,避免主观争议
|
||||||
|
- AAR 改进执行率本身也是 D8 考核指标
|
||||||
|
|
||||||
|
### 7.4 知识图谱(P4-26~29)
|
||||||
|
|
||||||
|
投后管理知识图谱持续积累"管理动作→结果"的因果关系:
|
||||||
|
|
||||||
|
- 新企业进入时自动匹配最佳管理策略
|
||||||
|
- 投后经理可查询历史最佳实践
|
||||||
|
- 知识贡献度纳入 D8 考核
|
||||||
|
|
||||||
|
### 7.5 数据采集自动化
|
||||||
|
|
||||||
|
| 维度 | 自动采集比例 | 人工输入 |
|
||||||
|
|---|---|---|
|
||||||
|
| D1 风险感知与响应 | 100% | 无 |
|
||||||
|
| D2 企业健康度改善 | 100% | 无 |
|
||||||
|
| D3 赋能与协同贡献 | 90% | 协同效果评估需确认 |
|
||||||
|
| D4 管理规范性与退出准备 | 90% | 退出准备完成度需人工确认 |
|
||||||
|
| D5 被投企业价值增长 | 80% | 估值数据需融资事件确认 |
|
||||||
|
| D6 Alpha 归因贡献 | 80% | 干预事件需主动记录 |
|
||||||
|
| D7 被投企业满意度 | 40% | CEO 问卷 + 访谈需人工发起 |
|
||||||
|
| D8 知识积累 | 90% | 知识图谱贡献需主动提交 |
|
||||||
|
|
||||||
|
### 7.6 各维度数据支持明细
|
||||||
|
|
||||||
|
#### D1 风险感知与响应
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 弱信号首次出现时间 | 弱信号引擎检测到的首次异常时间戳 | P2-33~39 弱信号采集 + 关联引擎 | 自动 |
|
||||||
|
| 风险确认时间 | 风险从弱信号升级为确认风险的时间 | P1-27 指标越界自动预警 | 自动 |
|
||||||
|
| OODA 各阶段时间戳 | Observe → Orient → Decide → Act 每阶段时间 | P1-39~43 OODA 决策循环 | 自动 |
|
||||||
|
| 风险状态(开/闭环) | 每个风险的当前状态和关闭时间 | P1-30 风险处理闭环 | 自动 |
|
||||||
|
| 风险等级(红/黄/绿) | 风险分级记录 | 风险工作台 | 自动 |
|
||||||
|
|
||||||
|
#### D2 企业健康度改善
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 四维健康度评分 | 财务/运营/治理/成长四维评分及历史趋势 | P1-16~19 四维健康度评分 | 自动 |
|
||||||
|
| 健康度变化序列 | 每期评分对比,计算上升/持平/下降 | 健康度趋势模型 | 自动 |
|
||||||
|
| 约束点识别记录 | TOC 约束点位置及突破状态 | P3-53 约束点识别(TOC) | 自动 |
|
||||||
|
| 企业状态 | 存续/倒闭/被低价收购 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D3 赋能与协同贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起记录 | 发起时间、类型、目标企业、发起人 | P3-01~07 协同机会中心 | 自动 |
|
||||||
|
| 协同状态追踪 | 发起 → 推进 → 落地/失败全链路 | 协同闭环管理 | 自动 |
|
||||||
|
| 资源对接记录 | 机构资源对接给企业的记录及结果 | 协同机会中心 | 自动 |
|
||||||
|
| 客户引入金额 | 投后引入客户为企业带来的收入金额 | P3-16~19 客户增长引擎 | 自动 |
|
||||||
|
| 人才推荐记录 | 推荐人才及入职结果 | P3-11~15 人才引力场 | 自动 |
|
||||||
|
| 协同效果确认 | 落地后实际效果评估 | 人工确认 | **手动** |
|
||||||
|
|
||||||
|
#### D4 管理规范性与退出准备
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报提交时间戳 | 每家企业月报提交时间 vs 截止时间 | P1-15 月报提交及时性追踪 | 自动 |
|
||||||
|
| 董事会决议清单 | 决议内容、执行状态、执行时间 | P2-21~26 董事会管理 + 决议追踪 | 自动 |
|
||||||
|
| 协议条款预警 | 协议条款到期/违约预警及响应记录 | P2-14~20 投资协议解析 + 条款监控 | 自动 |
|
||||||
|
| 数据可信度评分 | 企业财务数据质量和可信度 | P2-08~13 财务数据接入与校验 | 自动 |
|
||||||
|
| 退出准备清单 | 财务规范/股权梳理/合规整改等准备项完成度 | P4-05~08 退出时机预测 + 准备清单 | 半自动 |
|
||||||
|
| LP 报告提交记录 | LP 报告中负责企业部分的准确性和及时性 | LP 报告自动生成模块(规划中) | 半自动 |
|
||||||
|
|
||||||
|
#### D5 被投企业价值增长
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 企业当前估值 | 最近一轮融资估值或第三方评估 | P2-40~46 融资与资本健康度 | 半自动 |
|
||||||
|
| 历轮融资记录 | 轮次、金额、估值、时间 | 融资进展追踪 | 自动 |
|
||||||
|
| 投资成本 | 基金对该企业的累计投资金额 | 财务系统 | 自动 |
|
||||||
|
| 累计回款 | 分红 + 部分退出回款 | 财务系统 | 自动 |
|
||||||
|
| 公允价值 | 当前公允价值(上市按收盘价,非上市按最近融资估值与第三方评估孰低) | 财务系统 + 估值模型 | 半自动 |
|
||||||
|
| 费后 IRR | 项目费后净现金流折现内部收益率 | 财务系统计算 | 自动 |
|
||||||
|
| MOIC | (累计回款 + 当前公允价值)/ 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| DPI 贡献 | 已实现回款 / 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| 退出路径评分 | IPO/并购/二级等退出路径明确度评分 | P4-05~08 退出时机预测 | 自动 |
|
||||||
|
| Down Round 记录 | 估值下降的融资事件 | 融资进展追踪 | 自动 |
|
||||||
|
|
||||||
|
#### D6 Alpha 归因贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 干预事件记录 | 投后干预类型、时间、负责人、详情 | P4-01 干预事件记录 | **手动录入** |
|
||||||
|
| 企业指标变化追踪 | 干预前后关键指标变化 | P4-02 指标变化追踪 | 自动 |
|
||||||
|
| 估值影响计算 | 干预事件对企业估值的影响 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| Alpha 贡献金额 | 估值增量 × 持股比例 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| 负 Alpha 事件 | 被归因为无效或有害的管理动作 | P4-03~04 归因结果 | 自动 |
|
||||||
|
| 干预记录完整度 | 有完整干预记录的事件 / 总干预事件 | 系统统计 | 自动 |
|
||||||
|
|
||||||
|
#### D7 被投企业满意度
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO 对投后经理服务的年度评分(1-5 分) | 年度满意度调查问卷 | **手动** |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度 | CEO 问卷 | **手动** |
|
||||||
|
| 投后 NPS | 被投企业净推荐值 | CEO 问卷 | **手动** |
|
||||||
|
| 主动性评价 | 投后经理主动跟进频率和质量的评分 | CEO 问卷 | **手动** |
|
||||||
|
| 关系持续性 | 后续融资中是否愿意继续接受该投后经理服务 | 融资记录 + CEO 确认 | 半自动 |
|
||||||
|
| 投后负责人评价 | 专业能力、管理规范、团队协作、结果导向 | 投后负责人填写 | **手动** |
|
||||||
|
| 投后经理自评 | 工作投入度、困难挑战、自我认知、改进计划 | 投后经理填写 | **手动** |
|
||||||
|
| 企业互动活跃度 | 数据共享频率、会议出席率、响应速度 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D8 知识积累与进化
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 记录 | 触发事件、完成状态、原计划/实际结果/差异原因/经验教训 | P4-30~33 AAR 系统化复盘 | 半自动 |
|
||||||
|
| AAR 改进建议执行状态 | 改进建议是否已执行及执行效果 | AAR 系统 | 半自动 |
|
||||||
|
| 知识图谱贡献条数 | 沉淀的最佳实践/案例数量 | P4-26~29 投后管理知识图谱 | **手动提交** |
|
||||||
|
|
||||||
|
### 7.7 数据系统对接关系
|
||||||
|
|
||||||
|
```
|
||||||
|
数据来源层 维度消费层
|
||||||
|
┌──────────────────┐ ┌───────────────────┐
|
||||||
|
│ 风险工作台 │──────→│ D1 风险感知与响应 │
|
||||||
|
│ 弱信号引擎 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 健康度评分模型 │──────→│ D2 企业健康度改善 │
|
||||||
|
│ TOC 约束分析 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 协同机会中心 │──────→│ D3 赋能与协同贡献 │
|
||||||
|
│ 客户增长引擎 │ │ │
|
||||||
|
│ 人才引力场 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 月报管理 │──────→│ D4 管理规范性与 │
|
||||||
|
│ 董事会管理 │ │ 退出准备 │
|
||||||
|
│ 协议监控 │ │ │
|
||||||
|
│ 退出路径准备 │ │ │
|
||||||
|
│ LP 报告模块 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 估值追踪 │──────→│ D5 被投企业价值 │
|
||||||
|
│ 融资进展 │ │ 增长 │
|
||||||
|
│ 财务系统 │ │ │
|
||||||
|
│ (IRR/MOIC/DPI) │ │ │
|
||||||
|
│ 退出时机预测 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ Alpha 归因引擎 │──────→│ D6 Alpha 归因贡献 │
|
||||||
|
│ 干预事件记录 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ CEO 满意度问卷 │──────→│ D7 被投企业满意度 │
|
||||||
|
│ NPS 调查 │ │ │
|
||||||
|
│ 流失风险预警 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ AAR 复盘系统 │──────→│ D8 知识积累与进化 │
|
||||||
|
│ 知识图谱 │ │ │
|
||||||
|
└──────────────────┘ └───────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.8 数据缺口与建设优先级
|
||||||
|
|
||||||
|
| 优先级 | 数据缺口 | 影响维度 | 建设建议 | 建设阶段 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **P0** | 财务系统对接(IRR/MOIC/DPI) | D5 | 对接财务系统或手动导入投资成本、回款、公允价值 | Phase 2 |
|
||||||
|
| **P0** | 干预事件录入流程 | D6 | 上线干预事件录入界面,嵌入投后经理日常操作 | Phase 2 |
|
||||||
|
| **P1** | CEO 满意度问卷系统 | D7 | 开发问卷模块,支持季度微评(3 题)+ 年度深评 | Phase 3 |
|
||||||
|
| **P1** | 退出准备清单模板 | D4 | Phase 1 用人工清单,Phase 2 系统化 | Phase 1-2 |
|
||||||
|
| **P2** | LP 报告自动生成 | D4 | 系统自动从各模块汇总企业数据生成 LP 报告 | Phase 3 |
|
||||||
|
| **P2** | NPS 调查机制 | D7 | 与满意度问卷同步上线 | Phase 3 |
|
||||||
|
|
||||||
|
> 整体数据自动化率约 **82%**,其中 D7 被投企业满意度自动化最低(40%),但这符合行业实践——满意度本质上是主观评价,必须通过人工问卷 + 访谈获取。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、分配计算示例
|
||||||
|
|
||||||
|
### 8.1 场景假设
|
||||||
|
|
||||||
|
```
|
||||||
|
基金规模: 10 亿
|
||||||
|
Carry: 20%(2 亿)
|
||||||
|
投后团队 Carry 分成: 15%
|
||||||
|
年度绩效池: 600 万
|
||||||
|
投后团队: 5 人
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 年度评分结果
|
||||||
|
|
||||||
|
| 投后经理 | 最终得分 | 等级 | 分配倍率 | 调节系数 | 负责企业 AUM 权重 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 经理 A | 97.50 | S | 150% | 1.05 | 25% |
|
||||||
|
| 经理 B | 82.30 | A | 100% | 1.00 | 20% |
|
||||||
|
| 经理 C | 75.60 | A | 100% | 0.95 | 18% |
|
||||||
|
| 经理 D | 65.20 | B | 50% | 1.00 | 22% |
|
||||||
|
| 经理 E | 58.00 | C | 0% | — | 15% |
|
||||||
|
|
||||||
|
### 8.3 分配计算
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 计算有效份额
|
||||||
|
经理 A: 97.50 × 1.50 × 1.05 × 0.25 = 38.39
|
||||||
|
经理 B: 82.30 × 1.00 × 1.00 × 0.20 = 16.46
|
||||||
|
经理 C: 75.60 × 1.00 × 0.95 × 0.18 = 12.93
|
||||||
|
经理 D: 65.20 × 0.50 × 1.00 × 0.22 = 7.17
|
||||||
|
经理 E: 不参与分配
|
||||||
|
|
||||||
|
有效份额总和 = 74.95
|
||||||
|
|
||||||
|
步骤 2: 计算分配金额
|
||||||
|
经理 A: 600 万 × (38.39 / 74.95) = 307.3 万
|
||||||
|
经理 B: 600 万 × (16.46 / 74.95) = 131.7 万
|
||||||
|
经理 C: 600 万 × (12.93 / 74.95) = 103.5 万
|
||||||
|
经理 D: 600 万 × (7.17 / 74.95) = 57.4 万
|
||||||
|
经理 E: 0 万
|
||||||
|
|
||||||
|
未分配余额: 600 - 599.9 = 0.1 万 → 滚入下年度
|
||||||
|
|
||||||
|
步骤 3: 经理 E 的份额(15% AUM 对应的份额)滚入下年度绩效池
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、实施路线
|
||||||
|
|
||||||
|
| 阶段 | 时间 | 内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **Phase 1: 数据基建** | 0-3 个月 | 健康度评分、风险闭环、月报管理数据接入绩效看板 |
|
||||||
|
| **Phase 2: Alpha 归因 + 价值追踪** | 3-6 个月 | 干预事件记录、Alpha 归因分析、估值追踪、IRR/MOIC/DPI 接入上线,D5/D6 维度开始采集 |
|
||||||
|
| **Phase 3: 满意度调查 + 试运行** | 6-12 个月 | 八大维度全部采集,被投企业满意度调查上线,月度看板上线,不挂钩分配 |
|
||||||
|
| **Phase 4: 正式运行** | 12 个月后 | 季度校准 + 年度结算,绩效池正式分配 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十、附则
|
||||||
|
|
||||||
|
### 10.1 方案调整机制
|
||||||
|
|
||||||
|
- 每年度根据基金阶段、市场环境和系统数据成熟度调整维度权重和目标值
|
||||||
|
- 权重调整需经合伙人会议批准
|
||||||
|
- 新维度加入时设 6 个月试运行期,试运行期不计入正式评分
|
||||||
|
|
||||||
|
### 10.2 争议处理
|
||||||
|
|
||||||
|
- 投后经理对评分有异议,可在年度面谈后 5 个工作日内提交申诉
|
||||||
|
- 申诉由合伙人 + HR 组成仲裁小组处理
|
||||||
|
- Alpha 归因结果可作为客观佐证
|
||||||
|
|
||||||
|
### 10.3 保密要求
|
||||||
|
|
||||||
|
- 个人绩效得分和分配金额仅本人、投后负责人、合伙人和 HR 可见
|
||||||
|
- 团队汇总数据(不含个人)可在团队会议中分享
|
||||||
|
- 绩效数据在系统中按字段级权限控制,AI 权限继承用户权限
|
||||||
+712
@@ -0,0 +1,712 @@
|
|||||||
|
# 投后经理绩效管理方案
|
||||||
|
|
||||||
|
> 核心理念:投后管理不是成本中心,而是投资回报的驱动力。绩效直接挂钩基金收益分配。
|
||||||
|
> 更新时间:2025-08-07
|
||||||
|
> 状态:草案 v1.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 一、总则
|
||||||
|
|
||||||
|
### 1.1 方案目标
|
||||||
|
|
||||||
|
将投后经理的绩效管理与基金投资回报直接绑定,通过设立**绩效池**机制,让投后团队的收入与企业增长、风险规避、组合协同等实际贡献挂钩,驱动投后管理从"被动跟进"转向"主动创造价值"。
|
||||||
|
|
||||||
|
### 1.2 适用范围
|
||||||
|
|
||||||
|
| 角色 | 适用性 | 考核侧重 |
|
||||||
|
|---|---|---|
|
||||||
|
| 投后经理 | 全量适用 | 企业健康度改善、风险闭环率、赋能协同贡献 |
|
||||||
|
| 投后负责人 | 全量适用 | 组合级指标、团队管理、Alpha 归因总量 |
|
||||||
|
| 投资经理(兼投后) | 按投后职责部分适用 | 仅考核投后相关维度 |
|
||||||
|
|
||||||
|
### 1.3 评估周期
|
||||||
|
|
||||||
|
| 周期 | 用途 | 数据来源 |
|
||||||
|
|---|---|---|
|
||||||
|
| 月度 | 绩效看板自动更新,不直接挂钩分配 | 系统自动采集 |
|
||||||
|
| 季度 | QBR 回顾,绩效得分校准,预分配比例调整 | 系统 + 人工校准 |
|
||||||
|
| 年度 | 绩效池结算,实际分配兑现 | 系统汇总 + 委员会评审 |
|
||||||
|
|
||||||
|
### 1.4 核心公式
|
||||||
|
|
||||||
|
```
|
||||||
|
个人绩效分配 = 绩效池总额 × 个人绩效份额
|
||||||
|
|
||||||
|
个人绩效份额 = (个人绩效得分 / 团队绩效得分总和) × 调节系数
|
||||||
|
|
||||||
|
个人绩效得分 = Σ(各维度得分 × 维度权重) × Alpha 调节因子
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 二、绩效池机制
|
||||||
|
|
||||||
|
### 2.1 绩效池来源
|
||||||
|
|
||||||
|
绩效池从基金收益中提取,分两种模式:
|
||||||
|
|
||||||
|
| 模式 | 来源 | 提取比例(建议) | 适用场景 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **Carry 模式** | 基金超额收益(Carry) | Carry 总额的 10%-20% | 有 Carry 分配权的基金 |
|
||||||
|
| **管理费模式** | 年度管理费 | 管理费的 5%-8% | 无 Carry 或早期基金 |
|
||||||
|
|
||||||
|
### 2.2 绩效池规模示例
|
||||||
|
|
||||||
|
假设基金规模 10 亿,Carry 20%(2 亿),投后团队 Carry 分成 15%:
|
||||||
|
|
||||||
|
```
|
||||||
|
绩效池 = 2 亿 × 15% = 3,000 万
|
||||||
|
```
|
||||||
|
|
||||||
|
按 5 年存续期分摊,年均绩效池约 600 万。
|
||||||
|
|
||||||
|
### 2.3 绩效池分配规则
|
||||||
|
|
||||||
|
1. **基础门槛**:个人绩效得分 ≥ 60 分方可参与分配
|
||||||
|
2. **分段分配**:
|
||||||
|
- 60-69 分:按基准份额的 50% 分配
|
||||||
|
- 70-84 分:按基准份额的 100% 分配
|
||||||
|
- 85-100 分:按基准份额的 150% 分配
|
||||||
|
3. **调节系数**:由投后负责人根据团队协作、特殊贡献等主观因素调整,范围 0.8-1.2
|
||||||
|
4. **未分配余额**:低于门槛的份额滚入下一年度绩效池
|
||||||
|
|
||||||
|
### 2.4 绩效池触发条件
|
||||||
|
|
||||||
|
| 条件 | 说明 |
|
||||||
|
|---|---|
|
||||||
|
| 基金已实现收益 | DPI > 0 或有退出事件发生 |
|
||||||
|
| 投后团队在职 | 考核期内在职满 6 个月 |
|
||||||
|
| 企业健康度可量化 | 负责企业至少有 3 期健康度评分 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 三、绩效指标体系
|
||||||
|
|
||||||
|
### 3.1 指标总览
|
||||||
|
|
||||||
|
八大维度,满分 100 分,各维度按权重加权:
|
||||||
|
|
||||||
|
| 维度 | 权重 | 核心问题 | 数据来源 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **D1 风险感知与响应** | 10% | 风险发现是否早、处理是否快 | OODA 循环 + 风险工作台 |
|
||||||
|
| **D2 企业健康度改善** | 10% | 负责的企业是否在变好 | 健康度评分趋势 |
|
||||||
|
| **D3 赋能与协同贡献** | 15% | 是否为被投企业带来了实际资源 | 协同机会中心 + Alpha 归因 |
|
||||||
|
| **D4 管理规范性与退出准备** | 10% | 月报/董事会/协议/退出准备/LP 沟通是否到位 | 月报管理 + 董事会 + 协议监控 + 退出管理 |
|
||||||
|
| **D5 被投企业价值增长** | 20% | 负责的企业估值涨了多少、IRR/MOIC/DPI 贡献多大 | 估值追踪 + 融资进展 + 退出信号 + 基金指标 |
|
||||||
|
| **D6 Alpha 归因贡献** | 15% | 管理动作是否真正创造了投资回报 | Alpha 归因分析 |
|
||||||
|
| **D7 被投企业满意度** | 15% | 被投企业 CEO/创始人对投后服务的评价 | 360 度评价 + NPS |
|
||||||
|
| **D8 知识积累与进化** | 5% | 是否将经验沉淀为可复用知识 | AAR + 知识图谱 |
|
||||||
|
|
||||||
|
### 3.2 D1 — 风险感知与响应(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 预警提前量 | 从弱信号首次出现到风险确认的天数 | ≥ 30 天 | >30天: 满分; 15-30天: 80%; <15天: 40% |
|
||||||
|
| OODA 循环耗时 | 从 Observe 到 Act 的平均周期 | ≤ 7 天 | ≤7天: 满分; 8-14天: 70%; >14天: 30% |
|
||||||
|
| 风险闭环率 | 已关闭风险 / 总风险数 | ≥ 90% | ≥90%: 满分; 70-89%: 70%; <70%: 30% |
|
||||||
|
| 风险升级率 | 红色风险 / 总风险数 | ≤ 10% | ≤10%: 满分; 11-20%: 60%; >20%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-27 指标越界自动预警
|
||||||
|
- P1-39~43 OODA 决策循环 + 决策延迟追踪
|
||||||
|
- P1-30 风险处理闭环
|
||||||
|
- P2-33~39 弱信号采集 + 关联引擎
|
||||||
|
|
||||||
|
### 3.3 D2 — 企业健康度改善(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 健康度趋势分 | 负责企业健康度年度变化值的加权平均 | > 0 | 上升: 满分; 持平: 60%; 下降: 20% |
|
||||||
|
| 红色企业转黄率 | 红色→黄色/绿色的企业占比 | ≥ 50% | ≥50%: 满分; 30-49%: 60%; <30%: 20% |
|
||||||
|
| 约束点突破数 | 负责企业中 TOC 约束点被突破的次数 | ≥ 2 次/年 | 按次数线性评分 |
|
||||||
|
| 企业存活率 | 负责企业未倒闭/未低价收购的比例 | ≥ 95% | ≥95%: 满分; 90-94%: 70%; <90%: 0% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-16~19 四维健康度评分 + 趋势
|
||||||
|
- P3-53 约束点识别(TOC)
|
||||||
|
- P3-47~55 健康度扩展 + 高级分析
|
||||||
|
- P3-67~68 流失风险预警 + 挽留流程
|
||||||
|
|
||||||
|
### 3.4 D3 — 赋能与协同贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起数 | 主动发起的协同机会数量 | ≥ 6 次/年 | 按数量线性评分 |
|
||||||
|
| 协同转化率 | 成功落地 / 发起总数 | ≥ 30% | ≥30%: 满分; 15-29%: 60%; <15%: 20% |
|
||||||
|
| 资源对接成功率 | 投资机构资源成功对接给企业的比例 | ≥ 40% | ≥40%: 满分; 20-39%: 60%; <20%: 20% |
|
||||||
|
| 客户增长贡献 | 通过投后引入的客户为企业带来的收入 | 可量化 | 按金额分段评分 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P3-01~07 协同机会中心 + 闭环管理
|
||||||
|
- P3-16~19 客户增长引擎
|
||||||
|
- P3-11~15 人才引力场
|
||||||
|
- P4-01~04 Alpha 归因(干预事件→指标变化→回报贡献)
|
||||||
|
|
||||||
|
### 3.5 D4 — 管理规范性与退出准备(10%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报及时率 | 按时收齐月报的企业 / 负责企业总数 | ≥ 95% | ≥95%: 满分; 85-94%: 70%; <85%: 30% |
|
||||||
|
| 董事会决议执行率 | 已执行决议 / 总决议数 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
| 协议条款响应率 | 协议预警在时限内响应的比例 | 100% | 100%: 满分; 90-99%: 60%; <90%: 0% |
|
||||||
|
| 退出准备完成度 | 财务规范/股权梳理/合规整改等退出准备项的完成率 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| LP 沟通质量 | LP 报告中负责企业部分的准确性和及时性 | ≥ 90% | ≥90%: 满分; 75-89%: 60%; <75%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P1-15 月报提交及时性追踪
|
||||||
|
- P2-21~26 董事会管理 + 决议追踪
|
||||||
|
- P2-14~20 投资协议解析 + 条款监控
|
||||||
|
- P2-08~13 财务数据接入与校验 + 可信度评分
|
||||||
|
- P4-05~08 退出时机预测 + 退出路径准备清单
|
||||||
|
- LP 报告自动生成模块(系统规划功能)
|
||||||
|
|
||||||
|
### 3.6 D5 — 被投企业价值增长(20%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 估值增长率 | 负责企业年度估值加权平均增长率(按阶段差异化目标) | 见阶段差异化表 | 按阶段目标对比评分 |
|
||||||
|
| 项目 IRR | 负责企业的费后内部收益率 | ≥ 15% | ≥15%: 满分; 8-14%: 70%; <8%: 30% |
|
||||||
|
| MOIC | 负责企业的现金回报倍数(累计回款+当前公允价值)/投资成本 | ≥ 2x | ≥3x: 满分; 2-3x: 70%; 1-2x: 40%; <1x: 10% |
|
||||||
|
| DPI 贡献 | 负责企业已实现回款 / 投资成本 | 可量化 | 按回报金额分段评分 |
|
||||||
|
| 融资推进成功率 | 负责企业成功完成下一轮融资的比例 | ≥ 60% | ≥60%: 满分; 40-59%: 70%; <40%: 30% |
|
||||||
|
| 退出信号强度 | 企业退出路径明确度(IPO/并购/二级) | 可量化 | 系统退出路径计算评分 × 企业数加权 |
|
||||||
|
| 估值折损企业数 | 负责企业中估值下降(Down Round)的数量 | 0 | 0: 满分; 1: 50%; ≥2: 0% |
|
||||||
|
|
||||||
|
#### 阶段差异化目标值
|
||||||
|
|
||||||
|
| 企业阶段 | 估值增长率目标 | IRR 目标 | MOIC 目标 | 说明 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Seed / 天使 | ≥ 50% | ≥ 20% | ≥ 2x | 早期增长快,估值波动大 |
|
||||||
|
| Series A / 早期 | ≥ 40% | ≥ 18% | ≥ 2x | 商业模式验证期 |
|
||||||
|
| Series B / 成长期 | ≥ 30% | ≥ 15% | ≥ 2x | 规模化扩张期 |
|
||||||
|
| Series C+ / 扩张期 | ≥ 20% | ≥ 12% | ≥ 1.5x | 增长趋稳,看盈利能力 |
|
||||||
|
| Pre-IPO / 成熟期 | ≥ 10% | ≥ 10% | ≥ 1.5x | 退出导向,看确定性 |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P2-40~46 融资与资本健康度(当前估值、融资进展、股权结构、退出可能性)
|
||||||
|
- P4-05~08 退出时机预测(退出路径计算、时机窗口、期望收益对比)
|
||||||
|
- P4-09~11 组合层面资源再分配(边际回报率、IRR/DPI 影响模拟)
|
||||||
|
- P4-12~15 Monte Carlo 组合模拟(基础/乐观/悲观情景、回报驱动因素)
|
||||||
|
- 财务系统:投资成本、累计回款、公允价值、费后 IRR、MOIC、DPI
|
||||||
|
|
||||||
|
#### 价值增长链路
|
||||||
|
|
||||||
|
```
|
||||||
|
被投企业价值增长 = 估值变化 + 融资进展 + 退出准备 + 基金回报指标
|
||||||
|
↓ ↓ ↓ ↓ ↓
|
||||||
|
估值模型追踪 轮次/估值 退出路径评分 IRR/MOIC DPI 贡献
|
||||||
|
(系统记录) (系统记录) (AI 计算) (财务系统) (已实现回款)
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 评分示例
|
||||||
|
|
||||||
|
> 投后经理 A 负责 5 家企业(2 家 Series A、2 家 Series B、1 家 Pre-IPO),其中 2 家完成下一轮融资(估值平均增长 42%),1 家 IPO 预备中,2 家估值持平。加权估值增长率 28%(对比阶段目标 34%,完成率 82%),项目 IRR 16%,MOIC 2.3x,融资推进成功率 40%,退出信号强度评分 75,估值折损 0 家。D5 得分 = 82 × 25% + 100 × 20% + 70 × 15% + 85 × 15% + 70 × 15% + 75 × 10% + 100 × 10% = 84.0
|
||||||
|
|
||||||
|
### 3.7 D6 — Alpha 归因贡献(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Alpha 贡献事件数 | 被归因系统识别为"有效管理动作"的事件数 | ≥ 5 次/年 | 按数量线性评分 |
|
||||||
|
| Alpha 贡献金额 | 管理动作带来的估值增量 × 持股比例 | 可量化 | 按金额分段评分 |
|
||||||
|
| 负 Alpha 事件数 | 管理动作被归因为"无效或有害"的事件数 | 0 | 0: 满分; 1-2: 50%; >2: 0% |
|
||||||
|
| 干预记录完整率 | 有完整干预记录的事件 / 总干预事件 | ≥ 90% | ≥90%: 满分; 70-89%: 50%; <70%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-01 干预事件记录
|
||||||
|
- P4-02 指标变化追踪
|
||||||
|
- P4-03 Alpha 归因分析(干预事件→指标变化→估值影响→回报贡献)
|
||||||
|
- P4-04 归因结果查看
|
||||||
|
|
||||||
|
#### Alpha 归因链路
|
||||||
|
|
||||||
|
```
|
||||||
|
投后干预事件 → 企业指标变化 → 估值影响 → 回报贡献
|
||||||
|
↓ ↓ ↓ ↓
|
||||||
|
人才推荐 人效提升 估值上调 Alpha = 估值增量 × 持股比例
|
||||||
|
客户引入 收入增长
|
||||||
|
战略建议 约束突破
|
||||||
|
融资支持 融资成功
|
||||||
|
风险干预 风险消除
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.8 D7 — 被投企业满意度(15%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO/创始人对投后经理服务的年度评分(1-5 分) | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度(被投企业评价) | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 投后 NPS | 被投企业净推荐值:愿意推荐该投资机构给其他创业者的比例 | ≥ 50 | ≥50: 满分; 30-49: 70%; 0-29: 40%; 负值: 10% |
|
||||||
|
| 主动性评价 | 被投企业对投后经理主动跟进频率和质量的评分 | ≥ 4.0 | ≥4.5: 满分; 4.0-4.4: 80%; 3.0-3.9: 50%; <3.0: 10% |
|
||||||
|
| 关系持续性 | 被投企业在后续融资中是否愿意继续接受该投后经理服务 | 100% | 100%: 满分; 80-99%: 70%; <80%: 30% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- 系统发起的年度被投企业满意度调查(CEO 问卷 + 访谈)
|
||||||
|
- P3-67~68 流失风险预警(企业活跃度/数据共享减少/互动减少)
|
||||||
|
- P3-65 QBR 报告中企业反馈模块
|
||||||
|
- 协同机会中心中企业的确认/拒绝/沉默记录
|
||||||
|
|
||||||
|
#### 评价机制
|
||||||
|
|
||||||
|
采用 360 度评价机制,三方评价加权汇总:
|
||||||
|
|
||||||
|
| 评价方 | 权重 | 评价内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **被投企业 CEO/创始人** | 50% | 服务满意度、需求匹配度、主动性、NPS |
|
||||||
|
| **投后负责人 + 合伙人** | 30% | 专业能力、管理规范、团队协作、结果导向 |
|
||||||
|
| **投后经理自评** | 20% | 工作投入度、困难挑战、自我认知、改进计划 |
|
||||||
|
|
||||||
|
> 被投企业评价权重 50%,体现清科研究中心行业最佳实践建议:投后服务效果最终由被投企业感知,应作为最核心的评价维度。
|
||||||
|
|
||||||
|
#### 评价周期
|
||||||
|
|
||||||
|
- **季度微评**:每季度由被投企业 CEO 填写简短评价(3 题,2 分钟完成)
|
||||||
|
- **年度深评**:每年由系统发起完整满意度调查 + 投后负责人访谈
|
||||||
|
- **退出回评**:企业退出时由 CEO 填写完整回顾评价
|
||||||
|
|
||||||
|
### 3.9 D8 — 知识积累与进化(5%)
|
||||||
|
|
||||||
|
#### 考核指标
|
||||||
|
|
||||||
|
| 指标 | 定义 | 目标值 | 评分规则 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 完成率 | 触发事件中完成 AAR 的比例 | ≥ 80% | ≥80%: 满分; 60-79%: 60%; <60%: 20% |
|
||||||
|
| 知识图谱贡献数 | 沉淀的最佳实践/案例数量 | ≥ 3 条/年 | 按数量线性评分 |
|
||||||
|
| AAR 改进执行率 | AAR 改进建议已执行的比例 | ≥ 70% | ≥70%: 满分; 50-69%: 50%; <50%: 20% |
|
||||||
|
|
||||||
|
#### 系统数据源
|
||||||
|
|
||||||
|
- P4-30~33 AAR 系统化复盘
|
||||||
|
- P4-26~29 投后管理知识图谱
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、评分计算与调节
|
||||||
|
|
||||||
|
### 4.1 评分计算流程
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 系统自动采集各维度原始数据(月度)
|
||||||
|
步骤 2: 按评分规则转换为维度得分(0-100)
|
||||||
|
步骤 3: 加权计算个人绩效总分 = Σ(维度得分 × 权重)
|
||||||
|
步骤 4: 应用 Alpha 调节因子
|
||||||
|
步骤 5: 季度人工校准(投后负责人 + 合伙人)
|
||||||
|
步骤 6: 年度委员会评审确定最终得分和分配
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4.2 Alpha 调节因子
|
||||||
|
|
||||||
|
Alpha 调节因子基于 D6 维度的 Alpha 归因结果,对总分进行乘法调节:
|
||||||
|
|
||||||
|
| Alpha 贡献等级 | 条件 | 调节因子 |
|
||||||
|
|---|---|---|
|
||||||
|
| 卓越 | Alpha 贡献金额 > 1,000 万 | 1.3 |
|
||||||
|
| 优秀 | Alpha 贡献金额 500-1,000 万 | 1.15 |
|
||||||
|
| 良好 | Alpha 贡献金额 100-500 万 | 1.05 |
|
||||||
|
| 基准 | Alpha 贡献金额 < 100 万 | 1.0 |
|
||||||
|
| 负贡献 | 存在负 Alpha 事件 | 0.7-0.9 |
|
||||||
|
|
||||||
|
### 4.3 调节系数
|
||||||
|
|
||||||
|
投后负责人可在 0.8-1.2 范围内对每人进行主观调节,覆盖以下场景:
|
||||||
|
|
||||||
|
- **团队协作**:跨企业协同中的贡献(难以被个体指标捕获)
|
||||||
|
- **特殊贡献**:重大风险避免、关键人才保留等
|
||||||
|
- **新入职 ramp-up**:入职不满 1 年的投后经理可下调考核基准
|
||||||
|
- **组合复杂度**:负责企业数量多、阶段早、难度高的可适度上调
|
||||||
|
|
||||||
|
### 4.4 评分示例
|
||||||
|
|
||||||
|
```
|
||||||
|
投后经理 A:
|
||||||
|
D1 风险感知与响应: 85 × 10% = 8.50
|
||||||
|
D2 企业健康度改善: 78 × 10% = 7.80
|
||||||
|
D3 赋能与协同贡献: 72 × 15% = 10.80
|
||||||
|
D4 管理规范性与退出: 88 × 10% = 8.80
|
||||||
|
D5 被投企业价值增长: 84 × 20% = 16.80
|
||||||
|
D6 Alpha 归因贡献: 80 × 15% = 12.00
|
||||||
|
D7 被投企业满意度: 82 × 15% = 12.30
|
||||||
|
D8 知识积累: 75 × 5% = 3.75
|
||||||
|
--------------------------------
|
||||||
|
基础总分: 80.75
|
||||||
|
Alpha 调节因子: 1.15(优秀)
|
||||||
|
调节后总分: 92.86
|
||||||
|
调节系数: 1.05(组合复杂度高)
|
||||||
|
最终得分: 97.50
|
||||||
|
|
||||||
|
分配档位: 85-100 分 → 基准份额 × 150%
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、绩效等级与应用
|
||||||
|
|
||||||
|
### 5.1 绩效等级
|
||||||
|
|
||||||
|
| 等级 | 得分区间 | 分配倍率 | 含义 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| S | 85-100 | 150% | 卓越贡献,显著提升投资回报 |
|
||||||
|
| A | 70-84 | 100% | 达标且有一定亮点 |
|
||||||
|
| B | 60-69 | 50% | 基本达标,需改进 |
|
||||||
|
| C | < 60 | 0% | 未达标,不参与绩效池分配 |
|
||||||
|
|
||||||
|
### 5.2 绩效应用
|
||||||
|
|
||||||
|
| 应用项 | S 级 | A 级 | B 级 | C 级 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 绩效池分配 | 150% | 100% | 50% | 不分配 |
|
||||||
|
| 晋升资格 | 优先考虑 | 正常考虑 | 暂缓 | 不考虑 |
|
||||||
|
| 管理企业数上限 | 可增加 | 维持 | 维持 | 建议减少 |
|
||||||
|
| 培训资源 | 优先分配 | 正常 | 加强 | 强制培训 |
|
||||||
|
| 连续 2 年 C 级 | — | — | — | 调整岗位或退出 |
|
||||||
|
|
||||||
|
### 5.3 特殊奖励
|
||||||
|
|
||||||
|
除常规绩效池分配外,以下情况可申请额外奖励(从绩效池未分配余额中支出):
|
||||||
|
|
||||||
|
- **重大风险避免**:投后干预直接避免企业重大损失(如现金流断裂、核心团队集体离职)
|
||||||
|
- **重大协同落地**:推动 Portfolio 协同带来显著收入增长
|
||||||
|
- **退出贡献**:投后管理直接推动企业成功退出(IPO/并购)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 六、绩效面谈与改进
|
||||||
|
|
||||||
|
### 6.1 月度绩效看板
|
||||||
|
|
||||||
|
系统自动生成月度绩效看板,投后经理可随时查看:
|
||||||
|
|
||||||
|
- 各维度当前得分和趋势
|
||||||
|
- 负责企业的健康度变化
|
||||||
|
- 负责企业的估值变化趋势和 IRR/MOIC/DPI
|
||||||
|
- 风险闭环进度
|
||||||
|
- 协同推进状态
|
||||||
|
- Alpha 贡献事件列表
|
||||||
|
- 被投企业满意度季度微评结果
|
||||||
|
- 预估绩效分配金额(基于当前得分)
|
||||||
|
|
||||||
|
### 6.2 季度 QBR 联动
|
||||||
|
|
||||||
|
每季度结合系统 QBR 报告(P3-65)进行绩效面谈:
|
||||||
|
|
||||||
|
1. **数据回顾**:系统自动生成本季度绩效数据摘要
|
||||||
|
2. **归因分析**:讨论得分变化的原因(哪些管理动作有效/无效)
|
||||||
|
3. **目标校准**:调整下季度重点方向和目标值
|
||||||
|
4. **预分配通知**:告知当前预估分配比例(不具约束力)
|
||||||
|
|
||||||
|
### 6.3 年度评审
|
||||||
|
|
||||||
|
年度评审由投后负责人 + 合伙人 + HR 组成评审委员会:
|
||||||
|
|
||||||
|
1. **系统出具年度绩效报告**:汇总 12 个月数据,自动计算最终得分
|
||||||
|
2. **360 度评价汇总**:被投企业满意度调查结果 + 投后负责人评价 + 自评
|
||||||
|
3. **Alpha 归因总账**:汇总全年管理动作的 Alpha 贡献
|
||||||
|
4. **委员会评审**:审核系统评分,确认调节系数
|
||||||
|
5. **分配方案**:计算每人实际分配金额,报合伙人会议批准
|
||||||
|
6. **绩效面谈**:一对一沟通结果、改进方向和下年度目标
|
||||||
|
|
||||||
|
### 6.4 绩效改进计划
|
||||||
|
|
||||||
|
对 B 级和 C 级人员制定改进计划:
|
||||||
|
|
||||||
|
| 级别 | 改进措施 |
|
||||||
|
|---|---|
|
||||||
|
| B 级 | 识别短板维度,制定 3 个月改进目标,月度跟踪 |
|
||||||
|
| C 级 | 制定 6 个月绩效改进计划(PIP),月度评审,连续 2 次未改善则调整岗位 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 七、系统支撑
|
||||||
|
|
||||||
|
### 7.1 投资经理画像(P2-49)
|
||||||
|
|
||||||
|
系统已规划投资经理画像,本方案直接复用:
|
||||||
|
|
||||||
|
- **能力维度**:行业理解、财务分析、资源网络、风险判断
|
||||||
|
- **风格维度**:跟进频率、干预偏好、协同倾向
|
||||||
|
- **负责项目**:当前管理的企业列表和 AUM
|
||||||
|
- **跟进质量评分**:基于本方案八大维度自动计算
|
||||||
|
|
||||||
|
### 7.2 Alpha 归因系统(P4-01~04)
|
||||||
|
|
||||||
|
Alpha 归因是本方案的核心差异化——不只看"做了什么",更看"带来了什么回报":
|
||||||
|
|
||||||
|
```
|
||||||
|
干预事件 → 指标变化 → 估值影响 → 回报贡献
|
||||||
|
↑ ↑ ↑ ↑
|
||||||
|
投后经理 系统追踪 估值模型 量化归因
|
||||||
|
记录 自动 自动计算 AI 分析
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.3 AAR 复盘系统(P4-30~33)
|
||||||
|
|
||||||
|
AAR 不仅用于知识积累,也作为绩效评估的佐证:
|
||||||
|
|
||||||
|
- AAR 记录了"原计划→实际结果→差异原因→经验教训"
|
||||||
|
- 绩效面谈时引用 AAR 结论,避免主观争议
|
||||||
|
- AAR 改进执行率本身也是 D8 考核指标
|
||||||
|
|
||||||
|
### 7.4 知识图谱(P4-26~29)
|
||||||
|
|
||||||
|
投后管理知识图谱持续积累"管理动作→结果"的因果关系:
|
||||||
|
|
||||||
|
- 新企业进入时自动匹配最佳管理策略
|
||||||
|
- 投后经理可查询历史最佳实践
|
||||||
|
- 知识贡献度纳入 D8 考核
|
||||||
|
|
||||||
|
### 7.5 数据采集自动化
|
||||||
|
|
||||||
|
| 维度 | 自动采集比例 | 人工输入 |
|
||||||
|
|---|---|---|
|
||||||
|
| D1 风险感知与响应 | 100% | 无 |
|
||||||
|
| D2 企业健康度改善 | 100% | 无 |
|
||||||
|
| D3 赋能与协同贡献 | 90% | 协同效果评估需确认 |
|
||||||
|
| D4 管理规范性与退出准备 | 90% | 退出准备完成度需人工确认 |
|
||||||
|
| D5 被投企业价值增长 | 80% | 估值数据需融资事件确认 |
|
||||||
|
| D6 Alpha 归因贡献 | 80% | 干预事件需主动记录 |
|
||||||
|
| D7 被投企业满意度 | 40% | CEO 问卷 + 访谈需人工发起 |
|
||||||
|
| D8 知识积累 | 90% | 知识图谱贡献需主动提交 |
|
||||||
|
|
||||||
|
### 7.6 各维度数据支持明细
|
||||||
|
|
||||||
|
#### D1 风险感知与响应
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 弱信号首次出现时间 | 弱信号引擎检测到的首次异常时间戳 | P2-33~39 弱信号采集 + 关联引擎 | 自动 |
|
||||||
|
| 风险确认时间 | 风险从弱信号升级为确认风险的时间 | P1-27 指标越界自动预警 | 自动 |
|
||||||
|
| OODA 各阶段时间戳 | Observe → Orient → Decide → Act 每阶段时间 | P1-39~43 OODA 决策循环 | 自动 |
|
||||||
|
| 风险状态(开/闭环) | 每个风险的当前状态和关闭时间 | P1-30 风险处理闭环 | 自动 |
|
||||||
|
| 风险等级(红/黄/绿) | 风险分级记录 | 风险工作台 | 自动 |
|
||||||
|
|
||||||
|
#### D2 企业健康度改善
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 四维健康度评分 | 财务/运营/治理/成长四维评分及历史趋势 | P1-16~19 四维健康度评分 | 自动 |
|
||||||
|
| 健康度变化序列 | 每期评分对比,计算上升/持平/下降 | 健康度趋势模型 | 自动 |
|
||||||
|
| 约束点识别记录 | TOC 约束点位置及突破状态 | P3-53 约束点识别(TOC) | 自动 |
|
||||||
|
| 企业状态 | 存续/倒闭/被低价收购 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D3 赋能与协同贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 协同机会发起记录 | 发起时间、类型、目标企业、发起人 | P3-01~07 协同机会中心 | 自动 |
|
||||||
|
| 协同状态追踪 | 发起 → 推进 → 落地/失败全链路 | 协同闭环管理 | 自动 |
|
||||||
|
| 资源对接记录 | 机构资源对接给企业的记录及结果 | 协同机会中心 | 自动 |
|
||||||
|
| 客户引入金额 | 投后引入客户为企业带来的收入金额 | P3-16~19 客户增长引擎 | 自动 |
|
||||||
|
| 人才推荐记录 | 推荐人才及入职结果 | P3-11~15 人才引力场 | 自动 |
|
||||||
|
| 协同效果确认 | 落地后实际效果评估 | 人工确认 | **手动** |
|
||||||
|
|
||||||
|
#### D4 管理规范性与退出准备
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 月报提交时间戳 | 每家企业月报提交时间 vs 截止时间 | P1-15 月报提交及时性追踪 | 自动 |
|
||||||
|
| 董事会决议清单 | 决议内容、执行状态、执行时间 | P2-21~26 董事会管理 + 决议追踪 | 自动 |
|
||||||
|
| 协议条款预警 | 协议条款到期/违约预警及响应记录 | P2-14~20 投资协议解析 + 条款监控 | 自动 |
|
||||||
|
| 数据可信度评分 | 企业财务数据质量和可信度 | P2-08~13 财务数据接入与校验 | 自动 |
|
||||||
|
| 退出准备清单 | 财务规范/股权梳理/合规整改等准备项完成度 | P4-05~08 退出时机预测 + 准备清单 | 半自动 |
|
||||||
|
| LP 报告提交记录 | LP 报告中负责企业部分的准确性和及时性 | LP 报告自动生成模块(规划中) | 半自动 |
|
||||||
|
|
||||||
|
#### D5 被投企业价值增长
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 企业当前估值 | 最近一轮融资估值或第三方评估 | P2-40~46 融资与资本健康度 | 半自动 |
|
||||||
|
| 历轮融资记录 | 轮次、金额、估值、时间 | 融资进展追踪 | 自动 |
|
||||||
|
| 投资成本 | 基金对该企业的累计投资金额 | 财务系统 | 自动 |
|
||||||
|
| 累计回款 | 分红 + 部分退出回款 | 财务系统 | 自动 |
|
||||||
|
| 公允价值 | 当前公允价值(上市按收盘价,非上市按最近融资估值与第三方评估孰低) | 财务系统 + 估值模型 | 半自动 |
|
||||||
|
| 费后 IRR | 项目费后净现金流折现内部收益率 | 财务系统计算 | 自动 |
|
||||||
|
| MOIC | (累计回款 + 当前公允价值)/ 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| DPI 贡献 | 已实现回款 / 投资成本 | 财务系统计算 | 自动 |
|
||||||
|
| 退出路径评分 | IPO/并购/二级等退出路径明确度评分 | P4-05~08 退出时机预测 | 自动 |
|
||||||
|
| Down Round 记录 | 估值下降的融资事件 | 融资进展追踪 | 自动 |
|
||||||
|
|
||||||
|
#### D6 Alpha 归因贡献
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 干预事件记录 | 投后干预类型、时间、负责人、详情 | P4-01 干预事件记录 | **手动录入** |
|
||||||
|
| 企业指标变化追踪 | 干预前后关键指标变化 | P4-02 指标变化追踪 | 自动 |
|
||||||
|
| 估值影响计算 | 干预事件对企业估值的影响 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| Alpha 贡献金额 | 估值增量 × 持股比例 | P4-03 Alpha 归因分析 | 自动 |
|
||||||
|
| 负 Alpha 事件 | 被归因为无效或有害的管理动作 | P4-03~04 归因结果 | 自动 |
|
||||||
|
| 干预记录完整度 | 有完整干预记录的事件 / 总干预事件 | 系统统计 | 自动 |
|
||||||
|
|
||||||
|
#### D7 被投企业满意度
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| CEO 满意度评分 | 被投企业 CEO 对投后经理服务的年度评分(1-5 分) | 年度满意度调查问卷 | **手动** |
|
||||||
|
| 需求响应匹配度 | 投后服务内容与企业实际需求的匹配程度 | CEO 问卷 | **手动** |
|
||||||
|
| 投后 NPS | 被投企业净推荐值 | CEO 问卷 | **手动** |
|
||||||
|
| 主动性评价 | 投后经理主动跟进频率和质量的评分 | CEO 问卷 | **手动** |
|
||||||
|
| 关系持续性 | 后续融资中是否愿意继续接受该投后经理服务 | 融资记录 + CEO 确认 | 半自动 |
|
||||||
|
| 投后负责人评价 | 专业能力、管理规范、团队协作、结果导向 | 投后负责人填写 | **手动** |
|
||||||
|
| 投后经理自评 | 工作投入度、困难挑战、自我认知、改进计划 | 投后经理填写 | **手动** |
|
||||||
|
| 企业互动活跃度 | 数据共享频率、会议出席率、响应速度 | P3-67~68 流失风险预警 | 自动 |
|
||||||
|
|
||||||
|
#### D8 知识积累与进化
|
||||||
|
|
||||||
|
| 数据项 | 说明 | 采集来源 | 自动化 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| AAR 记录 | 触发事件、完成状态、原计划/实际结果/差异原因/经验教训 | P4-30~33 AAR 系统化复盘 | 半自动 |
|
||||||
|
| AAR 改进建议执行状态 | 改进建议是否已执行及执行效果 | AAR 系统 | 半自动 |
|
||||||
|
| 知识图谱贡献条数 | 沉淀的最佳实践/案例数量 | P4-26~29 投后管理知识图谱 | **手动提交** |
|
||||||
|
|
||||||
|
### 7.7 数据系统对接关系
|
||||||
|
|
||||||
|
```
|
||||||
|
数据来源层 维度消费层
|
||||||
|
┌──────────────────┐ ┌───────────────────┐
|
||||||
|
│ 风险工作台 │──────→│ D1 风险感知与响应 │
|
||||||
|
│ 弱信号引擎 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 健康度评分模型 │──────→│ D2 企业健康度改善 │
|
||||||
|
│ TOC 约束分析 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 协同机会中心 │──────→│ D3 赋能与协同贡献 │
|
||||||
|
│ 客户增长引擎 │ │ │
|
||||||
|
│ 人才引力场 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 月报管理 │──────→│ D4 管理规范性与 │
|
||||||
|
│ 董事会管理 │ │ 退出准备 │
|
||||||
|
│ 协议监控 │ │ │
|
||||||
|
│ 退出路径准备 │ │ │
|
||||||
|
│ LP 报告模块 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ 估值追踪 │──────→│ D5 被投企业价值 │
|
||||||
|
│ 融资进展 │ │ 增长 │
|
||||||
|
│ 财务系统 │ │ │
|
||||||
|
│ (IRR/MOIC/DPI) │ │ │
|
||||||
|
│ 退出时机预测 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ Alpha 归因引擎 │──────→│ D6 Alpha 归因贡献 │
|
||||||
|
│ 干预事件记录 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ CEO 满意度问卷 │──────→│ D7 被投企业满意度 │
|
||||||
|
│ NPS 调查 │ │ │
|
||||||
|
│ 流失风险预警 │ │ │
|
||||||
|
├──────────────────┤ ├───────────────────┤
|
||||||
|
│ AAR 复盘系统 │──────→│ D8 知识积累与进化 │
|
||||||
|
│ 知识图谱 │ │ │
|
||||||
|
└──────────────────┘ └───────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
### 7.8 数据缺口与建设优先级
|
||||||
|
|
||||||
|
| 优先级 | 数据缺口 | 影响维度 | 建设建议 | 建设阶段 |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **P0** | 财务系统对接(IRR/MOIC/DPI) | D5 | 对接财务系统或手动导入投资成本、回款、公允价值 | Phase 2 |
|
||||||
|
| **P0** | 干预事件录入流程 | D6 | 上线干预事件录入界面,嵌入投后经理日常操作 | Phase 2 |
|
||||||
|
| **P1** | CEO 满意度问卷系统 | D7 | 开发问卷模块,支持季度微评(3 题)+ 年度深评 | Phase 3 |
|
||||||
|
| **P1** | 退出准备清单模板 | D4 | Phase 1 用人工清单,Phase 2 系统化 | Phase 1-2 |
|
||||||
|
| **P2** | LP 报告自动生成 | D4 | 系统自动从各模块汇总企业数据生成 LP 报告 | Phase 3 |
|
||||||
|
| **P2** | NPS 调查机制 | D7 | 与满意度问卷同步上线 | Phase 3 |
|
||||||
|
|
||||||
|
> 整体数据自动化率约 **82%**,其中 D7 被投企业满意度自动化最低(40%),但这符合行业实践——满意度本质上是主观评价,必须通过人工问卷 + 访谈获取。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 八、分配计算示例
|
||||||
|
|
||||||
|
### 8.1 场景假设
|
||||||
|
|
||||||
|
```
|
||||||
|
基金规模: 10 亿
|
||||||
|
Carry: 20%(2 亿)
|
||||||
|
投后团队 Carry 分成: 15%
|
||||||
|
年度绩效池: 600 万
|
||||||
|
投后团队: 5 人
|
||||||
|
```
|
||||||
|
|
||||||
|
### 8.2 年度评分结果
|
||||||
|
|
||||||
|
| 投后经理 | 最终得分 | 等级 | 分配倍率 | 调节系数 | 负责企业 AUM 权重 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 经理 A | 97.50 | S | 150% | 1.05 | 25% |
|
||||||
|
| 经理 B | 82.30 | A | 100% | 1.00 | 20% |
|
||||||
|
| 经理 C | 75.60 | A | 100% | 0.95 | 18% |
|
||||||
|
| 经理 D | 65.20 | B | 50% | 1.00 | 22% |
|
||||||
|
| 经理 E | 58.00 | C | 0% | — | 15% |
|
||||||
|
|
||||||
|
### 8.3 分配计算
|
||||||
|
|
||||||
|
```
|
||||||
|
步骤 1: 计算有效份额
|
||||||
|
经理 A: 97.50 × 1.50 × 1.05 × 0.25 = 38.39
|
||||||
|
经理 B: 82.30 × 1.00 × 1.00 × 0.20 = 16.46
|
||||||
|
经理 C: 75.60 × 1.00 × 0.95 × 0.18 = 12.93
|
||||||
|
经理 D: 65.20 × 0.50 × 1.00 × 0.22 = 7.17
|
||||||
|
经理 E: 不参与分配
|
||||||
|
|
||||||
|
有效份额总和 = 74.95
|
||||||
|
|
||||||
|
步骤 2: 计算分配金额
|
||||||
|
经理 A: 600 万 × (38.39 / 74.95) = 307.3 万
|
||||||
|
经理 B: 600 万 × (16.46 / 74.95) = 131.7 万
|
||||||
|
经理 C: 600 万 × (12.93 / 74.95) = 103.5 万
|
||||||
|
经理 D: 600 万 × (7.17 / 74.95) = 57.4 万
|
||||||
|
经理 E: 0 万
|
||||||
|
|
||||||
|
未分配余额: 600 - 599.9 = 0.1 万 → 滚入下年度
|
||||||
|
|
||||||
|
步骤 3: 经理 E 的份额(15% AUM 对应的份额)滚入下年度绩效池
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、实施路线
|
||||||
|
|
||||||
|
| 阶段 | 时间 | 内容 |
|
||||||
|
|---|---|---|
|
||||||
|
| **Phase 1: 数据基建** | 0-3 个月 | 健康度评分、风险闭环、月报管理数据接入绩效看板 |
|
||||||
|
| **Phase 2: Alpha 归因 + 价值追踪** | 3-6 个月 | 干预事件记录、Alpha 归因分析、估值追踪、IRR/MOIC/DPI 接入上线,D5/D6 维度开始采集 |
|
||||||
|
| **Phase 3: 满意度调查 + 试运行** | 6-12 个月 | 八大维度全部采集,被投企业满意度调查上线,月度看板上线,不挂钩分配 |
|
||||||
|
| **Phase 4: 正式运行** | 12 个月后 | 季度校准 + 年度结算,绩效池正式分配 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 十、附则
|
||||||
|
|
||||||
|
### 10.1 方案调整机制
|
||||||
|
|
||||||
|
- 每年度根据基金阶段、市场环境和系统数据成熟度调整维度权重和目标值
|
||||||
|
- 权重调整需经合伙人会议批准
|
||||||
|
- 新维度加入时设 6 个月试运行期,试运行期不计入正式评分
|
||||||
|
|
||||||
|
### 10.2 争议处理
|
||||||
|
|
||||||
|
- 投后经理对评分有异议,可在年度面谈后 5 个工作日内提交申诉
|
||||||
|
- 申诉由合伙人 + HR 组成仲裁小组处理
|
||||||
|
- Alpha 归因结果可作为客观佐证
|
||||||
|
|
||||||
|
### 10.3 保密要求
|
||||||
|
|
||||||
|
- 个人绩效得分和分配金额仅本人、投后负责人、合伙人和 HR 可见
|
||||||
|
- 团队汇总数据(不含个人)可在团队会议中分享
|
||||||
|
- 绩效数据在系统中按字段级权限控制,AI 权限继承用户权限
|
||||||
Reference in New Issue
Block a user