Explorar el Código

1.增加功能:根据t_calculation_info表数据计算准确率
2.计算准确率,先格式化数据(负数设置为0,大于1设置为100)后,再判断是否变为百分比
3.偏差电量公式修改

zhangchenglong hace 2 años
padre
commit
bb450fa6d2

+ 8 - 7
pom.xml

@@ -10,7 +10,7 @@
     </parent>
     <groupId>com.syjy</groupId>
     <artifactId>calculation-spring-boot-starter</artifactId>
-    <version>0.0.13</version>
+    <version>0.0.14</version>
     <!--<version>0.0.13-SNAPSHOT</version>-->
     <name>calculation</name>
     <description>Demo project for Spring Boot</description>
@@ -48,6 +48,13 @@
             <!--<version>1</version>-->
         <!--</dependency>-->
 
+        <!--发布时候放开-->
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <version>2.2.0.RELEASE</version>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+        </dependency>
+
         <!-- druid 连接池 -->
         <dependency>
             <groupId>com.alibaba</groupId>
@@ -107,12 +114,6 @@
             <version>5.4.8.Final</version>
         </dependency>
 
-        <!--发布时候放开-->
-        <dependency>
-            <groupId>com.alibaba.cloud</groupId>
-            <version>2.2.0.RELEASE</version>
-            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
-        </dependency>
     </dependencies>
 
     <distributionManagement>

+ 68 - 0
src/main/java/com/syjy/calculate/conotroller/testCalculate.java

@@ -0,0 +1,68 @@
+package com.syjy.calculate.conotroller;
+import com.syjy.calculate.entity.CalculateRequest;
+import com.syjy.calculate.entity.CalculationInfo;
+import com.syjy.calculate.repository.CalculationFormulaRepository;
+import com.syjy.calculate.service.AccuracyPassRateCalculateService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ *
+ */
+@Controller
+@RequestMapping("/testCalculate")
+public class testCalculate {
+    @Autowired
+    private CalculationFormulaRepository calculationFormulaRepository;
+
+    @Autowired
+    private AccuracyPassRateCalculateService accuracyPassRateCalculateService;
+
+    @ResponseBody
+    @RequestMapping(value = "/test")
+    public String testCalculate() {
+        List<CalculationInfo> calculationInfoList = calculationFormulaRepository.getCalculationInfo();
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        List<List<CalculationInfo>> allList = new ArrayList<>();
+        List<CalculationInfo> newList = new ArrayList<>();
+        for (int i = 0; calculationInfoList.size() > 0; i++) {
+            String dateStr = sdf.format(calculationInfoList.get(0).getGenTime());
+            newList = calculationInfoList.stream().filter(calculation -> sdf.format(calculation.getGenTime()).equals(dateStr)).collect(Collectors.toList());
+            allList.add(newList);
+            calculationInfoList.removeAll(newList);
+        }
+        String show = "";
+        CalculateRequest calculateRequest = new CalculateRequest();
+        calculateRequest.setFormulaType("DAY_SHORT_ACCURACY");
+        calculateRequest.setProvince("E45");
+        calculateRequest.setElectricType("E2");
+        calculateRequest.setStationCode("J00108");
+        calculateRequest.setElectricCapacity(new BigDecimal("49.1"));
+
+        show = "公式:"+calculateRequest.getFormulaType()+ "</br>省份:"+calculateRequest.getProvince()+"</br>风光:"+ calculateRequest.getElectricType()+"</br>容量:"+calculateRequest.getElectricCapacity()+"</br>";
+
+        for(List<CalculationInfo> list : allList){
+            calculateRequest.setCalculationInfoList(list);
+            Map<String,Object> resultMap = accuracyPassRateCalculateService.calculate(calculateRequest);
+            if(resultMap.get("data")!=null){
+                System.out.println(sdf.format(list.get(0).getGenTime())+"短期准确率:"+resultMap.get("data"));
+                show = show+sdf.format(list.get(0).getGenTime())+"短期准确率:"+resultMap.get("data")+"</br>";
+            }else{
+                System.out.println(sdf.format(list.get(0).getGenTime())+"短期准确率:"+resultMap.get("msg"));
+                show = show+sdf.format(list.get(0).getGenTime())+"短期准确率:"+resultMap.get("msg")+"</br>";
+            }
+
+        }
+        return show;
+    }
+
+}

+ 0 - 1
src/main/java/com/syjy/calculate/entity/CalculationInfo.java

