|
@@ -36,7 +36,9 @@ public class CalculateService {
|
|
* 设备id,状态点列表
|
|
* 设备id,状态点列表
|
|
*/
|
|
*/
|
|
private final Map<String, List<PointData>> stateDatas=new HashMap<>();
|
|
private final Map<String, List<PointData>> stateDatas=new HashMap<>();
|
|
- Map<Double, String> stateMap;
|
|
|
|
|
|
+ private Map<Double, String> stateMap;
|
|
|
|
+ private Map<String, List<FaultInfo>> fjGzMap;
|
|
|
|
+ private Map<String, List<FaultInfo>> syzGzMap;
|
|
|
|
|
|
public void refresh(long starttime, long endtime){
|
|
public void refresh(long starttime, long endtime){
|
|
log.info("刷新测点值!");
|
|
log.info("刷新测点值!");
|
|
@@ -44,7 +46,24 @@ public class CalculateService {
|
|
List<PointData> rawByKey = adapterApi.getRawByKey(v.getCode(), starttime, endtime);
|
|
List<PointData> rawByKey = adapterApi.getRawByKey(v.getCode(), starttime, endtime);
|
|
stateDatas.put(k, rawByKey);
|
|
stateDatas.put(k, rawByKey);
|
|
});
|
|
});
|
|
|
|
+
|
|
stateMap = CacheContext.stateMap;
|
|
stateMap = CacheContext.stateMap;
|
|
|
|
+
|
|
|
|
+ log.info("加载风机故障");
|
|
|
|
+ String startStr = DateTime.of(starttime - 30 * 60 * 1000).toStringDefaultTimeZone();
|
|
|
|
+ String endStr = DateTime.of(endtime).toStringDefaultTimeZone();
|
|
|
|
+ List<FaultInfo> fjGz = shardingApi.getFaultInfoList("FJ", startStr, endStr, null, null, null);
|
|
|
|
+ fjGzMap = fjGz.stream().collect(Collectors.groupingBy(FaultInfo::getWindturbineId));
|
|
|
|
+
|
|
|
|
+ log.info("加载升压站故障");
|
|
|
|
+ List<FaultInfo> syzGz = shardingApi.getFaultInfoList("SYZ", "2023-05-10", "2023-05-13", null, null, null);
|
|
|
|
+ syzGzMap = syzGz.stream().filter(fi -> fi.getAlertText().contains("位状态"))
|
|
|
|
+ .map(fi -> {
|
|
|
|
+ fi.setConfirmPerson(fi.getAlertText().substring(fi.getAlertText().indexOf("--")));
|
|
|
|
+ fi.setAlertText(fi.getAlertText().substring(0, fi.getAlertText().indexOf("--")));
|
|
|
|
+ return fi;
|
|
|
|
+ })
|
|
|
|
+ .collect(Collectors.groupingBy(FaultInfo::getStationId));
|
|
}
|
|
}
|
|
|
|
|
|
//风机的8种原始状态:0-停机、 1-上电、2-待机、3-启动、4-并网、5-故障、6-维护、 7-离线
|
|
//风机的8种原始状态:0-停机、 1-上电、2-待机、3-启动、4-并网、5-故障、6-维护、 7-离线
|
|
@@ -92,7 +111,7 @@ public class CalculateService {
|
|
stateCauseList.add(cause);
|
|
stateCauseList.add(cause);
|
|
}
|
|
}
|
|
}else if(advanceState==6){
|
|
}else if(advanceState==6){
|
|
- if(isHasFaultEvent(thingId,advanceTime,ts)){
|
|
|
|
|
|
+ if(hasFaultEvent(thingId,advanceTime,ts)){
|
|
//故障
|
|
//故障
|
|
StateCause cause = new StateCause(thingId2StationId(thingId),thingId, stateMap.get(5.0),
|
|
StateCause cause = new StateCause(thingId2StationId(thingId),thingId, stateMap.get(5.0),
|
|
new Date(advanceTime),new Date(ts), stateMap.get(6.0),stateMap.get(doubleValue),ts -advanceTime);
|
|
new Date(advanceTime),new Date(ts), stateMap.get(6.0),stateMap.get(doubleValue),ts -advanceTime);
|
|
@@ -128,7 +147,7 @@ public class CalculateService {
|
|
* 判断限停
|
|
* 判断限停
|
|
*/
|
|
*/
|
|
private boolean judgmentStop(String thingId, long start, long end) {
|
|
private boolean judgmentStop(String thingId, long start, long end) {
|
|
- if(isHasFaultEvent(thingId,start,end)) return false;
|
|
|
|
|
|
+ if(hasFaultEvent(thingId,start,end)) return false;
|
|
Booststation boostStation = thingId2BoostStation(thingId);
|
|
Booststation boostStation = thingId2BoostStation(thingId);
|
|
TestingPoint apsTp = CacheContext.pointMapMap.get("active-power-set").get(boostStation.getId());
|
|
TestingPoint apsTp = CacheContext.pointMapMap.get("active-power-set").get(boostStation.getId());
|
|
List<PointData> apsRbk = adapterApi.getValuesByKey(apsTp.getCode(), start, end,30);
|
|
List<PointData> apsRbk = adapterApi.getValuesByKey(apsTp.getCode(), start, end,30);
|
|
@@ -169,11 +188,11 @@ public class CalculateService {
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
- * 计算风电场当前时刻限电台数
|
|
|
|
|
|
+ * 计算风电场当前时刻限电台数--大于3返回优化计算速度
|
|
*/
|
|
*/
|
|
private int electricityRationCount(String stationid, long start, long end) {
|
|
private int electricityRationCount(String stationid, long start, long end) {
|
|
int count = 0;
|
|
int count = 0;
|
|
- for (Equipment equipment : CacheContext.stationMap.get(stationid)) {
|
|
|
|
|
|
+ for (Equipment equipment : CacheContext.stationEquipMap.get(stationid)) {
|
|
//满发功率和满发最小风速
|
|
//满发功率和满发最小风速
|
|
ModelPower modelPower = CacheContext.fullSpeeds.get(equipment.getModelId());
|
|
ModelPower modelPower = CacheContext.fullSpeeds.get(equipment.getModelId());
|
|
//并网时间内的风速列表
|
|
//并网时间内的风速列表
|
|
@@ -187,7 +206,7 @@ public class CalculateService {
|
|
List<PointData> activePowerPdl = adapterApi.getValuesByKey(activePowerStr, start, end,30);
|
|
List<PointData> activePowerPdl = adapterApi.getValuesByKey(activePowerStr, start, end,30);
|
|
if(bladeAnglePdl.size()<speedPdl.size()||activePowerPdl.size()<speedPdl.size()) continue;
|
|
if(bladeAnglePdl.size()<speedPdl.size()||activePowerPdl.size()<speedPdl.size()) continue;
|
|
|
|
|
|
- int incount = 0;
|
|
|
|
|
|
+ double incount = 0;
|
|
for (int i = 0; i < speedPdl.size(); i++) {
|
|
for (int i = 0; i < speedPdl.size(); i++) {
|
|
//风速小于11并且桨叶角度大于2
|
|
//风速小于11并且桨叶角度大于2
|
|
if (speedPdl.get(i).getDoubleValue() <= modelPower.getSpeed() && bladeAnglePdl.get(i).getDoubleValue() > 2) {
|
|
if (speedPdl.get(i).getDoubleValue() <= modelPower.getSpeed() && bladeAnglePdl.get(i).getDoubleValue() > 2) {
|
|
@@ -198,7 +217,7 @@ public class CalculateService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if(incount/speedPdl.size()>0.5) count++;
|
|
if(incount/speedPdl.size()>0.5) count++;
|
|
-
|
|
|
|
|
|
+ if(count>3) return count;
|
|
}
|
|
}
|
|
return count;
|
|
return count;
|
|
}
|
|
}
|
|
@@ -206,24 +225,66 @@ public class CalculateService {
|
|
/**
|
|
/**
|
|
* 判断30分钟内是否有故障
|
|
* 判断30分钟内是否有故障
|
|
*/
|
|
*/
|
|
- private boolean isHasFaultEvent(String thingId, long start, long end) {
|
|
|
|
- String stationid = thingId2StationId(thingId);
|
|
|
|
|
|
+ private boolean hasFaultEvent(String thingId, long start, long end) {
|
|
|
|
+ List<FaultInfo> fjInfos = fjGzMap.get(CacheContext.equipMap.get(thingId).getCode());
|
|
|
|
+ fjInfos=fjInfos==null?null:fjInfos.stream().filter(fi->timeBetweenBefore30(fi.getFaultTime().getTime(),start,end)).collect(Collectors.toList());
|
|
|
|
+
|
|
|
|
+ if(fjInfos!=null&&fjInfos.size()>0){
|
|
|
|
+ Map<String, List<FaultInfo>> map = fjInfos.stream().collect(Collectors.groupingBy(FaultInfo::getAlertText));
|
|
|
|
+ //判断当前故障是触发还是解除
|
|
|
|
+ for (List<FaultInfo> value : map.values()) {
|
|
|
|
+ if(value.get(0).getMessageType()==1) return true;
|
|
|
|
+ }
|
|
|
|
+ }else {
|
|
|
|
+ String stationid = thingId2StationId(thingId);
|
|
|
|
+ List<FaultInfo> syzInfos = syzGzMap.get(CacheContext.stationMap.get(stationid).getCode());
|
|
|
|
+ syzInfos=syzInfos==null?null:syzInfos.stream().filter(fi->timeBetweenBefore30(fi.getFaultTime().getTime(),start,end)).collect(Collectors.toList());
|
|
|
|
+ if(syzInfos!=null&&syzInfos.size()>0){
|
|
|
|
+ Map<String, List<FaultInfo>> map = syzInfos.stream().collect(Collectors.groupingBy(FaultInfo::getAlertText));
|
|
|
|
+ //判断当前故障是分位状态
|
|
|
|
+ for (List<FaultInfo> value : map.values()) {
|
|
|
|
+ if(value.get(0).getConfirmPerson().equals("--分位状态")) return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return false;
|
|
|
|
+
|
|
|
|
+ /*String stationid = thingId2StationId(thingId);
|
|
String startStr = DateTime.of(start - 30 * 60 * 1000).toStringDefaultTimeZone();
|
|
String startStr = DateTime.of(start - 30 * 60 * 1000).toStringDefaultTimeZone();
|
|
String endStr = DateTime.of(end).toStringDefaultTimeZone();
|
|
String endStr = DateTime.of(end).toStringDefaultTimeZone();
|
|
- List<FaultInfo> fj = shardingApi.getFaultInfoList("FJ", startStr, endStr, stationid, null,1);
|
|
|
|
- List<FaultInfo> collect = fj.stream().filter(fi -> thingId.equals(fi.getWindturbineId())).collect(Collectors.toList());
|
|
|
|
|
|
+ List<FaultInfo> fj = shardingApi.getFaultInfoList("FJ", startStr, endStr, CacheContext.stationMap.get(stationid).getCode(), null,null);
|
|
|
|
+ List<FaultInfo> collect = fj.stream().filter(fi -> Objects.equals(CacheContext.equipMap.get(thingId).getCode(),fi.getWindturbineId())).collect(Collectors.toList());
|
|
if(collect.isEmpty()){
|
|
if(collect.isEmpty()){
|
|
- List<FaultInfo> infos = shardingApi.getFaultInfoList("SYZ", startStr, endStr, stationid, "位状态", 1);
|
|
|
|
- if(infos.isEmpty()){
|
|
|
|
- return false;
|
|
|
|
- }else {
|
|
|
|
- System.out.println("SYZ"+infos.get(0).getAlertText());
|
|
|
|
|
|
+ List<FaultInfo> infos = shardingApi.getFaultInfoList("SYZ", startStr, endStr, CacheContext.stationMap.get(stationid).getCode(), null, null);
|
|
|
|
+ if(infos.size()>0){
|
|
|
|
+ infos = infos.stream().filter(fi -> fi.getAlertText().contains("位状态")).collect(Collectors.toList());
|
|
|
|
+ if(infos.isEmpty()) return false;
|
|
|
|
+
|
|
|
|
+ Map<String, List<FaultInfo>> map = infos.stream().map(fi -> {
|
|
|
|
+ fi.setConfirmPerson(fi.getAlertText().substring(fi.getAlertText().indexOf("--")));
|
|
|
|
+ fi.setAlertText(fi.getAlertText().substring(0, fi.getAlertText().indexOf("--")));
|
|
|
|
+ return fi;
|
|
|
|
+ }).collect(Collectors.groupingBy(FaultInfo::getAlertText));
|
|
|
|
+
|
|
|
|
+ for (List<FaultInfo> value : map.values()) {
|
|
|
|
+ //判断当前故障是分位状态
|
|
|
|
+ if(value.get(0).getConfirmPerson().equals("--分位状态")) return true;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
//return !infos.isEmpty();
|
|
//return !infos.isEmpty();
|
|
}else {
|
|
}else {
|
|
- System.out.println("FJ"+collect.get(0).getAlertText());
|
|
|
|
|
|
+ Map<String, List<FaultInfo>> map = collect.stream().collect(Collectors.groupingBy(FaultInfo::getAlertText));
|
|
|
|
+ //判断当前故障是触发还是解除
|
|
|
|
+ for (List<FaultInfo> value : map.values()) {
|
|
|
|
+ if(value.get(0).getMessageType()==1) return true;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- return true;
|
|
|
|
|
|
+ return false;*/
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private boolean timeBetweenBefore30(long time, long start, long end) {
|
|
|
|
+ start = start - 30 * 60 * 1000;
|
|
|
|
+ return time >= start && time <= end;
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -254,7 +315,7 @@ public class CalculateService {
|
|
});
|
|
});
|
|
int size = stationState.get(0).size();
|
|
int size = stationState.get(0).size();
|
|
|
|
|
|
- int k = 0;
|
|
|
|
|
|
+ double k = 0;
|
|
for (int i = 0; i < size; i++) {
|
|
for (int i = 0; i < size; i++) {
|
|
int finalI = i;
|
|
int finalI = i;
|
|
boolean b = stationState.stream().filter(pds -> pds.get(finalI).getDoubleValue() == starteventstate).count() == stationState.size();
|
|
boolean b = stationState.stream().filter(pds -> pds.get(finalI).getDoubleValue() == starteventstate).count() == stationState.size();
|
|
@@ -321,7 +382,7 @@ public class CalculateService {
|
|
//是否限电
|
|
//是否限电
|
|
boolean isElectricityRation = false;
|
|
boolean isElectricityRation = false;
|
|
//限电开始时间
|
|
//限电开始时间
|
|
- long t1 = 0;
|
|
|
|
|
|
+ long ts1 = 0;
|
|
|
|
|
|
long ts;
|
|
long ts;
|
|
double speedPd;
|
|
double speedPd;
|
|
@@ -341,19 +402,19 @@ public class CalculateService {
|
|
if (speedPd <= modelPower.getSpeed() && bladeAnglePd > 2) {
|
|
if (speedPd <= modelPower.getSpeed() && bladeAnglePd > 2) {
|
|
//限电首次时间
|
|
//限电首次时间
|
|
if(!isElectricityRation){
|
|
if(!isElectricityRation){
|
|
- t1 = ts;
|
|
|
|
|
|
+ ts1 = ts;
|
|
}
|
|
}
|
|
isElectricityRation = true;
|
|
isElectricityRation = true;
|
|
//风速大于11并且有功功率小于满发功率减100
|
|
//风速大于11并且有功功率小于满发功率减100
|
|
} else if (speedPd > modelPower.getSpeed() && activePowerPd < modelPower.getTheoryPower()-100) {
|
|
} else if (speedPd > modelPower.getSpeed() && activePowerPd < modelPower.getTheoryPower()-100) {
|
|
//限电首次时间
|
|
//限电首次时间
|
|
if(!isElectricityRation){
|
|
if(!isElectricityRation){
|
|
- t1 = ts;
|
|
|
|
|
|
+ ts1 = ts;
|
|
}
|
|
}
|
|
isElectricityRation = true;
|
|
isElectricityRation = true;
|
|
}else if(isElectricityRation){
|
|
}else if(isElectricityRation){
|
|
//记录限电
|
|
//记录限电
|
|
- llm.put(t1, ts);
|
|
|
|
|
|
+ llm.put(ts1, ts);
|
|
/*StateCause cause;
|
|
/*StateCause cause;
|
|
if(i==speedList.size()-1) {
|
|
if(i==speedList.size()-1) {
|
|
cause = new StateCause(thingId2StationId(equipment), equipment, stateMap.get(8.0),
|
|
cause = new StateCause(thingId2StationId(equipment), equipment, stateMap.get(8.0),
|
|
@@ -367,24 +428,35 @@ public class CalculateService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
//限电跳变处理
|
|
//限电跳变处理
|
|
- long t0 = Long.MAX_VALUE;
|
|
|
|
|
|
+ long t0 = 0;
|
|
|
|
+ long t1 = 0;
|
|
long tstart = 0;
|
|
long tstart = 0;
|
|
long tend = 0;
|
|
long tend = 0;
|
|
LinkedHashMap<Long, Long> llm2 = new LinkedHashMap<>();
|
|
LinkedHashMap<Long, Long> llm2 = new LinkedHashMap<>();
|
|
//限电列表key2-key1小于3分钟,记录为一个限电,大于3分钟,记录为另一个限电
|
|
//限电列表key2-key1小于3分钟,记录为一个限电,大于3分钟,记录为另一个限电
|
|
for (Map.Entry<Long, Long> entry : llm.entrySet()) {
|
|
for (Map.Entry<Long, Long> entry : llm.entrySet()) {
|
|
|
|
+ if(t0==0) {
|
|
|
|
+ t0 = entry.getKey();
|
|
|
|
+ tstart = entry.getKey();
|
|
|
|
+ tend=llm.get(t0);
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
t1 = entry.getKey();
|
|
t1 = entry.getKey();
|
|
if (t1 - t0 < appConfig.getLongTime().get("ration")) {
|
|
if (t1 - t0 < appConfig.getLongTime().get("ration")) {
|
|
- tend = llm.get(t0);
|
|
|
|
|
|
+ tend = llm.get(t1);
|
|
}else {
|
|
}else {
|
|
//3分钟内的限电忽略
|
|
//3分钟内的限电忽略
|
|
- if(t0!=Long.MAX_VALUE&&(tend-tstart)>appConfig.getLongTime().get("ration-min")){
|
|
|
|
|
|
+ if(tend-tstart>appConfig.getLongTime().get("ration-min")){
|
|
llm2.put(tstart, tend);
|
|
llm2.put(tstart, tend);
|
|
}
|
|
}
|
|
|
|
+ tend = llm.get(t1);
|
|
tstart = t1;
|
|
tstart = t1;
|
|
}
|
|
}
|
|
t0 = t1;
|
|
t0 = t1;
|
|
}
|
|
}
|
|
|
|
+ if(tend-tstart>appConfig.getLongTime().get("ration-min")){
|
|
|
|
+ llm2.put(tstart, tend);
|
|
|
|
+ }
|
|
return llm2;
|
|
return llm2;
|
|
}
|
|
}
|
|
}
|
|
}
|