Browse Source

增加规则注解

leichangchun 1 year ago
parent
commit
49c1e477f9
25 changed files with 641 additions and 51 deletions
  1. 17 4
      src/engine/java/xbc/formula/engine/exp/XbcExpCalculator.java
  2. 1 0
      src/engine/java/xbc/formula/engine/exp/datatype/XbcExpExpOpKind.java
  3. 4 1
      src/engine/java/xbc/formula/engine/exp/datatype/XbcExpExpTree.java
  4. 2 0
      src/engine/java/xbc/formula/engine/exp/datatype/XbcExpToken.java
  5. 60 1
      src/engine/java/xbc/formula/engine/exp/exec/XbcExpCalculateExp.java
  6. 70 0
      src/engine/java/xbc/formula/engine/exp/parser/XbcExpParser.java
  7. 55 11
      src/engine/java/xbc/formula/engine/exp/scanner/XbcExpScanner.java
  8. 25 0
      src/engine/java/xbc/formula/engine/exp/vo/XbcExpRuleParamVo.java
  9. 62 0
      src/engine/java/xbc/formula/engine/exp/vo/XbcExpRuleVo.java
  10. 16 6
      src/engine/java/xbc/formula/engine/fml/XbcFmlCalculator.java
  11. 13 0
      src/main/java/xbc/formula/calcmgr/dao/CalcRuleResultDao.java
  12. 13 0
      src/main/java/xbc/formula/calcmgr/dao/CalcRuleResultParamDao.java
  13. 76 0
      src/main/java/xbc/formula/calcmgr/dao/entity/CalcRuleResult.java
  14. 41 0
      src/main/java/xbc/formula/calcmgr/dao/entity/CalcRuleResultParam.java
  15. 1 1
      src/main/java/xbc/formula/calcmgr/logic/CalcNoManagerLogic.java
  16. 4 1
      src/main/java/xbc/formula/calcmgr/logic/SaveResultLogic.java
  17. 5 2
      src/main/java/xbc/formula/calcmgr/logic/impl/CalcNoManagerLogicImpl.java
  18. 7 2
      src/main/java/xbc/formula/calcmgr/logic/impl/CalculateManagerLogicImpl.java
  19. 85 14
      src/main/java/xbc/formula/calcmgr/logic/impl/SaveResultLogicImpl.java
  20. 7 0
      src/main/java/xbc/formula/calcmgr/vo/CalcNoVo.java
  21. 3 1
      src/main/resources/mapper/CalcNoManagerMapper.xml
  22. 21 0
      src/main/resources/mapper/CalcRuleResultMapper.xml
  23. 16 0
      src/main/resources/mapper/CalcRuleResultParamMapper.xml
  24. 11 5
      table/reset_ddl_pg.txt
  25. 26 2
      table/table_dml_pg.txt

+ 17 - 4
src/engine/java/xbc/formula/engine/exp/XbcExpCalculator.java

@@ -11,6 +11,7 @@ import xbc.formula.engine.exp.datatype.XbcExpExpTree;
 import xbc.formula.engine.exp.exception.XbcExpParamException;
 import xbc.formula.engine.exp.exec.XbcExpCalculateExp;
 import xbc.formula.engine.exp.parser.XbcExpParser;
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
 import xbc.formula.engine.exp.vo.XbcExpCalculatorReturnVo;
 import xbc.formula.engine.exp.vo.XbcExpDrawnInfoVo;
 import xbc.formula.engine.exp.vo.XbcExpResultVo;
@@ -68,6 +69,10 @@ public class XbcExpCalculator {
 		return calculate(DEFAULT_BAOLIU_WEISHU, DEFAULT_ROUND_MODE, expStr, paramMap, formulaParams);
 	}
 	
