Browse Source

IndexCalcUnit、InterfaceCalcUnit优化 ;工具类添加调用计算单元的方法

JoeLazy 1 ngày trước cách đây
mục cha
commit
c0d34f4844

+ 11 - 10
src/main/java/com/sundata/internalevaluation/calc/calcUnit/IndexCalcUnit.java

@@ -188,7 +188,7 @@ public class IndexCalcUnit extends CalcUnit {
                     if (schemeObj instanceof AbstractSchema schema) {
                         dataSetResult.put(calcCode,schema);
                     } else {
-                        String errorMsg = StrUtil.format("数据集返回的计算结果不是AbstractSchema类型",calcUnit.getCalcName(),calcCode);
+                        String errorMsg = StrUtil.format("数据集-[{}({})]-返回的计算结果不是AbstractSchema类型",calcUnit.getCalcName(),calcCode);
                         log.error(errorMsg);
                         throw new CalcException(errorMsg);
                     }
@@ -206,8 +206,6 @@ public class IndexCalcUnit extends CalcUnit {
             }
         });
 
-        // TODO 计算过程开始
-
         // 定义指标结果变量
         Object indexCalcResult = null;
 
@@ -217,7 +215,7 @@ public class IndexCalcUnit extends CalcUnit {
         if (dataSetNumber.get() > 0 && indexNumber.get() == 0){
             // 如果数据集的数量大于0(只依赖数据集)
             indexCalcResult = doExecuteSql(dataSetResult,calcLogic);
-        } else if(indexNumber.get() > 0 && dataSetNumber.get() == 0){
+        } else if(dataSetNumber.get() == 0 && indexNumber.get() > 0){
             // 如果指标的数量大于0(只依赖其他指标)
             // 执行公式,结果放入结果集
             indexCalcResult = ScriptUtil.executeScript(indexConfigModel.getIndexNo(),calcLogic,indexResult);
@@ -233,6 +231,7 @@ public class IndexCalcUnit extends CalcUnit {
             indexCalcResult = ScriptUtil.executeScript(indexConfigModel.getIndexNo(),calcLogic,indexResult);
         }
 
+        // *********************** 处理指标结果为null的情况
         if (null != indexCalcResult) {
             thisResult.put(this.getCalcCode(),indexCalcResult);
         } else {
@@ -245,9 +244,9 @@ public class IndexCalcUnit extends CalcUnit {
 
     /**
      * 执行sql获取结果
-     * @param dataSetResult
-     * @param logic
-     * @return
+     * @param dataSetResult 数据集
+     * @param logic 指标计算逻辑
+     * @return 计算结果
      */
     private Object doExecuteSql(Map<String,AbstractSchema> dataSetResult,String logic) {
         // 执行sql的工具类实例
@@ -273,7 +272,7 @@ public class IndexCalcUnit extends CalcUnit {
     }
 
     /**
-     *
+     * 获取默认值
      * @param defaultValue 默认值
      * @param defaultValueType 默认值类型
      * @return 转化后值
@@ -297,7 +296,7 @@ public class IndexCalcUnit extends CalcUnit {
                         break;
                 }
                 if (null ==castValue) {
-                    String error = "转化异常";
+                    String error = StrUtil.format("指标-[{}({})]-默认值转换失败,期望类型为[{}],待转换的值为[{}]。", getCalcName(),getCalcCode(),defaultValueType,defaultValue);
                     log.error(error);
                     throw new ClassCastException(error);
                 }
@@ -305,7 +304,9 @@ public class IndexCalcUnit extends CalcUnit {
                 throw new BusinessException(e.getMessage());
             }
         } else {
-            log.error("为设置默认值与默认类型");
+            String error = StrUtil.format("指标-[{}({})]-计算结果为null,且未设置默认值类型或默认值。", getCalcName(),getCalcCode());
+            log.error(error);
+            throw new BusinessException(error);
         }
         return castValue;
     }

+ 52 - 19
src/main/java/com/sundata/internalevaluation/calc/calcUnit/InterfaceCalcUnit.java

@@ -5,8 +5,8 @@ import cn.hutool.extra.spring.SpringUtil;
 import cn.hutool.http.HttpRequest;
 import cn.hutool.http.HttpResponse;
 import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONException;
 import cn.hutool.json.JSONUtil;
-import com.sundata.admin.AdminUtil;
 import com.sundata.common.exception.BusinessException;
 import com.sundata.common.util.JsonUtil;
 import com.sundata.internalevaluation.calc.calcUnit.interfaces.InterfaceRunning;
@@ -27,6 +27,7 @@ import org.springframework.jdbc.core.JdbcTemplate;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 
 /**
  * Created by IntelliJ IDEA.
@@ -123,8 +124,9 @@ public class InterfaceCalcUnit extends CalcUnit {
                      Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
 
         log.debug("计算{}:编号:{},名称:{},流水号:{}", getCalcType().getName(), getCalcCode(), getCalcName(), calculateInstanceNumber);
-        // 获取新流水号,每次请求接口必须不一样
-        String globalReqNo = AdminUtil.getNextId("cretSeqno");
+        // 获取新流水号,每次请求接口必须不一样 TODO 根据实际情况生成全局流水号
+//        String globalReqNo = AdminUtil.getNextId("cretSeqno");
+        String globalReqNo = UUID.randomUUID().toString();
         context.put("globalReqNo",globalReqNo);
         // creditSeqNo 查询征信的流水号 如果不存在就重新赋值 只有征信的请求才会用到
         context.putIfAbsent("creditSeqNo",globalReqNo);
@@ -166,7 +168,7 @@ public class InterfaceCalcUnit extends CalcUnit {
             // 拼接url  其中可能存在变量
             String url = interfaceTypeCode + "://" +
                     interfaceModel.getInterfaceIp() + ":" +
-                    interfaceModel.getInterfacePort() +
+                    interfaceModel.getInterfacePort() +"/"+
                     interfaceModel.getInterfaceUrl();
 
             Map<String,Object> allMap = new HashMap<>(headersMap);
@@ -220,22 +222,29 @@ public class InterfaceCalcUnit extends CalcUnit {
             try (HttpResponse httpResponse = httpRequest.execute()) {
                 responseStr = httpResponse.body();
                 log.debug("接口-[{}({})]-请求地址-[{}]-响应body报文:{}",getCalcName(),getCalcCode(),url,responseStr);
-                String respParamTypeCode = interfaceModel.getRespParamTypeCode();
-                if ("json".equals(respParamTypeCode)){
-                    responseStr = JSONUtil.toJsonPrettyStr(responseStr);
-                }
-                // TODO 可继续增加其他类型
-                else
-                {
-                    throw new RuntimeException("接口-目前只支持 json 返回报文");
-                }
-
             }catch (Exception e){
                 String errMsg = StrUtil.format("接口-[{}({})]-请求地址-[{}] - 请求出现异常:{}", getCalcName(), getCalcCode(), url, e.getMessage());
                 log.error(errMsg);
                 throw new BusinessException(errMsg, e);
             }
 
+            // 判断返回值类型
+            String respParamTypeCode = interfaceModel.getRespParamTypeCode();
+            if ("json".equals(respParamTypeCode)){
+                try {
+                    responseStr = JSONUtil.toJsonPrettyStr(responseStr);
+                } catch (JSONException e) {
+                    log.error("接口-[{}({})]-请求地址-[{}] - 返回值不是程序能解析的json字符串,请检查!", getCalcName(), getCalcCode(), url);
+                    throw new CalcException(calculateInstanceNumber, "返回值不是程序能解析的json字符串,请检查!");
+                }
+            }
+            // TODO 可继续增加其他类型
+            else
+            {
+                throw new RuntimeException("接口-目前只支持 json 返回报文");
+            }
+
+
 
             // 解密逻辑
             String decryptionLogic = interfaceModel.getDecryptionLogic();
@@ -258,14 +267,38 @@ public class InterfaceCalcUnit extends CalcUnit {
             }
 
             /*
-            responseStr 一定是如下结果,否则后期计算会报错
+            responseStr 一定是如下结果(键为字符串,值为数组的Json字符串),否则后期计算会报错
             {
                 "propA":[
-                ]
+                    {
+                        "propA1":"valueA1-1",
+                        "propA2":"valueA1-2",
+                        "propA3":"valueA1-3",
+                        ...
+                    },
+                    {
+                        "propA1":"valueA2-1",
+                        "propA2":"valueA2-2",
+                        "propA3":"valueA2-3",
+                    },
+                    ...
+                ],
+                "propB":[
+                    {
+                        "propB1":"valueB1-1",
+                        "propB2":"valueB1-2",
+                        "propB3":"valueB1-3",
+                        ...
+                    },
+                    {
+                        "propB1":"valueB2-1",
+                        "propB2":"valueB2-2",
+                        "propB3":"valueB2-3",
+                    },
+                    ...
+                ],
+                ...
             }
-
-
-
              */
             // 保存结果
             thisResult.put(getCalcCode(), responseStr);

+ 2 - 1
src/main/java/com/sundata/internalevaluation/calc/model/finals/CalcType.java

@@ -15,7 +15,8 @@ public enum CalcType {
     INPUTPARAM("输入参数"),
 
 
-    DATASOURCES("数据来源")
+    DATASOURCES("数据来源"),
+    RISKCTRLSTRATEGY("风控策略")
 
 
     ;

+ 23 - 0
src/main/java/com/sundata/internalevaluation/calc/util/CalcUtil.java

@@ -1,12 +1,16 @@
 package com.sundata.internalevaluation.calc.util;
 
 import cn.hutool.extra.spring.SpringUtil;
+import com.sundata.internalevaluation.calc.calcUnit.RiskControlStrategyCalcUnit;
 import com.sundata.internalevaluation.calc.calcUnit.RulesCalcUnit;
 import com.sundata.internalevaluation.calc.model.CalcException;
 import com.sundata.internalevaluation.calc.model.CalcUnit;
+import com.sundata.internalevaluation.calc.model.finals.CalcType;
 import com.sundata.internalevaluation.calc.running.CalcRunning;
 import com.sundata.internalevaluation.calc.running.threads.CalcTaskResult;
+import com.sundata.internalevaluation.configuration.model.RiskControlStrategyModel;
 import com.sundata.internalevaluation.configuration.model.RuleSet;
+import com.sundata.internalevaluation.configuration.service.RiskControlStrategyService;
 import com.sundata.internalevaluation.configuration.service.RuleService;
 import com.sundata.internalevaluation.configuration.service.RuleSetService;
 import org.apache.commons.lang3.StringUtils;
@@ -47,4 +51,23 @@ public class CalcUtil {
         System.out.println(calc);
         return calc;
     }
+
+    public static CalcTaskResult calcRiskCtrl(String calculateInstanceNumber, String riskCtrlNo, Map<String, Object> context) {
+        if (StringUtils.isBlank(riskCtrlNo)) {
+            throw new CalcException("数据集编号不能为空!!!");
+        }
+        RiskControlStrategyService riskControlStrategyService = SpringUtil.getBean(RiskControlStrategyService.class);
+
+
+        RiskControlStrategyModel model = new RiskControlStrategyModel();
+        model.setRiskControlStrategyNo(riskCtrlNo);
+        RiskControlStrategyModel rules = riskControlStrategyService.selectDetailData(model);
+
+        RiskControlStrategyCalcUnit calcUnit = new RiskControlStrategyCalcUnit(rules.getRiskControlStrategyNo(),rules.getRiskControlStrategyName(), CalcType.RISKCTRLSTRATEGY,Map.of(),rules);
+        CalcTaskResult calc = calc(calculateInstanceNumber, calcUnit, context);
+        System.out.println(calc);
+        return calc;
+    }
+
+
 }