Selaa lähdekoodia

try catch数据库配置不全导致的异常;
增加数据导入功能

chenminghua 1 vuosi sitten
vanhempi
commit
765cdf4ac4

+ 8 - 0
power-fitting/pom.xml

@@ -124,6 +124,14 @@
             <artifactId>commons-lang3</artifactId>
         </dependency>
 
+        <!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+            <version>42.4.1</version>
+        </dependency>
+
+
     </dependencies>
 
     <build>

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

@@ -31,15 +31,19 @@ public class PowerProcessALG {
      * @param isqfh  是否欠符合
      * @param qfhdj  欠符合等级
      * @return
+     * // 0-待机  1-手动停机  2-正常发电  3-缺陷降出力  4-限电降出力  5-限电停机  6-故障停机
+     * // 7-场内受累停机  8-检修停机  9-场内受累检修  10-电网受累  11-环境受累  12-风机离线
      */
     public static List<PowerPointData> dataProcess(List<PowerPointData> list, Map<Double, Double> map,
                                                    Double maxs, Double mins, Double maxp, Double minp, Boolean isfbw,
                                                    Boolean isfhl, Boolean isbw, Boolean istj, Boolean isglpc, Boolean isqfh, Integer qfhdj){
         String timeBW = DateUtil.format(new Date(0), DateUtil.DATE_TIME_PATTERN);
+        String timeTJ = DateUtil.format(new Date(0), DateUtil.DATE_TIME_PATTERN);
         List<PowerPointData> tempei = new ArrayList<>();
         List<PowerPointData> tempqf = new ArrayList<>();
+        List<PowerPointData> temptj = new ArrayList<>();
 
-        //TODO 数据过滤  // 0正常,1过滤掉
+        //TODO 数据过滤  // 0正常,1过滤掉,2停机数据过滤
         for (PowerPointData item : list) {
             int filter = 0;
             int fjstatus = 0;
@@ -133,6 +137,29 @@ public class PowerProcessALG {
                     }
                 }
             }
+
+            int tjstatus = 0;
+            int tjflag = -1;
+            //过滤停机、待机等后10分钟和并网前10分钟数据
+            if (item.getMxzt() == 0 || item.getMxzt() == 1 || item.getMxzt() == 5 || item.getMxzt() == 6 || item.getMxzt() == 7 || item.getMxzt() == 8 || item.getMxzt() == 9){
+                tjstatus = 1;
+                tjflag = item.getMxzt();
+                timeTJ = item.getTime();
+            } else {
+                tjstatus = 0;
+                tjflag = -1;
+            }
+            if (tjstatus == 1){
+                if (temptj.size() > 0){
+                    if (DateUtil.getTimeDiff(temptj.get(0).getTime(), timeTJ) >= 10 && tjflag == item.getMxzt()){
+                        item.setFilter(2);
+                        temptj.remove(0);
+                    }
+                }
+                temptj.add(item);
+            } else {
+                temptj.clear();
+            }
         }
 
         return list;

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