+	public static Object calculate(String expStr, Map<String, Object> paramMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
+		return calculate(DEFAULT_BAOLIU_WEISHU, DEFAULT_ROUND_MODE, expStr, paramMap, ruleVos, formulaParams);
+	}
+	
 	/**
 	 * 给定参数,计算表达式的值
 	 * @param weishu 保留的小数位数
@@ -78,8 +83,12 @@ public class XbcExpCalculator {
 	 * @return 表达式的计算结果
 	 */
 	public static Object calculate(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, Object[] formulaParams) {
+		return calculate(weishu, roundMode, expStr, paramMap, null, formulaParams);
+	}
+	
+	public static Object calculate(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		Map<String, XbcExpResultVo> piMap = new HashMap<>();
-		return calculateExp(weishu, roundMode, expStr, paramMap, piMap, formulaParams);
+		return calculateExp(weishu, roundMode, expStr, paramMap, piMap, ruleVos, formulaParams);
 	}
 	
 	public static XbcExpCalculatorReturnVo calculateEx(String expStr, Map<String, Object> paramMap, Object[] formulaParams) {
@@ -87,8 +96,12 @@ public class XbcExpCalculator {
 	}
 
 	public static XbcExpCalculatorReturnVo calculateEx(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, Object[] formulaParams) {
+		return calculateEx(weishu, roundMode, expStr, paramMap, null, formulaParams);
+	}
+
+	public static XbcExpCalculatorReturnVo calculateEx(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		Map<String, XbcExpResultVo> piMap = new HashMap<>();
-		Object retObj = calculateExp(weishu, roundMode, expStr, paramMap, piMap, formulaParams);
+		Object retObj = calculateExp(weishu, roundMode, expStr, paramMap, piMap, ruleVos, formulaParams);
 		XbcExpCalculatorReturnVo crv = new XbcExpCalculatorReturnVo();
 		crv.setResult(retObj);
 		Map<String, Object> retParamMap = new HashMap<>();
@@ -100,7 +113,7 @@ public class XbcExpCalculator {
 		return crv;
 	}
 
-	private static Object calculateExp(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, Map<String, XbcExpResultVo> piMap, Object[] formulaParams) {
+	private static Object calculateExp(int weishu, RoundingMode roundMode, String expStr, Map<String, Object> paramMap, Map<String, XbcExpResultVo> piMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		if(expStr == null) {
 			throw new XbcExpParamException("请传入一个表达式。");
 		}
@@ -131,7 +144,7 @@ public class XbcExpCalculator {
 			piMap.put(key, result);
 		}
 
-		XbcExpCalculateExp calculateExp = new XbcExpCalculateExp(weishu, roundMode, expStr, piMap, formulaParams);
+		XbcExpCalculateExp calculateExp = new XbcExpCalculateExp(weishu, roundMode, expStr, piMap, ruleVos, formulaParams);
 		Object ret = calculateExp.calculate(exp);
 		return ret;
 	}

+ 1 - 0
src/engine/java/xbc/formula/engine/exp/datatype/XbcExpExpOpKind.java

@@ -48,6 +48,7 @@ public class XbcExpExpOpKind {
     public static final int AFTDEC_OK   = 43;    /* var --                      */
     public static final int ITV_OK      = 44;    /* 层差计算                       */
     public static final int DIV0_OK     = 45;    /* div0                        */
+    public static final int AT_OK       = 50;    /* @                           */
     public static final int IF_OK       = 60;    /* if                          */
     public static final int FOR_OK      = 61;    /* for循环                       */
     public static final int BREAK_OK    = 62;    /* break                       */

+ 4 - 1
src/engine/java/xbc/formula/engine/exp/datatype/XbcExpExpTree.java

@@ -22,9 +22,12 @@ public class XbcExpExpTree {
 
 	public List<XbcExpIntervalVo> itvs; // 层差计算用
 
-	public XbcExpExpTree body; // 下一个表达式
+	public XbcExpExpTree body;
 
 	public XbcExpExpTree next; // 下一个表达式
+	
+	public String ruleName;
+	public List<XbcExpExpTree> ruleParams;
 
 	public XbcExpExpTree() {
 	}

+ 2 - 0
src/engine/java/xbc/formula/engine/exp/datatype/XbcExpToken.java

@@ -108,6 +108,8 @@ public class XbcExpToken {
 	public static final int DIV0_TT = 48;
 	@XbcExpTokenAnnotation(id="period", name="点号", value=".")
 	public static final int PRD_TT = 49;
+	@XbcExpTokenAnnotation(id="at", name="at", value="@")
+	public static final int AT_TT = 50;
 	@XbcExpTokenAnnotation(id="if", name="if", value="if")
 	public static final int IF_TT = 60;
 	@XbcExpTokenAnnotation(id="for", name="for", value="for")

+ 60 - 1
src/engine/java/xbc/formula/engine/exp/exec/XbcExpCalculateExp.java

@@ -13,7 +13,9 @@ import xbc.formula.engine.exp.datatype.XbcExpExpOpKind;
 import xbc.formula.engine.exp.datatype.XbcExpExpTree;
 import xbc.formula.engine.exp.exception.XbcExpExecException;
 import xbc.formula.engine.exp.util.XbcExpNumericUtil;
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
 import xbc.formula.engine.exp.vo.XbcExpResultVo;
+import xbc.formula.engine.exp.vo.XbcExpRuleParamVo;
 
 /**
  * 表达式执行类
@@ -42,7 +44,9 @@ public class XbcExpCalculateExp {
 	
 	private List<BigDecimal> div0List;
 	
-	public XbcExpCalculateExp(int weishu, RoundingMode roundMode, String expStr, Map<String, XbcExpResultVo> indicatorMap, Object[] formulaParams) {
+	private List<XbcExpRuleVo> ruleVos;
+	
+	public XbcExpCalculateExp(int weishu, RoundingMode roundMode, String expStr, Map<String, XbcExpResultVo> indicatorMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		if(indicatorMap == null) {
 			indicatorMap = new HashMap<>();
 		}
@@ -50,6 +54,7 @@ public class XbcExpCalculateExp {
 		this.roundMode = roundMode;
 		varMap = new HashMap<>();
 		div0List = new ArrayList<>();
+		this.ruleVos = ruleVos;
 		this.expStr = expStr;
 		this.indicatorMap = indicatorMap;
 		calculatorExp2Op = new XbcExpCalculatorExp2Op(this, weishu, roundMode, expStr);
@@ -237,6 +242,60 @@ public class XbcExpCalculateExp {
 	    case XbcExpExpOpKind.IF_OK:
 	    	calcIfExp(exp, result);
 	    	break;
+
+	    case XbcExpExpOpKind.AT_OK:
+	    	calcAtExp(exp, result);
+	    	break;
+		}
+	}
+	
+	private void setValue2Obj(Object ov, String fieldName, Object v) {
+		Class<?> c = ov.getClass();
+		try {
+			Field field = c.getDeclaredField(fieldName);
+			field.setAccessible(true);
+			field.set(ov, v);
+		} catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) {
+			//e.printStackTrace();
+		}
+	}
+
+	private void calcAtExp(XbcExpExpTree exp, XbcExpResultVo result) {
+		List<XbcExpRuleParamVo> rpvs = null;
+		if(ruleVos != null && exp.ruleParams != null && exp.ruleParams.size() > 0) {
+			rpvs = new ArrayList<>();
+			List<XbcExpExpTree> rps = exp.ruleParams;
+			XbcExpResultVo r = new XbcExpResultVo();
+			for(int k = 0;k < rps.size();k ++) {
+				XbcExpExpTree rp = rps.get(k);
+				calcExp(rp, r);
+				XbcExpRuleParamVo rpv = new XbcExpRuleParamVo();
+				rpv.setPname((String)(rp.value));
+				rpv.setPindex(k + 1);
+				rpv.setValue(r.value);
+				rpvs.add(rpv);
+			}
+		}
+		try {
+			calcExp(exp.lchild, result);
+		} finally {
+			if(ruleVos == null) {
+				return;
+			}
+			List<XbcExpExpTree> params = exp.params;
+			if(params == null || params.size() == 0) {
+				return;
+			}
+			XbcExpRuleVo rv = new XbcExpRuleVo();
+			XbcExpResultVo r = new XbcExpResultVo();
+			for(XbcExpExpTree pe : params) {
+				calcExp(pe, r);
+				String fn = pe.ruleName;
+				setValue2Obj(rv, fn, r.value);
+			}
+			rv.setValue(result.value);
+			rv.setRpvs(rpvs);
+			ruleVos.add(rv);
 		}
 	}
 	

+ 70 - 0
src/engine/java/xbc/formula/engine/exp/parser/XbcExpParser.java

@@ -122,6 +122,9 @@ public class XbcExpParser {
 		case XbcExpToken.EXIT_TT:     // exit
 			exp = readExitExp();
 			break;
+		case XbcExpToken.AT_TT:     // exit
+			exp = readAtExp();
+			break;
 		case XbcExpToken.SEMI_TT:
 			match(XbcExpToken.SEMI_TT);
 			exp = new XbcExpExpTree(XbcExpExpOpKind.NULL_OK);
@@ -141,6 +144,73 @@ public class XbcExpParser {
 		token = es.readToken();
 	}
 
+	private XbcExpExpTree readAtExp() {
+		match(XbcExpToken.AT_TT);
+		if(token != XbcExpToken.EXPNAME_TT) {
+			throw new XbcExpParseException("@后面必须接【Rule】, 公式: " + expStr);
+		}
+		String tokenContent = es.getTokenContent();
+		if(!tokenContent.equals("Rule")) {
+			throw new XbcExpParseException("@后面必须接【Rule】, 公式: " + expStr);
+		}
+		match(XbcExpToken.EXPNAME_TT);
+		match(XbcExpToken.LPRN_TT);
+		XbcExpExpTree exp = new XbcExpExpTree(XbcExpExpOpKind.AT_OK);
+		List<XbcExpExpTree> params = new ArrayList<>();
+		exp.params = params;
+		while(token != XbcExpToken.RPRN_TT) {
+			if(token == XbcExpToken.SEMI_TT) {
+				match(token);
+				continue;
+			}
+			if(token == XbcExpToken.CMM_TT) {
+				match(token);
+			}
+			if(token != XbcExpToken.EXPNAME_TT) {
+				throw new XbcExpParseException("@Rule里面只能定义属性 type, name, displayOrder, bizIdCode, desc, comment, params, 公式: " + expStr);
+			}
+			String tc = es.getTokenContent();
+			if(!tc.equals("type") && !tc.equals("name") && !tc.equals("desc") && !tc.equals("comment") && !tc.equals("displayOrder") && !tc.equals("bizIdCode") && !tc.equals("params")) {
+				throw new XbcExpParseException("@Rule里面只能定义属性 type, name, displayOrder, bizIdCode, desc, comment params, 公式: " + expStr);
+			}
+			match(token);
+			match(XbcExpToken.ASN_TT);
+			if(tc.equals("params")) {
+				if(exp.ruleParams != null) {
+					throw new XbcExpParseException("@Rule里面重复定义了属性: " + tc + ", 公式: " + expStr);
+				}
+				List<XbcExpExpTree> rps = new ArrayList<>();
+				exp.ruleParams = rps;
+				match(XbcExpToken.LSQB_TT);
+				while(token != XbcExpToken.RSQB_TT) {
+					if(token == XbcExpToken.CMM_TT) {
+						match(token);
+					}
+					if(token != XbcExpToken.EXPNAME_TT) {
+						throw new XbcExpParseException("params里面只能填写变量名, 公式: " + expStr);
+					}
+					XbcExpExpTree rp = XbcExpExpTree.newIdExptree(es.getTokenContent());
+					rps.add(rp);
+					match(token);
+				}
+				match(token);
+			} else {
+				for(XbcExpExpTree pe : params) {
+					String sv = (String)(pe.ruleName);
+					if(sv.equals(tc)) {
+						throw new XbcExpParseException("@Rule里面重复定义了属性: " + tc + ", 公式: " + expStr);
+					}
+				}
+				XbcExpExpTree pe = readAsnExp();
+				pe.ruleName = tc;
+				params.add(pe);
+			}
+		}
+		match(token);
+		exp.lchild = readNextExp();
+		return exp;
+	}
+
 	private XbcExpExpTree readExitExp() {
 		match(XbcExpToken.EXIT_TT);
 		XbcExpExpTree exp = new XbcExpExpTree(XbcExpExpOpKind.EXIT_OK);

+ 55 - 11
src/engine/java/xbc/formula/engine/exp/scanner/XbcExpScanner.java

@@ -1,5 +1,9 @@
 package xbc.formula.engine.exp.scanner;
 
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -39,6 +43,7 @@ public class XbcExpScanner {
 //	private static final int SCANF_EDBL = 5;
 
 	private String expStr;
+	private String oriExpStr;
 
 	private int pos;
 
@@ -57,7 +62,8 @@ public class XbcExpScanner {
 	}
 
 	public XbcExpScanner(String expStr, boolean mkDiv) {
-		this.expStr = expStr;
+		this.oriExpStr = expStr;
+		readExpContent(expStr);
 		this.mkDiv = mkDiv;
 		pos = 0;
 		tokenContent = new StringBuilder();
@@ -65,6 +71,38 @@ public class XbcExpScanner {
 			divs = new ArrayList<>();
 		}
 	}
+	
+	private void readExpContent(String str) {
+		File f = new File(str);
+		if(!f.exists() || !f.isFile()) {
+			expStr = str;
+			return;
+		}
+		StringBuilder sb = new StringBuilder();
+		BufferedReader reader = null;
+		try {
+			reader = new BufferedReader(new FileReader(str));
+			String line = reader.readLine();
+			while(line != null) {
+				sb.append(line);
+				sb.append("\n");
+				line = reader.readLine();
+			}
+			expStr = sb.toString();
+		} catch(IOException ix) {
+			//ix.printStackTrace();
+			expStr = str;
+		} finally {
+			if(reader != null) {
+				try {
+					reader.close();
+				} catch (IOException e) {
+					//e.printStackTrace();
+					expStr = str;
+				}
+			}
+		}
+	}
 
 	public String getTokenContent() {
 		return tokenContent.toString();
@@ -441,12 +479,18 @@ public class XbcExpScanner {
 					token = XbcExpToken.RBKT_TT;
 					state = SCAN_DONE_STATE;
 					break;
+	            case '@':
+					appendDivChar(c);
+					addDiv(XbcExpDrawnInfoVo.OPERATOR_TYPE);
+					token = XbcExpToken.AT_TT;
+					state = SCAN_DONE_STATE;
+					break;
 	            case EOF:
                     token = XbcExpToken.EOF_TT;
 	                state = SCAN_DONE_STATE;
 	                break;
 	            default:
-	            	throw new XbcExpScanException(c + " 无法识别的符号。" + " 公式: " + expStr);
+	            	throw new XbcExpScanException(c + " 无法识别的符号。" + " 公式: " + oriExpStr);
 	            }
 				break;
 			case SCAN_LC_STATE:    // line-comment-state
@@ -462,7 +506,7 @@ public class XbcExpScanner {
 			case SCAN_C_STATE:     // comment-state
 				appendDivChar(c);
 				if(c == EOF) {
-					throw new XbcExpScanException("【/*】注释没有结束符【*/】。" + " 公式: " + expStr);
+					throw new XbcExpScanException("【/*】注释没有结束符【*/】。" + " 公式: " + oriExpStr);
 				}   else if(lastC == '*'&&c == '/') {
 					addDiv(XbcExpDrawnInfoVo.COMMENT_TYPE);
 	                state = SCAN_START_STATE;
@@ -525,7 +569,7 @@ public class XbcExpScanner {
 	            	tokenContent.append('E');
 	                state = SCAN_EDBL1_STATE;
 	            }   else if(Character.isAlphabetic(c) || c == '"') {
-	            	throw new XbcExpScanException("整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + oriExpStr);
 	            }   else {
 	                //nFlag = SCANF_INT;
 					addDiv(XbcExpDrawnInfoVo.CONSTANT_NUMERIC_TYPE);
@@ -539,7 +583,7 @@ public class XbcExpScanner {
 					appendDivChar(c);
 	            	tokenContent.append(c);
 	            } else if(Character.isAlphabetic(c)||c == '8'||c == '9'||c == '"') {
-	            	throw new XbcExpScanException("八进制整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("八进制整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + oriExpStr);
 	            }   else {
 	                //nFlag = SCANF_OCT;
 					addDiv(XbcExpDrawnInfoVo.CONSTANT_NUMERIC_TYPE);
@@ -553,7 +597,7 @@ public class XbcExpScanner {
 					appendDivChar(c);
 	            	tokenContent.append(c);
 	            } else if(Character.isAlphabetic(c) ||c == '"') {
-	            	throw new XbcExpScanException("十六进制整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("十六进制整数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + oriExpStr);
 	            }   else {
 	                //nFlag = SCANF_HEX;
 					addDiv(XbcExpDrawnInfoVo.CONSTANT_NUMERIC_TYPE);
@@ -571,7 +615,7 @@ public class XbcExpScanner {
 	            	tokenContent.append('E');
 	                state = SCAN_EDBL1_STATE;
 	            } else if(Character.isAlphabetic(c) ||c == '"') {
-	            	throw new XbcExpScanException("浮点数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("浮点数【" + tokenContent.toString() + "】后面不能接字符: " + c + ", 公式: " + oriExpStr);
 	            }   else {
 	                //nFlag = SCANF_DBL;
 					addDiv(XbcExpDrawnInfoVo.CONSTANT_NUMERIC_TYPE);
@@ -590,12 +634,12 @@ public class XbcExpScanner {
 	                if(c >= '0' && c <= '9') {
 	                    state = SCAN_EDBL_STATE;
 	                }   else {
-	                	throw new XbcExpScanException("+-符号后面应该跟数字" + ", 公式: " + expStr);
+	                	throw new XbcExpScanException("+-符号后面应该跟数字" + ", 公式: " + oriExpStr);
 	                }
 	            }   else if(c >= '0' && c <= '9') {
 	                state = SCAN_EDBL_STATE;
 	            }   else {
-	            	throw new XbcExpScanException("科学计数法常数不正确。" + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("科学计数法常数不正确。" + ", 公式: " + oriExpStr);
 	            }
 	            break;
 	        case SCAN_EDBL_STATE:  // e-double-state
@@ -612,7 +656,7 @@ public class XbcExpScanner {
 	            break;
 	        case SCAN_STR_STATE:   // string-state
 	            if(c == EOF||c == 13||c == 10||c == 12) {
-	            	throw new XbcExpScanException("字符串常数没有结束【" + tokenContent.toString() + "】" + ", 公式: " + expStr);
+	            	throw new XbcExpScanException("字符串常数没有结束【" + tokenContent.toString() + "】" + ", 公式: " + oriExpStr);
 	            }   else if(c == strC) {
 					appendDivChar(c);
 					addDiv(XbcExpDrawnInfoVo.CONSTANT_STRING_TYPE);
@@ -685,7 +729,7 @@ public class XbcExpScanner {
 	    	tokenContent.append("?");
 	        return;
 	    }
-    	throw new XbcExpScanException("未知的转义符【" + c + "】" + ", 公式: " + expStr);
+    	throw new XbcExpScanException("未知的转义符【" + c + "】" + ", 公式: " + oriExpStr);
 	}
 
 	private void ungetNextChar() {

+ 25 - 0
src/engine/java/xbc/formula/engine/exp/vo/XbcExpRuleParamVo.java

@@ -0,0 +1,25 @@
+package xbc.formula.engine.exp.vo;
+
+public class XbcExpRuleParamVo {
+	private String pname;
+	private int pindex;
+	private Object value;
+	public String getPname() {
+		return pname;
+	}
+	public void setPname(String pname) {
+		this.pname = pname;
+	}
+	public int getPindex() {
+		return pindex;
+	}
+	public void setPindex(int pindex) {
+		this.pindex = pindex;
+	}
+	public Object getValue() {
+		return value;
+	}
+	public void setValue(Object value) {
+		this.value = value;
+	}
+}

+ 62 - 0
src/engine/java/xbc/formula/engine/exp/vo/XbcExpRuleVo.java

@@ -0,0 +1,62 @@
+package xbc.formula.engine.exp.vo;
+
+import java.util.List;
+
+public class XbcExpRuleVo {
+	private String type;
+	private String name;
+	private String desc;
+	private String comment;
+	private int displayOrder;
+	private String bizIdCode;
+	private Object value;
+	private List<XbcExpRuleParamVo> rpvs;
+	public String getType() {
+		return type;
+	}
+	public void setType(String type) {
+		this.type = type;
+	}
+	public String getName() {
+		return name;
+	}
+	public void setName(String name) {
+		this.name = name;
+	}
+	public String getDesc() {
+		return desc;
+	}
+	public void setDesc(String desc) {
+		this.desc = desc;
+	}
+	public String getComment() {
+		return comment;
+	}
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+	public Object getValue() {
+		return value;
+	}
+	public void setValue(Object value) {
+		this.value = value;
+	}
+	public int getDisplayOrder() {
+		return displayOrder;
+	}
+	public void setDisplayOrder(int displayOrder) {
+		this.displayOrder = displayOrder;
+	}
+	public String getBizIdCode() {
+		return bizIdCode;
+	}
+	public void setBizIdCode(String bizIdCode) {
+		this.bizIdCode = bizIdCode;
+	}
+	public List<XbcExpRuleParamVo> getRpvs() {
+		return rpvs;
+	}
+	public void setRpvs(List<XbcExpRuleParamVo> rpvs) {
+		this.rpvs = rpvs;
+	}
+}

+ 16 - 6
src/engine/java/xbc/formula/engine/fml/XbcFmlCalculator.java

@@ -12,6 +12,7 @@ import java.util.Set;
 import xbc.formula.engine.exp.XbcExpCalculator;
 import xbc.formula.engine.exp.exception.XbcExpParamException;
 import xbc.formula.engine.exp.ext.XbcExpExtFuncManager;
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
 import xbc.formula.engine.fml.vo.XbcFmlFormulaIndicatorVo;
 import xbc.formula.engine.fml.vo.XbcFmlFormulaVo;
 
@@ -42,27 +43,36 @@ public class XbcFmlCalculator {
 	 * @return 公式的计算结果
 	 */
 	public static Object calculte(XbcFmlFormulaVo fv, Object... formulaParams) {
+		return calculte(fv, null, formulaParams);
+	}
+	
+	public static Object calculte(XbcFmlFormulaVo fv, List<XbcExpRuleVo> ruleVos, Object... formulaParams) {
 		Set<Long> formulaIdSet = new HashSet<>(); // 防止公式循环调用
-		Object ov = calculte(fv, formulaIdSet, formulaParams);
+		Map<String, Object> resultMap = new HashMap<>();
+		Object ov = calculte(fv, formulaIdSet, resultMap, ruleVos, formulaParams);
 		return ov;
 	}
 	
-	private static Object calculte(XbcFmlFormulaVo fv, Set<Long> formulaIdSet, Object[] formulaParams) {
+	private static Object calculte(XbcFmlFormulaVo fv, Set<Long> formulaIdSet, Map<String, Object> resultMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		if(fv == null) {
 			throw new XbcExpParamException("需要计算的公式是空值。");
 		}
+		if(resultMap.containsKey(fv.getFormulaName())) {
+			return resultMap.get(fv.getFormulaName());
+		}
 		Long formulaId = fv.getKeyId();
 		if(formulaIdSet.contains(formulaId)) {
 			throw new XbcExpParamException("公式不能循环调用,公式id: " + formulaId + ", 公式名称: " + fv.getFormulaName());
 		}
 		formulaIdSet.add(formulaId);
-		Object ret = executeExp(fv, formulaIdSet, formulaParams);
+		Object ret = executeExp(fv, formulaIdSet, resultMap, ruleVos, formulaParams);
 		fv.setResult(ret);
 		formulaIdSet.remove(formulaId);
+		resultMap.put(fv.getFormulaName(), ret);
 		return ret;
 	}
 	
-	private static Object executeExp(XbcFmlFormulaVo fv, Set<Long> formulaIdSet, Object[] formulaParams) {
+	private static Object executeExp(XbcFmlFormulaVo fv, Set<Long> formulaIdSet, Map<String, Object> resultMap, List<XbcExpRuleVo> ruleVos, Object[] formulaParams) {
 		Map<String, Object> pm = new HashMap<>();
 		List<XbcFmlFormulaIndicatorVo> ivs = fv.getIndicatorVos();
 		if(ivs != null && ivs.size() > 0) {
@@ -79,7 +89,7 @@ public class XbcFmlCalculator {
 				} else if(qt == XbcFmlFormulaIndicatorVo.SCRIPT_TYPE) {
 					val = iv.getResult();
 				} else if(qt == XbcFmlFormulaIndicatorVo.FORMULA_TYPE) {
-					val = calculte(iv.getFormulaVo(), formulaIdSet, formulaParams);
+					val = calculte(iv.getFormulaVo(), formulaIdSet, resultMap, ruleVos, formulaParams);
 					iv.setResult(val);
 				} else if(qt == XbcFmlFormulaIndicatorVo.PARAM_TYPE) {
 					val = getValueFromParams(iv, formulaParams);
@@ -94,7 +104,7 @@ public class XbcFmlCalculator {
 			}
 		}
 		String expStr = fv.getFormulaValue();
-		Object retObj = XbcExpCalculator.calculate(expStr, pm, formulaParams);
+		Object retObj = XbcExpCalculator.calculate(expStr, pm, ruleVos, formulaParams);
 		return retObj;
 	}
 	

+ 13 - 0
src/main/java/xbc/formula/calcmgr/dao/CalcRuleResultDao.java

@@ -0,0 +1,13 @@
+package xbc.formula.calcmgr.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import xbc.formula.calcmgr.dao.entity.CalcRuleResult;
+
+public interface CalcRuleResultDao {
+
+	void saveBatch(@Param("pos") List<CalcRuleResult> crrs);
+	
+}

+ 13 - 0
src/main/java/xbc/formula/calcmgr/dao/CalcRuleResultParamDao.java

@@ -0,0 +1,13 @@
+package xbc.formula.calcmgr.dao;
+
+import java.util.List;
+
+import org.apache.ibatis.annotations.Param;
+
+import xbc.formula.calcmgr.dao.entity.CalcRuleResultParam;
+
+public interface CalcRuleResultParamDao {
+
+	void saveBatch(@Param("pos") List<CalcRuleResultParam> crrps);
+	
+}

+ 76 - 0
src/main/java/xbc/formula/calcmgr/dao/entity/CalcRuleResult.java

@@ -0,0 +1,76 @@
+package xbc.formula.calcmgr.dao.entity;
+
+import java.sql.Timestamp;
+
+public class CalcRuleResult {
+	private long keyId;
+	private long calcResultId;
+	private String ruleType;
+	private String ruleName;
+	private String bizIdCode;
+	private int displayOrder;
+	private String calcResult;
+	private String ruleDesc;
+	private String comment;
+	private Timestamp createTime;
+	public long getKeyId() {
+		return keyId;
+	}
+	public void setKeyId(long keyId) {
+		this.keyId = keyId;
+	}
+	public long getCalcResultId() {
+		return calcResultId;
+	}
+	public void setCalcResultId(long calcResultId) {
+		this.calcResultId = calcResultId;
+	}
+	public String getRuleType() {
+		return ruleType;
+	}
+	public void setRuleType(String ruleType) {
+		this.ruleType = ruleType;
+	}
+	public String getRuleName() {
+		return ruleName;
+	}
+	public void setRuleName(String ruleName) {
+		this.ruleName = ruleName;
+	}
+	public String getBizIdCode() {
+		return bizIdCode;
+	}
+	public void setBizIdCode(String bizIdCode) {
+		this.bizIdCode = bizIdCode;
+	}
+	public int getDisplayOrder() {
+		return displayOrder;
+	}
+	public void setDisplayOrder(int displayOrder) {
+		this.displayOrder = displayOrder;
+	}
+	public String getCalcResult() {
+		return calcResult;
+	}
+	public void setCalcResult(String calcResult) {
+		this.calcResult = calcResult;
+	}
+	public String getRuleDesc() {
+		return ruleDesc;
+	}
+	public void setRuleDesc(String ruleDesc) {
+		this.ruleDesc = ruleDesc;
+	}
+	public String getComment() {
+		return comment;
+	}
+	public void setComment(String comment) {
+		this.comment = comment;
+	}
+	public Timestamp getCreateTime() {
+		return createTime;
+	}
+	public void setCreateTime(Timestamp createTime) {
+		this.createTime = createTime;
+	}
+}

+ 41 - 0
src/main/java/xbc/formula/calcmgr/dao/entity/CalcRuleResultParam.java

@@ -0,0 +1,41 @@
+package xbc.formula.calcmgr.dao.entity;
+
+import java.sql.Timestamp;
+
+public class CalcRuleResultParam {
+	private long ruleResultId;
+	private int displayOrder;
+	private String paramName;
+	private String paramValue;
+	private Timestamp createTime;
+	public long getRuleResultId() {
+		return ruleResultId;
+	}
+	public void setRuleResultId(long ruleResultId) {
+		this.ruleResultId = ruleResultId;
+	}
+	public int getDisplayOrder() {
+		return displayOrder;
+	}
+	public void setDisplayOrder(int displayOrder) {
+		this.displayOrder = displayOrder;
+	}
+	public String getParamName() {
+		return paramName;
+	}
+	public void setParamName(String paramName) {
+		this.paramName = paramName;
+	}
+	public String getParamValue() {
+		return paramValue;
+	}
+	public void setParamValue(String paramValue) {
+		this.paramValue = paramValue;
+	}
+	public Timestamp getCreateTime() {
+		return createTime;
+	}
+	public void setCreateTime(Timestamp createTime) {
+		this.createTime = createTime;
+	}
+}

+ 1 - 1
src/main/java/xbc/formula/calcmgr/logic/CalcNoManagerLogic.java

@@ -6,5 +6,5 @@ import xbc.formula.calcmgr.vo.CalcNoVo;
 
 public interface CalcNoManagerLogic {
 
-	CalcNoVo getResultId(Timestamp ts, int size);
+	CalcNoVo getResultId(Timestamp ts, int isize, int rsize);
 }

+ 4 - 1
src/main/java/xbc/formula/calcmgr/logic/SaveResultLogic.java

@@ -1,10 +1,13 @@
 package xbc.formula.calcmgr.logic;
 
+import java.util.List;
+
 import xbc.formula.calcmgr.vo.CalculateRequestVo;
 import xbc.formula.calcmgr.vo.CalculateResponseVo;
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
 import xbc.formula.engine.fml.vo.XbcFmlFormulaVo;
 
 public interface SaveResultLogic {
 
-	void saveResult(CalculateRequestVo requestVo, CalculateResponseVo responseVo, XbcFmlFormulaVo fv);
+	void saveResult(CalculateRequestVo requestVo, CalculateResponseVo responseVo, List<XbcExpRuleVo> ruleVos, XbcFmlFormulaVo fv);
 }

+ 5 - 2
src/main/java/xbc/formula/calcmgr/logic/impl/CalcNoManagerLogicImpl.java

@@ -25,17 +25,20 @@ public class CalcNoManagerLogicImpl implements CalcNoManagerLogic {
 	 */
 	@Override
 	@Transactional(propagation= Propagation.REQUIRES_NEW)
-	public CalcNoVo getResultId(Timestamp ts, int size) {
+	public CalcNoVo getResultId(Timestamp ts, int isize, int rsize) {
 		CalcNoVo cnv = calcNoManagerDao.getCurrentNoLock(NO_TYPE_FORMULA);
 		long baseFormulaId = cnv.getFormulaNo();
 		long baseIndicatorId = cnv.getIndicatorNo();
+		long baseRuleId = cnv.getRuleNo();
 		cnv.setFormulaNo(baseFormulaId + 1);
-		cnv.setIndicatorNo(baseIndicatorId + size);
+		cnv.setIndicatorNo(baseIndicatorId + isize);
+		cnv.setRuleNo(baseRuleId + rsize);
 		cnv.setModifyTime(ts);
 		cnv.setResultType(NO_TYPE_FORMULA);
 		calcNoManagerDao.updateCurrentNo(cnv);
 		cnv.setFormulaNo(baseFormulaId);
 		cnv.setIndicatorNo(baseIndicatorId);
+		cnv.setRuleNo(baseRuleId);
 		return cnv;
 	}
 

+ 7 - 2
src/main/java/xbc/formula/calcmgr/logic/impl/CalculateManagerLogicImpl.java

@@ -1,5 +1,8 @@
 package xbc.formula.calcmgr.logic.impl;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
@@ -8,6 +11,7 @@ import xbc.formula.calcmgr.logic.CalculateManagerLogic;
 import xbc.formula.calcmgr.logic.SaveResultLogic;
 import xbc.formula.calcmgr.vo.CalculateRequestVo;
 import xbc.formula.calcmgr.vo.CalculateResponseVo;
+import xbc.formula.engine.exp.vo.XbcExpRuleVo;
 import xbc.formula.engine.fml.XbcFmlCalculator;
 import xbc.formula.engine.fml.vo.XbcFmlFormulaVo;
 import xbc.formula.fmlmgr.logic.FormulaLogic;
@@ -38,11 +42,12 @@ public class CalculateManagerLogicImpl implements CalculateManagerLogic {
 		if(fv == null) {
 			throw new FormulaException("没有找到公式,公式编码: " + formulaCode);
 		}
-		Object ov = XbcFmlCalculator.calculte(fv, requestVo.getParamMap());
+		List<XbcExpRuleVo> ruleVos = new ArrayList<>();
+		Object ov = XbcFmlCalculator.calculte(fv, ruleVos, requestVo.getParamMap());
 		CalculateResponseVo responseVo = new CalculateResponseVo();
 		responseVo.setResultType(ov.getClass().getName());
 		responseVo.setResultValue(ov.toString());
-		saveResultLogic.saveResult(requestVo, responseVo, fv);
+		saveResultLogic.saveResult(requestVo, responseVo, ruleVos, fv);
 		return responseVo;
 	}
 

+ 85 - 14
src/main/java/xbc/formula/calcmgr/logic/impl/SaveResultLogicImpl.java

@@ -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;

+ 7 - 0
src/main/java/xbc/formula/calcmgr/vo/CalcNoVo.java

@@ -6,6 +6,7 @@ public class CalcNoVo {
 	private int resultType;
 	private long formulaNo;
 	private long indicatorNo;
+	private long ruleNo;
 	private Timestamp modifyTime;
 	public int getResultType() {
 		return resultType;
@@ -25,6 +26,12 @@ public class CalcNoVo {
 	public void setIndicatorNo(long indicatorNo) {
 		this.indicatorNo = indicatorNo;
 	}
+	public long getRuleNo() {
+		return ruleNo;
+	}
+	public void setRuleNo(long ruleNo) {
+		this.ruleNo = ruleNo;
+	}
 	public Timestamp getModifyTime() {
 		return modifyTime;
 	}

+ 3 - 1
src/main/resources/mapper/CalcNoManagerMapper.xml

@@ -4,7 +4,8 @@
     <select id="getCurrentNoLock" resultType="xbc.formula.calcmgr.vo.CalcNoVo">
         select
             formula_no as formulaNo, 
-            indicator_no as indicatorNo
+            indicator_no as indicatorNo,
+            rule_no as ruleNo
         from
             calc_no_manager
         where
@@ -18,6 +19,7 @@
         set
             formula_no = #{formulaNo},
             indicator_no = #{indicatorNo},
+            rule_no = #{ruleNo},
             modify_time = #{modifyTime}
         where
             result_type = #{resultType}

+ 21 - 0
src/main/resources/mapper/CalcRuleResultMapper.xml

@@ -0,0 +1,21 @@
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="xbc.formula.calcmgr.dao.CalcRuleResultDao">
+
+    <insert id="saveBatch" parameterType="java.util.List">
+        insert into calc_rule_result (key_id, calc_result_id, rule_type, rule_name, biz_id_code, display_order, calc_result, rule_desc, comment, create_time) values 
+        <foreach collection="pos" item="po" index="index" separator=",">
+        (
+            #{po.keyId},
+            #{po.calcResultId},
+            #{po.ruleType},
+            #{po.ruleName},
+            #{po.bizIdCode},
+            #{po.displayOrder},
+            #{po.calcResult},
+            #{po.ruleDesc},
+            #{po.comment},
+            #{po.createTime}
+        )
+        </foreach>
+    </insert>
+</mapper>

+ 16 - 0
src/main/resources/mapper/CalcRuleResultParamMapper.xml

@@ -0,0 +1,16 @@
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="xbc.formula.calcmgr.dao.CalcRuleResultParamDao">
+
+    <insert id="saveBatch" parameterType="java.util.List">
+        insert into calc_rule_result_param (rule_result_id, display_order, param_name, param_value, create_time) values 
+        <foreach collection="pos" item="po" index="index" separator=",">
+        (
+            #{po.ruleResultId},
+            #{po.displayOrder},
+            #{po.paramName},
+            #{po.paramValue},
+            #{po.createTime}
+        )
+        </foreach>
+    </insert>
+</mapper>

+ 11 - 5
table/reset_ddl_pg.txt

@@ -1,9 +1,11 @@
 -- 重新设置公式表数据
 TRUNCATE TABLE fml_formula;
-INSERT INTO fml_formula VALUES (1000, '个人所得税', 'gerensuodeshui', '(工资 {\r\n  <= 5000 : 0,\r\n  (5000, 8000] : (工资 - 5000) * 0.03,\r\n  (8000, 17000] : 90 + (工资 - 8000) * 0.1,\r\n  (17000, 30000] : 990 + (工资 - 17000) * 0.2,\r\n  (30000, 40000] : 3590 + (工资 - 30000) * 0.25,\r\n  (40000, 60000] : 6090 + (工资 - 40000) * 0.3,\r\n  (60000, 85000] : 12090 + (工资 - 60000) * 0.35,\r\n  > 850000 : 20840 + (工资 - 85000) * 0.45\r\n}) + 杂税', '', 0, current_timestamp);
-INSERT INTO fml_formula VALUES (1001, '工资', 'gongzi', '基本工资 + 绩效工资 + 其它收入', '', 0, current_timestamp);
-INSERT INTO fml_formula VALUES (1002, '其它收入', 'qitashouru', '兼职收入 * 0.8 + 彩票收入 * 0.5', '', 0, current_timestamp);
-INSERT INTO fml_formula VALUES (1003, '绩效工资', 'jixiaogongzi', '基本绩效 + 其它收入', '', 0, current_timestamp);
+INSERT INTO cm.fml_formula (key_id,formula_name,formula_code,formula_value,formula_desc,del_status,create_time) VALUES
+	 (1001,'工资','gongzi','@Rule(name="工资",desc="计算工资的公式",displayOrder=100,params={基本工资,绩效工资,其它收入})'||chr(10)||'基本工资 + 绩效工资 + 其它收入','',0,current_timestamp),
+	 (1002,'其它收入','qitashouru','兼职收入 * 0.8 + 彩票收入 * 0.5','',0,current_timestamp),
+	 (1003,'绩效工资','jixiaogongzi','基本绩效 + 其它收入','',0,current_timestamp),
+	 (1000,'个人所得税','gerensuodeshui','(工资 {'||chr(10)||'  <= 5000 : 0,'||chr(10)||'  (5000, 8000] : (工资 - 5000) * 0.03,'||chr(10)||'  (8000, 17000] : 90 + (工资 - 8000) * 0.1,'||chr(10)||'  (17000, 30000] : 990 + (工资 - 17000) * 0.2,'||chr(10)||'  (30000, 40000] : 3590 + (工资 - 30000) * 0.25,'||chr(10)||'  (40000, 60000] : 6090 + (工资 - 40000) * 0.3,'||chr(10)||'  (60000, 85000] : 12090 + (工资 - 60000) * 0.35,'||chr(10)||'  > 850000 : 20840 + (工资 - 85000) * 0.45'||chr(10)||'}) + 杂税','',0,current_timestamp);
+
 
 -- 重新设置指标表数据
 TRUNCATE TABLE fml_formula_indicator;
@@ -19,10 +21,14 @@ INSERT INTO calc_formula VALUES (1, 1, 'geshui', 'gerensuodeshui', 1, 0, current
 
 -- 重新设置运行结果id管理表数据
 TRUNCATE TABLE calc_no_manager;
-insert into calc_no_manager (result_type, formula_no, indicator_no, create_time, modify_time) values (1, 0, 0, current_timestamp, current_timestamp);
+insert into calc_no_manager (result_type, formula_no, indicator_no, rule_no, create_time, modify_time) values (1, 0, 0, 0, current_timestamp, current_timestamp);
 
 -- 清除公式运算结果表数据
 TRUNCATE TABLE calc_result;
 
 -- 清除公式运算结果指标表数据
 TRUNCATE TABLE calc_indicator_result;
+
+-- 清除规则结果表数据
+TRUNCATE TABLE calc_rule_result;
+TRUNCATE TABLE calc_rule_result_param;

+ 26 - 2
table/table_dml_pg.txt

@@ -35,7 +35,7 @@ CREATE TABLE calc_formula(
 	product_id                       bigint               NOT NULL DEFAULT 0                ,
 	biz_type                         varchar(40)          NOT NULL DEFAULT ''               ,
 	formula_code                     varchar(40)          NOT NULL DEFAULT ''               ,
-	show_index                       integer              NOT NULL DEFAULT 0                ,
+	display_order                    integer              NOT NULL DEFAULT 0                ,
 	del_status                       smallint             NOT NULL DEFAULT 0                ,
 	create_time                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP,
 	PRIMARY KEY ( key_id )
@@ -51,12 +51,13 @@ CREATE TABLE calc_no_manager(
     result_type                      smallint             NOT NULL DEFAULT 0                ,
     formula_no                       bigint               NOT NULL DEFAULT 0                ,
     indicator_no                     bigint               NOT NULL DEFAULT 0                ,
+    rule_no                          bigint               NOT NULL DEFAULT 0                ,
 	create_time                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP,
 	modify_time                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP,
 	PRIMARY KEY ( result_type )
 );
 
-insert into calc_no_manager (result_type, formula_no, indicator_no, create_time, modify_time) values (1, 0, 0, current_timestamp, current_timestamp);
+insert into calc_no_manager (result_type, formula_no, indicator_no, rule_no, create_time, modify_time) values (1, 0, 0, 0, current_timestamp, current_timestamp);
 
 CREATE TABLE calc_result(
 	key_id                           bigint               NOT NULL DEFAULT 0                ,
@@ -88,4 +89,27 @@ CREATE TABLE calc_indicator_result(
 	PRIMARY KEY ( key_id )
 );
 
+CREATE TABLE calc_rule_result(
+	key_id                           bigint               NOT NULL DEFAULT 0                ,
+	calc_result_id                   bigint               NOT NULL DEFAULT 0                ,
+	rule_type                        varchar(50)          NOT NULL DEFAULT ''               ,
+	rule_name                        varchar(50)          NOT NULL DEFAULT ''               ,
+	biz_id_code                      varchar(50)          NOT NULL DEFAULT ''               ,
+	display_order                    integer              NOT NULL DEFAULT 0                ,
+	calc_result                      varchar(255)         NOT NULL DEFAULT ''               ,
+	rule_desc                        varchar(255)         NOT NULL DEFAULT 0                ,
+	comment                          varchar(255)         NOT NULL DEFAULT ''               ,
+	create_time                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP,
+	PRIMARY KEY ( key_id )
+);
+
+CREATE TABLE calc_rule_result_param(
+	rule_result_id                   bigint               NOT NULL DEFAULT 0                ,
+	display_order                    integer              NOT NULL DEFAULT 0                ,
+	param_name                       varchar(50)          NOT NULL DEFAULT ''               ,
+	param_value                      varchar(255)         NOT NULL DEFAULT ''               ,
+	create_time                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP,
+	PRIMARY KEY ( rule_result_id, display_order )
+);
+
 -- 公式计算结果管理表(结束)