风控系统本地数据源规则处理
背景
风控系统许多规则 需要调用本地数据源(如数据库) 查询出相关信息 进行校验 如
规则1 -- 1天内该客户的申请次数 如果申请次数在0-10次 (含)之间,则通过,否则拒绝或人工复核。
规则2 -- 1天内自动拒绝次数 如果自动拒绝次数在0-3 次(含)之间,则通过,否则拒绝或人工复核。
规则3 -- 1天内授信额度范围 如果授信的总额度在0-3000 (含)元之间,则通过,否则拒绝或人工复核。
...
假如上面的每一个规则 都对应一个DAO方法 如
int countApply(String idcard,int daysAgo);
int countRefusedApply(String idcard, int daysAgo);
int sumCreditAmount(String idcard, int daysAgo);
而一个场景 如现金贷 会对应很多本地数据源的规则 如何知道哪个规则对应哪个DAO以及该DAO中的哪个方法呢?
实现方案
目前 我是通过如下的方式去处理的
在配置文件中 记录规则ID与对应的DAO方法的映射关系
1=applyDAO#countApply#idcard,0
2=applyDAO#countRefusedApply#idcard,0
3=applyDAO#sumCreditAmount#idcard,0
批量查询场景包含规则的本地数据
/**
* 批量查询本地数据源信息
* @param applyInfo 用户申请信息
* @param ruleIdList 该场景对应的本地数据源规则ID列表
* @return Map ruleId : LocalData
*/
public Map batchQueryLocalData(ApplyInfo applyInfo,List<Integer> ruleIdList){
Map<Integer, Object> id2LocalDataMap = new HashMap<>();
for (Integer ruleId : ruleIdList) {
// 找到该规则对应的配置 1=applyDAO#countApply#idcard,0
String[] split = rule2DaoMap.get(ruleId.toString()).split("#");
String daoBean = split[0];
String method = split[1];
List paramList = new ArrayList<>();
if(split.length == 3) {
String args = split[2];
// 使用spel动态解析参数
resolveParamValue(applyInfo, paramList, args);
}
Object bean = context.getBean(daoBean);
// 反射调用
Object result = ReflectionUtil.invokeMethod(bean, method, paramList.toArray(new Object[]{paramList.size()}));
id2LocalDataMap.put(ruleId, result); // 保存查询结果
}
return id2LocalDataMap;
}
源码
本文含有隐藏内容,请 开通VIP 后查看