Просмотр исходного кода

修改建表逻辑,语句都在sql文件中执行

zhangchenglong 2 лет назад
Родитель
Сommit
c14d3a4b34

+ 21 - 9
src/main/java/com/syjy/calculate/conotroller/test.java

@@ -5,6 +5,7 @@ import com.syjy.calculate.service.AccuracyPassRateCalculateService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+
 import java.math.BigDecimal;
 import java.util.*;
 
@@ -18,21 +19,32 @@ public class test {
     public void saveElectricField() {
 
         List<Map<String, Object>> powerData = new ArrayList<>();
-        Random rd = new Random();
-        for (int i = 0; i < 4; i++) {
-            Map<String, Object> dataText = new HashMap<>();
-            dataText.put("sj", new BigDecimal(rd.nextInt(10)));
-            dataText.put("yc", new BigDecimal(rd.nextInt(10)));
-            powerData.add(dataText);
-        }
+        Map<String, Object> dataText0 = new HashMap<>();
+        dataText0.put("sj", new BigDecimal(8));
+        dataText0.put("yc", new BigDecimal(7));
+        powerData.add(dataText0);
+        Map<String, Object> dataText1 = new HashMap<>();
+        dataText1.put("sj", new BigDecimal(9));
+        dataText1.put("yc", new BigDecimal(7));
+        powerData.add(dataText1);
+
+        Map<String, Object> dataText2 = new HashMap<>();
+        dataText2.put("sj", new BigDecimal(5));
+        dataText2.put("yc", new BigDecimal(6));
+        powerData.add(dataText2);
+
+        Map<String, Object> dataText3 = new HashMap<>();
+        dataText3.put("sj", new BigDecimal(8));
+        dataText3.put("yc", new BigDecimal(8));
+        powerData.add(dataText3);
 
         BigDecimal rl = new BigDecimal("10");
         String provinceEnum = "E62";
         String type = "POINT_S";
-        JSONObject jsonResult = accuracyPassRateCalculateService.calculate(powerData, rl, provinceEnum, type);
+        JSONObject jsonResult = accuracyPassRateCalculateService.calculate(powerData, rl, provinceEnum, type, BigDecimal.ZERO);
         String reslut = jsonResult.getString("value");
         String accuracy = "";
-        if("success".equals(reslut)){
+        if ("success".equals(reslut)) {
             accuracy = jsonResult.getString("value");
         }
     }

+ 1 - 5
src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java

@@ -3,18 +3,14 @@ package com.syjy.calculate.repository.repositoryImpl;
 import com.syjy.calculate.entity.CalculationFormula;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.io.FileUtils;
 import org.springframework.dao.DataAccessException;
 import org.springframework.jdbc.core.BeanPropertyRowMapper;
 import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.ResultSetExtractor;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ClassUtils;
 import javax.annotation.Resource;
 import java.io.*;
 import java.net.URL;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -32,7 +28,7 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
     public void createTable() {
         try {
             // 获取初始化公式表sql
-            String path = "sql/test.sql";
+            String path = "sql/t_calculation_formula.sql";
             // 用ClassLoader获取jar包中的文件,获取文件流
             ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
             assert defaultClassLoader != null;

+ 25 - 8
src/main/java/com/syjy/calculate/service/AccuracyPassRateCalculateService.java

@@ -7,6 +7,7 @@ import com.syjy.calculate.repository.CalculationFormulaRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
 import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.HashMap;
@@ -25,6 +26,7 @@ import java.util.Map;
 public class AccuracyPassRateCalculateService {
     BigDecimal ZERO = new BigDecimal("0");
     BigDecimal HUNDRED = new BigDecimal("100");
+    String PASS = "PASS";
     @Autowired
     private CalculationFormulaRepository calculationFormulaRepository;
 
@@ -33,14 +35,14 @@ public class AccuracyPassRateCalculateService {
      * @param rl           容量
      * @param provinceEnum 省调
      * @param type         短期、超短期
+     * @param compare      通过率对比系数
      * @return 返回Json  result:fail/success  value: 99%  msg:失败及原因
      */
-    public JSONObject calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type) {
+    public JSONObject calculate(List<Map<String, Object>> powerData, BigDecimal rl, String provinceEnum, String type, BigDecimal compare) {
         JSONObject jsonResult = new JSONObject();
-        String lastResult = "";
         jsonResult.put("result", "fail");
         // 获取公式
-        List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(type,provinceEnum);
+        List<CalculationFormula> calculationFormulaList = getCalculationFormulaData(type, provinceEnum);
         if (calculationFormulaList == null || calculationFormulaList.size() == 0) {
             jsonResult.put("msg", "计算失败,未匹配到公式");
             return jsonResult;
@@ -67,8 +69,23 @@ public class AccuracyPassRateCalculateService {
                     dataMap.put("rl", rl);
                     dataMap.put("count", count);
                     try {
+                        BigDecimal thisResult = new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap)));
+                        // 如果是通过率计算
+                        if (this.PASS.equals(type)) {
+                            // 如果对比系数是0,返回计算失败
+                            if (compare.compareTo(this.ZERO) == 0) {
+                                jsonResult.put("msg", "计算失败,通过率计算,对比系数不可为0");
+                                return jsonResult;
+                            }
+                            // 计算结果>=对比系数,则为100,否则为0
+                            if (thisResult.compareTo(compare) > -1) {
+                                thisResult = this.HUNDRED;
+                            } else {
+                                thisResult = this.ZERO;
+                            }
+                        }
                         // 求和计算 AviatorEvaluator.execute(公式,公式中的参数及值(以Map形式存放))
-                        formulaResult = formulaResult.add(new BigDecimal(String.valueOf(AviatorEvaluator.execute(formula, dataMap))));
+                        formulaResult = formulaResult.add(thisResult);
                     } catch (Exception e) {
                         e.printStackTrace();
                         log.error("计算公式:" + formula + "错误:" + e.toString());
@@ -76,7 +93,7 @@ public class AccuracyPassRateCalculateService {
                         return jsonResult;
                     }
                 }
-                // 非求和计算
+            // 非求和计算
             } else {
                 if (powerData.size() > 0) {
                     // 获取数据
@@ -101,7 +118,7 @@ public class AccuracyPassRateCalculateService {
             log.info("result" + calculationFormula.getOrder() + ":" + formulaResult);
         }
         // 获取最后一个公式计算的结果
-        lastResult = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
+        String lastResult = String.valueOf(resultMap.get("result" + calculationFormulaList.size()));
         if (lastResult == null) {
             jsonResult.put("msg", "计算失败,结果为空");
             return jsonResult;
@@ -124,10 +141,10 @@ public class AccuracyPassRateCalculateService {
      * @param type 类型
      * @return
      */
-    public List<CalculationFormula> getCalculationFormulaData(String type,String provinceEnum) {
+    public List<CalculationFormula> getCalculationFormulaData(String type, String provinceEnum) {
         List<CalculationFormula> calculationFormulaList = new ArrayList<>();
         // 根据类型从数据库中查出公式列表
-        calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(type,provinceEnum);
+        calculationFormulaList = calculationFormulaRepository.findByTypeAndProvince(type, provinceEnum);
         return calculationFormulaList;
     }
 

+ 12 - 10
src/main/resources/sql/test.sql → src/main/resources/sql/t_calculation_formula.sql

@@ -11,7 +11,7 @@
  Target Server Version : 80029
  File Encoding         : 65001
 
- Date: 17/08/2022 16:04:06
+ Date: 18/08/2022 14:44:31
 */
 
 SET NAMES utf8mb4;
@@ -23,15 +23,15 @@ SET FOREIGN_KEY_CHECKS = 0;
 DROP TABLE IF EXISTS `t_calculation_formula`;
 CREATE TABLE `t_calculation_formula`  (
   `ID` int(0) NOT NULL AUTO_INCREMENT,
-  `TYPE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `ORDER` int(0) NULL DEFAULT NULL,
-  `FORMULA` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
-  `PROVINCE_ENUM` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `STATE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `CREATE_TIME` datetime(0) NULL DEFAULT NULL,
-  `CREATOR` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `LAST_MODIFIER` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
-  `LAST_MODIFY_TIME` datetime(0) NULL DEFAULT NULL,
+  `TYPE` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '公式类型',
+  `ORDER` int(0) NULL DEFAULT NULL COMMENT '公式执行顺讯',
+  `FORMULA` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '公式内容',
+  `PROVINCE_ENUM` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '省调',
+  `STATE` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '状态: 0 失效    1 有效',
+  `CREATE_TIME` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+  `CREATOR` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '创建人',
+  `LAST_MODIFIER` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '修改时间',
+  `LAST_MODIFY_TIME` datetime(0) NULL DEFAULT NULL COMMENT '修改人',
   PRIMARY KEY (`ID`) USING BTREE
 ) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
 
@@ -55,5 +55,7 @@ INSERT INTO `t_calculation_formula` VALUES (14, 'RMSE_R', 1, 'sum:math.pow((sj-y
 INSERT INTO `t_calculation_formula` VALUES (15, 'RMSE_R', 2, '(1-math.sqrt((result1/count)))*100', 'E32;E33;E34', NULL, NULL, NULL, NULL, NULL);
 INSERT INTO `t_calculation_formula` VALUES (16, 'RMSE_S', 1, 'sum:math.pow((sj-yc),2)', 'E22;E23;E36;E37;E42;E43;E44;E45;E51;E62;', NULL, NULL, NULL, NULL, NULL);
 INSERT INTO `t_calculation_formula` VALUES (17, 'RMSE_S', 2, '(1-(result1/rl*math.sqrt(count)))*100', 'E22;E23;E36;E37;E42;E43;E44;E45;E51;E62;', NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (18, 'PASS', 1, 'sum:(1-math.abs((sj-yc)/rl)*100', 'E14;E15;E21;E22;E23;E23Old;E61;', NULL, NULL, NULL, NULL, NULL);
+INSERT INTO `t_calculation_formula` VALUES (19, 'PASS', 2, 'result1/count', 'E14;E15;E21;E22;E23;E23Old;E61;', NULL, NULL, NULL, NULL, NULL);
 
 SET FOREIGN_KEY_CHECKS = 1;