@@ -33,6 +33,8 @@ public enum ResultCode {
     PARAM_NOT_COMPLETE(1004, "参数缺失"),
     ERROR_DATA_DIR(1005, "目录创建失败"),
     ERROR_DATA_FILE(1006, "文件上传失败"),
+    ERROR_FILE_BLANK(1007, "文件不能为空"),
+
 
     /* 用户错误 */
     USER_NOT_LOGIN(2001, "用户未登录"),

+ 3 - 0
power-fitting/src/main/java/com/gyee/power/fitting/common/util/NumberUtil.java

@@ -100,6 +100,9 @@ public class NumberUtil {
             case 600:
                 interval = "十分钟";
                 break;
+            case 900:
+                interval = "十五分钟";
+                break;
             default:
                 interval = "一分钟";
         }

+ 49 - 0
power-fitting/src/main/java/com/gyee/power/fitting/controller/fj/DataPrepareController.java

@@ -1,17 +1,26 @@
 package com.gyee.power.fitting.controller.fj;
 
 import com.alibaba.fastjson.JSONObject;
+import com.gyee.power.fitting.common.config.GyeeConfig;
+import com.gyee.power.fitting.common.constants.Constants;
 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.common.util.FileUtil;
+import com.gyee.power.fitting.common.util.NumberUtil;
 import com.gyee.power.fitting.model.Powerfittinganalysis;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
 import com.gyee.power.fitting.service.custom.curve.DataPrepareService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
+import java.io.IOException;
 import java.util.*;
 
 
@@ -24,6 +33,8 @@ import java.util.*;
 public class DataPrepareController {
 
     @Resource
+    private GyeeConfig config;
+    @Resource
     private DataPrepareService prepareService;
     @Resource
     private PowerfittinganalysisService powerService;
@@ -82,4 +93,42 @@ public class DataPrepareController {
         Powerfittinganalysis obj = powerService.getById(id);
         FileUtil.download(obj.getPath(), response);
     }
+
+    /**
+     * 文件导入
+     */
+    @PostMapping("upload")
+    public JSONObject dataImport(@RequestParam("file") MultipartFile[] files, HttpServletRequest request,
+                                 String station, int interval, long st, long et){
+        if (Objects.isNull(files) || files.length < 1){
+            return JsonResult.error(ResultCode.ERROR_FILE_BLANK);
+        }
+
+        List<Powerfittinganalysis> list = new ArrayList<>();
+        for (MultipartFile file : files){
+            String[] name = file.getOriginalFilename().split("_");
+            String fileName = config.getFilePathPrepare() + name[0] + "_" + name[1] + "_" + name[2] + "_" + System.currentTimeMillis() / 1000 + ".csv";
+            Powerfittinganalysis obj = new Powerfittinganalysis();
+            obj.setStation(name[0] + "_" + name[1]);
+            obj.setStationcn(station);
+            obj.setWindturbine(name[2]);
+            obj.setCode(name[2]);
+            obj.setTime(DateUtil.format(st, DateUtil.YYYY_MM_DD_CHN) + "-" + DateUtil.format(et, DateUtil.YYYY_MM_DD_CHN));
+            obj.setInterval(NumberUtil.toNum(interval));
+            obj.setPath(fileName);
+            obj.setType(Constants.DATA_PREPARE);
+            obj.setInterp(interval);
+            obj.setCreatetime(DateUtil.parseStrtoDate(DateUtil.format(st, DateUtil.DATE_TIME_PATTERN), DateUtil.DATE_TIME_PATTERN));
+            list.add(obj);
+            try {
+                File dest = new File(fileName);
+                file.transferTo(dest);
+            } catch (IOException e) {
+                e.printStackTrace();
+                return JsonResult.error(ResultCode.ERROR_DATA_TYPE);
+            }
+        }
+        powerService.saveBatch(list);
+        return  JsonResult.success(ResultCode.SUCCESS);
+    }
 }

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

@@ -87,7 +87,7 @@ public class ReportController {
 
 
     @GetMapping("analysis")
-    public void report(String date) {
+    public String report(String date) {
 //        Date month = DateUtil.addMonths(new Date(), -1);
 //        //上月1号0点值
 //        Date st = DateUtil.dateZeroFormat(month);
@@ -105,6 +105,8 @@ public class ReportController {
         report.calMRLXS(st, et);
         report.calBlade(st, et);
         report.calStopTime(st, et);
+
+        return "success";
     }
 
     public static void main(String[] args){

+ 5 - 6
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/BladeService.java

@@ -43,19 +43,18 @@ public class BladeService {
             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){
+                if (item.getMxzt() == 2 && item.getSpeed() >= 5 && item.getSpeed() <= 12 && avg < 20){
                     Map<String, Object> mbw = new HashMap<>();
-                    mbw.put("time", DateUtil.format(item.getTime(), DateUtil.DATE_PATTERN));
+                    mbw.put("time", item.getTime());
                     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){
+            if (item.getFilter() == 2 && avg > 70){
                 Map<String, Object> mtj = new HashMap<>();
-                mtj.put("time", DateUtil.format(item.getTime(), DateUtil.DATE_PATTERN));
-                mtj.put("value", 90 - avg);
+                mtj.put("time", item.getTime());
+                mtj.put("value", new BigDecimal(90 - avg).setScale(2, RoundingMode.CEILING).doubleValue());
                 ptj.add(mtj);
             }
         }

+ 9 - 5
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/ReportService.java

@@ -41,6 +41,7 @@ public class ReportService {
      * 曲线偏差率分析
      */
     public void calCurve(Date st, Date et){
+        log.info("=====曲线偏差率分析");
         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()));
@@ -104,6 +105,7 @@ public class ReportService {
      * 静态偏航对风分析
      */
     public void calJTPCDF(Date st,  Date et){
+        log.info("=====静态偏航对风分析");
         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()));
@@ -165,6 +167,7 @@ public class ReportService {
      * 容量系数分析
      */
     public void calMRLXS(Date st,  Date et){
+        log.info("=====容量系数分析");
         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()));
@@ -204,6 +207,7 @@ public class ReportService {
      * 桨距角分析
      */
     public void calBlade(Date st,  Date et){
+        log.info("=====桨距角分析");
         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()));
@@ -223,16 +227,15 @@ public class ReportService {
                         }
                         double angle = (item.getYp1() + item.getYp2() + item.getYp3()) / 3;
                         double avg = new BigDecimal(angle).setScale(2, RoundingMode.CEILING).doubleValue();
-                        if (item.getFilter() == 0){
+                        if (item.getFilter() == 0 && avg < 20){
                             //风机正常并网且风速在5-12m
-                            if (item.getMxzt() == 2 && item.getSpeed() >= 5 && item.getSpeed() <= 12 && avg > 8){
+                            if (item.getMxzt() == 2 && item.getSpeed() >= 5 && item.getSpeed() <= 12 && avg > 6){
                                 countBW += 1;
                             }
                         }
                         //风机在不发电情况下
-                        if (item.getMxzt() != 2 && item.getMxzt() != 3 && item.getMxzt() != 10
-                                && item.getMxzt() != 11 && item.getMxzt() != 12 && avg > 60){
-                            if ((90 - avg) > 8){
+                        if (item.getFilter() == 2 && avg > 70){
+                            if ((90 - avg) > 6){
                                 countTJ += 1;
                             }
                         }
@@ -263,6 +266,7 @@ public class ReportService {
      * 停机时间
      */
     public void calStopTime(Date st,  Date et){
+        log.info("=====停机时间");
         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()));

+ 19 - 19
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/agc/AgcDeviateService.java

@@ -44,7 +44,7 @@ public class AgcDeviateService {
 
 
 
-    private final AgcDeviateMapper agcDeviateMapper;
+    private final AgcDeviateMapper agcDeviateMapper = null;
     /**
      * AGC信息缓存
      */
@@ -55,24 +55,24 @@ public class AgcDeviateService {
 
 
     public AgcDeviateService(AgcDeviateMapper agcDeviateMapper, FileService fs, Environment env) {
-        this.agcDeviateMapper = agcDeviateMapper;
-        fileService = fs;
-        agcDeviateConfigMap = new HashMap<>();
-
-        isOffline = Boolean.TRUE.equals(env.getProperty("gyee.offline", boolean.class));
-        filePathPower = env.getProperty("gyee.file-path-power");
-
-        AgcDeviateConfig[] adcs = null;
-        if (isOffline) {
-            adcs = fileService.getFromFile(filePathPower + "agc_info_net.json", AgcDeviateConfig[].class);
-            initFiles();
-        } else {
-            AgcDeviateModel adm = agcDeviateMapper.selectById("agc_info_net");
-            adcs = JSON.parseObject(adm.getValue(), AgcDeviateConfig[].class);
-        }
-        for (AgcDeviateConfig adc : adcs) {
-            agcDeviateConfigMap.put(adc.getId(), adc);
-        }
+//        this.agcDeviateMapper = agcDeviateMapper;
+//        fileService = fs;
+//        agcDeviateConfigMap = new HashMap<>();
+//
+//        isOffline = Boolean.TRUE.equals(env.getProperty("gyee.offline", boolean.class));
+//        filePathPower = env.getProperty("gyee.file-path-power");
+//
+//        AgcDeviateConfig[] adcs = null;
+//        if (isOffline) {
+//            adcs = fileService.getFromFile(filePathPower + "agc_info_net.json", AgcDeviateConfig[].class);
+//            initFiles();
+//        } else {
+//            AgcDeviateModel adm = agcDeviateMapper.selectById("agc_info_net");
+//            adcs = JSON.parseObject(adm.getValue(), AgcDeviateConfig[].class);
+//        }
+//        for (AgcDeviateConfig adc : adcs) {
+//            agcDeviateConfigMap.put(adc.getId(), adc);
+//        }
     }
 
     private void initFiles() {

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

@@ -71,8 +71,14 @@ public class DataFittingService {
                 List<Double> arrayPower = new ArrayList<>();
                 List<String> line = FileUtil.readFile(list.get(0).getPath(), true);
                 csvParse(line, arraySpeed, arrayPower, mins, maxs, minp, maxp);
-                List<Modelpowerdetails> mp = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(list.get(0).getWindturbine()).getModelid());
-                Double maxP = mp.stream().map(Modelpowerdetails::getEnsurepower).max(Comparator.comparing(Double::doubleValue)).get();
+                Double maxP = 0.0;
+                try {
+                    List<Modelpowerdetails> mp = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(list.get(0).getWindturbine()).getModelid());
+                    maxP = mp.stream().map(Modelpowerdetails::getEnsurepower).max(Comparator.comparing(Double::doubleValue)).get();
+                } catch (Exception e) {}
+                if (maxP == 0.0){
+                    maxP = 2500.0;
+                }
                 object.set(fittingMode(list, maxP, arraySpeed, arrayPower, dimension, mode));
             }
         }
@@ -188,8 +194,12 @@ public class DataFittingService {
         }
 
         //保证功率
-        List<Modelpowerdetails> modelPower = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
-        List<Object> bzglList = modelPower.stream().sorted(Comparator.comparing(Modelpowerdetails::getSpeed)).map(m -> new double[]{m.getSpeed(), m.getEnsurepower()}).collect(Collectors.toList());
+        List<Modelpowerdetails> modelPower;
+        List<Object> bzglList = null;
+        try {
+            modelPower = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
+            bzglList = modelPower.stream().sorted(Comparator.comparing(Modelpowerdetails::getSpeed)).map(m -> new double[]{m.getSpeed(), m.getEnsurepower()}).collect(Collectors.toList());
+        } catch (Exception e){}
 
         //散点
         String[] ids = obj.getProcessid().split(",");
@@ -296,8 +306,12 @@ public class DataFittingService {
         List<Point> temp = PowerFittingALG.buildLine(arrX, arrY, arraySpeed.size(), dimension, 0.01);
         //推力系数 CP值
         LineCurveFitting lf = new LineCurveFitting();
+        Double sweptarea = 4600.0;
         lf.setYLines(temp);
-        lf = PowerFittingALG.buildCp(InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getSweptarea(), lf);
+        try {
+            sweptarea = InitialRunner.equipmentMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid()).getSweptarea();
+        } catch (Exception e){}
+        lf = PowerFittingALG.buildCp(sweptarea, lf);
         lf.getCpValue().forEach(f -> {if(f.getX() <= 2.5) f.setY(0);});
         //曲线偏差率
         dataCurveRatio(lf, obj);

+ 23 - 11
power-fitting/src/main/java/com/gyee/power/fitting/service/custom/curve/DataProcessService.java

@@ -15,6 +15,7 @@ import com.gyee.power.fitting.model.anno.FixedVo;
 import com.gyee.power.fitting.model.custom.PowerPointData;
 import com.gyee.power.fitting.model.custom.TableTitle;
 import com.gyee.power.fitting.service.PowerfittinganalysisService;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 
@@ -25,6 +26,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
 
+@Slf4j
 @Service
 public class DataProcessService {
 
@@ -63,17 +65,27 @@ public class DataProcessService {
                 eis.add(new PowerPointData(list.get(i).split(","), false));
             }
 
-            /** 风速  ->  保证功率  来自数据库 **/
-            List<Modelpowerdetails> modelPowerList = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
-            Map<Double, Double> modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(Modelpowerdetails::getSpeed, Modelpowerdetails::getEnsurepower));
-            /** 数据预处理 **/
-            List<PowerPointData> data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj);
-            /** 静风频率 **/
-            List<Double> ls = WindDirectionALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3);
-            double frequency = ls.get(0);
-            double speed = ls.get(1);
-
-            String content = assemble(data);
+            // 静风频率、平均风速
+            double frequency =0;
+            double speed = 0;
+            String content;
+
+            /** 风速  ->  保证功率  来自数据库  没有配置特殊处理 **/
+            try {
+                List<Modelpowerdetails> modelPowerList = InitialRunner.modelPowerDetailMap.get(InitialRunner.wtMap.get(obj.getWindturbine()).getModelid());
+                Map<Double, Double> modelPowerMap = modelPowerList.stream().collect(Collectors.toMap(Modelpowerdetails::getSpeed, Modelpowerdetails::getEnsurepower));
+                /** 数据预处理 **/
+                List<PowerPointData> data = PowerProcessALG.dataProcess(eis, modelPowerMap, maxs, mins, maxp, minp, isfbw, isfhl, isbw, istj, isglpc, isqfh, qfhdj);
+                /** 静风频率 **/
+                List<Double> ls = WindDirectionALG.frequency(data.stream().map(PowerPointData::getSpeed).collect(Collectors.toList()), 3);
+                frequency = ls.get(0);
+                speed = ls.get(1);
+                content = assemble(data);
+            } catch (Exception e){
+                log.error(e.getMessage());
+                content = assemble(eis);
+            }
+
             String fileName = config.getFilePathProcess() + obj.getStation() + "_" + obj.getCode() + "_" + SnowFlakeUtil.generateIdL() / 100000 + ".csv";
             boolean flag = FileUtil.writeFile(fileName, content);
             if (flag) {  // TODO  保存数据库

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

@@ -36,18 +36,18 @@ spring:
   main:
     allow-bean-definition-overriding: false #当遇到同样名字的时候,是否允许覆盖注册
   datasource:
-    type: com.alibaba.druid.pool.DruidDataSource
-    # 宁夏三区oracle
-    driver-class-name: oracle.jdbc.OracleDriver
-    url: jdbc:oracle:thin:@192.168.1.105:1521:gdnxfd
-    username: nxfdprod
-    password: gdnxfd123
-
-    # 华为云oracle(功率预测的环境)
+#    type: com.alibaba.druid.pool.DruidDataSource
+#    # 宁夏三区oracle
 #    driver-class-name: oracle.jdbc.OracleDriver
-#    url: jdbc:oracle:thin:@120.46.129.85:1521:ORCL
-#    username: gyee
-#    password: FRWIND
+#    url: jdbc:oracle:thin:@192.168.1.105:1521:gdnxfd
+#    username: nxfdprod
+#    password: gdnxfd123
+
+    url: jdbc:postgresql://123.60.221.117:5432/powerfitting
+    username: postgres
+    password: gyee@123
+    driver-class-name: org.postgresql.Driver
+    type: com.alibaba.druid.pool.DruidDataSource
 
     druid:
       # 初始化大小,最小,最大