|
@@ -1,5 +1,7 @@
|
|
|
package xbc.formula.calcmgr.logic.impl;
|
|
|
|
|
|
+import java.lang.reflect.InvocationTargetException;
|
|
|
+import java.lang.reflect.Method;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.sql.Timestamp;
|
|
|
import java.util.ArrayList;
|
|
@@ -14,15 +16,22 @@ import org.springframework.stereotype.Component;
|
|
|
|
|
|
import xbc.formula.calcmgr.dao.CalcIndicatorResultDao;
|
|
|
import xbc.formula.calcmgr.dao.CalcResultDao;
|
|
|
+import xbc.formula.calcmgr.dao.CalcRuleResultDao;
|
|
|
+import xbc.formula.calcmgr.dao.CalcRuleResultParamDao;
|
|
|
import xbc.formula.calcmgr.dao.entity.CalcIndicatorResult;
|
|
|
import xbc.formula.calcmgr.dao.entity.CalcResult;
|
|
|
+import xbc.formula.calcmgr.dao.entity.CalcRuleResult;
|
|
|
+import xbc.formula.calcmgr.dao.entity.CalcRuleResultParam;
|
|
|
import xbc.formula.calcmgr.logic.CalcNoManagerLogic;
|
|
|
import xbc.formula.calcmgr.logic.SaveResultLogic;
|
|
|
import xbc.formula.calcmgr.vo.CalcNoVo;
|
|
|
import xbc.formula.calcmgr.vo.CalculateRequestVo;
|
|
|
import xbc.formula.calcmgr.vo.CalculateResponseVo;
|
|
|
+import xbc.formula.engine.exp.vo.XbcExpRuleParamVo;
|
|
|
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
|
|
|
import xbc.formula.engine.fml.vo.XbcFmlFormulaIndicatorVo;
|
|
|
import xbc.formula.engine.fml.vo.XbcFmlFormulaVo;
|
|
|
+import xbc.formula.framework.exception.FormulaException;
|
|
|
|
|
|
@Component
|
|
|
public class SaveResultLogicImpl implements SaveResultLogic {
|
|
@@ -36,8 +45,14 @@ public class SaveResultLogicImpl implements SaveResultLogic {
|
|
|
@Autowired
|
|
|
private CalcIndicatorResultDao calcIndicatorResultDao;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private CalcRuleResultDao calcRuleResultDao;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CalcRuleResultParamDao calcRuleResultParamDao;
|
|
|
+
|
|
|
@Override
|
|
|
- public void saveResult(CalculateRequestVo requestVo, CalculateResponseVo responseVo, XbcFmlFormulaVo fv) {
|
|
|
+ public void saveResult(CalculateRequestVo requestVo, CalculateResponseVo responseVo, List<XbcExpRuleVo> ruleVos, XbcFmlFormulaVo fv) {
|
|
|
if(!requestVo.isSaveResult()) {
|
|
|
responseVo.setCalcResultId(0);
|
|
|
return;
|
|
@@ -52,7 +67,7 @@ public class SaveResultLogicImpl implements SaveResultLogic {
|
|
|
riv.pos = 1;
|
|
|
retrieveIndicators(fv, 0, "", riv);
|
|
|
|
|
|
- CalcNoVo cnv = calcNoManagerLogic.getResultId(thistime, riv.cirs.size());
|
|
|
+ CalcNoVo cnv = calcNoManagerLogic.getResultId(thistime, riv.cirs.size(), ruleVos == null ? 0 : ruleVos.size());
|
|
|
long formulaResultId = cnv.getFormulaNo() + 1;
|
|
|
cr.setKeyId(formulaResultId);
|
|
|
if(riv.cirs.size() > 0) {
|
|
@@ -65,7 +80,45 @@ public class SaveResultLogicImpl implements SaveResultLogic {
|
|
|
cir.setParentId(pid + baseIndicatorId);
|
|
|
}
|
|
|
}
|
|
|
- saveIndicators(riv.cirs);
|
|
|
+ saveBatch(calcIndicatorResultDao, riv.cirs);
|
|
|
+ }
|
|
|
+ if(ruleVos != null && ruleVos.size() > 0) {
|
|
|
+ long baseRuleId = cnv.getRuleNo();
|
|
|
+ List<CalcRuleResult> crrvs = new ArrayList<>();
|
|
|
+ List<CalcRuleResultParam> crrps = new ArrayList<>();
|
|
|
+ for(int k = 0;k < ruleVos.size();k ++) {
|
|
|
+ XbcExpRuleVo rv = ruleVos.get(k);
|
|
|
+ CalcRuleResult crrv = new CalcRuleResult();
|
|
|
+ long ruleResultId = baseRuleId + k + 1;
|
|
|
+ crrv.setKeyId(ruleResultId);
|
|
|
+ crrv.setCalcResultId(formulaResultId);
|
|
|
+ crrv.setRuleType(rv.getType() == null ? "" : rv.getType());
|
|
|
+ crrv.setRuleName(rv.getName() == null ? "" : rv.getName());
|
|
|
+ crrv.setBizIdCode(rv.getBizIdCode() == null ? "" : rv.getBizIdCode());
|
|
|
+ crrv.setDisplayOrder(rv.getDisplayOrder());
|
|
|
+ crrv.setCalcResult(objToString(rv.getValue()));
|
|
|
+ crrv.setRuleDesc(rv.getDesc() == null ? "" : rv.getDesc());
|
|
|
+ crrv.setComment(rv.getComment() == null ? "" : rv.getComment());
|
|
|
+ crrv.setCreateTime(thistime);
|
|
|
+ crrvs.add(crrv);
|
|
|
+ List<XbcExpRuleParamVo> rpvs = rv.getRpvs();
|
|
|
+ if(rpvs != null && rpvs.size() > 0) {
|
|
|
+ for(int j = 0;j < rpvs.size();j ++) {
|
|
|
+ XbcExpRuleParamVo rpv = rpvs.get(j);
|
|
|
+ CalcRuleResultParam crrp = new CalcRuleResultParam();
|
|
|
+ crrp.setRuleResultId(ruleResultId);
|
|
|
+ crrp.setDisplayOrder(j + 1);
|
|
|
+ crrp.setParamName(rpv.getPname());
|
|
|
+ crrp.setParamValue(objToString(rpv.getValue()));
|
|
|
+ crrp.setCreateTime(thistime);
|
|
|
+ crrps.add(crrp);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ saveBatch(calcRuleResultDao, crrvs);
|
|
|
+ if(crrps.size() > 0) {
|
|
|
+ saveBatch(calcRuleResultParamDao, crrps);
|
|
|
+ }
|
|
|
}
|
|
|
calcResultDao.save(cr);
|
|
|
responseVo.setCalcResultId(formulaResultId);
|
|
@@ -80,26 +133,44 @@ public class SaveResultLogicImpl implements SaveResultLogic {
|
|
|
|
|
|
private static final int SAVE_SIZE_ONCE = 100;
|
|
|
|
|
|
- private void saveIndicators(List<CalcIndicatorResult> cirs) {
|
|
|
- if(cirs.size() <= SAVE_SIZE_ONCE) {
|
|
|
- calcIndicatorResultDao.saveBatch(cirs);
|
|
|
+ private void invokeDaoMethod(Object dao, List<?> pos, Method method) {
|
|
|
+ try {
|
|
|
+ method.invoke(dao, pos);
|
|
|
+ } catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
|
|
|
+ throw new FormulaException(e, "执行数据库批量保存出错。");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void saveBatch(Object dao, List<?> pos) {
|
|
|
+ Method method = null;
|
|
|
+ Method[] ms = dao.getClass().getDeclaredMethods();
|
|
|
+ for(Method m : ms) {
|
|
|
+ if(m.getName().equals("saveBatch")) {
|
|
|
+ method = m;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(method == null) {
|
|
|
+ throw new FormulaException("系统异常。"); // 不会出现这种情况
|
|
|
+ }
|
|
|
+ if(pos.size() <= SAVE_SIZE_ONCE) {
|
|
|
+ invokeDaoMethod(dao, pos, method);
|
|
|
return;
|
|
|
}
|
|
|
- List<CalcIndicatorResult> list = new ArrayList<>(SAVE_SIZE_ONCE);
|
|
|
- for(int k = 0;k < cirs.size();k ++) {
|
|
|
+ List<Object> list = new ArrayList<>(SAVE_SIZE_ONCE);
|
|
|
+ for(int k = 0;k < pos.size();k ++) {
|
|
|
if(k > 0 && (k % SAVE_SIZE_ONCE == 0)) {
|
|
|
- System.out.println("save, list.size: " + list.size());
|
|
|
- calcIndicatorResultDao.saveBatch(list);
|
|
|
+ invokeDaoMethod(dao, list, method);
|
|
|
list.clear();
|
|
|
}
|
|
|
- list.add(cirs.get(k));
|
|
|
+ Object ov = pos.get(k);
|
|
|
+ list.add(ov);
|
|
|
}
|
|
|
if(list.size() > 0) {
|
|
|
- System.out.println("save, list.size: " + list.size());
|
|
|
- calcIndicatorResultDao.saveBatch(list);
|
|
|
+ invokeDaoMethod(dao, list, method);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
private void retrieveIndicators(XbcFmlFormulaVo fv, long parentId, String baseNodeCode, RetrieveIndicatorVo riv) {
|
|
|
if(riv.savedFvSet.contains(fv.getFormulaCode())) {
|
|
|
return;
|