@@ -24,7 +24,6 @@ public class CalculationInfo implements Serializable  {
      */
     private long time;
 
-
     /**
      * 预测数据生成时间
      */

+ 9 - 0
src/main/java/com/syjy/calculate/repository/CalculationFormulaRepository.java

@@ -1,6 +1,7 @@
 package com.syjy.calculate.repository;
 
 import com.syjy.calculate.entity.CalculationFormula;
+import com.syjy.calculate.entity.CalculationInfo;
 import org.springframework.stereotype.Repository;
 import java.util.List;
 
@@ -69,4 +70,12 @@ public interface CalculationFormulaRepository {
     CalculationFormula findAssessmentByTypeAndProvince(String type, String formulaType,String province,String electricType,String stationCode);
 
 
+    /**
+     * 查询导入的计算准确率数据
+     *
+     * @return 返回记录
+     */
+    List<CalculationInfo> getCalculationInfo();
+
+
 }

+ 16 - 0
src/main/java/com/syjy/calculate/repository/repositoryImpl/CalculationFormulaRepositoryImpl.java

@@ -4,6 +4,7 @@ import com.googlecode.aviator.AviatorEvaluator;
 import com.syjy.calculate.config.StarterProperties;
 import com.syjy.calculate.entity.CalculateResult;
 import com.syjy.calculate.entity.CalculationFormula;
+import com.syjy.calculate.entity.CalculationInfo;
 import com.syjy.calculate.repository.CalculationFormulaRepository;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -350,6 +351,21 @@ public class CalculationFormulaRepositoryImpl implements CalculationFormulaRepos
     }
 
     /**
+     * 获取测试数据
+     */
+    @Override
+    public List<CalculationInfo> getCalculationInfo() {
+        String sql = "SELECT * FROM `t_calculation_info`";
+        List<CalculationInfo> list = new ArrayList<>();
+        try {
+            list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(CalculationInfo.class));
+            return list;
+        } catch (EmptyResultDataAccessException ere) {
+            return null;
+        }
+    }
+
+    /**
      * 创建表
      */
     private void createTable() {

+ 32 - 20
src/main/java/com/syjy/calculate/service/AccuracyPassRateCalculateService.java

@@ -63,6 +63,9 @@ public class AccuracyPassRateCalculateService {
         if (calculationFormula.getDataSourceType() != null) {
             List<List<Map<String, Object>>> groupingList = groupingList(checkedData, calculationFormula.getDataSourceType());
             env.put(CalculateResult.LIST, groupingList);
+            if(groupingList==null || groupingList.size()==0){
+                return CalculateResult.error(CalculateResult.MSG_CALCULATE_DATA_NULL);
+            }
         } else {
             env.put(CalculateResult.LIST, checkedData);
         }
@@ -73,25 +76,27 @@ public class AccuracyPassRateCalculateService {
 
         // 获取最大开机容量
         List<CalculationInfo> calculationInfoList = calculateRequest.getCalculationInfoList();
-        calculationInfoList.sort(Comparator.comparing(CalculationInfo::getOpenCapacity).reversed());
-        BigDecimal maxOpenCapacity = calculationInfoList.get(0).getOpenCapacity();
+        BigDecimal maxOpenCapacity = calculateRequest.getElectricCapacity();
+        // 如果数据不为空,获取最大开机容量
+        if(calculationInfoList!=null && calculationInfoList.size()>0){
+            calculationInfoList.sort(Comparator.comparing(CalculationInfo::getOpenCapacity).reversed());
+            maxOpenCapacity = calculationInfoList.get(0).getOpenCapacity();
+        }
         env.put(CalculateResult.MAX_OPEN_CAPACITY, maxOpenCapacity);
 
-        Map<String, Object> calculateRequestMap = new HashMap<>();
-        // bean 转map
-        BeanMap beanMap = BeanMap.create(calculateRequest);
-        for (Object key : beanMap.keySet()) {
-            calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
-        }
+//        Map<String, Object> calculateRequestMap = new HashMap<>();
+//        // bean 转map
+//        BeanMap beanMap = BeanMap.create(calculateRequest);
+//        for (Object key : beanMap.keySet()) {
+//            calculateRequestMap.put(String.valueOf(key), beanMap.get(key));
+//        }
+
         // 执行计算并得出结果
         try {
             // 获取计算结果
             Object executeResult = AviatorEvaluator.getInstance().getCachedExpressionByKey(scriptName).execute(env);
-            String result = String.valueOf(executeResult);
             // 过滤计算结果
-            if (calculationFormula.getIsRate().equals(CalculateResult.STR_TRUE)) {
-                result = filterResult(executeResult);
-            }
+            String result = filterResult(executeResult,calculationFormula.getIsRate());
             return CalculateResult.success(CalculateResult.MSG_CALCULATE_SUCCESS, result);
         } catch (Exception e) {
             e.printStackTrace();
@@ -105,9 +110,9 @@ public class AccuracyPassRateCalculateService {
      * @param result 过滤前的结果
      * @return 过滤后的结果
      */
-    private String filterResult(Object result) {
+    private String filterResult(Object result,String type) {
         // 如果返回的不是数值类型,则不用过滤,直接返回
-        if ((result instanceof String) || (result instanceof Boolean)) {
+        if ((result instanceof String) || (result instanceof Boolean)|| (result instanceof HashMap)) {
             return String.valueOf(result);
         }
         BigDecimal resultBig = new BigDecimal(String.valueOf(result));
@@ -121,12 +126,18 @@ public class AccuracyPassRateCalculateService {
             log.warn("结果大于100%:" + resultBig + "自动转换为100%");
             resultBig = BigDecimal.ONE;
         }
-        // 对数据*100
-        resultBig = resultBig.multiply(CalculateResult.ONE_HUNDRED);
-        // 对数据进行四舍五入
-        resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
-        // 数据加上百分号
-        return resultBig + CalculateResult.PERCENT;
+
+        // 如果公式结果为带百分号
+        if (type != null && type.equals(CalculateResult.STR_TRUE)) {
+            // 对数据*100
+            resultBig = resultBig.multiply(CalculateResult.ONE_HUNDRED);
+            // 对数据进行四舍五入
+            resultBig = resultBig.setScale(2, BigDecimal.ROUND_HALF_UP);
+            // 数据加上百分号
+            return resultBig + CalculateResult.PERCENT;
+        }
+
+        return resultBig.toString();
     }
 
     /**
@@ -232,6 +243,7 @@ public class AccuracyPassRateCalculateService {
                 // 如果返回结果是忽略,则结束本次循环
                 if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.IGNORE)) {
                     continue;
+
                     // 如果返回错误,直接返回结果
                 } else if (String.valueOf(checkResult.get(CalculateResult.CODE_TAG)).equals(CalculateResult.ERROR)) {
                     String resultValue = String.valueOf(checkResult.get(CalculateResult.DATA_TAG));

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 3 - 3
src/main/resources/sql/t_calculation_formula.sql


Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio