Kaynağa Gözat

桨距角分析

chenminghua 1 yıl önce
ebeveyn
işleme
d279f5fbb2
49 değiştirilmiş dosya ile 1451 ekleme ve 527 silme
  1. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/MapperGenerator.java
  2. 15 9
      power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java
  3. 17 5
      power-fitting/src/main/java/com/gyee/power/fitting/common/constants/Constants.java
  4. 2 2
      power-fitting/src/main/java/com/gyee/power/fitting/common/result/JsonResult.java
  5. 1 0
      power-fitting/src/main/java/com/gyee/power/fitting/common/result/ResultCode.java
  6. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/common/util/DateUtil.java
  7. 11 11
      power-fitting/src/main/java/com/gyee/power/fitting/common/util/FileUtil.java
  8. 30 16
      power-fitting/src/main/java/com/gyee/power/fitting/common/util/PowerFittingUtil.java
  9. 2 4
      power-fitting/src/main/java/com/gyee/power/fitting/controller/base/WindInfoController.java
  10. 2 2
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/BladeController.java
  11. 2 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataFittingController.java
  12. 4 3
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataPrepareController.java
  13. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataProcessController.java
  14. 12 4
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DateOptionController.java
  15. 5 4
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/FiveLossInfoController.java
  16. 1 2
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/PowerTemperatureController.java
  17. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/RatedPowerController.java
  18. 127 0
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/ReportController.java
  19. 2 3
      power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/WindDirectionController.java
  20. 18 0
      power-fitting/src/main/java/com/gyee/power/fitting/mapper/PoweranalysisreportMapper.java
  21. 80 0
      power-fitting/src/main/java/com/gyee/power/fitting/model/Poweranalysisreport.java
  22. 19 2
      power-fitting/src/main/java/com/gyee/power/fitting/model/Powerfittinganalysis.java
  23. 3 1
      power-fitting/src/main/java/com/gyee/power/fitting/model/Powerwindinfo.java
  24. 146 0
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/DataCacheOptionTask.java
  25. 0 65
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/DeviateAnalysisTask.java
  26. 3 5
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/FiveLossScheduleTask.java
  27. 38 0
      power-fitting/src/main/java/com/gyee/power/fitting/schedule/ReportScheduleTask.java
  28. 28 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/PoweranalysisreportService.java
  29. 8 13
      power-fitting/src/main/java/com/gyee/power/fitting/service/PowerfittinganalysisService.java
  30. 4 3
      power-fitting/src/main/java/com/gyee/power/fitting/service/PowerwindinfoService.java
  31. 87 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/BladeService.java
  32. 93 86
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fiveloss/FiveLossService.java
  33. 7 7
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/temperature/PowerTemperatureService.java
  34. 3 3
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ratedpower/RatedPowerService.java
  35. 353 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ReportService.java
  36. 1 1
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/socket/WebSocketServer.java
  37. 0 124
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/blade/BladeService.java
  38. 22 21
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java
  39. 23 14
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java
  40. 4 7
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java
  41. 104 39
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/AvgSpeedInfoService.java
  42. 3 5
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/RatioService.java
  43. 4 7
      power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/WindDirectionService.java
  44. 88 0
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PoweranalysisreportServiceImpl.java
  45. 36 39
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerfittinganalysisServiceImpl.java
  46. 13 12
      power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerwindinfoServiceImpl.java
  47. 2 0
      power-fitting/src/main/resources/application.yaml
  48. 21 0
      power-fitting/src/main/resources/mapper/PoweranalysisreportMapper.xml
  49. 3 3
      power-fitting/src/main/resources/mapper/PowerfittinganalysisMapper.xml

+ 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[] tables = {"POWERWINDINFO"};
+    private static String[] tables = {"POWERANALYSISREPORT"};
     //table前缀
     private static String prefix = "";
 

+ 15 - 9
power-fitting/src/main/java/com/gyee/power/fitting/common/alg/PowerFittingALG.java

@@ -306,19 +306,25 @@ public class PowerFittingALG {
             double sum = 0;
             for (Point point : points1){
                 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() - p.get().getY();
+//                }
                 if (p.isPresent() && p.get().getX() >= mins && p.get().getX() < maxs){
-                    sum += Math.pow(point.getY() - p.get().getY(), 2);
+                    sum += (point.getY() - p.get().getY());
                     count ++;
-                    pc += point.getY() - p.get().getY();
                 }
             }
-            sum = Math.sqrt(sum);
-            count = Math.sqrt(count);
-            maxp = maxp * count;
-            if (maxp != 0)
-                result = sum / maxp * 100;
-            if (pc < 0)
-                result = 0 - result;
+//            sum = Math.sqrt(sum);
+//            count = Math.sqrt(count);
+//            maxp = maxp * count;
+//            if (maxp != 0)
+//                result = sum / maxp * 100;
+//            if (pc < 0)
+//                result = 0 - result;
+            BigDecimal bg = new BigDecimal((sum / (count * 10)));
+            result = bg.setScale(4, BigDecimal.ROUND_FLOOR).doubleValue();
         }
         return result;
     }

+ 17 - 5
power-fitting/src/main/java/com/gyee/power/fitting/common/constants/Constants.java

@@ -6,24 +6,36 @@ public class Constants {
 
     // 数据准备  标记
     public static final String DATA_PREPARE = "prepare";
-
     // 数据处理完  标记
     public static final String DATA_PROCESS = "process";
-
     // 数据处理完  标记
     public static final String DATA_FITTING = "fitting";
 
+
+
+    // 曲线偏差率
+    public static final String MODULE_CURVE = "curve";
+    // 静态偏航对风
+    public static final String MODULE_STATIC_WIND = "staticwind";
+    // 容量系数
+    public static final String MODULE_MLXS = "mrlxs";
+    // 桨距角
+    public static final String MODULE_BLADE = "blade";
+    // 停机时长
+    public static final String MODULE_STOP_TIME = "stoptime";
+    // 损失电量
+    public static final String MODULE_LOSS_DL = "lossdl";
+
+
+
     //功率
     public static final String CODE_POINT_POWER = "AI130";
-
     //风速
     public static final String CODE_POINT_SPEED = "AI022";
-
     //明细状态
     // 0-待机  1-手动停机  2-正常发电  3-缺陷降出力  4-限电降出力  5-限电停机  6-故障停机
     // 7-场内受累停机  8-检修停机  9-场内受累检修  10-电网受累  11-环境受累  12-风机离线
     public static final String CODE_POINT_MXZT = "ZTMX";
-
     //电量
     public static final String CODE_POINT_RFDL = "RFDL";
 }

+ 2 - 2
power-fitting/src/main/java/com/gyee/power/fitting/common/result/JsonResult.java

@@ -16,8 +16,8 @@ public class JsonResult extends HashMap<String, Object> implements Serializable
 
     public static JSONObject error(){
         JSONObject json = new JSONObject();
-        json.put("code", ResultCode.SUCCESS.getCode());
-        json.put("msg", ResultCode.SUCCESS.getMessage());
+        json.put("code", ResultCode.ERROR.getCode());
+        json.put("msg", ResultCode.ERROR.getMessage());
         return json;
     }
 

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

@@ -23,6 +23,7 @@ public enum ResultCode {
     ERROR_SQL(4008, "sql语法不正确"),
     ERROR_MODEL(4009, "自算功率数据为空"),
     ERROR_MODEL_TYPE(4010, "风机机型不一致,请重新选择"),
+    ERROR_POINT(4011, "风机测点数据异常"),
 
 
     /* 参数错误:1000~1999 */

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

@@ -222,7 +222,7 @@ public class DateUtil extends DateUtils {
     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),
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), 1,
                 0, 0, 0);
         Date time = cal.getTime();
         return time;

+ 11 - 11
power-fitting/src/main/java/com/gyee/power/fitting/common/util/FileUtil.java

