card_blueprints.py 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. from __future__ import annotations
  2. LEVEL1_DOMAIN_MAP = {
  3. "零售金融部": "零售",
  4. "公司金融部": "对公",
  5. "信用卡中心": "信用卡",
  6. "风险管理部": "风险",
  7. "运营管理部": "运营",
  8. "计划财务部": "财务",
  9. "网络经营服务部": "渠道",
  10. "普惠金融部": "普惠",
  11. "金融市场部": "金融市场",
  12. "国际业务部": "国际业务",
  13. "法律合规部": "合规",
  14. "人力资源部": "人力",
  15. }
  16. DOMAIN_KEYWORDS = {
  17. "零售": ["零售", "高价值", "私人银行", "私钻", "财富", "养老金", "AUM", "存款", "消费贷", "理财", "基金", "保险", "MGM"],
  18. "对公": ["对公", "公司", "战略客户", "机构客户", "上市公司", "保证金", "代发", "项目融资", "供应链", "信用证", "保函", "票据", "交易银行"],
  19. "信用卡": ["信用卡", "发卡", "分期", "额度"],
  20. "风险": ["风险", "不良", "逾期", "拨备", "授信", "贷后", "资产质量", "抵质押"],
  21. "运营": ["运营", "柜面", "账户", "支付结算", "反洗钱", "投诉", "集中作业", "现金库存", "回单"],
  22. "财务": ["财务", "利润", "FTP", "费用", "收入", "资本", "预算", "资产负债", "税务", "EVA", "收益率"],
  23. "渠道": ["渠道", "手机银行", "网银", "网点", "自助设备", "开放银行", "数字人民币", "预约到店", "活跃", "渗透率"],
  24. "普惠": ["普惠", "小微", "首贷", "涉农", "科创", "个体工商户"],
  25. "金融市场": ["金融市场", "债券", "同业", "资金头寸", "外汇交易", "衍生品", "转贴现", "投资"],
  26. "国际业务": ["国际", "跨境", "贸易融资", "进口", "出口", "外汇", "结售汇"],
  27. "合规": ["合规", "受益所有人", "尽职调查", "名单命中", "可疑交易", "监管报送", "制裁"],
  28. "人力": ["人力", "人均产能", "客户经理绩效", "奖金", "编制", "培训", "人才盘点"],
  29. }
  30. CARD_BLUEPRINT_NAMES = {
  31. "零售": [
  32. "当月零售客户数", "当月高价值客户数", "当月私人银行客户数", "零售客户较上月净增", "零售客户月度增长趋势",
  33. "高价值客户月度增长趋势", "AUM余额", "AUM余额月度走势图", "各机构AUM余额排名", "各机构高价值客户数及达成率",
  34. "客户资产分层结构", "产品持仓结构", "理财产品销售额", "基金产品保有量", "零售贷款余额",
  35. "消费贷放款额月度趋势", "客户经理AUM贡献TOP10", "流失预警客户清单", "本机构零售客户数", "本机构客户资产提升率",
  36. ],
  37. "对公": [
  38. "当月对公客户数", "战略客户数", "对公客户较上月净增", "对公存款余额", "对公存款日均余额",
  39. "活期存款占比", "对公存款余额月度趋势", "各机构对公存款余额排名", "公司贷款余额", "当月公司贷款投放额",
  40. "公司贷款投放月度趋势", "行业投向结构", "重点客户综合贡献TOP10", "代发客户数", "代发金额月度趋势",
  41. "信用证余额", "保函余额", "票据贴现金额", "交易银行活跃客户数", "流失预警对公客户清单",
  42. ],
  43. "信用卡": [
  44. "当月新增发卡量", "累计发卡量", "当月活跃客户数", "活跃率", "交易金额",
  45. "交易金额月度趋势", "交易笔数月度趋势", "各机构交易金额排名", "分期金额", "分期转化率",
  46. "分期手续费收入", "渠道获客结构", "额度使用率", "逾期客户数", "逾期余额",
  47. "逾期率月度趋势", "风险等级分布", "睡眠客户唤醒数", "权益活动参与客户数", "商户交易额TOP10",
  48. ],
  49. "风险": [
  50. "贷款余额", "不良贷款余额", "不良率", "关注类贷款余额", "逾期余额",
  51. "逾期率", "资产质量月度趋势", "不良贷款迁徙趋势", "各机构不良率排名", "行业风险分布",
  52. "风险预警客户数", "预警处置完成率", "贷后检查完成率", "授信集中度", "大额风险暴露客户清单",
  53. "抵质押品价值变动趋势", "拨备覆盖率", "五级分类结构", "本机构不良贷款余额", "本机构风险预警处置清单",
  54. ],
  55. "运营": [
  56. "当日柜面业务笔数", "当月柜面业务笔数", "业务金额", "平均处理时长", "超时业务笔数",
  57. "业务量月度趋势", "各机构业务量排名", "账户开立数", "账户异常数", "企业账户年检完成率",
  58. "支付结算笔数", "支付结算金额月度趋势", "运营风险事件数", "风险事件处理完成率", "客户投诉数",
  59. "投诉处理及时率", "集中作业处理时效分布", "现金库存余额", "电子回单使用率", "本机构待处理事项清单",
  60. ],
  61. "财务": [
  62. "营业收入", "净利息收入", "中间业务收入", "营业支出", "税前利润",
  63. "经济利润EVA", "利润贡献月度趋势", "各机构利润贡献排名", "收入结构", "费用预算",
  64. "费用执行率", "费用执行月度趋势", "产品收益率排名", "资产收益率", "负债成本率",
  65. "资产负债结构", "资本占用金额", "FTP净收入", "本机构利润贡献", "本机构费用超预算项目",
  66. ],
  67. "渠道": [
  68. "当月活跃客户数", "活跃率", "累计活跃客户数", "渠道渗透率", "活跃率月度走势图",
  69. "渗透率月度走势图", "各机构当月活跃客户数及活跃率", "各机构累计活跃客户数及活跃率", "手机银行登录次数", "网银交易金额",
  70. "数字人民币交易笔数", "线上预约到店客户数", "预约到店转化率", "活跃用户构成", "新增用户月度走势图",
  71. "流失用户数", "渠道交易金额结构", "自助设备可用率", "开放银行接口调用量", "活跃TOP10用户名称",
  72. ],
  73. "普惠": [
  74. "普惠贷款余额", "普惠贷款投放额", "普惠贷款余额月度趋势", "各机构普惠贷款余额排名", "小微客户数",
  75. "小微客户较上月净增", "首贷户数", "首贷户拓展月度趋势", "涉农贷款余额", "科技型企业贷款余额",
  76. "个体工商户贷款余额", "贷款加权利率", "利率定价分布", "普惠不良贷款余额", "普惠不良率",
  77. "风险补偿金额", "延期还本金额", "本机构普惠贷款投放额", "客户经理普惠贷款贡献TOP10", "普惠风险客户清单",
  78. ],
  79. "金融市场": [
  80. "投资余额", "投资市值", "估值损益", "估值损益月度趋势", "投资组合结构",
  81. "债券品种结构", "久期分布", "同业负债余额", "同业负债成本率", "资金头寸缺口",
  82. "资金头寸缺口趋势", "外汇交易损益", "衍生品估值损益", "交易对手集中度", "限额占用率",
  83. "限额超限预警清单", "票据转贴现金额", "理财投资资产穿透结构", "市场价格波动预警", "本机构同业业务余额",
  84. ],
  85. "国际业务": [
  86. "跨境结算金额", "跨境结算笔数", "跨境结算月度趋势", "贸易融资余额", "贸易融资投放额",
  87. "进口信用证金额", "出口托收金额", "外汇存款余额", "结售汇金额", "结售汇客户贡献TOP10",
  88. "跨境人民币金额", "币种分布", "国家地区分布", "各机构国际业务收入排名", "国际业务风险预警笔数",
  89. "风险预警处置率", "本机构跨境结算金额", "本机构贸易融资余额", "重点客户国际业务贡献", "业务品种结构",
  90. ],
  91. "合规": [
  92. "待尽调客户数", "已尽调客户数", "尽调完成率", "尽调完成率月度趋势", "受益所有人信息缺失客户数",
  93. "名单命中客户数", "可疑交易笔数", "可疑交易金额", "可疑交易月度趋势", "监管报送差错数",
  94. "报送质量月度趋势", "合规检查问题数", "整改完成率", "整改逾期问题清单", "制裁筛查处理及时率",
  95. "员工异常行为线索数", "各机构合规问题数排名", "风险等级分布", "本机构待处理合规事项", "本机构整改完成率",
  96. ],
  97. "人力": [
  98. "在岗人数", "客户经理人数", "人均产能", "人均产能月度趋势", "各机构人均产能排名",
  99. "客户经理绩效得分", "客户经理绩效TOP10", "奖金金额", "奖金分配结构", "岗位编制缺口",
  100. "人员流入流出趋势", "培训完成率", "培训完成率月度趋势", "人才梯队人数", "一线人员工作量",
  101. "管户客户数", "管户负载分布", "本机构人均产能", "本机构编制缺口", "本机构培训未完成人员清单",
  102. ],
  103. }
  104. DOMAIN_PROFILES = {
  105. "零售": {
  106. "prefix": "RTL",
  107. "date_field": "统计日期",
  108. "default_dataset": "零售客户经营宽表",
  109. "datasets": [
  110. (["AUM", "资产", "高价值", "私人银行", "客户经理"], "零售AUM日均汇总"),
  111. (["理财", "基金", "产品", "持仓"], "零售产品销售明细"),
  112. (["贷款", "消费贷"], "零售贷款余额快照"),
  113. ],
  114. "metrics": [
  115. (["高价值"], [("客户ID", "高价值客户数", "CNT_DISTINCT")]),
  116. (["私人银行"], [("客户ID", "私人银行客户数", "CNT_DISTINCT")]),
  117. (["AUM", "资产"], [("AUM余额", "AUM余额", "SUM")]),
  118. (["理财"], [("理财销售额", "理财产品销售额", "SUM")]),
  119. (["基金"], [("基金保有量", "基金产品保有量", "SUM")]),
  120. (["贷款"], [("贷款余额", "零售贷款余额", "SUM")]),
  121. (["消费贷"], [("放款金额", "消费贷放款额", "SUM")]),
  122. (["净增", "新增"], [("客户ID", "新增客户数", "CNT_DISTINCT")]),
  123. (["流失"], [("客户ID", "流失客户数", "CNT_DISTINCT")]),
  124. (["提升率", "达成率"], [("达成率", "达成率", "AVG")]),
  125. ],
  126. "default_metric": ("客户ID", "零售客户数", "CNT_DISTINCT"),
  127. "top_metric": ("AUM余额", "AUM贡献", "SUM"),
  128. "structure_field": "客户层级",
  129. "top_field": "客户经理",
  130. "list_fields": ["客户名称", "客户层级", "AUM余额", "客户经理"],
  131. },
  132. "对公": {
  133. "prefix": "CORP",
  134. "date_field": "统计日期",
  135. "default_dataset": "对公客户经营汇总",
  136. "datasets": [
  137. (["存款", "活期"], "对公存款余额明细"),
  138. (["贷款", "投放", "行业投向"], "公司信贷业务余额"),
  139. (["代发", "交易银行"], "交易银行业务统计"),
  140. (["信用证", "保函", "票据"], "对公表外及票据业务明细"),
  141. ],
  142. "metrics": [
  143. (["战略客户"], [("客户ID", "战略客户数", "CNT_DISTINCT")]),
  144. (["存款"], [("存款余额", "对公存款余额", "SUM")]),
  145. (["日均"], [("日均余额", "对公存款日均余额", "SUM")]),
  146. (["活期"], [("活期存款余额", "活期存款余额", "SUM"), ("存款余额", "存款余额", "SUM")]),
  147. (["贷款"], [("贷款余额", "公司贷款余额", "SUM")]),
  148. (["投放"], [("投放金额", "贷款投放额", "SUM")]),
  149. (["代发"], [("代发金额", "代发金额", "SUM")]),
  150. (["信用证"], [("信用证余额", "信用证余额", "SUM")]),
  151. (["保函"], [("保函余额", "保函余额", "SUM")]),
  152. (["票据"], [("贴现金额", "票据贴现金额", "SUM")]),
  153. (["交易银行", "活跃"], [("客户ID", "活跃客户数", "CNT_DISTINCT")]),
  154. (["综合贡献"], [("综合贡献", "综合贡献", "SUM")]),
  155. (["净增"], [("客户ID", "新增客户数", "CNT_DISTINCT")]),
  156. (["流失"], [("客户ID", "流失客户数", "CNT_DISTINCT")]),
  157. ],
  158. "default_metric": ("客户ID", "对公客户数", "CNT_DISTINCT"),
  159. "top_metric": ("综合贡献", "综合贡献", "SUM"),
  160. "structure_field": "行业门类",
  161. "top_field": "客户名称",
  162. "list_fields": ["客户名称", "客户等级", "行业门类", "管户客户经理"],
  163. },
  164. "信用卡": {
  165. "prefix": "CARD",
  166. "date_field": "统计日期",
  167. "default_dataset": "信用卡客户交易汇总",
  168. "datasets": [
  169. (["分期"], "信用卡分期业务明细"),
  170. (["逾期", "风险"], "信用卡风险客户监测"),
  171. (["渠道", "获客"], "信用卡渠道获客统计"),
  172. (["商户", "交易"], "信用卡客户交易汇总"),
  173. ],
  174. "metrics": [
  175. (["发卡"], [("卡号", "发卡量", "CNT_DISTINCT")]),
  176. (["活跃"], [("客户ID", "活跃客户数", "CNT_DISTINCT")]),
  177. (["交易金额", "商户"], [("交易金额", "交易金额", "SUM")]),
  178. (["交易笔数"], [("交易流水号", "交易笔数", "CNT_DISTINCT")]),
  179. (["分期金额"], [("分期金额", "分期金额", "SUM")]),
  180. (["转化率", "活跃率", "使用率", "逾期率"], [("比率值", "比率", "AVG")]),
  181. (["手续费"], [("手续费收入", "分期手续费收入", "SUM")]),
  182. (["逾期余额"], [("逾期余额", "逾期余额", "SUM")]),
  183. (["逾期客户"], [("客户ID", "逾期客户数", "CNT_DISTINCT")]),
  184. (["唤醒"], [("客户ID", "唤醒客户数", "CNT_DISTINCT")]),
  185. ],
  186. "default_metric": ("客户ID", "信用卡客户数", "CNT_DISTINCT"),
  187. "top_metric": ("交易金额", "交易金额", "SUM"),
  188. "structure_field": "渠道名称",
  189. "top_field": "商户名称",
  190. "list_fields": ["客户名称", "卡产品", "风险等级", "逾期余额"],
  191. },
  192. "风险": {
  193. "prefix": "RISK",
  194. "date_field": "统计日期",
  195. "default_dataset": "信贷资产质量汇总",
  196. "datasets": [
  197. (["不良", "迁徙", "五级分类"], "不良贷款迁徙明细"),
  198. (["预警", "清单"], "预警客户处置台账"),
  199. (["授信", "集中度", "大额"], "授信集中度监控表"),
  200. (["抵质押"], "抵质押品重估明细"),
  201. ],
  202. "metrics": [
  203. (["不良率", "逾期率"], [("比率值", "风险比率", "AVG")]),
  204. (["不良"], [("不良贷款余额", "不良贷款余额", "SUM")]),
  205. (["关注"], [("关注类贷款余额", "关注类贷款余额", "SUM")]),
  206. (["逾期"], [("逾期余额", "逾期余额", "SUM")]),
  207. (["预警"], [("客户ID", "风险预警客户数", "CNT_DISTINCT")]),
  208. (["完成率", "覆盖率"], [("比率值", "完成率", "AVG")]),
  209. (["授信"], [("授信余额", "授信集中度", "SUM")]),
  210. (["拨备"], [("拨备覆盖率", "拨备覆盖率", "AVG")]),
  211. ],
  212. "default_metric": ("贷款余额", "贷款余额", "SUM"),
  213. "top_metric": ("贷款余额", "贷款余额", "SUM"),
  214. "structure_field": "五级分类",
  215. "top_field": "客户名称",
  216. "list_fields": ["客户名称", "风险等级", "贷款余额", "处置状态"],
  217. },
  218. "运营": {
  219. "prefix": "OPS",
  220. "date_field": "统计日期",
  221. "default_dataset": "网点运营业务量汇总",
  222. "datasets": [
  223. (["账户"], "账户质量监控明细"),
  224. (["支付结算"], "支付结算业务统计"),
  225. (["风险事件", "投诉", "待处理"], "运营风险事件台账"),
  226. (["现金"], "现金库存调拨明细"),
  227. ],
  228. "metrics": [
  229. (["笔数", "业务量"], [("业务流水号", "业务笔数", "CNT_DISTINCT")]),
  230. (["金额", "库存"], [("业务金额", "业务金额", "SUM")]),
  231. (["时长"], [("处理时长", "平均处理时长", "AVG")]),
  232. (["超时"], [("业务流水号", "超时业务笔数", "CNT_DISTINCT")]),
  233. (["开立"], [("账户ID", "账户开立数", "CNT_DISTINCT")]),
  234. (["异常"], [("账户ID", "账户异常数", "CNT_DISTINCT")]),
  235. (["完成率", "及时率", "使用率"], [("比率值", "比率", "AVG")]),
  236. (["投诉"], [("投诉编号", "客户投诉数", "CNT_DISTINCT")]),
  237. (["风险事件"], [("事件编号", "运营风险事件数", "CNT_DISTINCT")]),
  238. ],
  239. "default_metric": ("业务流水号", "业务笔数", "CNT_DISTINCT"),
  240. "top_metric": ("业务笔数", "业务笔数", "SUM"),
  241. "structure_field": "业务类型",
  242. "top_field": "机构名称",
  243. "list_fields": ["事项编号", "业务类型", "处理状态", "责任团队"],
  244. },
  245. "财务": {
  246. "prefix": "FIN",
  247. "date_field": "统计月份",
  248. "default_dataset": "管理会计利润汇总",
  249. "datasets": [
  250. (["费用", "预算"], "费用预算执行表"),
  251. (["收益率", "产品"], "产品收益率测算表"),
  252. (["资产负债", "资本", "FTP"], "资产负债结构快照"),
  253. ],
  254. "metrics": [
  255. (["收入"], [("收入金额", "营业收入", "SUM")]),
  256. (["支出"], [("支出金额", "营业支出", "SUM")]),
  257. (["利润", "EVA"], [("利润金额", "利润贡献", "SUM")]),
  258. (["预算"], [("预算金额", "费用预算", "SUM")]),
  259. (["执行率", "收益率", "成本率"], [("比率值", "比率", "AVG")]),
  260. (["资本"], [("资本占用金额", "资本占用金额", "SUM")]),
  261. (["FTP"], [("FTP净收入", "FTP净收入", "SUM")]),
  262. ],
  263. "default_metric": ("财务金额", "财务金额", "SUM"),
  264. "top_metric": ("利润金额", "利润贡献", "SUM"),
  265. "structure_field": "产品条线",
  266. "top_field": "机构名称",
  267. "list_fields": ["项目名称", "费用科目", "预算金额", "执行金额"],
  268. },
  269. "渠道": {
  270. "prefix": "CHNL",
  271. "date_field": "统计日期",
  272. "default_dataset": "数字渠道活跃客户统计",
  273. "datasets": [
  274. (["网点", "预约"], "网点客流业务统计"),
  275. (["自助设备"], "自助设备运行明细"),
  276. (["营销"], "渠道协同营销明细"),
  277. (["接口", "开放银行"], "开放银行接口调用明细"),
  278. (["数字人民币"], "数字人民币交易统计"),
  279. ],
  280. "metrics": [
  281. (["活跃客户", "累计活跃"], [("用户ID", "活跃用户数", "CNT_DISTINCT")]),
  282. (["活跃率", "渗透率", "转化率", "可用率"], [("比率值", "比率", "AVG")]),
  283. (["登录"], [("登录次数", "登录次数", "SUM")]),
  284. (["交易金额"], [("交易金额", "交易金额", "SUM")]),
  285. (["交易笔数"], [("交易流水号", "交易笔数", "CNT_DISTINCT")]),
  286. (["预约"], [("客户ID", "预约客户数", "CNT_DISTINCT")]),
  287. (["新增"], [("用户ID", "新增用户数", "CNT_DISTINCT")]),
  288. (["流失"], [("用户ID", "流失用户数", "CNT_DISTINCT")]),
  289. (["接口"], [("调用次数", "接口调用量", "SUM")]),
  290. ],
  291. "default_metric": ("用户ID", "用户数", "CNT_DISTINCT"),
  292. "top_metric": ("登录次数", "登录次数", "SUM"),
  293. "structure_field": "用户状态",
  294. "top_field": "用户名称",
  295. "list_fields": ["用户名称", "所属机构", "登录次数", "最近登录时间"],
  296. },
  297. "普惠": {
  298. "prefix": "INCL",
  299. "date_field": "统计日期",
  300. "default_dataset": "普惠贷款业务汇总",
  301. "datasets": [
  302. (["小微", "客户经理"], "小微客户经营宽表"),
  303. (["涉农"], "涉农贷款投放明细"),
  304. (["风险补偿", "延期"], "普惠风险补偿台账"),
  305. ],
  306. "metrics": [
  307. (["投放"], [("投放金额", "普惠贷款投放额", "SUM")]),
  308. (["小微"], [("客户ID", "小微客户数", "CNT_DISTINCT")]),
  309. (["首贷"], [("客户ID", "首贷户数", "CNT_DISTINCT")]),
  310. (["涉农"], [("贷款余额", "涉农贷款余额", "SUM")]),
  311. (["科技型"], [("贷款余额", "科技型企业贷款余额", "SUM")]),
  312. (["利率", "不良率"], [("比率值", "比率", "AVG")]),
  313. (["不良"], [("不良贷款余额", "不良贷款余额", "SUM")]),
  314. (["风险补偿"], [("补偿金额", "风险补偿金额", "SUM")]),
  315. (["延期"], [("延期金额", "延期还本金额", "SUM")]),
  316. ],
  317. "default_metric": ("贷款余额", "普惠贷款余额", "SUM"),
  318. "top_metric": ("贷款余额", "普惠贷款贡献", "SUM"),
  319. "structure_field": "贷款产品",
  320. "top_field": "客户经理",
  321. "list_fields": ["客户名称", "贷款产品", "贷款余额", "风险等级"],
  322. },
  323. "金融市场": {
  324. "prefix": "MKT",
  325. "date_field": "统计日期",
  326. "default_dataset": "金融市场投资组合明细",
  327. "datasets": [
  328. (["同业"], "同业负债成本统计"),
  329. (["资金头寸"], "资金头寸预测表"),
  330. (["外汇", "衍生品"], "外汇衍生交易估值表"),
  331. (["票据"], "票据转贴现业务分析表"),
  332. ],
  333. "metrics": [
  334. (["市值"], [("市值", "投资市值", "SUM")]),
  335. (["损益"], [("损益金额", "损益金额", "SUM")]),
  336. (["久期", "成本率", "占用率"], [("比率值", "比率", "AVG")]),
  337. (["同业"], [("同业负债余额", "同业负债余额", "SUM")]),
  338. (["缺口"], [("资金缺口", "资金头寸缺口", "SUM")]),
  339. (["票据"], [("贴现金额", "票据转贴现金额", "SUM")]),
  340. ],
  341. "default_metric": ("投资余额", "投资余额", "SUM"),
  342. "top_metric": ("投资余额", "投资余额", "SUM"),
  343. "structure_field": "交易品种",
  344. "top_field": "交易对手",
  345. "list_fields": ["交易对手", "交易品种", "限额占用率", "预警等级"],
  346. },
  347. "国际业务": {
  348. "prefix": "INTL",
  349. "date_field": "统计日期",
  350. "default_dataset": "国际结算业务统计",
  351. "datasets": [
  352. (["贸易融资"], "贸易融资业务明细"),
  353. (["结售汇"], "结售汇客户贡献表"),
  354. (["跨境人民币"], "跨境人民币业务汇总"),
  355. (["信用证", "托收"], "国际结算业务统计"),
  356. ],
  357. "metrics": [
  358. (["笔数"], [("业务流水号", "业务笔数", "CNT_DISTINCT")]),
  359. (["贸易融资"], [("融资余额", "贸易融资余额", "SUM")]),
  360. (["投放"], [("投放金额", "贸易融资投放额", "SUM")]),
  361. (["信用证"], [("信用证金额", "进口信用证金额", "SUM")]),
  362. (["托收"], [("托收金额", "出口托收金额", "SUM")]),
  363. (["外汇存款"], [("存款余额", "外汇存款余额", "SUM")]),
  364. (["结售汇"], [("结售汇金额", "结售汇金额", "SUM")]),
  365. (["人民币"], [("业务金额", "跨境人民币金额", "SUM")]),
  366. (["处置率"], [("比率值", "风险预警处置率", "AVG")]),
  367. (["风险预警"], [("预警编号", "风险预警笔数", "CNT_DISTINCT")]),
  368. ],
  369. "default_metric": ("结算金额", "跨境结算金额", "SUM"),
  370. "top_metric": ("业务金额", "国际业务贡献", "SUM"),
  371. "structure_field": "业务品种",
  372. "top_field": "客户名称",
  373. "list_fields": ["客户名称", "业务品种", "币种", "业务金额"],
  374. },
  375. "合规": {
  376. "prefix": "COMP",
  377. "date_field": "统计日期",
  378. "default_dataset": "反洗钱客户监测表",
  379. "datasets": [
  380. (["尽调", "受益所有人"], "客户尽职调查台账"),
  381. (["监管报送"], "监管报送质量统计"),
  382. (["整改", "检查"], "合规检查整改明细"),
  383. (["名单", "可疑交易", "制裁"], "反洗钱客户监测表"),
  384. ],
  385. "metrics": [
  386. (["待尽调"], [("客户ID", "待尽调客户数", "CNT_DISTINCT")]),
  387. (["已尽调"], [("客户ID", "已尽调客户数", "CNT_DISTINCT")]),
  388. (["完成率", "及时率"], [("比率值", "比率", "AVG")]),
  389. (["缺失"], [("客户ID", "信息缺失客户数", "CNT_DISTINCT")]),
  390. (["名单"], [("客户ID", "名单命中客户数", "CNT_DISTINCT")]),
  391. (["交易金额"], [("交易金额", "可疑交易金额", "SUM")]),
  392. (["可疑交易"], [("交易流水号", "可疑交易笔数", "CNT_DISTINCT")]),
  393. (["差错"], [("报送批次号", "报送差错数", "CNT_DISTINCT")]),
  394. (["问题"], [("问题编号", "合规检查问题数", "CNT_DISTINCT")]),
  395. (["线索"], [("线索编号", "异常行为线索数", "CNT_DISTINCT")]),
  396. ],
  397. "default_metric": ("客户ID", "客户数", "CNT_DISTINCT"),
  398. "top_metric": ("问题编号", "合规问题数", "CNT_DISTINCT"),
  399. "structure_field": "风险等级",
  400. "top_field": "机构名称",
  401. "list_fields": ["事项编号", "问题类型", "处理状态", "责任部门"],
  402. },
  403. "人力": {
  404. "prefix": "HR",
  405. "date_field": "统计月份",
  406. "default_dataset": "机构人员产能统计",
  407. "datasets": [
  408. (["绩效", "客户经理"], "客户经理绩效明细"),
  409. (["奖金"], "奖金分配测算表"),
  410. (["培训"], "培训完成情况表"),
  411. (["编制", "人才", "人员"], "人员编制与流动统计"),
  412. ],
  413. "metrics": [
  414. (["人数", "在岗", "客户经理", "人才"], [("员工ID", "人数", "CNT_DISTINCT")]),
  415. (["产能"], [("人均产能", "人均产能", "AVG")]),
  416. (["绩效"], [("绩效得分", "绩效得分", "AVG")]),
  417. (["奖金"], [("奖金金额", "奖金金额", "SUM")]),
  418. (["缺口"], [("编制缺口", "编制缺口", "SUM")]),
  419. (["流入流出"], [("员工ID", "人员变动数", "CNT_DISTINCT")]),
  420. (["培训完成率"], [("比率值", "培训完成率", "AVG")]),
  421. (["管户"], [("客户ID", "管户客户数", "CNT_DISTINCT")]),
  422. ],
  423. "default_metric": ("员工ID", "人数", "CNT_DISTINCT"),
  424. "top_metric": ("绩效得分", "绩效得分", "AVG"),
  425. "structure_field": "岗位名称",
  426. "top_field": "员工姓名",
  427. "list_fields": ["员工姓名", "岗位名称", "团队名称", "完成状态"],
  428. },
  429. }
  430. def get_card_blueprints(domain: str) -> list[dict[str, object]]:
  431. return [build_card_spec(domain, card_name) for card_name in CARD_BLUEPRINT_NAMES[domain]]
  432. def build_card_spec(domain: str, card_name: str) -> dict[str, object]:
  433. profile = DOMAIN_PROFILES[domain]
  434. metrics = _choose_metrics(profile, card_name)
  435. fields = _choose_fields(profile, card_name)
  436. filters = _choose_filters(profile, card_name)
  437. sort = _choose_sort(profile, card_name, fields, metrics)
  438. dataset = _choose_dataset(profile, card_name)
  439. spec = {
  440. "card_name": card_name,
  441. "dataset_prefix": profile["prefix"],
  442. "dataset": dataset,
  443. "fields": fields,
  444. "filters": filters,
  445. "metrics": [{"field": field, "alias": alias, "agg": agg} for field, alias, agg in metrics],
  446. "sort": sort,
  447. }
  448. validate_card_spec(spec)
  449. return spec
  450. def validate_card_spec(spec: dict[str, object]) -> None:
  451. metric_fields = [metric["field"] for metric in spec["metrics"]]
  452. metric_aggs = [metric["agg"] for metric in spec["metrics"]]
  453. filter_fields = [item["field"] for item in spec["filters"]]
  454. filter_values = [item.get("value", item.get("value_from")) for item in spec["filters"]]
  455. sort_fields = [item["field"] for item in spec["sort"]]
  456. sort_ways = [item["way"] for item in spec["sort"]]
  457. if len(metric_fields) != len(metric_aggs):
  458. raise ValueError(f"metric binding mismatch for {spec['card_name']}")
  459. if len(filter_fields) != len(filter_values):
  460. raise ValueError(f"filter binding mismatch for {spec['card_name']}")
  461. if len(sort_fields) != len(sort_ways):
  462. raise ValueError(f"sort binding mismatch for {spec['card_name']}")
  463. def _choose_dataset(profile: dict[str, object], card_name: str) -> str:
  464. for keywords, dataset in profile["datasets"]:
  465. if any(keyword in card_name for keyword in keywords):
  466. return dataset
  467. return profile["default_dataset"]
  468. def _choose_metrics(profile: dict[str, object], card_name: str) -> list[tuple[str, str, str]]:
  469. rate_keywords = ["率", "占比"]
  470. if any(keyword in card_name for keyword in rate_keywords) and "及" not in card_name:
  471. return [("比率值", card_name, "AVG")]
  472. if "TOP10" in card_name:
  473. return [profile["top_metric"]]
  474. matched: list[tuple[str, str, str]] = []
  475. for keywords, metrics in profile["metrics"]:
  476. if any(keyword in card_name for keyword in keywords):
  477. for metric in metrics:
  478. if metric not in matched:
  479. matched.append(metric)
  480. if not matched:
  481. matched.append(profile["default_metric"])
  482. if "及" in card_name and len(matched) == 1:
  483. matched.append(("比率值", "比率", "AVG"))
  484. return matched[:3]
  485. def _choose_fields(profile: dict[str, object], card_name: str) -> list[str]:
  486. date_field = profile["date_field"]
  487. if any(keyword in card_name for keyword in ["月度趋势", "走势图"]):
  488. return [date_field]
  489. if "各机构" in card_name or "各分行" in card_name:
  490. return ["机构名称"]
  491. if "TOP10" in card_name:
  492. return [profile["top_field"]]
  493. if any(keyword in card_name for keyword in ["结构", "分布", "构成"]):
  494. return [profile["structure_field"]]
  495. if "清单" in card_name or "超预算项目" in card_name or "未完成人员" in card_name:
  496. return list(profile["list_fields"])
  497. return []
  498. def _choose_filters(profile: dict[str, object], card_name: str) -> list[dict[str, str]]:
  499. filters = [{"field": profile["date_field"], "value_kind": "month_end"}]
  500. if "各机构" in card_name or "各分行" in card_name:
  501. filters.append({"field": "上级机构ID", "value_from": "dashboard.bbk_id"})
  502. else:
  503. filters.append({"field": "机构ID", "value_from": "dashboard.bbk_id"})
  504. if "本机构" in card_name:
  505. filters.append({"field": "机构层级", "value": "本机构"})
  506. if "当月" in card_name:
  507. filters.append({"field": "统计周期", "value": "当月"})
  508. if "累计" in card_name:
  509. filters.append({"field": "统计口径", "value": "年累计"})
  510. if "流失" in card_name:
  511. filters.append({"field": "客户状态", "value": "流失"})
  512. if "活跃" in card_name:
  513. filters.append({"field": "活跃标识", "value": "是"})
  514. if "风险" in card_name or "预警" in card_name:
  515. filters.append({"field": "风险等级", "value": "中高风险"})
  516. return filters
  517. def _choose_sort(
  518. profile: dict[str, object],
  519. card_name: str,
  520. fields: list[str],
  521. metrics: list[tuple[str, str, str]],
  522. ) -> list[dict[str, str]]:
  523. if any(keyword in card_name for keyword in ["月度趋势", "走势图"]):
  524. return [{"field": profile["date_field"], "way": "ASC"}]
  525. if any(keyword in card_name for keyword in ["排名", "TOP10", "清单", "各机构", "各分行"]):
  526. return [{"field": metrics[0][0], "way": "DESC"}]
  527. if any(keyword in card_name for keyword in ["结构", "分布", "构成"]) and metrics:
  528. return [{"field": metrics[0][0], "way": "DESC"}]
  529. if fields:
  530. return [{"field": fields[0], "way": "ASC"}]
  531. return []