Browse Source

风机绩效帮功能;
样本库过滤条件查询修改;

chenminghua 1 year ago
parent
commit
158ba411ef
42 changed files with 661 additions and 228 deletions
  1. 0 2
      gyee-sample-impala/src/main/java/com/gyee/impala/common/base/ExcludeQueryWrapper.java
  2. 3 2
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultServiceImpl.java
  3. 4 2
      gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultalgServiceImpl.java
  4. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/MapperGenerator.java
  5. 3 119
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java
  6. 6 6
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerProcessALG.java
  7. 0 6
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerTemperatureAlg.java
  8. 128 2
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/WindDirectionALG.java
  9. 10 4
      power-fitting/src/main/java/com/gyee/power/fitting/common/config/GyeeConfig.java
  10. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/common/result/ResultCode.java
  11. 13 1
      power-fitting/src/main/java/com/gyee/power/fitting/common/spring/InitialRunner.java
  12. 14 0
      power-fitting/src/main/java/com/gyee/power/fitting/common/util/DateUtil.java
  13. 6 6
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/AgcDeviateController.java
  14. 8 9
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataFittingController.java
  15. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataPrepareController.java
  16. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataProcessController.java
  17. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DateOptionController.java
  18. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/ElectricQuantityController.java
  19. 23 3
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/FiveLossInfoController.java
  20. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/PowerTemperatureController.java
  21. 2 2
      power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/WindDirectionController.java
  22. 16 0
      power-fitting/src/main/java/com/gyee/power/fitting/mapper/PowermodelMapper.java
  23. 4 1
      power-fitting/src/main/java/com/gyee/power/fitting/model/Powerfittinganalysis.java
  24. 47 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/Powermodel.java
  25. 60 0
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/DeviateAnalysisTask.java
  26. 34 0
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/FiveLossScheduleTask.java
  27. 2 1
      power-fitting/src/main/java/com/gyee/power/fitting/service/PowerfittinganalysisService.java
  28. 23 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/PowermodelService.java
  29. 4 1
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/AgcDeviateService.java
  30. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/FileService.java
  31. 37 5
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java
  32. 3 1
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java
  33. 5 3
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java
  34. 109 22
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fiveloss/FiveLossService.java
  35. 5 4
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/RatioService.java
  36. 2 2
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/WindDirectionService.java
  37. 5 9
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerfittinganalysisServiceImpl.java
  38. 3 3
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerlossinfoServiceImpl.java
  39. 66 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowermodelServiceImpl.java
  40. 6 3
      power-fitting/src/main/resources/application.yaml
  41. BIN
      power-fitting/src/main/resources/gdnx.db
  42. 2 1
      power-fitting/src/main/resources/mapper/PowerfittinganalysisMapper.xml

+ 0 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/common/base/ExcludeQueryWrapper.java

@@ -97,6 +97,4 @@ public class ExcludeQueryWrapper<T> extends QueryWrapper<T> {
         }
         }
         return super.notBetween(condition, column, val1, val2);
         return super.notBetween(condition, column, val1, val2);
     }
     }
-
-
 }
 }

+ 3 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultServiceImpl.java

@@ -35,13 +35,14 @@ public class CasefaultServiceImpl extends ServiceImpl<CasefaultMapper, Casefault
     @Override
     @Override
     public List<Casefault> getAll(String station, String[] model, String[] widget, String st, String et,String category, Long[] ids) {
     public List<Casefault> getAll(String station, String[] model, String[] widget, String st, String et,String category, Long[] ids) {
         ExcludeQueryWrapper<Casefault> wrapper = new ExcludeQueryWrapper<>();
         ExcludeQueryWrapper<Casefault> wrapper = new ExcludeQueryWrapper<>();
-        wrapper.eq("stationen", station)
-                .eq("category", category)
+        wrapper.eq("category", category)
                 .in("model", model)
                 .in("model", model)
                 .in("faultcode", widget)
                 .in("faultcode", widget)
                 .in("faultid", ids)
                 .in("faultid", ids)
                 .ge("starttime", st)
                 .ge("starttime", st)
                 .le("starttime", et);
                 .le("starttime", et);
+        if (!StringUtils.isEmpty(station))
+            wrapper.eq("stationen", station);
 
 
         try {
         try {
             return baseMapper.selectList(wrapper);
             return baseMapper.selectList(wrapper);

+ 4 - 2
gyee-sample-impala/src/main/java/com/gyee/impala/service/impl/master/CasefaultalgServiceImpl.java

@@ -20,6 +20,7 @@ import com.gyee.impala.model.slave.Temperatureinfo;
 import com.gyee.impala.model.slave.Windturbinetestingpointai2;
 import com.gyee.impala.model.slave.Windturbinetestingpointai2;
 import com.gyee.impala.service.master.CasefaultService;
 import com.gyee.impala.service.master.CasefaultService;
 import com.gyee.impala.service.master.CasefaultalgService;
 import com.gyee.impala.service.master.CasefaultalgService;
+import org.apache.commons.lang3.StringUtils;
 import org.apache.kudu.client.*;
 import org.apache.kudu.client.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Cacheable;
@@ -129,8 +130,7 @@ public class CasefaultalgServiceImpl extends ServiceImpl<CasefaultalgMapper, Cas
                                      String st, String et, String algcode, Boolean confirm, Double minSpeed, Double maxSpeed,
                                      String st, String et, String algcode, Boolean confirm, Double minSpeed, Double maxSpeed,
                                      Double minFaultTime, Double maxFaultTime, Double minTemperature, Double maxTemperature) {
                                      Double minFaultTime, Double maxFaultTime, Double minTemperature, Double maxTemperature) {
         ExcludeQueryWrapper<Casefaultalg> wrapper = new ExcludeQueryWrapper<>();
         ExcludeQueryWrapper<Casefaultalg> wrapper = new ExcludeQueryWrapper<>();
-        wrapper.eq("stationen", station)
-                .eq("windturbineid", wtId)
+        wrapper.eq("windturbineid", wtId)
                 .in("id", id)
                 .in("id", id)
                 .in("faultid", faultid)
                 .in("faultid", faultid)
                 .in("model", model)
                 .in("model", model)
@@ -146,6 +146,8 @@ public class CasefaultalgServiceImpl extends ServiceImpl<CasefaultalgMapper, Cas
                 .ge("temperature", minTemperature)
                 .ge("temperature", minTemperature)
                 .le("temperature", maxTemperature)
                 .le("temperature", maxTemperature)
                 .orderByDesc("starttime");
                 .orderByDesc("starttime");
+        if (!StringUtils.isEmpty(station))
+            wrapper.eq("stationen", station);
         try {
         try {
             return baseMapper.selectList(wrapper);
             return baseMapper.selectList(wrapper);
         } catch (Exception e) {
         } catch (Exception e) {

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/MapperGenerator.java

@@ -27,7 +27,7 @@ public class MapperGenerator {
     //作者
     //作者
     private static String authorName = "chenmh";
     private static String authorName = "chenmh";
     //要生成的表名
     //要生成的表名
-    private static String[] tables = {"XXX","XXX","XXX"};
+    private static String[] tables = {"POWERMODEL"};
     //table前缀
     //table前缀
     private static String prefix = "";
     private static String prefix = "";
 
 

+ 3 - 119
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java

@@ -5,6 +5,7 @@ import com.gyee.power.fitting.model.custom.Point;
 import com.gyee.power.fitting.model.custom.PointVo;
 import com.gyee.power.fitting.model.custom.PointVo;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 
 
+import java.math.BigDecimal;
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
 import java.util.*;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
@@ -245,27 +246,13 @@ public class PowerFittingALG {
             cpAvg /= sum1;
             cpAvg /= sum1;
 
 
         line.setCpValue(cpValue);
         line.setCpValue(cpValue);
-        line.setCpAvg(cpAvg);
+        line.setCpAvg(new BigDecimal(cpAvg).setScale(2, BigDecimal.ROUND_CEILING).doubleValue());
 
 
         return line;
         return line;
     }
     }
 
 
 
 
-    /**
-     * 静风频率计算
-     * @param list  风速数组
-     * @param speed 切入风速
-     * @return
-     */
-    public static double frequency(List<Double> list, double speed){
-        DecimalFormat df = new DecimalFormat("0.00");
-        int count = 0;
-        for (Double fs : list){
-            if (fs < speed)
-                count ++;
-        }
-        return list.size() > 0 ? Double.valueOf(df.format(((double)count / list.size() * 100 ))) : 0.0;
-    }
+
 
 
 
 
     /**
     /**
@@ -336,108 +323,5 @@ public class PowerFittingALG {
         return result;
         return result;
     }
     }
 
 
-
-    /**
-     * 对风偏差散点过滤  统计-50 到 50的
-     * 频次
-     * @param list
-     *
-     *
-     * @return
-     */
-    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++){
-            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.getSpeed();
-                if (!keys.contains(key))
-                    ls.add(new Point(index, item.getSpeed()));
-                keys.add(key);
-            }
-        }
-
-        return ls;
-    }
-
-
-    /**
-     * 静态偏航对风分析
-     * 对风偏差散点过滤  统计-15 到 15的  正负偏差 [-15,-14,....,0,1,2,.....15]
-     * 数据为二维数组 内层数组为3项. 第一项表示Y轴索引(风速),  第二项代表X轴的索引(正负偏差) 第三项代表value值.
-     * @param points
-     * @return
-     */
-    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 && item.getMxzt() != 2)
-                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++){
-            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 >= -30 && index <= 30 && item.getPower() > 0) {
-                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 result;
-    }
-
-
-    /**
-     * 对风偏差频次统计  统计-50 到 50
-     * @param list
-     * @return
-     */
-    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++){
-            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))]++;
-        }
-
-        return pc;
-    }
-
-
-    public static void main(String[] args){
-        double s =  4.53;
-        Integer speed = Math.toIntExact(Math.round(s));
-        System.out.println(speed);
-    }
-
 }
 }
 
 

