# 从金融从业者的任务到投资者本人的事务：对应关系、两种口径的单件倍数与整体倍数
# 投资者事务的分钟数与频次：配置型取自 ../summary_tree.py 的 MULT_SRC；交易者口径由投资放大倍数图的倍数与年度等效投入反推（与图中数字一致）。
# 从业者任务的可达比例 r（乙档）取自 finance.json（O*NET 31.0 任务，经 332 项中间工作活动的双人编码）。
import json
F = json.load(open("finance.json"))
TASK = {t["id"]: (o["name"], t) for o in F for t in o["tasks"]}
# (分组, 事务, 分类码, 门, 非Agent分钟 lo, hi, Agent方式分钟 lo, hi, 频次 lo, hi, 对应任务ID, 对应任务中文, 是否须本人保留)
ROWS = [
 ("配置型投资者", "确定目标、期限与可承受损失", "1.4.1", "1", 120, 240, 90, 180, 1, 1, "12907", "理财顾问：面谈了解客户收入、目标与风险承受", True),
 ("配置型投资者", "标的与组合持续监测", "4.1.2 维持", "4d", 30, 60, 2, 5, 250, 250, "15669", "基金经理：监测单项投资表现，确保组合符合风险目标", False),
 ("配置型投资者", "目标导向的组合管理", "5.1.2 维持", "5", 240, 480, 15, 30, 4, 4, "15679", "基金经理：为基金选定具体投资或投资组合", False),
 ("配置型投资者", "公司与观点研究", "4.1.2 增设", "4d", 480, 1200, 30, 60, 4, 4, "15667", "基金经理：开展或评估公司与行业研究", False),
 ("配置型投资者", "交易计划：生成计划", "4.2.1 增设", "4d", 30, 60, 5, 10, 24, 24, "21599", "投资分析师：依据财务分析拟定投资行动方案", False),
 ("配置型投资者", "交易计划：提交订单", "5.1.2 增设", "5", 0.5, 0.5, 0.2, 0.5, 24, 24, "23192", "经纪人：报价买入或卖出证券", False),
 ("配置型投资者", "交易复盘", "4.1.2 增设", "4d", 180, 480, 15, 30, 4, 4, "23198", "经纪人：报告全部持仓与交易结果", False),
 ("配置型投资者", "事件解读", "4.1.2 增设", "4d", 30, 90, 5, 10, 36, 36, "21596", "投资分析师：从财经资料中监测经济、产业与公司动态", False),
 ("配置型投资者", "标的筛选与比较", "4.1.2 增设", "4d", 60, 120, 10, 15, 12, 12, "21591", "投资分析师：比较同一行业中各证券的质量", False),
 ("配置型投资者", "自定义：新建分析方法", "4.2.2 增设", "4d", 480, 2400, 30, 60, 2, 2, "15990", "量化分析师：以统计与计量方法开发分析模型", False),
 ("配置型投资者", "自定义：新建数据源连接", "4.2.2 增设", "4d", 10, 30, 1, 2, 2, 2, "21625", "风险专员：维护风险管理系统的输入数据", False),
 ("配置型投资者", "数据查询", "4.1.1 维持", "4d", 1, 10, 0.5, 1, 156, 156, "8151", "经纪业务文员：计算持仓、股息、利息与费用", False),
 ("配置型投资者", "成果分享与接续", "2.3.1 增设", "2", 20, 40, 1, 2, 12, 12, "15988", "量化分析师：撰写研究结果的书面摘要", False),
 ("交易者", "确定交易规则与风险上限", "1.4.1", "1", 60, 120, 45, 90, 1, 1, "15675", "基金经理：制定或实施投资政策与策略", True),
 ("交易者", "交易时段按自设条件盯盘", "4.1.2 维持", "4d", 60, 180, 5, 15, 250, 250, "23193", "经纪人：监测市场或持仓", False),
 ("交易者", "下单前核对成本与风险", "4.1.2 增设", "4d", 5, 15, 0.5, 1, 105, 250, "21622", "风险专员：识别潜在投资的关键风险", False),
 ("交易者", "提交订单", "5.1.2 增设", "5", 0.5, 0.5, 0.2, 0.5, 105, 250, "23192", "经纪人：报价买入或卖出证券", False),
 ("交易者", "风险事件处置", "5.1.2 恢复与消减", "5", 15, 60, 2, 5, 6, 25, "21634", "风险专员：跟踪、计量并报告交易品种的市场风险", False),
 ("交易者", "生成交易计划（每周约 2 次）", "4.2.1 增设", "4d", 30, 60, 5, 10, 104, 104, "21599", "投资分析师：依据财务分析拟定投资行动方案", False),
 ("交易者", "交易复盘（按月）", "4.1.2 增设", "4d", 180, 480, 15, 30, 12, 12, "23198", "经纪人：报告全部持仓与交易结果", False),
]
out = {"rows": [], "summary": {}}
for g in ("配置型投资者", "交易者"):
    rs = [r for r in ROWS if r[0] == g]
    na_lo = sum(r[4] * r[8] for r in rs); na_hi = sum(r[5] * r[9] for r in rs)
    ag_lo = sum(r[6] * r[8] for r in rs); ag_hi = sum(r[7] * r[9] for r in rs)
    na_mid = sum((r[4] + r[5]) / 2 * (r[8] + r[9]) / 2 for r in rs)
    onet_resid = 0
    for r in rs:
        occ, t = TASK[r[10]]; rv = t["r"]["r_yi"]
        mid = (r[4] + r[5]) / 2 * (r[8] + r[9]) / 2
        share = mid / na_mid
        onet_resid += share * (1 - rv)
        out["rows"].append({"group": g, "affair": r[1], "code": r[2], "gate": r[3], "theory_lo": r[4] / r[7], "theory_hi": r[5] / r[6],
                            "share": share, "hours_mid": mid / 60, "analog": r[11], "analog_occ": occ, "r_yi": rv, "onet_mult": 1 / (1 - rv), "retained": r[12]})
    out["summary"][g] = {"theory_lo": na_lo / ag_hi, "theory_hi": na_hi / ag_lo, "theory_mid": na_mid / sum((r[6] + r[7]) / 2 * (r[8] + r[9]) / 2 for r in rs),
                         "onet": 1 / onet_resid, "hours_na_mid": na_mid / 60}
json.dump(out, open("bridge.json", "w"), ensure_ascii=False, indent=1)
for r in out["rows"]:
    print(f'{r["group"][:3]} {r["affair"]:16s} 占比 {r["share"]*100:5.1f}% 理论 {r["theory_lo"]:.1f}～{r["theory_hi"]:.0f} | {r["analog"][:22]:22s} r乙 {r["r_yi"]:.2f} → {r["onet_mult"]:.1f}×')
print(json.dumps(out["summary"], ensure_ascii=False, indent=1))
