風控系統本地數據源規則處理

風控系統本地數據源規則處理

背景

風控系統許多規則 須要調用本地數據源(如數據庫) 查詢出相關信息 進行校驗 如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...

相關文章
相關標籤/搜索