风控系统许多规则 须要调用本地数据源(如数据库) 查询出相关信息 进行校验 如java
规则1 -- 1天内该客户的申请次数 若是申请次数在0-10次 (含)之间,则经过,不然拒绝或人工复核。git
规则2 -- 1天内自动拒绝次数 若是自动拒绝次数在0-3 次(含)之间,则经过,不然拒绝或人工复核。github
规则3 -- 1天内授信额度范围 若是授信的总额度在0-3000 (含)元之间,则经过,不然拒绝或人工复核。数据库
...app
假如上面的每个规则 都对应一个DAO方法 如code
int countApply(String idcard,int daysAgo); int countRefusedApply(String idcard, int daysAgo); int sumCreditAmount(String idcard, int daysAgo);
而一个场景 如现金贷 会对应不少本地数据源的规则 如何知道哪一个规则对应哪一个DAO以及该DAO中的哪一个方法呢?get
目前 我是经过以下的方式去处理的源码
在配置文件中 记录规则ID与对应的DAO方法的映射关系it
1=applyDAO#countApply#idcard,0 2=applyDAO#countRefusedApply#idcard,0 3=applyDAO#sumCreditAmount#idcard,0
批量查询场景包含规则的本地数据io
/** * 批量查询本地数据源信息 * @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; }