Files

1278 lines
96 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""演示种子数据 — 按 5 个业务场景生成完整示例数据。
覆盖模型:Tenant / User / Company / MonthlyReport / HealthScore / RiskEvent /
WeakSignal / Task / OKR / MilestoneTree / SynergyOpportunity / DecisionSentinel /
NudgeRecord / MajorEvent / InvestmentAgreement / BoardMeeting / FinancialData /
Hypothesis / AARRecord / TeamMember / TalentProfile / AuditLog。
运行方式:
cd backend && python -m scripts.seed_demo_data
"""
import asyncio
import json
import random
from datetime import datetime, timedelta, timezone
from sqlalchemy import text
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.database import async_session_factory, engine, Base
from app.core.security import hash_password
from app.models import (
AARRecord, AgentExecution, AuditLog, BoardMeeting, Company, CompanyFundLink,
CustomerAcquisitionPlan, DataSource, DecisionSentinel, DigitalTwinModel,
EvaluationTemplate, ExitPrediction, FinancialData, FirmProfile, Fund,
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
# ─── 固定 ID(方便跨表引用) ──────────────────────────────────────────
TENANT_ID = "00000000-0000-0000-0000-000000000001"
ADMIN_ID = "00000000-0000-0000-0000-000000000002"
GP_ID = "00000000-0000-0000-0000-000000000003"
LEAD_ID = "00000000-0000-0000-0000-000000000004"
MGR_ID = "00000000-0000-0000-0000-000000000005"
FOUNDER_A = "00000000-0000-0000-0000-000000000006"
FOUNDER_B = "00000000-0000-0000-0000-000000000007"
FOUNDER_C = "00000000-0000-0000-0000-000000000008"
COMP_A = "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1"
COMP_B = "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbb2"
COMP_C = "cccccccc-cccc-cccc-cccc-ccccccccccc3"
COMP_D = "dddddddd-dddd-dddd-dddd-ddddddddddd4"
COMP_E = "eeeeeeee-eeee-eeee-eeee-eeeeeeeeeee5"
NOW = datetime.now(UTC)
D = lambda days: NOW - timedelta(days=days) # noqa: E731
async def seed() -> None:
"""生成全部演示数据。"""
async with engine.begin() as conn:
await conn.run_sync(Base.metadata.drop_all)
await conn.run_sync(Base.metadata.create_all)
async with async_session_factory() as db:
await _seed_tenant_users(db)
await _seed_companies(db)
await _seed_funds(db)
await _seed_profiles(db)
await _seed_evaluation_templates(db)
await _seed_financial(db)
await _seed_reports(db)
await _seed_inquiries(db)
await _seed_health(db)
await _seed_health_history(db)
await _seed_risks(db)
await _seed_weak_signals(db)
await _seed_tasks(db)
await _seed_okrs(db)
await _seed_milestones(db)
await _seed_synergies(db)
await _seed_sentinels(db)
await _seed_nudges(db)
await _seed_events(db)
await _seed_agreements(db)
await _seed_boards(db)
await _seed_hypotheses(db)
await _seed_aars(db)
await _seed_team_members(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 db.commit()
print("✅ 演示数据生成完成")
print(f" 租户: {TENANT_ID}")
print(f" 用户: admin/gp/lead/mgr/founder_a/founder_b/founder_c")
print(f" 企业: 智链科技/云栈数据/深瞳智能/量子芯微/光合生物")
print(" 登录密码均为: demo123456")
# ─── 租户 + 用户 ───────────────────────────────────────────────────────
async def _seed_tenant_users(db: AsyncSession) -> None:
tenant = Tenant(
id=TENANT_ID,
name="远见资本",
type="vc",
config_json={"fund_name": "远见三期", "fund_size": "5亿人民币"},
)
db.add(tenant)
users = [
User(id=ADMIN_ID, tenant_id=TENANT_ID, email="admin@demo.com", password_hash=hash_password("demo123456"), name="系统管理员", role="admin", is_active=True),
User(id=GP_ID, tenant_id=TENANT_ID, email="gp@demo.com", password_hash=hash_password("demo123456"), name="张远见", role="gp", is_active=True),
User(id=LEAD_ID, tenant_id=TENANT_ID, email="lead@demo.com", password_hash=hash_password("demo123456"), name="李投后", role="post_invest_lead", is_active=True),
User(id=MGR_ID, tenant_id=TENANT_ID, email="mgr@demo.com", password_hash=hash_password("demo123456"), name="王经理", role="investor", is_active=True),
User(id=FOUNDER_A, tenant_id=TENANT_ID, email="founder_a@demo.com", password_hash=hash_password("demo123456"), name="陈智链", role="founder", is_active=True),
User(id=FOUNDER_B, tenant_id=TENANT_ID, email="founder_b@demo.com", password_hash=hash_password("demo123456"), name="刘云栈", role="founder", is_active=True),
User(id=FOUNDER_C, tenant_id=TENANT_ID, email="founder_c@demo.com", password_hash=hash_password("demo123456"), name="赵深瞳", role="founder", is_active=True),
]
for u in users:
db.add(u)
await db.flush()
print(" ✓ 租户 + 7 用户")
# ─── 企业 ──────────────────────────────────────────────────────────────
async def _seed_companies(db: AsyncSession) -> None:
companies = [
Company(id=COMP_A, tenant_id=TENANT_ID, name="智链科技有限公司", industry="AI/供应链", stage="b",
description="利用大模型优化供应链决策,服务制造业客户。",
founded_at=datetime(2021, 3, 1, tzinfo=UTC), total_funding="1.2亿人民币", website="https://zhilian.example.com"),
Company(id=COMP_B, tenant_id=TENANT_ID, name="云栈数据科技", industry="AI/数据平台", stage="a",
description="企业级数据治理与 AI 训练数据管理平台。",
founded_at=datetime(2022, 1, 1, tzinfo=UTC), total_funding="5000万人民币", website="https://yunzhan.example.com"),
Company(id=COMP_C, tenant_id=TENANT_ID, name="深瞳智能", industry="AI/计算机视觉", stage="b",
description="工业质检视觉 AI,服务半导体和新能源行业。",
founded_at=datetime(2020, 6, 1, tzinfo=UTC), total_funding="2亿人民币", website="https://shentong.example.com"),
Company(id=COMP_D, tenant_id=TENANT_ID, name="量子芯微电子", industry="芯片/AI算力", stage="seed",
description="AI 推理芯片设计,边缘端低功耗 NPU。",
founded_at=datetime(2023, 9, 1, tzinfo=UTC), total_funding="1500万人民币", website="https://quantumchip.example.com"),
Company(id=COMP_E, tenant_id=TENANT_ID, name="光合生物医疗", industry="AI/医疗", stage="a",
description="AI 辅助药物发现,聚焦小分子靶点筛选。",
founded_at=datetime(2022, 9, 1, tzinfo=UTC), total_funding="8000万人民币", website="https://guanghe.example.com"),
]
for c in companies:
db.add(c)
await db.flush()
print(" ✓ 5 企业")
# ─── 财务数据 ──────────────────────────────────────────────────────────
async def _seed_financial(db: AsyncSession) -> None:
"""每家企业生成近 6 个月利润表 + 现金流。"""
for comp_id, revenue, burn, cash in [
(COMP_A, 800, 350, 4200), # 月营收800万, 消耗350万, 现金4200万
(COMP_B, 150, 120, 1800),
(COMP_C, 1200, 480, 6500),
(COMP_D, 0, 80, 600),
(COMP_E, 80, 200, 2400),
]:
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)
# 营收逐月递减(历史数据),展示增长趋势
hist_revenue = int(revenue * (1 - 0.03 * i)) if revenue > 0 else 0
db.add(FinancialData(
company_id=comp_id, period_year=y, period_month=m,
statement_type="income",
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,
))
db.add(FinancialData(
company_id=comp_id, period_year=y, period_month=m,
statement_type="cash_flow",
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,
))
await db.flush()
print(" ✓ 财务数据 (5 企业 x 6 月)")
# ─── 月报 ──────────────────────────────────────────────────────────────
async def _seed_reports(db: AsyncSession) -> None:
reports = [
# 智链科技 — 已提交 + AI 解析
MonthlyReport(company_id=COMP_A, period_year=NOW.year, period_month=NOW.month - 1 if NOW.month > 1 else 12,
status="ai_parsed", submitted_by=FOUNDER_A, submitted_at=D(10),
raw_content="本月营收800万,环比增长15%。新签客户3家,流失1家。团队新增5人。AI模型推理成本降低12%",
structured_data={"revenue": 800, "mom_growth": 0.15, "new_customers": 3, "churned": 1, "headcount": 45, "ai_cost_reduction": 0.12},
ai_summary="智链科技本月表现良好,营收增长15%,AI推理成本优化显著。客户净增2家,团队扩张至45人。",
ai_concerns=[{"level": "medium", "item": "客户流失率环比上升", "detail": "本月流失1家年合同客户"}, {"level": "low", "item": "现金Runway 12个月", "detail": "按当前消耗速度可维持12个月"}]),
# 云栈数据 — 已提交
MonthlyReport(company_id=COMP_B, period_year=NOW.year, period_month=NOW.month - 1 if NOW.month > 1 else 12,
status="ai_parsed", submitted_by=FOUNDER_B, submitted_at=D(8),
raw_content="本月营收150万,环比持平。完成数据治理平台v2.0发布。新签1家金融客户。",
structured_data={"revenue": 150, "mom_growth": 0.0, "new_customers": 1, "churned": 0, "headcount": 22},
ai_summary="云栈数据营收持平,产品迭代正常。金融客户拓展是亮点。",
ai_concerns=[{"level": "high", "item": "营收增长停滞", "detail": "连续2个月环比0%增长"}, {"level": "medium", "item": "现金Runway 15个月", "detail": "需关注融资节奏"}]),
# 深瞳智能 — 已提交
MonthlyReport(company_id=COMP_C, period_year=NOW.year, period_month=NOW.month - 1 if NOW.month > 1 else 12,
status="reviewed", submitted_by=FOUNDER_C, submitted_at=D(12), reviewed_by=MGR_ID, reviewed_at=D(5),
raw_content="本月营收1200万,环比增长22%。半导体客户占比提升至60%。新增专利2项。",
structured_data={"revenue": 1200, "mom_growth": 0.22, "new_customers": 2, "churned": 0, "headcount": 68, "patents": 2},
ai_summary="深瞳智能强劲增长,半导体行业渗透加深。专利积累构建技术壁垒。",
ai_concerns=[{"level": "low", "item": "客户集中度风险", "detail": "半导体行业占比60%"}]),
# 量子芯微 — 草稿
MonthlyReport(company_id=COMP_D, period_year=NOW.year, period_month=NOW.month - 1 if NOW.month > 1 else 12,
status="draft", submitted_by=None,
raw_content="", structured_data=None, ai_summary=None, ai_concerns=None),
# 光合生物 — 延迟提交
MonthlyReport(company_id=COMP_E, period_year=NOW.year, period_month=NOW.month - 2 if NOW.month > 2 else 11,
status="ai_parsed", submitted_by=FOUNDER_A, submitted_at=D(40),
raw_content="本月营收80万,来自2个合作药企里程碑付款。研发进展:3个靶点进入先导化合物阶段。",
structured_data={"revenue": 80, "milestone_payment": 80, "targets": 3, "headcount": 18},
ai_summary="光合生物收入来自里程碑付款,研发管线推进正常。",
ai_concerns=[{"level": "high", "item": "月报延迟提交", "detail": "延迟20天"}, {"level": "medium", "item": "现金消耗快", "detail": "月消耗200万,Runway 12月"}]),
]
for r in reports:
db.add(r)
await db.flush()
# 历史月报 — 每家企业再补 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:
"""最新一期健康度评分 — 14 维度完整评分。"""
scores = [
# 智链科技 — 良好
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,
synergy_score=76, ai_model_product_score=82, data_compliance_score=88, team_tech_score=74, customer_success_score=68,
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,
org_talent_score=70, product_tech_score=72, market_compete_score=58, governance_score=65, financing_score=50,
synergy_score=64, ai_model_product_score=68, data_compliance_score=85, team_tech_score=72, customer_success_score=60,
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,
org_talent_score=83, product_tech_score=88, market_compete_score=86, governance_score=82, financing_score=85,
synergy_score=80, ai_model_product_score=86, data_compliance_score=90, team_tech_score=85, customer_success_score=82,
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,
org_talent_score=52, product_tech_score=60, market_compete_score=42, governance_score=55, financing_score=40,
synergy_score=45, ai_model_product_score=58, data_compliance_score=65, team_tech_score=62, customer_success_score=38,
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,
org_talent_score=68, product_tech_score=75, market_compete_score=65, governance_score=70, financing_score=62,
synergy_score=66, ai_model_product_score=72, data_compliance_score=80, team_tech_score=70, customer_success_score=65,
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:
s.calculated_at = D(5)
db.add(s)
await db.flush()
print(" ✓ 健康度评分 (5 企业 x 14 维度)")
# ─── 风险事件 ──────────────────────────────────────────────────────────
async def _seed_risks(db: AsyncSession) -> None:
risks = [
# COMP_A — 智链科技
RiskEvent(company_id=COMP_A, type="operational", severity="medium", status="in_progress",
title="客户流失率环比上升", description="本月流失1家年合同客户,流失率从2%升至4%",
evidence_json={"metric": "churn_rate", "current": 0.04, "previous": 0.02, "threshold": 0.03},
suggested_action="联系流失客户了解原因,加强客户成功团队", assigned_to=MGR_ID, due_at=D(-7)),
RiskEvent(company_id=COMP_A, type="ai_specific", severity="low", status="closed",
title="AI模型推理成本超标", description="上月推理成本占营收比12%,超10%阈值",
evidence_json={"metric": "ai_cost_ratio", "current": 0.12, "threshold": 0.10},
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:
r.identified_at = D(15)
db.add(r)
await db.flush()
print(" ✓ 风险事件 (15 条)")
# ─── 弱信号 ────────────────────────────────────────────────────────────
async def _seed_weak_signals(db: AsyncSession) -> None:
signals = [
WeakSignal(company_id=COMP_B, signal_type="market", source="行业论坛", content="竞品发布类似数据治理产品,定价低30%",
confidence=0.72, risk_probability=0.65, status="alerted",
correlation_result={"related_signals": 2, "pattern": "竞品压力增加"}),
WeakSignal(company_id=COMP_C, signal_type="org", source="LinkedIn", content="CTO 更新简历,标注'开放看机会'",
confidence=0.85, risk_probability=0.78, status="alerted",
correlation_result={"related_signals": 1, "pattern": "核心人员流失风险"}),
WeakSignal(company_id=COMP_D, signal_type="technical", source="GitHub", content="核心开源依赖库停止维护,需迁移",
confidence=0.68, risk_probability=0.45, status="correlated"),
WeakSignal(company_id=COMP_A, signal_type="sentiment", source="客户反馈", content="大客户提及预算削减计划",
confidence=0.60, risk_probability=0.55, status="new"),
WeakSignal(company_id=COMP_E, signal_type="market", source="FDA新闻", content="同类靶点药物获FDA快速审批",
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:
s.detected_at = D(7)
db.add(s)
await db.flush()
print(" ✓ 弱信号 (9 条)")
# ─── 任务 ──────────────────────────────────────────────────────────────
async def _seed_tasks(db: AsyncSession) -> None:
tasks = [
Task(tenant_id=TENANT_ID, company_id=COMP_A, title="联系流失客户进行回访", description="了解客户流失原因,制定挽留方案",
status="in_progress", priority="high", assigned_to=MGR_ID, source_type="risk", due_at=D(-3)),
Task(tenant_id=TENANT_ID, company_id=COMP_B, title="与云栈数据创始人讨论增长策略", description="评估产品定价和市场拓展方案",
status="todo", priority="high", assigned_to=LEAD_ID, source_type="risk", due_at=D(-1)),
Task(tenant_id=TENANT_ID, company_id=COMP_D, title="准备天使+轮BP", description="包含财务预测和产品路线图",
status="todo", priority="urgent", assigned_to=GP_ID, source_type="risk", due_at=D(-14)),
Task(tenant_id=TENANT_ID, company_id=COMP_C, title="评估CTO股权激励调整方案", description="了解CTO诉求,设计retention package",
status="todo", priority="medium", assigned_to=LEAD_ID, source_type="manual", due_at=D(-7)),
Task(tenant_id=TENANT_ID, company_id=COMP_A, title="审阅智链科技本月月报", description="关注AI成本降低和客户流失",
status="done", priority="medium", assigned_to=MGR_ID, source_type="report", completed_at=D(-3)),
Task(tenant_id=TENANT_ID, company_id=COMP_E, title="跟进光合生物月报提交及时性", description="设置自动提醒,沟通提交规范",
status="done", priority="medium", assigned_to=MGR_ID, source_type="manual", completed_at=D(-2)),
]
for t in tasks:
db.add(t)
await db.flush()
print(" ✓ 任务 (6 条)")
# ─── OKR ───────────────────────────────────────────────────────────────
async def _seed_okrs(db: AsyncSession) -> None:
okrs = [
OKR(company_id=COMP_A, quarter=f"{NOW.year}-Q{(NOW.month - 1) // 3 + 1}",
objective="实现季度营收3000万,客户净增8家",
key_results=[{"kr": "季度营收达3000万", "current": 2400, "target": 3000, "progress": 0.80},
{"kr": "新签客户8家", "current": 5, "target": 8, "progress": 0.625},
{"kr": "客户流失率<3%", "current": 0.04, "target": 0.03, "progress": 0.75}],
alignment_score=82.0, status="active",
deviation_alerts=[{"kr": "客户流失率", "current": "4%", "target": "<3%", "severity": "medium"}]),
OKR(company_id=COMP_B, quarter=f"{NOW.year}-Q{(NOW.month - 1) // 3 + 1}",
objective="完成A+轮融资,营收突破500万/月",
key_results=[{"kr": "月营收达500万", "current": 150, "target": 500, "progress": 0.30},
{"kr": "完成A+轮融资", "current": 0, "target": 1, "progress": 0.0},
{"kr": "签约3家金融客户", "current": 1, "target": 3, "progress": 0.33}],
alignment_score=55.0, status="active",
deviation_alerts=[{"kr": "月营收", "current": "150万", "target": "500万", "severity": "high"},
{"kr": "融资进度", "current": "未启动", "target": "完成", "severity": "high"}]),
OKR(company_id=COMP_C, quarter=f"{NOW.year}-Q{(NOW.month - 1) // 3 + 1}",
objective="半导体行业营收占比70%,新增专利5项",
key_results=[{"kr": "半导体营收占比70%", "current": 0.60, "target": 0.70, "progress": 0.857},
{"kr": "新增专利5项", "current": 2, "target": 5, "progress": 0.40}],
alignment_score=88.0, status="active", deviation_alerts=[]),
]
for o in okrs:
db.add(o)
await db.flush()
print(" ✓ OKR (3 条)")
# ─── 里程碑 ────────────────────────────────────────────────────────────
async def _seed_milestones(db: AsyncSession) -> None:
# 智链科技里程碑树
m1 = MilestoneTree(company_id=COMP_A, name="B轮融资", is_current=True, status="in_progress", target_date=D(-90), description="B轮1亿人民币,估值8亿")
db.add(m1); await db.flush()
m2 = MilestoneTree(company_id=COMP_A, name="产品v3.0发布", parent_id=m1.id, is_current=True, status="completed", actual_date=D(-20), description="多模态供应链决策引擎")
m3 = MilestoneTree(company_id=COMP_A, name="客户数突破50", parent_id=m1.id, is_current=True, status="in_progress", target_date=D(-60))
m4 = MilestoneTree(company_id=COMP_A, name="海外市场拓展", parent_id=m1.id, is_current=False, status="planned", target_date=D(-180), description="东南亚试点 — 备选路径",
ai_analysis={"risk": "海外合规成本高", "opportunity": "市场先发优势"})
for m in [m2, m3, m4]:
db.add(m)
# 云栈数据里程碑
m5 = MilestoneTree(company_id=COMP_B, name="A+轮融资", is_current=True, status="in_progress", target_date=D(-45), description="A+轮3000万人民币")
db.add(m5); await db.flush()
m6 = MilestoneTree(company_id=COMP_B, name="数据治理平台v2.0", parent_id=m5.id, is_current=True, status="completed", actual_date=D(-10))
m7 = MilestoneTree(company_id=COMP_B, name="金融行业突破", parent_id=m5.id, is_current=True, status="in_progress", target_date=D(-30))
for m in [m6, m7]:
db.add(m)
await db.flush()
print(" ✓ 里程碑 (7 节点)")
# ─── 协同机会 ──────────────────────────────────────────────────────────
async def _seed_synergies(db: AsyncSession) -> None:
synergies = [
SynergyOpportunity(tenant_id=TENANT_ID, type="customer", company_a_id=COMP_A, company_b_id=COMP_C,
title="智链科技 → 深瞳智能:制造业客户共享",
description="智链科技的3家制造业客户有质检需求,可引荐深瞳智能。",
match_reason="AI分析:客户行业重叠度高,需求互补",
status="confirmed", authorized=True),
SynergyOpportunity(tenant_id=TENANT_ID, type="tech", company_a_id=COMP_B, company_b_id=COMP_D,
title="云栈数据 → 量子芯微:数据平台支持芯片设计仿真",
description="云栈数据平台可处理量子芯微的仿真数据集。",
match_reason="技术栈匹配,数据平台可降低芯片仿真IT成本40%",
status="discovered", authorized=False),
SynergyOpportunity(tenant_id=TENANT_ID, type="talent", company_a_id=COMP_C, company_b_id=COMP_E,
title="深瞳智能 → 光合生物:AI算法人才推荐",
description="深瞳智能有CV算法人才储备,光合生物需AI药物筛选算法工程师。",
match_reason="技能匹配度85%,工作地点同城",
status="executing", authorized=True,
effect_result={"candidates_referred": 3, "interviewed": 2, "offered": 1}),
]
for s in synergies:
db.add(s)
await db.flush()
print(" ✓ 协同机会 (3 条)")
# ─── 决策前哨 ──────────────────────────────────────────────────────────
async def _seed_sentinels(db: AsyncSession) -> None:
sentinels = [
DecisionSentinel(company_id=COMP_B, decision_type="funding",
title="A+轮融资时机选择:现在 vs 等待产品验证",
description="营收增长停滞,但产品v2.0刚发布。是否现在融资还是等Q2数据验证后融资?",
signals=[{"source": "月报", "signal": "营收停滞2月"}, {"source": "市场", "signal": "竞品定价低30%"}],
scenarios={"A": {"name": "现在融资", "pros": "现金充裕", "cons": "估值可能偏低", "probability": 0.6},
"B": {"name": "等待Q2验证", "pros": "估值更高", "cons": "现金Runway风险", "probability": 0.4}},
status="analyzed"),
DecisionSentinel(company_id=COMP_C, decision_type="hiring",
title="CTO retention:股权激励 vs 替换",
description="CTO稳定性下降,需决定加大股权激励还是提前寻找替代者。",
signals=[{"source": "LinkedIn", "signal": "CTO更新简历"}, {"source": "弱信号", "signal": "稳定性评分0.65"}],
scenarios={"A": {"name": "加大股权激励", "pros": "保留技术连续性", "cons": "股权稀释", "probability": 0.7},
"B": {"name": "启动替换搜索", "pros": "降低单点风险", "cons": "过渡期风险", "probability": 0.3}},
status="identified"),
DecisionSentinel(company_id=COMP_D, decision_type="funding",
title="天使+轮 vs Pre-A:融资策略选择",
description="现金Runway 7月,需快速融资。天使+轮快但金额小,Pre-A慢但可支撑更长。",
signals=[{"source": "财务", "signal": "Runway 7月"}, {"source": "产品", "signal": "NPU原型流片在即"}],
scenarios={"A": {"name": "天使+轮 1500万", "pros": "3个月内close", "cons": "只够6月", "probability": 0.55},
"B": {"name": "Pre-A 5000万", "pros": "支撑18月", "cons": "需6月", "probability": 0.45}},
status="acted"),
]
for s in sentinels:
s.identified_at = D(10)
db.add(s)
await db.flush()
print(" ✓ 决策前哨 (3 条)")
# ─── 行为助推 ──────────────────────────────────────────────────────────
async def _seed_nudges(db: AsyncSession) -> None:
nudges = [
NudgeRecord(company_id=COMP_A, nudge_type="anchoring",
context="月报审阅 — 客户流失率",
message="同类AI供应链企业平均客户流失率为2.5%,智链科技本月4%高于基准。",
target_user_id=MGR_ID, accepted=True,
effect_result={"action": "联系流失客户", "result": "挽留1家"}),
NudgeRecord(company_id=COMP_B, nudge_type="loss_aversion",
context="融资时机提醒",
message="如果不启动A+轮融资,预计6个月后现金耗尽,错失产品验证窗口。",
target_user_id=LEAD_ID, accepted=True,
effect_result={"action": "约见创始人讨论融资", "result": "启动BP准备"}),
NudgeRecord(company_id=COMP_D, nudge_type="social_proof",
context="融资策略",
message="Portfolio中3家类似阶段企业选择了Pre-A路线,平均估值高于天使+轮2倍。",
target_user_id=GP_ID, accepted=False,
effect_result={"action": "选择天使+轮", "result": "快速close"}),
NudgeRecord(company_id=COMP_C, nudge_type="timing",
context="CTO稳定性",
message="融资前是关键人才挽留的最佳时机,建议在B+轮前完成CTO股权激励调整。",
target_user_id=LEAD_ID, accepted=True,
effect_result={"action": "设计retention package", "result": "进行中"}),
]
for n in nudges:
db.add(n)
await db.flush()
print(" ✓ 行为助推 (4 条)")
# ─── 重大事项 ──────────────────────────────────────────────────────────
async def _seed_events(db: AsyncSession) -> None:
events = [
MajorEvent(company_id=COMP_A, event_type="product", title="产品v3.0多模态引擎发布", severity="high",
description="支持文本+图像+时序数据的多模态供应链决策引擎上线",
source="monthly_report", status="addressed", occurred_at=D(20)),
MajorEvent(company_id=COMP_C, event_type="personnel", title="CTO更新简历", severity="high",
description="CTO在LinkedIn更新简历,标注'开放看机会'",
source="weak_signal", status="confirmed", occurred_at=D(7)),
MajorEvent(company_id=COMP_D, event_type="funding", title="天使+轮融资启动", severity="critical",
description="现金Runway不足7月,启动天使+轮融资",
source="manual", status="addressed", occurred_at=D(3)),
MajorEvent(company_id=COMP_E, event_type="product", title="3个靶点进入先导化合物阶段", severity="medium",
description="AI药物筛选管线推进,3个靶点通过虚拟筛选进入实验验证",
source="monthly_report", status="confirmed", occurred_at=D(15)),
]
for e in events:
db.add(e)
await db.flush()
print(" ✓ 重大事项 (4 条)")
# ─── 投资协议 ──────────────────────────────────────────────────────────
async def _seed_agreements(db: AsyncSession) -> None:
agreements = [
InvestmentAgreement(company_id=COMP_A, title="B轮投资协议", signed_at=datetime(2023, 6, 1, tzinfo=UTC),
key_clauses={"valuation": "8亿人民币", "investment": "1亿", "board_seat": "1席", "anti_dilution": "加权平均", "liquidation_pref": "1x非参与"},
monitoring_rules=[{"clause": "反稀释", "trigger": "下一轮估值低于8亿", "action": "通知GP"}],
status="active"),
InvestmentAgreement(company_id=COMP_B, title="A轮投资协议", signed_at=datetime(2023, 3, 1, tzinfo=UTC),
key_clauses={"valuation": "3亿", "investment": "5000万", "board_seat": "1席", "redemption_right": "5年后可要求回购"},
monitoring_rules=[{"clause": "回购权", "trigger": "2028-03-01", "action": "提前6月提醒"}],
status="active"),
InvestmentAgreement(company_id=COMP_C, title="B轮投资协议", signed_at=datetime(2022, 12, 1, tzinfo=UTC),
key_clauses={"valuation": "10亿", "investment": "2亿", "board_seat": "1席", "info_rights": "月报+季度财务"},
monitoring_rules=[{"clause": "信息权", "trigger": "月报延迟>5天", "action": "通知投后负责人"}],
status="active"),
]
for a in agreements:
db.add(a)
await db.flush()
print(" ✓ 投资协议 (3 份)")
# ─── 董事会 ────────────────────────────────────────────────────────────
async def _seed_boards(db: AsyncSession) -> None:
boards = [
BoardMeeting(company_id=COMP_A, title="2025年Q2董事会", meeting_at=D(-7), status="scheduled",
agenda=[{"item": "Q2经营汇报", "duration": "30min"}, {"item": "B轮融资进展", "duration": "20min"}, {"item": "客户流失分析", "duration": "15min"}],
materials_summary="AI摘要:Q2营收2400万(完成80%),客户净增5家但流失率上升,B轮估值预期8-10亿。",
questions=[{"q": "客户流失率上升的原因是什么?", "priority": "high"}, {"q": "B轮预计何时close", "priority": "medium"}]),
BoardMeeting(company_id=COMP_C, title="2025年Q2董事会", meeting_at=D(-14), status="completed",
agenda=[{"item": "Q2经营汇报", "duration": "30min"}, {"item": "半导体行业拓展", "duration": "20min"}],
minutes="Q2营收3600万超预期,半导体占比60%。专利新增2项。CTO稳定性需关注。",
resolutions=[{"item": "批准CTO股权激励调整方案", "status": "执行中"}, {"item": "Q3启动半导体行业专项销售", "status": "已启动"}]),
]
for b in boards:
db.add(b)
await db.flush()
print(" ✓ 董事会 (2 场)")
# ─── BML 假设 ──────────────────────────────────────────────────────────
async def _seed_hypotheses(db: AsyncSession) -> None:
hypotheses = [
Hypothesis(company_id=COMP_A, hypothesis="降低定价10%可提升客户签约率30%",
experiment="对3家潜在客户提供10%折扣试用",
data={"customers_tested": 3, "signed": 2, "conversion_rate": 0.67},
conclusion="部分验证:签约率提升67%(超预期30%),但需观察折扣结束后续约率",
status="validated"),
Hypothesis(company_id=COMP_B, hypothesis="金融行业客户愿意为数据合规功能支付20%溢价",
experiment="向2家金融客户展示合规模块并报价溢价20%",
data={"customers_tested": 2, "interested": 1, "signed": 0},
conclusion="待验证:1家表示感兴趣但需内部审批,尚未签约",
status="measuring"),
Hypothesis(company_id=COMP_C, hypothesis="半导体客户对边缘端质检需求年增长50%",
experiment="调研5家半导体客户未来12月质检预算",
data={"surveyed": 3, "budget_increase_avg": 0.35},
conclusion="未达预期:平均预算增长35%低于50%假设,但基础需求强劲",
status="learning"),
]
for h in hypotheses:
db.add(h)
await db.flush()
print(" ✓ BML 假设 (3 条)")
# ─── AAR 复盘 ──────────────────────────────────────────────────────────
async def _seed_aars(db: AsyncSession) -> None:
aars = [
AARRecord(company_id=COMP_A, trigger_event="Q1客户流失率升至4%",
original_plan="Q1客户流失率控制在2%以内",
actual_result="Q1流失率4%,流失2家年合同客户",
gap_analysis="客户成功团队响应延迟,流失客户反馈'技术支持不够及时'。竞品以低价策略抢客。",
lessons={"what_expected": "流失率2%", "what_happened": "4%", "why_gap": "客户成功人手不足+竞品低价", "what_learned": "需主动客户健康度监控", "what_to_change": "增加客户成功HC,建立预警机制"},
improvements=[{"action": "增加2名客户成功经理", "status": "已完成", "owner": "创始人"}, {"action": "建立客户健康度周报", "status": "进行中", "owner": "投资经理"}]),
AARRecord(company_id=COMP_C, trigger_event="CTO稳定性下降",
original_plan="核心技术团队稳定,无关键人员流失",
actual_result="CTO更新简历,稳定性评分0.65",
gap_analysis="CTO反馈股权激励不足,技术路线存在分歧。",
lessons={"what_expected": "CTO长期稳定", "what_happened": "稳定性下降", "why_gap": "股权激励未随估值增长调整", "what_learned": "关键人才激励需动态调整", "what_to_change": "建立定期激励review机制"},
improvements=[{"action": "CTO股权激励调整方案", "status": "设计中", "owner": "投后负责人"}]),
]
for a in aars:
db.add(a)
await db.flush()
print(" ✓ AAR 复盘 (2 条)")
# ─── 团队成员 ──────────────────────────────────────────────────────────
async def _seed_team_members(db: AsyncSession) -> None:
members = [
TeamMember(company_id=COMP_A, name="陈智链", role="CEO/创始人", is_key_person=True, joined_at=datetime(2021, 3, 1, tzinfo=UTC), stability_score=0.92),
TeamMember(company_id=COMP_A, name="张技术", role="CTO", is_key_person=True, joined_at=datetime(2021, 4, 1, tzinfo=UTC), stability_score=0.85),
TeamMember(company_id=COMP_A, name="李销售", role="VP销售", is_key_person=True, joined_at=datetime(2022, 1, 1, tzinfo=UTC), stability_score=0.80),
TeamMember(company_id=COMP_C, name="赵深瞳", role="CEO/创始人", is_key_person=True, joined_at=datetime(2020, 6, 1, tzinfo=UTC), stability_score=0.90),
TeamMember(company_id=COMP_C, name="孙算法", role="CTO", is_key_person=True, joined_at=datetime(2020, 7, 1, tzinfo=UTC), stability_score=0.65),
TeamMember(company_id=COMP_C, name="周产品", role="产品总监", is_key_person=False, joined_at=datetime(2021, 3, 1, tzinfo=UTC), stability_score=0.78),
TeamMember(company_id=COMP_B, name="刘云栈", role="CEO/创始人", is_key_person=True, joined_at=datetime(2022, 1, 1, tzinfo=UTC), stability_score=0.88),
]
for m in members:
db.add(m)
await db.flush()
print(" ✓ 团队成员 (7 人)")
# ─── 人才画像 ──────────────────────────────────────────────────────────
async def _seed_talents(db: AsyncSession) -> None:
talents = [
TalentProfile(tenant_id=TENANT_ID, name="孙算法", current_role="CTO", current_company="深瞳智能",
skills=["计算机视觉", "PyTorch", "团队管理", "边缘计算"], experience_years=12,
performance_rating=4.5, potential_rating=4.0, nine_box="star",
flow_prediction={"probability": 0.65, "timeline": "3-6月", "triggers": ["股权激励不足", "技术路线分歧"]},
status="active"),
TalentProfile(tenant_id=TENANT_ID, name="李销售", current_role="VP销售", current_company="智链科技",
skills=["B2B销售", "制造业客户", "团队管理"], experience_years=10,
performance_rating=4.2, potential_rating=3.8, nine_box="high_potential",
flow_prediction={"probability": 0.20, "timeline": "12月+", "triggers": []},
status="active"),
TalentProfile(tenant_id=TENANT_ID, name="吴架构", current_role="首席架构师", current_company="云栈数据",
skills=["分布式系统", "数据治理", "Kubernetes"], experience_years=15,
performance_rating=4.8, potential_rating=4.5, nine_box="star",
flow_prediction={"probability": 0.15, "timeline": "稳定", "triggers": []},
status="active"),
]
for t in talents:
db.add(t)
await db.flush()
print(" ✓ 人才画像 (3 人)")
# ─── 审计日志 ──────────────────────────────────────────────────────────
async def _seed_audit_logs(db: AsyncSession) -> None:
logs = [
AuditLog(tenant_id=TENANT_ID, user_id=MGR_ID, action="login", resource_type="auth", ip="192.168.1.100", created_at=D(0)),
AuditLog(tenant_id=TENANT_ID, user_id=MGR_ID, action="view", resource_type="company", resource_id=COMP_A, ip="192.168.1.100", created_at=D(0)),
AuditLog(tenant_id=TENANT_ID, user_id=MGR_ID, action="view", resource_type="report", resource_id="report_001", ip="192.168.1.100", created_at=D(0)),
AuditLog(tenant_id=TENANT_ID, user_id=LEAD_ID, action="view", resource_type="risk", resource_id="risk_001", ip="192.168.1.101", created_at=D(1)),
AuditLog(tenant_id=TENANT_ID, user_id=LEAD_ID, action="update", resource_type="risk", resource_id="risk_001", detail_json={"field": "status", "old": "open", "new": "assigned"}, ip="192.168.1.101", created_at=D(1)),
AuditLog(tenant_id=TENANT_ID, user_id=GP_ID, action="view", resource_type="dashboard", ip="192.168.1.102", created_at=D(2)),
AuditLog(tenant_id=TENANT_ID, user_id=GP_ID, action="ai_call", resource_type="weekly_brief", detail_json={"tokens": 3500, "model": "qwen-max"}, ip="192.168.1.102", created_at=D(2)),
AuditLog(tenant_id=TENANT_ID, user_id=ADMIN_ID, action="view", resource_type="audit_logs", ip="192.168.1.103", created_at=D(3)),
AuditLog(tenant_id=TENANT_ID, user_id=FOUNDER_A, action="create", resource_type="monthly_report", detail_json={"company": "智链科技", "period": f"{NOW.year}-{NOW.month-1}"}, ip="10.0.0.50", created_at=D(10)),
AuditLog(tenant_id=TENANT_ID, user_id=FOUNDER_B, action="create", resource_type="monthly_report", detail_json={"company": "云栈数据", "period": f"{NOW.year}-{NOW.month-1}"}, ip="10.0.0.51", created_at=D(8)),
]
for l in logs:
db.add(l)
await db.flush()
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__":
asyncio.run(seed())