Commit f4e1bcef authored by caotao's avatar caotao

1.算法优化代码提交

parent 5d6abc73
...@@ -8,16 +8,21 @@ import com.yeejoin.amos.boot.module.jxiop.biz.mapper2.*; ...@@ -8,16 +8,21 @@ import com.yeejoin.amos.boot.module.jxiop.biz.mapper2.*;
import com.yeejoin.amos.component.influxdb.InfluxdbUtil; import com.yeejoin.amos.component.influxdb.InfluxdbUtil;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@Service @Service
public class CommonServiceImpl { public class CommonServiceImpl {
//utc时间格式
public static final String FORMAT_UTC = "yyyy-MM-dd'T'HH:mm:ss'Z'";
private static final Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class); private static final Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class);
//-----------------调用算法时间间隔---------------- //-----------------调用算法时间间隔----------------
@Value("${sleep.time:10}") @Value("${sleep.time:10}")
...@@ -30,12 +35,12 @@ public class CommonServiceImpl { ...@@ -30,12 +35,12 @@ public class CommonServiceImpl {
@Value("${gkblhf.key:input 1}") @Value("${gkblhf.key:input 1}")
String gkqjhfkey; String gkqjhfkey;
//----------------工况变量相关性计算请求属性配置------------------------ //----------------工况变量相关性计算请求属性配置------------------------
@Value("${gkxgxfx.url:120b1159-24d9-4fdf-82af-22b71603272b}") @Value("${gkxgxfx.url:f5457bfe-0780-418d-9287-c4f31d3fb4c7}")
String gkxgxfxurl; String gkxgxfxurl;
@Value("${gkxgxfx.key:input 1}") @Value("${gkxgxfx.key:input 1}")
String gkxgxfxkey; String gkxgxfxkey;
//----------------工况变量中心值计算相关请求属性配置------------------------ //----------------工况变量中心值计算相关请求属性配置------------------------
@Value("${gkzxzjs.url:90d3b6f8-88ab-4f3d-984e-eb96fc9d31ce}") @Value("${gkzxzjs.url:ee855fc0-cb37-4b11-96c6-e61e195436bc}")
String gkzxzjsurl; String gkzxzjsurl;
@Value("${gkzxzjs.key:input 1}") @Value("${gkzxzjs.key:input 1}")
String gkzxzjskey1; String gkzxzjskey1;
...@@ -56,7 +61,7 @@ public class CommonServiceImpl { ...@@ -56,7 +61,7 @@ public class CommonServiceImpl {
@Autowired @Autowired
private IdxBizPvPointVarCorrelationMapper idxBizPvPointVarCorrelationMapper; private IdxBizPvPointVarCorrelationMapper idxBizPvPointVarCorrelationMapper;
@Autowired @Autowired
private InfluxdbUtil influxdbUtil; private InfluxdbUtil influxdbUtil;
/** /**
...@@ -90,22 +95,29 @@ public class CommonServiceImpl { ...@@ -90,22 +95,29 @@ public class CommonServiceImpl {
}); });
return idxBizPvPointProcessVariableClassificationHashMap; return idxBizPvPointProcessVariableClassificationHashMap;
} }
//遍历工况列表数据-风机 //遍历工况列表数据-风机
public void getFanConditionVariablesByTime(String startTime, String endTime) { public void getFanConditionVariablesByTime(String startTime, String endTime) {
HashMap<String, List<IdxBizFanPointProcessVariableClassification>> idxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationList(); HashMap<String, List<IdxBizFanPointProcessVariableClassification>> idxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationList();
idxBizFanPointProcessVariableClassificationHashMap.keySet().forEach(s -> { idxBizFanPointProcessVariableClassificationHashMap.keySet().forEach(s -> {
List<IdxBizFanPointProcessVariableClassification> list = idxBizFanPointProcessVariableClassificationHashMap.get(s); List<IdxBizFanPointProcessVariableClassification> list = idxBizFanPointProcessVariableClassificationHashMap.get(s);
foreachHandlerConditionVariabFan(s, list, startTime, endTime); if (list.size() > 0) {
foreachHandlerConditionVariabFan(s, list, startTime, endTime);
}
}); });
} }
//遍历工况列表数据-光伏 //遍历工况列表数据-光伏
public void getPvConditionVariablesByTime(String startTime, String endTime) { public void getPvConditionVariablesByTime(String startTime, String endTime) {
HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationList(); HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationList();
idxBizPvPointProcessVariableClassificationHashMap.keySet().forEach(s -> { idxBizPvPointProcessVariableClassificationHashMap.keySet().forEach(s -> {
List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s); List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s);
foreachHandlerConditionVariabPv(s, list, startTime, endTime); if (list.size() > 0) {
foreachHandlerConditionVariabPv(s, list, startTime, endTime);
}
}); });
} }
//遍历查询数据并调用并计算-风机 //遍历查询数据并调用并计算-风机
public void foreachHandlerConditionVariabFan(String tableName, List<IdxBizFanPointProcessVariableClassification> list, String startTime, String endTime) { public void foreachHandlerConditionVariabFan(String tableName, List<IdxBizFanPointProcessVariableClassification> list, String startTime, String endTime) {
list.forEach(idxBizFanPointProcessVariableClassification -> { list.forEach(idxBizFanPointProcessVariableClassification -> {
...@@ -167,6 +179,7 @@ public class CommonServiceImpl { ...@@ -167,6 +179,7 @@ public class CommonServiceImpl {
}); });
} }
//获取相关性基础数据-风机 //获取相关性基础数据-风机
public HashMap<String, List<IdxBizFanPointProcessVariableClassification>> getIdxBizFanPointProcessVariableClassificationListOfAnaLyse() { public HashMap<String, List<IdxBizFanPointProcessVariableClassification>> getIdxBizFanPointProcessVariableClassificationListOfAnaLyse() {
...@@ -179,6 +192,7 @@ public class CommonServiceImpl { ...@@ -179,6 +192,7 @@ public class CommonServiceImpl {
}); });
return IdxBizFanPointProcessVariableClassificationHashMap; return IdxBizFanPointProcessVariableClassificationHashMap;
} }
//获取相关性基础数据-光伏 //获取相关性基础数据-光伏
public HashMap<String, List<IdxBizPvPointProcessVariableClassification>> getIdxBizPvPointProcessVariableClassificationListOfAnaLyse() { public HashMap<String, List<IdxBizPvPointProcessVariableClassification>> getIdxBizPvPointProcessVariableClassificationListOfAnaLyse() {
...@@ -191,6 +205,7 @@ public class CommonServiceImpl { ...@@ -191,6 +205,7 @@ public class CommonServiceImpl {
}); });
return idxBizPvPointProcessVariableClassificationHashMap; return idxBizPvPointProcessVariableClassificationHashMap;
} }
//相关性分析-风机入口 //相关性分析-风机入口
public void getFanConditionVariablesByTimeAnalyse(String startTime, String endTime) { public void getFanConditionVariablesByTimeAnalyse(String startTime, String endTime) {
HashMap<String, List<IdxBizFanPointProcessVariableClassification>> idxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationListOfAnaLyse(); HashMap<String, List<IdxBizFanPointProcessVariableClassification>> idxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationListOfAnaLyse();
...@@ -198,10 +213,13 @@ public class CommonServiceImpl { ...@@ -198,10 +213,13 @@ public class CommonServiceImpl {
List<IdxBizFanPointProcessVariableClassification> list = idxBizFanPointProcessVariableClassificationHashMap.get(s); List<IdxBizFanPointProcessVariableClassification> list = idxBizFanPointProcessVariableClassificationHashMap.get(s);
list.forEach(IdxBizFanPointProcessVariableClassification -> { list.forEach(IdxBizFanPointProcessVariableClassification -> {
List<IdxBizFanPointVarCorrelation> gongkuangList = idxBizFanPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizFanPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", IdxBizFanPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", IdxBizFanPointProcessVariableClassification.getSequenceNbr())); List<IdxBizFanPointVarCorrelation> gongkuangList = idxBizFanPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizFanPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", IdxBizFanPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", IdxBizFanPointProcessVariableClassification.getSequenceNbr()));
foreachHandlerConditionVariabAnalyseFan(s, gongkuangList, startTime, endTime, IdxBizFanPointProcessVariableClassification); if (gongkuangList.size() > 0) {
foreachHandlerConditionVariabAnalyseFan(s, gongkuangList, startTime, endTime, IdxBizFanPointProcessVariableClassification);
}
}); });
}); });
} }
//相关性分析-光伏入口 //相关性分析-光伏入口
public void getPvConditionVariablesByTimeAnalyse(String startTime, String endTime) { public void getPvConditionVariablesByTimeAnalyse(String startTime, String endTime) {
HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationListOfAnaLyse(); HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationListOfAnaLyse();
...@@ -209,35 +227,39 @@ public class CommonServiceImpl { ...@@ -209,35 +227,39 @@ public class CommonServiceImpl {
List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s); List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s);
list.forEach(idxBizPvPointProcessVariableClassification -> { list.forEach(idxBizPvPointProcessVariableClassification -> {
List<IdxBizPvPointVarCorrelation> gongkuangList = idxBizPvPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizPvPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", idxBizPvPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", idxBizPvPointProcessVariableClassification.getSequenceNbr())); List<IdxBizPvPointVarCorrelation> gongkuangList = idxBizPvPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizPvPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", idxBizPvPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", idxBizPvPointProcessVariableClassification.getSequenceNbr()));
foreachHandlerConditionVariabAnalysePv(s, gongkuangList, startTime, endTime, idxBizPvPointProcessVariableClassification); if (gongkuangList.size() > 0) {
foreachHandlerConditionVariabAnalysePv(s, gongkuangList, startTime, endTime, idxBizPvPointProcessVariableClassification);
}
}); });
}); });
} }
//遍历处理数据-组装风机 //遍历处理数据-组装风机
public void foreachHandlerConditionVariabAnalyseFan(String tableName, List<IdxBizFanPointVarCorrelation> list, String startTime, String endTime, IdxBizFanPointProcessVariableClassification IdxBizFanPointProcessVariableClassification) { public void foreachHandlerConditionVariabAnalyseFan(String tableName, List<IdxBizFanPointVarCorrelation> list, String startTime, String endTime, IdxBizFanPointProcessVariableClassification idxBizFanPointProcessVariableClassification) {
String sql1 = String.format("select value from %s where address='%s' ", tableName, IdxBizFanPointProcessVariableClassification.getIndexAddress()); String sql1 = String.format("select value from %s where address='%s' ", tableName, idxBizFanPointProcessVariableClassification.getIndexAddress());
List<Map<String, Object>> returnList = influxdbUtil.query(sql1); List<Map<String, Object>> returnList = influxdbUtil.query(sql1);
List<Map<String, Object>> params = new ArrayList<>(); List<Map<String, Object>> params = new ArrayList<>();
returnList.forEach((k) -> { returnList.forEach((k) -> {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("analysisVariable", Double.parseDouble(k.get("value").toString())); map.put("analysisVariable", Double.parseDouble(k.get("value").toString()));
map.put("analysisVariableId", Long.parseLong(IdxBizFanPointProcessVariableClassification.getSequenceNbr())); map.put("analysisVariableId", Long.parseLong(idxBizFanPointProcessVariableClassification.getSequenceNbr()));
params.add(map); params.add(map);
}); });
final List<Map<String, Object>> tempParams = params; List<Map<String, Object>> tempParams = params;
list.forEach(IdxBizFanPointVarCorrelation -> { list.forEach(idxBizFanPointVarCorrelation -> {
logger.info("---------------------------------风机相关性-----------开始查询influxdb--------------------------------"); logger.info("---------------------------------风机相关性-----------开始查询influxdb--------------------------------");
List<Map<String, Object>> params1 = new ArrayList<>(); List<Map<String, Object>> params1 = new ArrayList<>();
List<Map<String, Object>> requestParams = new ArrayList<>(); List<Map<String, Object>> requestParams = new ArrayList<>();
// String sql = String.format("select value from %s where address='%s' and where time >= '%s' and where time <= '%s' ", tableName, IdxBizFanPointProcessVariableClassification.getIndexAddress(), startTime, endTime); // String sql = String.format("select value from %s where address='%s' and where time >= '%s' and where time <= '%s' ", tableName, IdxBizFanPointProcessVariableClassification.getIndexAddress(), startTime, endTime);
String sql = String.format("select value from %s where address='%s' ", tableName, IdxBizFanPointVarCorrelation.getProcessIndexAddress()); String sql = String.format("select value from %s where address='%s' ", tableName, idxBizFanPointVarCorrelation.getProcessIndexAddress());
List<Map<String, Object>> returnList1 = influxdbUtil.query(sql); List<Map<String, Object>> returnList1 = influxdbUtil.query(sql);
returnList.forEach((k) -> { returnList.forEach((k) -> {
Map<String, Object> map = new HashMap<>(); Map<String, Object> map = new HashMap<>();
map.put("processVariable", Double.parseDouble(k.get("value").toString())); map.put("processVariable", Double.parseDouble(k.get("value").toString()));
map.put("processVariableId", Long.parseLong(IdxBizFanPointVarCorrelation.getProcessPointId().toString())); map.put("processVariableId", Long.parseLong(idxBizFanPointVarCorrelation.getProcessPointId().toString()));
params1.add(map); params1.add(map);
}); });
if (tempParams.size() >= params1.size()) { if (tempParams.size() >= params1.size()) {
requestParams = megreMapList(tempParams, params1); requestParams = megreMapList(tempParams, params1);
} else { } else {
...@@ -247,6 +269,7 @@ public class CommonServiceImpl { ...@@ -247,6 +269,7 @@ public class CommonServiceImpl {
logger.info("------------------------------风机相关性------------分析变量与工况变量相关性分析算法开始----------------------------------------"); logger.info("------------------------------风机相关性------------分析变量与工况变量相关性分析算法开始----------------------------------------");
HashMap<String, Object> realParams = new HashMap<>(); HashMap<String, Object> realParams = new HashMap<>();
realParams.put(gkxgxfxkey, requestParams); realParams.put(gkxgxfxkey, requestParams);
logger.info("------------------------------风机相关性------------分析变量与工况变量相关性分析算参数---------------------------------------" + JSON.toJSONString(realParams));
String repsonse = HttpUtil.createPost(baseUrl + gkxgxfxurl).body(JSON.toJSONString(realParams)).execute().body(); String repsonse = HttpUtil.createPost(baseUrl + gkxgxfxurl).body(JSON.toJSONString(realParams)).execute().body();
try { try {
logger.info("response-------------" + repsonse); logger.info("response-------------" + repsonse);
...@@ -258,6 +281,7 @@ public class CommonServiceImpl { ...@@ -258,6 +281,7 @@ public class CommonServiceImpl {
} }
}); });
} }
//遍历处理数据-组装风机 //遍历处理数据-组装风机
public void foreachHandlerConditionVariabAnalysePv(String tableName, List<IdxBizPvPointVarCorrelation> list, String startTime, String endTime, IdxBizPvPointProcessVariableClassification idxBizPvPointProcessVariableClassification) { public void foreachHandlerConditionVariabAnalysePv(String tableName, List<IdxBizPvPointVarCorrelation> list, String startTime, String endTime, IdxBizPvPointProcessVariableClassification idxBizPvPointProcessVariableClassification) {
String sql1 = String.format("select value from %s where address='%s' ", tableName, idxBizPvPointProcessVariableClassification.getIndexAddress()); String sql1 = String.format("select value from %s where address='%s' ", tableName, idxBizPvPointProcessVariableClassification.getIndexAddress());
...@@ -269,7 +293,6 @@ public class CommonServiceImpl { ...@@ -269,7 +293,6 @@ public class CommonServiceImpl {
map.put("analysisVariableId", Long.parseLong(idxBizPvPointProcessVariableClassification.getSequenceNbr())); map.put("analysisVariableId", Long.parseLong(idxBizPvPointProcessVariableClassification.getSequenceNbr()));
params.add(map); params.add(map);
}); });
final List<Map<String, Object>> tempParams = params;
list.forEach(idxBizPvPointVarCorrelation -> { list.forEach(idxBizPvPointVarCorrelation -> {
logger.info("-------------------------------------光伏相关性-------开始查询influxdb--------------------------------"); logger.info("-------------------------------------光伏相关性-------开始查询influxdb--------------------------------");
List<Map<String, Object>> params1 = new ArrayList<>(); List<Map<String, Object>> params1 = new ArrayList<>();
...@@ -283,10 +306,10 @@ public class CommonServiceImpl { ...@@ -283,10 +306,10 @@ public class CommonServiceImpl {
map.put("processVariableId", Long.parseLong(idxBizPvPointVarCorrelation.getProcessPointId().toString())); map.put("processVariableId", Long.parseLong(idxBizPvPointVarCorrelation.getProcessPointId().toString()));
params1.add(map); params1.add(map);
}); });
if (tempParams.size() >= params1.size()) { if (params.size() >= params1.size()) {
requestParams = megreMapList(tempParams, params1); requestParams = megreMapList(params, params1);
} else { } else {
requestParams = megreMapList(params1, tempParams); requestParams = megreMapList(params1, params);
} }
if (!requestParams.isEmpty()) { if (!requestParams.isEmpty()) {
logger.info("---------------------------------光伏相关性---------分析变量与工况变量相关性分析算法开始----------------------------------------"); logger.info("---------------------------------光伏相关性---------分析变量与工况变量相关性分析算法开始----------------------------------------");
...@@ -303,16 +326,19 @@ public class CommonServiceImpl { ...@@ -303,16 +326,19 @@ public class CommonServiceImpl {
} }
}); });
} }
public List<Map<String, Object>> megreMapList(List<Map<String, Object>> longList, List<Map<String, Object>> shortList) { public List<Map<String, Object>> megreMapList(List<Map<String, Object>> longList, List<Map<String, Object>> shortList) {
List<Map<String, Object>> resultList = new ArrayList<>(); List<Map<String, Object>> resultList = new ArrayList<>();
for (int i = 0; i < longList.size(); i++) { for (int i = 0; i < longList.size(); i++) {
Map<String, Object> map = longList.get(i); Map<String, Object> map = new HashMap<>();
Map<String, Object> mapOfShortList = null; map.putAll(longList.get(i));
Map<String, Object> mapOfShortList = new HashMap<>();
if (i < shortList.size() - 1) { if (i < shortList.size() - 1) {
mapOfShortList = shortList.get(i); mapOfShortList.putAll(shortList.get(i));
} else { } else {
mapOfShortList = shortList.get(shortList.size() - 1); mapOfShortList.putAll(shortList.get(shortList.size() - 1));
} }
if (!map.containsKey("processVariable")) { if (!map.containsKey("processVariable")) {
map.put("processVariable", mapOfShortList.get("processVariable")); map.put("processVariable", mapOfShortList.get("processVariable"));
map.put("processVariableId", mapOfShortList.get("processVariableId")); map.put("processVariableId", mapOfShortList.get("processVariableId"));
...@@ -324,6 +350,7 @@ public class CommonServiceImpl { ...@@ -324,6 +350,7 @@ public class CommonServiceImpl {
} }
return resultList; return resultList;
} }
//中心值计算-风电 //中心值计算-风电
public void getFanConditionVariablesByTimeAnalyse1(String startTime, String endTime) { public void getFanConditionVariablesByTimeAnalyse1(String startTime, String endTime) {
HashMap<String, List<IdxBizFanPointProcessVariableClassification>> IdxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationListOfAnaLyse(); HashMap<String, List<IdxBizFanPointProcessVariableClassification>> IdxBizFanPointProcessVariableClassificationHashMap = getIdxBizFanPointProcessVariableClassificationListOfAnaLyse();
...@@ -331,10 +358,13 @@ public class CommonServiceImpl { ...@@ -331,10 +358,13 @@ public class CommonServiceImpl {
List<IdxBizFanPointProcessVariableClassification> list = IdxBizFanPointProcessVariableClassificationHashMap.get(s); List<IdxBizFanPointProcessVariableClassification> list = IdxBizFanPointProcessVariableClassificationHashMap.get(s);
list.forEach(IdxBizFanPointProcessVariableClassification -> { list.forEach(IdxBizFanPointProcessVariableClassification -> {
List<IdxBizFanPointVarCorrelation> gongkuangList = idxBizFanPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizFanPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", IdxBizFanPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", IdxBizFanPointProcessVariableClassification.getSequenceNbr()).orderByDesc("CORRELATION_COEFFICIENT").last("limit 0,3")); List<IdxBizFanPointVarCorrelation> gongkuangList = idxBizFanPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizFanPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", IdxBizFanPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", IdxBizFanPointProcessVariableClassification.getSequenceNbr()).orderByDesc("CORRELATION_COEFFICIENT").last("limit 0,3"));
foreachHandlerConditionVariabAnalyse1Fan(s, gongkuangList, startTime, endTime, IdxBizFanPointProcessVariableClassification); if (gongkuangList.size() > 0) {
foreachHandlerConditionVariabAnalyse1Fan(s, gongkuangList, startTime, endTime, IdxBizFanPointProcessVariableClassification);
}
}); });
}); });
} }
//中心值计算-光伏 //中心值计算-光伏
public void getPvConditionVariablesByTimeAnalyse1(String startTime, String endTime) { public void getPvConditionVariablesByTimeAnalyse1(String startTime, String endTime) {
HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationListOfAnaLyse(); HashMap<String, List<IdxBizPvPointProcessVariableClassification>> idxBizPvPointProcessVariableClassificationHashMap = getIdxBizPvPointProcessVariableClassificationListOfAnaLyse();
...@@ -342,10 +372,14 @@ public class CommonServiceImpl { ...@@ -342,10 +372,14 @@ public class CommonServiceImpl {
List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s); List<IdxBizPvPointProcessVariableClassification> list = idxBizPvPointProcessVariableClassificationHashMap.get(s);
list.forEach(idxBizPvPointProcessVariableClassification -> { list.forEach(idxBizPvPointProcessVariableClassification -> {
List<IdxBizPvPointVarCorrelation> gongkuangList = idxBizPvPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizPvPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", idxBizPvPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", idxBizPvPointProcessVariableClassification.getSequenceNbr()).orderByDesc("CORRELATION_COEFFICIENT").last("limit 0,3")); List<IdxBizPvPointVarCorrelation> gongkuangList = idxBizPvPointVarCorrelationMapper.selectList(new QueryWrapper<IdxBizPvPointVarCorrelation>().eq("ANALYSIS_GATEWAY_ID", idxBizPvPointProcessVariableClassification.getGatewayId()).eq("ANALYSIS_POINT_ID", idxBizPvPointProcessVariableClassification.getSequenceNbr()).orderByDesc("CORRELATION_COEFFICIENT").last("limit 0,3"));
foreachHandlerConditionVariabAnalyse1Pv(s, gongkuangList, startTime, endTime, idxBizPvPointProcessVariableClassification); if (gongkuangList.size() > 0) {
foreachHandlerConditionVariabAnalyse1Pv(s, gongkuangList, startTime, endTime, idxBizPvPointProcessVariableClassification);
}
}); });
}); });
} }
//中心值参数组装-风电 //中心值参数组装-风电
public void foreachHandlerConditionVariabAnalyse1Fan(String tableName, List<IdxBizFanPointVarCorrelation> list, String startTime, String endTime, IdxBizFanPointProcessVariableClassification IdxBizFanPointProcessVariableClassification) { public void foreachHandlerConditionVariabAnalyse1Fan(String tableName, List<IdxBizFanPointVarCorrelation> list, String startTime, String endTime, IdxBizFanPointProcessVariableClassification IdxBizFanPointProcessVariableClassification) {
String sql0 = String.format("select value from %s where address='%s' ", tableName, IdxBizFanPointProcessVariableClassification.getIndexAddress()); String sql0 = String.format("select value from %s where address='%s' ", tableName, IdxBizFanPointProcessVariableClassification.getIndexAddress());
...@@ -357,7 +391,6 @@ public class CommonServiceImpl { ...@@ -357,7 +391,6 @@ public class CommonServiceImpl {
map.put("analysisVariableId", Long.parseLong(IdxBizFanPointProcessVariableClassification.getSequenceNbr())); map.put("analysisVariableId", Long.parseLong(IdxBizFanPointProcessVariableClassification.getSequenceNbr()));
params.add(map); params.add(map);
}); });
final List<Map<String, Object>> tempParams = params;
logger.info("--------------------------------------风机中心值------开始查询influxdb--------------------------------"); logger.info("--------------------------------------风机中心值------开始查询influxdb--------------------------------");
List<Map<String, Object>> params1 = new ArrayList<>(); List<Map<String, Object>> params1 = new ArrayList<>();
List<Map<String, Object>> requestParams = new ArrayList<>(); List<Map<String, Object>> requestParams = new ArrayList<>();
...@@ -370,33 +403,33 @@ public class CommonServiceImpl { ...@@ -370,33 +403,33 @@ public class CommonServiceImpl {
List<IdxBizFanPointProcessVariableClassification> idxBizFanPointProcessVariableClassificationList = idxBizFanPointProcessVariableClassificationMapper.selectList(new QueryWrapper<IdxBizFanPointProcessVariableClassification>().in("SEQUENCE_NBR", processPointIds)); List<IdxBizFanPointProcessVariableClassification> idxBizFanPointProcessVariableClassificationList = idxBizFanPointProcessVariableClassificationMapper.selectList(new QueryWrapper<IdxBizFanPointProcessVariableClassification>().in("SEQUENCE_NBR", processPointIds));
//区间值1 //区间值1
HashMap<String, Object> value1 = new HashMap<>(); HashMap<String, Object> value1 = new HashMap<>();
value1.put("processVariable1", idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue1()); value1.put("processVariable1", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue1())?0.0:idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue1());
value1.put("processVariable2", idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue1()); value1.put("processVariable2", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue1())?0.0:idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue1());
value1.put("processVariable3", idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue1()); value1.put("processVariable3", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue1())?0.0:idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue1());
values.add(value1); values.add(value1);
//区间值2 //区间值2
HashMap<String, Object> value2 = new HashMap<>(); HashMap<String, Object> value2 = new HashMap<>();
value2.put("processVariable1", idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue2()); value2.put("processVariable1", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue2())?0.0:idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue2());
value2.put("processVariable2", idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue2()); value2.put("processVariable2", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue2())?0.0:idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue2());
value2.put("processVariable3", idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue2()); value2.put("processVariable3", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue2())?0.0:idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue2());
values.add(value2); values.add(value2);
//区间值3 //区间值3
HashMap<String, Object> value3 = new HashMap<>(); HashMap<String, Object> value3 = new HashMap<>();
value3.put("processVariable1", idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue3()); value3.put("processVariable1", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue3())?0.0:idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue3());
value3.put("processVariable2", idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue3()); value3.put("processVariable2", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue3())?0.0:idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue3());
value3.put("processVariable3", idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue3()); value3.put("processVariable3", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue3())?0.0:idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue3());
values.add(value3); values.add(value3);
//区间值4 //区间值4
HashMap<String, Object> value4 = new HashMap<>(); HashMap<String, Object> value4 = new HashMap<>();
value4.put("processVariable1", idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue4()); value4.put("processVariable1", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue4())?0.0:idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue4());
value4.put("processVariable2", idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue4()); value4.put("processVariable2", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue4())?0.0:idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue4());
value4.put("processVariable3", idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue4()); value4.put("processVariable3", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue4())?0.0:idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue4());
values.add(value4); values.add(value4);
//区间值5 //区间值5
HashMap<String, Object> value5 = new HashMap<>(); HashMap<String, Object> value5 = new HashMap<>();
value5.put("processVariable1", idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue5()); value5.put("processVariable1", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue5())?0.0:idxBizFanPointProcessVariableClassificationList.get(2).getIntervalValue5());
value5.put("processVariable2", idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue5()); value5.put("processVariable2", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue5())?0.0:idxBizFanPointProcessVariableClassificationList.get(1).getIntervalValue5());
value5.put("processVariable3", idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue5()); value5.put("processVariable3", ObjectUtils.isEmpty(idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue5())?0.0:idxBizFanPointProcessVariableClassificationList.get(0).getIntervalValue5());
values.add(value5); values.add(value5);
List<Map<String, Object>> returnList0 = influxdbUtil.query(sql); List<Map<String, Object>> returnList0 = influxdbUtil.query(sql);
List<Map<String, Object>> maxList = returnList0; List<Map<String, Object>> maxList = returnList0;
...@@ -431,16 +464,17 @@ public class CommonServiceImpl { ...@@ -431,16 +464,17 @@ public class CommonServiceImpl {
map.put("processVariable3", Double.parseDouble(map3.get("value").toString())); map.put("processVariable3", Double.parseDouble(map3.get("value").toString()));
map.put("processVariable3Id", Long.parseLong(list.get(2).getProcessPointId().toString())); map.put("processVariable3Id", Long.parseLong(list.get(2).getProcessPointId().toString()));
params1.add(map); params1.add(map);
if (tempParams.size() >= params1.size()) { if (params.size() >= params1.size()) {
requestParams = megreMapList1(tempParams, params1); requestParams = megreMapList1(params, params1);
} else { } else {
requestParams = megreMapList1(params1, tempParams); requestParams = megreMapList1(params1, params);
} }
if (!requestParams.isEmpty()) { if (!requestParams.isEmpty()) {
logger.info("---------------------------------风机中心值---------开始调用中心值计算算法开始----------------------------------------"); logger.info("---------------------------------风机中心值---------开始调用中心值计算算法开始----------------------------------------");
HashMap<String, Object> realParams = new HashMap<>(); HashMap<String, Object> realParams = new HashMap<>();
realParams.put(gkzxzjskey1, requestParams); realParams.put(gkzxzjskey1, requestParams);
realParams.put(gkzxzjskey2, values); realParams.put(gkzxzjskey2, values);
logger.info("------------------------------风机中心值------请求参数---------------------------------------" + JSON.toJSONString(realParams));
String response = HttpUtil.createPost(baseUrl + gkzxzjsurl).body(JSON.toJSONString(realParams)).execute().body(); String response = HttpUtil.createPost(baseUrl + gkzxzjsurl).body(JSON.toJSONString(realParams)).execute().body();
try { try {
logger.info("------------------风机中心值--repsonse: " + response); logger.info("------------------风机中心值--repsonse: " + response);
...@@ -453,6 +487,7 @@ public class CommonServiceImpl { ...@@ -453,6 +487,7 @@ public class CommonServiceImpl {
} }
} }
//中心值参数组装-光伏 //中心值参数组装-光伏
public void foreachHandlerConditionVariabAnalyse1Pv(String tableName, List<IdxBizPvPointVarCorrelation> list, String startTime, String endTime, IdxBizPvPointProcessVariableClassification idxBizPvPointProcessVariableClassification) { public void foreachHandlerConditionVariabAnalyse1Pv(String tableName, List<IdxBizPvPointVarCorrelation> list, String startTime, String endTime, IdxBizPvPointProcessVariableClassification idxBizPvPointProcessVariableClassification) {
String sql0 = String.format("select value from %s where address='%s' ", tableName, idxBizPvPointProcessVariableClassification.getIndexAddress()); String sql0 = String.format("select value from %s where address='%s' ", tableName, idxBizPvPointProcessVariableClassification.getIndexAddress());
...@@ -464,7 +499,6 @@ public class CommonServiceImpl { ...@@ -464,7 +499,6 @@ public class CommonServiceImpl {
map.put("analysisVariableId", Long.parseLong(idxBizPvPointProcessVariableClassification.getSequenceNbr())); map.put("analysisVariableId", Long.parseLong(idxBizPvPointProcessVariableClassification.getSequenceNbr()));
params.add(map); params.add(map);
}); });
final List<Map<String, Object>> tempParams = params;
logger.info("-----------------------------------光伏中心值---------开始查询influxdb--------------------------------"); logger.info("-----------------------------------光伏中心值---------开始查询influxdb--------------------------------");
List<Map<String, Object>> params1 = new ArrayList<>(); List<Map<String, Object>> params1 = new ArrayList<>();
List<Map<String, Object>> requestParams = new ArrayList<>(); List<Map<String, Object>> requestParams = new ArrayList<>();
...@@ -477,33 +511,33 @@ public class CommonServiceImpl { ...@@ -477,33 +511,33 @@ public class CommonServiceImpl {
List<IdxBizPvPointProcessVariableClassification> idxBizPvPointProcessVariableClassificationList = idxBizPvPointProcessVariableClassificationMapper.selectList(new QueryWrapper<IdxBizPvPointProcessVariableClassification>().in("SEQUENCE_NBR", processPointIds)); List<IdxBizPvPointProcessVariableClassification> idxBizPvPointProcessVariableClassificationList = idxBizPvPointProcessVariableClassificationMapper.selectList(new QueryWrapper<IdxBizPvPointProcessVariableClassification>().in("SEQUENCE_NBR", processPointIds));
//区间值1 //区间值1
HashMap<String, Object> value1 = new HashMap<>(); HashMap<String, Object> value1 = new HashMap<>();
value1.put("processVariable1", idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue1()); value1.put("processVariable1", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue1())?0.0:idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue1());
value1.put("processVariable2", idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue1()); value1.put("processVariable2", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue1())?0.0:idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue1());
value1.put("processVariable3", idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue1()); value1.put("processVariable3", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue1())?0.0:idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue1());
values.add(value1); values.add(value1);
//区间值2 //区间值2
HashMap<String, Object> value2 = new HashMap<>(); HashMap<String, Object> value2 = new HashMap<>();
value2.put("processVariable1", idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue2()); value2.put("processVariable1", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue2())?0.0:idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue2());
value2.put("processVariable2", idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue2()); value2.put("processVariable2", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue2())?0.0:idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue2());
value2.put("processVariable3", idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue2()); value2.put("processVariable3", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue2())?0.0:idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue2());
values.add(value2); values.add(value2);
//区间值3 //区间值3
HashMap<String, Object> value3 = new HashMap<>(); HashMap<String, Object> value3 = new HashMap<>();
value3.put("processVariable1", idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue3()); value3.put("processVariable1", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue3())?0.0:idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue3());
value3.put("processVariable2", idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue3()); value3.put("processVariable2", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue3())?0.0:idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue3());
value3.put("processVariable3", idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue3()); value3.put("processVariable3", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue3())?0.0:idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue3());
values.add(value3); values.add(value3);
//区间值4 //区间值4
HashMap<String, Object> value4 = new HashMap<>(); HashMap<String, Object> value4 = new HashMap<>();
value4.put("processVariable1", idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue4()); value4.put("processVariable1", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue4())?0.0:idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue4());
value4.put("processVariable2", idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue4()); value4.put("processVariable2", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue4())?0.0:idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue4());
value4.put("processVariable3", idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue4()); value4.put("processVariable3", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue4())?0.0:idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue4());
values.add(value4); values.add(value4);
//区间值5 //区间值5
HashMap<String, Object> value5 = new HashMap<>(); HashMap<String, Object> value5 = new HashMap<>();
value5.put("processVariable1", idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue5()); value5.put("processVariable1", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue5())?0.0:idxBizPvPointProcessVariableClassificationList.get(2).getIntervalValue5());
value5.put("processVariable2", idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue5()); value5.put("processVariable2", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue5())?0.0:idxBizPvPointProcessVariableClassificationList.get(1).getIntervalValue5());
value5.put("processVariable3", idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue5()); value5.put("processVariable3", ObjectUtils.isEmpty(idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue5())?0.0:idxBizPvPointProcessVariableClassificationList.get(0).getIntervalValue5());
values.add(value5); values.add(value5);
List<Map<String, Object>> returnList0 = influxdbUtil.query(sql); List<Map<String, Object>> returnList0 = influxdbUtil.query(sql);
List<Map<String, Object>> maxList = returnList0; List<Map<String, Object>> maxList = returnList0;
...@@ -538,10 +572,10 @@ public class CommonServiceImpl { ...@@ -538,10 +572,10 @@ public class CommonServiceImpl {
map.put("processVariable3", Double.parseDouble(map3.get("value").toString())); map.put("processVariable3", Double.parseDouble(map3.get("value").toString()));
map.put("processVariable3Id", Long.parseLong(list.get(2).getProcessPointId().toString())); map.put("processVariable3Id", Long.parseLong(list.get(2).getProcessPointId().toString()));
params1.add(map); params1.add(map);
if (tempParams.size() >= params1.size()) { if (params.size() >= params1.size()) {
requestParams = megreMapList1(tempParams, params1); requestParams = megreMapList1(params, params1);
} else { } else {
requestParams = megreMapList1(params1, tempParams); requestParams = megreMapList1(params1, params);
} }
if (!requestParams.isEmpty()) { if (!requestParams.isEmpty()) {
logger.info("-------------------------------------光伏中心值-----开始调用中心值计算算法----------------------------------------"); logger.info("-------------------------------------光伏中心值-----开始调用中心值计算算法----------------------------------------");
...@@ -564,12 +598,13 @@ public class CommonServiceImpl { ...@@ -564,12 +598,13 @@ public class CommonServiceImpl {
public List<Map<String, Object>> megreMapList1(List<Map<String, Object>> longList, List<Map<String, Object>> shortList) { public List<Map<String, Object>> megreMapList1(List<Map<String, Object>> longList, List<Map<String, Object>> shortList) {
List<Map<String, Object>> resultList = new ArrayList<>(); List<Map<String, Object>> resultList = new ArrayList<>();
for (int i = 0; i < longList.size(); i++) { for (int i = 0; i < longList.size(); i++) {
Map<String, Object> map = longList.get(i); Map<String, Object> map = new HashMap<>();
Map<String, Object> mapOfShortList = null; map.putAll(longList.get(i));
Map<String, Object> mapOfShortList = new HashMap<>();
if (i < shortList.size() - 1) { if (i < shortList.size() - 1) {
mapOfShortList = shortList.get(i); mapOfShortList.putAll(shortList.get(i));
} else { } else {
mapOfShortList = shortList.get(shortList.size() - 1); mapOfShortList.putAll(shortList.get(shortList.size() - 1));
} }
if (!map.containsKey("processVariable1")) { if (!map.containsKey("processVariable1")) {
map.put("processVariable1", mapOfShortList.get("processVariable1")); map.put("processVariable1", mapOfShortList.get("processVariable1"));
...@@ -598,4 +633,9 @@ public class CommonServiceImpl { ...@@ -598,4 +633,9 @@ public class CommonServiceImpl {
} }
return influxdbUtil.query(sql); return influxdbUtil.query(sql);
} }
public String getUtcTimeString(String timeStr) {
SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_UTC);
return dateFormat.format(timeStr);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment