Browse Source

Merge branch 'master' of http://124.70.43.205:3000/xieshengjie/sis-background into yiqu

xushili 2 years ago
parent
commit
394278e321
33 changed files with 1039 additions and 261 deletions
  1. 9 1
      power-fitting/pom.xml
  2. 64 44
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java
  3. 26 7
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/WindDirectionALG.java
  4. 6 1
      power-fitting/src/main/java/com/gyee/power/fitting/common/config/GyeeConfig.java
  5. 0 26
      power-fitting/src/main/java/com/gyee/power/fitting/common/constants/Constants.java
  6. 32 0
      power-fitting/src/main/java/com/gyee/power/fitting/common/feign/FeignsBuilder.java
  7. 26 0
      power-fitting/src/main/java/com/gyee/power/fitting/common/feign/IDataAdapter.java
  8. 48 0
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/AgcDeviateController.java
  9. 16 5
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataFittingController.java
  10. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/RatioController.java
  11. 13 0
      power-fitting/src/main/java/com/gyee/power/fitting/mapper/AgcDeviateMapper.java
  12. 92 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/AgcDeviateModel.java
  13. 14 2
      power-fitting/src/main/java/com/gyee/power/fitting/model/Powerfittinganalysis.java
  14. 48 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AgcDeviateConfig.java
  15. 33 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AgcDeviateTag.java
  16. 56 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AiPoints.java
  17. 35 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/agc/PointData.java
  18. 75 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/anno/AnnotationTool.java
  19. 18 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/anno/Desc.java
  20. 22 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/anno/FixedVo.java
  21. 18 9
      power-fitting/src/main/java/com/gyee/power/fitting/model/custom/PowerFittingPoint.java
  22. 30 12
      power-fitting/src/main/java/com/gyee/power/fitting/model/custom/PowerPointData.java
  23. 4 29
      power-fitting/src/main/java/com/gyee/power/fitting/model/custom/TableTitle.java
  24. 191 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/AgcDeviateService.java
  25. 108 59
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java
  26. 11 9
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java
  27. 13 29
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java
  28. 5 2
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fx/WindDirectionService.java
  29. 10 12
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ratio/RatioService.java
  30. 5 11
      power-fitting/src/main/resources/application.yaml
  31. BIN
      power-fitting/src/main/resources/gdnx.db
  32. 6 2
      power-fitting/src/main/resources/mapper/PowerfittinganalysisMapper.xml
  33. 4 0
      power-fitting/src/main/resources/readme.md

+ 9 - 1
power-fitting/pom.xml

@@ -34,7 +34,15 @@
             <version>3.1.1</version>
         </dependency>
 
-<!--        <dependency>-->
+        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-jpa</artifactId>
+            <version>2.7.4</version>
+        </dependency>
+
+
+        <!--        <dependency>-->
 <!--            <groupId>com.oracle</groupId>-->
 <!--            <artifactId>ojdbc6</artifactId>-->
 <!--            <version>11.2.0.3</version>-->

+ 64 - 44
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java

@@ -3,11 +3,10 @@ package com.gyee.power.fitting.common.alg;
 import com.gyee.power.fitting.model.custom.LineCurveFitting;
 import com.gyee.power.fitting.model.custom.Point;
 import com.gyee.power.fitting.model.custom.PointVo;
