164 lines
5.1 KiB
Python
164 lines
5.1 KiB
Python
"""评价模板预设配置种子数据。
|
||
|
||
启动时自动初始化 50 个预设配置单元到数据库。
|
||
"""
|
||
|
||
import logging
|
||
from typing import Any
|
||
|
||
from app.services.evaluation_engine import compute_weights
|
||
|
||
logger = logging.getLogger(__name__)
|
||
|
||
# 基金类型列表
|
||
FUND_TYPES = ["angel", "early_vc", "growth_vc", "pe", "cvc", "fof", "distress", "esg"]
|
||
|
||
# 存续期阶段列表
|
||
FUND_LIFECYCLES = ["investment", "growth", "exit_preparation", "liquidation"]
|
||
|
||
# 企业阶段列表
|
||
COMPANY_STAGES = ["seed", "a", "b", "c", "pre_ipo"]
|
||
|
||
# 产业赛道列表
|
||
INDUSTRIES = ["ai", "saas", "hardware", "biotech", "consumer", "fintech", "manufacturing"]
|
||
|
||
# 投资策略列表
|
||
STRATEGIES = ["growth", "value", "empowerment", "turnaround"]
|
||
|
||
# 投资人类型列表
|
||
INVESTOR_TYPES = ["gp", "post_invest_lead", "investor"]
|
||
|
||
# 模板名称中文名
|
||
FUND_TYPE_LABELS = {
|
||
"angel": "天使/种子基金",
|
||
"early_vc": "早期VC",
|
||
"growth_vc": "成长期VC",
|
||
"pe": "PE/并购基金",
|
||
"cvc": "产业基金",
|
||
"fof": "母基金",
|
||
"distress": "困境/特殊机会基金",
|
||
"esg": "ESG/影响力基金",
|
||
}
|
||
|
||
LIFECYCLE_LABELS = {
|
||
"investment": "投资期",
|
||
"growth": "成长期",
|
||
"exit_preparation": "退出准备期",
|
||
"liquidation": "清算期",
|
||
}
|
||
|
||
STAGE_LABELS = {
|
||
"seed": "种子/天使",
|
||
"a": "A轮",
|
||
"b": "B轮",
|
||
"c": "C轮+",
|
||
"pre_ipo": "Pre-IPO",
|
||
}
|
||
|
||
INDUSTRY_LABELS = {
|
||
"ai": "AI/SaaS",
|
||
"saas": "企业服务",
|
||
"hardware": "硬科技/芯片",
|
||
"biotech": "生物医药",
|
||
"consumer": "消费品牌",
|
||
"fintech": "金融科技",
|
||
"manufacturing": "新能源/先进制造",
|
||
}
|
||
|
||
STRATEGY_LABELS = {
|
||
"growth": "成长型",
|
||
"value": "价值型",
|
||
"empowerment": "投后赋能型",
|
||
"turnaround": "困境反转型",
|
||
}
|
||
|
||
|
||
def generate_preset_templates() -> list[dict[str, Any]]:
|
||
"""生成全部预设模板配置。
|
||
|
||
策略:为每个 (fund_type, lifecycle, stage, industry) 组合生成默认模板,
|
||
strategy 默认使用 growth,investor_type 默认使用 investor。
|
||
用户可以在前端创建自定义策略/投资人类型的模板。
|
||
|
||
Returns:
|
||
模板配置字典列表
|
||
"""
|
||
templates: list[dict[str, Any]] = []
|
||
|
||
for fund_type in FUND_TYPES:
|
||
for lifecycle in FUND_LIFECYCLES:
|
||
for stage in COMPANY_STAGES:
|
||
for industry in INDUSTRIES:
|
||
# FOF 不生成单企业模板
|
||
if fund_type == "fof":
|
||
continue
|
||
|
||
result = compute_weights(
|
||
fund_type=fund_type,
|
||
fund_lifecycle=lifecycle,
|
||
company_stage=stage,
|
||
industry=industry,
|
||
strategy="growth",
|
||
investor_type="investor",
|
||
)
|
||
|
||
name = (
|
||
f"{FUND_TYPE_LABELS[fund_type]}-{LIFECYCLE_LABELS[lifecycle]}-"
|
||
f"{STAGE_LABELS[stage]}-{INDUSTRY_LABELS[industry]}"
|
||
)
|
||
|
||
templates.append({
|
||
"name": name,
|
||
"fund_type": fund_type,
|
||
"fund_lifecycle": lifecycle,
|
||
"company_stage": stage,
|
||
"industry": industry,
|
||
"strategy": "growth",
|
||
"investor_type": "investor",
|
||
"weights_json": result["weights"],
|
||
"enabled_dimensions": result["enabled_dimensions"],
|
||
"disabled_dimensions": result["disabled_dimensions"],
|
||
"custom_metrics_json": {"metrics": result["custom_metrics"]},
|
||
"is_default": True,
|
||
"is_active": True,
|
||
"version": 1,
|
||
})
|
||
|
||
logger.info("生成预设模板 %d 个", len(templates))
|
||
return templates
|
||
|
||
|
||
async def seed_evaluation_templates(db_session) -> None:
|
||
"""将预设模板写入数据库(仅当表为空时)。
|
||
|
||
Args:
|
||
db_session: 异步数据库会话
|
||
"""
|
||
from sqlalchemy import select
|
||
from app.models.evaluation_template import EvaluationTemplate
|
||
from app.models.tenant import Tenant
|
||
|
||
# 检查是否已有数据
|
||
result = await db_session.execute(select(EvaluationTemplate).limit(1))
|
||
existing = result.scalar_one_or_none()
|
||
|
||
if existing:
|
||
logger.info("评价模板表已有数据,跳过种子初始化")
|
||
return
|
||
|
||
# 获取第一个租户作为默认租户
|
||
tenant_result = await db_session.execute(select(Tenant).limit(1))
|
||
tenant = tenant_result.scalar_one_or_none()
|
||
if not tenant:
|
||
logger.warning("无租户数据,跳过评价模板种子初始化")
|
||
return
|
||
|
||
tenant_id = str(tenant.id)
|
||
templates = generate_preset_templates()
|
||
for tmpl_data in templates:
|
||
tmpl = EvaluationTemplate(tenant_id=tenant_id, **tmpl_data)
|
||
db_session.add(tmpl)
|
||
|
||
await db_session.flush()
|
||
logger.info("预设评价模板已写入数据库: %d 个 (tenant=%s)", len(templates), tenant_id)
|