Browse Source

优化计算结果保存时,keyid的获取逻辑

leichangchun 2 years ago
parent
commit
0e82a777de

+ 3 - 1
src/engine/java/xbc/formula/engine/exp/exec/XbcExpCalculatorExpItv.java

@@ -73,7 +73,7 @@ public class XbcExpCalculatorExpItv {
         for(int k = 0;k < itvs.size();k ++) {
             boolean matched = false;
             XbcExpIntervalVo itv = itvs.get(k);
-            if(itv.token == XbcExpToken.LT_TT || itv.token == XbcExpToken.LEQ_TT || itv.token == XbcExpToken.GT_TT || itv.token == XbcExpToken.GEQ_TT) {
+            if(itv.token == XbcExpToken.LT_TT || itv.token == XbcExpToken.LEQ_TT || itv.token == XbcExpToken.GT_TT || itv.token == XbcExpToken.GEQ_TT || itv.token == XbcExpToken.EQ_TT) {
                 XbcExpResultVo sr = new XbcExpResultVo();
                 calculateExp.calcExp(itv.startExp, sr);
                 if(sr.value != null) {
@@ -86,6 +86,8 @@ public class XbcExpCalculatorExpItv {
                         matched = true;
                     } else if(cr >= 0 && itv.token == XbcExpToken.GEQ_TT) {
                         matched = true;
+                    } else if(cr == 0 && itv.token == XbcExpToken.EQ_TT) {
+                        matched = true;
                     }
                 }
             } else if(itv.startExp == null || itv.endExp == null) {

+ 7 - 3
src/engine/java/xbc/formula/engine/exp/parser/XbcExpParser.java

@@ -147,17 +147,21 @@ public class XbcExpParser {
 		List<XbcExpIntervalVo> itvs = new ArrayList<>();
 		exp.itvs = itvs;
 		while(true) {   // 读取区间列表
-			XbcExpIntervalVo itv = new XbcExpIntervalVo();
-			itvs.add(itv);
 			if(token == XbcExpToken.CLN_TT) {
 				if(exp.rchild != null) {
 					throw new XbcExpParseException("层差表达式里面,只能设置一个默认值。 公式: " + expStr);
 				}
 				match(token);
 				exp.rchild = readAsnExp();
+				if(token == XbcExpToken.RSQB_TT) {
+					match(token);
+					break;
+				}
 				match(XbcExpToken.CMM_TT);
 			}
-			if(token == XbcExpToken.LT_TT || token == XbcExpToken.LEQ_TT || token == XbcExpToken.GT_TT || token == XbcExpToken.GEQ_TT) {
+			XbcExpIntervalVo itv = new XbcExpIntervalVo();
+			itvs.add(itv);
+			if(token == XbcExpToken.LT_TT || token == XbcExpToken.LEQ_TT || token == XbcExpToken.GT_TT || token == XbcExpToken.GEQ_TT || token == XbcExpToken.EQ_TT) {
 				itv.token = token;
 				match(token);
 				itv.startExp = readAsnExp();

+ 5 - 5
src/main/java/xbc/formula/calcmgr/dao/CalcNoManagerDao.java

@@ -1,12 +1,12 @@
 package xbc.formula.calcmgr.dao;
 
-import java.sql.Timestamp;
-
 import org.apache.ibatis.annotations.Param;
 
+import xbc.formula.calcmgr.vo.CalcNoVo;
+
 public interface CalcNoManagerDao {
 
-	long getCurrentNoLock(@Param("resultType") int resultType);
-	
-	void updateCurrentNo(@Param("resultType") int resultType, @Param("noValue") long noValue, @Param("thistime") Timestamp thistime);
+	CalcNoVo getCurrentNoLock(@Param("resultType") int resultType);
+
+	void updateCurrentNo(CalcNoVo cnv);
 }

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

@@ -0,0 +1,10 @@
+package xbc.formula.calcmgr.logic;
+
+import java.sql.Timestamp;
+
+import xbc.formula.calcmgr.vo.CalcNoVo;
+
+public interface CalcNoManagerLogic {
+
+	CalcNoVo getResultId(Timestamp ts, int size);
+}

+ 42 - 0
src/main/java/xbc/formula/calcmgr/logic/impl/CalcNoManagerLogicImpl.java

@@ -0,0 +1,42 @@
+package xbc.formula.calcmgr.logic.impl;
+
+import java.sql.Timestamp;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import xbc.formula.calcmgr.dao.CalcNoManagerDao;
+import xbc.formula.calcmgr.logic.CalcNoManagerLogic;
+import xbc.formula.calcmgr.vo.CalcNoVo;
+
+@Component
+public class CalcNoManagerLogicImpl implements CalcNoManagerLogic {
+
+	private static final int NO_TYPE_FORMULA = 1;
+	
+	@Autowired
+	private CalcNoManagerDao calcNoManagerDao;
+	
+	/**
+	 * 此处通过锁表的行数据来实现id发行,并确保系统内唯一。
+	 * 为了避免锁行时间过长,所以,放在单独的事务里面进行。 
+	 */
+	@Override
+	@Transactional(propagation= Propagation.REQUIRES_NEW)
+	public CalcNoVo getResultId(Timestamp ts, int size) {
+		CalcNoVo cnv = calcNoManagerDao.getCurrentNoLock(NO_TYPE_FORMULA);
+		long baseFormulaId = cnv.getFormulaNo();
+		long baseIndicatorId = cnv.getIndicatorNo();
+		cnv.setFormulaNo(baseFormulaId + 1);
+		cnv.setIndicatorNo(baseIndicatorId + size);
+		cnv.setModifyTime(ts);
+		cnv.setResultType(NO_TYPE_FORMULA);
+		calcNoManagerDao.updateCurrentNo(cnv);
+		cnv.setFormulaNo(baseFormulaId);
+		cnv.setIndicatorNo(baseIndicatorId);
+		return cnv;
+	}
+
+}

+ 7 - 12
src/main/java/xbc/formula/calcmgr/logic/impl/SaveResultLogicImpl.java

@@ -13,11 +13,12 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
 import xbc.formula.calcmgr.dao.CalcIndicatorResultDao;
-import xbc.formula.calcmgr.dao.CalcNoManagerDao;
 import xbc.formula.calcmgr.dao.CalcResultDao;
 import xbc.formula.calcmgr.dao.entity.CalcIndicatorResult;
 import xbc.formula.calcmgr.dao.entity.CalcResult;
+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.fml.vo.XbcFmlFormulaIndicatorVo;
@@ -26,12 +27,8 @@ import xbc.formula.engine.fml.vo.XbcFmlFormulaVo;
 @Component
 public class SaveResultLogicImpl implements SaveResultLogic {
 	
-	private static final int NO_TYPE_FORMULA = 1;
-	
-	private static final int NO_TYPE_INDICATOR = 2;
-
 	@Autowired
-	private CalcNoManagerDao calcNoManagerDao;
+	private CalcNoManagerLogic calcNoManagerLogic;
 	
 	@Autowired
 	private CalcResultDao calcResultDao;
@@ -55,13 +52,11 @@ public class SaveResultLogicImpl implements SaveResultLogic {
 		riv.pos = 1;
 		retrieveIndicators(fv, 0, "", riv);
 		
-		long formulaResultId = calcNoManagerDao.getCurrentNoLock(NO_TYPE_FORMULA);
-		formulaResultId ++;
-		calcNoManagerDao.updateCurrentNo(NO_TYPE_FORMULA, formulaResultId, thistime);
+		CalcNoVo cnv = calcNoManagerLogic.getResultId(thistime, riv.cirs.size());
+		long formulaResultId = cnv.getFormulaNo() + 1;
 		cr.setKeyId(formulaResultId);
-		calcResultDao.save(cr);
-		long baseIndicatorId = calcNoManagerDao.getCurrentNoLock(NO_TYPE_INDICATOR);
 		if(riv.cirs.size() > 0) {
+			long baseIndicatorId = cnv.getIndicatorNo();
 			for(CalcIndicatorResult cir : riv.cirs) {
 				cir.setCalcResultId(formulaResultId);
 				cir.setKeyId(cir.getKeyId() + baseIndicatorId);
@@ -71,8 +66,8 @@ public class SaveResultLogicImpl implements SaveResultLogic {
 				}
 			}
 			saveIndicators(riv.cirs);
-			calcNoManagerDao.updateCurrentNo(NO_TYPE_INDICATOR, baseIndicatorId + riv.cirs.size(), thistime);
 		}
+		calcResultDao.save(cr);
 		responseVo.setCalcResultId(formulaResultId);
 	}
 	

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

@@ -0,0 +1,34 @@
+package xbc.formula.calcmgr.vo;
+
+import java.sql.Timestamp;
+
+public class CalcNoVo {
+	private int resultType;
+	private long formulaNo;
+	private long indicatorNo;
+	private Timestamp modifyTime;
+	public int getResultType() {
+		return resultType;
+	}
+	public void setResultType(int resultType) {
+		this.resultType = resultType;
+	}
+	public long getFormulaNo() {
+		return formulaNo;
+	}
+	public void setFormulaNo(long formulaNo) {
+		this.formulaNo = formulaNo;
+	}
+	public long getIndicatorNo() {
+		return indicatorNo;
+	}
+	public void setIndicatorNo(long indicatorNo) {
+		this.indicatorNo = indicatorNo;
+	}
+	public Timestamp getModifyTime() {
+		return modifyTime;
+	}
+	public void setModifyTime(Timestamp modifyTime) {
+		this.modifyTime = modifyTime;
+	}
+}

+ 2 - 1
src/main/resources/application.properties

@@ -5,4 +5,5 @@ spring.datasource.username=root
 spring.datasource.password=chengdu
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
-mybatis.mapper-locations=classpath:mapper/*.xml
+mybatis.mapper-locations=classpath:mapper/*.xml
+#mybatis.configuration.logImpl=org.apache.ibatis.logging.stdout.StdOutImpl

+ 7 - 5
src/main/resources/mapper/CalcNoManagerMapper.xml

@@ -1,9 +1,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="xbc.formula.calcmgr.dao.CalcNoManagerDao">
 
-    <select id="getCurrentNoLock" resultType="long">
+    <select id="getCurrentNoLock" resultType="xbc.formula.calcmgr.vo.CalcNoVo">
         select
-            no_value
+            formula_no as formulaNo, 
+            indicator_no as indicatorNo
         from
             calc_no_manager
         where
@@ -12,11 +13,12 @@
     </select>
     
     <update id="updateCurrentNo">
-        update 
+        update
             calc_no_manager
         set
-            no_value = #{noValue},
-            modify_time = #{thistime}
+            formula_no = #{formulaNo},
+            indicator_no = #{indicatorNo},
+            modify_time = #{modifyTime}
         where
             result_type = #{resultType}
     </update>

+ 1 - 2
table/reset_ddl.txt

@@ -19,8 +19,7 @@ INSERT INTO `calc_formula` VALUES (1, 1, 'geshui', 'gerensuodeshui', 1, 0, curre
 
 -- 重新设置运行结果id管理表数据
 TRUNCATE TABLE `calc_no_manager`;
-INSERT INTO `calc_no_manager` VALUES (1, 0, current_timestamp(), current_timestamp());
-INSERT INTO `calc_no_manager` VALUES (2, 0, current_timestamp(), current_timestamp());
+insert into calc_no_manager (result_type, formula_no, indicator_no, create_time, modify_time) values (1, 0, 0, current_timestamp(), current_timestamp());
 
 -- 清除公式运算结果表数据
 TRUNCATE TABLE `calc_result`;

+ 4 - 4
table/table_dml.txt

@@ -48,15 +48,15 @@ CREATE TABLE `calc_formula`(
 -- 公式计算结果管理表(开始)
 
 CREATE TABLE `calc_no_manager`(
-    `result_type`                      tinyint(3) unsigned  NOT NULL DEFAULT 0                     COMMENT '结果类型:1: 公式 / 2: 指标',
-    `no_value`                         bigint(19)           NOT NULL DEFAULT 0                     COMMENT '番号',
+    `result_type`                      tinyint(3) unsigned  NOT NULL DEFAULT 0                     COMMENT '结果类型:1: 公式与指标 / 2: 其它',
+    `formula_no`                       bigint(19)           NOT NULL DEFAULT 0                     COMMENT '公式结果id',
+    `indicator_no`                     bigint(19)           NOT NULL DEFAULT 0                     COMMENT '指标结果id',
 	`create_time`                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP     COMMENT '创建时间',
 	`modify_time`                      timestamp            NOT NULL DEFAULT CURRENT_TIMESTAMP     COMMENT '创建时间',
 	PRIMARY KEY ( `result_type` )
 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='运行结果id管理表';
 
-insert into calc_no_manager (result_type, no_value, create_time, modify_time) values (1, 0, current_timestamp(), current_timestamp());
-insert into calc_no_manager (result_type, no_value, create_time, modify_time) values (2, 0, current_timestamp(), current_timestamp());
+insert into calc_no_manager (result_type, formula_no, indicator_no, create_time, modify_time) values (1, 0, 0, current_timestamp(), current_timestamp());
 
 CREATE TABLE `calc_result`(
 	`key_id`                           bigint(19)           NOT NULL DEFAULT 0                     COMMENT '主键',

+ 2 - 1
target/classes/application.properties

@@ -5,4 +5,5 @@ spring.datasource.username=root
 spring.datasource.password=chengdu
 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
 
-mybatis.mapper-locations=classpath:mapper/*.xml
+mybatis.mapper-locations=classpath:mapper/*.xml
+#mybatis.configuration.logImpl=org.apache.ibatis.logging.stdout.StdOutImpl

+ 7 - 5
target/classes/mapper/CalcNoManagerMapper.xml

@@ -1,9 +1,10 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="xbc.formula.calcmgr.dao.CalcNoManagerDao">
 
-    <select id="getCurrentNoLock" resultType="long">
+    <select id="getCurrentNoLock" resultType="xbc.formula.calcmgr.vo.CalcNoVo">
         select
-            no_value
+            formula_no as formulaNo, 
+            indicator_no as indicatorNo
         from
             calc_no_manager
         where
@@ -12,11 +13,12 @@
     </select>
     
     <update id="updateCurrentNo">
-        update 
+        update
             calc_no_manager
         set
-            no_value = #{noValue},
-            modify_time = #{thistime}
+            formula_no = #{formulaNo},
+            indicator_no = #{indicatorNo},
+            modify_time = #{modifyTime}
         where
             result_type = #{resultType}
     </update>