+import com.gyee.power.fitting.model.custom.PowerPointData;
 
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.LinkedHashSet;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -284,11 +283,11 @@ public class PowerFittingALG {
             double count = 0;
             double sum = 0;
             for (Point point : points1){
-                List<Point> list = points2.stream().filter(it -> it.getX() == point.getX()).collect(Collectors.toList());
-                if (list.size() > 0){
-                    sum += Math.pow(point.getY() - list.get(0).getY(), 2);
+                Optional<Point> p = points2.stream().filter(it -> it.getX() == point.getX()).findFirst();
+                if (p.isPresent()){
+                    sum += Math.pow(point.getY() - p.get().getY(), 2);
                     count ++;
-                    pc += point.getY() - list.get(0).getY();
+                    pc += point.getY() - p.get().getY();
                 }
             }
             sum = Math.sqrt(sum);
@@ -307,12 +306,11 @@ public class PowerFittingALG {
      * @param points1 风速功率数组
      * @param points2 风速功率数组(保证功率)
      * @param maxp  区间内的最大保证功率
-     * @param speed 最小风速
+     * @param mins 最小风速
+     * @param maxs 最大风速
      * @return
      */
-    public static double curveDeviationRatio2(List<Point> points1, List<Point> points2, double maxp, double speed) {
-        double minSpeed = speed;
-        double maxSpeed = minSpeed + 1;
+    public static double curveDeviationRatio2(List<Point> points1, List<Point> points2, double maxp, double mins, double maxs) {
         double result = -0;
         double pc = 0;
         if (points1 != null && points1.size() > 0 && points2 != null && points2.size() > 0)
@@ -320,11 +318,11 @@ public class PowerFittingALG {
             double count = 0;
             double sum = 0;
             for (Point point : points1){
-                List<Point> list = points2.stream().filter(it -> it.getX() == point.getX()).collect(Collectors.toList());
-                if (list.size() > 0 && list.get(0).getX() >= minSpeed && list.get(0).getX() < maxSpeed){
-                    sum += Math.pow(point.getY() - list.get(0).getY(), 2);
+                Optional<Point> p = points2.stream().filter(it -> it.getX() == point.getX()).findFirst();
+                if (p.isPresent() && p.get().getX() >= mins && p.get().getX() < maxs){
+                    sum += Math.pow(point.getY() - p.get().getY(), 2);
                     count ++;
-                    pc += point.getY() - list.get(0).getY();
+                    pc += point.getY() - p.get().getY();
                 }
             }
             sum = Math.sqrt(sum);
@@ -343,21 +341,23 @@ public class PowerFittingALG {
      * 对风偏差散点过滤  统计-5050
      *
      * @param list
+     *
+     *
      * @return
      */
-    public static List<Point> windDeviationScatter(List<PointVo> list){
+    public static List<Point> windDeviationScatter(List<PowerPointData> list){
         //正负偏差 [-50,-49,....,0,1,2,.....50]
         List<Point> ls = new ArrayList<>();
         LinkedHashSet<Double> keys = new LinkedHashSet<>();  //散点太多去重
         //次数统计
         for (int i = 0; i < list.size(); i++){
-            PointVo item = list.get(i);
-            int ele = (int)Math.round((item.getX() + Math.abs(item.getY())));
+            PowerPointData item = list.get(i);
+            int ele = (int)Math.round((item.getFx() + Math.abs(item.getDfwc())));
             int index = ele - 180;
             if (index >= -50 && index <= 50) {
-                double key = Math.abs(index) + item.getS();
+                double key = Math.abs(index) + item.getSpeed();
                 if (!keys.contains(key))
-                    ls.add(new Point(index, item.getS()));
+                    ls.add(new Point(index, item.getSpeed()));
                 keys.add(key);
             }
         }
@@ -367,29 +367,50 @@ public class PowerFittingALG {
 
 
     /**
-     * 对风偏差散点过滤  统计-5050
-     * 数据为二维数组 内层数组为3项. 第一项表示Y轴索引,  第二项代表X轴的索引 第三项代表value值.
-     * @param list
+     * 静态偏航对风分析
+     * 对风偏差散点过滤  统计-1515的  正负偏差 [-15,-14,....,0,1,2,.....15]
+     * 数据为二维数组 内层数组为3项. 第一项表示Y轴索引(风速),  第二项代表X轴的索引(正负偏差) 第三项代表value值.
+     * @param points
      * @return
      */
-    public static int[][] windDeviationPoint(List<PointVo> list){
-        //正负偏差 [-50,-49,....,0,1,2,.....50]
-        int[][] ints = new int[101][3];
-        //次数统计
+    public static List<Object> windDeviationPoint(List<PowerPointData> points){
+        List<PowerPointData> list = new ArrayList<>();
+        List<Object> result = new ArrayList<>();
+        Map<Integer, double[]> map = new LinkedHashMap<>();
+
+        //过滤对风偏差
+        for (int i = 0; i < points.size(); i++){
+            PowerPointData item = points.get(i);
+            if (item.getSpeed() < 4.5 || item.getSpeed() >= 10.5)
+                continue;
+
+            list.add(item);
+            Integer speed = Math.toIntExact(Math.round(item.getSpeed()));
+            if (!map.containsKey(speed))
+                map.put(speed, new double[2]);  //[0]最小值 [1]最大值
+
+            double[] value = map.get(speed);
+            double power = item.getPower() < 0 ? 0 : item.getPower();
+            value[0] = power < value[0] ? power : value[0]; //最小值
+            value[1] = power > value[1] ? power : value[1]; //最小值
+        }
+
+        DecimalFormat sf = new DecimalFormat("0.00");
         for (int i = 0; i < list.size(); i++){
-            PointVo item = list.get(i);
-            int ele = (int)Math.round((item.getX() + Math.abs(item.getY())));
+            PowerPointData item = list.get(i);
+            Integer speed = Math.toIntExact(Math.round(item.getSpeed()));
+            int ele = (int) (Math.abs(item.getFx()) + Math.abs(item.getAngle()));
             int index = ele - 180;
-            if (index >= -50 && index <= 50) {
-                int x = 50 - (index > 0 ? -index : Math.abs(index)); //[-50,-49,-48,....50]
-                int y = (int)Math.round(item.getS()) > 25 ? 25 : (int)Math.round(item.getS()); //风速[0,1,2,.....25]
-                ints[x][0] = y;
-                ints[x][1] = x;
-                ints[x][2] = 10;
+            if (index >= -15 && index <= 15) {
+                double[] value = map.get(speed);
+                double v = (item.getPower() - value[0]) / (value[1] - value[0]);
+                double s[] = {speed, index, Double.valueOf(sf.format(v)).doubleValue()};
+                result.add(s);
             }
         }
 
-        return ints;
+
+        return result;
     }
 
 
@@ -398,12 +419,12 @@ public class PowerFittingALG {
      * @param list
      * @return
      */
-    public static int[] windDeviationRatio(List<PointVo> list){
+    public static int[] windDeviationRatio(List<PowerPointData> list){
         int[] pc = new int[101];  //正负偏差 [-50,-49,....,0,1,2,.....50]
         //次数统计
         for (int i = 0; i < list.size(); i++){
-            PointVo item = list.get(i);
-            int ele = (int) (Math.abs(item.getX()) + Math.abs(item.getY()));
+            PowerPointData item = list.get(i);
+            int ele = (int) (Math.abs(item.getFx()) + Math.abs(item.getDfwc()));
             int index = ele - 180;
             if (index >= -50 && index <= 50)
                 pc[50-(index > 0 ? -index : Math.abs(index))]++;
@@ -412,12 +433,11 @@ public class PowerFittingALG {
         return pc;
     }
 
+
     public static void main(String[] args){
-        StringBuilder sb = new StringBuilder();
-        for (int i = -50; i < 101; i++){
-            sb.append("'").append(i).append("',");
-        }
-        System.out.println(sb.toString());
+        double s =  4.53;
+        Integer speed = Math.toIntExact(Math.round(s));
+        System.out.println(speed);
     }
 
 }

+ 26 - 7
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/WindDirectionALG.java

@@ -21,9 +21,10 @@ public class WindDirectionALG {
         int[][] count = new int[11][16];
 
         list.stream().forEach(item -> {
-            int fx = windFXAngle(item.getFX());
+            int fx = windFXAngle(item.getFx());
             int speed = windSpeed(item.getSpeed());
-            count[speed][fx] = 1;
+            if (speed < 11 && fx < 16)
+                count[speed][fx] = 1;
         });
 
         return count;
@@ -38,9 +39,10 @@ public class WindDirectionALG {
     public static int[][] fxCountRoses(List<PowerPointData> list){
         int[][] count = new int[11][16];
         list.stream().sorted(Comparator.comparing(PowerPointData::getSpeed)).forEach(item -> {
-            int fx = windFXAngle(item.getFX());
+            int fx = windFXAngle(item.getFx());
             int speed = windSpeed(item.getSpeed());
-            count[speed][fx] ++;
+            if (speed < 11 && fx < 16)
+                count[speed][fx] ++;
         });
 
         return count;
@@ -53,10 +55,10 @@ public class WindDirectionALG {
      * @return
      */
     public static int[] fxRadarRoses(List<PowerPointData> list){
-        int[] count = new int[16];
+        int[] count = new int[32];
         list.stream().sorted(Comparator.comparing(PowerPointData::getSpeed)).forEach(item -> {
-            int fx = windFXAngle(item.getFX());
-            count[fx] ++;
+            int df = windDFAngle(item.getDfwc());
+            count[df] ++;
         });
 
         return count;
@@ -80,6 +82,23 @@ public class WindDirectionALG {
     }
 
     /**
+     * 对风角度计算
+     * 0:0-22.5
+     * 1:22.5-45
+     * 2:90-135
+     * .。。。。。。
+     * @param
+     * @return params: 0,1,2。。。。。15
+     */
+    private static int windDFAngle(double angle){
+        int split = 32;  //风向分为16个角度
+        double interval = (double)360 / split;
+        angle = angle > 360 ? 720 - 360 : angle;
+        int index = (int) (Math.abs(angle) / interval);
+        return index;
+    }
+
+    /**
      * 风速区域划分
      * @param speed
      * @return

+ 6 - 1
power-fitting/src/main/java/com/gyee/power/fitting/common/config/GyeeConfig.java

@@ -6,6 +6,7 @@ import org.springframework.boot.system.ApplicationHome;
 import org.springframework.stereotype.Component;
 
 import java.io.File;
+import java.util.Arrays;
 import java.util.List;
 
 @Data
@@ -30,10 +31,14 @@ public class GyeeConfig {
     /** 数据压缩下载 **/
     private String filePathDownload;
     /** 功率曲线拟合测点 **/
-    private List<String> points;
+    private String points;
     /** 适配器读取数据等间隔时间 **/
     private Integer interval;
 
+    public List<String> getPoints() {
+        return Arrays.asList(this.points.split(","));
+    }
+
     public String getFilePathPrepare() {
         return jarF.getParentFile().getAbsolutePath() + "\\" + filePathPrepare;
     }

+ 0 - 26
power-fitting/src/main/java/com/gyee/power/fitting/common/constants/Constants.java

@@ -1,8 +1,5 @@
 package com.gyee.power.fitting.common.constants;
 
-import java.util.ArrayList;
-import java.util.List;
-
 public class Constants {
 
     // 数据准备  标记
@@ -13,27 +10,4 @@ public class Constants {
 
     // 数据处理完  标记
     public static final String DATA_FITTING = "fitting";
-
-    // 数据表头
-    public static final List<String> TABLE_TITLE = new ArrayList<>();
-
-    // 拟合后的数据表头
-    public static final List<String> FITTING_TITLE = new ArrayList<>();
-
-
-    static {
-        TABLE_TITLE.add("时间");
-        TABLE_TITLE.add("风机功率");
-        TABLE_TITLE.add("风机风速");
-        TABLE_TITLE.add("发电机转速");
-        TABLE_TITLE.add("风机状态");
-        TABLE_TITLE.add("风机电量");
-        TABLE_TITLE.add("欠发状态");
-        TABLE_TITLE.add("风向");
-        TABLE_TITLE.add("对风角度");
-
-        FITTING_TITLE.add("风速");
-        FITTING_TITLE.add("拟合功率");
-        FITTING_TITLE.add("Cp值");
-    }
 }

+ 32 - 0
power-fitting/src/main/java/com/gyee/power/fitting/common/feign/FeignsBuilder.java

@@ -0,0 +1,32 @@
+package com.gyee.power.fitting.common.feign;
+
+import feign.Feign;
+import feign.Request;
+import feign.Retryer;
+import feign.jackson.JacksonDecoder;
+import feign.jackson.JacksonEncoder;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * @author xysn
+ */
+@Configuration
+public class FeignsBuilder {
+    /**
+     * 数据适配器url
+     */
+    @Value("${gyee.adapter-url:http://192.168.101.8:8011}")
+    private String adapterUrl;
+
+    @Bean
+    public IDataAdapter dataAdapter() {
+        return Feign.builder()
+                .encoder(new JacksonEncoder())
+                .decoder(new JacksonDecoder())
+                .options(new Request.Options(1000, 100000))
+                .retryer(new Retryer.Default(5000, 5000, 3))
+                .target(IDataAdapter.class, adapterUrl);
+    }
+}

+ 26 - 0
power-fitting/src/main/java/com/gyee/power/fitting/common/feign/IDataAdapter.java

@@ -0,0 +1,26 @@
+package com.gyee.power.fitting.common.feign;
+
+import com.gyee.power.fitting.model.agc.PointData;
+import feign.Param;
+import feign.RequestLine;
+
+import java.util.List;
+
+/**
+ * DataAdapter数据请求
+ */
+public interface IDataAdapter {
+    /**
+     * 获取等间隔历史数据
+     *
+     * @param tagName  测点名称
+     * @param startTs  开始时间
+     * @param endTs    结束时间
+     * @param interval 数据间隔
+     * @return 历史数据
+     */
+    @RequestLine("GET /ts/history/snap?tagName={tagName}&startTs={startTs}&endTs={endTs}&interval={interval}")
+    List<PointData> getSnapValuesByKey(@Param(value = "tagName") String tagName, @Param(value = "startTs") long startTs,
+                                       @Param(value = "endTs") long endTs, @Param(value = "interval") int interval);
+}
+

+ 48 - 0
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/AgcDeviateController.java

@@ -0,0 +1,48 @@
+package com.gyee.power.fitting.controller.analyse;
+
+import com.gyee.power.fitting.model.agc.AgcDeviateTag;
+import com.gyee.power.fitting.service.custom.curve.AgcDeviateService;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 获取各个场站AGC偏差分析数据
+ */
+@RestController
+@RequestMapping("/agc")
+public class AgcDeviateController {
+    @Resource
+    private AgcDeviateService agcDeviateService;
+
+    /**
+     * 获取偏差信息
+     *
+     * @param startTs  开始时间
+     * @param endTs    结束时间
+     * @param id       场站id
+     * @param interval 时间间隔
+     * @return
+     */
+    @GetMapping("/deviate")
+    public List<AgcDeviateTag> getData(@RequestParam(value = "startTs") long startTs,
+                                       @RequestParam(value = "endTs") long endTs,
+                                       @RequestParam(value = "id") String id,
+                                       @RequestParam(value = "interval", defaultValue = "60", required = false) int interval) {
+        return agcDeviateService.getAgcDeviateTags(id, startTs, endTs, interval);
+    }
+
+    /**
+     * 获取配置
+     *
+     * @return
+     */
+    @GetMapping("/config")
+    public Object getAgcConifg() {
+        return agcDeviateService.getConfig();
+    }
+}

+ 16 - 5
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataFittingController.java

@@ -107,11 +107,11 @@ public class DataFittingController {
      * @param id 曲线拟合的id
      * @return
      */
-    @GetMapping("curve/ratio")
-    public JSONObject dataCurveRatio(String id){
-        Map<String, Double> map = fittingService.dataCurveRatio(id);
-        return JsonResult.successData(ResultCode.SUCCESS, map);
-    }
+//    @GetMapping("curve/ratio")
+//    public JSONObject dataCurveRatio(String id){
+//        Map<String, Double> map = fittingService.dataCurveRatio(id);
+//        return JsonResult.successData(ResultCode.SUCCESS, map);
+//    }
 
 
     /**
@@ -124,4 +124,15 @@ public class DataFittingController {
         Object o = fittingService.dataFittingLine(ids);
         return JsonResult.successData(ResultCode.SUCCESS, o);
     }
+
+    /**
+     * 获取多风机的运行时间 统计并网时间  3-5m   5-10m   10-12m   12-25m
+     * @param ids  拟合好的数据ID
+     * @return
+     */
+    @GetMapping("time")
+    public JSONObject dataFittingYXTime(String ids){
+        Object o = fittingService.dataFittingTime(ids);
+        return JsonResult.successData(ResultCode.SUCCESS, o);
+    }
 }

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/RatioController.java

@@ -18,7 +18,7 @@ public class RatioController {
     private RatioService ratioService;
 
     /**
-     * 对风偏差
+     * 对风偏差分析
      * @param ids  预处理数据 ids
      * @param mode 拟合方式  0:单台统计   1:合并统计
      * @return

+ 13 - 0
power-fitting/src/main/java/com/gyee/power/fitting/mapper/AgcDeviateMapper.java

@@ -0,0 +1,13 @@
+package com.gyee.power.fitting.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.power.fitting.model.Equipmentmodel;
+import com.gyee.power.fitting.model.AgcDeviateModel;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+
+@Mapper
+public interface AgcDeviateMapper extends BaseMapper<AgcDeviateModel> {
+}

+ 92 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/AgcDeviateModel.java

@@ -0,0 +1,92 @@
+package com.gyee.power.fitting.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+
+import javax.persistence.Column;
+import javax.persistence.Id;
+
+@TableName("controlsettings")
+public class AgcDeviateModel extends Model<AgcDeviateModel> {
+    /**
+     * 唯一ID
+     */
+    @Id
+    @Column(name = "ID")
+    private String id;
+    /**
+     * key
+     */
+    @Column(name = "KEY")
+    private String key;
+    /**
+     * 时间戳
+     */
+    @Column(name = "TIMESTAMP")
+    private Long timestamp;
+    /**
+     * 说明,描述
+     */
+    @Column(name = "DESCRIPTION")
+    private String description;
+    /**
+     * 值
+     */
+    @Column(name = "VALUE")
+    private String value;
+
+    /**
+     * 是否是备份
+     */
+    @Column(name = "BACKUP")
+    private boolean backup;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getKey() {
+        return key;
+    }
+
+    public void setKey(String key) {
+        this.key = key;
+    }
+
+    public Long getTimestamp() {
+        return timestamp;
+    }
+
+    public void setTimestamp(Long timestamp) {
+        this.timestamp = timestamp;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    public void setValue(String value) {
+        this.value = value;
+    }
+
+    public boolean getBackup() {
+        return backup;
+    }
+
+    public void setBackup(boolean backup) {
+        this.backup = backup;
+    }
+
+}

+ 14 - 2
power-fitting/src/main/java/com/gyee/power/fitting/model/Powerfittinganalysis.java

@@ -49,8 +49,8 @@ public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
     @TableField("TYPE")
     private String type;
 
-    @TableField("PREPAREID")
-    private String prepareid;
+    @TableField("PROCESSID")
+    private String processid;
 
     @TableField("CPAVG")
     private Double cpavg;
@@ -64,6 +64,18 @@ public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
     @TableField("PCRATIO")
     private Double pcratio;
 
+    @TableField("PC5RATIO")
+    private Double pc5ratio;
+
+    @TableField("PC10RATIO")
+    private Double pc10ratio;
+
+    @TableField("PC12RATIO")
+    private Double pc12ratio;
+
+    @TableField("PC25RATIO")
+    private Double pc25ratio;
+
 
 
     @Override

+ 48 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AgcDeviateConfig.java

@@ -0,0 +1,48 @@
+package com.gyee.power.fitting.model.agc;
+
+public class AgcDeviateConfig {
+
+    private String id;
+    /**
+     * 装机容量
+     */
+    private float installedCapacity;
+    /**
+     * 场站名称
+     */
+    private String title;
+
+    private AiPoints[] aiPoints;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public float getInstalledCapacity() {
+        return installedCapacity;
+    }
+
+    public void setInstalledCapacity(float installedCapacity) {
+        this.installedCapacity = installedCapacity;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public AiPoints[] getAiPoints() {
+        return aiPoints;
+    }
+
+    public void setAiPoints(AiPoints[] aiPoints) {
+        this.aiPoints = aiPoints;
+    }
+}

+ 33 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AgcDeviateTag.java

@@ -0,0 +1,33 @@
+package com.gyee.power.fitting.model.agc;
+
+import java.util.List;
+
+/**
+ * agc曲线偏差数据
+ */
+public class AgcDeviateTag {
+    /**
+     * 数据点名称
+     */
+    private String name;
+    /**
+     * 数据值列表
+     */
+    private List<PointData> values;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public List<PointData> getValues() {
+        return values;
+    }
+
+    public void setValues(List<PointData> values) {
+        this.values = values;
+    }
+}

+ 56 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/agc/AiPoints.java

@@ -0,0 +1,56 @@
+package com.gyee.power.fitting.model.agc;
+
+/**
+ * 从数据库的value里面取到需要的值
+ */
+public class AiPoints {
+
+    private String name;
+    /**
+     * 标签点
+     */
+    private String tag;
+    /**
+     * 倍率
+     */
+    private float multiplier;
+    /**
+     * 单位
+     */
+    private String unit;
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        if (name == null) {
+            return;
+        }
+        this.name = name.replaceAll(":","");
+    }
+
+    public String getTag() {
+        return tag;
+    }
+
+    public void setTag(String tag) {
+        this.tag = tag;
+    }
+
+    public float getMultiplier() {
+        return multiplier;
+    }
+
+    public void setMultiplier(float multiplier) {
+        this.multiplier = multiplier;
+    }
+
+    public String getUnit() {
+        return unit;
+    }
+
+    public void setUnit(String unit) {
+        this.unit = unit;
+    }
+}

+ 35 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/agc/PointData.java

@@ -0,0 +1,35 @@
+package com.gyee.power.fitting.model.agc;
+
+/**
+ * 测点数据
+ */
+public class PointData {
+    /**
+     * 时间戳
+     */
+    private long ts;
+    /**
+     * 数据
+     */
+    private double doubleValue;
+
+    public long getTs() {
+        return ts;
+    }
+
+    public void setTs(long ts) {
+        this.ts = ts;
+    }
+
+    public double getValue() {
+        return doubleValue;
+    }
+
+    public double getDoubleValue() {
+        return doubleValue;
+    }
+
+    public void setDoubleValue(double doubleValue) {
+        this.doubleValue = doubleValue;
+    }
+}

+ 75 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/anno/AnnotationTool.java

@@ -0,0 +1,75 @@
+package com.gyee.power.fitting.model.anno;
+
+import java.lang.reflect.Field;
+import java.util.Collections;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 注解工具类,提供解析注解的方法
+ */
+public class AnnotationTool {
+
+    /**
+     * 获取打了Desc注解的字典属性列表
+     * @return 字典属性列表
+     */
+    public static <T> List<FixedVo> getFixedVoList(Class<T> c) {
+        if (c == null) {
+            return Collections.emptyList();
+        }
+        try {
+            T cls = c.newInstance();
+            Field[] fields = c.getDeclaredFields();
+            List<FixedVo> fixedVoList = new LinkedList<>();
+            for (Field field : fields) {
+                //使私有对象可以访问
+                field.setAccessible(true);
+                Desc desc = field.getAnnotation(Desc.class);
+                if (desc != null) {
+                    FixedVo vo = new FixedVo();
+                    vo.setKey(String.valueOf(field.get(cls)));
+                    vo.setName(field.getName());
+                    vo.setValue(desc.value());
+                    vo.setRemark(desc.remark());
+                    fixedVoList.add(vo);
+                }
+            }
+            return fixedVoList;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return Collections.emptyList();
+    }
+
+    /**
+     * 通过反射获取值
+     * @param object
+     * @return
+     */
+    public static List<FixedVo> getValueList(Object object) {
+        if (object == null) {
+            return Collections.emptyList();
+        }
+        try {
+            Field[] fields = object.getClass().getDeclaredFields();
+            List<FixedVo> fixedVoList = new LinkedList<>();
+            for (Field field : fields) {
+                //使私有对象可以访问
+                field.setAccessible(true);
+                Desc desc = field.getAnnotation(Desc.class);
+                if (desc != null) {
+                    FixedVo vo = new FixedVo();
+                    Object o = field.get(object);
+                    vo.setKey(String.valueOf(o));
+                    vo.setRemark(desc.remark());
+                    fixedVoList.add(vo);
+                }
+            }
+            return fixedVoList;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return Collections.emptyList();
+    }
+}

+ 18 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/anno/Desc.java

@@ -0,0 +1,18 @@
+package com.gyee.power.fitting.model.anno;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * 配置通过注解
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Desc {
+
+    String value ();
+    String remark () default "";
+}

+ 22 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/anno/FixedVo.java

@@ -0,0 +1,22 @@
+package com.gyee.power.fitting.model.anno;
+
+import lombok.Data;
+
+/**
+ * 与注解属性对应的类 @Desc
+ */
+@Data
+public class FixedVo {
+
+    public String key;
+    public String name;
+    public String value;
+    public String remark;
+
+
+    @Override
+    public String toString() {
+        return "FixedVo [key=" + key + ", name=" + name +", value=" + value + ", remark="
+                + remark + "]";
+    }
+}

+ 18 - 9
power-fitting/src/main/java/com/gyee/power/fitting/model/custom/PowerFittingPoint.java

@@ -1,27 +1,36 @@
 package com.gyee.power.fitting.model.custom;
 
+import com.gyee.power.fitting.model.anno.Desc;
 import lombok.Data;
 
 /**
  * 拟合后对应的曲线 model
  */
 @Data
-public class PowerFittingPoint {
+public class PowerFittingData {
+
+    public PowerFittingData(){}
+
+    public PowerFittingData(String[] str) {
+        if (str.length >= 2){
+            this.speed = Double.valueOf(str[0]);
+            this.nhdata = Double.valueOf(str[1]);
+            this.cpdata = ((double)((int)(Double.valueOf(str[2])*1000)))/1000;
+        }
+    }
+
 
     //风速
+    @Desc(value = "风速", remark = "1")
     private Double speed;
-    //拟合数据
+    //拟合功率
+    @Desc(value = "拟合功率", remark = "1")
     private Double nhdata;
     //修正数据
+    @Desc(value = "修正功率", remark = "0")
     private Double xzdata;
     //cp值
+    @Desc(value = "Cp值", remark = "1")
     private Double cpdata;
 
-    public PowerFittingPoint(String[] str) {
-        if (str.length >= 2){
-            this.speed = Double.valueOf(str[0]);
-            this.nhdata = Double.valueOf(str[1]);
-            this.cpdata = ((double)((int)(Double.valueOf(str[2])*1000)))/1000;
-        }
-    }
 }

+ 30 - 12
power-fitting/src/main/java/com/gyee/power/fitting/model/custom/PowerPointData.java

@@ -1,5 +1,6 @@
 package com.gyee.power.fitting.model.custom;
 
+import com.gyee.power.fitting.model.anno.Desc;
 import lombok.Data;
 
 import java.text.DecimalFormat;
@@ -12,49 +13,66 @@ public class PowerPointData {
 
     public PowerPointData(){}
 
-    public PowerPointData(String[] str){
+    public PowerPointData(String[] str, boolean isFilter){
         DecimalFormat df = new DecimalFormat("0.00");
         if (str.length >= 9){
             this.time = str[0];
             this.power = Double.valueOf(df.format(Double.valueOf(str[1])));
             this.speed = Double.valueOf(df.format(Double.valueOf(str[2])));
-            this.RR = Double.valueOf(df.format(Double.valueOf(str[3])));
-            this.mxzt = Double.valueOf(df.format(Double.valueOf(str[4]))).intValue();
-            this.DL = Double.valueOf(df.format(Double.valueOf(str[5])));
-            this.qfzt = Double.valueOf(df.format(Double.valueOf(str[6]))).intValue();
-            this.FX = Double.valueOf(df.format(Double.valueOf(str[7])));
-            this.angle = Double.valueOf(df.format(Double.valueOf(str[8])));
+            this.rr = Double.valueOf(df.format(Double.valueOf(str[3])));
+            this.mxzt = Double.valueOf(str[4]).intValue();
+            this.dl = Double.valueOf(df.format(Double.valueOf(str[5])));
+            this.qfzt = Double.valueOf(str[6]).intValue();
+            this.fx = Double.valueOf(df.format(Double.valueOf(str[7])));
+            this.dfwc = Double.valueOf(df.format(Double.valueOf(str[8])));
+            this.angle = Double.valueOf(df.format(Double.valueOf(str[9])));
         }
+        if (isFilter)
+            this.filter = Integer.valueOf(str[str.length - 1]);
     }
 
     //时间
-    private String time;
+    @Desc(value = "时间", remark = "1")
+    private String time = "1970-01-01 00:00:00";
 
     //功率
+    @Desc(value = "功率", remark = "1")
     private double power = 0;
 
     //风速
+    @Desc(value = "风速", remark = "1")
     private double speed = 0;
 
     //转速
-    private double RR = 0;
+    @Desc(value = "转速", remark = "1")
+    private double rr = 0;
 
     //明细状态
+    @Desc(value = "风机状态", remark = "1")
     private int mxzt = 0;
 
     //电量
-    private double DL = 0;
+    @Desc(value = "电量", remark = "1")
+    private double dl = 0;
 
     //欠发状态
+    @Desc(value = "欠发状态", remark = "1")
     private int qfzt = 0;
 
     //风向
-    private double FX = 0;
+    @Desc(value = "风向", remark = "1")
+    private double fx = 0;
 
-    //对风角度
+    //对风误差
+    @Desc(value = "对风误差", remark = "1")
+    private double dfwc = 0;
+
+    //偏航角度
+    @Desc(value = "偏航角度", remark = "1")
     private double angle = 0;
 
     //是否过滤  0:不过滤 1:过滤
+    @Desc(value = "筛选", remark = "0")
     private int filter = 0;
 
     private String wtId;

+ 4 - 29
power-fitting/src/main/java/com/gyee/power/fitting/model/custom/TableTitle.java

@@ -1,43 +1,18 @@
 package com.gyee.power.fitting.model.custom;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 /**
  * 和 PowerPointData / PowerFittingPoint 对应
  * 主要给前端表格提供对应标题
  */
 @Data
+@NoArgsConstructor
+@AllArgsConstructor
 public class TableTitle {
 
     private String key;
     private String des;
-
-    public TableTitle(String des){
-        this.des = des;
-        if (des.contains("时间")){
-            this.key = "time";
-        } else if (des.contains("风机功率")){
-            this.key = "power";
-        } else if (des.contains("风速")){
-            this.key = "speed";
-        } else if (des.contains("转速")){
-            this.key = "rr";
-        } else if (des.contains("风机状态")){
-            this.key = "mxzt";
-        } else if (des.contains("电量")){
-            this.key = "dl";
-        } else if (des.contains("欠发")){
-            this.key = "qfzt";
-        } else if (des.contains("风向")){
-            this.key = "fx";
-        } else if (des.contains("角度")){
-            this.key = "angle";
-        } else if (des.contains("筛选")){
-            this.key = "filter";
-        } else if (des.contains("拟合功率")){
-            this.key = "nhdata";
-        } else if (des.contains("Cp值")){
-            this.key = "cpdata";
-        }
-    }
 }

+ 191 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/AgcDeviateService.java

@@ -0,0 +1,191 @@
+package com.gyee.power.fitting.service.custom.curve;
+
+import com.alibaba.fastjson.JSON;
+import com.gyee.power.fitting.common.feign.IDataAdapter;
+import com.gyee.power.fitting.model.agc.AgcDeviateConfig;
+import com.gyee.power.fitting.model.agc.AgcDeviateTag;
+import com.gyee.power.fitting.model.agc.AiPoints;
+import com.gyee.power.fitting.mapper.AgcDeviateMapper;
+import com.gyee.power.fitting.model.AgcDeviateModel;
+import com.gyee.power.fitting.model.agc.PointData;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 读取数据库配置文件
+ */
+@Order(0)
+@Component
+public class AgcDeviateService {
+    private final AgcDeviateMapper agcDeviateMapper;
+    /**
+     * AGC信息缓存
+     */
+    private Map<String, AgcDeviateConfig> agcDeviateConfigMap;
+
+    @Resource
+    private IDataAdapter iDataAdapter;
+
+
+    public AgcDeviateService(AgcDeviateMapper agcDeviateMapper) {
+        this.agcDeviateMapper = agcDeviateMapper;
+        agcDeviateConfigMap = new HashMap<>();
+        AgcDeviateModel adm = agcDeviateMapper.selectById("agc_info_net");
+
+        AgcDeviateConfig[] adcs = JSON.parseObject(adm.getValue(), AgcDeviateConfig[].class);
+        for (AgcDeviateConfig adc : adcs) {
+            agcDeviateConfigMap.put(adc.getId(), adc);
+        }
+    }
+
+    /**
+     * 获取agc曲线偏差分析需要的数据
+     *
+     * @param id       场站ID
+     * @param startTs  开始时间戳
+     * @param endTs    结束时间戳
+     * @param interval 数据时间间隔
+     * @return 分析数据
+     */
+    public List<AgcDeviateTag> getAgcDeviateTags(String id, long startTs, long endTs, int interval) {
+        List<AgcDeviateTag> ladt = new ArrayList<>();
+        List<AiPoints> laps = getAiPoints(id);
+        if (laps == null) {
+            return ladt;
+        }
+        for (AiPoints ap : laps) {
+            AgcDeviateTag adt = new AgcDeviateTag();
+            adt.setName(ap.getName());
+            List<PointData> lpd = getPointData(ap, startTs, endTs, interval);
+            adt.setValues(lpd);
+            ladt.add(adt);
+        }
+        // 上限下限
+        List<AgcDeviateTag> upperLowerLimits = getUpperLowerLimits(ladt, id);
+        ladt.addAll(upperLowerLimits);
+        return ladt;
+    }
+
+    private List<PointData> getPointData(AiPoints ap, long startTs, long endTs, int interval) {
+        List<PointData> lpds = null;
+        if (ap.getTag().contains(",")) {
+            lpds = getMultiple(ap, startTs, endTs, interval);
+        } else {
+            lpds = iDataAdapter.getSnapValuesByKey(ap.getTag(), startTs, endTs, interval);
+        }
+        if (ap.getMultiplier() != 1) {
+            for (PointData pd : lpds) {
+                pd.setDoubleValue(pd.getDoubleValue() * ap.getMultiplier());
+            }
+        }
+        return lpds;
+    }
+
+    /**
+     * 获取多个标签点数值
+     */
+    private List<PointData> getMultiple(AiPoints ap, long startTs, long endTs, int interval) {
+        String[] tags = ap.getTag().split(",");
+        boolean isFirst = true;
+        List<PointData> lpd = new ArrayList<>();
+        for (String tag : tags) {
+            if (tag.equals("")) {
+                continue;
+            }
+            List<PointData> vals = iDataAdapter.getSnapValuesByKey(tag, startTs, endTs, interval);
+            for (int i = 0; i < vals.size(); ++i) {
+                if (isFirst) {
+                    lpd.addAll(vals);
+                    isFirst = false;
+                    break;
+                } else {
+                    PointData pd = lpd.get(i);
+                    pd.setDoubleValue(vals.get(i).getDoubleValue() + pd.getDoubleValue());
+                }
+            }
+        }
+        return lpd;
+    }
+
+    /**
+     * 获取上限下限
+     */
+    private List<AgcDeviateTag> getUpperLowerLimits(List<AgcDeviateTag> ladt, String id) {
+        // 装机容量
+        double capacity = getCapacity(id);
+        // 偏差
+        double deviation = capacity * 0.03;
+        // 有功设定
+        Optional<AgcDeviateTag> agcLimit = ladt.stream().filter(ad -> ad.getName().equals("有功设定限值")).findFirst();
+
+        List<AgcDeviateTag> la = new ArrayList<>();
+        if (!agcLimit.isPresent()) {
+            return la;
+        }
+        AgcDeviateTag adtUper = new AgcDeviateTag();
+        adtUper.setName("偏差上限");
+        adtUper.setValues(new ArrayList<>());
+        AgcDeviateTag adtLimt = new AgcDeviateTag();
+        adtLimt.setName("偏差下限");
+        adtLimt.setValues(new ArrayList<>());
+
+        for (PointData pd : agcLimit.get().getValues()) {
+            long ts = pd.getTs();
+            PointData pdUper = new PointData();
+            pdUper.setTs(ts);
+            pdUper.setDoubleValue(pd.getDoubleValue() + deviation);
+            PointData pdLimt = new PointData();
+            pdLimt.setTs(ts);
+            pdLimt.setDoubleValue(pd.getDoubleValue() - deviation);
+            adtUper.getValues().add(pdUper);
+            adtLimt.getValues().add(pdLimt);
+        }
+        la.add(adtUper);
+        la.add(adtLimt);
+        return la;
+    }
+
+
+    /**
+     * 根据ID获取agc配置信息
+     *
+     * @param id 场站ID
+     * @return 配置信息
+     */
+    private List<AiPoints> getAiPoints(String id) {
+        if (!agcDeviateConfigMap.containsKey(id)) {
+            return null;
+        }
+        AiPoints[] aiPoints = agcDeviateConfigMap.get(id).getAiPoints();
+        return Arrays.stream(aiPoints).filter(ap -> ap.getName().contains("功") && !ap.getName().contains("预测")).collect(Collectors.toList());
+    }
+
+    private double getCapacity(String id) {
+        if (!agcDeviateConfigMap.containsKey(id)) {
+            return 0;
+        }
+        return agcDeviateConfigMap.get(id).getInstalledCapacity();
+    }
+
+    /**
+     * 获取配置
+     *
+     * @return
+     */
+    public Object getConfig() {
+        return agcDeviateConfigMap;
+    }
+}
+
+
+
+
+
+
+
+
+

+ 108 - 59
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java

@@ -5,14 +5,18 @@ import com.gyee.power.fitting.common.alg.PowerFittingALG;
 import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.constants.Constants;
 import com.gyee.power.fitting.common.spring.InitialRunner;
+import com.gyee.power.fitting.common.util.DateUtil;
 import com.gyee.power.fitting.common.util.FileUtil;
 import com.gyee.power.fitting.common.util.PowerFittingUtil;
 import com.gyee.power.fitting.common.util.SnowFlakeUtil;
 import com.gyee.power.fitting.model.Modelpowerdetails;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.anno.AnnotationTool;
+import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.custom.*;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -130,19 +134,16 @@ public class DataFittingService {
         Map<String, Object> map = new HashMap<>();
 
         /** 添加标题 **/
-        List<TableTitle> lt = new ArrayList<>();
-        StringBuilder sb = setTitle();
-        String[] str = sb.toString().split(",");
-        for (String s : str){
-            lt.add(new TableTitle(s));
-        }
+        List<FixedVo> fxList = AnnotationTool.getFixedVoList(PowerFittingData.class);
+        List<TableTitle> lt = fxList.stream().filter(f -> f.getRemark().equals("1"))
+                .map(d -> new TableTitle(d.getName(), d.getValue())).collect(Collectors.toList());
 
         /** 添加内容 **/
-        List<PowerFittingPoint> list = new ArrayList<>();
+        List<PowerFittingData> list = new ArrayList<>();
         Powerfittinganalysis obj = powerService.selectItemById(id);
         List<String> ls = FileUtil.readFile(obj.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
-            PowerFittingPoint data = new PowerFittingPoint(ls.get(i).split(","));
+            PowerFittingData data = new PowerFittingData(ls.get(i).split(","));
             list.add(data);
         }
 
@@ -170,9 +171,9 @@ public class DataFittingService {
         List<Object> cpzList = new ArrayList<>();
         List<String> ls = FileUtil.readFile(obj.getPath(), true);
         for (int i = 1; i < ls.size(); i++){
-            String[] split = ls.get(i).split(",");
-            sjglList.add(new double[]{Double.valueOf(split[0]), Double.valueOf(split[1])});
-            cpzList.add(new double[]{Double.valueOf(split[0]), Double.valueOf(split[2])});
+            PowerFittingData data = new PowerFittingData(ls.get(i).split(","));
+            sjglList.add(new double[]{Double.valueOf(data.getSpeed()), data.getNhdata()});
+            cpzList.add(new double[]{Double.valueOf(data.getSpeed()), data.getCpdata()});
         }
 
         //保证功率
@@ -180,7 +181,7 @@ public class DataFittingService {
         List<Object> bzglList = modelPower.stream().sorted(Comparator.comparing(Modelpowerdetails::getSpeed)).map(m -> new double[]{m.getSpeed(), m.getEnsurepower()}).collect(Collectors.toList());
 
         //散点
-        String[] ids = obj.getPrepareid().split(",");
+        String[] ids = obj.getProcessid().split(",");
         List<PowerPointData> yyd = new ArrayList<>(); //有用点
         List<PowerPointData> wyd = new ArrayList<>(); //无用点
         for (String pid : ids){
@@ -188,11 +189,10 @@ public class DataFittingService {
             List<String> lp = FileUtil.readFile(pf.getPath(), true);
             for (int i = 1; i < lp.size(); i++){
                 String[] split = lp.get(i).split(",");
-                PowerPointData pd = new PowerPointData(split);
+                PowerPointData pd = new PowerPointData(split, true);
                 if (pd.getSpeed() < 0 || pd.getPower() < 0)
                     continue;
                 pd.setWtId(pf.getWindturbine());
-                pd.setFilter(Integer.parseInt(split[9]));
                 if (0 == pd.getFilter())
                     yyd.add(pd);   //没有过滤
                 if (1 == pd.getFilter())
@@ -206,9 +206,11 @@ public class DataFittingService {
         List<PointVo> listYY = new ArrayList<>();
         List<PointVo> listWY = new ArrayList<>();
         dataScanService.getMapYY().forEach((k, v) -> {
+            // k: 前端画圈时的散点数据标记
             listYY.add(new PointVo(v.get(0).getSpeed(), v.get(0).getPower(), dataScanService.getMapYY().get(k).size() + 3, k));
         });
         dataScanService.getMapWY().forEach((k, v) -> {
+            // k: 前端画圈时的散点数据标记
             listWY.add(new PointVo(v.get(0).getSpeed(), v.get(0).getPower(), dataScanService.getMapWY().get(k).size() + 3, k));
         });
 
@@ -242,8 +244,9 @@ public class DataFittingService {
 
 
     private StringBuilder setTitle(){
-        StringBuilder sb = new StringBuilder();
-        String columnName = String.join(",", Constants.FITTING_TITLE);
+        val sb = new StringBuilder();
+        val list = AnnotationTool.getFixedVoList(PowerFittingData.class);
+        String columnName = list.stream().filter(f -> f.getRemark().equals("1")).map(FixedVo::getValue).collect(Collectors.joining(","));
         sb.append(columnName).append("\n");
         return sb;
     }
@@ -253,9 +256,10 @@ public class DataFittingService {
     private void csvParse(List<String> line, List<Double> arrayS, List<Double> arrayP, double mins, double maxs, double minp, double maxp){
         for (int i = 1; i < line.size(); i++) {
             String[] split = line.get(i).split(",");
-            int filter = Integer.valueOf(split[9]); //是否过滤 0:没过滤 1:过滤
-            double x = Double.valueOf(split[2]);    //风速
-            double y = Double.valueOf(split[1]);    //功率
+            PowerPointData data = new PowerPointData(split, true);//是否过滤 0:没过滤 1:过滤
+            double x = data.getSpeed();    //风速
+            double y = data.getPower();    //功率
+            int filter = data.getFilter();
             if (filter == 0 && (x >= mins && x <= maxs && y >= minp && y <= maxp)) {
                 arrayS.add(x);
                 arrayP.add(y);
@@ -278,6 +282,7 @@ public class DataFittingService {
 
         //功率曲线拟合
         List<Point> temp = PowerFittingALG.buildLine(arrX, arrY, arraySpeed.size(), dimension, 0.01);
+        temp.forEach(f -> { if (f.getX() < 2.5 && f.getY() > 0) f.setY(0); });
 
         //推力系数 CP值
         LineCurveFitting lf = new LineCurveFitting();
@@ -285,36 +290,29 @@ public class DataFittingService {
         lf = PowerFittingALG.buildCp(InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getSweptarea(), lf);
 
         //曲线偏差率
-        List<Point> pointsAll = new ArrayList<>();
-        List<Modelpowerdetails> mp = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
-        for (int i = 0; i < mp.size(); i++){
-            Modelpowerdetails power = mp.get(i);
-            pointsAll.add(new Point(power.getSpeed(), power.getEnsurepower()));
-        }
-        double maxp = mp.stream().max(Comparator.comparing(d -> d.getEnsurepower())).get().getEnsurepower();
-        double pcl = PowerFittingALG.curveDeviationRatio(temp, pointsAll, maxp);
+        dataCurveRatio(lf, obj);
 
         String content = assemble(lf);
-        String prepareId = "";
+
+        String processId = "";
         String fileName = null;
         if (mode == 0){
-            prepareId = obj.getId();
+            processId = obj.getId();
             fileName = config.getFilePathFitting() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
         }
         if (mode == 1){
-            prepareId = list.stream().map(d -> d.getId()).collect(Collectors.joining(","));
+            processId = list.stream().map(d -> d.getId()).collect(Collectors.joining(","));
             fileName = config.getFilePathFitting() + obj.getStation() + "_merge" + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
         }
         if (mode == 2){
-            prepareId = list.stream().map(d -> d.getId()).collect(Collectors.joining(","));
+            processId = list.stream().map(d -> d.getId()).collect(Collectors.joining(","));
             fileName = config.getFilePathFitting() + obj.getStation() + "_same" + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
         }
         boolean flag = FileUtil.writeFile(fileName, content);
         if (flag) {  // TODO  保存数据库
             obj.setPath(fileName);
-            obj.setPrepareid(prepareId);
+            obj.setProcessid(processId);
             obj.setCpavg(lf.getCpAvg());
-            obj.setPcratio(pcl);
             obj.setType(Constants.DATA_FITTING);
             powerService.insertItem(obj);
         }
@@ -350,35 +348,36 @@ public class DataFittingService {
 
     /**
      * 曲线偏差率  分段的+全部的
-     * @param id
      *  3-5  5-10  10-12  12-25
      * @return
      */
-    public Map<String, Double> dataCurveRatio(String id) {
-        Map<String, Double> map = new HashMap<>();
+    private void dataCurveRatio(LineCurveFitting lf, Powerfittinganalysis obj) {
         DecimalFormat df = new DecimalFormat("0.00");
-        Powerfittinganalysis obj = powerService.selectItemById(id);
         try{
             //风速、实际功率
+            List<Point> point = new ArrayList<>();  //3-25m
             List<Point> point5 = new ArrayList<>();  //分段
             List<Point> point10 = new ArrayList<>();  //分段
             List<Point> point12= new ArrayList<>();  //分段
             List<Point> point25 = new ArrayList<>();  //分段
-            List<String> ls = FileUtil.readFile(obj.getPath(), true);
-            for (int i = 1; i < ls.size(); i++){
-                String[] split = ls.get(i).split(",");
-                double speed = Double.valueOf(split[0]);
+            List<Point> line = lf.getYLines();
+            for (int i = 1; i < line.size(); i++){
+                double speed = Double.valueOf(df.format(line.get(i).getX()));
                 if (speed >= 3 && speed < 5)
-                    point5.add(new Point(speed, Double.valueOf(split[1])));
+                    point5.add(new Point(speed, line.get(i).getY()));
                 if (speed >= 5 && speed < 10)
-                    point10.add(new Point(speed, Double.valueOf(split[1])));
+                    point10.add(new Point(speed, line.get(i).getY()));
                 if (speed >= 10 && speed < 12)
-                    point12.add(new Point(speed, Double.valueOf(split[1])));
+                    point12.add(new Point(speed, line.get(i).getY()));
                 if (speed >= 12 && speed <= 25)
-                    point25.add(new Point(speed, Double.valueOf(split[1])));
+                    point25.add(new Point(speed, line.get(i).getY()));
+                if (speed >= 3 && speed <= 25){
+                    point.add(new Point(speed, line.get(i).getY()));
+                }
             }
 
             //保证功率
+            List<Point> points = new ArrayList<>();  //3-25m
             List<Point> points5 = new ArrayList<>();  //分段
             List<Point> points10 = new ArrayList<>();  //分段
             List<Point> points12 = new ArrayList<>();  //分段
@@ -390,10 +389,12 @@ public class DataFittingService {
                     points5.add(new Point(power.getSpeed(), power.getEnsurepower()));
                 if (power.getSpeed() >= 5 && power.getSpeed() < 10)
                     points10.add(new Point(power.getSpeed(), power.getEnsurepower()));
-                if (power.getSpeed() >= 10 && power.getSpeed() <= 12)
+                if (power.getSpeed() >= 10 && power.getSpeed() < 12)
                     points12.add(new Point(power.getSpeed(), power.getEnsurepower()));
                 if (power.getSpeed() >= 12 && power.getSpeed() <= 25)
                     points25.add(new Point(power.getSpeed(), power.getEnsurepower()));
+                if (power.getSpeed() >= 3 && power.getSpeed() <= 25)
+                    points.add(new Point(power.getSpeed(), power.getEnsurepower()));
             }
 
             double maxp5 = list.stream().filter(f -> 5.0 == f.getSpeed()).collect(Collectors.toList()).get(0).getEnsurepower();
@@ -401,23 +402,22 @@ public class DataFittingService {
             double maxp12 = list.stream().filter(f -> 12.0 == f.getSpeed()).collect(Collectors.toList()).get(0).getEnsurepower();
             double maxp25 = list.stream().filter(f -> 25.0 == f.getSpeed()).collect(Collectors.toList()).get(0).getEnsurepower();
 
-
             //曲线偏差率
-            double pcl5 = PowerFittingALG.curveDeviationRatio2(point5, points5, maxp5, 3);
-            double pcl10 = PowerFittingALG.curveDeviationRatio2(point10, points10, maxp10, 5);
-            double pcl12 = PowerFittingALG.curveDeviationRatio2(point12, points12, maxp12, 10);
-            double pcl25 = PowerFittingALG.curveDeviationRatio2(point25, points25, maxp25, 12);
-
-            map.put("pcl5", Double.valueOf(df.format(pcl5)));
-            map.put("pcl10", Double.valueOf(df.format(pcl10)));
-            map.put("pcl12", Double.valueOf(df.format(pcl12)));
-            map.put("pcl25", Double.valueOf(df.format(pcl25)));
+            double pcl = PowerFittingALG.curveDeviationRatio2(point, points, maxp25, 3, 25);
+            double pcl5 = PowerFittingALG.curveDeviationRatio2(point5, points5, maxp5, 3, 5);
+            double pcl10 = PowerFittingALG.curveDeviationRatio2(point10, points10, maxp10, 5, 10);
+            double pcl12 = PowerFittingALG.curveDeviationRatio2(point12, points12, maxp12, 10, 12);
+            double pcl25 = PowerFittingALG.curveDeviationRatio2(point25, points25, maxp25, 12, 25);
+
+            obj.setPcratio(Double.valueOf(df.format(pcl)));
+            obj.setPc5ratio(Double.valueOf(df.format(pcl5)));
+            obj.setPc10ratio(Double.valueOf(df.format(pcl10)));
+            obj.setPc12ratio(Double.valueOf(df.format(pcl12)));
+            obj.setPc25ratio(Double.valueOf(df.format(pcl25)));
 
         } catch (Exception e){
             log.error("DataFittingService--dataCurveRatio",e);
         }
-
-        return map;
     }
 
 
@@ -441,7 +441,7 @@ public class DataFittingService {
                 String[] split = ls.get(i).split(",");
                 sjgl.add(new double[]{Double.valueOf(split[0]), Double.valueOf(split[1])});
             }
-            map.put("wtId", item.getWindturbine());
+            map.put("obj", item);
             map.put("sjgl", sjgl);
             result.add(map);
         });
@@ -456,4 +456,53 @@ public class DataFittingService {
 
         return map;
     }
+
+
+    /**
+     * 统计并网时间  3-5m   5-10m   10-12m  12-25m(全功率)   不运行
+     * @param ids
+     * @return
+     */
+    public Object dataFittingTime(String ids) {
+        List<Object> result = new ArrayList<>();
+        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+
+        if (list.size() == 0)
+            return result;
+
+        list.forEach(item -> {
+            Map<String, Object> map = new HashMap<>();
+            int[] time = new int[5];
+            String[] split = item.getProcessid().split(",");//数据准备ID,获取文件
+            for (String id : split){
+                List<String> line = FileUtil.readFile(powerService.getById(id).getPath(), true);
+                timeTotal(time, line);
+            }
+            map.put("wtId", item.getWindturbine());
+            map.put("time", time);
+            result.add(map);
+        });
+
+        return result;
+    }
+
+    private void timeTotal(int[] time, List<String> line){
+        List<PowerPointData> list = new ArrayList<>();
+        double interval = DateUtil.getTimeDiff(line.get(1).split(",")[0], line.get(2).split(",")[0]); //两条数据的间隔时间
+        for (int i = 1; i < line.size(); i++){
+            list.add(new PowerPointData(line.get(i).split(","), true));
+        }
+        for (PowerPointData item : list){
+            if (item.getSpeed() >= 3.0 && item.getSpeed() < 5.0 && item.getMxzt() == 2)
+                time[0] += interval;
+            if (item.getSpeed() >= 5.0 && item.getSpeed() < 10.0 && item.getMxzt() == 2)
+                time[1] += interval;
+            if (item.getSpeed() >= 10.0 && item.getSpeed() < 12.0 && item.getMxzt() == 2)
+                time[2] += interval;
+            if (item.getSpeed() >= 12.0 && item.getSpeed() <= 25.0 && item.getMxzt() == 2)
+                time[3] += interval;
+            if (item.getMxzt() != 2)
+                time[4] += interval;
+        }
+    }
 }

+ 11 - 9
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java

@@ -12,12 +12,15 @@ import com.gyee.power.fitting.common.util.NumberUtil;
 import com.gyee.power.fitting.common.util.PowerFittingUtil;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.model.Windturbinetestingpointai2;
+import com.gyee.power.fitting.model.anno.AnnotationTool;
+import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.model.custom.TableTitle;
 import com.gyee.power.fitting.model.custom.TsDoubleData;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.custom.socket.WebSocketServer;
 import lombok.extern.slf4j.Slf4j;
+import lombok.val;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -114,22 +117,19 @@ public class DataPrepareService {
      * @return
      */
     public Map<String, Object> dataPrepareShow(String id){
-        Map<String, Object> map = new HashMap<>();
+        val map = new HashMap<String, Object>();
 
         /** 添加标题 **/
-        List<TableTitle> lt = new ArrayList<>();
-        StringBuilder sb = setTitle();
-        String[] str = sb.toString().split(",");
-        for (String s : str){
-            lt.add(new TableTitle(s));
-        }
+        List<FixedVo> fxList = AnnotationTool.getFixedVoList(PowerPointData.class);
+        List<TableTitle> lt = fxList.stream().filter(f -> f.getRemark().equals("1"))
+                .map(d -> new TableTitle(d.getName(), d.getValue())).collect(Collectors.toList());
 
         /** 添加内容  读取前500行 **/
         List<PowerPointData> list = new ArrayList<>();
         Powerfittinganalysis obj = powerService.selectItemById(id);
         List<String> ls = FileUtil.readFile(obj.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
-            PowerPointData data = new PowerPointData(ls.get(i).split(","));
+            PowerPointData data = new PowerPointData(ls.get(i).split(","), false);
             list.add(data);
         }
 
@@ -151,6 +151,7 @@ public class DataPrepareService {
             for (int j = 1; j < list.size(); j++){
                 sb.append(list.get(j).get(i).getDoubleValue()).append(",");
             }
+            sb.deleteCharAt(sb.lastIndexOf(","));
             sb.append("\n");
         }
 
@@ -159,7 +160,8 @@ public class DataPrepareService {
 
     private StringBuilder setTitle(){
         StringBuilder sb = new StringBuilder();
-        String columnName = String.join(",", Constants.TABLE_TITLE);
+        val list = AnnotationTool.getFixedVoList(PowerPointData.class);
+        String columnName = list.stream().filter(f -> f.getRemark().equals("1")).map(FixedVo::getValue).collect(Collectors.joining(","));
         sb.append(columnName).append("\n");
         return sb;
     }

+ 13 - 29
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java

@@ -10,9 +10,12 @@ import com.gyee.power.fitting.common.util.PowerFittingUtil;
 import com.gyee.power.fitting.common.util.SnowFlakeUtil;
 import com.gyee.power.fitting.model.Modelpowerdetails;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.anno.AnnotationTool;
+import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.model.custom.TableTitle;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -58,7 +61,7 @@ public class DataProcessService {
             List<PowerPointData> eis = new ArrayList<>();
             List<String> list = FileUtil.readFile(obj.getPath(), true);
             for (int i = 1; i < list.size(); i++) {
-                eis.add(new PowerPointData(list.get(i).split(",")));
+                eis.add(new PowerPointData(list.get(i).split(","), false));
             }
 
             /** 风速  ->  保证功率  来自数据库 **/
@@ -68,7 +71,6 @@ public class DataProcessService {
             /** 数据预处理 **/
             List<PowerPointData> data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj);
 
-
             /** 静风频率 **/
             double frequency = PowerFittingALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3);
 
@@ -106,12 +108,8 @@ public class DataProcessService {
         Map<String, Object> map = new HashMap<>();
 
         /** 添加标题 **/
-        List<TableTitle> lt = new ArrayList<>();
-        StringBuilder sb = setTitle();
-        String[] str = sb.toString().split(",");
-        for (String s : str){
-            lt.add(new TableTitle(s));
-        }
+        List<FixedVo> fxList = AnnotationTool.getFixedVoList(PowerPointData.class);
+        List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getValue())).collect(Collectors.toList());
 
         /** 添加内容  读取前500行 **/
         List<PowerPointData> list = new ArrayList<>();
@@ -119,8 +117,7 @@ public class DataProcessService {
         List<String> ls = FileUtil.readFile(obj.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
             String[] split = ls.get(i).split(",");
-            PowerPointData data = new PowerPointData(split);
-            data.setFilter(Integer.valueOf(split[9]));
+            PowerPointData data = new PowerPointData(split, true);
             list.add(data);
         }
 
@@ -132,22 +129,11 @@ public class DataProcessService {
 
 
     private String assemble(List<PowerPointData> list) {
-        if (list.size() == 0)
-            return null;
-
         StringBuilder sb = setTitle();
-        for (int i = 0; i < list.size(); i++) {
-            sb.append(list.get(i).getTime()).append(",");
-            sb.append(list.get(i).getPower()).append(",");
-            sb.append(list.get(i).getSpeed()).append(",");
-            sb.append(list.get(i).getRR()).append(",");
-            sb.append(list.get(i).getMxzt()).append(",");
-            sb.append(list.get(i).getDL()).append(",");
-            sb.append(list.get(i).getQfzt()).append(",");
-            sb.append(list.get(i).getFX()).append(",");
-            sb.append(list.get(i).getAngle()).append(",");
-            sb.append(list.get(i).getFilter()).append(",");
-            sb.append("\n");
+        for (PowerPointData obj : list){
+            List<FixedVo> ls = AnnotationTool.getValueList(obj);
+            String data = ls.stream().filter(f -> !StringUtils.isEmpty(f.getRemark())).map(FixedVo::getKey).collect(Collectors.joining(","));
+            sb.append(data).append("\n");
         }
 
         return sb.toString();
@@ -155,10 +141,8 @@ public class DataProcessService {
 
     private StringBuilder setTitle() {
         StringBuilder sb = new StringBuilder();
-        List<String> tableTitle = new ArrayList<>();
-        tableTitle.addAll(Constants.TABLE_TITLE);
-        tableTitle.add("筛选");
-        String columnName = String.join(",", tableTitle);
+        List<FixedVo> list = AnnotationTool.getFixedVoList(PowerPointData.class);
+        String columnName = list.stream().map(FixedVo::getValue).collect(Collectors.joining(","));
         sb.append(columnName).append("\n");
         return sb;
     }

+ 5 - 2
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fx/WindDirectionService.java

@@ -1,5 +1,6 @@
 package com.gyee.power.fitting.service.custom.fx;
 
+import com.gyee.power.fitting.common.alg.PowerFittingALG;
 import com.gyee.power.fitting.common.alg.WindDirectionALG;
 import com.gyee.power.fitting.common.util.FileUtil;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
@@ -43,6 +44,7 @@ public class WindDirectionService {
                 map.put("roses", WindDirectionALG.fxRoses(ls));
                 map.put("count", WindDirectionALG.fxCountRoses(ls));
                 map.put("radar", WindDirectionALG.fxRadarRoses(ls));
+                map.put("frequency", PowerFittingALG.windDeviationPoint(ls));
                 result.add(map);
             }
         }
@@ -55,6 +57,7 @@ public class WindDirectionService {
             map.put("roses", WindDirectionALG.fxRoses(ls));
             map.put("count", WindDirectionALG.fxCountRoses(ls));
             map.put("radar", WindDirectionALG.fxRadarRoses(ls));
+            map.put("frequency", PowerFittingALG.windDeviationPoint(ls));
             result.add(map);
         }
 
@@ -110,13 +113,13 @@ public class WindDirectionService {
         List<String> content = FileUtil.readFile(obj.getPath(), true);
         for (int i = 1; i < content.size(); i++){
             String[] split = content.get(i).split(",");
-            PowerPointData data = new PowerPointData(split);
+            PowerPointData data = new PowerPointData(split, true);
             if (data.getSpeed() < 0 || data.getPower() < 0)
                 continue;
             data.setWtId(obj.getWindturbine());
-            data.setFilter(Integer.parseInt(split[9]));
             ls.add(data);
         }
         return ls;
     }
 }
+

+ 10 - 12
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ratio/RatioService.java

@@ -6,7 +6,9 @@ import com.gyee.power.fitting.common.util.FileUtil;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.model.custom.Point;
 import com.gyee.power.fitting.model.custom.PointVo;
+import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import lombok.val;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -34,7 +36,7 @@ public class RatioService {
         List<Powerfittinganalysis> listObj = powerService.selectListByIds(ids);
         if (mode == 0){
             listObj.forEach(obj -> {
-                List<PointVo> points = csvParse(obj);
+                List<PowerPointData> points = csvParse(obj);
                 int[] count = PowerFittingALG.windDeviationRatio(points);
                 List<Point> scatter = PowerFittingALG.windDeviationScatter(points);
                 Map<String, Object> map = new HashMap<>();
@@ -45,9 +47,9 @@ public class RatioService {
             });
         }
         if (mode == 1){
-            List<PointVo> ls = new ArrayList<>();
+            List<PowerPointData> ls = new ArrayList<>();
             listObj.forEach(obj -> {
-                List<PointVo> points = csvParse(obj);
+                List<PowerPointData> points = csvParse(obj);
                 ls.addAll(points);
             });
             int[] count = PowerFittingALG.windDeviationRatio(ls);
@@ -67,17 +69,13 @@ public class RatioService {
      * @param obj
      * @return
      */
-    private List<PointVo> csvParse(Powerfittinganalysis obj){
-        List<PointVo> list = new ArrayList<>();
-        DecimalFormat df = new DecimalFormat("0.00");
-        List<String> content = FileUtil.readFile(obj.getPath(), true);
+    private List<PowerPointData> csvParse(Powerfittinganalysis obj){
+        List<PowerPointData> list = new ArrayList<>();
+        val content = FileUtil.readFile(obj.getPath(), true);
         for (int i = 1; i < content.size(); i++){
             String[] split = content.get(i).split(",");
-            PointVo point = new PointVo();
-            point.setX(Double.parseDouble(df.format(Double.parseDouble(split[7]))));  //风向
-            point.setY(Double.parseDouble(df.format(Double.parseDouble(split[8]))));  //对风角度
-            point.setS(Double.parseDouble(df.format(Double.parseDouble(split[2]))));  //风速
-            list.add(point);
+            PowerPointData data = new PowerPointData(split, false);
+            list.add(data);
         }
 
         return list;

+ 5 - 11
power-fitting/src/main/resources/application.yaml

@@ -1,6 +1,6 @@
 gyee:
   # 实时适配器的url
-  adapter-url: http://10.155.32.4:8011
+  adapter-url: http://192.168.101.8:8011
   # 数据准备保存路径(原始数据)
   file-path-prepare: data\prepare\
   # 数据处理保存路径(处理后的数据)
@@ -9,16 +9,8 @@ gyee:
   file-path-fitting: data\fitting\
   # 数据压缩下载
   file-path-download: data\zip\
-  # 风机实发功率\风机风速\发电机转速\明细状态\风机日发电量\实时欠发状态\风向\对风角度(对风误差)  顺序不能乱
-  points:
-    - AI130
-    - AI022
-    - AI128
-    - ZTMX
-    - RFDL
-    - RSSQFZT
-    - AI008
-    - AI036
+  # 风机实发功率\风机风速\发电机转速\明细状态\风机日发电量\实时欠发状态\风向\对风角度(对风误差)\偏航角度  顺序不能乱
+  points: AI130,AI022,AI128,ZTMX,RFDL,RSSQFZT,AI008,AI036,AI034
   # 数据准备时由于数据量太大,初始一个默认间隔,用于适配器取数
   interval: 20
 
@@ -82,3 +74,5 @@ logging:
     com.example: debug
   file:
     path: ./logs
+
+

BIN
power-fitting/src/main/resources/gdnx.db


+ 6 - 2
power-fitting/src/main/resources/mapper/PowerfittinganalysisMapper.xml

@@ -13,16 +13,20 @@
         <result column="TIME" property="time" />
         <result column="PATH" property="path" />
         <result column="TYPE" property="type" />
-        <result column="PREPAREID" property="prepareid" />
+        <result column="PROCESSID" property="processID" />
         <result column="CPAVG" property="cpavg" />
         <result column="SPEEDAVG" property="speedavg" />
         <result column="FREQUENCY" property="frequency" />
         <result column="PCRATIO" property="pcratio" />
+        <result column="PC5RATIO" property="pc5ratio" />
+        <result column="PC10RATIO" property="pc10ratio" />
+        <result column="PC12RATIO" property="pc12ratio" />
+        <result column="PC25RATIO" property="pc25ratio" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        ID, STATION, STATIONCN, WINDTURBINE, code, interval, TIME, PATH, TYPE, PREPAREID, CPAVG, SPEEDAVG, FREQUENCY, PCRATIO
+        ID, STATION, STATIONCN, WINDTURBINE, code, interval, TIME, PATH, TYPE, PROCESSID, CPAVG, SPEEDAVG, FREQUENCY, PCRATIO, PC5RATIO, PC10RATIO, PC12RATIO, PC25RATIO
     </sql>
 
 </mapper>

+ 4 - 0
power-fitting/src/main/resources/readme.md

@@ -0,0 +1,4 @@
+### 1.添加测点并保存文件
+1)application.yaml文件  gyee下的points增加测点统一编码
+
+2)model/custom包下的PowerPointData.java类增加对应的字段及描述