|
@@ -0,0 +1,556 @@
|
|
|
|
|
+from __future__ import annotations
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+LEVEL1_DOMAIN_MAP = {
|
|
|
|
|
+ "零售金融部": "零售",
|
|
|
|
|
+ "公司金融部": "对公",
|
|
|
|
|
+ "信用卡中心": "信用卡",
|
|
|
|
|
+ "风险管理部": "风险",
|
|
|
|
|
+ "运营管理部": "运营",
|
|
|
|
|
+ "计划财务部": "财务",
|
|
|
|
|
+ "网络经营服务部": "渠道",
|
|
|
|
|
+ "普惠金融部": "普惠",
|
|
|
|
|
+ "金融市场部": "金融市场",
|
|
|
|
|
+ "国际业务部": "国际业务",
|
|
|
|
|
+ "法律合规部": "合规",
|
|
|
|
|
+ "人力资源部": "人力",
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+DOMAIN_KEYWORDS = {
|
|
|
|
|
+ "零售": ["零售", "高价值", "私人银行", "私钻", "财富", "养老金", "AUM", "存款", "消费贷", "理财", "基金", "保险", "MGM"],
|
|
|
|
|
+ "对公": ["对公", "公司", "战略客户", "机构客户", "上市公司", "保证金", "代发", "项目融资", "供应链", "信用证", "保函", "票据", "交易银行"],
|
|
|
|
|
+ "信用卡": ["信用卡", "发卡", "分期", "额度"],
|
|
|
|
|
+ "风险": ["风险", "不良", "逾期", "拨备", "授信", "贷后", "资产质量", "抵质押"],
|
|
|
|
|
+ "运营": ["运营", "柜面", "账户", "支付结算", "反洗钱", "投诉", "集中作业", "现金库存", "回单"],
|
|
|
|
|
+ "财务": ["财务", "利润", "FTP", "费用", "收入", "资本", "预算", "资产负债", "税务", "EVA", "收益率"],
|
|
|
|
|
+ "渠道": ["渠道", "手机银行", "网银", "网点", "自助设备", "开放银行", "数字人民币", "预约到店", "活跃", "渗透率"],
|
|
|
|
|
+ "普惠": ["普惠", "小微", "首贷", "涉农", "科创", "个体工商户"],
|
|
|
|
|
+ "金融市场": ["金融市场", "债券", "同业", "资金头寸", "外汇交易", "衍生品", "转贴现", "投资"],
|
|
|
|
|
+ "国际业务": ["国际", "跨境", "贸易融资", "进口", "出口", "外汇", "结售汇"],
|
|
|
|
|
+ "合规": ["合规", "受益所有人", "尽职调查", "名单命中", "可疑交易", "监管报送", "制裁"],
|
|
|
|
|
+ "人力": ["人力", "人均产能", "客户经理绩效", "奖金", "编制", "培训", "人才盘点"],
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+CARD_BLUEPRINT_NAMES = {
|
|
|
|
|
+ "零售": [
|
|
|
|
|
+ "当月零售客户数", "当月高价值客户数", "当月私人银行客户数", "零售客户较上月净增", "零售客户月度增长趋势",
|
|
|
|
|
+ "高价值客户月度增长趋势", "AUM余额", "AUM余额月度走势图", "各机构AUM余额排名", "各机构高价值客户数及达成率",
|
|
|
|
|
+ "客户资产分层结构", "产品持仓结构", "理财产品销售额", "基金产品保有量", "零售贷款余额",
|
|
|
|
|
+ "消费贷放款额月度趋势", "客户经理AUM贡献TOP10", "流失预警客户清单", "本机构零售客户数", "本机构客户资产提升率",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "对公": [
|
|
|
|
|
+ "当月对公客户数", "战略客户数", "对公客户较上月净增", "对公存款余额", "对公存款日均余额",
|
|
|
|
|
+ "活期存款占比", "对公存款余额月度趋势", "各机构对公存款余额排名", "公司贷款余额", "当月公司贷款投放额",
|
|
|
|
|
+ "公司贷款投放月度趋势", "行业投向结构", "重点客户综合贡献TOP10", "代发客户数", "代发金额月度趋势",
|
|
|
|
|
+ "信用证余额", "保函余额", "票据贴现金额", "交易银行活跃客户数", "流失预警对公客户清单",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "信用卡": [
|
|
|
|
|
+ "当月新增发卡量", "累计发卡量", "当月活跃客户数", "活跃率", "交易金额",
|
|
|
|
|
+ "交易金额月度趋势", "交易笔数月度趋势", "各机构交易金额排名", "分期金额", "分期转化率",
|
|
|
|
|
+ "分期手续费收入", "渠道获客结构", "额度使用率", "逾期客户数", "逾期余额",
|
|
|
|
|
+ "逾期率月度趋势", "风险等级分布", "睡眠客户唤醒数", "权益活动参与客户数", "商户交易额TOP10",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "风险": [
|
|
|
|
|
+ "贷款余额", "不良贷款余额", "不良率", "关注类贷款余额", "逾期余额",
|
|
|
|
|
+ "逾期率", "资产质量月度趋势", "不良贷款迁徙趋势", "各机构不良率排名", "行业风险分布",
|
|
|
|
|
+ "风险预警客户数", "预警处置完成率", "贷后检查完成率", "授信集中度", "大额风险暴露客户清单",
|
|
|
|
|
+ "抵质押品价值变动趋势", "拨备覆盖率", "五级分类结构", "本机构不良贷款余额", "本机构风险预警处置清单",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "运营": [
|
|
|
|
|
+ "当日柜面业务笔数", "当月柜面业务笔数", "业务金额", "平均处理时长", "超时业务笔数",
|
|
|
|
|
+ "业务量月度趋势", "各机构业务量排名", "账户开立数", "账户异常数", "企业账户年检完成率",
|
|
|
|
|
+ "支付结算笔数", "支付结算金额月度趋势", "运营风险事件数", "风险事件处理完成率", "客户投诉数",
|
|
|
|
|
+ "投诉处理及时率", "集中作业处理时效分布", "现金库存余额", "电子回单使用率", "本机构待处理事项清单",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "财务": [
|
|
|
|
|
+ "营业收入", "净利息收入", "中间业务收入", "营业支出", "税前利润",
|
|
|
|
|
+ "经济利润EVA", "利润贡献月度趋势", "各机构利润贡献排名", "收入结构", "费用预算",
|
|
|
|
|
+ "费用执行率", "费用执行月度趋势", "产品收益率排名", "资产收益率", "负债成本率",
|
|
|
|
|
+ "资产负债结构", "资本占用金额", "FTP净收入", "本机构利润贡献", "本机构费用超预算项目",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "渠道": [
|
|
|
|
|
+ "当月活跃客户数", "活跃率", "累计活跃客户数", "渠道渗透率", "活跃率月度走势图",
|
|
|
|
|
+ "渗透率月度走势图", "各机构当月活跃客户数及活跃率", "各机构累计活跃客户数及活跃率", "手机银行登录次数", "网银交易金额",
|
|
|
|
|
+ "数字人民币交易笔数", "线上预约到店客户数", "预约到店转化率", "活跃用户构成", "新增用户月度走势图",
|
|
|
|
|
+ "流失用户数", "渠道交易金额结构", "自助设备可用率", "开放银行接口调用量", "活跃TOP10用户名称",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "普惠": [
|
|
|
|
|
+ "普惠贷款余额", "普惠贷款投放额", "普惠贷款余额月度趋势", "各机构普惠贷款余额排名", "小微客户数",
|
|
|
|
|
+ "小微客户较上月净增", "首贷户数", "首贷户拓展月度趋势", "涉农贷款余额", "科技型企业贷款余额",
|
|
|
|
|
+ "个体工商户贷款余额", "贷款加权利率", "利率定价分布", "普惠不良贷款余额", "普惠不良率",
|
|
|
|
|
+ "风险补偿金额", "延期还本金额", "本机构普惠贷款投放额", "客户经理普惠贷款贡献TOP10", "普惠风险客户清单",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "金融市场": [
|
|
|
|
|
+ "投资余额", "投资市值", "估值损益", "估值损益月度趋势", "投资组合结构",
|
|
|
|
|
+ "债券品种结构", "久期分布", "同业负债余额", "同业负债成本率", "资金头寸缺口",
|
|
|
|
|
+ "资金头寸缺口趋势", "外汇交易损益", "衍生品估值损益", "交易对手集中度", "限额占用率",
|
|
|
|
|
+ "限额超限预警清单", "票据转贴现金额", "理财投资资产穿透结构", "市场价格波动预警", "本机构同业业务余额",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "国际业务": [
|
|
|
|
|
+ "跨境结算金额", "跨境结算笔数", "跨境结算月度趋势", "贸易融资余额", "贸易融资投放额",
|
|
|
|
|
+ "进口信用证金额", "出口托收金额", "外汇存款余额", "结售汇金额", "结售汇客户贡献TOP10",
|
|
|
|
|
+ "跨境人民币金额", "币种分布", "国家地区分布", "各机构国际业务收入排名", "国际业务风险预警笔数",
|
|
|
|
|
+ "风险预警处置率", "本机构跨境结算金额", "本机构贸易融资余额", "重点客户国际业务贡献", "业务品种结构",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "合规": [
|
|
|
|
|
+ "待尽调客户数", "已尽调客户数", "尽调完成率", "尽调完成率月度趋势", "受益所有人信息缺失客户数",
|
|
|
|
|
+ "名单命中客户数", "可疑交易笔数", "可疑交易金额", "可疑交易月度趋势", "监管报送差错数",
|
|
|
|
|
+ "报送质量月度趋势", "合规检查问题数", "整改完成率", "整改逾期问题清单", "制裁筛查处理及时率",
|
|
|
|
|
+ "员工异常行为线索数", "各机构合规问题数排名", "风险等级分布", "本机构待处理合规事项", "本机构整改完成率",
|
|
|
|
|
+ ],
|
|
|
|
|
+ "人力": [
|
|
|
|
|
+ "在岗人数", "客户经理人数", "人均产能", "人均产能月度趋势", "各机构人均产能排名",
|
|
|
|
|
+ "客户经理绩效得分", "客户经理绩效TOP10", "奖金金额", "奖金分配结构", "岗位编制缺口",
|
|
|
|
|
+ "人员流入流出趋势", "培训完成率", "培训完成率月度趋势", "人才梯队人数", "一线人员工作量",
|
|
|
|
|
+ "管户客户数", "管户负载分布", "本机构人均产能", "本机构编制缺口", "本机构培训未完成人员清单",
|
|
|
|
|
+ ],
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+DOMAIN_PROFILES = {
|
|
|
|
|
+ "零售": {
|
|
|
|
|
+ "prefix": "RTL",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "零售客户经营宽表",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["AUM", "资产", "高价值", "私人银行", "客户经理"], "零售AUM日均汇总"),
|
|
|
|
|
+ (["理财", "基金", "产品", "持仓"], "零售产品销售明细"),
|
|
|
|
|
+ (["贷款", "消费贷"], "零售贷款余额快照"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["高价值"], [("客户ID", "高价值客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["私人银行"], [("客户ID", "私人银行客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["AUM", "资产"], [("AUM余额", "AUM余额", "SUM")]),
|
|
|
|
|
+ (["理财"], [("理财销售额", "理财产品销售额", "SUM")]),
|
|
|
|
|
+ (["基金"], [("基金保有量", "基金产品保有量", "SUM")]),
|
|
|
|
|
+ (["贷款"], [("贷款余额", "零售贷款余额", "SUM")]),
|
|
|
|
|
+ (["消费贷"], [("放款金额", "消费贷放款额", "SUM")]),
|
|
|
|
|
+ (["净增", "新增"], [("客户ID", "新增客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["流失"], [("客户ID", "流失客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["提升率", "达成率"], [("达成率", "达成率", "AVG")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("客户ID", "零售客户数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("AUM余额", "AUM贡献", "SUM"),
|
|
|
|
|
+ "structure_field": "客户层级",
|
|
|
|
|
+ "top_field": "客户经理",
|
|
|
|
|
+ "list_fields": ["客户名称", "客户层级", "AUM余额", "客户经理"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "对公": {
|
|
|
|
|
+ "prefix": "CORP",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "对公客户经营汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["存款", "活期"], "对公存款余额明细"),
|
|
|
|
|
+ (["贷款", "投放", "行业投向"], "公司信贷业务余额"),
|
|
|
|
|
+ (["代发", "交易银行"], "交易银行业务统计"),
|
|
|
|
|
+ (["信用证", "保函", "票据"], "对公表外及票据业务明细"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["战略客户"], [("客户ID", "战略客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["存款"], [("存款余额", "对公存款余额", "SUM")]),
|
|
|
|
|
+ (["日均"], [("日均余额", "对公存款日均余额", "SUM")]),
|
|
|
|
|
+ (["活期"], [("活期存款余额", "活期存款余额", "SUM"), ("存款余额", "存款余额", "SUM")]),
|
|
|
|
|
+ (["贷款"], [("贷款余额", "公司贷款余额", "SUM")]),
|
|
|
|
|
+ (["投放"], [("投放金额", "贷款投放额", "SUM")]),
|
|
|
|
|
+ (["代发"], [("代发金额", "代发金额", "SUM")]),
|
|
|
|
|
+ (["信用证"], [("信用证余额", "信用证余额", "SUM")]),
|
|
|
|
|
+ (["保函"], [("保函余额", "保函余额", "SUM")]),
|
|
|
|
|
+ (["票据"], [("贴现金额", "票据贴现金额", "SUM")]),
|
|
|
|
|
+ (["交易银行", "活跃"], [("客户ID", "活跃客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["综合贡献"], [("综合贡献", "综合贡献", "SUM")]),
|
|
|
|
|
+ (["净增"], [("客户ID", "新增客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["流失"], [("客户ID", "流失客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("客户ID", "对公客户数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("综合贡献", "综合贡献", "SUM"),
|
|
|
|
|
+ "structure_field": "行业门类",
|
|
|
|
|
+ "top_field": "客户名称",
|
|
|
|
|
+ "list_fields": ["客户名称", "客户等级", "行业门类", "管户客户经理"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "信用卡": {
|
|
|
|
|
+ "prefix": "CARD",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "信用卡客户交易汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["分期"], "信用卡分期业务明细"),
|
|
|
|
|
+ (["逾期", "风险"], "信用卡风险客户监测"),
|
|
|
|
|
+ (["渠道", "获客"], "信用卡渠道获客统计"),
|
|
|
|
|
+ (["商户", "交易"], "信用卡客户交易汇总"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["发卡"], [("卡号", "发卡量", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["活跃"], [("客户ID", "活跃客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["交易金额", "商户"], [("交易金额", "交易金额", "SUM")]),
|
|
|
|
|
+ (["交易笔数"], [("交易流水号", "交易笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["分期金额"], [("分期金额", "分期金额", "SUM")]),
|
|
|
|
|
+ (["转化率", "活跃率", "使用率", "逾期率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["手续费"], [("手续费收入", "分期手续费收入", "SUM")]),
|
|
|
|
|
+ (["逾期余额"], [("逾期余额", "逾期余额", "SUM")]),
|
|
|
|
|
+ (["逾期客户"], [("客户ID", "逾期客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["唤醒"], [("客户ID", "唤醒客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("客户ID", "信用卡客户数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("交易金额", "交易金额", "SUM"),
|
|
|
|
|
+ "structure_field": "渠道名称",
|
|
|
|
|
+ "top_field": "商户名称",
|
|
|
|
|
+ "list_fields": ["客户名称", "卡产品", "风险等级", "逾期余额"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "风险": {
|
|
|
|
|
+ "prefix": "RISK",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "信贷资产质量汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["不良", "迁徙", "五级分类"], "不良贷款迁徙明细"),
|
|
|
|
|
+ (["预警", "清单"], "预警客户处置台账"),
|
|
|
|
|
+ (["授信", "集中度", "大额"], "授信集中度监控表"),
|
|
|
|
|
+ (["抵质押"], "抵质押品重估明细"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["不良率", "逾期率"], [("比率值", "风险比率", "AVG")]),
|
|
|
|
|
+ (["不良"], [("不良贷款余额", "不良贷款余额", "SUM")]),
|
|
|
|
|
+ (["关注"], [("关注类贷款余额", "关注类贷款余额", "SUM")]),
|
|
|
|
|
+ (["逾期"], [("逾期余额", "逾期余额", "SUM")]),
|
|
|
|
|
+ (["预警"], [("客户ID", "风险预警客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["完成率", "覆盖率"], [("比率值", "完成率", "AVG")]),
|
|
|
|
|
+ (["授信"], [("授信余额", "授信集中度", "SUM")]),
|
|
|
|
|
+ (["拨备"], [("拨备覆盖率", "拨备覆盖率", "AVG")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("贷款余额", "贷款余额", "SUM"),
|
|
|
|
|
+ "top_metric": ("贷款余额", "贷款余额", "SUM"),
|
|
|
|
|
+ "structure_field": "五级分类",
|
|
|
|
|
+ "top_field": "客户名称",
|
|
|
|
|
+ "list_fields": ["客户名称", "风险等级", "贷款余额", "处置状态"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "运营": {
|
|
|
|
|
+ "prefix": "OPS",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "网点运营业务量汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["账户"], "账户质量监控明细"),
|
|
|
|
|
+ (["支付结算"], "支付结算业务统计"),
|
|
|
|
|
+ (["风险事件", "投诉", "待处理"], "运营风险事件台账"),
|
|
|
|
|
+ (["现金"], "现金库存调拨明细"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["笔数", "业务量"], [("业务流水号", "业务笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["金额", "库存"], [("业务金额", "业务金额", "SUM")]),
|
|
|
|
|
+ (["时长"], [("处理时长", "平均处理时长", "AVG")]),
|
|
|
|
|
+ (["超时"], [("业务流水号", "超时业务笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["开立"], [("账户ID", "账户开立数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["异常"], [("账户ID", "账户异常数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["完成率", "及时率", "使用率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["投诉"], [("投诉编号", "客户投诉数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["风险事件"], [("事件编号", "运营风险事件数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("业务流水号", "业务笔数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("业务笔数", "业务笔数", "SUM"),
|
|
|
|
|
+ "structure_field": "业务类型",
|
|
|
|
|
+ "top_field": "机构名称",
|
|
|
|
|
+ "list_fields": ["事项编号", "业务类型", "处理状态", "责任团队"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "财务": {
|
|
|
|
|
+ "prefix": "FIN",
|
|
|
|
|
+ "date_field": "统计月份",
|
|
|
|
|
+ "default_dataset": "管理会计利润汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["费用", "预算"], "费用预算执行表"),
|
|
|
|
|
+ (["收益率", "产品"], "产品收益率测算表"),
|
|
|
|
|
+ (["资产负债", "资本", "FTP"], "资产负债结构快照"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["收入"], [("收入金额", "营业收入", "SUM")]),
|
|
|
|
|
+ (["支出"], [("支出金额", "营业支出", "SUM")]),
|
|
|
|
|
+ (["利润", "EVA"], [("利润金额", "利润贡献", "SUM")]),
|
|
|
|
|
+ (["预算"], [("预算金额", "费用预算", "SUM")]),
|
|
|
|
|
+ (["执行率", "收益率", "成本率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["资本"], [("资本占用金额", "资本占用金额", "SUM")]),
|
|
|
|
|
+ (["FTP"], [("FTP净收入", "FTP净收入", "SUM")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("财务金额", "财务金额", "SUM"),
|
|
|
|
|
+ "top_metric": ("利润金额", "利润贡献", "SUM"),
|
|
|
|
|
+ "structure_field": "产品条线",
|
|
|
|
|
+ "top_field": "机构名称",
|
|
|
|
|
+ "list_fields": ["项目名称", "费用科目", "预算金额", "执行金额"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "渠道": {
|
|
|
|
|
+ "prefix": "CHNL",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "数字渠道活跃客户统计",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["网点", "预约"], "网点客流业务统计"),
|
|
|
|
|
+ (["自助设备"], "自助设备运行明细"),
|
|
|
|
|
+ (["营销"], "渠道协同营销明细"),
|
|
|
|
|
+ (["接口", "开放银行"], "开放银行接口调用明细"),
|
|
|
|
|
+ (["数字人民币"], "数字人民币交易统计"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["活跃客户", "累计活跃"], [("用户ID", "活跃用户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["活跃率", "渗透率", "转化率", "可用率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["登录"], [("登录次数", "登录次数", "SUM")]),
|
|
|
|
|
+ (["交易金额"], [("交易金额", "交易金额", "SUM")]),
|
|
|
|
|
+ (["交易笔数"], [("交易流水号", "交易笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["预约"], [("客户ID", "预约客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["新增"], [("用户ID", "新增用户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["流失"], [("用户ID", "流失用户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["接口"], [("调用次数", "接口调用量", "SUM")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("用户ID", "用户数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("登录次数", "登录次数", "SUM"),
|
|
|
|
|
+ "structure_field": "用户状态",
|
|
|
|
|
+ "top_field": "用户名称",
|
|
|
|
|
+ "list_fields": ["用户名称", "所属机构", "登录次数", "最近登录时间"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "普惠": {
|
|
|
|
|
+ "prefix": "INCL",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "普惠贷款业务汇总",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["小微", "客户经理"], "小微客户经营宽表"),
|
|
|
|
|
+ (["涉农"], "涉农贷款投放明细"),
|
|
|
|
|
+ (["风险补偿", "延期"], "普惠风险补偿台账"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["投放"], [("投放金额", "普惠贷款投放额", "SUM")]),
|
|
|
|
|
+ (["小微"], [("客户ID", "小微客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["首贷"], [("客户ID", "首贷户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["涉农"], [("贷款余额", "涉农贷款余额", "SUM")]),
|
|
|
|
|
+ (["科技型"], [("贷款余额", "科技型企业贷款余额", "SUM")]),
|
|
|
|
|
+ (["利率", "不良率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["不良"], [("不良贷款余额", "不良贷款余额", "SUM")]),
|
|
|
|
|
+ (["风险补偿"], [("补偿金额", "风险补偿金额", "SUM")]),
|
|
|
|
|
+ (["延期"], [("延期金额", "延期还本金额", "SUM")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("贷款余额", "普惠贷款余额", "SUM"),
|
|
|
|
|
+ "top_metric": ("贷款余额", "普惠贷款贡献", "SUM"),
|
|
|
|
|
+ "structure_field": "贷款产品",
|
|
|
|
|
+ "top_field": "客户经理",
|
|
|
|
|
+ "list_fields": ["客户名称", "贷款产品", "贷款余额", "风险等级"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "金融市场": {
|
|
|
|
|
+ "prefix": "MKT",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "金融市场投资组合明细",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["同业"], "同业负债成本统计"),
|
|
|
|
|
+ (["资金头寸"], "资金头寸预测表"),
|
|
|
|
|
+ (["外汇", "衍生品"], "外汇衍生交易估值表"),
|
|
|
|
|
+ (["票据"], "票据转贴现业务分析表"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["市值"], [("市值", "投资市值", "SUM")]),
|
|
|
|
|
+ (["损益"], [("损益金额", "损益金额", "SUM")]),
|
|
|
|
|
+ (["久期", "成本率", "占用率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["同业"], [("同业负债余额", "同业负债余额", "SUM")]),
|
|
|
|
|
+ (["缺口"], [("资金缺口", "资金头寸缺口", "SUM")]),
|
|
|
|
|
+ (["票据"], [("贴现金额", "票据转贴现金额", "SUM")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("投资余额", "投资余额", "SUM"),
|
|
|
|
|
+ "top_metric": ("投资余额", "投资余额", "SUM"),
|
|
|
|
|
+ "structure_field": "交易品种",
|
|
|
|
|
+ "top_field": "交易对手",
|
|
|
|
|
+ "list_fields": ["交易对手", "交易品种", "限额占用率", "预警等级"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "国际业务": {
|
|
|
|
|
+ "prefix": "INTL",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "国际结算业务统计",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["贸易融资"], "贸易融资业务明细"),
|
|
|
|
|
+ (["结售汇"], "结售汇客户贡献表"),
|
|
|
|
|
+ (["跨境人民币"], "跨境人民币业务汇总"),
|
|
|
|
|
+ (["信用证", "托收"], "国际结算业务统计"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["笔数"], [("业务流水号", "业务笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["贸易融资"], [("融资余额", "贸易融资余额", "SUM")]),
|
|
|
|
|
+ (["投放"], [("投放金额", "贸易融资投放额", "SUM")]),
|
|
|
|
|
+ (["信用证"], [("信用证金额", "进口信用证金额", "SUM")]),
|
|
|
|
|
+ (["托收"], [("托收金额", "出口托收金额", "SUM")]),
|
|
|
|
|
+ (["外汇存款"], [("存款余额", "外汇存款余额", "SUM")]),
|
|
|
|
|
+ (["结售汇"], [("结售汇金额", "结售汇金额", "SUM")]),
|
|
|
|
|
+ (["人民币"], [("业务金额", "跨境人民币金额", "SUM")]),
|
|
|
|
|
+ (["处置率"], [("比率值", "风险预警处置率", "AVG")]),
|
|
|
|
|
+ (["风险预警"], [("预警编号", "风险预警笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("结算金额", "跨境结算金额", "SUM"),
|
|
|
|
|
+ "top_metric": ("业务金额", "国际业务贡献", "SUM"),
|
|
|
|
|
+ "structure_field": "业务品种",
|
|
|
|
|
+ "top_field": "客户名称",
|
|
|
|
|
+ "list_fields": ["客户名称", "业务品种", "币种", "业务金额"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "合规": {
|
|
|
|
|
+ "prefix": "COMP",
|
|
|
|
|
+ "date_field": "统计日期",
|
|
|
|
|
+ "default_dataset": "反洗钱客户监测表",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["尽调", "受益所有人"], "客户尽职调查台账"),
|
|
|
|
|
+ (["监管报送"], "监管报送质量统计"),
|
|
|
|
|
+ (["整改", "检查"], "合规检查整改明细"),
|
|
|
|
|
+ (["名单", "可疑交易", "制裁"], "反洗钱客户监测表"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["待尽调"], [("客户ID", "待尽调客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["已尽调"], [("客户ID", "已尽调客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["完成率", "及时率"], [("比率值", "比率", "AVG")]),
|
|
|
|
|
+ (["缺失"], [("客户ID", "信息缺失客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["名单"], [("客户ID", "名单命中客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["交易金额"], [("交易金额", "可疑交易金额", "SUM")]),
|
|
|
|
|
+ (["可疑交易"], [("交易流水号", "可疑交易笔数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["差错"], [("报送批次号", "报送差错数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["问题"], [("问题编号", "合规检查问题数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["线索"], [("线索编号", "异常行为线索数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("客户ID", "客户数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("问题编号", "合规问题数", "CNT_DISTINCT"),
|
|
|
|
|
+ "structure_field": "风险等级",
|
|
|
|
|
+ "top_field": "机构名称",
|
|
|
|
|
+ "list_fields": ["事项编号", "问题类型", "处理状态", "责任部门"],
|
|
|
|
|
+ },
|
|
|
|
|
+ "人力": {
|
|
|
|
|
+ "prefix": "HR",
|
|
|
|
|
+ "date_field": "统计月份",
|
|
|
|
|
+ "default_dataset": "机构人员产能统计",
|
|
|
|
|
+ "datasets": [
|
|
|
|
|
+ (["绩效", "客户经理"], "客户经理绩效明细"),
|
|
|
|
|
+ (["奖金"], "奖金分配测算表"),
|
|
|
|
|
+ (["培训"], "培训完成情况表"),
|
|
|
|
|
+ (["编制", "人才", "人员"], "人员编制与流动统计"),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "metrics": [
|
|
|
|
|
+ (["人数", "在岗", "客户经理", "人才"], [("员工ID", "人数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["产能"], [("人均产能", "人均产能", "AVG")]),
|
|
|
|
|
+ (["绩效"], [("绩效得分", "绩效得分", "AVG")]),
|
|
|
|
|
+ (["奖金"], [("奖金金额", "奖金金额", "SUM")]),
|
|
|
|
|
+ (["缺口"], [("编制缺口", "编制缺口", "SUM")]),
|
|
|
|
|
+ (["流入流出"], [("员工ID", "人员变动数", "CNT_DISTINCT")]),
|
|
|
|
|
+ (["培训完成率"], [("比率值", "培训完成率", "AVG")]),
|
|
|
|
|
+ (["管户"], [("客户ID", "管户客户数", "CNT_DISTINCT")]),
|
|
|
|
|
+ ],
|
|
|
|
|
+ "default_metric": ("员工ID", "人数", "CNT_DISTINCT"),
|
|
|
|
|
+ "top_metric": ("绩效得分", "绩效得分", "AVG"),
|
|
|
|
|
+ "structure_field": "岗位名称",
|
|
|
|
|
+ "top_field": "员工姓名",
|
|
|
|
|
+ "list_fields": ["员工姓名", "岗位名称", "团队名称", "完成状态"],
|
|
|
|
|
+ },
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def get_card_blueprints(domain: str) -> list[dict[str, object]]:
|
|
|
|
|
+ return [build_card_spec(domain, card_name) for card_name in CARD_BLUEPRINT_NAMES[domain]]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def build_card_spec(domain: str, card_name: str) -> dict[str, object]:
|
|
|
|
|
+ profile = DOMAIN_PROFILES[domain]
|
|
|
|
|
+ metrics = _choose_metrics(profile, card_name)
|
|
|
|
|
+ fields = _choose_fields(profile, card_name)
|
|
|
|
|
+ filters = _choose_filters(profile, card_name)
|
|
|
|
|
+ sort = _choose_sort(profile, card_name, fields, metrics)
|
|
|
|
|
+ dataset = _choose_dataset(profile, card_name)
|
|
|
|
|
+ spec = {
|
|
|
|
|
+ "card_name": card_name,
|
|
|
|
|
+ "dataset_prefix": profile["prefix"],
|
|
|
|
|
+ "dataset": dataset,
|
|
|
|
|
+ "fields": fields,
|
|
|
|
|
+ "filters": filters,
|
|
|
|
|
+ "metrics": [{"field": field, "alias": alias, "agg": agg} for field, alias, agg in metrics],
|
|
|
|
|
+ "sort": sort,
|
|
|
|
|
+ }
|
|
|
|
|
+ validate_card_spec(spec)
|
|
|
|
|
+ return spec
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def validate_card_spec(spec: dict[str, object]) -> None:
|
|
|
|
|
+ metric_fields = [metric["field"] for metric in spec["metrics"]]
|
|
|
|
|
+ metric_aggs = [metric["agg"] for metric in spec["metrics"]]
|
|
|
|
|
+ filter_fields = [item["field"] for item in spec["filters"]]
|
|
|
|
|
+ filter_values = [item.get("value", item.get("value_from")) for item in spec["filters"]]
|
|
|
|
|
+ sort_fields = [item["field"] for item in spec["sort"]]
|
|
|
|
|
+ sort_ways = [item["way"] for item in spec["sort"]]
|
|
|
|
|
+ if len(metric_fields) != len(metric_aggs):
|
|
|
|
|
+ raise ValueError(f"metric binding mismatch for {spec['card_name']}")
|
|
|
|
|
+ if len(filter_fields) != len(filter_values):
|
|
|
|
|
+ raise ValueError(f"filter binding mismatch for {spec['card_name']}")
|
|
|
|
|
+ if len(sort_fields) != len(sort_ways):
|
|
|
|
|
+ raise ValueError(f"sort binding mismatch for {spec['card_name']}")
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _choose_dataset(profile: dict[str, object], card_name: str) -> str:
|
|
|
|
|
+ for keywords, dataset in profile["datasets"]:
|
|
|
|
|
+ if any(keyword in card_name for keyword in keywords):
|
|
|
|
|
+ return dataset
|
|
|
|
|
+ return profile["default_dataset"]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _choose_metrics(profile: dict[str, object], card_name: str) -> list[tuple[str, str, str]]:
|
|
|
|
|
+ rate_keywords = ["率", "占比"]
|
|
|
|
|
+ if any(keyword in card_name for keyword in rate_keywords) and "及" not in card_name:
|
|
|
|
|
+ return [("比率值", card_name, "AVG")]
|
|
|
|
|
+ if "TOP10" in card_name:
|
|
|
|
|
+ return [profile["top_metric"]]
|
|
|
|
|
+
|
|
|
|
|
+ matched: list[tuple[str, str, str]] = []
|
|
|
|
|
+ for keywords, metrics in profile["metrics"]:
|
|
|
|
|
+ if any(keyword in card_name for keyword in keywords):
|
|
|
|
|
+ for metric in metrics:
|
|
|
|
|
+ if metric not in matched:
|
|
|
|
|
+ matched.append(metric)
|
|
|
|
|
+ if not matched:
|
|
|
|
|
+ matched.append(profile["default_metric"])
|
|
|
|
|
+ if "及" in card_name and len(matched) == 1:
|
|
|
|
|
+ matched.append(("比率值", "比率", "AVG"))
|
|
|
|
|
+ return matched[:3]
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _choose_fields(profile: dict[str, object], card_name: str) -> list[str]:
|
|
|
|
|
+ date_field = profile["date_field"]
|
|
|
|
|
+ if any(keyword in card_name for keyword in ["月度趋势", "走势图"]):
|
|
|
|
|
+ return [date_field]
|
|
|
|
|
+ if "各机构" in card_name or "各分行" in card_name:
|
|
|
|
|
+ return ["机构名称"]
|
|
|
|
|
+ if "TOP10" in card_name:
|
|
|
|
|
+ return [profile["top_field"]]
|
|
|
|
|
+ if any(keyword in card_name for keyword in ["结构", "分布", "构成"]):
|
|
|
|
|
+ return [profile["structure_field"]]
|
|
|
|
|
+ if "清单" in card_name or "超预算项目" in card_name or "未完成人员" in card_name:
|
|
|
|
|
+ return list(profile["list_fields"])
|
|
|
|
|
+ return []
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _choose_filters(profile: dict[str, object], card_name: str) -> list[dict[str, str]]:
|
|
|
|
|
+ filters = [{"field": profile["date_field"], "value_kind": "month_end"}]
|
|
|
|
|
+ if "各机构" in card_name or "各分行" in card_name:
|
|
|
|
|
+ filters.append({"field": "上级机构ID", "value_from": "dashboard.bbk_id"})
|
|
|
|
|
+ else:
|
|
|
|
|
+ filters.append({"field": "机构ID", "value_from": "dashboard.bbk_id"})
|
|
|
|
|
+ if "本机构" in card_name:
|
|
|
|
|
+ filters.append({"field": "机构层级", "value": "本机构"})
|
|
|
|
|
+ if "当月" in card_name:
|
|
|
|
|
+ filters.append({"field": "统计周期", "value": "当月"})
|
|
|
|
|
+ if "累计" in card_name:
|
|
|
|
|
+ filters.append({"field": "统计口径", "value": "年累计"})
|
|
|
|
|
+ if "流失" in card_name:
|
|
|
|
|
+ filters.append({"field": "客户状态", "value": "流失"})
|
|
|
|
|
+ if "活跃" in card_name:
|
|
|
|
|
+ filters.append({"field": "活跃标识", "value": "是"})
|
|
|
|
|
+ if "风险" in card_name or "预警" in card_name:
|
|
|
|
|
+ filters.append({"field": "风险等级", "value": "中高风险"})
|
|
|
|
|
+ return filters
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+def _choose_sort(
|
|
|
|
|
+ profile: dict[str, object],
|
|
|
|
|
+ card_name: str,
|
|
|
|
|
+ fields: list[str],
|
|
|
|
|
+ metrics: list[tuple[str, str, str]],
|
|
|
|
|
+) -> list[dict[str, str]]:
|
|
|
|
|
+ if any(keyword in card_name for keyword in ["月度趋势", "走势图"]):
|
|
|
|
|
+ return [{"field": profile["date_field"], "way": "ASC"}]
|
|
|
|
|
+ if any(keyword in card_name for keyword in ["排名", "TOP10", "清单", "各机构", "各分行"]):
|
|
|
|
|
+ return [{"field": metrics[0][0], "way": "DESC"}]
|
|
|
|
|
+ if any(keyword in card_name for keyword in ["结构", "分布", "构成"]) and metrics:
|
|
|
|
|
+ return [{"field": metrics[0][0], "way": "DESC"}]
|
|
|
|
|
+ if fields:
|
|
|
|
|
+ return [{"field": fields[0], "way": "ASC"}]
|
|
|
|
|
+ return []
|