+ 6 - 6
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerProcessALG.java

@@ -124,12 +124,12 @@ public class PowerProcessALG {
                         if (k < 0.9 && item.getSpeed() <= 4 && item.getSpeed() > 3.5) {
                         if (k < 0.9 && item.getSpeed() <= 4 && item.getSpeed() > 3.5) {
                             item.setFilter(1);
                             item.setFilter(1);
                         }
                         }
-                        if (k < 0.85 && item.getSpeed() <= 3.5 && item.getSpeed() > 3) {
-                            item.setFilter(1);
-                        }
-                        if (k < 0.4 && item.getSpeed() <= 3 && item.getSpeed() > 0) {
-                            item.setFilter(1);
-                        }
+//                        if (k < 0.85 && item.getSpeed() <= 3.5 && item.getSpeed() > 3) {
+//                            item.setFilter(1);
+//                        }
+//                        if (k < 0.4 && item.getSpeed() <= 3 && item.getSpeed() > 0) {
+//                            item.setFilter(1);
+//                        }
                     }
                     }
                 }
                 }
             }
             }

+ 0 - 6
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerTemperatureAlg.java

@@ -69,10 +69,4 @@ public class PowerTemperatureAlg {
                 });
                 });
         return list;
         return list;
     }
     }
-
-
-    public static void main(String[] args){
-        for (int i = -4; i <= 28; i+=5)
-            System.out.println(i);
-    }
 }
 }

+ 128 - 2
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/WindDirectionALG.java

@@ -1,11 +1,11 @@
 package com.gyee.power.fitting.common.alg;
 package com.gyee.power.fitting.common.alg;
 
 
-
+import com.gyee.power.fitting.model.custom.Point;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 
 
+import java.text.DecimalFormat;
 import java.util.*;
 import java.util.*;
 
 
-
 /**
 /**
  * 风向玫瑰图
  * 风向玫瑰图
  * 风向频次玫瑰图
  * 风向频次玫瑰图
@@ -68,6 +68,132 @@ public class WindDirectionALG {
 
 
 
 
     /**
     /**
+     * 静风频率计算 、平均风速计算
+     * @param list  风速数组
+     * @param cutInSpeed 切入风速
+     * @return
+     */
+    public static List<Double> frequency(List<Double> list, double cutInSpeed){
+        List<Double> result = new ArrayList<>();
+        DecimalFormat df = new DecimalFormat("0.00");
+        int count = 0;
+        double speed = 0.0;
+        for (Double fs : list){
+            speed += fs;
+            if (fs < cutInSpeed)
+                count ++;
+        }
+        double frequency = list.size() > 0 ? Double.valueOf(df.format(((double)count / list.size() * 100 ))) : 0;
+        double speedAVG = list.size() > 0 ? Double.valueOf(df.format(speed/list.size())) : 0;
+        result.add(frequency);
+        result.add(speedAVG);
+        return result;
+    }
+
+
+
+    /**
+     * 对风偏差散点过滤  统计-50 到 50的
+     * 频次
+     * @param list
+     *
+     *
+     * @return
+     */
+    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++){
+            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.getSpeed();
+                if (!keys.contains(key))
+                    ls.add(new Point(index, item.getSpeed()));
+                keys.add(key);
+            }
+        }
+
+        return ls;
+    }
+
+
+    /**
+     * 静态偏航对风分析
+     * 对风偏差散点过滤  统计-15 到 15的  正负偏差 [-15,-14,....,0,1,2,.....15]
+     * 数据为二维数组 内层数组为3项. 第一项表示Y轴索引(风速),  第二项代表X轴的索引(正负偏差) 第三项代表value值.
+     * @param points
+     * @return
+     */
+    public static Map<String, Object> windDeviationPoint(List<PowerPointData> points){
+        List<PowerPointData> list = new ArrayList<>();
+        List<Object> temp = new ArrayList<>();
+        Map<String, Object> result = new HashMap<>();
+        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) && item.getMxzt() != 2)
+                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]; //最大值
+        }
+
+        int avg = 0;
+        DecimalFormat sf = new DecimalFormat("0.00");
+        for (int i = 0; i < list.size(); i++){
+            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 >= -30 && index <= 30 && item.getPower() > 0) {
+                avg += index;
+                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()};
+                temp.add(s);
+            }
+        }
+        result.put("data", temp);
+        result.put("avg", temp.size() > 0 ? avg/temp.size() : 0);
+
+        return result;
+    }
+
+
+    /**
+     * 对风偏差频次统计  统计-50 到 50
+     * @param list
+     * @return
+     */
+    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++){
+            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))]++;
+        }
+
+        return pc;
+    }
+
+
+    /**
      * 风向划分
      * 风向划分
      * 0:0-22.5
      * 0:0-22.5
      * 1:22.5-45
      * 1:22.5-45

+ 10 - 4
power-fitting/src/main/java/com/gyee/power/fitting/common/config/GyeeConfig.java

@@ -8,6 +8,7 @@ import lombok.Data;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.context.properties.ConfigurationProperties;
 import org.springframework.boot.system.ApplicationHome;
 import org.springframework.boot.system.ApplicationHome;
+import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
 import java.io.File;
 import java.io.File;
@@ -16,6 +17,7 @@ import java.util.List;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Data
 @Data
+@Order(0)
 @Component
 @Component
 @ConfigurationProperties(prefix = "gyee")
 @ConfigurationProperties(prefix = "gyee")
 public class GyeeConfig {
 public class GyeeConfig {
@@ -40,13 +42,17 @@ public class GyeeConfig {
     private String points;
     private String points;
     /** 适配器读取数据等间隔时间 **/
     /** 适配器读取数据等间隔时间 **/
     private Integer interval;
     private Integer interval;
