Browse Source

处理总账勾稽的计算逻辑

CodeLife Leno 4 months ago
parent
commit
ef2e6384e1

+ 1 - 0
DBScript/张奇凯/001-DDL.sql

@@ -216,6 +216,7 @@ RULE_OUT VARCHAR(60) comment '输出',
 )COMMENT='表外项目分类认定规则表';
 
 -- 总账科目表
+DROP TABLE IF EXISTS rwa_cbs_gl_ac_subject;
 CREATE TABLE rwa_cbs_gl_ac_subject (
 sdate  varchar(8) NULL comment '开始日期',
 edate  varchar(8) NULL comment '结束日期',

+ 3 - 6
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/service/finals/CalcType.java

@@ -2,15 +2,12 @@ package com.sundata.product.rwa.calc.service.finals;
 
 public enum CalcType {
 
-    MAIN("计算任务"),STAGE("阶段"),DataImport("数据补录"),DataQuality("数据质量"),GeneralLedger("总账勾稽"),ProjectDivision("项目划分")
-    ,RiskExposure("风险暴露分类"),QualifiedSlowRelease("合格缓释认定"),SingleRWA("单笔债项RWA"),IntegratedRWA("法人RWA")
-    ,ReportInit("报表填报"),SQL("SQL任务")
-    ;
+    MAIN("计算任务"), STAGE("阶段"), DataImport("数据补录"), DataQuality("数据质量"), GeneralLedger("总账勾稽"),GeneralLedgerGetter("总账取数"), ProjectDivision("项目划分"), RiskExposure("风险暴露分类"), QualifiedSlowRelease("合格缓释认定"), SingleRWA("单笔债项RWA"), IntegratedRWA("法人RWA"), ReportInit("报表填报"), SQL("SQL任务");
 
-    private final String name ;
+    private final String name;
     private String id;
 
-    CalcType(String name){
+    CalcType(String name) {
         this.name = name;
     }
 

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

@@ -0,0 +1,136 @@
+package com.sundata.product.rwa.calc.service.implement.units;
+
+import cn.hutool.core.util.StrUtil;
+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.utils.FinalStrs;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.List;
+import java.util.Map;
+
+public class GeneralLedgerGetterUnit extends CalcUnit {
+    private static final Logger log = LoggerFactory.getLogger(GeneralLedgerGetterUnit.class);
+
+    /**
+     * 创建数据单元的绝对对象,对象必须包含如下参数
+     *
+     * @param calcCode    计算对象编号
+     * @param calcName    计算对象名称
+     * @param initContext 计算单元初始化参数
+     */
+    public GeneralLedgerGetterUnit(String calcCode, String calcName, int sequence, Map<String, Object> initContext) {
+        super(calcCode, calcName, CalcType.GeneralLedger, sequence, initContext);
+    }
+
+    @Override
+    public boolean isCalcFinished(String calculateInstanceNumber) {
+        boolean isHis = false;
+        boolean isMaster = false;
+        boolean isNow = false;
+        try {
+            isHis = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT" + FinalStrs._ALLHIS + " from CALCINDEX = '" + calculateInstanceNumber + "'")));
+            isMaster = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT" + FinalStrs._MASTER + " from CALCINDEX = '" + calculateInstanceNumber + "'")));
+            isNow = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT from CALCINDEX = '" + calculateInstanceNumber + "'")));
+        } catch (Exception e) {
+            log.warn("若首次运行,且没有进行初始化操作,MASTER 与 ALLHIS 表会自动创建,无需处理");
+            log.error(e.getMessage());
+        }
+        return isHis || isMaster || isNow;
+    }
+
+    @Override
+    public void initResultContext(String calculateInstanceNumber) {
+        log.info("本数据计算过程中如果已经出现结果,不会处理结果的数据,仅处理,原始数据已经保存至 RWA_APM_BUS_RS_ACCADJUSTMENT 等表,请根据实际情况查询");
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._ALLHIS + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._MASTER + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._ALLHIS + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._MASTER + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT where  CALCINDEX = '{}'", calculateInstanceNumber);
+    }
+
+    @Override
+    public List<CalcUnit> getSourceCalcUnits() {
+        return List.of();
+    }
+
+    @Override
+    public int getSequence() {
+        return 0;
+    }
+
+    @Override
+    public void afterCalc(Map<String, Object> context) {
+
+        // 计算之后,将数据复制到对应的 master与 allhis 表中
+
+    }
+
+    @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");
+        }
+
+        // 总账差异结果表
+        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) {
+        // 计算过程中,需要循环配置表并将每一个数据进行处理
+    }
+}

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

@@ -1,13 +1,21 @@
 package com.sundata.product.rwa.calc.service.implement.units;
 
+import cn.hutool.core.util.StrUtil;
+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.utils.FinalStrs;
+import com.sundata.product.rwa.calc.utils.UnitStaticFun;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.List;
 import java.util.Map;
 
 public class GeneralLedgerUnit extends CalcUnit {
+    private static final Logger log = LoggerFactory.getLogger(GeneralLedgerUnit.class);
+
     /**
      * 创建数据单元的绝对对象,对象必须包含如下参数
      *
@@ -15,18 +23,37 @@ public class GeneralLedgerUnit extends CalcUnit {
      * @param calcName    计算对象名称
      * @param initContext 计算单元初始化参数
      */
-    public GeneralLedgerUnit(String calcCode, String calcName , int sequence, Map<String, Object> initContext) {
-        super(calcCode, calcName, CalcType.GeneralLedger ,sequence, initContext);
+    public GeneralLedgerUnit(String calcCode, String calcName, int sequence, Map<String, Object> initContext) {
+        super(calcCode, calcName, CalcType.GeneralLedger, sequence, initContext);
     }
 
+
+
     @Override
     public boolean isCalcFinished(String calculateInstanceNumber) {
-        return false;
+        boolean isHis = false;
+        boolean isMaster = false;
+        boolean isNow = false;
+        try {
+            isHis = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT" + FinalStrs._ALLHIS + " from CALCINDEX = '" + calculateInstanceNumber + "'")));
+            isMaster = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT" + FinalStrs._MASTER + " from CALCINDEX = '" + calculateInstanceNumber + "'")));
+            isNow = !StrUtil.equals("0", (DBExecutor.doQuery("select count(1) as counts from RWA_LEART_INS_LEDGRESULT from CALCINDEX = '" + calculateInstanceNumber + "'")));
+        } catch (Exception e) {
+            log.warn("若首次运行,且没有进行初始化操作,MASTER 与 ALLHIS 表会自动创建,无需处理");
+            log.error(e.getMessage());
+        }
+        return isHis || isMaster || isNow;
     }
 
     @Override
     public void initResultContext(String calculateInstanceNumber) {
-
+        log.info("本数据计算过程中如果已经出现结果,不会处理结果的数据,仅处理,原始数据已经保存至 RWA_APM_BUS_RS_ACCADJUSTMENT 等表,请根据实际情况查询");
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._ALLHIS + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT" + FinalStrs._MASTER + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_ACCADJUSTMENT where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._ALLHIS + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT" + FinalStrs._MASTER + " where  CALCINDEX = '{}'", calculateInstanceNumber);
+        log.info("select * from RWA_APM_BUS_RS_LEDGRESULT where  CALCINDEX = '{}'", calculateInstanceNumber);
     }
 
     @Override
@@ -41,16 +68,33 @@ public class GeneralLedgerUnit extends CalcUnit {
 
     @Override
     public void afterCalc(Map<String, Object> context) {
-
+        // 计算之后,将数据复制到对应的 master与 allhis 表中
+        // 总分勾稽规则定义表
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_OBJ_CONF_GL_RECONCILIATION",this.getCalcUnitInstanceNumber());
+        // 差异容忍度规则定义
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_CALC_CONF_DIFFTOLERANCE",this.getCalcUnitInstanceNumber());
+        // 总账勾稽结果表
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_APM_BUS_RS_LEDGRESULT",this.getCalcUnitInstanceNumber());
+        // 总账差异结果表
+        UnitStaticFun.handleTableDataWithSuffixes("RWA_APM_BUS_RS_ACCADJUSTMENT",this.getCalcUnitInstanceNumber());
     }
 
     @Override
     public void beforeCalc(Map<String, Object> context) {
+        // 计算前 先确认表是否存在,不存在则创建表
+        // 总分勾稽规则定义表
+        UnitStaticFun.handleTableWithSuffixes("RWA_OBJ_CONF_GL_RECONCILIATION");
+        // 差异容忍度规则定义
+        UnitStaticFun.handleTableWithSuffixes("RWA_CALC_CONF_DIFFTOLERANCE");
+        // 总账勾稽结果表
+        UnitStaticFun.handleTableWithSuffixes("RWA_APM_BUS_RS_LEDGRESULT");
+        // 总账差异结果表
+        UnitStaticFun.handleTableWithSuffixes("RWA_APM_BUS_RS_ACCADJUSTMENT");
 
     }
 
     @Override
     public void calc(CalcResult<String, Object> thisResult, String calculateInstanceNumber, Map<String, Object> context, Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
-
+        // 计算过程中,需要循环配置表并将每一个数据进行处理
     }
 }

+ 6 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/utils/FinalStrs.java

@@ -0,0 +1,6 @@
+package com.sundata.product.rwa.calc.utils;
+
+public class FinalStrs {
+    public static final String _ALLHIS =  "_ALLHIS";
+    public static final String _MASTER = "_MASTER";
+}

+ 65 - 0
Procedure/backend/project/src/main/java/com/sundata/product/rwa/calc/utils/UnitStaticFun.java

@@ -0,0 +1,65 @@
+package com.sundata.product.rwa.calc.utils;
+
+import cn.hutool.core.util.StrUtil;
+import com.sundata.common.util.DBExecutor;
+
+public class UnitStaticFun {
+    private static final String[] SUFFIXES = {FinalStrs._ALLHIS, FinalStrs._MASTER};
+
+    /**
+     * 通用表处理方法
+     *
+     * @param baseTableName 目标表名称
+     */
+    public static void handleTableWithSuffixes(String baseTableName) {
+        for (String suffix : SUFFIXES) {
+            try {
+                String fullTableName = StrUtil.format("{}{}", baseTableName, suffix);
+                DBExecutor.doQuery(StrUtil.format("select 1 from {}", fullTableName));
+            } catch (Exception e) {
+                handleTableCreation(baseTableName, suffix);
+            }
+        }
+    }
+
+    /**
+     * 执行具体的表创建操作
+     *
+     * @param baseTableName 基础表名
+     * @param suffix        表后缀
+     */
+    public static void handleTableCreation(String baseTableName, String suffix) {
+        String targetTable = StrUtil.format("{}{}", baseTableName, suffix);
+        DBExecutor.doModify(StrUtil.format("drop table if exists {}", targetTable));
+        DBExecutor.doModify(StrUtil.format(
+                "create table {} as select * from {}",
+                targetTable,
+                baseTableName
+        ));
+    }
+
+    /**
+     * 根据计算单元编号与基础表名处理数据
+     *
+     * @param baseTableName           基础表名
+     * @param calculateInstanceNumber 计算单元编号
+     */
+    public static void handleTableDataWithSuffixes(String baseTableName, String calculateInstanceNumber) {
+        for (String suffix : SUFFIXES) {
+            handleTableDataInsertByCalcNum(baseTableName, suffix, calculateInstanceNumber);
+        }
+    }
+
+    /**
+     * 根据提供的计算单元编号 、基础表名以及表后缀完成计算数据的迁移
+     *
+     * @param baseTableName           基础表名
+     * @param suffix                  表后缀
+     * @param calculateInstanceNumber 计算单元编号
+     */
+    public static void handleTableDataInsertByCalcNum(String baseTableName, String suffix, String calculateInstanceNumber) {
+        String targetTable = StrUtil.format("{}{}", baseTableName, suffix);
+        DBExecutor.doModify(StrUtil.format("delete from {} where CALCINDEX = '{}'", targetTable, calculateInstanceNumber));
+        DBExecutor.doModify(StrUtil.format("insert into {} select * from {} where CALCINDEX = '{}'", targetTable, baseTableName, calculateInstanceNumber));
+    }
+}