|
@@ -1,7 +1,5 @@
|
|
|
package com.sundata.product.rwa.calc.service.implement.units;
|
|
|
|
|
|
-import cn.hutool.core.convert.NumberChineseFormatter;
|
|
|
-import cn.hutool.core.convert.NumberWordFormatter;
|
|
|
import cn.hutool.core.util.NumberUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
import cn.hutool.extra.spring.SpringUtil;
|
|
@@ -9,18 +7,24 @@ 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.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 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.math.MathContext;
|
|
|
import java.math.RoundingMode;
|
|
|
import java.text.DecimalFormat;
|
|
|
import java.util.HashMap;
|
|
@@ -106,20 +110,71 @@ public class GeneralLedgerUnit extends CalcUnit {
|
|
|
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);
|
|
|
+ sqlParam.addValue("ORGCODE", "000000");// TODO 找不到对应科目的法人机构号
|
|
|
+
|
|
|
RuleListService ruleListService = SpringUtil.getBean(RuleListService.class);
|
|
|
List<RuleListModel> ruleListModels = ruleListService.rule_list(new RuleListModel());
|
|
|
DiffconfigListService diffconfigListService = SpringUtil.getBean(DiffconfigListService.class);
|
|
|
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<>();
|
|
|
+ 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);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
for (DiffconfigListModel diffconfigListModel : diffconfigListModels) {
|
|
|
List<RuleListModel> ruleListModelList = diffconfigListService.rule_queryone2(diffconfigListModel.getRuleNo());
|
|
|
for (RuleListModel ruleListModel : ruleListModelList) {
|
|
|
subjectDiffConfig.put(ruleListModel.getGlCode(), diffconfigListModel);
|
|
|
}
|
|
|
}
|
|
|
- // TODO 需要获取容忍度处理逻辑,并将容忍度处理逻辑处理为一个基于科目编号的map,下面的处理过程中,根据实际容忍度处理结果
|
|
|
- // TODO 这两个表不存在 select * from RWA_LEART_INS_LEDGRESULT; select * from RWA_APM_BUS_RS_ACCADJUSTMENT;
|
|
|
+
|
|
|
for (RuleListModel ruleListModel : ruleListModels) {
|
|
|
|
|
|
String subjectSql = sub.replace(ruleListModel.getSubjectSql());
|
|
@@ -160,10 +215,19 @@ public class GeneralLedgerUnit extends CalcUnit {
|
|
|
}
|
|
|
|
|
|
DiffconfigListModel diffconfigListModel = subjectDiffConfig.get(ruleListModel.getGlCode());
|
|
|
- boolean isInDiff = true;
|
|
|
// BigDecimal differAmt = BigDecimal.ZERO; // 核对差异金额(万元)
|
|
|
BigDecimal differRate = differAmt.divide(subjectSumBigDecimal, 8, RoundingMode.HALF_UP); // 核对差异率%
|
|
|
+ if (differAmt.compareTo(BigDecimal.ZERO) == 0 && subjectSumBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ differRate = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ if (differAmt.compareTo(BigDecimal.ZERO) > 0 && subjectSumBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ differRate = BigDecimal.valueOf(999.99);
|
|
|
+ }
|
|
|
+ if (differAmt.compareTo(BigDecimal.ZERO) < 0 && subjectSumBigDecimal.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ differRate = BigDecimal.valueOf(-999.99);
|
|
|
+ }
|
|
|
String percThreshold = "[0.0-0.0]"; // 差异容忍度%
|
|
|
+ char isOutDiff = '0';
|
|
|
if (diffconfigListModel != null) {
|
|
|
// close - close
|
|
|
// close - open
|
|
@@ -181,8 +245,72 @@ public class GeneralLedgerUnit extends CalcUnit {
|
|
|
intervalType = StrUtil.replace(intervalType, "[open", "(");
|
|
|
String[] split = intervalType.split("-");
|
|
|
DecimalFormat df = new DecimalFormat("#,##0.00");
|
|
|
- percThreshold = split[0] + df.format(diffconfigListModel.getUpperLimit()) + "-" + df.format(diffconfigListModel.getLowerLimit()) + split[1];
|
|
|
+ /*
|
|
|
+ PERCTHRESHOLD 差异容忍度%
|
|
|
+ */
|
|
|
+ percThreshold = split[0] + " " + df.format(diffconfigListModel.getUpperLimit().doubleValue() * 100) + "% - " + df.format(diffconfigListModel.getLowerLimit().doubleValue() * 100) + "% " + split[1];
|
|
|
+
|
|
|
+ if (differRate.doubleValue() > diffconfigListModel.getLowerLimit().doubleValue() || differRate.doubleValue() < diffconfigListModel.getUpperLimit().doubleValue()) {
|
|
|
+ // 如果 差异率大于上限或小于下限
|
|
|
+ // 处理结果插入平账表中
|
|
|
+ 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)";
|
|
|
+ sqlParam.addValue("GL_CODE", ruleListModel.getRuleNo());
|
|
|
+ sqlParam.addValue("SUBJECT_DESC", subjectSum);
|
|
|
+ sqlParam.addValue("LOAN_REFERENCE_NO", "XNZX" + ruleListModel.getRuleNo());
|
|
|
+ sqlParam.addValue("BALANCE_ON", productSum);
|
|
|
+ sqlParam.addValue("BALANCE_OFF", isOutDiff);
|
|
|
+ sqlParam.addValue("RESERVE", percThreshold);
|
|
|
+ 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("SOFT_RULE_TYPE", "ACCOUNT");
|
|
|
+ sqlParam.addValue("SOFT_RULE_MAINID", ruleListModel.getRuleId());
|
|
|
+ sqlParam.addValue("SOFT_RULE_SUBID", "");
|
|
|
+
|
|
|
+
|
|
|
+ jdbcTemplate.update(insertAccadjustment, sqlParam);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+ sqlParam.addValue("RULE_ID", ruleListModel.getRuleNo());
|
|
|
+ sqlParam.addValue("RULE_NAME", ruleListModel.getRuleName());
|
|
|
+ sqlParam.addValue("SUBJCODE", ruleListModel.getGlCode());
|
|
|
+ sqlParam.addValue("SUBJNAME", ruleListModel.getSubjectDesc());
|
|
|
+ sqlParam.addValue("CCY", "CNY");
|
|
|
+ sqlParam.addValue("GLAMT", subjectSumBigDecimal);
|
|
|
+ sqlParam.addValue("LEDGARTAMT", productSumBigDecimal);
|
|
|
+ sqlParam.addValue("DIFFERAMT", differAmt);
|
|
|
+ sqlParam.addValue("DIFFERRATE", differRate);
|
|
|
+ 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) " +
|
|
|
+ "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);
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|