xieshengjie 2 years ago
parent
commit
56c74cadce
18 changed files with 1066 additions and 23 deletions
  1. 10 10
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/config/GeneratorCodeConfig.java
  2. 20 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/controller/auto/Statetransitionratessub2Controller.java
  3. 20 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/controller/auto/StatetransitionratessubController.java
  4. 16 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/mapper/auto/Statetransitionratessub2Mapper.java
  5. 16 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/mapper/auto/StatetransitionratessubMapper.java
  6. 4 2
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Faulteliminatedefects.java
  7. 5 7
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Shutdownevent.java
  8. 2 1
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionrates.java
  9. 83 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionratessub.java
  10. 83 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionratessub2.java
  11. 16 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/IStatetransitionratessub2Service.java
  12. 16 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/IStatetransitionratessubService.java
  13. 20 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/impl/Statetransitionratessub2ServiceImpl.java
  14. 20 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/impl/StatetransitionratessubServiceImpl.java
  15. 1 1
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/specific/SpecificService.java
  16. 712 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/threerate/ThreeRateService.java
  17. 16 0
      histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/task/SaticScheduleTask.java
  18. 6 2
      histroy/benchmarking-histroy-new/src/test/java/com/gyee/benchmarkinghistroy/BenchmarkingHistroyMainNewTest.java

+ 10 - 10
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/config/GeneratorCodeConfig.java

