|
@@ -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);
|
|
|
+
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+}
|