|
@@ -2,35 +2,150 @@ package com.gyee.gaia.cause.service;
|
|
|
|
|
|
import com.gyee.gaia.cause.adapter.AdapterApi;
|
|
|
import com.gyee.gaia.cause.entity.PointData;
|
|
|
-import com.gyee.gaia.common.data.point.TestingPoint;
|
|
|
+import com.gyee.gaia.cause.entity.StateCause;
|
|
|
+import com.gyee.gaia.common.data.power.ModelPower;
|
|
|
+import com.gyee.gaia.init.CacheContext;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.util.HashMap;
|
|
|
-import java.util.List;
|
|
|
-import java.util.Map;
|
|
|
+import java.util.*;
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
|
|
+@Slf4j
|
|
|
@Service
|
|
|
public class CalculateService {
|
|
|
|
|
|
@Resource
|
|
|
private AdapterApi adapterApi;
|
|
|
+ @Resource
|
|
|
+ private IStateCauseService stateCauseService;
|
|
|
|
|
|
- public Map<TestingPoint, List<PointData>> getValue(List<TestingPoint> points, long starttime, long endtime) {
|
|
|
- Map<TestingPoint, List<PointData>> keyDatas = new HashMap<>();
|
|
|
- for (TestingPoint point : points) {
|
|
|
- List<PointData> rawByKey = adapterApi.getRawByKey(point.getCode(), starttime, endtime);
|
|
|
- keyDatas.put(point, rawByKey);
|
|
|
- }
|
|
|
- return keyDatas;
|
|
|
+ private Map<String,Map<String, List<PointData>>> pointDatas;
|
|
|
+
|
|
|
+ public void refresh(long starttime, long endtime){
|
|
|
+ log.info("刷新测点值!");
|
|
|
+ CacheContext.pointsMap.forEach((ucname,pointList)->{
|
|
|
+ pointList.forEach(point->{
|
|
|
+ List<PointData> rawByKey = adapterApi.getRawByKey(point.getCode(), starttime, endtime);
|
|
|
+ Map<String, List<PointData>> tppdl = new HashMap<>();
|
|
|
+ tppdl.put(point.getCode(), rawByKey);
|
|
|
+ pointDatas.put(ucname, tppdl);
|
|
|
+ });
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
- public void calculate(Map<TestingPoint, List<PointData>> value) {
|
|
|
- for (Map.Entry<TestingPoint, List<PointData>> entry : value.entrySet()) {
|
|
|
+ //风机的8种原始状态:0-停机、 1-上电、2-待机、3-启动、4-并网、5-故障、6-维护、 7-离线
|
|
|
+ public void calculate() {
|
|
|
+ List<StateCause> stateCauseList = new ArrayList<>();
|
|
|
+ pointDatas.get("风机8种状态").forEach((key,value)->{
|
|
|
//事前状态
|
|
|
- double advanceState = -1;
|
|
|
- for (PointData pointData : entry.getValue()) {
|
|
|
+ double advanceState = value.get(0).getDoubleValue();
|
|
|
+ //事前时间
|
|
|
+ long advanceTime = value.get(0).getTs();
|
|
|
+
|
|
|
+ double doubleValue;
|
|
|
+ long ts;
|
|
|
+ for (PointData pointData : value) {
|
|
|
+ ts = pointData.getTs();
|
|
|
+ doubleValue = pointData.getDoubleValue();
|
|
|
+
|
|
|
+ if(doubleValue ==1||doubleValue==3) continue;
|
|
|
+ if(doubleValue ==advanceState) continue;
|
|
|
+
|
|
|
+ //判断事前状态
|
|
|
+ if(advanceState==4){
|
|
|
+ //计算限电
|
|
|
+ calcElectricityRation(stateCauseList,key,advanceTime,ts,doubleValue);
|
|
|
+ }else if(advanceState==0){
|
|
|
+ StateCause cause = new StateCause();
|
|
|
+ cause.setStationId(CacheContext.equipPointsMap.get(key).getWindpowerstationId());
|
|
|
+ cause.setEquipmentId(CacheContext.equipPointsMap.get(key).getId());
|
|
|
+ cause.setEvent("停机");
|
|
|
+ cause.setStartTime(new Date(advanceTime));
|
|
|
+ cause.setEndTime(new Date(ts));
|
|
|
+ cause.setAdvanceState("停机");
|
|
|
+ cause.setAfterState(CacheContext.stateMap.get(doubleValue));
|
|
|
+ cause.setTime(ts -advanceTime);
|
|
|
+ stateCauseList.add(cause);
|
|
|
+ }else if(advanceState==2){
|
|
|
+ StateCause cause = new StateCause();
|
|
|
+ cause.setStationId(CacheContext.equipPointsMap.get(key).getWindpowerstationId());
|
|
|
+ cause.setEquipmentId(CacheContext.equipPointsMap.get(key).getId());
|
|
|
+ cause.setEvent("待机");
|
|
|
+ cause.setStartTime(new Date(advanceTime));
|
|
|
+ cause.setEndTime(new Date(ts));
|
|
|
+ cause.setAdvanceState("待机");
|
|
|
+ cause.setAfterState(CacheContext.stateMap.get(doubleValue));
|
|
|
+ cause.setTime(ts -advanceTime);
|
|
|
+ stateCauseList.add(cause);
|
|
|
+ }
|
|
|
+
|
|
|
+ advanceState = doubleValue;
|
|
|
+ advanceTime = ts;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ stateCauseService.saveBatch(stateCauseList);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @param stateCauseList
|
|
|
+ * @param equipment 设备id
|
|
|
+ * @param start 并网开始时间
|
|
|
+ * @param end 并网结束时间
|
|
|
+ * @param endeventstate 事后状态
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private void calcElectricityRation(List<StateCause> stateCauseList, String equipment, long start, long end, double endeventstate) {
|
|
|
+ //满发功率和最小风速
|
|
|
+ ModelPower modelPower = CacheContext.fullSpeeds.get(CacheContext.equipPointsMap.get(equipment).getModelId());
|
|
|
+ //并网时间内的风速列表
|
|
|
+ List<PointData> speedList = pointDatas.get("风速").get(equipment).stream()
|
|
|
+ .filter(pointData -> pointData.getTs() >= start || pointData.getTs() < end).collect(Collectors.toList());
|
|
|
+ //是否限电
|
|
|
+ boolean isElectricityRation = false;
|
|
|
+ //限电开始时间
|
|
|
+ long t1 = 0;
|
|
|
+
|
|
|
+ for (PointData data : speedList) {
|
|
|
+ long ts = data.getTs();
|
|
|
+ //TODO 当前时间戳的桨叶角度
|
|
|
+ PointData bladeAnglePd = pointDatas.get("桨叶1角度").get(equipment).stream().filter(pointData -> pointData.getTs() <= ts).findFirst().get();
|
|
|
+ //TODO 当前时间戳的有功功率
|
|
|
+ PointData powerPd = pointDatas.get("有功功率").get(equipment).stream().filter(pointData -> pointData.getTs() <= ts).findFirst().get();
|
|
|
|
|
|
+ //风速小于11并且桨叶角度大于2
|
|
|
+ if (data.getDoubleValue() <= modelPower.getSpeed() && bladeAnglePd.getDoubleValue() > 2) {
|
|
|
+ //限电首次时间
|
|
|
+ if(!isElectricityRation){
|
|
|
+ t1 = ts;
|
|
|
+ }
|
|
|
+ isElectricityRation = true;
|
|
|
+ //风速大于11并且有功功率小于满发功率减100
|
|
|
+ } else if (data.getDoubleValue() > modelPower.getSpeed() && powerPd.getDoubleValue() < modelPower.getTheoryPower()-100) {
|
|
|
+ //限电首次时间
|
|
|
+ if(!isElectricityRation){
|
|
|
+ t1 = ts;
|
|
|
+ }
|
|
|
+ isElectricityRation = true;
|
|
|
+ }else if(isElectricityRation){
|
|
|
+ StateCause cause = new StateCause();
|
|
|
+ cause.setStationId(CacheContext.equipPointsMap.get(equipment).getWindpowerstationId());
|
|
|
+ cause.setEquipmentId(equipment);
|
|
|
+ cause.setEvent("限电");
|
|
|
+ cause.setStartTime(new Date(t1));
|
|
|
+ cause.setEndTime(new Date(ts));
|
|
|
+ cause.setAdvanceState("并网");
|
|
|
+ if(data==speedList.get(speedList.size()-1)){
|
|
|
+ cause.setAfterState(CacheContext.stateMap.get(endeventstate));
|
|
|
+ }else {
|
|
|
+ cause.setAfterState("并网");
|
|
|
+ }
|
|
|
+ cause.setTime(ts - t1);
|
|
|
+ stateCauseList.add(cause);
|
|
|
+ isElectricityRation = false;
|
|
|
}
|
|
|
}
|
|
|
}
|