风控系统本地数据源规则处理

发布于:2023-03-27 ⋅ 阅读:(181) ⋅ 点赞:(0)

风控系统本地数据源规则处理

背景

风控系统许多规则 需要调用本地数据源(如数据库) 查询出相关信息 进行校验 如

  • 规则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;
    }

源码

https://github.com/zhugw/anti...

本文含有隐藏内容,请 开通VIP 后查看