Bladeren bron

完成总账勾稽与总账取数的处理逻辑。

CodeLife Leno 1 maand geleden
bovenliggende
commit
7c3f46bbf8

+ 42 - 1
DBScript/李庚谱/001-DDL.sql

@@ -814,4 +814,45 @@ create table RWA_APM_BUS_RS_ACCADJUSTMENT
     SOFT_RULE_SUBID               VARCHAR(60) not null comment '规则次编号-为空',
 
     primary key (CALCINDEX, GL_CODE, LOAN_REFERENCE_NO)
-) comment '总账差异结果表';
+) comment '总账差异结果表';
+
+
+
+drop table if exists RWA_APM_BUS_RS_LEDGERGENERAL;
+create table RWA_APM_BUS_RS_LEDGERGENERAL
+(
+    CALCINDEX                     VARCHAR(60) comment '计算实例号',
+    SDATE                         VARCHAR(8) comment '起始数据日期',
+    EDATE                         VARCHAR(8) comment '截止数据日期',
+    TERM                          VARCHAR(8) comment '年月',
+    DATA_DATE                     VARCHAR(8) comment '数据日期',
+    LOAN_REFERENCE_NO             VARCHAR(60) comment '债项编号',
+    ONOROFF                       VARCHAR(60) comment '表内外标识',
+    SUBJECT_CODES                 VARCHAR(60) comment '科目代码',
+    SUBJECT_NAMES                 VARCHAR(60) comment '科目名称',
+    BALANCE                       DECIMAL(30, 6) comment '资产余额',
+    CURRENCY                      VARCHAR(60) comment '币种代码',
+    LEDGER_OFFOBJECT_NO           VARCHAR(60) comment '表外项目代码',
+    LEDGER_OFFOBJECT_NAME         VARCHAR(60) comment '表外项目名称',
+    CCF                           DECIMAL(30, 6) comment 'CCF 表外项目信用转化系数',
+    RISK_EXPOSURE_LEV01_CODE      VARCHAR(60) comment '一级风险暴露分类代码',
+    RISK_EXPOSURE_LEV01_CODE_NAME VARCHAR(60) comment '一级风险暴露分类名称',
+    RISK_EXPOSURE_LEV02_CODE      VARCHAR(60) comment '二级风险暴露分类代码',
+    RISK_EXPOSURE_LEV02_CODE_NAME VARCHAR(60) comment '二级风险暴露分类名称',
+    RISK_EXPOSURE_LEV03_CODE      VARCHAR(60) comment '三级风险暴露分类代码',
+    RISK_EXPOSURE_LEV03_CODE_NAME VARCHAR(60) comment '三级风险暴露分类名称',
+    RISK_EXPOSURE_LEV04_CODE      VARCHAR(60) comment '四级风险暴露分类代码',
+    RISK_EXPOSURE_LEV04_CODE_NAME VARCHAR(60) comment '四级风险暴露分类名称',
+    RISK_EXPOSURE_CODE            VARCHAR(60) comment '风险暴露分类认定代码',
+    RISK_EXPOSURE_NAME            VARCHAR(60) comment '风险暴露分类认定名称',
+    LOAN_WEIGHT                   DECIMAL(30, 6) comment '债项风险权重',
+    EAD                           DECIMAL(30, 6) comment '缓释前风险暴露',
+    RWA                           DECIMAL(30, 6) comment '风险加权资产',
+    CUST_NAME                     VARCHAR(60) comment '客户名称',
+    CUST_NO                       VARCHAR(60) comment '客户号',
+    INVEST_INDUSTRY               VARCHAR(60) comment '行业名称',
+    BUSINESS_LINE                 VARCHAR(60) comment '业务条线',
+    EFF_DATE                      VARCHAR(60) comment '生效日',
+    DUE_DATE                      VARCHAR(60) comment '到期日',
+    primary key (CALCINDEX, LOAN_REFERENCE_NO, SUBJECT_CODES)
+) comment '总账科目计量结果表';

+ 60 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/controllers/CalcRunningController.java

@@ -0,0 +1,60 @@
+package com.sundata.product.rwa.calc.controllers;
+
+import com.sundata.common.annotation.Auth;
+import com.sundata.product.rwa.calc.model.CalcInterfaceParam;
+import com.sundata.product.rwa.calc.running.threads.CalcTaskResult;
+import com.sundata.product.rwa.calc.service.CalcRunningService;
+import com.sundata.product.rwa.calc.service.implement.units.GeneralLedgerGetterUnit;
+import com.sundata.product.rwa.calc.service.implement.units.GeneralLedgerUnit;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Controller
+@RequestMapping("calc/start")
+public class CalcRunningController {
+
+    private final CalcRunningService calcRunningService;
+
+    public CalcRunningController(CalcRunningService calcRunningService) {
+        this.calcRunningService = calcRunningService;
+    }
+
+    /**
+     * 启动总账取数
+     *
+     * @param calcInterfaceParam 报文参数结构 { "calculateInstanceNumber": "xxx" , "calcCode":"xxx" ,"dataDate":"2025-03-07"  }
+     *                           dataDate; 内容为必须
+     * @return 运行结果
+     */
+    @Auth(
+            verifyLogin = false,
+            verifyURL = false
+    )
+    @RequestMapping("GeneralLedgerGetter")
+    public CalcTaskResult startGeneralLedgerGetter(CalcInterfaceParam calcInterfaceParam) {
+        Map<String, Object> context = new HashMap<>();
+        context.put("dataDate", calcInterfaceParam.getDataDate());
+        return calcRunningService.startCalc(calcInterfaceParam.getCalculateInstanceNumber(), new GeneralLedgerGetterUnit(calcInterfaceParam.getCalculateInstanceNumber(), calcInterfaceParam.getCalcCode(), 0, null), context);
+    }
+
+    /**
+     * 启动总账勾稽
+     *
+     * @param calcInterfaceParam 报文参数结构 { "calculateInstanceNumber": "xxx" , "calcCode":"xxx" ,"dataDate":"2025-03-07"  }
+     *                           dataDate; 内容为必须
+     * @return 运行结果
+     */
+    @Auth(
+            verifyLogin = false,
+            verifyURL = false
+    )
+    @RequestMapping("GeneralLedger")
+    public CalcTaskResult startGeneralLedger(CalcInterfaceParam calcInterfaceParam) {
+        Map<String, Object> context = new HashMap<>();
+        context.put("dataDate", calcInterfaceParam.getDataDate());
+        return calcRunningService.startCalc(calcInterfaceParam.getCalculateInstanceNumber(), new GeneralLedgerUnit(calcInterfaceParam.getCalculateInstanceNumber(), calcInterfaceParam.getCalcCode(), 0, null), context);
+    }
+}

+ 39 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/model/CalcInterfaceParam.java

