318 lines
13 KiB
Python
318 lines
13 KiB
Python
"""兴邦金租历史评审数据源(虚拟示例数据,2024-2026年)
|
|||
|
|
|
||
|
|
用于智能分配算法的数据驱动决策:
|
||
|
|
- 主审员产能画像(平均评审天数、行业专长、质量分)
|
||
|
|
- 历史项目追溯(按主审员/行业查询)
|
||
|
|
- 多维度分配推荐依据
|
||
|
|
"""
|
||
|
|
|
||
|
|
import random
|
||
|
|
from datetime import datetime, timedelta
|
||
|
|
from typing import List, Dict, Optional
|
||
|
|
|
||
|
|
# ============ 历史评审项目数据结构 ============
|
||
|
|
|
||
|
|
class HistoricalProject:
|
||
|
|
"""历史评审项目记录"""
|
||
|
|
def __init__(
|
||
|
|
self,
|
||
|
|
project_id: str,
|
||
|
|
project_name: str,
|
||
|
|
industry: str,
|
||
|
|
credit_amount: float, # 万元
|
||
|
|
complexity: int, # 1-5,难度
|
||
|
|
planned_days: int, # 计划评审天数
|
||
|
|
actual_days: int, # 实际评审天数
|
||
|
|
reviewer: str, # 主审员
|
||
|
|
outcome: str, # 通过/否决/撤并
|
||
|
|
quality_score: int, # 0-100,历史质量分
|
||
|
|
review_date: str, # YYYY-MM-DD
|
||
|
|
):
|
||
|
|
self.project_id = project_id
|
||
|
|
self.project_name = project_name
|
||
|
|
self.industry = industry
|
||
|
|
self.credit_amount = credit_amount
|
||
|
|
self.complexity = complexity
|
||
|
|
self.planned_days = planned_days
|
||
|
|
self.actual_days = actual_days
|
||
|
|
self.reviewer = reviewer
|
||
|
|
self.outcome = outcome
|
||
|
|
self.quality_score = quality_score
|
||
|
|
self.review_date = review_date
|
||
|
|
|
||
|
|
def to_dict(self) -> dict:
|
||
|
|
return {
|
||
|
|
"project_id": self.project_id,
|
||
|
|
"project_name": self.project_name,
|
||
|
|
"industry": self.industry,
|
||
|
|
"credit_amount": self.credit_amount,
|
||
|
|
"complexity": self.complexity,
|
||
|
|
"planned_days": self.planned_days,
|
||
|
|
"actual_days": self.actual_days,
|
||
|
|
"reviewer": self.reviewer,
|
||
|
|
"outcome": self.outcome,
|
||
|
|
"quality_score": self.quality_score,
|
||
|
|
"review_date": self.review_date,
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
# ============ 虚拟数据生成(体现真实规律)============
|
||
|
|
|
||
|
|
def _generate_historical_data() -> List[HistoricalProject]:
|
||
|
|
"""生成2024-2026年虚拟历史评审数据
|
||
|
|
|
||
|
|
数据规律设计:
|
||
|
|
- 李明:制造业专长,效率高(实际天数<计划),质量分85-95
|
||
|
|
- 王芳:新能源专长,质量高(90-98),但项目复杂度高时需时较长
|
||
|
|
- 张强:交通运输专长,负荷较重(项目多),质量稳定80-90
|
||
|
|
- 刘洋:医疗健康专长,细致但速度慢(实际天数略超计划),质量92-98
|
||
|
|
- 陈晨:设备租赁专长,全行业覆盖,效率中等,质量78-88
|
||
|
|
- 赵磊:环保行业专长,项目少但质量高,88-96
|
||
|
|
"""
|
||
|
|
|
||
|
|
projects = []
|
||
|
|
project_counter = 1
|
||
|
|
|
||
|
|
# 主审员配置:(姓名, 主行业, 次要行业, 项目数, 效率倍数, 质量基数, 质量波动)
|
||
|
|
reviewers_config = [
|
||
|
|
("李明", "制造业", ["装备制造", "机械设备", "汽车零部件"], 22, 0.85, 88, 7),
|
||
|
|
("王芳", "新能源", ["光伏设备", "风电设备", "新能源汽车"], 20, 1.05, 92, 6),
|
||
|
|
("张强", "交通运输", ["物流运输", "港口码头", "公路客运"], 25, 0.95, 84, 8),
|
||
|
|
("刘洋", "医疗健康", ["医疗器械", "医药制造", "医院设备"], 18, 1.15, 94, 4),
|
||
|
|
("陈晨", "设备租赁", ["工程机械", "办公设备", "生产设备"], 20, 1.0, 82, 8),
|
||
|
|
("赵磊", "环保", ["环保设备", "污水处理", "固废处理"], 16, 1.08, 90, 6),
|
||
|
|
]
|
||
|
|
|
||
|
|
# 行业项目名称模板
|
||
|
|
industry_templates = {
|
||
|
|
"制造业": ["精密机械加工设备", "自动化生产线", "数控机床", "模具制造设备"],
|
||
|
|
"装备制造": ["重型装备", "专用设备", "成套装备"],
|
||
|
|
"机械设备": ["工业机器人", "包装机械", "印刷设备"],
|
||
|
|
"汽车零部件": ["汽车配件生产线", "发动机零部件", "车身冲压设备"],
|
||
|
|
"新能源": ["分布式光伏电站", "储能设备", "充电桩建设"],
|
||
|
|
"光伏设备": ["光伏组件生产线", "硅片切割设备", "光伏发电项目"],
|
||
|
|
"风电设备": ["风力发电机组", "风电场建设", "海上风电项目"],
|
||
|
|
"新能源汽车": ["新能源客车", "电动物流车", "充电设施"],
|
||
|
|
"交通运输": ["货运车队", "冷链物流车辆", "运输设备更新"],
|
||
|
|
"物流运输": ["智能仓储设备", "配送车辆", "物流信息系统"],
|
||
|
|
"港口码头": ["港口装卸设备", "集装箱堆场", "码头机械"],
|
||
|
|
"公路客运": ["客运班车", "旅游大巴", "公交车辆"],
|
||
|
|
"医疗健康": ["医学影像设备", "手术器械", "检验检测设备"],
|
||
|
|
"医疗器械": ["CT设备", "超声设备", "监护仪"],
|
||
|
|
"医药制造": ["制药生产线", "GMP车间改造", "原料药设备"],
|
||
|
|
"医院设备": ["病床护理设备", "消毒灭菌设备", "医用气体系统"],
|
||
|
|
"设备租赁": ["工程机械租赁", "办公设备租赁", "生产设备租赁"],
|
||
|
|
"工程机械": ["挖掘机", "起重机", "推土机"],
|
||
|
|
"办公设备": ["复印打印设备", "办公家具", "会议系统"],
|
||
|
|
"生产设备": ["注塑机", "冲压设备", "焊接设备"],
|
||
|
|
"环保": ["环保治理设备", "节能改造项目", "清洁能源设备"],
|
||
|
|
"环保设备": ["废气处理设备", "除尘设备", "脱硫脱硝装置"],
|
||
|
|
"污水处理": ["污水处理站", "中水回用系统", "污泥处理设备"],
|
||
|
|
"固废处理": ["垃圾焚烧设备", "危废处理设施", "资源回收系统"],
|
||
|
|
}
|
||
|
|
|
||
|
|
# 生成每位主审员的历史项目
|
||
|
|
start_date = datetime(2024, 1, 1)
|
||
|
|
end_date = datetime(2026, 8, 31)
|
||
|
|
|
||
|
|
for reviewer_name, main_industry, sub_industries, num_projects, efficiency, quality_base, quality_range in reviewers_config:
|
||
|
|
|
||
|
|
# 该主审员的行业池(主行业占70%,次要行业占30%)
|
||
|
|
industries_pool = [main_industry] * 7 + sub_industries * 3
|
||
|
|
|
||
|
|
for i in range(num_projects):
|
||
|
|
# 随机日期(制造业、新能源集中在2-6月、9-11月)
|
||
|
|
if main_industry in ["制造业", "新能源", "装备制造"]:
|
||
|
|
# 集中在业务旺季
|
||
|
|
month_choices = [2, 3, 4, 5, 6, 9, 10, 11]
|
||
|
|
month = random.choice(month_choices)
|
||
|
|
else:
|
||
|
|
month = random.randint(1, 12)
|
||
|
|
|
||
|
|
year = random.choice([2024, 2025, 2026])
|
||
|
|
if year == 2026 and month > 8:
|
||
|
|
month = random.randint(1, 8)
|
||
|
|
|
||
|
|
day = random.randint(1, 28)
|
||
|
|
review_date = datetime(year, month, day)
|
||
|
|
|
||
|
|
# 行业选择(主行业为主)
|
||
|
|
industry = random.choice(industries_pool)
|
||
|
|
|
||
|
|
# 项目名称
|
||
|
|
company_prefix = random.choice([
|
||
|
|
"阳光", "华润", "中联", "鑫盛", "宏泰", "瑞丰", "恒通", "盛达",
|
||
|
|
"金辉", "博瑞", "创新", "天成", "嘉诚", "永安", "兴旺", "腾飞"
|
||
|
|
])
|
||
|
|
equipment_name = random.choice(industry_templates.get(industry, ["设备租赁项目"]))
|
||
|
|
project_name = f"{company_prefix}{equipment_name}融资租赁项目"
|
||
|
|
|
||
|
|
# 授信金额(万元):复杂度越高金额越大
|
||
|
|
complexity = random.choices([1, 2, 3, 4, 5], weights=[5, 15, 40, 30, 10])[0]
|
||
|
|
|
||
|
|
if complexity == 1:
|
||
|
|
credit_amount = random.randint(500, 1500)
|
||
|
|
elif complexity == 2:
|
||
|
|
credit_amount = random.randint(1200, 3000)
|
||
|
|
elif complexity == 3:
|
||
|
|
credit_amount = random.randint(2500, 6000)
|
||
|
|
elif complexity == 4:
|
||
|
|
credit_amount = random.randint(5000, 10000)
|
||
|
|
else: # 5
|
||
|
|
credit_amount = random.randint(8000, 20000)
|
||
|
|
|
||
|
|
# 计划评审天数(复杂度决定)
|
||
|
|
planned_days = {1: 5, 2: 7, 3: 10, 4: 12, 5: 15}[complexity]
|
||
|
|
|
||
|
|
# 实际评审天数(受主审员效率影响)
|
||
|
|
actual_days = int(planned_days * efficiency * random.uniform(0.9, 1.1))
|
||
|
|
actual_days = max(3, actual_days) # 最少3天
|
||
|
|
|
||
|
|
# 质量分(受主审员能力+复杂度影响)
|
||
|
|
# 复杂度高的项目,质量分略有波动
|
||
|
|
quality_penalty = (complexity - 3) * 2 if complexity >= 4 else 0
|
||
|
|
quality_score = quality_base + random.randint(-quality_range, quality_range) - quality_penalty
|
||
|
|
quality_score = max(60, min(100, quality_score))
|
||
|
|
|
||
|
|
# 评审结果(质量分高=通过率高)
|
||
|
|
if quality_score >= 85:
|
||
|
|
outcome = random.choices(["通过", "否决", "撤并"], weights=[90, 5, 5])[0]
|
||
|
|
elif quality_score >= 75:
|
||
|
|
outcome = random.choices(["通过", "否决", "撤并"], weights=[80, 12, 8])[0]
|
||
|
|
else:
|
||
|
|
outcome = random.choices(["通过", "否决", "撤并"], weights=[60, 25, 15])[0]
|
||
|
|
|
||
|
|
# 如果返工(实际天数超出计划较多),质量分降低
|
||
|
|
if actual_days > planned_days * 1.3:
|
||
|
|
quality_score = max(quality_score - 10, 60)
|
||
|
|
|
||
|
|
project = HistoricalProject(
|
||
|
|
project_id=f"PROJ-{year}-{project_counter:04d}",
|
||
|
|
project_name=project_name,
|
||
|
|
industry=industry,
|
||
|
|
credit_amount=credit_amount,
|
||
|
|
complexity=complexity,
|
||
|
|
planned_days=planned_days,
|
||
|
|
actual_days=actual_days,
|
||
|
|
reviewer=reviewer_name,
|
||
|
|
outcome=outcome,
|
||
|
|
quality_score=quality_score,
|
||
|
|
review_date=review_date.strftime("%Y-%m-%d"),
|
||
|
|
)
|
||
|
|
|
||
|
|
projects.append(project)
|
||
|
|
project_counter += 1
|
||
|
|
|
||
|
|
# 按日期排序
|
||
|
|
projects.sort(key=lambda p: p.review_date)
|
||
|
|
|
||
|
|
return projects
|
||
|
|
|
||
|
|
|
||
|
|
# ============ 全局数据缓存 ============
|
||
|
|
|
||
|
|
_HISTORICAL_PROJECTS: List[HistoricalProject] = _generate_historical_data()
|
||
|
|
|
||
|
|
|
||
|
|
# ============ 查询接口 ============
|
||
|
|
|
||
|
|
def get_all_projects() -> List[Dict]:
|
||
|
|
"""获取所有历史项目"""
|
||
|
|
return [p.to_dict() for p in _HISTORICAL_PROJECTS]
|
||
|
|
|
||
|
|
|
||
|
|
def get_projects_by_reviewer(reviewer: str) -> List[Dict]:
|
||
|
|
"""按主审员查询历史项目"""
|
||
|
|
filtered = [p for p in _HISTORICAL_PROJECTS if p.reviewer == reviewer]
|
||
|
|
return [p.to_dict() for p in filtered]
|
||
|
|
|
||
|
|
|
||
|
|
def get_projects_by_industry(industry: str) -> List[Dict]:
|
||
|
|
"""按行业查询历史项目(模糊匹配)"""
|
||
|
|
filtered = [p for p in _HISTORICAL_PROJECTS if industry in p.industry]
|
||
|
|
return [p.to_dict() for p in filtered]
|
||
|
|
|
||
|
|
|
||
|
|
def get_projects_filtered(reviewer: Optional[str] = None, industry: Optional[str] = None) -> List[Dict]:
|
||
|
|
"""组合过滤查询"""
|
||
|
|
filtered = _HISTORICAL_PROJECTS
|
||
|
|
|
||
|
|
if reviewer:
|
||
|
|
filtered = [p for p in filtered if p.reviewer == reviewer]
|
||
|
|
|
||
|
|
if industry:
|
||
|
|
filtered = [p for p in filtered if industry in p.industry]
|
||
|
|
|
||
|
|
return [p.to_dict() for p in filtered]
|
||
|
|
|
||
|
|
|
||
|
|
def get_reviewer_stats() -> Dict[str, Dict]:
|
||
|
|
"""获取所有主审员的统计画像
|
||
|
|
|
||
|
|
返回格式:
|
||
|
|
{
|
||
|
|
"李明": {
|
||
|
|
"total_projects": 22,
|
||
|
|
"avg_actual_days": 8.5,
|
||
|
|
"avg_quality_score": 88.2,
|
||
|
|
"industry_expertise": {
|
||
|
|
"制造业": {"count": 15, "avg_quality": 90.1},
|
||
|
|
"装备制造": {"count": 7, "avg_quality": 86.3}
|
||
|
|
},
|
||
|
|
"pass_rate": 0.91
|
||
|
|
},
|
||
|
|
...
|
||
|
|
}
|
||
|
|
"""
|
||
|
|
stats = {}
|
||
|
|
|
||
|
|
reviewers = list(set(p.reviewer for p in _HISTORICAL_PROJECTS))
|
||
|
|
|
||
|
|
for reviewer in reviewers:
|
||
|
|
projects = [p for p in _HISTORICAL_PROJECTS if p.reviewer == reviewer]
|
||
|
|
|
||
|
|
# 基础统计
|
||
|
|
total_projects = len(projects)
|
||
|
|
avg_actual_days = sum(p.actual_days for p in projects) / total_projects if total_projects > 0 else 0
|
||
|
|
avg_quality = sum(p.quality_score for p in projects) / total_projects if total_projects > 0 else 0
|
||
|
|
pass_count = len([p for p in projects if p.outcome == "通过"])
|
||
|
|
pass_rate = pass_count / total_projects if total_projects > 0 else 0
|
||
|
|
|
||
|
|
# 行业专长统计
|
||
|
|
industry_expertise = {}
|
||
|
|
for project in projects:
|
||
|
|
industry = project.industry
|
||
|
|
if industry not in industry_expertise:
|
||
|
|
industry_expertise[industry] = {"count": 0, "quality_sum": 0}
|
||
|
|
industry_expertise[industry]["count"] += 1
|
||
|
|
industry_expertise[industry]["quality_sum"] += project.quality_score
|
||
|
|
|
||
|
|
# 计算每个行业的平均质量分
|
||
|
|
for industry in industry_expertise:
|
||
|
|
count = industry_expertise[industry]["count"]
|
||
|
|
quality_sum = industry_expertise[industry]["quality_sum"]
|
||
|
|
industry_expertise[industry] = {
|
||
|
|
"count": count,
|
||
|
|
"avg_quality": quality_sum / count if count > 0 else 0
|
||
|
|
}
|
||
|
|
|
||
|
|
stats[reviewer] = {
|
||
|
|
"total_projects": total_projects,
|
||
|
|
"avg_actual_days": round(avg_actual_days, 1),
|
||
|
|
"avg_quality_score": round(avg_quality, 1),
|
||
|
|
"industry_expertise": industry_expertise,
|
||
|
|
"pass_rate": round(pass_rate, 2)
|
||
|
|
}
|
||
|
|
|
||
|
|
return stats
|
||
|
|
|
||
|
|
|
||
|
|
# ============ 初始化时输出统计信息 ============
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
print(f"✅ 已生成 {len(_HISTORICAL_PROJECTS)} 条历史评审记录")
|
||
|
|
print("\n主审员统计:")
|
||
|
|
stats = get_reviewer_stats()
|
||
|
|
for reviewer, data in stats.items():
|
||
|
|
print(f" {reviewer}: {data['total_projects']}个项目, 平均{data['avg_actual_days']}天, 质量{data['avg_quality_score']}分")
|