@@ -202,17 +202,17 @@ public class FileUtil {
      */
     public static String zipFiles(List<File> srcFiles, File zipFile) {
         // 判断压缩后的文件存在不,不存在则创建
-        if (!zipFile.exists()) {
-            try {
-                String fileName = zipFile.getAbsolutePath();
-                //fileName = fileName.substring(0, fileName.lastIndexOf("\\"));
-                File file1 = new File(fileName);
-                file1.mkdirs();
-                zipFile.createNewFile();
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
-        }
+//        if (!zipFile.exists()) {
+//            try {
+//                String fileName = zipFile.getAbsolutePath();
+//                //fileName = fileName.substring(0, fileName.lastIndexOf("\\"));
+//                File file1 = new File(fileName);
+//                file1.mkdirs();
+//                zipFile.createNewFile();
+//            } catch (IOException e) {
+//                e.printStackTrace();
+//            }
+//        }
         // 创建 FileOutputStream 对象
         FileOutputStream fileOutputStream = null;
         // 创建 ZipOutputStream

+ 30 - 16
power-fitting/src/main/java/com/gyee/power/fitting/common/util/PowerFittingUtil.java

@@ -13,42 +13,57 @@ public class PowerFittingUtil {
      * @return
      */
     public static List<Object> powerDataTree(List<Powerfittinganalysis> list, String type){
+        // 前端默认展开一组数据的id
+        int index1 = 100;
+        int index2 = 10000;
+        int index3 = 100000;
         /**多层分组**/
         Map<String, Map<String, Map<String, List<Powerfittinganalysis>>>> map = list.stream().
-                collect(Collectors.groupingBy(Powerfittinganalysis::getInterval, TreeMap::new,
+                collect(Collectors.groupingBy(Powerfittinganalysis::getInterval,
                         Collectors.groupingBy(Powerfittinganalysis::getTime,
-                                Collectors.groupingBy(Powerfittinganalysis::getStationcn, TreeMap::new, Collectors.toList()))));
+                        Collectors.groupingBy(Powerfittinganalysis::getStationcn, Collectors.toList()))));
         //map.values().stream().sorted(Comparator.comparing(s -> s.get)).collect(Collectors.toList());
-        List<Object> result = new ArrayList<>();
-        map.forEach((k, v) -> {
-            List<Object> l1 = new ArrayList<>();
-            Map<String, Object> map1 = new TreeMap<>();
+        List<Map<String, Object>> result = new ArrayList<>();
+        for (Map.Entry<String, Map<String, Map<String, List<Powerfittinganalysis>>>> entry : map.entrySet()) {
+            String k = entry.getKey();
+            List<Map<String, Object>> l1 = new ArrayList<>();
+            Map<String, Object> map1 = new HashMap<>();
 
-            map.get(k).forEach((k1, v1) -> {
+            for (Map.Entry<String, Map<String, List<Powerfittinganalysis>>> e : map.get(k).entrySet()) {
+                String k1 = e.getKey();
                 List<Object> l2 = new ArrayList<>();
                 Map<String, Object> map2 = new HashMap<>();
-                map.get(k).get(k1).forEach((k2, v2) -> {
+                for (Map.Entry<String, List<Powerfittinganalysis>> mapEntry : map.get(k).get(k1).entrySet()) {
+                    String k2 = mapEntry.getKey();
+                    List<Powerfittinganalysis> v2 = mapEntry.getValue();
                     Map<String, Object> map3 = new HashMap<>();
-                    map3.put("id", SnowFlakeUtil.generateId());
+                    map3.put("id", index3);
                     map3.put("label", k2);
                     map3.put("children", v2.stream().sorted(Comparator.comparing(Powerfittinganalysis::getWindturbine)));
                     l2.add(map3);
-                });
+                    index3 += 1;
+                }
 
-                map2.put("id", SnowFlakeUtil.generateId());
+                map2.put("id", index2);
                 map2.put("label", k1);
                 map2.put("children", l2);
                 l1.add(map2);
-            });
+                index2 += 1;
+            }
 
-            map1.put("id", SnowFlakeUtil.generateId());
+            l1.sort((o1, o2) -> o2.get("label").toString().compareTo(o1.get("label").toString()));
+
+            map1.put("id", index1);
             map1.put("label", k);
             map1.put("children", l1);
             result.add(map1);
-        });
+            index1 += 1;
+        }
+
+        result.sort((o1, o2) -> o2.get("label").toString().compareTo(o1.get("label").toString()));
 
         Map<String, Object> mp = new HashMap<>();
-        mp.put("id", SnowFlakeUtil.generateId());
+        mp.put("id", 1);
         mp.put("label", type.equals(Constants.DATA_PREPARE) ? "数据准备" :
                 type.equals(Constants.DATA_PROCESS) ? "数据预处理" : type.equals(Constants.DATA_FITTING) ? "功率曲线拟合" : "数据");
         mp.put("children", result);
@@ -58,5 +73,4 @@ public class PowerFittingUtil {
 
         return ls;
     }
-
 }

+ 2 - 4
power-fitting/src/main/java/com/gyee/power/fitting/controller/base/WindInfoController.java

@@ -12,9 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -97,7 +95,7 @@ public class WindInfoController {
     @GetMapping("location")
     public JSONObject dataLocation(String ids){
         List<Windturbine> result = new ArrayList<>();
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         for (Powerfittinganalysis obj : list){
             String[] pids = obj.getProcessid().split(",");
             for (String id : pids){

+ 2 - 2
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/BladeController.java

@@ -3,7 +3,7 @@ package com.gyee.power.fitting.controller.fj;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
-import com.gyee.power.fitting.service.custom.blade.BladeService;
+import com.gyee.power.fitting.service.custom.BladeService;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,7 +21,7 @@ public class BladeController {
 
     /**
      * 叶片角度
-     * @param 数据准备 ids
+     * @param ids   数据预处理
      * @returnv
      */
     @GetMapping("angle")

+ 2 - 1
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataFittingController.java

@@ -46,8 +46,9 @@ public class DataFittingController {
                                   @RequestParam(value = "minp",  required = false) Double minp,
                                   @RequestParam(value = "dimension",  required = false) Integer dimension,
                                   @RequestParam(value = "mode",  required = false) Integer mode){
-        if (ids.isEmpty())
+        if (ids.isEmpty()) {
             return JsonResult.error(ResultCode.PARAM_IS_BLANK);
+        }
 
         Powerfittinganalysis obj = fittingService.dataFitting(ids, maxs, mins, maxp, minp, dimension, mode);
         return JsonResult.successData(ResultCode.SUCCESS, obj);

+ 4 - 3
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataPrepareController.java

@@ -41,13 +41,14 @@ public class DataPrepareController {
     @GetMapping("data")
     public JSONObject dataPrepare(String station, String wtIds, Long st,
                                   Long et, Integer interval){
-        if (station.isEmpty() || wtIds.isEmpty())
+        if (station.isEmpty() || wtIds.isEmpty()) {
             return JsonResult.error(ResultCode.PARAM_NOT_COMPLETE);
+        }
 
         String[] points = wtIds.split(",");
         prepareService.dataPrepare(station, Arrays.asList(points), st, et, interval);
 
-        return JsonResult.error(ResultCode.SUCCESS_DATA_PREPARE);
+        return JsonResult.success(ResultCode.SUCCESS_DATA_PREPARE);
     }
 
     /** 文件 tree
@@ -78,7 +79,7 @@ public class DataPrepareController {
      */
     @GetMapping("download")
     public void dataPrepareDownload(HttpServletResponse response, @RequestParam(value = "id", required = false) String id){
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         FileUtil.download(obj.getPath(), response);
     }
 }

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

@@ -100,7 +100,7 @@ public class DataProcessController {
      */
     @GetMapping("download")
     public void dataProcessDownload(HttpServletResponse response, @RequestParam(value = "id", required = false) String id){
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         FileUtil.download(obj.getPath(), response);
     }
 

+ 12 - 4
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DateOptionController.java

@@ -1,6 +1,7 @@
 package com.gyee.power.fitting.controller.fj;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.gyee.power.fitting.common.config.GyeeConfig;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
@@ -12,6 +13,8 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
 import java.io.File;;
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -33,8 +36,12 @@ public class DateOptionController {
      * @return
      */
     @GetMapping("delete")
-    public JSONObject dataDelete(String ids){
-        powerfittinganalysisService.deleteList(ids);
+    public JSONObject dataDelete(String ids, String type){
+        if (StringUtils.isBlank(type)) {
+            JsonResult.error();
+        }
+
+        powerfittinganalysisService.deleteList(ids, type);
         return JsonResult.success(ResultCode.SUCCESS);
     }
 
@@ -45,10 +52,11 @@ public class DateOptionController {
      */
     @GetMapping("download")
     public void dataProcessDownload(HttpServletResponse response, @RequestParam(value = "ids", required = false) String ids){
-        if (ids.isEmpty())
+        if (ids.isEmpty()) {
             return;
+        }
 
-        List<Powerfittinganalysis> objs = powerfittinganalysisService.selectListByIds(ids);
+        List<Powerfittinganalysis> objs = powerfittinganalysisService.listByIds(Arrays.asList(ids.split(",")));
         List<String> list = objs.stream().map(p -> p.getPath()).collect(Collectors.toList());
         List<File> files = list.stream().map(File::new).collect(Collectors.toList());
 

+ 5 - 4
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/FiveLossInfoController.java

@@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.common.util.DateUtil;
-import com.gyee.power.fitting.service.custom.fiveloss.FiveLossService;
+import com.gyee.power.fitting.service.custom.FiveLossService;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
@@ -28,8 +28,9 @@ public class FiveLossInfoController {
     @GetMapping("five/loss/cal")
     public JSONObject fiveLossCal(String ids){
         Map<String, Object> map = fiveLossService.fiveLossCalByZSGL(ids);
-        if (map.size() > 0)
+        if (map.size() > 0) {
             return JsonResult.successData(ResultCode.SUCCESS, map);
+        }
 
         return JsonResult.error(ResultCode.ERROR_MODEL);
     }
@@ -58,12 +59,12 @@ public class FiveLossInfoController {
 
 
     /**
-     * 五损数据计算
+     * 五损数据计算  弃用
      * @return
      */
     @GetMapping("cal")
     public JSONObject fiveCal(){
-        fiveLossService.fiveLossCal();
+//        fiveLossService.fiveLossCal();
         return JsonResult.success(ResultCode.SUCCESS);
     }
 }

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

@@ -4,8 +4,7 @@ package com.gyee.power.fitting.controller.fj;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
-import com.gyee.power.fitting.service.custom.temperature.PowerTemperatureService;
-import org.springframework.beans.factory.annotation.Autowired;
+import com.gyee.power.fitting.service.custom.PowerTemperatureService;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/RatedPowerController.java

@@ -3,7 +3,7 @@ package com.gyee.power.fitting.controller.fj;
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.result.JsonResult;
 import com.gyee.power.fitting.common.result.ResultCode;
-import com.gyee.power.fitting.service.custom.ratedpower.RatedPowerService;
+import com.gyee.power.fitting.service.custom.RatedPowerService;
 import org.springframework.web.bind.annotation.CrossOrigin;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;

+ 127 - 0
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/ReportController.java

@@ -0,0 +1,127 @@
+package com.gyee.power.fitting.controller.fj;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.gyee.power.fitting.common.result.JsonResult;
+import com.gyee.power.fitting.common.result.ResultCode;
+import com.gyee.power.fitting.common.spring.InitialRunner;
+import com.gyee.power.fitting.common.util.DateUtil;
+import com.gyee.power.fitting.model.Poweranalysisreport;
+import com.gyee.power.fitting.model.Windpowerstation;
+import com.gyee.power.fitting.service.PoweranalysisreportService;
+import com.gyee.power.fitting.service.custom.ReportService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 数据分析报告...
+ */
+@RestController
+@CrossOrigin
+@RequestMapping("/report")
+public class ReportController {
+
+    @Autowired
+    private ReportService report;
+    @Autowired
+    private PoweranalysisreportService reportService;
+
+
+    /** 分析报告
+     * @return
+     */
+    @GetMapping("list")
+    public JSONObject reportList(String station,
+                             @RequestParam(value = "st", required = false) String st,
+                             @RequestParam(value = "et", required = false) String et){
+        station = InitialRunner.stationMap.get(station);
+        List<Poweranalysisreport> list = reportService.getList(station, st, et);
+        return JsonResult.successData(ResultCode.SUCCESS, list);
+    }
+
+
+    /** 分析报告
+     * @return
+     */
+    @GetMapping("info")
+    public JSONObject reportInfo(String station, String date) {
+        Map<String, Object> map = new HashMap<>();
+        Optional<Windpowerstation> optional = InitialRunner.wpList.stream().filter(f -> f.getName().equals(station)).findFirst();
+        List<Poweranalysisreport> info = reportService.getInfo(station, date);
+        Map<String, List<Poweranalysisreport>> collect = info.stream()
+                .collect(Collectors.groupingBy(Poweranalysisreport::getModule, Collectors.toList()));
+        List<String> wtIds = Arrays.asList(info.stream().map(Poweranalysisreport::getWindturbine).collect(Collectors.joining(",")).split(","));
+        HashMap<String, Integer> mp = new HashMap<>();
+        for (int i=0;i<wtIds.size();i++) {
+            //判断是否为空,如果为空,则表示该内容首次出现,则次数为1
+            if(mp.get(wtIds.get(i))==null){
+                mp.put(wtIds.get(i),1);
+            }else{
+                mp.put(wtIds.get(i), Integer.parseInt(mp.get(wtIds.get(i)).toString())+1);
+            }
+        }
+
+        int count = 0;
+        String wt = "";
+        for (Map.Entry<String, Integer> entry : mp.entrySet()) {
+            if (entry.getValue() > count){
+                count = entry.getValue();
+                wt = entry.getKey();
+            }
+        }
+
+        Date date1 = DateUtil.parseStrtoDate(date, DateUtil.YYYY_MM);
+        Date date2 = DateUtil.addMonths(date1, 1);
+        map.put("station", optional.isPresent() ? optional.get() : null);
+        map.put("info", collect);
+        map.put("time", DateUtil.format(date1, "yyyy.MM.dd") + "—" + DateUtil.format(date2, "yyyy.MM.dd"));
+        map.put("wtcount", info.size());
+        map.put("hjwtid", wt);
+        map.put("hjcount", count);
+        return JsonResult.successData(ResultCode.SUCCESS, map);
+    }
+
+
+    @GetMapping("analysis")
+    public void report(String date) {
+//        Date month = DateUtil.addMonths(new Date(), -1);
+//        //上月1号0点值
+//        Date st = DateUtil.dateZeroFormat(month);
+//        //当月1号0点值
+//        Date et = DateUtil.dateZeroFormat(new Date());
+
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(DateUtil.parseStrtoDate(date, DateUtil.DATE_PATTERN));
+        Date st = DateUtil.dateZeroFormat(cal.getTime());
+        Date month = DateUtil.addMonths(cal.getTime(), 1);
+        Date et = DateUtil.dateZeroFormat(month);
+
+        report.calCurve(st, et);
+        report.calJTPCDF(st, et);
+        report.calMRLXS(st, et);
+        report.calBlade(st, et);
+        report.calStopTime(st, et);
+    }
+
+    public static void main(String[] args){
+        String date = "2023-03-01 00:00:00";
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(DateUtil.parseStrtoDate(date, DateUtil.DATE_PATTERN));
+        Date st = DateUtil.dateZeroFormat(cal.getTime());
+        Date month = DateUtil.addMonths(cal.getTime(), 1);
+        Date et = DateUtil.dateZeroFormat(month);
+
+        //        Date month = DateUtil.addMonths(new Date(), -1);
+//        //上月1号0点值
+//        Date st = DateUtil.dateZeroFormat(month);
+//        //当月1号0点值
+//        Date et = DateUtil.dateZeroFormat(new Date());
+
+        System.out.println(DateUtil.format(st, DateUtil.DATE_PATTERN));
+        System.out.println(DateUtil.format(et, DateUtil.DATE_PATTERN));
+    }
+}

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

@@ -6,7 +6,6 @@ import com.gyee.power.fitting.common.result.ResultCode;
 import com.gyee.power.fitting.service.custom.windresource.AvgSpeedInfoService;
 import com.gyee.power.fitting.service.custom.windresource.RatioService;
 import com.gyee.power.fitting.service.custom.windresource.WindDirectionService;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -27,7 +26,7 @@ public class WindDirectionController {
     private WindDirectionService windDirectionService;
 
     /***
-     * 风速风向玫瑰图
+     * 风速风向玫瑰图、静态偏航对风、雷达图
      * @param ids  预处理数据的id
      * @param mode 统计方式   0:单台统计   1:合并统计
      * @return
@@ -72,7 +71,7 @@ public class WindDirectionController {
      */
     @GetMapping("avg/speed")
     public JSONObject avgSpeedInfo(String ids){
-        Object o = avgSpeedInfoService.avgSpeedInfo(ids);
+        Object o = avgSpeedInfoService.getSpeedInfo(ids);
         return JsonResult.successData(ResultCode.SUCCESS, o);
     }
 }

+ 18 - 0
power-fitting/src/main/java/com/gyee/power/fitting/mapper/PoweranalysisreportMapper.java

@@ -0,0 +1,18 @@
+package com.gyee.power.fitting.mapper;
+
+import com.gyee.power.fitting.model.Poweranalysisreport;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-06-08
+ */
+public interface PoweranalysisreportMapper extends BaseMapper<Poweranalysisreport> {
+
+}

+ 80 - 0
power-fitting/src/main/java/com/gyee/power/fitting/model/Poweranalysisreport.java

@@ -0,0 +1,80 @@
+package com.gyee.power.fitting.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-06-08
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("POWERANALYSISREPORT")
+public class Poweranalysisreport extends Model<Poweranalysisreport> {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "ID", type = IdType.ASSIGN_ID)
+    private String id;
+
+    /**
+     * 场站
+     */
+    @TableField("STATION")
+    private String station;
+
+    /**
+     * 报告生成日期
+     */
+    @TableField("TIME")
+    private String time;
+
+    /**
+     * 模块(曲线偏差率、静态偏航对风、停机时长......)
+     */
+    @TableField("MODULE")
+    private String module;
+
+    /**
+     * 风机数量
+     */
+    @TableField("WTIDCOUNT")
+    private Integer wtidcount;
+
+    /**
+     * 风机编号
+     */
+    @TableField("WINDTURBINE")
+    private String windturbine;
+
+    /**
+     * 模块对应的分区
+     */
+    @TableField("SECTION")
+    private String section;
+
+    @TableField("REMARK")
+    private String remark;
+
+    @Override
+    protected Serializable pkVal() {
+        return null;
+    }
+
+}

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

@@ -1,9 +1,13 @@
 package com.gyee.power.fitting.model;
 
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableField;
 import java.io.Serializable;
+import java.util.Date;
+
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -18,11 +22,11 @@ import lombok.EqualsAndHashCode;
 @Data
 @EqualsAndHashCode(callSuper = false)
 @TableName("POWERFITTINGANALYSIS")
-public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
+public class Powerfittinganalysis extends Model<Powerfittinganalysis> implements Cloneable {
 
     private static final long serialVersionUID=1L;
 
-    @TableField("ID")
+    @TableId(value = "ID", type = IdType.ASSIGN_ID)
     private String id;
 
     @TableField("STATION")
@@ -81,6 +85,9 @@ public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
 
     @TableField("ISCAL")
     private Integer iscal = 0;  //0-没有计算  1-已计算
+
+    @TableField("CREATETIME")
+    private Date createtime;  //文件创建日期
 //
 //    @TableField("ISPROCESS")
 //    private Integer isprocess = 0;  //0-没有计算  1-已计算
@@ -90,4 +97,14 @@ public class Powerfittinganalysis extends Model<Powerfittinganalysis> {
         return null;
     }
 
+    @Override
+    public Powerfittinganalysis clone() {
+        Powerfittinganalysis p = null;
+        try {
+            p = (Powerfittinganalysis) super.clone();
+        } catch (CloneNotSupportedException e) {
+            e.printStackTrace();
+        }
+        return p;
+    }
 }

+ 3 - 1
power-fitting/src/main/java/com/gyee/power/fitting/model/Powerwindinfo.java

@@ -1,6 +1,8 @@
 package com.gyee.power.fitting.model;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import lombok.Data;
@@ -24,7 +26,7 @@ public class Powerwindinfo extends Model<Powerwindinfo> {
 
     private static final long serialVersionUID=1L;
 
-    @TableField("ID")
+    @TableId(value = "ID", type = IdType.ASSIGN_ID)
     private String id;
 
     @TableField("STATION")

+ 146 - 0
power-fitting/src/main/java/com/gyee/power/fitting/schedule/DataCacheOptionTask.java

@@ -0,0 +1,146 @@
+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.DataFittingService;
+import com.gyee.power.fitting.service.custom.curve.DataPrepareService;
+import com.gyee.power.fitting.service.custom.curve.DataProcessService;
+import com.gyee.power.fitting.service.custom.FiveLossService;
+import com.gyee.power.fitting.service.custom.windresource.AvgSpeedInfoService;
+import org.springframework.beans.factory.annotation.Autowired;
+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 DataCacheOptionTask {
+
+    @Resource
+    private DataPrepareService prepareService;
+    @Resource
+    private DataProcessService processService;
+    @Resource
+    private DataFittingService fittingService;
+    @Resource
+    private PowerfittinganalysisService powerService;
+    @Autowired
+    private FiveLossService fiveLossService;
+    @Autowired
+    private AvgSpeedInfoService speedInfoService;
+
+
+    /**
+     * 元数据缓存
+     * 每月1号凌晨1点执行
+     */
+    @Scheduled(cron = "0 0 1 1 * ?")
+    public void dataPrepare(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        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);
+        });
+    }
+
+
+    /**
+     * 根据缓存的元数据文件进行数据预处理
+     * 每月1号22点执行
+     */
+    @Scheduled(cron = "0 0 22 1 * ?")
+//    @Scheduled(cron="0/40 * * * * ?")
+    public void dataProcess(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        List<Powerfittinganalysis> list = powerService.selectByTime(Constants.DATA_PREPARE, st, et);
+        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);
+    }
+
+
+    /**
+     * 根据缓存的文件进行数据拟合
+     * 每月1号23点执行
+     */
+    @Scheduled(cron = "0 0 23 1 * ?")
+//    @Scheduled(cron="0/55 * * * * ?")
+    public void dataFitting(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        List<Powerfittinganalysis> list = powerService.selectByTime(Constants.DATA_PROCESS, st, et);
+        String ids = list.stream().map(Powerfittinganalysis::getId).collect(Collectors.joining(","));
+        fittingService.dataFitting(ids, 25.0, 0.0, 2500.0, 0.0, 10, 0);
+    }
+
+
+
+    /**
+     * 根据缓存的文件计算毛容量系数
+     * 每月2号1点执行
+     */
+    @Scheduled(cron = "0 0 1 2 * ?")
+    public void taskMRLXS(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        List<Powerfittinganalysis> list = powerService.selectByTime(Constants.DATA_PROCESS, st, et);
+        String ids = list.stream().map(Powerfittinganalysis::getId).collect(Collectors.joining(","));
+        speedInfoService.calSpeedInfo(ids);
+    }
+
+
+
+    /**
+     * 五损数据离线计算,使用已经缓存的文件
+     * 每月2号3点执行
+     */
+    @Scheduled(cron = "0 0 3 2 * ?")
+    public void fiveLossCal(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        List<Powerfittinganalysis> list = powerService.selectByTime(Constants.DATA_PREPARE, st, et);
+        if (list == null || list.size() == 0) {
+            return;
+        }
+
+        String ids = list.stream().map(Powerfittinganalysis::getId).collect(Collectors.joining(","));
+        fiveLossService.fiveLossCalByZSGL(ids);
+    }
+
+
+    public static void main(String[] args){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+        System.out.println(DateUtil.format(st, DateUtil.DATE_TIME_PATTERN));
+        System.out.println(DateUtil.format(et, DateUtil.DATE_TIME_PATTERN));
+    }
+}
+

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

@@ -1,65 +0,0 @@
-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;
-
-
-    /**
-     * 元数据缓存
-     * 每月1号凌晨1点执行
-     */
-    @Scheduled(cron = "0 0 1 1 * ?")
-    public void dataPrepare(){
-        Date month = DateUtil.addMonths(new Date(), -1);
-        //上月1号0点值
-        Date st = DateUtil.dateZeroFormat(month);
-        //当月1号0点值
-        Date et = DateUtil.dateZeroFormat(new Date());
-        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);
-        });
-    }
-
-
-    /**
-     * 根据缓存的文件进行数据预处理
-     * 每月1号22点执行
-     */
-    @Scheduled(cron = "0 0 22 1 * ?")
-    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);
-    }
-
-}

+ 3 - 5
power-fitting/src/main/java/com/gyee/power/fitting/schedule/FiveLossScheduleTask.java

@@ -3,7 +3,7 @@ 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 com.gyee.power.fitting.service.custom.FiveLossService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -21,14 +21,12 @@ public class FiveLossScheduleTask {
     /**
      * 五损数据离线计算,使用已经缓存的文件
      */
-    @Scheduled(cron = "0 0 23 1 * ?")  //每月1号23点执行
+    @Scheduled(cron = "0 0 3 2 * ?")  //每月2号3点执行
     public void fiveLossCal(){
         fiveLossService.fiveLossCal();
     }
 
-    /**
-     * 每月2号凌晨三点执行
-     */
+
     @Scheduled(cron = "0 0 3 * * ?")  //每天凌晨三点执行
     public void fiveLossLineCal(){
         // 是否实时计算五损数据

+ 38 - 0
power-fitting/src/main/java/com/gyee/power/fitting/schedule/ReportScheduleTask.java

@@ -0,0 +1,38 @@
+package com.gyee.power.fitting.schedule;
+
+
+import com.gyee.power.fitting.common.util.DateUtil;
+import com.gyee.power.fitting.service.PoweranalysisreportService;
+import com.gyee.power.fitting.service.custom.ReportService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+@Component
+public class ReportScheduleTask {
+
+    @Autowired
+    private ReportService reportService;
+
+
+    /**
+     * 数据报告分析
+     * 每月2号凌晨2点执行
+     */
+    @Scheduled(cron = "0 0 2 2 * ?")
+    public void dataPrepare(){
+        Date month = DateUtil.addMonths(new Date(), -1);
+        //上月1号0点值
+        Date st = DateUtil.dateZeroFormat(month);
+        //当月1号0点值
+        Date et = DateUtil.dateZeroFormat(new Date());
+
+        reportService.calCurve(st, et);
+        reportService.calJTPCDF(st, et);
+        reportService.calMRLXS(st, et);
+        reportService.calBlade(st, et);
+        reportService.calStopTime(st, et);
+    }
+}

+ 28 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/PoweranalysisreportService.java

@@ -0,0 +1,28 @@
+package com.gyee.power.fitting.service;
+
+import com.gyee.power.fitting.model.Poweranalysisreport;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-06-08
+ */
+public interface PoweranalysisreportService extends IService<Poweranalysisreport> {
+
+
+    List<Poweranalysisreport> getList(String station, String st, String et);
+
+
+    List<Poweranalysisreport> getInfo(String station, String date);
+
+
+    void saveBatch(List<Poweranalysisreport> list, String module);
+
+}

+ 8 - 13
power-fitting/src/main/java/com/gyee/power/fitting/service/PowerfittinganalysisService.java

@@ -3,6 +3,7 @@ package com.gyee.power.fitting.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -15,9 +16,6 @@ import java.util.List;
  */
 public interface PowerfittinganalysisService extends IService<Powerfittinganalysis> {
 
-
-    Powerfittinganalysis selectItemById(String id);
-
     /**
      * 根据类型查询
      * @param type   prepare
@@ -25,18 +23,15 @@ public interface PowerfittinganalysisService extends IService<Powerfittinganalys
      */
     List<Powerfittinganalysis> selectList(String type);
 
-    void insertItem(Powerfittinganalysis obj);
 
-    List<Powerfittinganalysis> selectListByIds(String ids);
+    List<Powerfittinganalysis> selectListById(String ids);
 
-    void deleteList(String ids);
 
-    /**
-     * 查询准备的数据
-     * @param type  Constants.DATA_PREPARE  Constants.DATA_PROCESS
-     * @param isCal
-     * @return
-     */
-    List<Powerfittinganalysis> selectListByIsCal(String type, int isCal);
+    void deleteList(String ids, String type);
+
+
+    void insertItem(Powerfittinganalysis obj);
+
 
+    List<Powerfittinganalysis> selectByTime(String type, Date st, Date et);
 }

+ 4 - 3
power-fitting/src/main/java/com/gyee/power/fitting/service/PowerwindinfoService.java

@@ -20,13 +20,14 @@ public interface PowerwindinfoService extends IService<Powerwindinfo> {
     /**
      * 通过风机ID和日期查询
      * @param wtId
-     * @param dates
+     * @param date
      * @return
      */
-    List<Powerwindinfo> selectListByWtIdAndTime(String wtId, List<String> dates);
+    List<Powerwindinfo> selectByWtIdAndTime(String wtId, String date);
 
 
-    void insertBatch(List<Powerwindinfo> list);
+    List<Powerwindinfo> selectByTime(String st, String et);
+
 
     void deleteBatch(String wtId, List<String> dates);
 }

+ 87 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/BladeService.java

@@ -0,0 +1,87 @@
+package com.gyee.power.fitting.service.custom;
+
+import com.gyee.power.fitting.common.util.DateUtil;
+import com.gyee.power.fitting.common.util.FileUtil;
+import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.custom.PowerPointData;
+import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import lombok.val;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+
+@Service
+public class BladeService {
+
+
+    @Resource
+    private PowerfittinganalysisService powerService;
+
+
+    /**
+     * 3个叶片的角度
+     * 并网状态下开桨是否趋近于0度,停机状态下收桨是否趋近于90度
+     * @param ids
+     * @return
+     */
+    public Object bladeAngle(String ids){
+        TreeMap<String, Object> map = new TreeMap<>();
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
+        if (list.size() == 0) {
+            return map;
+        }
+
+        Powerfittinganalysis obj = list.get(0);
+        List<Map<String, Object>> pbw = new ArrayList<>();
+        List<Map<String, Object>> ptj = new ArrayList<>();
+        List<PowerPointData> ls = csvParse(obj);
+        for (PowerPointData item : ls){
+            double v = (item.getYp1() + item.getYp2() + item.getYp3()) / 3;
+            double avg = new BigDecimal(v).setScale(2, RoundingMode.CEILING).doubleValue();
+            if (item.getFilter() == 0){
+                //风机正常并网且风速在5-12m
+                if (item.getMxzt() == 2 && item.getSpeed() >= 5 && item.getSpeed() <= 12){
+                    Map<String, Object> mbw = new HashMap<>();
+                    mbw.put("time", DateUtil.format(item.getTime(), DateUtil.DATE_PATTERN));
+                    mbw.put("value", avg);
+                    pbw.add(mbw);
+                }
+            }
+            //风机在不发电情况下
+            if (item.getMxzt() != 2 && item.getMxzt() != 3 && item.getMxzt() != 10
+                    && item.getMxzt() != 11 && item.getMxzt() != 12 && avg > 60){
+                Map<String, Object> mtj = new HashMap<>();
+                mtj.put("time", DateUtil.format(item.getTime(), DateUtil.DATE_PATTERN));
+                mtj.put("value", 90 - avg);
+                ptj.add(mtj);
+            }
+        }
+        map.put("bw", pbw);
+        map.put("tj", ptj);
+        map.put("wtId", obj.getWindturbine());
+
+        return map;
+    }
+
+
+    /**
+     * csv 文件解析成对象
+     * @param obj
+     * @return
+     */
+    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(",");
+            PowerPointData data = new PowerPointData(split, true);
+            list.add(data);
+        }
+
+        return list;
+    }
+
+}

+ 93 - 86
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/fiveloss/FiveLossService.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.service.custom.fiveloss;
+package com.gyee.power.fitting.service.custom;
 
 import com.alibaba.fastjson.JSONObject;
 import com.gyee.power.fitting.common.constants.Constants;
@@ -122,7 +122,7 @@ public class FiveLossService {
         Map<String, Windturbine> wtmap = InitialRunner.wtMap;
         Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglMap;
 
-        List<Powerfittinganalysis> analyses = analysisService.selectListByIsCal(Constants.DATA_PREPARE, 0);
+        List<Powerfittinganalysis> analyses = analysisService.selectList(Constants.DATA_PREPARE);
         if (analyses.size() == 0){
             log.info("======风机榜效帮计算结束,Powerfittinganalysis数据为空.............");
             return;
@@ -241,6 +241,97 @@ public class FiveLossService {
 
 
     /**
+     * 使用文件,通过自算功率计算五损数据
+     * @param ids  准备的数据ID
+     */
+    /** 根据已缓存的文件计算损失电量
+     * 明细状态
+     * 0-待机  1-手动停机  2-正常发电  3-缺陷降出力  4-限电降出力  5-限电停机  6-故障停机
+     * 7-场内受累停机  8-检修停机  9-场内受累检修  10-电网受累  11-环境受累  12-风机离线
+     */
+    public Map<String, Object> fiveLossCalByZSGL(String ids) {
+        log.info("======损失电量计算开始.............");
+        Map<String, Object> promise = new HashMap<>();
+        List<FjjxbVo> result = new ArrayList<>();
+        Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglMap;
+
+        List<Powerfittinganalysis> analyses = analysisService.listByIds(Arrays.asList(ids.split(",")));
+        if (analyses.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 || zsglmap.size() == 0 || zsglmap.get(p.getWindturbine()) == null){
+                log.info(p.getWindturbine() + "文件内容或当前风机的自算功率为空.............");
+                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(new BigDecimal(llfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setSjfdl(new BigDecimal(rfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setJhjx(new BigDecimal(jhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setFjhjx(new BigDecimal(fjhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setXd(new BigDecimal(xdssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setXn(new BigDecimal(xnssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setSl(new BigDecimal(slssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setSpeed(new BigDecimal(speed/content.size()).setScale(2, RoundingMode.FLOOR).doubleValue());
+            vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.FLOOR).doubleValue() : 0);
+            result.add(vo);
+        }
+        log.info("======风机榜效帮计算结束.............");
+        result.stream().sorted(Comparator.comparing(FjjxbVo::getId));
+        /** 添加标题 **/
+        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;
+    }
+
+
+
+    /**
      * 通过线上实时计算五损数据
      * @param st   开始时间
      * @param et   结束时间
@@ -350,88 +441,4 @@ public class FiveLossService {
         return ssdl > 0 ? ssdl : 0;
     }
 
-    /**
-     * 使用文件,通过自诉案功率计算五损数据
-     * @param ids  准备的数据ID
-     */
-    public Map<String, Object> fiveLossCalByZSGL(String ids) {
-        log.info("======损失电量计算开始.............");
-        Map<String, Object> promise = new HashMap<>();
-        List<FjjxbVo> result = new ArrayList<>();
-        Map<String, Map<Double, Double>> zsglmap = InitialRunner.zsllglMap;
-
-        List<Powerfittinganalysis> analyses = analysisService.selectListByIds(ids);
-        if (analyses.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 || zsglmap.size() == 0 || zsglmap.get(p.getWindturbine()) == null){
-                log.info(p.getWindturbine() + "文件内容或当前风机的自算功率为空.............");
-                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(new BigDecimal(llfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setSjfdl(new BigDecimal(rfdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setJhjx(new BigDecimal(jhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setFjhjx(new BigDecimal(fjhjxssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setXd(new BigDecimal(xdssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setXn(new BigDecimal(xnssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setSl(new BigDecimal(slssdl).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setSpeed(new BigDecimal(speed/content.size()).setScale(2, RoundingMode.FLOOR).doubleValue());
-            vo.setFnlly(llfdl > 0 ? new BigDecimal(rfdl / llfdl).setScale(2, RoundingMode.FLOOR).doubleValue() : 0);
-            result.add(vo);
-        }
-        log.info("======风机榜效帮计算结束.............");
-        result.stream().sorted(Comparator.comparing(FjjxbVo::getId));
-        /** 添加标题 **/
-        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;
-    }
-    
 }

+ 7 - 7
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/temperature/PowerTemperatureService.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.service.custom.temperature;
+package com.gyee.power.fitting.service.custom;
 
 import com.gyee.power.fitting.common.alg.PowerTemperatureAlg;
 import com.gyee.power.fitting.common.spring.InitialRunner;
@@ -30,7 +30,7 @@ public class PowerTemperatureService {
      */
     public Object ratedPower(String ids) {
         List<Object> result = new ArrayList<>();
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list == null || list.size() == 0) {
             return result;
         }
@@ -38,7 +38,7 @@ public class PowerTemperatureService {
         for (Powerfittinganalysis obj : list){
             String[] split = obj.getProcessid().split(",");
             for (String id : split){
-                Powerfittinganalysis pf = powerService.selectItemById(id);
+                Powerfittinganalysis pf = powerService.getById(id);
                 List<Modelpowerdetails> ls = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
                 Double theoryPower = ls.get(ls.size() - 1).getTheorypower(); //理论功率
                 Map<String, Object> map = csvParse(pf);//数据解析
@@ -61,7 +61,7 @@ public class PowerTemperatureService {
 
     public Object curveAnalysis(String id) {
         Map<String, Object> map = new HashMap<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         if (obj == null) {
             return map;
         }
@@ -83,7 +83,7 @@ public class PowerTemperatureService {
         //散点ID
         String[] ids = obj.getProcessid().split(",");
         for (String pid : ids) {
-            Powerfittinganalysis pf = powerService.selectItemById(pid);
+            Powerfittinganalysis pf = powerService.getById(pid);
             //数据解析
             List<String> lp = FileUtil.readFile(pf.getPath(), true);
             for (int i = 1; i < lp.size(); i++){
@@ -154,11 +154,11 @@ public class PowerTemperatureService {
 
         /** 添加内容 **/
         List<PowerPointData> list = new ArrayList<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         if (obj == null)
             return map;
         String[] ids = obj.getProcessid().split(",");
-        Powerfittinganalysis item = powerService.selectItemById(ids[0]);
+        Powerfittinganalysis item = powerService.getById(ids[0]);
         List<String> ls = FileUtil.readFile(item.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
             PowerPointData data = new PowerPointData(ls.get(i).split(","), false);

+ 3 - 3
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ratedpower/RatedPowerService.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.service.custom.ratedpower;
+package com.gyee.power.fitting.service.custom;
 
 import com.gyee.power.fitting.common.spring.InitialRunner;
 import com.gyee.power.fitting.common.util.DateUtil;
@@ -32,7 +32,7 @@ public class RatedPowerService {
         Map<String, Object> result = new HashMap<>();
         Map<String, Equipmentmodel> eqMap = InitialRunner.equipmentMap;
         Map<String, Windturbine> wtMap = InitialRunner.wtMap;
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list.size() == 0) {
             return result;
         }
@@ -43,7 +43,7 @@ public class RatedPowerService {
             String[] spid = obj.getProcessid().split(",");
             for (String id : spid){
                 TreeMap<String, Object> mp = new TreeMap<>();
-                Powerfittinganalysis item = powerService.selectItemById(id);
+                Powerfittinganalysis item = powerService.getById(id);
                 List<PowerPointData> ls = csvParse(item);
                 all.addAll(ls);
                 double avg = ls.size() > 0 ? ls.stream().mapToDouble(PowerPointData::getPower).average().getAsDouble() : 0;

+ 353 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ReportService.java

@@ -0,0 +1,353 @@
+package com.gyee.power.fitting.service.custom;
+
+import com.gyee.power.fitting.common.alg.WindDirectionALG;
+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.model.Poweranalysisreport;
+import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.Powerwindinfo;
+import com.gyee.power.fitting.model.custom.PowerFittingData;
+import com.gyee.power.fitting.model.custom.PowerPointData;
+import com.gyee.power.fitting.service.PoweranalysisreportService;
+import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import com.gyee.power.fitting.service.PowerwindinfoService;
+import lombok.extern.slf4j.Slf4j;
+import lombok.val;
+import lombok.var;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Slf4j
+@Component
+public class ReportService {
+
+    @Autowired
+    private PowerfittinganalysisService powerService;
+    @Autowired
+    private PowerwindinfoService windinfoService;
+    @Autowired
+    private PoweranalysisreportService reportService;
+
+
+    /**
+     * 曲线偏差率分析
+     */
+    public void calCurve(Date st, Date et){
+        List<Poweranalysisreport> result = new ArrayList<>();
+        var list = powerService.selectByTime(Constants.DATA_FITTING, st, et);
+        val collect = list.stream().collect(Collectors.groupingBy(Powerfittinganalysis::getStationcn, Collectors.toList()));
+        collect.forEach((k, v) -> {
+            String date = null;
+            List<String> pcl_all = new ArrayList<>();
+            List<String> pcl_5 = new ArrayList<>();
+            List<String> pcl_10 = new ArrayList<>();
+            List<String> pcl_12 = new ArrayList<>();
+            List<String> pcl_25 = new ArrayList<>();
+            try {
+                for (Powerfittinganalysis obj : v) {
+                    if (date == null) {
+                        date = DateUtil.format(obj.getCreatetime(), DateUtil.YYYY_MM);
+                    }
+                    //3-25m风速区间曲线偏差率小于0
+                    if (obj.getPcratio() < 0) {
+                        pcl_all.add(obj.getWindturbine());
+                    }
+                    //3-5m风速区间曲线偏差率小于0
+                    if (obj.getPc5ratio() < 0) {
+                        pcl_5.add(obj.getWindturbine());
+                    }
+                    //5-10m风速区间曲线偏差率小于0
+                    if (obj.getPc10ratio() < 0) {
+                        pcl_10.add(obj.getWindturbine());
+                    }
+                    //10-12m风速区间曲线偏差率小于0
+                    if (obj.getPc12ratio() < 0) {
+                        pcl_12.add(obj.getWindturbine());
+                    }
+                    //12-25m风速区间曲线偏差率小于0
+                    if (obj.getPc25ratio() < 0) {
+                        pcl_25.add(obj.getWindturbine());
+                    }
+                }
+                if (pcl_all.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_CURVE, "3-25m", pcl_all, null);
+                }
+                if (pcl_5.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_CURVE, "3-5m", pcl_5, null);
+                }
+                if (pcl_10.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_CURVE, "5-10m", pcl_10, null);
+                }
+                if (pcl_12.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_CURVE, "10-12m", pcl_12, null);
+                }
+                if (pcl_25.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_CURVE, "12-25m", pcl_12, null);
+                }
+            }catch (Exception e){
+                log.error("ReportService--calCurve" + e.getMessage());
+            }
+        });
+        reportService.saveBatch(result, Constants.MODULE_CURVE);
+    }
+
+
+    /**
+     * 静态偏航对风分析
+     */
+    public void calJTPCDF(Date st,  Date et){
+        List<Poweranalysisreport> result = new ArrayList<>();
+        var list = powerService.selectByTime(Constants.DATA_PROCESS, st, et);
+        val collect = list.stream().collect(Collectors.groupingBy(Powerfittinganalysis::getStationcn, Collectors.toList()));
+        collect.forEach((k, v) -> {
+            String date = null;
+            // 负值偏大、中度负值、中度正值、正值偏大
+            List<String> lsL2 = new ArrayList<>();
+            List<String> lsL1 = new ArrayList<>();
+            List<String> lsR1 = new ArrayList<>();
+            List<String> lsR2 = new ArrayList<>();
+           try {
+               for (Powerfittinganalysis obj : v){
+                   List<PowerPointData> data = fileParse(obj, false);
+                   //静态偏航数据
+                   Map<String, Object> mp = WindDirectionALG.windDeviationPoint(data);
+                   int avg = (int) mp.get("avg");
+                   List<Object> ls = (List<Object>) mp.get("data");
+                   //点太少不做计算
+                   if (ls.size() < 50){
+                       continue;
+                   }
+                   if (date == null){
+                       date = DateUtil.format(obj.getCreatetime(), DateUtil.YYYY_MM);
+                   }
+                   if (avg <= -15){
+                       lsL2.add(obj.getWindturbine());
+                   }
+//                if (avg > -15 && avg <= -10){
+//                    lsL1.add(obj.getWindturbine());
+//                }
+//                if (avg >= 10 && avg < 15){
+//                    lsR1.add(obj.getWindturbine());
+//                }
+                   if (avg >= 15){
+                       lsR2.add(obj.getWindturbine());
+                   }
+               }
+               if (lsL2.size() > 0){
+                   buildObj(result, k, date, Constants.MODULE_STATIC_WIND, "负值偏大(15+deg)", lsL2, null);
+               }
+//            if (lsL1.size() > 0){
+//                buildObj(result, k, date, Constants.MODULE_STATIC_WIND, "中度负值(10-15deg)", lsL1);
+//            }
+//            if (lsR1.size() > 0){
+//                buildObj(result, k, date, Constants.MODULE_STATIC_WIND, "中度正值(10-15deg)", lsR1);
+//            }
+               if (lsR2.size() > 0){
+                   buildObj(result, k, date, Constants.MODULE_STATIC_WIND, "正值偏大(15+deg)", lsR2, null);
+               }
+           } catch (Exception e){
+               log.error("ReportService--calJTPCDF" + e.getMessage());
+           }
+        });
+        reportService.saveBatch(result, Constants.MODULE_STATIC_WIND);
+    }
+
+
+    /**
+     * 容量系数分析
+     */
+    public void calMRLXS(Date st,  Date et){
+        List<Poweranalysisreport> result = new ArrayList<>();
+        var list = windinfoService.selectByTime(DateUtil.format(st, DateUtil.YYYY_MM), DateUtil.format(et, DateUtil.YYYY_MM));
+        val collect = list.stream().collect(Collectors.groupingBy(Powerwindinfo::getStation, Collectors.toList()));
+        collect.forEach((k, v) -> {
+            String date = null;
+            // 毛容量系数 0-0.15   0.15-0.2
+            List<String> ls1 = new ArrayList<>();
+            List<String> ls2 = new ArrayList<>();
+            try {
+                for (Powerwindinfo obj : v){
+                    if (date == null){
+                        date = obj.getTime();
+                    }
+                    if (obj.getAvgspeed() < 5 && obj.getMrxs() <= 0.15){
+                        ls1.add(obj.getWindturbine());
+                    }
+                    if (obj.getAvgspeed() >= 5 && obj.getMrxs() > 0.15 && obj.getMrxs() <= 0.2){
+                        ls2.add(obj.getWindturbine());
+                    }
+
+                }
+                if (ls1.size() > 0){
+                    buildObj(result, InitialRunner.stationMap.get(k), date, Constants.MODULE_MLXS, "0-15%", ls1, null);
+                }
+                if (ls2.size() > 0){
+                    buildObj(result, InitialRunner.stationMap.get(k), date, Constants.MODULE_MLXS, "15-20%", ls2, null);
+                }
+            } catch (Exception e){
+                log.info("ReportService--calMRLXS" + e.getMessage());
+            }
+        });
+        reportService.saveBatch(result, Constants.MODULE_MLXS);
+    }
+
+
+    /**
+     * 桨距角分析
+     */
+    public void calBlade(Date st,  Date et){
+        List<Poweranalysisreport> result = new ArrayList<>();
+        var list = powerService.selectByTime(Constants.DATA_PROCESS, st, et);
+        val collect = list.stream().collect(Collectors.groupingBy(Powerfittinganalysis::getStationcn, Collectors.toList()));
+        collect.forEach((k, v) -> {
+            String date = null;
+            // 并网分析、停机分析
+            List<String> lsbw = new ArrayList<>();
+            List<String> lstj = new ArrayList<>();
+            try {
+                for (Powerfittinganalysis obj : v){
+                    List<PowerPointData> ls = fileParse(obj, true);
+                    int countBW = 0;
+                    int countTJ = 0;
+                    for (PowerPointData item : ls){
+                        if (date == null){
+                            date = DateUtil.format(obj.getCreatetime(), DateUtil.YYYY_MM);
+                        }
+                        double angle = (item.getYp1() + item.getYp2() + item.getYp3()) / 3;
+                        double avg = new BigDecimal(angle).setScale(2, RoundingMode.CEILING).doubleValue();
+                        if (item.getFilter() == 0){
+                            //风机正常并网且风速在5-12m
+                            if (item.getMxzt() == 2 && item.getSpeed() >= 5 && item.getSpeed() <= 12 && avg > 8){
+                                countBW += 1;
+                            }
+                        }
+                        //风机在不发电情况下
+                        if (item.getMxzt() != 2 && item.getMxzt() != 3 && item.getMxzt() != 10
+                                && item.getMxzt() != 11 && item.getMxzt() != 12 && avg > 60){
+                            if ((90 - avg) > 8){
+                                countTJ += 1;
+                            }
+                        }
+                    }
+                    if (countBW >= 50){
+                        lsbw.add(obj.getWindturbine());
+                    }
+                    if (countTJ >= 50){
+                        lstj.add(obj.getWindturbine());
+                    }
+                }
+                if (lsbw.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_BLADE, "并网桨距角偏大", lsbw, null);
+                }
+                if (lstj.size() > 0){
+                    buildObj(result, k, date, Constants.MODULE_BLADE, "停机桨距角偏大", lstj, null);
+                }
+            } catch (Exception e){
+                log.error("ReportService--calBLADE" + e.getMessage());
+            }
+        });
+        reportService.saveBatch(result, Constants.MODULE_BLADE);
+    }
+
+
+
+    /**
+     * 停机时间
+     */
+    public void calStopTime(Date st,  Date et){
+        List<Poweranalysisreport> result = new ArrayList<>();
+        var list = powerService.selectByTime(Constants.DATA_PREPARE, st, et);
+        val collect = list.stream().collect(Collectors.groupingBy(Powerfittinganalysis::getStationcn, Collectors.toList()));
+        collect.forEach((k, v) -> {
+            String date = null;
+            double time1 = 0.0,  time2 = 0.0;
+            List<String> ls1 = new ArrayList<>();
+            List<String> ls2 = new ArrayList<>();
+            try {
+                for (Powerfittinganalysis obj : v) {
+                    if (date == null){
+                        date = DateUtil.format(obj.getCreatetime(), DateUtil.YYYY_MM);
+                    }
+                    List<PowerPointData> datas = fileParse(obj, false);
+                    if (datas == null || datas.size() == 0) {
+                        continue;
+                    }
+                    //3-5m的停机时间、大于25m的停机时间
+                    double times1 = 0.0,  times2 = 0.0;
+                    double interval = DateUtil.getTimeDiff(datas.get(1).getTime(), datas.get(2).getTime()); //两条数据的间隔时间
+                    for (PowerPointData item : datas){
+                        if (item.getMxzt() != 2 && item.getSpeed() > 3.0 && item.getSpeed() < 5.0){
+                            times1 += interval;
+                        }
+                        if (item.getSpeed() >= 25 && item.getMxzt() == 2){
+                            times2 += interval;
+                        }
+                    }
+                    // 3-5m风速停机时长超过5000分钟
+                    if (times1 > 5000) {
+                        time1 += times1;
+                        ls1.add(obj.getWindturbine());
+                    }
+                    // 暴风天气未停机
+                    if (times2 >  10) {
+                        time2 += times2;
+                        ls2.add(obj.getWindturbine());
+                    }
+                }
+                if (ls1.size() > 0) {
+                    buildObj(result, k, date, Constants.MODULE_STOP_TIME, "3-5m", ls1, String.valueOf(time1));
+                }
+                if (ls2.size() > 0) {
+                    buildObj(result, k, date, Constants.MODULE_STOP_TIME, "大于25m", ls2, String.valueOf(time2));
+                }
+            } catch (Exception e){
+                log.error("ReportService--calStopTime" + e.getMessage());
+            }
+        });
+        reportService.saveBatch(result, Constants.MODULE_STOP_TIME);
+    }
+
+
+    private void buildObj(List<Poweranalysisreport> list, String station, String date, String module, String section, List<String> wtIds, String remark){
+        Poweranalysisreport report = new Poweranalysisreport();
+        report.setStation(station);
+        report.setModule(module);
+        report.setSection(section);
+        report.setTime(date);
+        report.setWtidcount(wtIds.size());
+        report.setWindturbine(StringUtils.join(wtIds, ","));
+        report.setRemark(remark);
+        list.add(report);
+    }
+
+
+    private List<PowerFittingData> csvParse(Powerfittinganalysis obj){
+        var list = new ArrayList<PowerFittingData>();
+        val content = FileUtil.readFile(obj.getPath(), true);
+        for (int i = 1; i < content.size(); i++){
+            PowerFittingData data = new PowerFittingData(content.get(i).split(","));
+            list.add(data);
+        }
+        return list;
+    }
+
+
+    private List<PowerPointData> fileParse(Powerfittinganalysis obj, boolean isFilter){
+        val list = new ArrayList<PowerPointData>();
+        val 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, isFilter);
+            list.add(data);
+        }
+        return list;
+    }
+}

+ 1 - 1
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/socket/WebSocketServer.java

@@ -1,4 +1,4 @@
-package com.gyee.power.fitting.service.custom.socket;
+package com.gyee.power.fitting.service.custom;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;

+ 0 - 124
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/blade/BladeService.java

@@ -1,124 +0,0 @@
-package com.gyee.power.fitting.service.custom.blade;
-
-import com.gyee.power.fitting.common.util.DateUtil;
-import com.gyee.power.fitting.common.util.FileUtil;
-import com.gyee.power.fitting.model.Powerfittinganalysis;
-import com.gyee.power.fitting.model.custom.PowerPointData;
-import com.gyee.power.fitting.service.PowerfittinganalysisService;
-import lombok.val;
-import org.springframework.stereotype.Service;
-
-import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.math.RoundingMode;
-import java.util.*;
-import java.util.stream.Collectors;
-
-@Service
-public class BladeService {
-
-    @Resource
-    private PowerfittinganalysisService powerService;
-
-    /**
-     * 3个叶片的角度
-     * @param ids
-     * @return
-     */
-    public Object bladeAngle(String ids){
-        Map<String, Object> result = new HashMap<>();
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
-        if (list.size() == 0) {
-            return result;
-        }
-
-        List<String> time = new ArrayList<>();
-        List<Object> temp = new ArrayList<>();
-        for (int i = 0; i < list.size(); i++){
-            Powerfittinganalysis obj = list.get(i);
-            TreeMap<String, Object> mp = new TreeMap<>();
-            List<Double> p1 = new ArrayList<>();
-            List<Double> p2 = new ArrayList<>();
-            List<Double> p3 = new ArrayList<>();
-            List<PowerPointData> ls = csvParse(obj);
-            for (PowerPointData item : ls){
-                p1.add(item.getYp1());
-                p2.add(item.getYp2());
-                p3.add(item.getYp3());
-            }
-            mp.put("yp1", p1);
-            mp.put("yp2", p2);
-            mp.put("yp3", p3);
-            mp.put("c12", curveDeviation(p1, p2));
-            mp.put("c13", curveDeviation(p1, p3));
-            mp.put("c23", curveDeviation(p2, p3));
-            mp.put("wt", obj.getWindturbine());
-            if (time.size() == 0) {
-                time.addAll(ls.stream().map(m -> DateUtil.format(m.getTime(), DateUtil.DATE_SECOND_PATTERN)).collect(Collectors.toList()));
-            }
-            temp.add(mp);
-        }
-        result.put("time", time);
-        result.put("angle", temp);
-
-        return result;
-    }
-
-    public Object bladeAnalysis(String ids){
-        Map<String, Object> result = new HashMap<>();
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
-        if (list.size() == 0)
-            return result;
-
-        for (int i = 0; i < list.size(); i++) {
-            Powerfittinganalysis obj = list.get(i);
-            List<PowerPointData> ls = csvParse(obj);
-            for (PowerPointData item : ls) {
-
-            }
-        }
-
-        return result;
-    }
-
-
-    /**
-     * csv 文件解析成对象
-     * @param obj
-     * @return
-     */
-    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(",");
-            PowerPointData data = new PowerPointData(split, false);
-            list.add(data);
-        }
-
-        return list;
-    }
-
-    /**
-     * 计算叶片的曲线偏差率
-     * @param ls1
-     * @param ls2
-     * @return
-     */
-    private double curveDeviation(List<Double> ls1, List<Double> ls2){
-        double result = 0;
-        if (ls1.size() == 0 || ls1.size() != ls2.size())
-            return result;
-
-        double count = 0;
-        for (int i = 0; i < ls1.size(); i++){
-            double diff = ls1.get(i) - ls2.get(i);
-            double v = ls2.get(i) != 0 ? diff / ls2.get(i) * 100 : 0;
-            count += v;
-        }
-        result = new BigDecimal(count / ls1.size()).setScale(2, RoundingMode.FLOOR).doubleValue();
-
-        return result;
-    }
-
-}

+ 22 - 21
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataFittingService.java

@@ -52,7 +52,7 @@ public class DataFittingService {
 
     /**
      * 曲线拟合
-     * @param ids
+     * @param ids  预处理数据的id
      * @param maxs
      * @param mins
      * @param maxp
@@ -66,7 +66,7 @@ public class DataFittingService {
         if (mode == 0){  //单台拟合
             String[] splitId = ids.split(",");
             for (String id : splitId) {
-                List<Powerfittinganalysis> list = powerService.selectListByIds(id);
+                List<Powerfittinganalysis> list = powerService.selectListById(id);
                 List<Double> arraySpeed = new ArrayList<>();
                 List<Double> arrayPower = new ArrayList<>();
                 List<String> line = FileUtil.readFile(list.get(0).getPath(), true);
@@ -77,7 +77,7 @@ public class DataFittingService {
             }
         }
         if (mode == 1){  //合并拟合
-            List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+            List<Powerfittinganalysis> list = powerService.selectListById(ids);
             AtomicReference<Double> maxP = new AtomicReference<>(0.0);
             List<Double> arraySpeed = new ArrayList<>();
             List<Double> arrayPower = new ArrayList<>();
@@ -91,7 +91,7 @@ public class DataFittingService {
             object.set(fittingMode(list, maxP.get(), arraySpeed, arrayPower, dimension, mode));
         }
         if (mode == 2){  //同名拟合
-            List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+            List<Powerfittinganalysis> list = powerService.selectListById(ids);
             Map<String, List<Powerfittinganalysis>> map = list.stream().collect(Collectors.groupingBy(d -> d.getWindturbine()));
             map.forEach((k, ls) -> {
                 if (ls.size() > 1){
@@ -131,7 +131,7 @@ public class DataFittingService {
      * @return
      */
     public List<Object> dataFittingTree(){
-        List<Powerfittinganalysis> list = powerService.selectList(Constants.DATA_FITTING);
+        List<Powerfittinganalysis> list = powerService.selectList( Constants.DATA_FITTING);
         List<Object> ls = PowerFittingUtil.powerDataTree(list, Constants.DATA_FITTING);
         return ls;
     }
@@ -151,7 +151,7 @@ public class DataFittingService {
 
         /** 添加内容 **/
         List<PowerFittingData> list = new ArrayList<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         List<String> ls = FileUtil.readFile(obj.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
             PowerFittingData data = new PowerFittingData(ls.get(i).split(","));
@@ -175,7 +175,7 @@ public class DataFittingService {
      */
     public Map<String, Object> dataFittingCurve(String id){
         Map<String, Object> map = new HashMap<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
 
         //实际功率、风速、Cp值
         List<Object> sjglList = new ArrayList<>();
@@ -196,7 +196,7 @@ public class DataFittingService {
         List<PowerPointData> yyd = new ArrayList<>(); //有用点
         List<PowerPointData> wyd = new ArrayList<>(); //无用点
         for (String pid : ids){
-            Powerfittinganalysis pf = powerService.selectItemById(pid);
+            Powerfittinganalysis pf = powerService.getById(pid);
             List<String> lp = FileUtil.readFile(pf.getPath(), true);
             for (int i = 1; i < lp.size(); i++){
                 String[] split = lp.get(i).split(",");
@@ -267,9 +267,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(",");
-            PowerPointData data = new PowerPointData(split, true);//是否过滤 0:没过滤 1:过滤
-            double x = data.getSpeed();    //风速
-            double y = data.getPower();    //功率
+            //是否过滤 0:没过滤 1:过滤
+            PowerPointData data = new PowerPointData(split, true);
+            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);
@@ -405,10 +406,10 @@ public class DataFittingService {
                     points.add(new Point(power.getSpeed(), power.getEnsurepower()));
             }
 
-            double maxp5 = list.stream().filter(f -> 5.0 == f.getSpeed()).collect(Collectors.toList()).get(0).getEnsurepower();
-            double maxp10 = list.stream().filter(f -> 10.0 == f.getSpeed()).collect(Collectors.toList()).get(0).getEnsurepower();
-            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 maxp5 = list.stream().filter(f -> 5.0 == f.getSpeed()).findFirst().get().getEnsurepower();
+            double maxp10 = list.stream().filter(f -> 10.0 == f.getSpeed()).findFirst().get().getEnsurepower();
+            double maxp12 = list.stream().filter(f -> 12.0 == f.getSpeed()).findFirst().get().getEnsurepower();
+            double maxp25 = list.stream().filter(f -> 25.0 == f.getSpeed()).findFirst().get().getEnsurepower();
 
             //曲线偏差率
             double pcl = PowerFittingALG.curveDeviationRatio2(point, points, maxp25, 3, 25);
@@ -438,7 +439,7 @@ public class DataFittingService {
         List<Object> result = new ArrayList<>();
         Map<String, Windturbine> wtMap = InitialRunner.wtMap;
         Map<String, Equipmentmodel> eqMap = InitialRunner.equipmentMap;
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list.size() == 0) {
             return result;
         }
@@ -482,14 +483,14 @@ public class DataFittingService {
      */
     public Object dataFittingTime(String ids) {
         List<Object> result = new ArrayList<>();
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list.size() == 0)
             return result;
 
         list.forEach(item -> {
             Map<String, Object> map = new HashMap<>();
-            int[] time1 = new int[5];  //0:运行 1:3-5m   2:5-10m   3:10-12m  4:12-25m(全功率)
-            int[] time2 = new int[4];  //0:3-5m   1:5-10m   2:10-12m  3:12-25m(全功率)
+            int[] time1 = new int[5];  //0:运行时间: 0:全部  1:3-5m   2:5-10m   3:10-12m  4:12-25m(全功率)
+            int[] time2 = new int[4];  //0:不运行时间: 3-5m   1:5-10m   2:10-12m  3:12-25m(全功率)
             String[] split = item.getProcessid().split(",");//数据准备ID,获取文件
             for (String id : split){
                 List<String> line = FileUtil.readFile(powerService.getById(id).getPath(), true);
@@ -504,7 +505,7 @@ public class DataFittingService {
         return result;
     }
 
-    private void timeTotal(int[] time1, int[] time2, List<String> line){
+    public void timeTotal(int[] time1, int[] time2, 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++){
@@ -539,7 +540,7 @@ public class DataFittingService {
      */
     @Async
     public void curveSave(String ids) {
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list.size() == 0)
             return;
 

+ 23 - 14
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataPrepareService.java

@@ -18,7 +18,7 @@ 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 com.gyee.power.fitting.service.custom.WebSocketServer;
 import lombok.extern.slf4j.Slf4j;
 import lombok.val;
 import org.springframework.scheduling.annotation.Async;
@@ -26,10 +26,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.DecimalFormat;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -63,27 +60,36 @@ public class DataPrepareService {
             try{
                 List<String> points = config.getPoints();
                 Map<String, List<Windturbinetestingpointai2>> collect = InitialRunner.pointMap.get(wt).stream().collect(Collectors.groupingBy(w -> w.getUniformcode()));
-                if (collect.size() < 8)
+                if (points.size() != collect.size()) {
+                    log.error("测点数据不足,points: " + points);
+                    collect.forEach((key, value) -> {
+                        log.error("测点数据异常: point:" + key);
+                        log.error("测点数据异常: point:" + value);
+                    });
+                    socketServer.sendInfo(JsonResult.seccess(4000, wt + "风机测点异常,数据准备失败"), null);
                     continue;
+                }
 
                 for (int i = 0; i < points.size(); i++){
                     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);
-                    if (data == null || data.size() < 0)
+                    if (data == null || data.size() < 0) {
                         break;
+                    }
                     result.add(data);
                     TimeUnit.MILLISECONDS.sleep(200);
                 }
-                if (result.size() != points.size())
+                if (result.size() != points.size()) {
                     continue;
+                }
 
                 String content = assemble(result);
                 // 处理的数据保存在本地
                 String wtCode = InitialRunner.wtMap.get(wt).getCode();
                 String fileName = config.getFilePathPrepare() + station + "_" + wtCode + "_" + System.currentTimeMillis() / 1000 + ".csv";
                 boolean flag = FileUtil.writeFile(fileName, content);
-                if (flag){  // TODO  保存数据库
+                if (flag){
                     Powerfittinganalysis obj = new Powerfittinganalysis();
                     obj.setStation(station);
                     obj.setStationcn(InitialRunner.stationMap.get(station));
@@ -94,12 +100,14 @@ public class DataPrepareService {
                     obj.setPath(fileName);
                     obj.setType(Constants.DATA_PREPARE);
                     obj.setInterp(interval);
-                    powerService.insertItem(obj);
+                    obj.setCreatetime(DateUtil.parseStrtoDate(DateUtil.format(st, DateUtil.DATE_TIME_PATTERN), DateUtil.DATE_TIME_PATTERN));
+                    powerService.save(obj);
                 }
                 socketServer.sendInfo(JsonResult.successData(ResultCode.SUCCESS, new DecimalFormat("0.00").format((double)(k + 1)/wtId.size())), null);
-                System.out.println("数据准备完成:" + wt);
+                log.info("数据准备完成:" + wt);
             } catch (Exception e) {
-                socketServer.sendInfo(JsonResult.error(), null);
+                socketServer.sendInfo(JsonResult.error(ResultCode.ERROR_POINT), null);
+                log.error("时序数据读取异常:", e.getMessage());
             } finally {}
         }
     }
@@ -131,7 +139,7 @@ public class DataPrepareService {
 
         /** 添加内容  读取前500行 **/
         List<PowerPointData> list = new ArrayList<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(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(","), false);
@@ -145,8 +153,9 @@ public class DataPrepareService {
     }
 
     private String assemble(List<List<TsDoubleData>> list){
-        if (list.size() == 0)
+        if (list.size() == 0) {
             return null;
+        }
 
         StringBuilder sb = setTitle();
         List<TsDoubleData> data = list.get(0);

+ 4 - 7
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java

@@ -38,7 +38,7 @@ public class DataProcessService {
     /**
      * 数据预处理
      *
-     * @param ids     预处理数据的ID
+     * @param ids    数据的ID
      * @param maxs   最大风速
      * @param mins   最小风速
      * @param maxp   最大功率
@@ -54,11 +54,8 @@ public class DataProcessService {
      */
     public void dataProcess(List<String> ids, Double maxs, Double mins, Double maxp, Double minp, Boolean isfbw,
                             Boolean isfhl, Boolean isbw, Boolean istj, Boolean isglpc, Boolean isqfh, Integer qfhdj) {
-        ids.forEach(id -> {
-            Powerfittinganalysis obj = powerService.selectItemById(id);
-            if (obj == null)
-                return;
-
+        List<Powerfittinganalysis> objs = powerService.selectListById(StringUtils.join(ids, ","));
+        objs.forEach(obj -> {
             /** 读取csv数据  转换成对象数组 **/
             List<PowerPointData> eis = new ArrayList<>();
             List<String> list = FileUtil.readFile(obj.getPath(), true);
@@ -116,7 +113,7 @@ public class DataProcessService {
 
         /** 添加内容  读取前500行 **/
         List<PowerPointData> list = new ArrayList<>();
-        Powerfittinganalysis obj = powerService.selectItemById(id);
+        Powerfittinganalysis obj = powerService.getById(id);
         List<String> ls = FileUtil.readFile(obj.getPath(), false);
         for (int i = 1; i < ls.size(); i++){
             String[] split = ls.get(i).split(",");

+ 104 - 39
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/windresource/AvgSpeedInfoService.java

@@ -12,6 +12,7 @@ import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.PowerwindinfoService;
 import lombok.val;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -31,48 +32,82 @@ public class AvgSpeedInfoService {
     private PowerfittinganalysisService powerService;
 
     /**
-     * 平均风速、毛容系数
+     * 查询毛容量系数
+     * @param ids
+     * @return
      */
-    public Object avgSpeedInfo(String ids){
+    public Object getSpeedInfo(String ids){
         List<Object> result = new ArrayList<>();
-        Map<String, Equipmentmodel> eqMap = InitialRunner.equipmentMap;
-        Map<String, Windturbine> wtMap = InitialRunner.wtMap;
-        List<Powerfittinganalysis> listObj = powerService.selectListByIds(ids);
-        if (listObj == null || listObj.size() == 0)
+        List<String> lsId = Arrays.asList(ids.split(","));
+        List<Powerwindinfo> list = windInfoService.listByIds(lsId);
+        if (list == null || list.size() == 0){
+            List<Object> ls = calSpeedInfo(ids);
+            if (ls.size() > 0) {
+                result.addAll(ls);
+            }
             return result;
+        }
+
+        //求id的差集,找出没有计算过的
+        List<String> reduce = lsId.stream().filter(f -> !list.stream()
+                .map(Powerwindinfo::getId).collect(Collectors.toList()).contains(f))
+                .collect(Collectors.toList());
+        List<Object> ls = calSpeedInfo(StringUtils.join(reduce, ","));
+        if (ls.size() > 0) {
+            result.addAll(ls);
+        }
+        //查询同期数据
+        List<Powerwindinfo> preLs = windInfoService.selectByWtIdAndTime(null, DateUtil.getLastYearCurrentDate(list.get(0).getTime(), DateUtil.YYYY_MM));
+        for (Powerwindinfo info : list){
+            Map<String, Object> map = new HashMap<>();
+            Optional<Powerwindinfo> optional = preLs.stream().filter(f -> f.getWindturbine().equals(info.getWindturbine())).findFirst();
+            map.put("wtId", info.getWindturbine());
+            map.put("currentData", info);
+            map.put("preData", optional.isPresent() ? optional.get() : null);
+            result.add(map);
+        }
 
+        return result;
+    }
+
+
+    /**
+     * 计算平均风速、毛容系数
+     */
+    public List<Object> calSpeedInfo(String ids){
+        List<Object> result = new ArrayList<>();
+        List<Powerfittinganalysis> listObj = powerService.listByIds(Arrays.asList(ids.split(",")));
+
+        List<Powerwindinfo> currentList = new ArrayList<>();
         for (Powerfittinganalysis obj : listObj){
-            TreeMap<String, Object> map = new TreeMap<>();
-            List<Powerwindinfo> currentList = new ArrayList<>();
-            List<PowerPointData> ls = csvParse(obj);
-            Map<String, List<PowerPointData>> collect = ls.stream().collect(Collectors.groupingBy(PowerPointData::getTime));
-            collect.forEach((k, v) -> {
-                Powerwindinfo info = new Powerwindinfo();
-                info.setStation(obj.getStation());
-                info.setWindturbine(obj.getWindturbine());
-                info.setTime(DateUtil.format(k, DateUtil.DATE_PATTERN));
-                double speed = v.stream().mapToDouble(PowerPointData::getSpeed).average().getAsDouble();
-                //毛容系数=生产电量(MWh)/ (风机容量MW * 总时间(h))
-                double mrxs = (v.get(v.size() - 1).getDl() / 1000) / (eqMap.get(wtMap.get(obj.getWindturbine()).getModelid()).getPowerproduction() / 1000 * 24);
-                info.setAvgspeed(new BigDecimal(speed).setScale(2, RoundingMode.FLOOR).doubleValue());
-                info.setMrxs(new BigDecimal(mrxs).setScale(4, RoundingMode.FLOOR).doubleValue());
-                currentList.add(info);
-            });
-            // 删除已有数据同时保存新数据
-            List<String> dates = currentList.stream().map(m -> m.getTime()).collect(Collectors.toList());
-            windInfoService.deleteBatch(obj.getWindturbine(), dates);
-            windInfoService.insertBatch(currentList);
+            Map<String, Object> mp = csvParse(obj);
+            if (mp.size() == 0){
+                continue;
+            }
 
+            double speed = new BigDecimal((Double) mp.get("speed")).setScale(2, RoundingMode.FLOOR).doubleValue();
+            //毛容系数=生产电量(MWh)/ (风机容量MW * 总时间(h))
+            double mrxs = (Double) mp.get("fdl") / (InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getPowerproduction() * ((Double) mp.get("time") / 60));
+
+            Powerwindinfo info = new Powerwindinfo();
+            info.setId(obj.getId());
+            info.setStation(obj.getStation());
+            info.setWindturbine(obj.getWindturbine());
+            info.setTime((String) mp.get("date"));
+            info.setAvgspeed(new BigDecimal(Double.isNaN(speed) ? 0 : speed).setScale(2, RoundingMode.FLOOR).doubleValue());
+            info.setMrxs(new BigDecimal(Double.isNaN(mrxs) ? 0 : mrxs).setScale(4, RoundingMode.FLOOR).doubleValue());
+            currentList.add(info);
             //同期数据
-            List<String> preDate = dates.stream().map(f -> DateUtil.getLastYearCurrentDate(f, DateUtil.DATE_PATTERN)).collect(Collectors.toList());
-            List<Powerwindinfo> preList = windInfoService.selectListByWtIdAndTime(obj.getWindturbine(), preDate);
+            List<Powerwindinfo> preObj = windInfoService.selectByWtIdAndTime(obj.getWindturbine(), DateUtil.getLastYearCurrentDate((String) mp.get("date"), DateUtil.YYYY_MM));
 
+            Map<String, Object> map = new HashMap<>();
             map.put("wtId", obj.getWindturbine());
-            map.put("currentData", currentList);
-            map.put("preData", preList);
-
+            map.put("currentData", info);
+            map.put("preData", preObj.size() > 0 ? preObj.get(0) : null);
             result.add(map);
         }
+        // 保存新数据
+        windInfoService.saveBatch(currentList);
 
         return result;
     }
@@ -82,16 +117,46 @@ public class AvgSpeedInfoService {
      * @param obj
      * @return
      */
-    private List<PowerPointData> csvParse(Powerfittinganalysis obj){
-        List<PowerPointData> list = new ArrayList<>();
+    private Map<String, Object> csvParse(Powerfittinganalysis obj){
+        Map<String, Object> map = new HashMap<>();
+        double speed = 0.0, fdl = 0.0, interval = 0, time = 0;
+        //日期 - yyyy-MM
+        String date = null;
+
         val 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, false);
-            data.setTime(DateUtil.format(data.getTime(), DateUtil.DATE_PATTERN));
-            list.add(data);
+        if (content.size() == 0) {
+            return map;
+        }
+        for (int i = 1; i < content.size() - 1; i++){
+            PowerPointData data = new PowerPointData(content.get(i).split(","), false);
+            String format = DateUtil.format(data.getTime(), DateUtil.DATE_PATTERN);
+            speed += data.getSpeed();
+
+            PowerPointData data2 = new PowerPointData(content.get(i + 1).split(","), false);
+            String format2 = DateUtil.format(data2.getTime(), DateUtil.DATE_PATTERN);
+            if (!format2.equals(format)) {
+                fdl += data.getDl();
+            }
+            //计算元数据等间隔时间
+            if (interval == 0) {
+                interval = DateUtil.minutesDiff(DateUtil.parseStrtoDate(data.getTime(), DateUtil.DATE_TIME_PATTERN), DateUtil.parseStrtoDate(data2.getTime(), DateUtil.DATE_TIME_PATTERN));
+            }
+            //计算元数据月份
+            if (date == null) {
+                date = DateUtil.format(data.getTime(), DateUtil.YYYY_MM);
+            }
+            //计算总运行时间
+            if (data2.getMxzt() == 2) {
+                time += interval;
+            }
         }
 
-        return list;
+        map.put("speed", speed / content.size());
+        map.put("fdl", fdl);
+        map.put("time", time);
+        map.put("date", date);
+
+        return map;
     }
+
 }

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

@@ -10,10 +10,8 @@ import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import lombok.val;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+
+import java.util.*;
 
 
 /**
@@ -34,7 +32,7 @@ public class RatioService {
     public List<Object> windDeviationRatio(String ids, int mode){
         List<Object> list = new ArrayList<>();
 
-        List<Powerfittinganalysis> listObj = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> listObj = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (mode == 0){
             listObj.forEach(obj -> {
                 List<PowerPointData> points = csvParse(obj);

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

@@ -9,10 +9,7 @@ import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 @Service
@@ -23,13 +20,13 @@ public class WindDirectionService {
 
 
     /**
-     * 风向玫瑰图\风向频率玫瑰图
+     * 风向玫瑰图风向频率玫瑰图
      * @param ids  预处理数据的id
      * @param mode  0:单台风机  1:多台风机合并
      * @return
      */
     public Object fxRoses(String ids, int mode){
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list == null || list.size() == 0)
             return null;
 
@@ -70,7 +67,7 @@ public class WindDirectionService {
      * @return
      */
     public Object fxCountRoses(String ids, int mode){
-        List<Powerfittinganalysis> list = powerService.selectListByIds(ids);
+        List<Powerfittinganalysis> list = powerService.listByIds(Arrays.asList(ids.split(",")));
         if (list == null || list.size() == 0)
             return null;
 

+ 88 - 0
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PoweranalysisreportServiceImpl.java

@@ -0,0 +1,88 @@
+package com.gyee.power.fitting.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.gyee.power.fitting.common.alg.WindDirectionALG;
+import com.gyee.power.fitting.common.base.ExcludeQueryWrapper;
+import com.gyee.power.fitting.common.constants.Constants;
+import com.gyee.power.fitting.common.util.DateUtil;
+import com.gyee.power.fitting.common.util.FileUtil;
+import com.gyee.power.fitting.model.Poweranalysisreport;
+import com.gyee.power.fitting.mapper.PoweranalysisreportMapper;
+import com.gyee.power.fitting.model.Powerfittinganalysis;
+import com.gyee.power.fitting.model.Powerwindinfo;
+import com.gyee.power.fitting.model.custom.PowerFittingData;
+import com.gyee.power.fitting.model.custom.PowerPointData;
+import com.gyee.power.fitting.service.PoweranalysisreportService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import com.gyee.power.fitting.service.PowerwindinfoService;
+import lombok.val;
+import lombok.var;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author chenmh
+ * @since 2023-06-08
+ */
+@Service
+public class PoweranalysisreportServiceImpl extends ServiceImpl<PoweranalysisreportMapper, Poweranalysisreport> implements PoweranalysisreportService {
+
+    @Override
+    public List<Poweranalysisreport> getList(String station, String st, String et) {
+        List<Poweranalysisreport> result = new ArrayList<>();
+        ExcludeQueryWrapper<Poweranalysisreport> wrapper = new ExcludeQueryWrapper<>();
+        wrapper.eq("station", station);
+        wrapper.ge("time", DateUtil.format(st, DateUtil.YYYY_MM));
+        wrapper.le("time", DateUtil.format(et, DateUtil.YYYY_MM));
+        List<Poweranalysisreport> list = baseMapper.selectList(wrapper);
+        Map<String, Map<String, List<Poweranalysisreport>>> collect = list.stream().collect(Collectors.groupingBy(Poweranalysisreport::getTime,
+                Collectors.groupingBy(Poweranalysisreport::getStation, Collectors.toList())));
+        collect.forEach((k, v) -> v.forEach((k1, v1) -> {
+            if (v1.size() > 0){
+                Poweranalysisreport report = v1.get(0);
+                int count = (int) v1.stream().map(m -> m.getWtidcount()).count();
+                report.setWtidcount(count);
+                result.add(report);
+            }
+        }));
+
+        return result;
+    }
+
+
+    @Override
+    public List<Poweranalysisreport> getInfo(String station, String date) {
+        ExcludeQueryWrapper<Poweranalysisreport> wrapper = new ExcludeQueryWrapper<>();
+        wrapper.eq("station", station);
+        wrapper.eq("time", date);
+        List<Poweranalysisreport> list = baseMapper.selectList(wrapper);
+        return list;
+    }
+
+    @Override
+    public void saveBatch(List<Poweranalysisreport> list, String module) {
+        if (list == null || list.size() == 0){
+            return;
+        }
+        QueryWrapper<Poweranalysisreport> wrapper = new QueryWrapper<>();
+        wrapper.eq("station", list.get(0).getStation());
+        wrapper.eq("time", list.get(0).getTime());
+        wrapper.eq("module", module);
+        Integer count = baseMapper.selectCount(wrapper);
+        if (count == 0){
+            saveBatch(list);
+        }
+    }
+}

+ 36 - 39
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerfittinganalysisServiceImpl.java

@@ -1,17 +1,17 @@
 package com.gyee.power.fitting.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 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.PowerfittinganalysisMapper;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 /**
  * <p>
@@ -25,27 +25,12 @@ import java.util.List;
 public class PowerfittinganalysisServiceImpl extends ServiceImpl<PowerfittinganalysisMapper, Powerfittinganalysis> implements PowerfittinganalysisService {
 
     @Override
-    public Powerfittinganalysis selectItemById(String id) {
-        Powerfittinganalysis obj = new Powerfittinganalysis();
-
-        ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
-        wrapper.eq("ID", id);
-        try{
-            obj = baseMapper.selectOne(wrapper);
-        }catch (Exception e){
-            log.error("PowerfittinganalysisServiceImpl--selectItemById", e);
-        }
-
-        return obj;
-    }
-
-    @Override
     public List<Powerfittinganalysis> selectList(String type) {
         List<Powerfittinganalysis> list = new ArrayList();
 
         ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
         wrapper.eq("type", type);
-
+        wrapper.orderByDesc("interval");
         try{
             list = baseMapper.selectList(wrapper);
         }catch (Exception e){
@@ -55,49 +40,61 @@ public class PowerfittinganalysisServiceImpl extends ServiceImpl<Powerfittingana
         return list;
     }
 
-
     @Override
-    public void insertItem(Powerfittinganalysis obj) {
-        if (obj == null)
-            return;
-
-        obj.setId(SnowFlakeUtil.generateId());
+    public List<Powerfittinganalysis> selectListById(String ids) {
+        List<Powerfittinganalysis> list = new ArrayList();
+        List<List<String>> collect = CollectUtil.groupListByQty(Arrays.asList(ids.split(",")), 1000);
         try{
-            baseMapper.insert(obj);
+            //in方法超过1000条异常
+            collect.forEach(item -> {
+                ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
+                wrapper.in("id", item);
+                list.addAll(baseMapper.selectList(wrapper));
+            });
         }catch (Exception e){
-            log.error("PowerfittinganalysisServiceImpl--insertItem", e);
+            log.error("PowerfittinganalysisServiceImpl--selectList", e);
         }
+        return list;
     }
 
+
     @Override
-    public List<Powerfittinganalysis> selectListByIds(String ids) {
+    public void deleteList(String ids, String type) {
+        List<List<String>> collect = CollectUtil.groupListByQty(Arrays.asList(ids.split(",")), 1000);
         try{
-            return baseMapper.selectBatchIds(Arrays.asList(ids.split(",")));
+            //in方法超过1000条异常
+            collect.forEach(ls -> {
+                ExcludeQueryWrapper<Powerfittinganalysis> wrapper = new ExcludeQueryWrapper<>();
+                wrapper.eq("TYPE", type.toLowerCase());
+                wrapper.in("ID", ls);
+                baseMapper.delete(wrapper);
+            });
         }catch (Exception e){
-            log.error("PowerfittinganalysisServiceImpl--selectListByIds", e);
+            log.error("PowerfittinganalysisServiceImpl--deleteList", e);
         }
-
-        return Collections.EMPTY_LIST;
     }
 
     @Override
-    public void deleteList(String ids) {
+    public void insertItem(Powerfittinganalysis obj) {
         try{
-            baseMapper.deleteBatchIds(Arrays.asList(ids.split(",")));
+            obj.setId(SnowFlakeUtil.generateId());
+            baseMapper.insert(obj);
         }catch (Exception e){
-            log.error("PowerfittinganalysisServiceImpl--deleteList", e);
+            log.error("PowerfittinganalysisServiceImpl--selectByTime", e);
         }
     }
 
+
     @Override
-    public List<Powerfittinganalysis> selectListByIsCal(String type, int isCal) {
+    public List<Powerfittinganalysis> selectByTime(String type, Date st, Date et) {
         ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
         wrapper.eq("type", type);
-        wrapper.eq("iscal", isCal);
+        wrapper.ge("createtime", st);
+        wrapper.le("createtime", et);
         try{
             return baseMapper.selectList(wrapper);
         }catch (Exception e){
-            log.error("PowerfittinganalysisServiceImpl--selectListByIsCal", e);
+            log.error("PowerfittinganalysisServiceImpl--selectByTime", e);
         }
 
         return Collections.EMPTY_LIST;

+ 13 - 12
power-fitting/src/main/java/com/gyee/power/fitting/service/impl/PowerwindinfoServiceImpl.java

@@ -11,6 +11,7 @@ import com.gyee.power.fitting.model.Powerwindinfo;
 import com.gyee.power.fitting.service.PowerwindinfoService;
 import org.springframework.stereotype.Service;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
 import java.util.List;
@@ -27,10 +28,10 @@ import java.util.List;
 public class PowerwindinfoServiceImpl extends ServiceImpl<PowerwindinfoMapper, Powerwindinfo> implements PowerwindinfoService {
 
     @Override
-    public List<Powerwindinfo> selectListByWtIdAndTime(String wtIds, List<String> dates) {
+    public List<Powerwindinfo> selectByWtIdAndTime(String wtId, String date) {
         ExcludeQueryWrapper<Powerwindinfo> wrapper = new ExcludeQueryWrapper<>();
-        wrapper.eq("windturbine", wtIds)
-                .in("time", dates);
+        wrapper.eq("windturbine", wtId)
+                .eq("time", date);
         try{
             return baseMapper.selectList(wrapper);
         } catch (Exception e){
@@ -40,20 +41,20 @@ public class PowerwindinfoServiceImpl extends ServiceImpl<PowerwindinfoMapper, P
     }
 
     @Override
-    public void insertBatch(List<Powerwindinfo> list) {
-        list.forEach(item -> item.setId(SnowFlakeUtil.generateId()));
+    public List<Powerwindinfo> selectByTime(String st, String et) {
+        ExcludeQueryWrapper wrapper = new ExcludeQueryWrapper();
+        wrapper.ge("time", st);
+        wrapper.le("time", et);
         try{
-            if (list.size() > 1000){
-                List<List<Powerwindinfo>> coll = CollectUtil.groupListByQty(list, 1000);
-                coll.forEach(ls -> saveBatch(ls));
-            } else {
-                saveBatch(list);
-            }
+            return baseMapper.selectList(wrapper);
         }catch (Exception e){
-            log.error("PowerwindinfoServiceImpl--insertBatch", e);
+            log.error("PowerwindinfoServiceImpl--selectByTime", e);
         }
+
+        return Collections.EMPTY_LIST;
     }
 
+
     @Override
     public void deleteBatch(String wtId, List<String> dates) {
         QueryWrapper<Powerwindinfo> wrapper = new QueryWrapper<>();

+ 2 - 0
power-fitting/src/main/resources/application.yaml

@@ -95,6 +95,8 @@ uniformcode:
   yp1: AI085  #叶片1
   yp2: AI086  #叶片2
   yp3: AI087  #叶片3
+
+uniformcodegf:
   gfgzqd: SSFS #光伏光照强度
   gfzjwd: FCCFTWD #光伏组件温度
   gfady: AIG061 #光伏A相电压

+ 21 - 0
power-fitting/src/main/resources/mapper/PoweranalysisreportMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.gyee.power.fitting.mapper.PoweranalysisreportMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.gyee.power.fitting.model.Poweranalysisreport">
+        <result column="ID" property="id" />
+        <result column="STATION" property="station" />
+        <result column="TIME" property="time" />
+        <result column="MODULE" property="module" />
+        <result column="WTIDCOUNT" property="wtidcount" />
+        <result column="WINDTURBINE" property="windturbine" />
+        <result column="REMARK" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        ID, STATION, TIME, MODULE, WTIDCOUNT, WINDTURBINE
+    </sql>
+
+</mapper>

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

@@ -13,7 +13,7 @@
         <result column="TIME" property="time" />
         <result column="PATH" property="path" />
         <result column="TYPE" property="type" />
-        <result column="PROCESSID" property="processID" />
+        <result column="PROCESSID" property="processid" />
         <result column="CPAVG" property="cpavg" />
         <result column="SPEEDAVG" property="speedavg" />
         <result column="FREQUENCY" property="frequency" />
@@ -23,13 +23,13 @@
         <result column="PC12RATIO" property="pc12ratio" />
         <result column="PC25RATIO" property="pc25ratio" />
         <result column="INTERP" property="interp" />
-        <result column="ISPROCESS" property="isprocess" />
         <result column="ISCAL" property="iscal" />
+        <result column="CREATETIME" property="createtime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <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, ISPROCESS
+        ID, STATION, STATIONCN, WINDTURBINE, code, interval, TIME, PATH, TYPE, PROCESSID, CPAVG, SPEEDAVG, FREQUENCY, PCRATIO, PC5RATIO, PC10RATIO, PC12RATIO, PC25RATIO, INTERP, ISCAL, CREATETIME
     </sql>
 
 </mapper>