@@ -0,0 +1,39 @@
+package com.sundata.product.rwa.calc.model;
+
+import com.sundata.product.rwa.calc.service.CalcUnit;
+
+import java.util.Map;
+
+public class CalcInterfaceParam {
+    private String calculateInstanceNumber;
+    private String calcCode;
+
+    private String dataDate;
+
+
+
+    public String getCalculateInstanceNumber() {
+        return calculateInstanceNumber;
+    }
+
+    public void setCalculateInstanceNumber(String calculateInstanceNumber) {
+        this.calculateInstanceNumber = calculateInstanceNumber;
+    }
+
+    public String getCalcCode() {
+        return calcCode;
+    }
+
+    public void setCalcCode(String calcCode) {
+        this.calcCode = calcCode;
+    }
+
+    public String getDataDate() {
+        return dataDate;
+    }
+
+    public void setDataDate(String dataDate) {
+        this.dataDate = dataDate;
+    }
+
+}

+ 7 - 7
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/running/CalcRunning.java → Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/CalcRunningService.java

@@ -1,4 +1,4 @@
-package com.sundata.product.rwa.calc.running;
+package com.sundata.product.rwa.calc.service;
 
 import cn.hutool.core.date.format.FastDateFormat;
 import cn.hutool.core.lang.UUID;
@@ -8,15 +8,13 @@ import com.sundata.product.rwa.calc.running.threads.CalcRecursiveTask;
 import com.sundata.product.rwa.calc.running.threads.CalcTaskResult;
 import com.sundata.product.rwa.calc.running.threads.CalcUnitThreadFactory;
 import com.sundata.product.rwa.calc.running.threads.fianl.CalcTaskResultType;
-import com.sundata.product.rwa.calc.service.CalcException;
-import com.sundata.product.rwa.calc.service.CalcResult;
-import com.sundata.product.rwa.calc.service.CalcUnit;
 import com.sundata.product.rwa.calc.utils.DateChecker;
 import org.jgrapht.Graph;
 import org.jgrapht.graph.DefaultDirectedGraph;
 import org.jgrapht.graph.DefaultEdge;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
 
 import java.util.Calendar;
 import java.util.HashMap;
@@ -26,15 +24,16 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentSkipListSet;
 import java.util.concurrent.ForkJoinPool;
 
