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

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

背景

风控系统许多规则 须要调用本地数据源(如数据库) 查询出相关信息 进行校验 如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;
    }

源码

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

相关文章
相关标签/搜索