Files
AIPortPilot/backend/app/services/evaluation_presets.py
T

155 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""评价模板预设配置种子数据。
启动时自动初始化 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 默认使用 growthinvestor_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
# 检查是否已有数据
result = await db_session.execute(select(EvaluationTemplate).limit(1))
existing = result.scalar_one_or_none()
if existing:
logger.info("评价模板表已有数据,跳过种子初始化")
return
templates = generate_preset_templates()
for tmpl_data in templates:
tmpl = EvaluationTemplate(**tmpl_data)
db_session.add(tmpl)
await db_session.flush()
logger.info("预设评价模板已写入数据库: %d", len(templates))