-public class CalcRunning {
-    private static final Logger log = LoggerFactory.getLogger(CalcRunning.class);
+@Service
+public class CalcRunningService {
+    private static final Logger log = LoggerFactory.getLogger(CalcRunningService.class);
 
     private static final ConcurrentSkipListSet<String> runningList = new ConcurrentSkipListSet<>();
 
     public CalcTaskResult startCalc(String calculateInstanceNumber, CalcUnit calcUnit, Map<String, Object> context) {
 
         // 处理基础参数,在实际情况中可能需要修改
-        context.put("CALCINDEX", calculateInstanceNumber);
+
         if (!context.containsKey("dataDate")) {
             String dataDate = (String) context.get("dataDate");
             DateChecker.isSimpleDateFormat(dataDate);
@@ -61,6 +60,7 @@ public class CalcRunning {
         if (StrUtil.isEmpty(calculateInstanceNumber)) {
             calculateInstanceNumber = UUID.randomUUID(Boolean.TRUE).toString(Boolean.TRUE);
         }
+        context.put("CALCINDEX", calculateInstanceNumber);
         Map<String, Object> resultMap = new HashMap<>();
         resultMap.put("calculateInstanceNumber",calculateInstanceNumber);
         CalcTaskResult result = new CalcTaskResult(CalcTaskResultType.SUCCESS, "200", "计算成功!", resultMap);

+ 1 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/CalcUnit.java

@@ -211,7 +211,7 @@ public abstract class CalcUnit implements Calc, Serializable, Comparator<CalcUni
      * @return 计算单元流水号 通常由 计算流水号 + 计算单元类型 + 计算单元名称组成
      */
     public String getCalcUnitInstanceNumber() {
-        return calculateInstanceNumber + "-" + calcType + "-" + calcName;
+        return calculateInstanceNumber;
     }
 
     /**

+ 1 - 4
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/implement/CalcTaskService.java

@@ -2,10 +2,7 @@ package com.sundata.product.rwa.calc.service.implement;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
-import cn.hutool.core.util.ReUtil;
-import cn.hutool.core.util.StrUtil;
 import com.sundata.admin.nounmanage.service.NounManageService;
-import com.sundata.product.rwa.calc.running.CalcRunning;
 import com.sundata.product.rwa.calc.utils.DateChecker;
 import com.sundata.product.rwa.rwacalcconfig004rwa.model.MeteringManageModel;
 import com.sundata.product.rwa.rwacalcconfig004rwa.service.MeteringManageService;
@@ -102,7 +99,7 @@ public class CalcTaskService {
      */
     private void executeOneMetering(MeteringManageModel meteringManageModel, String dateStr) {
 
-//        new CalcRunning().startCalc(null,);
+//        new CalcRunningService().startCalc(null,);
     }
 
 

+ 197 - 53
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/implement/units/GeneralLedgerGetterUnit.java

@@ -1,14 +1,29 @@
 package com.sundata.product.rwa.calc.service.implement.units;
 
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.spring.SpringUtil;
 import com.sundata.common.util.DBExecutor;
 import com.sundata.product.rwa.calc.service.CalcResult;
 import com.sundata.product.rwa.calc.service.CalcUnit;
 import com.sundata.product.rwa.calc.service.finals.CalcType;
+import com.sundata.product.rwa.calc.service.implement.extend.UpperMapRowMapper;
+import com.sundata.product.rwa.calc.utils.DateChecker;
 import com.sundata.product.rwa.calc.utils.FinalStrs;
+import com.sundata.product.rwa.calc.utils.UnitStaticFun;
+import com.sundata.product.rwa.rwaCalcConfig002offbalanceprotype.model.InfoListModel;
+import com.sundata.product.rwa.rwacalcconfig001riskexposure.model.RiskExposureDefinitionModel;
+import com.sundata.product.rwa.util.DataUtil;
+import com.sundata.product.rwa.util.LevelUtil;
+import org.apache.commons.text.StringSubstitutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.core.JdbcTemplate;
+import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
 
+import javax.sql.DataSource;
+import java.math.BigDecimal;
+import java.util.Calendar;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -67,70 +82,199 @@ public class GeneralLedgerGetterUnit extends CalcUnit {
     public void afterCalc(Map<String, Object> context) {
 
         // 计算之后,将数据复制到对应的 master与 allhis 表中
-
+        // 总账取数定义
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_CALC_CONF_LEDGERCONFIG", this.getCalcUnitInstanceNumber());
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_APM_BUS_RS_LEDGERGENERAL", this.getCalcUnitInstanceNumber());
     }
 
     @Override
     public void beforeCalc(Map<String, Object> context) {
         // 计算前 先确认表是否存在,不存在则创建表
-        // 基础配置表
-        try {
-            DBExecutor.doQuery("select 1 from RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._ALLHIS);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._ALLHIS);
-            DBExecutor.doModify("create table RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._ALLHIS + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
-        try {
-            DBExecutor.doQuery("select 1 from RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._MASTER);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._MASTER);
-            DBExecutor.doModify("create table RWA_OBJ_CONF_GL_RECONCILIATION" + FinalStrs._MASTER + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
-        // 差异容忍度配置
-        try {
-            DBExecutor.doQuery("select 1 from RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._ALLHIS);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._ALLHIS);
-            DBExecutor.doModify("create table RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._ALLHIS + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
-        try {
-            DBExecutor.doQuery("select 1 from RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._MASTER);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._MASTER);
-            DBExecutor.doModify("create table RWA_CALC_CONF_DIFFTOLERANCE" + FinalStrs._MASTER + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
 
-        // 总账勾稽结果表
-        try {
-            DBExecutor.doQuery("select 1 from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._ALLHIS);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._ALLHIS);
-            DBExecutor.doModify("create table RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._ALLHIS + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
-        try {
-            DBExecutor.doQuery("select 1 from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._MASTER);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._MASTER);
-            DBExecutor.doModify("create table RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._MASTER + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
+        // 总账取数定义
+        UnitStaticFun.handleTableWithSuffixes("RWA_CALC_CONF_LEDGERCONFIG");
+        UnitStaticFun.handleTableWithSuffixes("RWA_APM_BUS_RS_LEDGERGENERAL");
+
 
-        // 总账差异结果表
-        try {
-            DBExecutor.doQuery("select 1 from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._ALLHIS);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._ALLHIS);
-            DBExecutor.doModify("create table RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._ALLHIS + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
-        try {
-            DBExecutor.doQuery("select 1 from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._MASTER);
-        } catch (Exception e) {
-            DBExecutor.doModify("drop table if exists RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._MASTER);
-            DBExecutor.doModify("create table RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._MASTER + " as select * from RWA_OBJ_CONF_GL_RECONCILIATION");
-        }
     }
 
     @Override
     public void calc(CalcResult<String, Object> thisResult, String calculateInstanceNumber, Map<String, Object> context, Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
         // 计算过程中,需要循环配置表并将每一个数据进行处理
+        StringSubstitutor sub = new StringSubstitutor(context);
+        JdbcTemplate jdbcTemplate = SpringUtil.getBean(JdbcTemplate.class);
+        if (jdbcTemplate == null) {
+            jdbcTemplate = new JdbcTemplate(SpringUtil.getBean(DataSource.class));
+        }
+        MapSqlParameterSource sqlParam = new MapSqlParameterSource(context);
+
+        // 初始化 表外项目划分
+        List<Map<String, Object>> offObjectTypes = jdbcTemplate.query("select CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, OFFOBJECT_NO, OFFOBJECT_NAME, OFFOBJECT_STAGE_ID, OFFOBJECT_INDEX, DEFAULT_OUT, OFFOBJECT_SUPER, ISMINI, CCF, RISK_EXPOSE_CLASS_CODE, YESORNO from RWA_CALC_CONF_OFFBALANCEPROTYPE", new UpperMapRowMapper());
+        Map<String, InfoListModel> infoListModel = new HashMap<>();
+        for (Map<String, Object> offObjectType : offObjectTypes) {
+            InfoListModel model = new InfoListModel();
+            model.setCalcindex((String) DataUtil.getDataDefault(offObjectType.get("CALCINDEX"), String.class));
+            model.setSdate((String) DataUtil.getDataDefault(offObjectType.get("SDATE"), String.class));
+            model.setEdate((String) DataUtil.getDataDefault(offObjectType.get("EDATE"), String.class));
+            model.setTerm((String) DataUtil.getDataDefault(offObjectType.get("TERM"), String.class));
+            model.setDataDate((String) DataUtil.getDataDefault(offObjectType.get("DATA_DATE"), String.class));
+            model.setOffobjectNo((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_NO"), String.class));
+            model.setOffobjectName((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_NAME"), String.class));
+            model.setOffobjectStageId((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_STAGE_ID"), String.class));
+            model.setOffobjectIndex((BigDecimal) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_INDEX"), BigDecimal.class));
+            model.setDefaultOut((String) DataUtil.getDataDefault(offObjectType.get("DEFAULT_OUT"), String.class));
+            model.setOffobjectSuper((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_SUPER"), String.class));
+            model.setIsmini((String) DataUtil.getDataDefault(offObjectType.get("ISMINI"), String.class));
+            model.setCcf((BigDecimal) DataUtil.getDataDefault(offObjectType.get("CCF"), BigDecimal.class));
+            model.setRiskExposeClassCode((String) DataUtil.getDataDefault(offObjectType.get("RISK_EXPOSE_CLASS_CODE"), String.class));
+            model.setYesorno((String) DataUtil.getDataDefault(offObjectType.get("YESORNO"), String.class));
+            infoListModel.put(model.getOffobjectNo(), model);
+        }
+        // 初始化 风险暴露分类
+        List<Map<String, Object>> riskTypeList = jdbcTemplate.query("select CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, RISKEXPOSURE_NO, RISKEXPOSURE_NAME,RISKEXPOSURE_STAGE_ID, DEFAULT_OUT, RISKEXPOSURE_INDEX, RISKEXPOSURE_SUPER,RISKEXPOSURE_ISMINI, RISKEXPOSURE_WEIGHT, RISKEXPOSURE_STATE from RWA_CALC_CONF_RISKEXPOSURE", new UpperMapRowMapper());
+        Map<String, RiskExposureDefinitionModel> riskExposureDefinitionModelMap = new HashMap<>();
+        for (Map<String, Object> riskType : riskTypeList) {
+            RiskExposureDefinitionModel model = new RiskExposureDefinitionModel();
+            model.setCalcIndex((String) DataUtil.getDataDefault(riskType.get("CALCINDEX"), String.class));
+            model.setStartDate((String) DataUtil.getDataDefault(riskType.get("SDATE"), String.class));
+            model.setEndDate((String) DataUtil.getDataDefault(riskType.get("EDATE"), String.class));
+            model.setTerm((String) DataUtil.getDataDefault(riskType.get("TERM"), String.class));
+            model.setDataDate((String) DataUtil.getDataDefault(riskType.get("DATA_DATE"), String.class));
+            model.setRiskExposureNo((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_NO"), String.class));
+            model.setRiskExposureName((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_NAME"), String.class));
+            model.setRiskExposureStageId((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_STAGE_ID"), String.class));
+            model.setDefaultOut((String) DataUtil.getDataDefault(riskType.get("DEFAULT_OUT"), String.class));
+            model.setRiskExposureIndex((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_INDEX"), String.class));
+            model.setRiskExposureSuper((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_SUPER"), String.class));
+            model.setRiskExposureIsmini((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_ISMINI"), String.class));
+            model.setRiskExposureWeight((BigDecimal) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_WEIGHT"), BigDecimal.class));
+            model.setRiskExposureState((String) DataUtil.getDataDefault(riskType.get("RISKEXPOSURE_STATE"), String.class));
+            riskExposureDefinitionModelMap.put(model.getRiskExposureNo(), model);
+        }
+
+
+        // 总账取数定义
+        List<Map<String, Object>> ledgerConfigs = jdbcTemplate.query("select CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, RULE_NO, RULE_NAME, SUBJECT_CODES,SUBJECT_NAMES, ACCOUNTING_DIRECTION, CALC_MODE, ONOROFF, GETDATA_MODE,RESULT_TYPE, LEDGER_RISKEXPOSURE_NO, LEDGER_OFFOBJECT_NO, LEDGER_STAGE_ID,LEDGER_GETDATA_RULE, LEDGER_STATE from RWA_CALC_CONF_LEDGERCONFIG", new UpperMapRowMapper());
+
+        for (int i = 0; i < ledgerConfigs.size(); i++) {
+
+            Map<String, Object> map = ledgerConfigs.get(i);
+
+            String LEDGER_GETDATA_RULE_SQL = sub.replace((String) DataUtil.getDataDefault(map.get("LEDGER_GETDATA_RULE"), String.class));
+            String BALANCE_Str = DBExecutor.doQuery(LEDGER_GETDATA_RULE_SQL);
+
+            String CALCINDEX = this.getCalcUnitInstanceNumber();
+            String SDATE = context.get("SDATE").toString();
+            String EDATE = context.get("EDATE").toString();
+            String TERM = context.get("TERM").toString();
+            String DATA_DATE = context.get("DATA_DATE").toString();
+            String LOAN_REFERENCE_NO = "ZZQS" + DataUtil.getDataDefault(map.get("SUBJECT_CODES"), String.class);
+            String ONOROFF = (String) DataUtil.getDataDefault(map.get("ONOROFF"), String.class);
+            String SUBJECT_CODES = (String) DataUtil.getDataDefault(map.get("SUBJECT_CODES"), String.class);
+            String SUBJECT_NAMES = (String) DataUtil.getDataDefault(map.get("SUBJECT_NAMES"), String.class);
+            BigDecimal BALANCE = (BigDecimal) DataUtil.getDataDefault(BALANCE_Str, BigDecimal.class);
+            String CURRENCY = "CNY";
+            String LEDGER_OFFOBJECT_NO = (String) DataUtil.getDataDefault(map.get("LEDGER_OFFOBJECT_NO"), String.class);
+            String LEDGER_OFFOBJECT_NAME = (String) DataUtil.getDataDefault(infoListModel.get(LEDGER_OFFOBJECT_NO).getOffobjectName(), String.class);
+            BigDecimal CCF = infoListModel.get(LEDGER_OFFOBJECT_NO).getCcf();
+            String RISK_EXPOSURE_LEV01_CODE = "";
+            String RISK_EXPOSURE_LEV01_CODE_NAME = "";
+            String RISK_EXPOSURE_LEV02_CODE = "";
+            String RISK_EXPOSURE_LEV02_CODE_NAME = "";
+            String RISK_EXPOSURE_LEV03_CODE = "";
+            String RISK_EXPOSURE_LEV03_CODE_NAME = "";
+            String RISK_EXPOSURE_LEV04_CODE = "";
+            String RISK_EXPOSURE_LEV04_CODE_NAME = "";
+
+            String ledgerRiskexposureNo = (String) DataUtil.getDataDefault(map.get("LEDGER_RISKEXPOSURE_NO"), String.class);
+            if (map != null && !ledgerRiskexposureNo.contains("00")) {
+                RISK_EXPOSURE_LEV04_CODE = ledgerRiskexposureNo;
+                RISK_EXPOSURE_LEV04_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV04_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV03_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 1, "00");
+                RISK_EXPOSURE_LEV03_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV03_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 2, "00");
+                RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 3, "00");
+                RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+            }
+            if (map != null && ledgerRiskexposureNo.indexOf("00") == 7) {
+                RISK_EXPOSURE_LEV03_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 1, "00");
+                RISK_EXPOSURE_LEV03_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV03_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 2, "00");
+                RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 3, "00");
+                RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+            }
+            if (map != null && ledgerRiskexposureNo.indexOf("00") == 5) {
+                RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 2, "00");
+                RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 3, "00");
+                RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+            }
+            if (map != null && ledgerRiskexposureNo.indexOf("00") == 3) {
+
+                RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(ledgerRiskexposureNo, 3, "00");
+                RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+            }
+            String RISK_EXPOSURE_CODE = (String) DataUtil.getDataDefault(map.get("LEDGER_OFFOBJECT_NO"), String.class);
+            String RISK_EXPOSURE_NAME = (String) DataUtil.getDataDefault(infoListModel.get((String) DataUtil.getDataDefault(map.get("LEDGER_OFFOBJECT_NO"), String.class)), String.class);
+
+            BigDecimal LOAN_WEIGHT = (BigDecimal) DataUtil.getDataDefault(riskExposureDefinitionModelMap.get(ledgerRiskexposureNo).getRiskExposureWeight(), BigDecimal.class);
+            ;
+            BigDecimal EAD = BALANCE;
+            if (map.get("RESULT_TYPE") != null && !map.get("RESULT_TYPE").equals("3")) {
+                EAD = BigDecimal.ZERO.subtract(BALANCE);
+            } else if (map.get("RESULT_TYPE") != null && !map.get("RESULT_TYPE").equals("2")) {
+                EAD = BALANCE.multiply(CCF);
+            }
+            BigDecimal RWA = EAD.multiply(LOAN_WEIGHT);
+            String CUST_NAME = "总账取数客户" + SUBJECT_CODES;
+            String CUST_NO = "ZZQSKH" + SUBJECT_CODES;
+            String INVEST_INDUSTRY = "其他";
+            String BUSINESS_LINE = "其他-总账取数债项";
+            String dateStr = (String) context.get("DATA_DATE");
+            String EFF_DATE = dateStr.substring(dateStr.lastIndexOf("-") + 1) + "01";
+            String DUE_DATE = dateStr.substring(dateStr.lastIndexOf("-") + 1) + (DateChecker.getSimpleCalendar(dateStr)).getActualMaximum(Calendar.DAY_OF_MONTH);
+
+            sqlParam.addValue("CALCINDEX", CALCINDEX);
+            sqlParam.addValue("SDATE", SDATE);
+            sqlParam.addValue("EDATE", EDATE);
+            sqlParam.addValue("TERM", TERM);
+            sqlParam.addValue("DATA_DATE", DATA_DATE);
+            sqlParam.addValue("LOAN_REFERENCE_NO", LOAN_REFERENCE_NO);
+            sqlParam.addValue("ONOROFF", ONOROFF);
+            sqlParam.addValue("SUBJECT_CODES", SUBJECT_CODES);
+            sqlParam.addValue("SUBJECT_NAMES", SUBJECT_NAMES);
+            sqlParam.addValue("BALANCE", BALANCE);
+            sqlParam.addValue("CURRENCY", CURRENCY);
+            sqlParam.addValue("LEDGER_OFFOBJECT_NO", LEDGER_OFFOBJECT_NO);
+            sqlParam.addValue("LEDGER_OFFOBJECT_NAME", LEDGER_OFFOBJECT_NAME);
+            sqlParam.addValue("CCF", CCF);
+            sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE", RISK_EXPOSURE_LEV01_CODE);
+            sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE_NAME", RISK_EXPOSURE_LEV01_CODE_NAME);
+            sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE", RISK_EXPOSURE_LEV02_CODE);
+            sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE_NAME", RISK_EXPOSURE_LEV02_CODE_NAME);
+            sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE", RISK_EXPOSURE_LEV03_CODE);
+            sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE_NAME", RISK_EXPOSURE_LEV03_CODE_NAME);
+            sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE", RISK_EXPOSURE_LEV04_CODE);
+            sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE_NAME", RISK_EXPOSURE_LEV04_CODE_NAME);
+            sqlParam.addValue("RISK_EXPOSURE_CODE", RISK_EXPOSURE_CODE);
+            sqlParam.addValue("RISK_EXPOSURE_NAME", RISK_EXPOSURE_NAME);
+            sqlParam.addValue("LOAN_WEIGHT", LOAN_WEIGHT);
+            sqlParam.addValue("EAD", EAD);
+            sqlParam.addValue("RWA", RWA);
+            sqlParam.addValue("CUST_NAME", CUST_NAME);
+            sqlParam.addValue("CUST_NO", CUST_NO);
+            sqlParam.addValue("INVEST_INDUSTRY", INVEST_INDUSTRY);
+            sqlParam.addValue("BUSINESS_LINE", BUSINESS_LINE);
+            sqlParam.addValue("EFF_DATE", EFF_DATE);
+            sqlParam.addValue("DUE_DATE", DUE_DATE);
+
+            String sql = "insert into rwa_apm_bus_rs_ledgergeneral (CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, LOAN_REFERENCE_NO, ONOROFF, SUBJECT_CODES, SUBJECT_NAMES, BALANCE, CURRENCY, LEDGER_OFFOBJECT_NO, LEDGER_OFFOBJECT_NAME, CCF, RISK_EXPOSURE_LEV01_CODE, RISK_EXPOSURE_LEV01_CODE_NAME, RISK_EXPOSURE_LEV02_CODE, RISK_EXPOSURE_LEV02_CODE_NAME, RISK_EXPOSURE_LEV03_CODE, RISK_EXPOSURE_LEV03_CODE_NAME, RISK_EXPOSURE_LEV04_CODE, RISK_EXPOSURE_LEV04_CODE_NAME, RISK_EXPOSURE_CODE, RISK_EXPOSURE_NAME, LOAN_WEIGHT, EAD, RWA, CUST_NAME, CUST_NO, INVEST_INDUSTRY, BUSINESS_LINE, EFF_DATE, DUE_DATE)values (:CALCINDEX, :SDATE, :EDATE, :TERM, :DATA_DATE, :LOAN_REFERENCE_NO, :ONOROFF,:SUBJECT_CODES, :SUBJECT_NAMES, :BALANCE, :CURRENCY, :LEDGER_OFFOBJECT_NO,:LEDGER_OFFOBJECT_NAME, :CCF, :RISK_EXPOSURE_LEV01_CODE,:RISK_EXPOSURE_LEV01_CODE_NAME, :RISK_EXPOSURE_LEV02_CODE,:RISK_EXPOSURE_LEV02_CODE_NAME, :RISK_EXPOSURE_LEV03_CODE,:RISK_EXPOSURE_LEV03_CODE_NAME, :RISK_EXPOSURE_LEV04_CODE,:RISK_EXPOSURE_LEV04_CODE_NAME, :RISK_EXPOSURE_CODE, :RISK_EXPOSURE_NAME,:LOAN_WEIGHT, :EAD, :RWA, :CUST_NAME, :CUST_NO, :INVEST_INDUSTRY, :BUSINESS_LINE,:EFF_DATE, :DUE_DATE)";
+
+            jdbcTemplate.update(sql, sqlParam);
+        }
+
+
     }
 }

+ 110 - 58
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/implement/units/GeneralLedgerUnit.java

@@ -8,15 +8,16 @@ import com.sundata.product.rwa.calc.service.CalcResult;
 import com.sundata.product.rwa.calc.service.CalcUnit;
 import com.sundata.product.rwa.calc.service.finals.CalcType;
 import com.sundata.product.rwa.calc.service.implement.extend.UpperMapRowMapper;
+import com.sundata.product.rwa.calc.utils.DateChecker;
 import com.sundata.product.rwa.calc.utils.FinalStrs;
 import com.sundata.product.rwa.calc.utils.UnitStaticFun;
 import com.sundata.product.rwa.resultList.model.DiffconfigListModel;
 import com.sundata.product.rwa.resultList.model.RuleListModel;
 import com.sundata.product.rwa.resultList.service.DiffconfigListService;
 import com.sundata.product.rwa.resultList.service.RuleListService;
-import com.sundata.product.rwa.rwaCalcConfig002offbalanceprotype.model.InfoListModel;
 import com.sundata.product.rwa.rwacalcconfig001riskexposure.model.RiskExposureDefinitionModel;
 import com.sundata.product.rwa.util.DataUtil;
+import com.sundata.product.rwa.util.LevelUtil;
 import org.apache.commons.text.StringSubstitutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -27,6 +28,7 @@ import javax.sql.DataSource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
+import java.util.Calendar;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -115,6 +117,17 @@ public class GeneralLedgerUnit extends CalcUnit {
             jdbcTemplate = new JdbcTemplate(SpringUtil.getBean(DataSource.class));
         }
         MapSqlParameterSource sqlParam = new MapSqlParameterSource(context);
+        String CALCINDEX = calculateInstanceNumber;
+        String SDATE = context.get("SDATE").toString();
+        String EDATE = context.get("EDATE").toString();
+        String TERM = context.get("TERM").toString();
+        String DATA_DATE = context.get("DATA_DATE").toString();
+
+        sqlParam.addValue("CALCINDEX", CALCINDEX);
+        sqlParam.addValue("SDATE", SDATE);
+        sqlParam.addValue("EDATE", EDATE);
+        sqlParam.addValue("TERM", TERM);
+        sqlParam.addValue("DATA_DATE", DATA_DATE);
         sqlParam.addValue("ORGCODE", "000000");// TODO 找不到对应科目的法人机构号
 
         RuleListService ruleListService = SpringUtil.getBean(RuleListService.class);
@@ -123,28 +136,6 @@ public class GeneralLedgerUnit extends CalcUnit {
         List<DiffconfigListModel> diffconfigListModels = diffconfigListService.rule_querylist(new DiffconfigListModel());
         Map<String, DiffconfigListModel> subjectDiffConfig = new HashMap<>();
 
-        // 初始化 表外项目划分
-        List<Map<String, Object>> offObjectTypes = jdbcTemplate.query("select CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, OFFOBJECT_NO, OFFOBJECT_NAME, OFFOBJECT_STAGE_ID, OFFOBJECT_INDEX, DEFAULT_OUT, OFFOBJECT_SUPER, ISMINI, CCF, RISK_EXPOSE_CLASS_CODE, YESORNO from RWA_CALC_CONF_OFFBALANCEPROTYPE", new UpperMapRowMapper());
-        Map<String, InfoListModel> infoListModel = new HashMap<>();
-        for (Map<String, Object> offObjectType : offObjectTypes) {
-            InfoListModel model = new InfoListModel();
-            model.setCalcindex((String) DataUtil.getDataDefault(offObjectType.get("CALCINDEX"), String.class));
-            model.setSdate((String) DataUtil.getDataDefault(offObjectType.get("SDATE"), String.class));
-            model.setEdate((String) DataUtil.getDataDefault(offObjectType.get("EDATE"), String.class));
-            model.setTerm((String) DataUtil.getDataDefault(offObjectType.get("TERM"), String.class));
-            model.setDataDate((String) DataUtil.getDataDefault(offObjectType.get("DATA_DATE"), String.class));
-            model.setOffobjectNo((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_NO"), String.class));
-            model.setOffobjectName((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_NAME"), String.class));
-            model.setOffobjectStageId((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_STAGE_ID"), String.class));
-            model.setOffobjectIndex((BigDecimal) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_INDEX"), BigDecimal.class));
-            model.setDefaultOut((String) DataUtil.getDataDefault(offObjectType.get("DEFAULT_OUT"), String.class));
-            model.setOffobjectSuper((String) DataUtil.getDataDefault(offObjectType.get("OFFOBJECT_SUPER"), String.class));
-            model.setIsmini((String) DataUtil.getDataDefault(offObjectType.get("ISMINI"), String.class));
-            model.setCcf((BigDecimal) DataUtil.getDataDefault(offObjectType.get("CCF"), BigDecimal.class));
-            model.setRiskExposeClassCode((String) DataUtil.getDataDefault(offObjectType.get("RISK_EXPOSE_CLASS_CODE"), String.class));
-            model.setYesorno((String) DataUtil.getDataDefault(offObjectType.get("YESORNO"), String.class));
-            infoListModel.put(model.getOffobjectNo(), model);
-        }
         // 初始化 风险暴露分类
         List<Map<String, Object>> riskTypeList = jdbcTemplate.query("select CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, RISKEXPOSURE_NO, RISKEXPOSURE_NAME,RISKEXPOSURE_STAGE_ID, DEFAULT_OUT, RISKEXPOSURE_INDEX, RISKEXPOSURE_SUPER,RISKEXPOSURE_ISMINI, RISKEXPOSURE_WEIGHT, RISKEXPOSURE_STATE from RWA_CALC_CONF_RISKEXPOSURE", new UpperMapRowMapper());
         Map<String, RiskExposureDefinitionModel> riskExposureDefinitionModelMap = new HashMap<>();
@@ -190,11 +181,28 @@ public class GeneralLedgerUnit extends CalcUnit {
             BigDecimal subjectSumBigDecimal = new BigDecimal(subjectSum); // 总账汇总金额(万元)
             BigDecimal productSumBigDecimal = new BigDecimal(productSum); // 勾稽汇总金额(万元)
             BigDecimal differAmt = subjectSumBigDecimal.subtract(productSumBigDecimal);// 取 总账-勾稽明细 // 核对差异金额 不是万元
-
-
+            BigDecimal on = BigDecimal.ZERO; // 本期余额
+            BigDecimal off = BigDecimal.ZERO;// 转换前资产
+            BigDecimal o = BigDecimal.ZERO;// 计提准备金
+            if (ruleListModel.getOnoroff() != null && !ruleListModel.getOnoroff().equals("ON")) {
+                on = differAmt;
+                if ("04".equals(ruleListModel.getSubjectNature())) {
+                    o = differAmt;
+                    differAmt = BigDecimal.ZERO.subtract(differAmt);
+                }
+            } else if (ruleListModel.getOnoroff() != null && ruleListModel.getOnoroff().equals("OFF")) {
+                off = differAmt;
+                if ("04".equals(ruleListModel.getSubjectNature())) {
+                    o = differAmt;
+                    differAmt = BigDecimal.ZERO.subtract(differAmt);
+                }
+            } else {
+                log.warn("{} 表内外标识 is NULL", ruleListModel);
+            }
 //            String
-            String riskType = null;
-            String offProjectType = null;
+            String riskType = "";// 风险暴露类别划分
+            String offProjectType = "";// 表外项目分类
+
 //            private String calcMethod;   //计算方式
 //            private String positiveRiskType;   //正差异风险暴露分类
 //            private String negativeRiskType;   //负差异风险暴露分类
@@ -213,7 +221,8 @@ public class GeneralLedgerUnit extends CalcUnit {
                 riskType = "";
                 offProjectType = "";
             }
-
+            // 债项风险权重
+            BigDecimal RISKEXPOSURE_WEIGHT = (BigDecimal) DataUtil.getDataDefault(riskExposureDefinitionModelMap.get(riskType).getRiskExposureWeight(), BigDecimal.class);
             DiffconfigListModel diffconfigListModel = subjectDiffConfig.get(ruleListModel.getGlCode());
 //            BigDecimal differAmt = BigDecimal.ZERO; // 核对差异金额(万元)
             BigDecimal differRate = differAmt.divide(subjectSumBigDecimal, 8, RoundingMode.HALF_UP); // 核对差异率%
@@ -255,40 +264,84 @@ public class GeneralLedgerUnit extends CalcUnit {
                     // 处理结果插入平账表中
                     isOutDiff = '1';
                     String insertAccadjustment = "insert into rwa_apm_bus_rs_accadjustment (CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, GL_CODE, SUBJECT_DESC,LOAN_REFERENCE_NO, BALANCE_ON, BALANCE_OFF, RESERVE, CURRENCY,RISK_EXPOSURE_LEV01_CODE, RISK_EXPOSURE_LEV01_CODE_NAME,RISK_EXPOSURE_LEV02_CODE, RISK_EXPOSURE_LEV02_CODE_NAME,RISK_EXPOSURE_LEV03_CODE, RISK_EXPOSURE_LEV03_CODE_NAME,RISK_EXPOSURE_LEV04_CODE, RISK_EXPOSURE_LEV04_CODE_NAME, RISK_RESULT,LOAN_WEIGHT, COVERAGE_RISK, COVERAGE_RWA, UNFINISH_EAD, UNFINISH_RWA, RWA,CUST_NAME, CUST_NO, BP_CUST_NO, INVEST_INDUSTRY, BUSINESS_LINE, EFF_DATE,DUE_DATE, SOFT_RULE_TYPE, SOFT_RULE_MAINID, SOFT_RULE_SUBID) " +
-                            "values (:CALCINDEX, :SDATE, :EDATE, :TERM, :DATA_DATE, :GL_CODE, :SUBJECT_DESC, :LOAN_REFERENCE_NO, :BALANCE_ON,:BALANCE_OFF, :RESERVE, :CURRENCY, :RISK_EXPOSURE_LEV01_CODE, :RISK_EXPOSURE_LEV01_CODE_NAME,:RISK_EXPOSURE_LEV02_CODE, :RISK_EXPOSURE_LEV02_CODE_NAME, :RISK_EXPOSURE_LEV03_CODE,:RISK_EXPOSURE_LEV03_CODE_NAME, :RISK_EXPOSURE_LEV04_CODE, :RISK_EXPOSURE_LEV04_CODE_NAME, :RISK_RESULT,:LOAN_WEIGHT, :COVERAGE_RISK, :COVERAGE_RWA, :UNFINISH_EAD, :UNFINISH_RWA, :RWA, :CUST_NAME, :CUST_NO,:BP_CUST_NO, :INVEST_INDUSTRY, :BUSINESS_LINE, :EFF_DATE, :DUE_DATE, :SOFT_RULE_TYPE, :SOFT_RULE_MAINID,:SOFT_RULE_SUBID)";
+                            "values (:CALCINDEX, :SDATE, :EDATE, :TERM, :DATA_DATE, :GL_CODE, :SUBJECT_DESC, :LOAN_REFERENCE_NO, :BALANCE_ON,:BALANCE_OFF, :RESERVE, :CURRENCY, :RISK_EXPOSURE_LEV01_CODE, :RISK_EXPOSURE_LEV01_CODE_NAME, :RISK_EXPOSURE_LEV02_CODE, :RISK_EXPOSURE_LEV02_CODE_NAME, :RISK_EXPOSURE_LEV03_CODE,:RISK_EXPOSURE_LEV03_CODE_NAME, :RISK_EXPOSURE_LEV04_CODE, :RISK_EXPOSURE_LEV04_CODE_NAME, :RISK_RESULT,:LOAN_WEIGHT, :COVERAGE_RISK, :COVERAGE_RWA, :UNFINISH_EAD, :UNFINISH_RWA, :RWA, :CUST_NAME, :CUST_NO,:BP_CUST_NO, :INVEST_INDUSTRY, :BUSINESS_LINE, :EFF_DATE, :DUE_DATE, :SOFT_RULE_TYPE, :SOFT_RULE_MAINID,:SOFT_RULE_SUBID)";
+
+//                    riskType
+                    RiskExposureDefinitionModel riskModel = riskExposureDefinitionModelMap.get(riskType);
+                    String RISK_EXPOSURE_LEV01_CODE = "";
+                    String RISK_EXPOSURE_LEV01_CODE_NAME = "";
+                    String RISK_EXPOSURE_LEV02_CODE = "";
+                    String RISK_EXPOSURE_LEV02_CODE_NAME = "";
+                    String RISK_EXPOSURE_LEV03_CODE = "";
+                    String RISK_EXPOSURE_LEV03_CODE_NAME = "";
+                    String RISK_EXPOSURE_LEV04_CODE = "";
+                    String RISK_EXPOSURE_LEV04_CODE_NAME = "";
+                    if (riskModel != null && !riskModel.getRiskExposureNo().contains("00")) {
+                        RISK_EXPOSURE_LEV04_CODE = riskModel.getRiskExposureNo();
+                        RISK_EXPOSURE_LEV04_CODE_NAME = riskModel.getRiskExposureName();
+                        RISK_EXPOSURE_LEV03_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 1, "00");
+                        RISK_EXPOSURE_LEV03_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV03_CODE).getRiskExposureName();
+                        RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 2, "00");
+                        RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                        RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 3, "00");
+                        RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+                    }
+                    if (riskModel != null && riskModel.getRiskExposureNo().indexOf("00") == 7) {
+                        RISK_EXPOSURE_LEV03_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 1, "00");
+                        RISK_EXPOSURE_LEV03_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV03_CODE).getRiskExposureName();
+                        RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 2, "00");
+                        RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                        RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 3, "00");
+                        RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+                    }
+                    if (riskModel != null && riskModel.getRiskExposureNo().indexOf("00") == 5) {
+                        RISK_EXPOSURE_LEV02_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 2, "00");
+                        RISK_EXPOSURE_LEV02_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV02_CODE).getRiskExposureName();
+                        RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 3, "00");
+                        RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+                    }
+                    if (riskModel != null && riskModel.getRiskExposureNo().indexOf("00") == 3) {
+
+                        RISK_EXPOSURE_LEV01_CODE = LevelUtil.subAndAdd(riskModel.getRiskExposureNo(), 3, "00");
+                        RISK_EXPOSURE_LEV01_CODE_NAME = riskExposureDefinitionModelMap.get(RISK_EXPOSURE_LEV01_CODE).getRiskExposureName();
+                    }
+
+                    String dateStr = (String) context.get("DATA_DATE");
+                    String eff_date = dateStr.substring(dateStr.lastIndexOf("-") + 1) + "01";
+                    String due_date = dateStr.substring(dateStr.lastIndexOf("-") + 1) + (DateChecker.getSimpleCalendar(dateStr)).getActualMaximum(Calendar.DAY_OF_MONTH);
+
                     sqlParam.addValue("GL_CODE", ruleListModel.getRuleNo());
-                    sqlParam.addValue("SUBJECT_DESC", subjectSum);
+                    sqlParam.addValue("SUBJECT_DESC", ruleListModel.getSubjectDesc());
                     sqlParam.addValue("LOAN_REFERENCE_NO", "XNZX" + ruleListModel.getRuleNo());
-                    sqlParam.addValue("BALANCE_ON", productSum);
-                    sqlParam.addValue("BALANCE_OFF", isOutDiff);
-                    sqlParam.addValue("RESERVE", percThreshold);
+                    sqlParam.addValue("BALANCE_ON", on);
+                    sqlParam.addValue("BALANCE_OFF", off);
+                    sqlParam.addValue("RESERVE", o);
                     sqlParam.addValue("CURRENCY", "CNY");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE_NAME", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE_NAME", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE_NAME", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE", "");
-                    sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE_NAME", "");
-                    sqlParam.addValue("RISK_RESULT", "");
-                    sqlParam.addValue("LOAN_WEIGHT", "");
-                    sqlParam.addValue("COVERAGE_RISK", "");
-                    sqlParam.addValue("COVERAGE_RWA", "");
-                    sqlParam.addValue("UNFINISH_EAD", "");
-                    sqlParam.addValue("UNFINISH_RWA", "");
-                    sqlParam.addValue("RWA", "");
-                    sqlParam.addValue("CUST_NAME", "");
-                    sqlParam.addValue("CUST_NO", "");
-                    sqlParam.addValue("BP_CUST_NO", "");
-                    sqlParam.addValue("INVEST_INDUSTRY", "");
-                    sqlParam.addValue("BUSINESS_LINE", "");
-                    sqlParam.addValue("EFF_DATE", "");
+                    sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE", RISK_EXPOSURE_LEV01_CODE);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV01_CODE_NAME", RISK_EXPOSURE_LEV01_CODE_NAME);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE", RISK_EXPOSURE_LEV02_CODE);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV02_CODE_NAME", RISK_EXPOSURE_LEV02_CODE_NAME);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE", RISK_EXPOSURE_LEV03_CODE);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV03_CODE_NAME", RISK_EXPOSURE_LEV03_CODE_NAME);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE", RISK_EXPOSURE_LEV04_CODE);
+                    sqlParam.addValue("RISK_EXPOSURE_LEV04_CODE_NAME", RISK_EXPOSURE_LEV04_CODE_NAME);
+                    sqlParam.addValue("RISK_RESULT", riskType);
+                    sqlParam.addValue("LOAN_WEIGHT", RISKEXPOSURE_WEIGHT);
+                    sqlParam.addValue("COVERAGE_RISK", 0);
+                    sqlParam.addValue("COVERAGE_RWA", 0);
+                    sqlParam.addValue("UNFINISH_EAD", differAmt);
+                    sqlParam.addValue("UNFINISH_RWA", differAmt.multiply(RISKEXPOSURE_WEIGHT));
+                    sqlParam.addValue("RWA", differAmt.multiply(RISKEXPOSURE_WEIGHT));
+                    sqlParam.addValue("CUST_NAME", "虚拟客户" + ruleListModel.getRuleNo());
+                    sqlParam.addValue("CUST_NO", "XNKH" + ruleListModel.getRuleNo());
+                    sqlParam.addValue("BP_CUST_NO", "其他");
+                    sqlParam.addValue("INVEST_INDUSTRY", "其他");
+                    sqlParam.addValue("BUSINESS_LINE", "其他");
+                    sqlParam.addValue("EFF_DATE", eff_date);
+                    sqlParam.addValue("DUE_DATE", due_date);
                     sqlParam.addValue("SOFT_RULE_TYPE", "ACCOUNT");
                     sqlParam.addValue("SOFT_RULE_MAINID", ruleListModel.getRuleId());
                     sqlParam.addValue("SOFT_RULE_SUBID", "");
-
-
                     jdbcTemplate.update(insertAccadjustment, sqlParam);
                 }
             }
@@ -306,8 +359,7 @@ public class GeneralLedgerUnit extends CalcUnit {
             sqlParam.addValue("PERCTHRESHOLD", percThreshold);
             sqlParam.addValue("LEARTRESULTTYPE", isOutDiff);
             sqlParam.addValue("OFFSETDIFFERAMT", differRate);
-            String insertLedgresult = "insert into rwa_leart_ins_ledgresult (CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, ORGCODE, RULE_ID, RULE_NAME, SUBJCODE, SUBJNAME, CCY, GLAMT, LEDGARTAMT" +
-                    ", DIFFERAMT, DIFFERRATE, PERCTHRESHOLD, LEARTRESULTTYPE, OFFSETDIFFERAMT) " +
+            String insertLedgresult = "insert into rwa_leart_ins_ledgresult (CALCINDEX, SDATE, EDATE, TERM, DATA_DATE, ORGCODE, RULE_ID, RULE_NAME, SUBJCODE, SUBJNAME, CCY, GLAMT, LEDGARTAMT, DIFFERAMT, DIFFERRATE, PERCTHRESHOLD, LEARTRESULTTYPE, OFFSETDIFFERAMT) " +
                     "values (:CALCINDEX, :SDATE, :EDATE, :TERM, :DATA_DATE, :ORGCODE, :RULE_ID, :RULE_NAME, :SUBJCODE, :SUBJNAME, :CCY, :GLAMT, :LEDGARTAMT, :DIFFERAMT, :DIFFERRATE, :PERCTHRESHOLD, :LEARTRESULTTYPE, :OFFSETDIFFERAMT)";
             jdbcTemplate.update(insertLedgresult, sqlParam);
 

+ 1 - 1
Procedure/backend/project/src/main/java/com/sundata/product/rwa/rwacalcconfig001riskexposure/mybatis/InfoMapper.xml

@@ -10,7 +10,7 @@
         RISKEXPOSURE_SUPER    as parentid,
         RISKEXPOSURE_STATE    as attributes
         from RWA_CALC_CONF_RISKEXPOSURE
-        order by nvl(RISKEXPOSURE_SUPER,0),RISKEXPOSURE_NO
+        order by IFNULL(RISKEXPOSURE_SUPER,0),RISKEXPOSURE_NO
     </select>
 
     <!-- 定义维护页面展示 -->

+ 15 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/util/LevelUtil.java

@@ -0,0 +1,15 @@
+package com.sundata.product.rwa.util;
+
+public class LevelUtil {
+    public static String subAndAdd(String source,int level,String init){
+        if(level==0){
+            return source;
+        }
+        if(level*init.length()>source.length()){
+            return source;
+        }
+        String finalStr = init.repeat(level);
+        return source.substring(0,source.length()-level*init.length())+ finalStr;
+    }
+
+}

+ 1 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/util/TreeData.java

@@ -75,6 +75,7 @@ public class TreeData<T> {
         if (children == null && getChildrenFunction != null) {
             children = getChildrenFunction.apply(object);
             if (level == 0) {
+                level++;
                 for (T child : children) {
                     TreeData<T> childTreeData = new TreeData<T>(child, level, getChildrenFunction, getParentFunction);
                     childrenMap.put(child, childTreeData.getChildrenFunction.apply(child));