+    /** 数据是否离线执行 **/
+    private boolean offLine;
+    /** 是否实时计算 **/
+    private boolean realTimeCal;
 
 
     public List<String> getPoints() {
     public List<String> getPoints() {
         return getUniformCodes();
         return getUniformCodes();
     }
     }
 
 
     public String getFilePathPrepare() {
     public String getFilePathPrepare() {
-        return jarF.getParentFile().getAbsolutePath() + "\\" + filePathPrepare;
+        return jarF.getParentFile().getAbsolutePath() + File.separator + filePathPrepare;
     }
     }
 
 
     public void setFilePathPrepare(String filePathPrepare) {
     public void setFilePathPrepare(String filePathPrepare) {
@@ -54,7 +60,7 @@ public class GyeeConfig {
     }
     }
 
 
     public String getFilePathProcess() {
     public String getFilePathProcess() {
-        return jarF.getParentFile().getAbsolutePath() + "\\" + filePathProcess;
+        return jarF.getParentFile().getAbsolutePath() + File.separator + filePathProcess;
     }
     }
 
 
     public void setFilePathProcess(String filePathProcess) {
     public void setFilePathProcess(String filePathProcess) {
@@ -62,7 +68,7 @@ public class GyeeConfig {
     }
     }
 
 
     public String getFilePathFitting() {
     public String getFilePathFitting() {
-        return jarF.getParentFile().getAbsolutePath() + "\\" + filePathFitting;
+        return jarF.getParentFile().getAbsolutePath() + File.separator + filePathFitting;
     }
     }
 
 
     public void setFilePathFitting(String filePathFitting) {
     public void setFilePathFitting(String filePathFitting) {
@@ -70,7 +76,7 @@ public class GyeeConfig {
     }
     }
 
 
     public String getFilePathDownload() {
     public String getFilePathDownload() {
-        return jarF.getParentFile().getAbsolutePath() + "\\" + filePathDownload;
+        return jarF.getParentFile().getAbsolutePath() + File.separator + filePathDownload;
     }
     }
 
 
     public void setFilePathDownload(String filePathDownload) {
     public void setFilePathDownload(String filePathDownload) {

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/common/result/ResultCode.java

@@ -21,7 +21,7 @@ public enum ResultCode {
     ERROR_DATA(4006, "数据库操作失败"),
     ERROR_DATA(4006, "数据库操作失败"),
     ERROR_DATA_REPEAT(4007, "数据已存在"),
     ERROR_DATA_REPEAT(4007, "数据已存在"),
     ERROR_SQL(4008, "sql语法不正确"),
     ERROR_SQL(4008, "sql语法不正确"),
-    ERROR_MODEL(4006, "同场站不同机型至少启用一个模型"),
+    ERROR_MODEL(4009, "同场站不同机型至少启用一个模型"),
 
 
 
 
     /* 参数错误:1000~1999 */
     /* 参数错误:1000~1999 */

+ 13 - 1
power-fitting/src/main/java/com/gyee/power/fitting/common/spring/InitialRunner.java

@@ -42,6 +42,8 @@ public class InitialRunner implements CommandLineRunner {
     private ProjectService projectService;
     private ProjectService projectService;
     @Resource
     @Resource
     private LineService lineService;
     private LineService lineService;
+    @Resource
+    private PowermodelService powermodelService;
 
 
 
 
     /**场站所有信息**/
     /**场站所有信息**/
@@ -53,7 +55,7 @@ public class InitialRunner implements CommandLineRunner {
     public static List<Windturbine> wtList = new ArrayList<>();
     public static List<Windturbine> wtList = new ArrayList<>();
     /** key:wtId NG01_01 **/
     /** key:wtId NG01_01 **/
     public static Map<String, Windturbine> wtMap = new HashMap<>();
     public static Map<String, Windturbine> wtMap = new HashMap<>();
-    /**场站的风机**/
+    /**场站的风机  key:NSS_FDC**/
     public static Map<String, List<Windturbine>> wpMap = new HashMap<>();
     public static Map<String, List<Windturbine>> wpMap = new HashMap<>();
 
 
     /**期次**/
     /**期次**/
@@ -75,6 +77,8 @@ public class InitialRunner implements CommandLineRunner {
     public static Map<String, List<Modelpower>> modelPowerMap = new HashMap<>();
     public static Map<String, List<Modelpower>> modelPowerMap = new HashMap<>();
     /** key: model  UP82 **/
     /** key: model  UP82 **/
     public static Map<String, List<Modelpowerdetails>> modelPowerDetailMap = new HashMap<>();
     public static Map<String, List<Modelpowerdetails>> modelPowerDetailMap = new HashMap<>();
+    /** key: NG01_01 **/
+    public static Map<String, List<Powermodel>> zsllglMap = new HashMap<>();
 
 
 
 
     @Override
     @Override
@@ -146,4 +150,12 @@ public class InitialRunner implements CommandLineRunner {
         lineList.forEach(f -> lineMap.put(f.getId(), f));
         lineList.forEach(f -> lineMap.put(f.getId(), f));
     }
     }
 
 
+    /**
+     * 自算理论功率
+     */
+    public void cacheZSLLGL(String wtId){
+        List<Powermodel> list = powermodelService.selectByWtId(wtId);
+        zsllglMap.replace(wtId, list);
+    }
+
 }
 }

+ 14 - 0
power-fitting/src/main/java/com/gyee/power/fitting/common/util/DateUtil.java

@@ -212,6 +212,20 @@ public class DateUtil extends DateUtils {
     }
     }
 
 
     /**
     /**
+     * 获取0点0分0秒值
+     * @param date
+     * @return
+     */
+    public static final Date dateZeroFormat(Date date){
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH),
+                0, 0, 0);
+        Date time = cal.getTime();
+        return time;
+    }
+
+    /**
      * 日期路径 即年/月/日 如2018/08/08
      * 日期路径 即年/月/日 如2018/08/08
      */
      */
     public static final String datePath() {
     public static final String datePath() {

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

@@ -1,8 +1,8 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.agc;
 
 
+import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.model.agc.AgcDeviateTag;
 import com.gyee.power.fitting.model.agc.AgcDeviateTag;
-import com.gyee.power.fitting.service.custom.curve.AgcDeviateService;
-import org.springframework.beans.factory.annotation.Value;
+import com.gyee.power.fitting.service.custom.agc.AgcDeviateService;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RequestParam;
@@ -22,8 +22,8 @@ import java.util.stream.Collectors;
 public class AgcDeviateController {
 public class AgcDeviateController {
     @Resource
     @Resource
     private AgcDeviateService agcDeviateService;
     private AgcDeviateService agcDeviateService;
-    @Value("${gyee.offline:fasle}")
-    private boolean isOffline;
+    @Resource
+    private GyeeConfig gyeeConfig;
 
 
     /**
     /**
      * 获取偏差信息
      * 获取偏差信息
@@ -40,7 +40,7 @@ public class AgcDeviateController {
                                               @RequestParam(value = "id") String id,
                                               @RequestParam(value = "id") String id,
                                               @RequestParam(value = "interval", defaultValue = "60", required = false) int interval) {
                                               @RequestParam(value = "interval", defaultValue = "60", required = false) int interval) {
         List<AgcDeviateTag> ls = new ArrayList<>();
         List<AgcDeviateTag> ls = new ArrayList<>();
-        if (isOffline) {
+        if (gyeeConfig.isOffLine()) {
             ls = agcDeviateService.getAgcDeviateTagsOffline(id, startTs, endTs, interval);
             ls = agcDeviateService.getAgcDeviateTagsOffline(id, startTs, endTs, interval);
         } else {
         } else {
             ls = agcDeviateService.getAgcDeviateTags(id, startTs, endTs, interval);
             ls = agcDeviateService.getAgcDeviateTags(id, startTs, endTs, interval);

+ 8 - 9
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/DataFittingController.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
@@ -10,7 +10,6 @@ import com.gyee.power.fitting.service.custom.curve.DataFittingService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.bind.annotation.*;
 
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -103,15 +102,15 @@ public class DataFittingController {
 
 
 
 
     /**
     /**
-     * 计算曲线偏差率
-     * @param id 曲线拟合的id
+     * 保存拟合的功率曲线数据
+     * @param ids 曲线拟合的ids
      * @return
      * @return
      */
      */
-//    @GetMapping("curve/ratio")
-//    public JSONObject dataCurveRatio(String id){
-//        Map<String, Double> map = fittingService.dataCurveRatio(id);
-//        return JsonResult.successData(ResultCode.SUCCESS, map);
-//    }
+    @GetMapping("curve/save")
+    public JSONObject dataCurveSave(String ids){
+        fittingService.curveSave(ids);
+        return JsonResult.success(ResultCode.SUCCESS);
+    }
 
 
 
 
     /**
     /**

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

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.JsonResult;

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

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.JsonResult;

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

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.config.GyeeConfig;

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

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 
 
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.CrossOrigin;

+ 23 - 3
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/FiveLossInfoController.java

@@ -1,11 +1,10 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.common.util.DateUtil;
 import com.gyee.power.fitting.common.util.DateUtil;
-import com.gyee.power.fitting.model.custom.FjjxbVo;
 import com.gyee.power.fitting.service.custom.fiveloss.FiveLossService;
 import com.gyee.power.fitting.service.custom.fiveloss.FiveLossService;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.CrossOrigin;
@@ -27,6 +26,23 @@ public class FiveLossInfoController {
     @Resource
     @Resource
     private FiveLossService fiveLossService;
     private FiveLossService fiveLossService;
 
 
+    @GetMapping("five/loss/cal")
+    public JSONObject fiveLossCal(String ids){
+        Map<String, Object> map = fiveLossService.fiveLossCal(ids);
+        return JsonResult.successData(ResultCode.SUCCESS, map);
+    }
+
+
+    /**
+     * 五损数据查询
+     * @param station
+     * @param project
+     * @param line
+     * @param st
+     * @param et
+     * @param type  1:场站  2:期次  3:线路
+     * @return
+     */
     @GetMapping("index")
     @GetMapping("index")
     public JSONObject fiveLoss(String station, String project, String line, String st, String et, String type){
     public JSONObject fiveLoss(String station, String project, String line, String st, String et, String type){
         Date begin = DateUtil.parseStrtoDate(st, DateUtil.DATE_PATTERN);
         Date begin = DateUtil.parseStrtoDate(st, DateUtil.DATE_PATTERN);
@@ -39,8 +55,12 @@ public class FiveLossInfoController {
     }
     }
 
 
 
 
+    /**
+     * 五损数据计算
+     * @return
+     */
     @GetMapping("cal")
     @GetMapping("cal")
-    public JSONObject test(){
+    public JSONObject fiveCal(){
         fiveLossService.fiveLossCal();
         fiveLossService.fiveLossCal();
         return JsonResult.success(ResultCode.SUCCESS);
         return JsonResult.success(ResultCode.SUCCESS);
     }
     }

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

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;

+ 2 - 2
power-fitting/src/main/java/com/gyee/power/fitting/controller/analyse/WindDirectionController.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.controller.analyse;
+package com.gyee.power.fitting.controller.fj;
 
 
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
@@ -25,7 +25,7 @@ public class WindDirectionController {
     private WindDirectionService windDirectionService;
     private WindDirectionService windDirectionService;
 
 
     /***
     /***
-     * 风向玫瑰图
+     * 风速风向玫瑰图
      * @param ids  预处理数据的id
      * @param ids  预处理数据的id
      * @param mode 统计方式   0:单台统计   1:合并统计
      * @param mode 统计方式   0:单台统计   1:合并统计
      * @return
      * @return

+ 16 - 0
power-fitting/src/main/java/com/gyee/power/fitting/mapper/PowermodelMapper.java

@@ -0,0 +1,16 @@
+package com.gyee.power.fitting.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.gyee.power.fitting.model.Powermodel;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-02-21
+ */
+public interface PowermodelMapper extends BaseMapper<Powermodel> {
+
+}

+ 4 - 1
power-fitting/src/main/java/com/gyee/power/fitting/model/Powerfittinganalysis.java

@@ -80,7 +80,10 @@ public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
     private Integer interp; //等间隔时间,单位:秒
     private Integer interp; //等间隔时间,单位:秒
 
 
     @TableField("ISCAL")
     @TableField("ISCAL")
-    private Integer iscal;  //0-没有计算  1-已计算
+    private Integer iscal = 0;  //0-没有计算  1-已计算
+//
+//    @TableField("ISPROCESS")
+//    private Integer isprocess = 0;  //0-没有计算  1-已计算
 
 
     @Override
     @Override
     protected Serializable pkVal() {
     protected Serializable pkVal() {

+ 47 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/Powermodel.java

@@ -0,0 +1,47 @@
+package com.gyee.power.fitting.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 自算---------拟合功率
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-02-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("POWERMODEL")
+public class Powermodel extends Model<Powermodel> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableField("ID")
+    private String id;
+
+    @TableField("WINDTURBINEID")
+    private String windturbineid;
+
+    @TableField("SPEED")
+    private double speed;
+
+    @TableField("POWER")
+    private double power;
+
+    @TableField("MODEL")
+    private String model;
+
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

+ 60 - 0
power-fitting/src/main/java/com/gyee/power/fitting/schedule/DeviateAnalysisTask.java

@@ -0,0 +1,60 @@
+package com.gyee.power.fitting.schedule;
+
+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.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.Windturbine;
+import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import com.gyee.power.fitting.service.custom.curve.DataPrepareService;
+import com.gyee.power.fitting.service.custom.curve.DataProcessService;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+@Component
+public class DeviateAnalysisTask {
+
+    @Resource
+    private DataPrepareService prepareService;
+    @Resource
+    private DataProcessService processService;
+    @Resource
+    private PowerfittinganalysisService powerService;
+
+
+    /**
+     * 元数据缓存
+     */
+    @Scheduled(cron = "0 0 1 1 * ?")  //每月1号凌晨1点执行
+    public void dataPrepare(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        Date st = DateUtil.dateZeroFormat(month);  //上月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());  //当月1号0点值
+        Map<String, List<Windturbine>> wpMap = InitialRunner.wpMap;
+        wpMap.forEach((k, v) -> {
+            List<String> wtIds = v.stream().map(m -> m.getId()).collect(Collectors.toList());
+            prepareService.dataPrepare(k, wtIds, st.getTime(), et.getTime(), 10 * 60);
+        });
+    }
+
+
+    /**
+     * 根据缓存的文件进行数据预处理
+     */
+    @Scheduled(cron = "0 0 22 1 * ?")  //每月1号22点执行
+    public void dataProcess(){
+        List<Powerfittinganalysis> list = powerService.selectListByIsCal(Constants.DATA_PROCESS, 0);
+        if (list == null || list.size() == 0)
+            return;
+
+        List<String> ids = list.stream().map(m -> m.getId()).collect(Collectors.toList());
+        processService.dataProcess(ids, 25.0, 0.0, 2500.0, 0.0, true, true, true, true, true, true, 3);
+    }
+
+}

+ 34 - 0
power-fitting/src/main/java/com/gyee/power/fitting/schedule/FiveLossScheduleTask.java

@@ -1,8 +1,42 @@
 package com.gyee.power.fitting.schedule;
 package com.gyee.power.fitting.schedule;
 
 
 
 
+import com.gyee.power.fitting.common.config.GyeeConfig;
+import com.gyee.power.fitting.common.util.DateUtil;
+import com.gyee.power.fitting.service.custom.fiveloss.FiveLossService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
+import java.util.Date;
+
 @Component
 @Component
 public class FiveLossScheduleTask {
 public class FiveLossScheduleTask {
+
+    @Autowired
+    private GyeeConfig gyeeConfig;
+    @Autowired
+    private FiveLossService fiveLossService;
+
+    /**
+     * 五损数据离线计算,使用已经缓存的文件
+     */
+    @Scheduled(cron = "0 0 23 1 * ?")  //每月1号23点执行
+    public void fiveLossCal(){
+        fiveLossService.fiveLossCal();
+    }
+
+    /**
+     * 每月2号凌晨三点执行
+     */
+    @Scheduled(cron = "0 0 3 * * ?")  //每天凌晨三点执行
+    public void fiveLossLineCal(){
+        // 是否实时计算五损数据
+        if (gyeeConfig.isRealTimeCal()){
+            Date date = DateUtil.addDays(new Date(), -1);
+            Date st = DateUtil.dateZeroFormat(date);
+            Date et = DateUtil.dateZeroFormat(new Date());
+            fiveLossService.fiveLossCalByLine(st.getTime(), et.getTime(), 60);
+        }
+    }
 }
 }

+ 2 - 1
power-fitting/src/main/java/com/gyee/power/fitting/service/PowerfittinganalysisService.java

@@ -33,9 +33,10 @@ public interface PowerfittinganalysisService extends IService<Powerfittinganalys
 
 
     /**
     /**
      * 查询准备的数据
      * 查询准备的数据
-     * @param type  Constants.DATA_PREPARE
+     * @param type  Constants.DATA_PREPARE  Constants.DATA_PROCESS
      * @param isCal
      * @param isCal
      * @return
      * @return
      */
      */
     List<Powerfittinganalysis> selectListByIsCal(String type, int isCal);
     List<Powerfittinganalysis> selectListByIsCal(String type, int isCal);
+
 }
 }

+ 23 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/PowermodelService.java

@@ -0,0 +1,23 @@
+package com.gyee.power.fitting.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.gyee.power.fitting.model.Powermodel;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-02-21
+ */
+public interface PowermodelService extends IService<Powermodel> {
+
+    void insertBatch(List<Powermodel> list);
+
+    boolean deleteItem(String wtId);
+
+    List<Powermodel> selectByWtId(String wtId);
+}

+ 4 - 1
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/AgcDeviateService.java

@@ -1,7 +1,8 @@
-package com.gyee.power.fitting.service.custom.curve;
+package com.gyee.power.fitting.service.custom.agc;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.TypeReference;
+import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.feign.IDataAdapter;
 import com.gyee.power.fitting.common.feign.IDataAdapter;
 import com.gyee.power.fitting.model.agc.AgcDeviateConfig;
 import com.gyee.power.fitting.model.agc.AgcDeviateConfig;
 import com.gyee.power.fitting.model.agc.AgcDeviateTag;
 import com.gyee.power.fitting.model.agc.AgcDeviateTag;
@@ -51,6 +52,8 @@ public class AgcDeviateService {
 
 
     @Resource
     @Resource
     private IDataAdapter iDataAdapter;
     private IDataAdapter iDataAdapter;
+    @Resource
+    private GyeeConfig gyeeConfig;
 
 
 
 
     public AgcDeviateService(AgcDeviateMapper agcDeviateMapper, FileService fs, Environment env) {
     public AgcDeviateService(AgcDeviateMapper agcDeviateMapper, FileService fs, Environment env) {

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/FileService.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.service.custom.curve;
+package com.gyee.power.fitting.service.custom.agc;
 
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.TypeReference;
 import com.alibaba.fastjson.TypeReference;

+ 37 - 5
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java

@@ -11,16 +11,20 @@ import com.gyee.power.fitting.common.util.PowerFittingUtil;
 import com.gyee.power.fitting.common.util.SnowFlakeUtil;
 import com.gyee.power.fitting.common.util.SnowFlakeUtil;
 import com.gyee.power.fitting.model.Modelpowerdetails;
 import com.gyee.power.fitting.model.Modelpowerdetails;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.Powermodel;
 import com.gyee.power.fitting.model.anno.AnnotationTool;
 import com.gyee.power.fitting.model.anno.AnnotationTool;
 import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.custom.*;
 import com.gyee.power.fitting.model.custom.*;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import com.gyee.power.fitting.service.PowermodelService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import lombok.val;
 import lombok.val;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 
 
 import javax.annotation.Resource;
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.text.DecimalFormat;
 import java.text.DecimalFormat;
 import java.util.*;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.atomic.AtomicReference;
@@ -34,6 +38,8 @@ public class DataFittingService {
     @Resource
     @Resource
     private GyeeConfig config;
     private GyeeConfig config;
     @Resource
     @Resource
+    private PowermodelService modelService;
+    @Resource
     private DataScanService dataScanService;
     private DataScanService dataScanService;
     @Resource
     @Resource
     private PowerfittinganalysisService powerService;
     private PowerfittinganalysisService powerService;
@@ -282,18 +288,15 @@ public class DataFittingService {
 
 
         //功率曲线拟合 不合理数据过滤
         //功率曲线拟合 不合理数据过滤
         List<Point> temp = PowerFittingALG.buildLine(arrX, arrY, arraySpeed.size(), dimension, 0.01);
         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值
         //推力系数 CP值
         LineCurveFitting lf = new LineCurveFitting();
         LineCurveFitting lf = new LineCurveFitting();
         lf.setYLines(temp);
         lf.setYLines(temp);
         lf = PowerFittingALG.buildCp(InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getSweptarea(), lf);
         lf = PowerFittingALG.buildCp(InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getSweptarea(), lf);
-
+        lf.getCpValue().forEach(f -> {if(f.getX() <= 2.5) f.setY(0);});
         //曲线偏差率
         //曲线偏差率
         dataCurveRatio(lf, obj);
         dataCurveRatio(lf, obj);
 
 
         String content = assemble(lf);
         String content = assemble(lf);
-
         String processId = "";
         String processId = "";
         String fileName = null;
         String fileName = null;
         if (mode == 0){
         if (mode == 0){
@@ -466,7 +469,6 @@ public class DataFittingService {
     public Object dataFittingTime(String ids) {
     public Object dataFittingTime(String ids) {
         List<Object> result = new ArrayList<>();
         List<Object> result = new ArrayList<>();
         List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
         List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
-
         if (list.size() == 0)
         if (list.size() == 0)
             return result;
             return result;
 
 
@@ -505,4 +507,34 @@ public class DataFittingService {
                 time[4] += interval;
                 time[4] += interval;
         }
         }
     }
     }
+
+    /**
+     * 通过拟合的id保存理论功率
+     * @param ids
+     */
+    public void curveSave(String ids) {
+        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        if (list.size() == 0)
+            return;
+
+        list.forEach(f -> {
+            try {
+                List<Powermodel> result = new ArrayList<>();
+                List<String> ls = FileUtil.readFile(f.getPath(), true);
+                for (int i = 1; i < ls.size(); i++){
+                    String[] split = ls.get(i).split(",");
+                    Powermodel obj = new Powermodel();
+                    obj.setWindturbineid(f.getWindturbine());
+                    obj.setModel(InitialRunner.wtMap.get(f.getWindturbine()).getModelid());
+                    obj.setSpeed(new BigDecimal(split[0]).setScale(2, RoundingMode.CEILING).doubleValue());
+                    obj.setPower(new BigDecimal(split[1]).setScale(2, RoundingMode.CEILING).doubleValue());
+                    result.add(obj);
+                }
+                modelService.deleteItem(f.getWindturbine());
+                modelService.insertBatch(result);
+            }catch (Exception e){
+                log.error(e.getMessage());
+            }
+        });
+    }
 }
 }

+ 3 - 1
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java

@@ -30,6 +30,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashMap;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 @Slf4j
 @Slf4j
@@ -65,11 +66,12 @@ public class DataPrepareService {
 
 
                 for (int i = 0; i < points.size(); i++){
                 for (int i = 0; i < points.size(); i++){
                     Windturbinetestingpointai2 point = collect.get(points.get(i)).get(0);
                     Windturbinetestingpointai2 point = collect.get(points.get(i)).get(0);
+                    log.info("测点:" + point.getId() + "----" + point.getName());
                     List<TsDoubleData> data = remoteService.adapter().getHistorySnap(point.getId(), st, et, interval);
                     List<TsDoubleData> data = remoteService.adapter().getHistorySnap(point.getId(), st, et, interval);
                     if (data == null || data.size() < 0)
                     if (data == null || data.size() < 0)
                         break;
                         break;
                     result.add(data);
                     result.add(data);
-                    Thread.sleep(200);
+                    TimeUnit.MILLISECONDS.sleep(200);
                 }
                 }
                 if (result.size() != points.size())
                 if (result.size() != points.size())
                     continue;
                     continue;

+ 5 - 3
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java

@@ -2,6 +2,7 @@ package com.gyee.power.fitting.service.custom.curve;
 
 
 import com.gyee.power.fitting.common.alg.PowerFittingALG;
 import com.gyee.power.fitting.common.alg.PowerFittingALG;
 import com.gyee.power.fitting.common.alg.PowerProcessALG;
 import com.gyee.power.fitting.common.alg.PowerProcessALG;
+import com.gyee.power.fitting.common.alg.WindDirectionALG;
 import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.constants.Constants;
 import com.gyee.power.fitting.common.constants.Constants;
 import com.gyee.power.fitting.common.spring.InitialRunner;
 import com.gyee.power.fitting.common.spring.InitialRunner;
@@ -67,12 +68,12 @@ public class DataProcessService {
             /** 风速  ->  保证功率  来自数据库 **/
             /** 风速  ->  保证功率  来自数据库 **/
             List<Modelpowerdetails> modelPowerList = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
             List<Modelpowerdetails> modelPowerList = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
             Map<Double, Double> modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(Modelpowerdetails::getSpeed, Modelpowerdetails::getEnsurepower));
             Map<Double, Double> modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(Modelpowerdetails::getSpeed, Modelpowerdetails::getEnsurepower));
-
             /** 数据预处理 **/
             /** 数据预处理 **/
             List<PowerPointData> data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj);
             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);
+            List<Double> ls = WindDirectionALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3);
+            double frequency = ls.get(0);
+            double speed = ls.get(1);
 
 
             String content = assemble(data);
             String content = assemble(data);
             String fileName = config.getFilePathProcess() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
             String fileName = config.getFilePathProcess() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
@@ -80,6 +81,7 @@ public class DataProcessService {
             if (flag) {  // TODO  保存数据库
             if (flag) {  // TODO  保存数据库
                 obj.setPath(fileName);
                 obj.setPath(fileName);
                 obj.setFrequency(frequency);
                 obj.setFrequency(frequency);
+                obj.setSpeedavg(speed);
                 obj.setType(Constants.DATA_PROCESS);
                 obj.setType(Constants.DATA_PROCESS);
                 powerService.insertItem(obj);
                 powerService.insertItem(obj);
             }
             }

+ 109 - 22
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fiveloss/FiveLossService.java

@@ -2,7 +2,9 @@ package com.gyee.power.fitting.service.custom.fiveloss;
 
 
 import com.alibaba.fastjson.JSONObject;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.constants.Constants;
 import com.gyee.power.fitting.common.constants.Constants;
+import com.gyee.power.fitting.common.exception.CustomException;
 import com.gyee.power.fitting.common.feign.RemoteServiceBuilder;
 import com.gyee.power.fitting.common.feign.RemoteServiceBuilder;
+import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.common.spring.InitialRunner;
 import com.gyee.power.fitting.common.spring.InitialRunner;
 import com.gyee.power.fitting.common.util.CollectUtil;
 import com.gyee.power.fitting.common.util.CollectUtil;
 import com.gyee.power.fitting.common.util.DateUtil;
 import com.gyee.power.fitting.common.util.DateUtil;
@@ -16,7 +18,6 @@ import com.gyee.power.fitting.model.custom.TableTitle;
 import com.gyee.power.fitting.model.custom.TsDoubleData;
 import com.gyee.power.fitting.model.custom.TsDoubleData;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.PowerlossinfoService;
 import com.gyee.power.fitting.service.PowerlossinfoService;
-import com.gyee.power.fitting.service.Windturbinetestingpointai2Service;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
@@ -26,7 +27,6 @@ import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.*;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.Collectors;
 
 
 
 
@@ -42,7 +42,7 @@ public class FiveLossService {
     private RemoteServiceBuilder remoteService;
     private RemoteServiceBuilder remoteService;
 
 
     /**
     /**
-     * 五项损失
+     * 五项损失查询
      *
      *
      * @param station 场站
      * @param station 场站
      * @param project 期次
      * @param project 期次
@@ -118,18 +118,22 @@ public class FiveLossService {
     public void fiveLossCal() {
     public void fiveLossCal() {
         log.info("======风机绩效榜计算开始.............");
         log.info("======风机绩效榜计算开始.............");
         Map<String, Windturbine> wtmap = InitialRunner.wtMap;
         Map<String, Windturbine> wtmap = InitialRunner.wtMap;
-        Map<String, List<Modelpowerdetails>> modelmap = InitialRunner.modelPowerDetailMap;
+        Map<String, List<Powermodel>> modelmap = InitialRunner.zsllglMap;
 
 
         List<Powerfittinganalysis> analyses = analysisService.selectListByIsCal(Constants.DATA_PREPARE, 0);
         List<Powerfittinganalysis> analyses = analysisService.selectListByIsCal(Constants.DATA_PREPARE, 0);
-        if (analyses.size() == 0)
+        if (analyses.size() == 0){
+            log.info("======风机榜效帮计算结束,Powerfittinganalysis数据为空.............");
             return;
             return;
+        }
 
 
         for (Powerfittinganalysis p : analyses) {
         for (Powerfittinganalysis p : analyses) {
             List<Powerlossinfo> result = new ArrayList<>();
             List<Powerlossinfo> result = new ArrayList<>();
             Windturbine wt = wtmap.get(p.getWindturbine());
             Windturbine wt = wtmap.get(p.getWindturbine());
             List<String> content = FileUtil.readFile(p.getPath(), true);
             List<String> content = FileUtil.readFile(p.getPath(), true);
-            if (content.size() == 0)
+            if (content.size() == 0){
+                log.info("======风机榜效帮计算结束,文件内容为空.............");
                 continue;
                 continue;
+            }
 
 
             log.info("======风机绩效榜计算:" + p.getWindturbine());
             log.info("======风机绩效榜计算:" + p.getWindturbine());
             content.remove(0); //去掉标题栏
             content.remove(0); //去掉标题栏
@@ -145,17 +149,17 @@ public class FiveLossService {
                 double xnssdl = 0;//性能损失电量
                 double xnssdl = 0;//性能损失电量
 
 
                 List<PowerPointData> pdl = ls.stream().map(mp -> new PowerPointData(mp.split(","), false)).collect(Collectors.toList());
                 List<PowerPointData> pdl = ls.stream().map(mp -> new PowerPointData(mp.split(","), false)).collect(Collectors.toList());
-                double zcfd = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 2); //正常发电
-                xdssdl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 5);  //限电损失电量
-                double qxjcl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 3); //缺陷降出力损失电量
-                double xdjcl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 4); //限电降出力损失电量
-                double cnsltj = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 7); //场内受累停机损失电量
-                double cnsljx = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 9); //场内受累检修损失电量
-                double dwsl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 10); //电网受累损失电量
-                double hjsl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 11); //环境受累损失电量
-
-                gzssdl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 6);
-                jhjxssdl = generalLoss(pdl, modelmap.get(wt.getModelid()), p.getInterp(), 8);
+                double zcfd = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 2); //正常发电
+                xdssdl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 5);  //限电损失电量
+                double qxjcl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 3); //缺陷降出力损失电量
+                double xdjcl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 4); //限电降出力损失电量
+                double cnsltj = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 7); //场内受累停机损失电量
+                double cnsljx = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 9); //场内受累检修损失电量
+                double dwsl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 10); //电网受累损失电量
+                double hjsl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 11); //环境受累损失电量
+
+                gzssdl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 6);
+                jhjxssdl = generalLoss(pdl, modelmap.get(p.getWindturbine()), p.getInterp(), 8);
                 fjhjxssdl = gzssdl;
                 fjhjxssdl = gzssdl;
                 xdssdl = xdssdl + xdjcl;
                 xdssdl = xdssdl + xdjcl;
                 slssdl = cnsltj + dwsl + hjsl + cnsljx + cnsljx;
                 slssdl = cnsltj + dwsl + hjsl + cnsljx + cnsljx;
@@ -201,15 +205,15 @@ public class FiveLossService {
      * @param status   风机当前状态
      * @param status   风机当前状态
      * @return
      * @return
      */
      */
-    private double generalLoss(List<PowerPointData> ztmxData, List<Modelpowerdetails> zsglData, int interval, double status) {
+    private double generalLoss(List<PowerPointData> ztmxData, List<Powermodel> zsglData, int interval, double status) {
         double ssdl = 0.0;
         double ssdl = 0.0;
         List<PowerPointData> pointData = ztmxData.stream().filter(zt -> zt.getMxzt() == status).collect(Collectors.toList());
         List<PowerPointData> pointData = ztmxData.stream().filter(zt -> zt.getMxzt() == status).collect(Collectors.toList());
-        List<Modelpowerdetails> theoryData = zsglData.stream().filter(f -> f.getTheorypower() > 0).collect(Collectors.toList());
-        if (status == 2.0 || status == 3.0 || status == 4.0 || status == 9.0 || status == 10.0 || status == 11.0) {
+        List<Powermodel> theoryData = zsglData.stream().filter(f -> f.getPower() > 0.0).collect(Collectors.toList());
+        if (status == 0.0 || status == 2.0 || status == 3.0 || status == 4.0 || status == 9.0 || status == 11.0) {
             for (PowerPointData obj : pointData) {
             for (PowerPointData obj : pointData) {
                 for (int i = 0; i < theoryData.size(); i++) {
                 for (int i = 0; i < theoryData.size(); i++) {
                     if (String.format("%.2f", obj.getSpeed()).equals(String.format("%.2f", theoryData.get(i).getSpeed()))) {
                     if (String.format("%.2f", obj.getSpeed()).equals(String.format("%.2f", theoryData.get(i).getSpeed()))) {
-                        double zsgl = theoryData.get(i).getTheorypower();
+                        double zsgl = theoryData.get(i).getPower();
                         double power = obj.getPower();
                         double power = obj.getPower();
                         double temp = (zsgl - power) > 0 ? zsgl - power : 0;
                         double temp = (zsgl - power) > 0 ? zsgl - power : 0;
                         ssdl = ssdl + (temp / 60) * (interval / 60);
                         ssdl = ssdl + (temp / 60) * (interval / 60);
@@ -221,7 +225,7 @@ public class FiveLossService {
             for (PowerPointData obj : pointData) {
             for (PowerPointData obj : pointData) {
                 for (int i = 0; i < theoryData.size(); i++) {
                 for (int i = 0; i < theoryData.size(); i++) {
                     if (String.format("%.2f", obj.getSpeed()).equals(String.format("%.2f", theoryData.get(i).getSpeed()))) {
                     if (String.format("%.2f", obj.getSpeed()).equals(String.format("%.2f", theoryData.get(i).getSpeed()))) {
-                        double zsgl = theoryData.get(i).getTheorypower();
+                        double zsgl = theoryData.get(i).getPower();
                         ssdl = ssdl + (zsgl / 60) * (interval / 60);
                         ssdl = ssdl + (zsgl / 60) * (interval / 60);
                         break;
                         break;
                     }
                     }
@@ -342,4 +346,87 @@ public class FiveLossService {
 
 
         return ssdl > 0 ? ssdl : 0;
         return ssdl > 0 ? ssdl : 0;
     }
     }
+
+    /**
+     * 使用文件计算五损数据
+     * @param ids  准备的数据ID
+     */
+    public Map<String, Object> fiveLossCal(String ids) {
+        log.info("======风机绩效榜计算开始.............");
+        Map<String, Object> promise = new HashMap<>();
+        List<FjjxbVo> result = new ArrayList<>();
+        Map<String, List<Powermodel>> zsglmap = InitialRunner.zsllglMap;
+
+        List<Powerfittinganalysis> analyses = analysisService.selectListByIds(ids);
+        if (analyses.size() == 0 || zsglmap.size() == 0){
+            log.info("======风机榜效帮计算结束,自算理论功率数据为空.............");
+            throw new CustomException(ResultCode.ERROR);
+        }
+
+        for (Powerfittinganalysis p : analyses) {
+            List<String> content = FileUtil.readFile(p.getPath(), true);
+            if (content.size() == 0){
+                log.info("======风机榜效帮计算结束,文件内容为空.............");
+                continue;
+            }
+            log.info("======风机绩效榜计算:" + p.getWindturbine());
+            double llfdl = 0.0; //理论发电量
+            double rfdl = 0.0; //日发电量
+            double jhjxssdl = 0.0;//计划检修损失电量
+            double fjhjxssdl =0.0;//非计划检修电量
+            double xdssdl = 0.0;//限电损失电量
+            double slssdl = 0.0;//受累损失电量
+            double xnssdl = 0.0;//性能损失电量
+            double speed = 0.0;//风速
+            content.remove(0); //去掉标题栏
+            int count = 86400 / p.getInterp(); //一天86400s  一天的条数
+            List<List<String>> coll = CollectUtil.groupListByQty(content, count);
+            for (List<String> ls : coll) {
+                List<PowerPointData> pdl = ls.stream().map(mp -> new PowerPointData(mp.split(","), false)).collect(Collectors.toList());
+                double lldl = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), -1); //理论发电量
+                double dj = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 0); //待机
+                double sdtj = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 1); //手动停机
+                double zcfd = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 2); //正常发电
+                double xdss = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 5);  //限电损失电量
+                double qxjcl = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 3); //缺陷降出力损失电量
+                double xdjcl = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 4); //限电降出力损失电量
+                double cnsltj = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 7); //场内受累停机损失电量
+                double cnsljx = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 9); //场内受累检修损失电量
+                double dwsl = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 10); //电网受累损失电量
+                double hjsl = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 11); //环境受累损失电量
+                double gzss = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 6); //故障损失电量
+                double tjjx = generalLoss(pdl, zsglmap.get(p.getWindturbine()), p.getInterp(), 8); //停机检修
+
+                llfdl += lldl;
+                jhjxssdl += (tjjx + cnsljx);
+                fjhjxssdl += (gzss + cnsltj);
+                xdssdl += (xdjcl + xdss);
+                slssdl += (dwsl + hjsl);
+                xnssdl += (dj + sdtj + zcfd + qxjcl);
+                rfdl += pdl.get(pdl.size() - 1).getDl();
+                speed += pdl.stream().mapToDouble(PowerPointData::getSpeed).sum();
+            }
+            FjjxbVo vo = new FjjxbVo();
+            vo.setId(p.getWindturbine());
+            vo.setName(p.getWindturbine());
+            vo.setLlfdl(llfdl);
+            vo.setSjfdl(rfdl);
+            vo.setJhjx(jhjxssdl);
+            vo.setFjhjx(fjhjxssdl);
+            vo.setXd(xdssdl);
+            vo.setXn(xnssdl);
+            vo.setSl(slssdl);
+            vo.setSpeed(new BigDecimal(speed/content.size()).setScale(2, RoundingMode.CEILING).doubleValue());
+            vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.CEILING).doubleValue() : 0);
+            result.add(vo);
+        }
+        log.info("======风机榜效帮计算结束.............");
+        /** 添加标题 **/
+        List<FixedVo> fxList = AnnotationTool.getFixedVoList(FjjxbVo.class);
+        List<TableTitle> lt = fxList.stream().map(d -> new TableTitle(d.getName(), d.getDes())).collect(Collectors.toList());
+        promise.put("title", lt);
+        promise.put("data", result);
+
+        return promise;
+    }
 }
 }

+ 5 - 4
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/RatioService.java

@@ -2,6 +2,7 @@ package com.gyee.power.fitting.service.custom.windresource;
 
 
 
 
 import com.gyee.power.fitting.common.alg.PowerFittingALG;
 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.common.util.FileUtil;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.model.custom.Point;
 import com.gyee.power.fitting.model.custom.Point;
@@ -34,8 +35,8 @@ public class RatioService {
         if (mode == 0){
         if (mode == 0){
             listObj.forEach(obj -> {
             listObj.forEach(obj -> {
                 List<PowerPointData> points = csvParse(obj);
                 List<PowerPointData> points = csvParse(obj);
-                int[] count = PowerFittingALG.windDeviationRatio(points);
-                List<Point> scatter = PowerFittingALG.windDeviationScatter(points);
+                int[] count = WindDirectionALG.windDeviationRatio(points);
+                List<Point> scatter = WindDirectionALG.windDeviationScatter(points);
                 Map<String, Object> map = new HashMap<>();
                 Map<String, Object> map = new HashMap<>();
                 map.put("wtId", obj.getWindturbine());
                 map.put("wtId", obj.getWindturbine());
                 map.put("count", count);
                 map.put("count", count);
@@ -49,8 +50,8 @@ public class RatioService {
                 List<PowerPointData> points = csvParse(obj);
                 List<PowerPointData> points = csvParse(obj);
                 ls.addAll(points);
                 ls.addAll(points);
             });
             });
-            int[] count = PowerFittingALG.windDeviationRatio(ls);
-            List<Point> scatter = PowerFittingALG.windDeviationScatter(ls);
+            int[] count = WindDirectionALG.windDeviationRatio(ls);
+            List<Point> scatter = WindDirectionALG.windDeviationScatter(ls);
             Map<String, Object> map = new HashMap<>();
             Map<String, Object> map = new HashMap<>();
             map.put("wtId", "merge");
             map.put("wtId", "merge");
             map.put("count", count);
             map.put("count", count);

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

@@ -42,7 +42,7 @@ public class WindDirectionService {
                 map.put("roses", WindDirectionALG.fxRoses(ls));
                 map.put("roses", WindDirectionALG.fxRoses(ls));
                 map.put("count", WindDirectionALG.fxCountRoses(ls));
                 map.put("count", WindDirectionALG.fxCountRoses(ls));
                 map.put("radar", WindDirectionALG.fxRadarRoses(ls));
                 map.put("radar", WindDirectionALG.fxRadarRoses(ls));
-                map.put("frequency", PowerFittingALG.windDeviationPoint(ls));
+                map.put("frequency", WindDirectionALG.windDeviationPoint(ls));
                 result.add(map);
                 result.add(map);
             }
             }
         }
         }
@@ -55,7 +55,7 @@ public class WindDirectionService {
             map.put("roses", WindDirectionALG.fxRoses(ls));
             map.put("roses", WindDirectionALG.fxRoses(ls));
             map.put("count", WindDirectionALG.fxCountRoses(ls));
             map.put("count", WindDirectionALG.fxCountRoses(ls));
             map.put("radar", WindDirectionALG.fxRadarRoses(ls));
             map.put("radar", WindDirectionALG.fxRadarRoses(ls));
-            map.put("frequency", PowerFittingALG.windDeviationPoint(ls));
+            map.put("frequency", WindDirectionALG.windDeviationPoint(ls));
             result.add(map);
             result.add(map);
         }
         }
 
 

+ 5 - 9
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerfittinganalysisServiceImpl.java

@@ -10,6 +10,7 @@ import org.springframework.stereotype.Service;
 
 
 import java.util.ArrayList;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.List;
 
 
 /**
 /**
@@ -70,15 +71,13 @@ public class PowerfittinganalysisServiceImpl extends ServiceImpl<Powerfittingana
 
 
     @Override
     @Override
     public List<Powerfittinganalysis> selectListByIds(String ids) {
     public List<Powerfittinganalysis> selectListByIds(String ids) {
-        List<Powerfittinganalysis> list = new ArrayList();
-
         try{
         try{
-            list = baseMapper.selectBatchIds(Arrays.asList(ids.split(",")));
+            return baseMapper.selectBatchIds(Arrays.asList(ids.split(",")));
         }catch (Exception e){
         }catch (Exception e){
             log.error("PowerfittinganalysisServiceImpl--selectListByIds", e);
             log.error("PowerfittinganalysisServiceImpl--selectListByIds", e);
         }
         }
 
 
-        return list;
+        return Collections.EMPTY_LIST;
     }
     }
 
 
     @Override
     @Override
@@ -92,18 +91,15 @@ public class PowerfittinganalysisServiceImpl extends ServiceImpl<Powerfittingana
 
 
     @Override
     @Override
     public List<Powerfittinganalysis> selectListByIsCal(String type, int isCal) {
     public List<Powerfittinganalysis> selectListByIsCal(String type, int isCal) {
-        List<Powerfittinganalysis> list = new ArrayList();
-
         ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
         ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
         wrapper.eq("type", type);
         wrapper.eq("type", type);
         wrapper.eq("iscal", isCal);
         wrapper.eq("iscal", isCal);
-
         try{
         try{
-            list = baseMapper.selectList(wrapper);
+            return baseMapper.selectList(wrapper);
         }catch (Exception e){
         }catch (Exception e){
             log.error("PowerfittinganalysisServiceImpl--selectListByIsCal", e);
             log.error("PowerfittinganalysisServiceImpl--selectListByIsCal", e);
         }
         }
 
 
-        return list;
+        return Collections.EMPTY_LIST;
     }
     }
 }
 }

+ 3 - 3
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerlossinfoServiceImpl.java

@@ -10,6 +10,7 @@ import com.gyee.power.fitting.model.Powerlossinfo;
 import com.gyee.power.fitting.service.PowerlossinfoService;
 import com.gyee.power.fitting.service.PowerlossinfoService;
 import org.springframework.stereotype.Service;
 import org.springframework.stereotype.Service;
 import java.util.ArrayList;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;
 
 
@@ -82,7 +83,6 @@ public class PowerlossinfoServiceImpl extends ServiceImpl<PowerlossinfoMapper, P
 
 
     @Override
     @Override
     public List<Powerlossinfo> selectList(String station, List<String> project, List<String> line, Date st, Date et) {
     public List<Powerlossinfo> selectList(String station, List<String> project, List<String> line, Date st, Date et) {
-        List<Powerlossinfo> list = new ArrayList<>();
         ExcludeQueryWrapper<Powerlossinfo> wrapper = new ExcludeQueryWrapper<>();
         ExcludeQueryWrapper<Powerlossinfo> wrapper = new ExcludeQueryWrapper<>();
         wrapper.eq("stationid", station)
         wrapper.eq("stationid", station)
                 .in("projectid", project)
                 .in("projectid", project)
@@ -90,10 +90,10 @@ public class PowerlossinfoServiceImpl extends ServiceImpl<PowerlossinfoMapper, P
                 .ge("recorddate", st)
                 .ge("recorddate", st)
                 .le("recorddate", et);
                 .le("recorddate", et);
         try{
         try{
-            list = baseMapper.selectList(wrapper);
+            return baseMapper.selectList(wrapper);
         }catch (Exception e){
         }catch (Exception e){
             log.error("FiveLossService--fiveLoss", e);
             log.error("FiveLossService--fiveLoss", e);
         }
         }
-        return list;
+        return Collections.EMPTY_LIST;
     }
     }
 }
 }

+ 66 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowermodelServiceImpl.java

@@ -0,0 +1,66 @@
+package com.gyee.power.fitting.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.power.fitting.common.base.ExcludeQueryWrapper;
+import com.gyee.power.fitting.common.util.CollectUtil;
+import com.gyee.power.fitting.common.util.SnowFlakeUtil;
+import com.gyee.power.fitting.mapper.PowermodelMapper;
+import com.gyee.power.fitting.model.Powermodel;
+import com.gyee.power.fitting.service.PowermodelService;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-02-21
+ */
+@Service
+public class PowermodelServiceImpl extends ServiceImpl<PowermodelMapper, Powermodel> implements PowermodelService {
+
+    @Override
+    public void insertBatch(List<Powermodel> list) {
+        list.forEach(item -> item.setId(SnowFlakeUtil.generateId()));
+        try{
+            if (list.size() > 1000){
+                List<List<Powermodel>> coll = CollectUtil.groupListByQty(list, 1000);
+                coll.forEach(ls -> saveBatch(ls));
+            } else {
+                saveBatch(list);
+            }
+        }catch (Exception e){
+            log.error("PowermodelServiceImpl--insertBatch", e);
+        }
+    }
+
+    @Override
+    public boolean deleteItem(String wtId) {
+        ExcludeQueryWrapper<Powermodel> wrapper = new ExcludeQueryWrapper<>();
+        wrapper.eq("windturbineid", wtId);
+        int count = 0;
+        try{
+            count = baseMapper.delete(wrapper);
+        } catch (Exception e){
+            log.error("PowermodelServiceImpl--deleteItem", e);
+            return false;
+        }
+        return count > 0 ? true : false;
+    }
+
+    @Override
+    public List<Powermodel> selectByWtId(String wtId) {
+        ExcludeQueryWrapper<Powermodel> wrapper = new ExcludeQueryWrapper<>();
+        wrapper.eq("windturbineid", wtId);
+        try{
+            return baseMapper.selectList(wrapper);
+        }catch (Exception e){
+            log.error("PowermodelServiceImpl--selectByWtId", e);
+        }
+        return Collections.EMPTY_LIST;
+    }
+}

+ 6 - 3
power-fitting/src/main/resources/application.yaml

@@ -9,12 +9,15 @@ gyee:
   file-path-fitting: data\fitting\
   file-path-fitting: data\fitting\
   # 数据压缩下载
   # 数据压缩下载
   file-path-download: data\zip\
   file-path-download: data\zip\
+  # 功率曲线离线数据保存路径
+  file-path-power: data\power\
   # 数据准备时由于数据量太大,初始一个默认间隔,用于适配器取数
   # 数据准备时由于数据量太大,初始一个默认间隔,用于适配器取数
   interval: 20
   interval: 20
   # 当前是否是离线环境
   # 当前是否是离线环境
-  offline: true
-  # 功率曲线离线数据保存路径
-  file-path-power: data\power\
+  off-line: true
+  # 是否实时计算五损数据   true:连接实时数据库按天计算   false:使用离线数据按月计算
+  real-time-cal: false
+
 
 
 server:
 server:
   port: 9002
   port: 9002

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


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

@@ -23,12 +23,13 @@
         <result column="PC12RATIO" property="pc12ratio" />
         <result column="PC12RATIO" property="pc12ratio" />
         <result column="PC25RATIO" property="pc25ratio" />
         <result column="PC25RATIO" property="pc25ratio" />
         <result column="INTERP" property="interp" />
         <result column="INTERP" property="interp" />
+        <result column="ISPROCESS" property="isprocess" />
         <result column="ISCAL" property="iscal" />
         <result column="ISCAL" property="iscal" />
     </resultMap>
     </resultMap>
 
 
     <!-- 通用查询结果列 -->
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
-        ID, STATION, STATIONCN, WINDTURBINE, code, interval, TIME, PATH, TYPE, PROCESSID, CPAVG, SPEEDAVG, FREQUENCY, PCRATIO, PC5RATIO, PC10RATIO, PC12RATIO, PC25RATIO, INTERP, ISCAL
+        ID, STATION, STATIONCN, WINDTURBINE, code, interval, TIME, PATH, TYPE, PROCESSID, CPAVG, SPEEDAVG, FREQUENCY, PCRATIO, PC5RATIO, PC10RATIO, PC12RATIO, PC25RATIO, INTERP, ISCAL, ISPROCESS
     </sql>
     </sql>
 
 
 </mapper>
 </mapper>