@@ -49,11 +49,11 @@ public class GeneratorCodeConfig {
         // 数据源配置
         DataSourceConfig dsc = new DataSourceConfig();
 
-//        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
-//        dsc.setDriverName("com.mysql.jdbc.Driver");
-//        dsc.setUsername("root");
-//        dsc.setPassword("root");
-//        mpg.setDataSource(dsc);
+        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        mpg.setDataSource(dsc);
 
 //        dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
 //        dsc.setUsername("gdprod");
@@ -61,11 +61,11 @@ public class GeneratorCodeConfig {
 //        dsc.setUrl("jdbc:oracle:thin:@10.83.68.165:1521:gdsj");
 //        mpg.setDataSource(dsc);
 
-        dsc.setDriverName("org.postgresql.Driver");
-        dsc.setUsername("gdprod");
-        dsc.setPassword("gd123");
-        dsc.setUrl("jdbc:postgresql://10.81.3.151:5432/wisdom");
-        mpg.setDataSource(dsc);
+//        dsc.setDriverName("org.postgresql.Driver");
+//        dsc.setUsername("gdprod");
+//        dsc.setPassword("gd123");
+//        dsc.setUrl("jdbc:postgresql://10.81.3.151:5432/wisdom");
+//        mpg.setDataSource(dsc);
 
 //        dsc.setDriverName("com.cloudera.impala.jdbc41.Driver");
 //        dsc.setUrl("jdbc:impala://192.168.1.67:21050/gyee_test");

+ 20 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/controller/auto/Statetransitionratessub2Controller.java

@@ -0,0 +1,20 @@
+package com.gyee.benchmarkinghistroy.controller.auto;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@RestController
+@RequestMapping("//statetransitionratessub2")
+public class Statetransitionratessub2Controller {
+
+}

+ 20 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/controller/auto/StatetransitionratessubController.java

@@ -0,0 +1,20 @@
+package com.gyee.benchmarkinghistroy.controller.auto;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@RestController
+@RequestMapping("//statetransitionratessub")
+public class StatetransitionratessubController {
+
+}

+ 16 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/mapper/auto/Statetransitionratessub2Mapper.java

@@ -0,0 +1,16 @@
+package com.gyee.benchmarkinghistroy.mapper.auto;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub2;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+public interface Statetransitionratessub2Mapper extends BaseMapper<Statetransitionratessub2> {
+
+}

+ 16 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/mapper/auto/StatetransitionratessubMapper.java

@@ -0,0 +1,16 @@
+package com.gyee.benchmarkinghistroy.mapper.auto;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+public interface StatetransitionratessubMapper extends BaseMapper<Statetransitionratessub> {
+
+}

+ 4 - 2
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Faulteliminatedefects.java

@@ -1,6 +1,8 @@
 package com.gyee.benchmarkinghistroy.model.auto;
 
 import java.math.BigDecimal;
+
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -29,7 +31,7 @@ public class Faulteliminatedefects extends Model {
     /**
      * id
      */
-    @TableId("ID")
+    @TableId(value = "ID",type = IdType.ASSIGN_ID)
     private Long id;
 
     /**
@@ -78,7 +80,7 @@ public class Faulteliminatedefects extends Model {
      * ???
      */
     @TableField("RATE")
-    private BigDecimal rate;
+    private Double rate;
 
     /**
      * ??????

+ 5 - 7
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Shutdownevent.java

@@ -1,10 +1,8 @@
 package com.gyee.benchmarkinghistroy.model.auto;
 
-import java.math.BigDecimal;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
-import java.time.LocalDateTime;
 import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -42,10 +40,10 @@ public class Shutdownevent extends Model {
     private Date starttime;
 
     @TableField("STOPHOURS")
-    private BigDecimal stophours;
+    private Double stophours;
 
     @TableField("LOSSPOWER")
-    private BigDecimal losspower;
+    private Double losspower;
 
     /**
      * ???????????????????
@@ -54,7 +52,7 @@ public class Shutdownevent extends Model {
     private String stoptypeid;
 
     @TableField("ISHANDLE")
-    private BigDecimal ishandle;
+    private Double ishandle;
 
     @TableField("WARNINGID")
     private String warningid;
@@ -69,7 +67,7 @@ public class Shutdownevent extends Model {
     private String faultview;
 
     @TableField("STATUSCODE")
-    private BigDecimal statuscode;
+    private Double statuscode;
 
     @TableField("MAINID")
     private String mainid;
@@ -84,7 +82,7 @@ public class Shutdownevent extends Model {
     private String failrate;
 
     @TableField("WARNINGRECORDSID")
-    private BigDecimal warningrecordsid;
+    private Double warningrecordsid;
 
 
 }

+ 2 - 1
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionrates.java

@@ -1,5 +1,6 @@
 package com.gyee.benchmarkinghistroy.model.auto;
 
+import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.baomidou.mybatisplus.extension.activerecord.Model;
 import com.baomidou.mybatisplus.annotation.TableId;
@@ -25,7 +26,7 @@ public class Statetransitionrates extends Model {
 
     private static final long serialVersionUID = 1L;
 
-    @TableId("ID")
+    @TableId(value = "ID",type = IdType.ASSIGN_ID)
     private Long id;
 
     @TableField("WINDPWOERID")

+ 83 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionratessub.java

@@ -0,0 +1,83 @@
+package com.gyee.benchmarkinghistroy.model.auto;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Statetransitionratessub extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "ID",type = IdType.ASSIGN_ID)
+    private Integer id;
+
+    @TableField("windpwoerId")
+    private String windpwoerId;
+
+    @TableField("projectId")
+    private String projectId;
+
+    @TableField("lineId")
+    private String lineId;
+
+    @TableField("windturbineId")
+    private String windturbineId;
+
+    @TableField("recordDate")
+    private Date recordDate;
+
+    @TableField("startTime")
+    private Date startTime;
+
+    @TableField("endTime")
+    private Date endTime;
+
+    @TableField("durationHours")
+    private Double durationHours;
+
+    private Double speed;
+
+    private Double maxspeed;
+
+    private Double minspeed;
+
+    @TableField("statusCode")
+    private Integer statusCode;
+
+    @TableField("statusHours")
+    private Double statusHours;
+
+    private Date statusbegin;
+
+    private Date statusend;
+
+    @TableField("statusCode2")
+    private Integer statusCode2;
+
+    @TableField("statusHours2")
+    private Double statusHours2;
+
+    private Date statusbegin2;
+
+    private Date statusend2;
+
+    private Double resetrate;
+
+
+}

+ 83 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/model/auto/Statetransitionratessub2.java

@@ -0,0 +1,83 @@
+package com.gyee.benchmarkinghistroy.model.auto;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class Statetransitionratessub2 extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "ID",type = IdType.ASSIGN_ID)
+    private Integer id;
+
+    @TableField("windpwoerId")
+    private String windpwoerId;
+
+    @TableField("projectId")
+    private String projectId;
+
+    @TableField("lineId")
+    private String lineId;
+
+    @TableField("windturbineId")
+    private String windturbineId;
+
+    @TableField("recordDate")
+    private Date recordDate;
+
+    @TableField("startTime")
+    private Date startTime;
+
+    @TableField("endTime")
+    private Date endTime;
+
+    @TableField("durationHours")
+    private Double durationHours;
+
+    private Double speed;
+
+    private Double maxspeed;
+
+    private Double minspeed;
+
+    @TableField("statusCode")
+    private Integer statusCode;
+
+    @TableField("statusHours")
+    private Double statusHours;
+
+    private Date statusbegin;
+
+    private Date statusend;
+
+    @TableField("statusCode2")
+    private Integer statusCode2;
+
+    @TableField("statusHours2")
+    private Double statusHours2;
+
+    private Date statusbegin2;
+
+    private Date statusend2;
+
+    private Double resetrate;
+
+
+}

+ 16 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/IStatetransitionratessub2Service.java

@@ -0,0 +1,16 @@
+package com.gyee.benchmarkinghistroy.service.auto;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub2;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+public interface IStatetransitionratessub2Service extends IService<Statetransitionratessub2> {
+
+}

+ 16 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/IStatetransitionratessubService.java

@@ -0,0 +1,16 @@
+package com.gyee.benchmarkinghistroy.service.auto;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+public interface IStatetransitionratessubService extends IService<Statetransitionratessub> {
+
+}

+ 20 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/impl/Statetransitionratessub2ServiceImpl.java

@@ -0,0 +1,20 @@
+package com.gyee.benchmarkinghistroy.service.auto.impl;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub2;
+import com.gyee.benchmarkinghistroy.mapper.auto.Statetransitionratessub2Mapper;
+import com.gyee.benchmarkinghistroy.service.auto.IStatetransitionratessub2Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@Service
+public class Statetransitionratessub2ServiceImpl extends ServiceImpl<Statetransitionratessub2Mapper, Statetransitionratessub2> implements IStatetransitionratessub2Service {
+
+}

+ 20 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/auto/impl/StatetransitionratessubServiceImpl.java

@@ -0,0 +1,20 @@
+package com.gyee.benchmarkinghistroy.service.auto.impl;
+
+import com.gyee.benchmarkinghistroy.model.auto.Statetransitionratessub;
+import com.gyee.benchmarkinghistroy.mapper.auto.StatetransitionratessubMapper;
+import com.gyee.benchmarkinghistroy.service.auto.IStatetransitionratessubService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author 谢生杰
+ * @since 2022-08-24
+ */
+@Service
+public class StatetransitionratessubServiceImpl extends ServiceImpl<StatetransitionratessubMapper, Statetransitionratessub> implements IStatetransitionratessubService {
+
+}

+ 1 - 1
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/specific/SpecificService.java

@@ -169,7 +169,7 @@ public class SpecificService {
                 }
                 if (StringUtils.isNotNull(windpowerinfoday)){
                     sjfdl = windpowerinfoday.getGeneratingcapacity();
-                    faulttime = windpowerinfoday.getFaulttime();
+                    faulttime = windpowerinfoday.getFaulttime()==null?0:windpowerinfoday.getFaulttime();
                     zhcydl = windpowerinfoday.getGeneratingcapacity2()+windpowerinfoday.getBuyelectricity()-windpowerinfoday.getGridelectricity();
                     sjfdl2 = windpowerinfoday.getGeneratingcapacity2();
                 }

+ 712 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/service/threerate/ThreeRateService.java

@@ -0,0 +1,712 @@
+package com.gyee.benchmarkinghistroy.service.threerate;/*
+@author   谢生杰
+@date   2022/8/23-9:11
+*/
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.gyee.benchmarkinghistroy.init.CacheContext;
+import com.gyee.benchmarkinghistroy.model.auto.*;
+import com.gyee.benchmarkinghistroy.service.auto.IFaulteliminatedefectsService;
+import com.gyee.benchmarkinghistroy.service.auto.IShutdowneventService;
+import com.gyee.benchmarkinghistroy.service.auto.IStatetransitionratesService;
+import com.gyee.benchmarkinghistroy.util.realtimesource.IEdosUtil;
+import com.gyee.common.contant.Contant;
+import com.gyee.common.model.PointData;
+import com.gyee.common.model.StringUtils;
+import com.gyee.common.util.DateUtils;
+import com.gyee.common.util.DoubleUtils;
+import org.apache.commons.collections.map.HashedMap;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+@Service
+public class ThreeRateService {
+
+    @Resource
+    private IShutdowneventService shutdowneventService;
+    @Resource
+    private IStatetransitionratesService statetransitionratesService;
+    @Resource
+    private IEdosUtil edosUtil;
+    @Resource
+    private IFaulteliminatedefectsService faulteliminatedefectsService;
+
+
+
+    private double interval = 0.33;//20分钟
+    private Map<Double, Double> stateDescription1 = new HashMap<>();
+    private Map<Double, Double> stateDescription2 = new HashMap<>();
+    /**
+     * 复位及时率,状态转换率
+     */
+    public void ResetAngStateRate(String beginDate,String endDate){
+
+        List<String> days = DateUtils.getDays(beginDate, endDate);
+
+        List<Windturbine> wtls = CacheContext.wtls;
+
+        Map<String, Map<String, Windturbinetestingpointnew>> wtpAimap = CacheContext.wtpAimap;
+
+        Map<Integer, String> statusDescription = new HashedMap();
+        statusDescription.put(0, "待机");
+        statusDescription.put(1, "并网");
+        statusDescription.put(2, "停机");
+        statusDescription.put(3, "通讯中断");
+        statusDescription.put(4, "维护");
+
+
+        if (stateDescription1.size() == 0)
+        {
+            stateDescription1.put(3.0, 4.0);
+            stateDescription1.put(3.5, 0.0);
+            stateDescription1.put(4.0, 0.0);
+        }
+        if (stateDescription2.size() == 0)
+        {
+            stateDescription2.put(3.0, 4.0);
+            stateDescription2.put(3.5, 1.0);
+            stateDescription2.put(4.0, 1.0);
+        }
+
+        days.stream().forEach(day->{
+
+
+
+            Date date = DateUtils.parseDate(day);
+            Date begin = DateUtils.getStartOfDay(date);
+            Date end = DateUtils.getEndOfDay(date);
+            List<Statetransitionrates> resultList = new ArrayList<>();
+
+            QueryWrapper<Statetransitionrates> delQw = new QueryWrapper<>();
+            delQw.eq("recorddate",date);
+            statetransitionratesService.remove(delQw);
+
+            //状态转换begin
+            Map<String, Statetransitionrates> rates = new HashMap<>();
+            Map<String,List<Statetransitionratessub>> ratesubs1 = new HashMap<>();
+            Map<String, List<Statetransitionratessub2>> ratesubs2 = new HashMap<>();
+            //状态转换end
+
+            wtls.stream().forEach(wt->{
+//                初始化
+                Statetransitionrates statetransitionrates = new Statetransitionrates();
+                statetransitionrates.setRecorddate(date);
+                statetransitionrates.setWindturbineid(wt.getId());
+                statetransitionrates.setWindpwoerid(wt.getWindpowerstationid());
+                statetransitionrates.setProjectid(wt.getProjectid());
+                statetransitionrates.setLineid(wt.getLineid());
+//                状态转换率用
+                AtomicReference<Double> timerate1 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate2 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate3 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate4 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate5 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate6 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate7 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate8 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate9 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate10 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate11 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate12 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate13 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate14 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate15 = new AtomicReference<>((double) 0);
+//                复位及时率用
+                AtomicReference<Double> timerate16 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate17 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate18 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate19 = new AtomicReference<>((double) 0);
+                AtomicReference<Double> timerate20 = new AtomicReference<>((double) 0);
+//----------------------------------------------------------------------------------------复位开始
+//                遍历该风机的停机事件
+                QueryWrapper<Shutdownevent> shutdowneventQueryWrapper = new QueryWrapper<>();
+                shutdowneventQueryWrapper.ge("stoptime",begin).le("stoptime",end);
+                shutdowneventQueryWrapper.eq("windturbineid",wt.getId());
+                List<Shutdownevent> shutdowneventList = shutdowneventService.list(shutdowneventQueryWrapper);
+                shutdowneventList.stream().forEach(shutdownevent -> {
+                    if (shutdownevent.getStophours()<=1) {
+                        timerate20.updateAndGet(v -> new Double((double) (v + 1)));
+                        if (shutdownevent.getStophours()<=0.08){
+                            timerate16.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate17.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate18.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate19.updateAndGet(v -> new Double((double) (v + 1)));
+                            shutdownevent.setResetrate("5");
+                        }else if (shutdownevent.getStophours()<=0.17){
+                            timerate17.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate18.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate19.updateAndGet(v -> new Double((double) (v + 1)));
+                            shutdownevent.setResetrate("10");
+                        }else if (shutdownevent.getStophours()<=0.25){
+                            timerate18.updateAndGet(v -> new Double((double) (v + 1)));
+                            timerate19.updateAndGet(v -> new Double((double) (v + 1)));
+                            shutdownevent.setResetrate("15");
+                        }else if (shutdownevent.getStophours()<=0.33){
+                            timerate19.updateAndGet(v -> new Double((double) (v + 1)));
+                            shutdownevent.setResetrate("20");
+                        }else if (shutdownevent.getResetrate() == null)
+                        {
+                            shutdownevent.setResetrate("99");
+                        }
+                    }else {
+                        shutdownevent.setResetrate(null);
+                    }
+                });
+                statetransitionrates.setTimerate16(timerate16.get());
+                statetransitionrates.setTimerate17(timerate17.get());
+                statetransitionrates.setTimerate18(timerate18.get());
+                statetransitionrates.setTimerate19(timerate19.get());
+                statetransitionrates.setTimerate20(timerate20.get());
+//----------------------------------------------------------------------------------------复位结束
+//----------------------------------------------------------------------------------------状态转换开始
+                Map<String, Windturbinetestingpointnew> windturbinetestingpointnewMap = wtpAimap.get(wt.getId());
+                Windturbinetestingpointnew speedpoint = windturbinetestingpointnewMap.get(Contant.AI022);
+                Windturbinetestingpointnew statepoint = windturbinetestingpointnewMap.get(Contant.FJ5T);
+                List<PointData> speedDataList = null;
+                List<PointData> statusDataList = null;
+                try {
+                    speedDataList = edosUtil.getHistoryDatasSnap(speedpoint, begin.getTime() / 1000, end.getTime() / 1000, null, 60l);
+                    statusDataList = edosUtil.getHistoryDatasSnap(statepoint, begin.getTime() / 1000, end.getTime() / 1000, null, 60l);
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+
+                List<Statetransitionratessub> subs = new ArrayList<>();
+                Statetransitionratessub sub = new Statetransitionratessub();
+                if (speedDataList != null && statusDataList != null && statusDataList.size() == speedDataList.size() && statusDataList.size()>1 && speedDataList.size()>1){
+                    //最大最小风速
+                    double max = speedDataList.stream().max(Comparator.comparing(PointData::getPointValueInDouble)).get().getPointValueInDouble();
+                    double min = speedDataList.stream().min(Comparator.comparing(PointData::getPointValueInDouble)).get().getPointValueInDouble();
+                    for (int i = 0; i < speedDataList.size(); i++){
+                        if (speedDataList.get(i).getPointValueInDouble() <= 3)
+                        {
+                            sub = BuildStateRate(date, wt.getId(), speedDataList, statusDataList, subs, sub, i,3);
+
+                        }
+                        else if (speedDataList.get(i).getPointValueInDouble() > 3 && speedDataList.get(i).getPointValueInDouble() <= 4)
+                        {
+                            sub = BuildStateRate(date, wt.getId(), speedDataList, statusDataList, subs, sub, i, 3.5);
+                        }
+                        else
+                        {
+                            sub = BuildStateRate(date, wt.getId(), speedDataList, statusDataList, subs, sub, i, 4);
+                        }
+                    }
+                    if (sub.getStatusend() == null){
+                        sub.setStatusend(DateUtils.parseLongToDate(speedDataList.get(speedDataList.size()-1).getPointTime()*1000));
+                        sub.setStatusHours(DateUtils.hoursDiff2(sub.getStatusbegin(),sub.getStatusend()));
+                    }else if (sub.getStatusbegin2() != null && sub.getStatusend2() == null) {
+                        sub.setStatusend2(DateUtils.parseLongToDate(speedDataList.get(speedDataList.size()-1).getPointTime()*1000));
+                        sub.setStatusHours2(DateUtils.hoursDiff2(sub.getStatusbegin2(),sub.getStatusend2()));
+                    }
+                    sub.setEndTime(DateUtils.parseLongToDate(speedDataList.get(speedDataList.size()-1).getPointTime()*1000));
+                    sub.setDurationHours(DateUtils.hoursDiff2(sub.getStartTime(),sub.getEndTime()));
+                    subs.add(sub);
+                    ratesubs1.put(wt.getId(),subs);
+                    //---------------------------------------------------------------------------------------------------------------------
+                    List<Statetransitionratessub2> subs2 = new ArrayList<>();
+                    Statetransitionratessub2 sub2 = new Statetransitionratessub2();
+                    double interval1 = 0;
+                    double interval2 = 0;
+                    double interval3 = 0;
+                    Date[] intervaltimebegin=new Date[5];
+                    Date[] intervaltimeend=new Date[5];
+                    double lastspeed = 0;
+                    for (int i = 0; i < subs.size(); i++){
+                        if (sub2.getSpeed() == null) {
+                            BuildStatetransitionratesSub2(subs, sub2, i);
+                        }else {
+                            if (subs.get(i).getDurationHours()>interval){
+                                double tempspeed = 0;
+                                if (interval1 >= interval2 && interval1 >= interval3)
+                                {
+                                    tempspeed = 3;
+                                }
+                                else if (interval2 >= interval1 && interval2 >= interval3)
+                                {
+                                    tempspeed = 3.5;
+                                }
+                                else
+                                {
+                                    tempspeed = 4;
+                                }
+
+                                if (subs.get(i).getSpeed() == tempspeed) {
+                                    sub2.setEndTime(subs.get(i).getEndTime());
+                                    sub2.setDurationHours(sub2.getDurationHours()+subs.get(i).getDurationHours());
+                                    /* 加处理代码 */
+                                }else {
+                                    NewMethod(subs, sub2, interval1, interval2, interval3, intervaltimebegin, intervaltimeend, lastspeed, i);
+                                    interval1 = 0;
+                                    interval2 = 0;
+                                    interval3 = 0;
+                                    intervaltimebegin = new Date[5];
+                                    intervaltimeend = new Date[5];
+                                    //NewMethod(subs, ref interval1, ref interval2, ref interval3, i, ref lastspeed, intervaltimebegin, intervaltimeend);
+                                    subs2.add(sub2);
+                                    sub2 = new Statetransitionratessub2();
+                                    BuildStatetransitionratesSub2(subs, sub2, i);
+                                }
+                            }else {//当前时间间隔不满足条件
+                                if (subs.get(i).getSpeed() == 3){
+                                    interval1 += subs.get(i).getDurationHours();
+                                }else if (subs.get(i).getSpeed() == 3.5){
+                                    interval2 += subs.get(i).getDurationHours();
+                                }else {
+                                    interval3 += subs.get(i).getDurationHours();
+                                }
+                                if (interval1 > 0 && interval2 > 0 && interval3 > 0){
+                                    if (subs.get(i).getSpeed() == 3) {
+                                        interval1 -= subs.get(i).getDurationHours();
+                                    }else if (subs.get(i).getSpeed() == 3.5) {
+                                        interval2 -= subs.get(i).getDurationHours();
+                                    }else {
+                                        interval3 -= subs.get(i).getDurationHours();
+                                    }
+                                    NewMethod(subs, sub2, interval1, interval2, interval3, intervaltimebegin, intervaltimeend, lastspeed, i);
+                                    interval1 = 0;
+                                    interval2 = 0;
+                                    interval3 = 0;
+                                    intervaltimebegin = new Date[5];
+                                    intervaltimeend = new Date[5];
+                                    //NewMethod(subs, ref interval1, ref interval2, ref interval3, i, ref lastspeed, intervaltimebegin, intervaltimeend);
+                                    subs2.add(sub2);
+                                    sub2 = new Statetransitionratessub2();
+                                    BuildStatetransitionratesSub2(subs, sub2, i);
+                                }else {
+                                    if (subs.get(i).getSpeed() == 3) {
+                                        interval1 -= subs.get(i).getDurationHours();
+                                    }else if (subs.get(i).getSpeed() == 3.5)
+                                    {
+                                        interval2 -= subs.get(i).getDurationHours();
+                                    }else
+                                    {
+                                        interval3 -= subs.get(i).getDurationHours();
+                                    }
+                                    sub2.setEndTime(subs.get(i).getEndTime());
+                                    sub2.setDurationHours(sub2.getDurationHours() + subs.get(i).getDurationHours());
+                                }
+                            }
+                        }
+                        NewMethod(subs, interval1, interval2, interval3, i, lastspeed, intervaltimebegin, intervaltimeend);
+                    }
+                    if (interval1 >= interval2 && interval1 >= interval3)
+                    {
+                        sub2.setSpeed(3.0);
+
+
+                        if (intervaltimebegin[4] != null)
+                        {
+                            sub2.setStatusCode2(4);
+//                            sub2.STATUSBEGIN2 = intervaltimebegin[04];
+                            sub2.setStatusbegin2(intervaltimebegin[04]);
+                            sub2.setStatusend2(intervaltimeend[4]);
+                            sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusend2(),sub2.getStatusbegin2()));
+                        }
+
+                    }
+                    else if (interval2 >= interval1 && interval2 >= interval3)
+                    {
+                        sub2.setSpeed(3.5);
+                        NewMethod(sub2, intervaltimebegin, intervaltimeend);
+                    }
+                    else
+                    {
+                        sub2.setSpeed(4.0);
+                        NewMethod(sub2, intervaltimebegin, intervaltimeend);
+                    }
+                    subs2.add(sub2);
+                    ratesubs2.put(wt.getId(),subs2);
+
+                    //----------------------------------------------------------------------------------------
+                    for (int i = 0; i < subs2.size(); i++){
+                        if (subs2.get(i).getSpeed() == 3){
+                            if (subs2.get(i).getDurationHours() > 0.5){
+                                if (subs2.get(i).getStatusCode() == 0 || subs2.get(i).getStatusCode() == 1){
+                                    if (subs2.get(i).getStatusHours() < 0.25){
+                                        subs2.get(i).setResetrate(0.25);
+                                        timerate1.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate2.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.33){
+                                        subs2.get(i).setResetrate(0.33);
+                                        timerate2.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.42){
+                                        subs2.get(i).setResetrate(0.42);
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.5){
+                                        subs2.get(i).setResetrate(0.5);
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }
+                                    timerate13.updateAndGet(v -> new Double((double) (v + 1)));
+                                }
+                                if (subs2.get(i).getStatusCode() == 4)
+                                {
+                                    if (subs2.get(i).getStatusHours() < 0.25){
+                                        subs2.get(i).setResetrate(0.25);
+                                        timerate5.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate6.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.33){
+                                        subs2.get(i).setResetrate(0.33);
+                                        timerate6.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.42){
+                                        subs2.get(i).setResetrate(0.42);
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.5){
+                                        subs2.get(i).setResetrate(0.5);
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }
+                                    timerate14.updateAndGet(v -> new Double((double) (v + 1)));
+                                }
+                            }
+                        }else if (subs2.get(i).getSpeed() == 3.5){
+                            if (subs2.get(i).getDurationHours() > 0.5){
+                                if (subs2.get(i).getStatusCode() == 0 || subs2.get(i).getStatusCode() == 1){
+                                    if (subs2.get(i).getStatusHours() < 0.25) {
+                                        subs2.get(i).setResetrate(0.25);
+                                        timerate1.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate2.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.33){
+                                        subs2.get(i).setResetrate(0.33);
+                                        timerate2.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.42){
+                                        subs2.get(i).setResetrate(0.42);
+                                        timerate3.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.5) {
+                                        subs2.get(i).setResetrate(0.5);
+                                        timerate4.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }
+                                    timerate13.updateAndGet(v -> new Double((double) (v + 1)));
+                                }
+                                if (subs2.get(i).getStatusCode() == 4){
+                                    if (subs2.get(i).getStatusHours() < 0.25){
+                                        subs2.get(i).setResetrate(0.25);
+                                        timerate5.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate6.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.33) {
+                                        subs2.get(i).setResetrate(0.33);
+                                        timerate6.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.42){
+                                        subs2.get(i).setResetrate(0.42);
+                                        timerate7.updateAndGet(v -> new Double((double) (v + 1)));
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }else if (subs2.get(i).getStatusHours() < 0.5) {
+                                        subs2.get(i).setResetrate(0.5);
+                                        timerate8.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }
+                                    timerate14.updateAndGet(v -> new Double((double) (v + 1)));
+                                }
+                            }
+                        }else if (subs2.get(i).getSpeed() == 4){
+                            if (subs2.get(i).getDurationHours() > 0.5) {
+                                if (subs2.get(i).getStatusCode() == 0){
+                                    if (subs2.get(i).getStatusCode2() == 1) {
+                                        if (subs2.get(i).getStatusHours() < 0.25) {
+                                            subs2.get(i).setResetrate(0.25);
+                                            timerate9.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate10.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate11.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate12.updateAndGet(v -> new Double((double) (v + 1)));
+                                        }else if (subs2.get(i).getStatusHours() < 0.33){
+                                            subs2.get(i).setResetrate(0.33);
+                                            timerate10.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate11.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate12.updateAndGet(v -> new Double((double) (v + 1)));
+                                        }else if (subs2.get(i).getStatusHours() < 0.42) {
+                                            subs2.get(i).setResetrate(0.42);
+                                            timerate11.updateAndGet(v -> new Double((double) (v + 1)));
+                                            timerate12.updateAndGet(v -> new Double((double) (v + 1)));
+                                        }else if (subs2.get(i).getStatusHours() < 0.5) {
+                                            subs2.get(i).setResetrate(0.5);
+                                            timerate12.updateAndGet(v -> new Double((double) (v + 1)));
+                                        }
+                                        timerate15.updateAndGet(v -> new Double((double) (v + 1)));
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+                statetransitionrates.setTimerate1(timerate1.get());
+                statetransitionrates.setTimerate2(timerate2.get());
+                statetransitionrates.setTimerate3(timerate3.get());
+                statetransitionrates.setTimerate4(timerate4.get());
+                statetransitionrates.setTimerate5(timerate5.get());
+                statetransitionrates.setTimerate6(timerate6.get());
+                statetransitionrates.setTimerate7(timerate7.get());
+                statetransitionrates.setTimerate8(timerate8.get());
+                statetransitionrates.setTimerate9(timerate9.get());
+                statetransitionrates.setTimerate10(timerate10.get());
+                statetransitionrates.setTimerate11(timerate11.get());
+                statetransitionrates.setTimerate12(timerate12.get());
+                statetransitionrates.setTimerate13(timerate13.get());
+                statetransitionrates.setTimerate14(timerate14.get());
+                statetransitionrates.setTimerate15(timerate15.get());
+
+//----------------------------------------------------------------------------------------状态转换结束
+                resultList.add(statetransitionrates);
+                shutdowneventService.saveOrUpdateBatch(shutdowneventList);
+
+//                状态转换率
+
+            });
+            statetransitionratesService.saveBatch(resultList);
+
+        });
+
+    }
+
+    private void NewMethod(List<Statetransitionratessub> subs, double interval1, double interval2, double interval3, int i, double lastspeed, Date[] intervaltimebegin, Date[] intervaltimeend) {
+        if (subs.get(i).getSpeed()==3){
+            interval1 += subs.get(i).getDurationHours();
+            lastspeed = 3;
+        }else if (subs.get(i).getSpeed() == 3.5){
+            interval2 += subs.get(i).getDurationHours();
+            lastspeed = 3.5;
+        }else{
+            interval3 += subs.get(i).getDurationHours();
+            lastspeed = 4;
+        }
+        if (subs.get(i).getStatusCode2() != null && subs.get(i).getStatusCode2() < 5)
+        {
+            int key = (int)subs.get(i).getStatusCode2();
+            if (intervaltimebegin[key] == null)
+            {
+                intervaltimebegin[key] = subs.get(i).getStatusbegin2();
+                intervaltimeend[key] = subs.get(i).getStatusend2();
+            }
+        }
+        if (subs.get(i).getStatusCode() != null && subs.get(i).getStatusCode() < 5)
+        {
+            int key = (int)subs.get(i).getStatusCode();
+            if (intervaltimebegin[key] == null)
+            {
+                intervaltimebegin[key] = subs.get(i).getStatusbegin();
+                intervaltimeend[key] = subs.get(i).getStatusend();
+            }
+        }
+    }
+
+    private void NewMethod(List<Statetransitionratessub> subs, Statetransitionratessub2 sub2, double interval1, double interval2, double interval3, Date[] intervaltimebegin, Date[] intervaltimeend, double lastspeed, int i) {
+        if (interval1 >= interval2 && interval1 >= interval3)
+        {
+            sub2.setSpeed(3.0);
+
+            if (intervaltimebegin[4] != null)
+            {
+                sub2.setStatusCode2(4);
+                sub2.setStatusbegin2(intervaltimebegin[04]);
+                sub2.setStatusend2(intervaltimeend[4]);
+                sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusend2(),sub2.getStatusbegin2()));
+            }
+
+        }
+        else if (interval2 >= interval1 && interval2 >= interval3)
+        {
+            sub2.setSpeed(3.5);
+            NewMethod(sub2, intervaltimebegin, intervaltimeend);
+        }
+        else
+        {
+            sub2.setSpeed(4.0);
+            NewMethod(sub2, intervaltimebegin, intervaltimeend);
+        }
+    }
+
+    private void NewMethod(Statetransitionratessub2 sub2, Date[] intervaltimebegin, Date[] intervaltimeend) {
+        if (intervaltimebegin[0] != null)
+        {
+            if (intervaltimebegin[1] != null)
+            {
+                if (intervaltimebegin[0].getTime() < intervaltimebegin[1].getTime())
+                {
+                    sub2.setStatusCode2(0);
+                    sub2.setStatusbegin2(intervaltimebegin[0]);
+                    sub2.setStatusend2(intervaltimeend[0]);
+                }
+                else
+                {
+                    sub2.setStatusCode2(1);
+                    sub2.setStatusbegin2(intervaltimebegin[1]);
+                    sub2.setStatusend2(intervaltimebegin[1]);
+                }
+
+            }
+            else
+            {
+                sub2.setStatusCode2(0);
+                sub2.setStatusbegin2(intervaltimebegin[0]);
+                sub2.setStatusend2(intervaltimeend[0]);
+            }
+            sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusend2(),sub2.getStatusbegin2()));
+        }
+        else if (intervaltimebegin[1] != null)
+        {
+            sub2.setStatusCode2(1);
+            sub2.setStatusbegin2(intervaltimebegin[1]);
+            sub2.setStatusend2(intervaltimeend[1]);
+            sub2.setStatusHours2(DateUtils.hoursDiff2(sub2.getStatusend2(),sub2.getStatusbegin2()));
+        }
+    }
+
+    private void BuildStatetransitionratesSub2(List<Statetransitionratessub> subs, Statetransitionratessub2 sub2, int i) {
+        Statetransitionratessub statetransitionratessub = subs.get(i);
+        sub2.setWindpwoerId(statetransitionratessub.getWindpwoerId());
+        sub2.setProjectId(statetransitionratessub.getProjectId());
+        sub2.setLineId(statetransitionratessub.getLineId());
+        sub2.setWindturbineId(statetransitionratessub.getWindturbineId());
+        sub2.setResetrate(statetransitionratessub.getResetrate());
+        sub2.setStartTime(statetransitionratessub.getStartTime());
+        sub2.setEndTime(statetransitionratessub.getEndTime());
+        sub2.setDurationHours(statetransitionratessub.getDurationHours());
+        sub2.setSpeed(statetransitionratessub.getSpeed());
+        sub2.setMaxspeed(statetransitionratessub.getMaxspeed());
+        sub2.setMinspeed(statetransitionratessub.getMinspeed());
+
+        sub2.setStatusCode(statetransitionratessub.getStatusCode());
+        sub2.setStatusHours(statetransitionratessub.getStatusHours());
+        sub2.setStatusbegin(statetransitionratessub.getStatusbegin());
+        sub2.setStatusend(statetransitionratessub.getStatusend());
+
+        sub2.setStatusCode2(statetransitionratessub.getStatusCode2());
+        sub2.setStatusHours2(statetransitionratessub.getStatusHours2());
+        sub2.setStatusbegin2(statetransitionratessub.getStatusbegin2());
+        sub2.setStatusend2(statetransitionratessub.getStatusend2());
+
+
+    }
+
+    private Statetransitionratessub BuildStateRate(Date date, String id, List<PointData> speedDataList, List<PointData> statusDataList, List<Statetransitionratessub> subs, Statetransitionratessub sub, int i, double speed) {
+        if (sub.getStartTime() == null){
+            //初始化
+            BuildSTATETRANSITIONRATESSUB(date, id, speedDataList, statusDataList, sub, i, speed);
+        }else {
+            if (sub.getEndTime() == null)
+            {
+                //判定是几米风速 3 、 3.5 、 4
+                if (sub.getSpeed() == speed)
+                {
+                    //stateDescription.Add(3, 4);
+                    //stateDescription.Add(3.5m, 0);
+                    //stateDescription.Add(4, 0);
+                    if (sub.getStatusCode() != statusDataList.get(i).getPointValueInDouble() && sub.getStatusCode2() == null && (statusDataList.get(i).getPointValueInDouble() == stateDescription1.get(speed) || statusDataList.get(i).getPointValueInDouble() == stateDescription2.get(speed)))
+                    {
+                        sub.setStatusCode2((int)(statusDataList.get(i).getPointValueInDouble()));
+                        sub.setStatusbegin2(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                        sub.setStatusend(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                        sub.setStatusHours(DateUtils.hoursDiff2(sub.getStatusend(),sub.getStatusbegin()));
+                    }
+                    else if (sub.getStatusCode2() != null && sub.getStatusCode2() != statusDataList.get(i).getPointValueInDouble())
+                    {
+                        sub.setStatusend2(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                        sub.setStatusHours2(DateUtils.hoursDiff2(sub.getStatusend2(),sub.getStatusbegin2()));
+                    }
+
+                }
+                else
+                {
+                    if (sub.getStatusend() == null)
+                    {
+                        sub.setStatusend(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                        sub.setStatusHours(DateUtils.hoursDiff2(sub.getStatusend(),sub.getStatusbegin()));
+                    }
+                    else if (sub.getStatusbegin2() != null && sub.getStatusend2() == null)
+                    {
+                        sub.setStatusend2(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                        sub.setStatusHours2(DateUtils.hoursDiff2(sub.getStatusend2(),sub.getStatusbegin2()));
+                    }
+                    sub.setEndTime(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()*1000));
+                    sub.setDurationHours(DateUtils.hoursDiff2(sub.getEndTime(),sub.getStartTime()));
+
+                    Statetransitionratessub finalSub = sub;
+
+                    sub.setMaxspeed(speedDataList.stream().filter(it -> it.getPointTime()>= finalSub.getStartTime().getTime()/1000 && it.getPointTime()< finalSub.getEndTime().getTime()/1000).max(Comparator.comparing(PointData::getPointValueInDouble)).get().getPointValueInDouble());
+                    sub.setMinspeed(speedDataList.stream().filter(it -> it.getPointTime()>= finalSub.getStartTime().getTime()/1000 && it.getPointTime()< finalSub.getEndTime().getTime()/1000).min(Comparator.comparing(PointData::getPointValueInDouble)).get().getPointValueInDouble());
+                    subs.add(sub);
+
+                    sub = new Statetransitionratessub();
+                    BuildSTATETRANSITIONRATESSUB(date, id, speedDataList, statusDataList, sub, i, speed);
+                }
+            }
+        }
+        return sub;
+    }
+
+    private void BuildSTATETRANSITIONRATESSUB(Date date, String id, List<PointData> speedDataList, List<PointData> statusDataList, Statetransitionratessub sub, int i, double speed) {
+        Map<String, Windturbine> wmap = CacheContext.wmap;
+        sub.setStartTime(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()!=null?speedDataList.get(i).getPointTime()*1000:0));
+        sub.setWindpwoerId(wmap.get(id).getWindpowerstationid());
+        sub.setProjectId(wmap.get(id).getProjectid());
+        sub.setLineId(wmap.get(id).getLineid());
+        sub.setWindturbineId(id);
+        sub.setRecordDate(date);
+        sub.setStatusCode((int)statusDataList.get(i).getPointValueInDouble());
+        sub.setStatusbegin(DateUtils.parseLongToDate(speedDataList.get(i).getPointTime()!=null?speedDataList.get(i).getPointTime()*1000:0));
+        sub.setSpeed(speed);
+    }
+
+    /**
+     * 消缺及时率
+     * @param beginDate
+     * @param endDate
+     */
+    public void FailRate(String beginDate,String endDate){
+        List<String> days = DateUtils.getDays(beginDate, endDate);
+        List<Windturbine> wtls = CacheContext.wtls;
+        days.stream().forEach(day->{
+            Date date = DateUtils.parseDate(day);
+            Date begin = DateUtils.getMonthFirst(date);
+            Date end = DateUtils.getStartOfDay(date);
+            QueryWrapper<Faulteliminatedefects> delQw = new QueryWrapper<>();
+            delQw.eq("DATETIME",date);
+            faulteliminatedefectsService.remove(delQw);
+
+            QueryWrapper<Shutdownevent> qw = new QueryWrapper<>();
+            qw.le("stoptime",end).ge("stoptime",begin);
+            qw.eq("statuscode",2);
+            List<Shutdownevent> shutdowneventList = shutdowneventService.list(qw);
+            List<Faulteliminatedefects> resultList = new ArrayList<>();
+            wtls.stream().forEach(wt->{
+                Faulteliminatedefects faulteliminatedefects = new Faulteliminatedefects();
+                faulteliminatedefects.setWindpowerstationid(wt.getWindpowerstationid());
+                faulteliminatedefects.setWindturbineid(wt.getId());
+                faulteliminatedefects.setProjectid(wt.getProjectid());
+                faulteliminatedefects.setLineid(wt.getLineid());
+                faulteliminatedefects.setDatetime(date);
+
+                long right = shutdowneventList.stream().filter(s -> s.getWindturbineid().equals(wt.getId()) && s.getStophours() <= 24).collect(Collectors.toList()).size();
+                long fault = shutdowneventList.stream().filter(s -> s.getWindturbineid().equals(wt.getId())).collect(Collectors.toList()).size();
+                faulteliminatedefects.setFaultcount(fault);
+                faulteliminatedefects.setRightcount(right);
+                double rate = fault != 0 ? DoubleUtils.keepPrecision(right / fault * 100, 2) : 100;
+                faulteliminatedefects.setRate(rate);
+                resultList.add(faulteliminatedefects);
+            });
+            faulteliminatedefectsService.saveBatch(resultList);
+
+        });
+    }
+
+}

+ 16 - 0
histroy/benchmarking-histroy-new/src/main/java/com/gyee/benchmarkinghistroy/task/SaticScheduleTask.java

@@ -4,6 +4,7 @@ package com.gyee.benchmarkinghistroy.task;
 import com.gyee.benchmarkinghistroy.service.benchmarking.BenchmarkingHistroyService;
 import com.gyee.benchmarkinghistroy.service.infoday.InfodayService;
 import com.gyee.benchmarkinghistroy.service.specific.SpecificService;
+import com.gyee.benchmarkinghistroy.service.threerate.ThreeRateService;
 import com.gyee.common.util.DateUtils;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableScheduling;
@@ -27,6 +28,8 @@ public class SaticScheduleTask {
     private SpecificService specificService;
     @Resource
     private InfodayService infodayService;
+    @Resource
+    private ThreeRateService threeRateService;
 
     //3.添加定时任务
     /**
@@ -97,4 +100,17 @@ public class SaticScheduleTask {
         infodayService.saveWindpowerinfoday3(date,date);
     }
 
+    /**
+     * 专题分析调度
+     */
+    @Scheduled(cron = "0 0 0 * * ?")
+    //或直接指定时间间隔,例如:5秒
+    //@Scheduled(fixedRate=5000)
+    private void configureTasks5() {
+        Date yestday = DateUtils.getYestday(new Date());
+        String date = DateUtils.toDate1(yestday);
+        threeRateService.FailRate(date,date);
+        threeRateService.ResetAngStateRate(date,date);
+    }
+
 }

+ 6 - 2
histroy/benchmarking-histroy-new/src/test/java/com/gyee/benchmarkinghistroy/BenchmarkingHistroyMainNewTest.java

@@ -4,6 +4,7 @@ package com.gyee.benchmarkinghistroy;
 import com.gyee.benchmarkinghistroy.service.benchmarking.BenchmarkingHistroyService;
 import com.gyee.benchmarkinghistroy.service.infoday.InfodayService;
 import com.gyee.benchmarkinghistroy.service.specific.SpecificService;
+import com.gyee.benchmarkinghistroy.service.threerate.ThreeRateService;
 import com.gyee.common.util.DateUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,18 +35,21 @@ public  class BenchmarkingHistroyMainNewTest {
     private SpecificService specificService;
     @Resource
     private InfodayService infodayService;
+    @Resource
+    private ThreeRateService threeRateService;
     Logger log = LoggerFactory.getLogger(BenchmarkingHistroyMainNewTest.class);
 
 
     @Test
     public void test1() throws Exception {
-        String date = "2022-07-18";
+        String date = "2022-08-03";
+        threeRateService.FailRate(date,date);
 //        benchmarkingHistroyService.saveEquipmentdayinfo(date,date);
 //        benchmarkingHistroyService.saveEquipmentdaydetailed(date,date);
 //        benchmarkingHistroyService.saveOperationrecord(date,date);
 //        benchmarkingHistroyService.saveBeanchmarkList(date,date);
 //        benchmarkingHistroyService.saveBenchmark(date,date);
-        infodayService.saveWindturbineinfoday(date,date);
+//        infodayService.saveWindturbineinfoday(date,date);
 //        infodayService.saveWindturbineinfoday3(date,date);
 //        infodayService.saveWindpowerinfoday(date,date);
 //        infodayService.saveWindpowerinfoday3(date,date);