|
@@ -1,9 +1,11 @@
|
|
|
package com.gyee.gaia.meter.service.saveTDengine;
|
|
|
|
|
|
+import cn.hutool.core.collection.ListUtil;
|
|
|
import cn.hutool.core.date.DateTime;
|
|
|
import cn.hutool.core.date.DateUtil;
|
|
|
import cn.hutool.core.date.LocalDateTimeUtil;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.gyee.gaia.common.data.taos.RealtimeAverageTarget;
|
|
|
import com.gyee.gaia.meter.adapter.Adapter;
|
|
|
import com.gyee.gaia.meter.entity.*;
|
|
|
import com.gyee.gaia.meter.mapper.TDLineFDL15MinMapper;
|
|
@@ -14,16 +16,13 @@ import com.gyee.gaia.meter.service.impl.TDLineFDL15MinServiceImpl;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.boot.test.context.SpringBootTest;
|
|
|
-import sun.util.calendar.BaseCalendar;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.math.RoundingMode;
|
|
|
-import java.sql.SQLOutput;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.ArrayList;
|
|
|
-import java.util.Date;
|
|
|
import java.util.List;
|
|
|
|
|
|
/**
|
|
@@ -32,55 +31,261 @@ import java.util.List;
|
|
|
**/
|
|
|
@SpringBootTest
|
|
|
class TDSaveLineFDL15MinTest {
|
|
|
+
|
|
|
@Resource
|
|
|
TDLineFDL15MinServiceImpl tdLineFDL15MinService;
|
|
|
@Resource
|
|
|
TDLineFDL15MinMapper tdLineFDL15MinMapper;
|
|
|
|
|
|
+ @Resource
|
|
|
+ Adapter adapter;
|
|
|
+ @Resource
|
|
|
+ PowerStationServiceImpl powerStationService;
|
|
|
+ @Resource
|
|
|
+ MeterPointServiceImpl meterPointService;
|
|
|
+ @Resource
|
|
|
+ ProMeterLineFDL15MinServiceImpl proMeterLineFDL15MinService;
|
|
|
|
|
|
|
|
|
- @Test
|
|
|
- void TDSaveSaveLineFDL15Min() {
|
|
|
-
|
|
|
- //Service层拼接字符串
|
|
|
-
|
|
|
-// tdLineFDL15MinService.saveBatch();
|
|
|
-
|
|
|
- //mapper@insert
|
|
|
-
|
|
|
-// tdLineFDL15MinMapper.insertLineFDL15Min("MHSDJL_NX_GD_MHSF_DD_P1_L1_001_ZXYG044","场站","期次","名称",new Date().getTime(),444);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- List<TDLineFDL15Min> list1 = tdLineFDL15MinMapper.selectLineFDL15Min1();
|
|
|
- System.out.println("查询结果:"+list1 );
|
|
|
-
|
|
|
-
|
|
|
-// List<TDLineFDL15Min> list = tdLineFDL15MinService.list(new QueryWrapper<TDLineFDL15Min>()
|
|
|
-// .select("*")
|
|
|
-// );
|
|
|
-// System.out.println(list);
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ @Value("${start.time}")
|
|
|
+ private String startTimeString;
|
|
|
+ @Value("${end.time}")
|
|
|
+ private String endTimeString;
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
+ * 保存taos(根据超级表自动创建子表)
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void saveSaveLineFDL15Min() {
|
|
|
+
|
|
|
+ //1,查询所有风电场
|
|
|
+ List<PowerStation> powerStationList = powerStationService.list(new QueryWrapper<PowerStation>()
|
|
|
+ .like("nem_code", "_FDC_"));
|
|
|
+
|
|
|
+ for (PowerStation powerStation : powerStationList) {
|
|
|
+ //2,根据场站ID,测点类型得到集电线路发电量的测点
|
|
|
+ List<MeterPoint> meterPointList = meterPointService.list(new QueryWrapper<MeterPoint>()
|
|
|
+ .eq("windpowerstation_id", powerStation.getId())
|
|
|
+ .eq("property", "CD")
|
|
|
+ .eq("meter_type", "线路")
|
|
|
+ .like("meter_class", "集电线路")
|
|
|
+ );
|
|
|
+
|
|
|
+ //3,遍历测点,拿到每个测点的nem_code
|
|
|
+ for (MeterPoint meterPoint : meterPointList) {
|
|
|
+ System.out.println(meterPoint);
|
|
|
+ //获取测点code
|
|
|
+ String pointcode = meterPoint.getNemCode();
|
|
|
+ String pointcode2 = pointcode.replace(".NX_", "_NX_");
|
|
|
+
|
|
|
+ //设置取值开始时间
|
|
|
+ String startString = startTimeString;
|
|
|
+ DateTime startDateTime = DateUtil.parse(startString);
|
|
|
+
|
|
|
+ //设置取值结束时间
|
|
|
+ String endDateString = endTimeString;
|
|
|
+ DateTime endDateTime0 = DateUtil.parse(endDateString);
|
|
|
+ DateTime endDateTime = DateUtil.endOfDay(endDateTime0);
|
|
|
+
|
|
|
+ //指定开始日期到结束日期的间隔
|
|
|
+ LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
|
|
|
+ LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
|
|
|
+ long between0 = ChronoUnit.MINUTES.between(day1, day2);
|
|
|
+ int between = (int) (between0 / 15);
|
|
|
+
|
|
|
+
|
|
|
+ for (int i = 0; i <= between; i++) {
|
|
|
+
|
|
|
+ //开始时间00:00:01
|
|
|
+ DateTime dateTime1 = DateUtil.offsetMinute(startDateTime, (i - 1) * 15);
|
|
|
+ DateTime dateTime2 = DateUtil.offsetMinute(startDateTime, i * 15);
|
|
|
+ BigDecimal bigDecimal1 = new BigDecimal(0);
|
|
|
+ BigDecimal bigDecimal2 = new BigDecimal(0);
|
|
|
+ BigDecimal rfdl = new BigDecimal(0);
|
|
|
+
|
|
|
+
|
|
|
+ List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
|
|
|
+
|
|
|
+ if (historyRaw.size() > 0) {
|
|
|
+ bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
|
|
|
+ bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
|
|
|
+ bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
|
|
|
+ bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
|
|
|
+ rfdl = bigDecimal2.subtract(bigDecimal1).multiply(meterPoint.getMagnification());
|
|
|
+
|
|
|
+ if (rfdl.doubleValue() > 50000 || rfdl.doubleValue() < 0) {
|
|
|
+
|
|
|
+ ArrayList<Double> arrayList = new ArrayList<>();
|
|
|
+ for (PointData pointData : historyRaw) {
|
|
|
+ arrayList.add(pointData.getValue());
|
|
|
+ }
|
|
|
+ int index = -1;
|
|
|
+ // 定义增长阈值
|
|
|
+ double threshold = 50000.0;
|
|
|
+
|
|
|
+ for (int j = 1; j < arrayList.size(); j++) {
|
|
|
+ double current = arrayList.get(j);
|
|
|
+ double previous = arrayList.get(j - 1);
|
|
|
+ double difference = current - previous;
|
|
|
+ if (difference > threshold) {
|
|
|
+ index = j;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (index != -1) {
|
|
|
+ double valueGrow2 = arrayList.get(index);
|
|
|
+ BigDecimal bigDecimalGrow2 = new BigDecimal(Double.toString(valueGrow2));
|
|
|
+ double valueGrow1 = arrayList.get(index - 1);
|
|
|
+ BigDecimal bigDecimalGrow1 = new BigDecimal(Double.toString(valueGrow1));
|
|
|
+ rfdl = (bigDecimal2.subtract(bigDecimalGrow2).add(bigDecimalGrow1).subtract(bigDecimal1)).multiply(meterPoint.getMagnification());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ tdLineFDL15MinMapper.insertLineFDL15Min(
|
|
|
+ pointcode2,
|
|
|
+ meterPoint.getWindpowerstationId(),
|
|
|
+ meterPoint.getProjectId(),
|
|
|
+ meterPoint.getDescription(),
|
|
|
+ dateTime2.getTime(),
|
|
|
+ bigDecimal2.doubleValue(),
|
|
|
+ rfdl.doubleValue()
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ /**
|
|
|
+ * 批量保存到taos(不会自动建表)
|
|
|
+ */
|
|
|
+ @Test
|
|
|
+ void saveSaveLineFDL15Min_batchInsert() {
|
|
|
+
|
|
|
+ //1,查询所有风电场
|
|
|
+ List<PowerStation> powerStationList = powerStationService.list(new QueryWrapper<PowerStation>()
|
|
|
+ .like("nem_code", "_FDC_"));
|
|
|
+
|
|
|
+ for (PowerStation powerStation : powerStationList) {
|
|
|
+ //2,根据场站ID,测点类型得到集电线路发电量的测点
|
|
|
+ List<MeterPoint> meterPointList = meterPointService.list(new QueryWrapper<MeterPoint>()
|
|
|
+ .eq("windpowerstation_id", powerStation.getId())
|
|
|
+ .eq("property", "CD")
|
|
|
+ .eq("meter_type", "线路")
|
|
|
+ .like("meter_class", "集电线路")
|
|
|
+ );
|
|
|
+
|
|
|
+ //3,遍历测点,拿到每个测点的nem_code
|
|
|
+ for (MeterPoint meterPoint : meterPointList) {
|
|
|
+ System.out.println(meterPoint);
|
|
|
+ //获取测点code
|
|
|
+ String pointcode = meterPoint.getNemCode();
|
|
|
+ String pointcode2 = pointcode.replace(".NX_", "_NX_");
|
|
|
+
|
|
|
+ //设置取值开始时间
|
|
|
+ String startString = startTimeString;
|
|
|
+ DateTime startDateTime = DateUtil.parse(startString);
|
|
|
+
|
|
|
+ //设置取值结束时间
|
|
|
+ String endDateString = endTimeString;
|
|
|
+ DateTime endDateTime0 = DateUtil.parse(endDateString);
|
|
|
+ DateTime endDateTime = DateUtil.endOfDay(endDateTime0);
|
|
|
+
|
|
|
+ //指定开始日期到结束日期的间隔
|
|
|
+ LocalDateTime day1 = LocalDateTimeUtil.of(startDateTime);
|
|
|
+ LocalDateTime day2 = LocalDateTimeUtil.of(endDateTime);
|
|
|
+ long between0 = ChronoUnit.MINUTES.between(day1, day2);
|
|
|
+ int between = (int) (between0 / 15);
|
|
|
+
|
|
|
+ ArrayList<TDLineFDL15Min> tdLineFDL15Mins = new ArrayList<>();
|
|
|
+
|
|
|
+
|
|
|
+ for (int i = 0; i <= between; i++) {
|
|
|
+
|
|
|
+ //开始时间00:00:01
|
|
|
+ DateTime dateTime1 = DateUtil.offsetMinute(startDateTime, (i - 1) * 15);
|
|
|
+ DateTime dateTime2 = DateUtil.offsetMinute(startDateTime, i * 15);
|
|
|
+ BigDecimal bigDecimal1 = new BigDecimal(0);
|
|
|
+ BigDecimal bigDecimal2 = new BigDecimal(0);
|
|
|
+ BigDecimal rfdl = new BigDecimal(0);
|
|
|
+
|
|
|
+
|
|
|
+ List<PointData> historyRaw = adapter.getHistoryRaw(pointcode, dateTime1.getTime(), dateTime2.getTime());
|
|
|
+
|
|
|
+ if (historyRaw.size() > 0) {
|
|
|
+ bigDecimal1 = new BigDecimal(Double.toString(historyRaw.get(0).getValue()));
|
|
|
+ bigDecimal1 = bigDecimal1.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
|
|
|
+ bigDecimal2 = new BigDecimal(Double.toString(historyRaw.get(historyRaw.size() - 1).getValue()));
|
|
|
+ bigDecimal2 = bigDecimal2.divide(meterPoint.getXs(), 4, RoundingMode.HALF_EVEN);
|
|
|
+ rfdl = bigDecimal2.subtract(bigDecimal1).multiply(meterPoint.getMagnification());
|
|
|
+
|
|
|
+ if (rfdl.doubleValue() > 50000 || rfdl.doubleValue() < 0) {
|
|
|
+
|
|
|
+ ArrayList<Double> arrayList = new ArrayList<>();
|
|
|
+ for (PointData pointData : historyRaw) {
|
|
|
+ arrayList.add(pointData.getValue());
|
|
|
+ }
|
|
|
+ int index = -1;
|
|
|
+ // 定义增长阈值
|
|
|
+ double threshold = 50000.0;
|
|
|
+
|
|
|
+ for (int j = 1; j < arrayList.size(); j++) {
|
|
|
+ double current = arrayList.get(j);
|
|
|
+ double previous = arrayList.get(j - 1);
|
|
|
+ double difference = current - previous;
|
|
|
+ if (difference > threshold) {
|
|
|
+ index = j;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (index != -1) {
|
|
|
+ double valueGrow2 = arrayList.get(index);
|
|
|
+ BigDecimal bigDecimalGrow2 = new BigDecimal(Double.toString(valueGrow2));
|
|
|
+ double valueGrow1 = arrayList.get(index - 1);
|
|
|
+ BigDecimal bigDecimalGrow1 = new BigDecimal(Double.toString(valueGrow1));
|
|
|
+ rfdl = (bigDecimal2.subtract(bigDecimalGrow2).add(bigDecimalGrow1).subtract(bigDecimal1)).multiply(meterPoint.getMagnification());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ TDLineFDL15Min tdLineFDL15Min = new TDLineFDL15Min();
|
|
|
+ tdLineFDL15Min.setTbName(pointcode2);
|
|
|
+ tdLineFDL15Min.setTs(dateTime2.getTime());
|
|
|
+ tdLineFDL15Min.setBottom(bigDecimal2.doubleValue());
|
|
|
+ tdLineFDL15Min.setMeter(rfdl.doubleValue());
|
|
|
+ tdLineFDL15Min.setPowerstation(meterPoint.getWindpowerstationId());
|
|
|
+ tdLineFDL15Min.setProject(meterPoint.getProjectId());
|
|
|
+ tdLineFDL15Min.setName(meterPoint.getDescription());
|
|
|
+
|
|
|
+ tdLineFDL15Mins.add(tdLineFDL15Min);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ List<List<TDLineFDL15Min>> split = ListUtil.split(tdLineFDL15Mins, 1000);
|
|
|
+ int count = 0;
|
|
|
+ for (List<TDLineFDL15Min> targets : split) {
|
|
|
+ StringBuilder sb = new StringBuilder();
|
|
|
+ for (TDLineFDL15Min target : targets) {
|
|
|
+ sb.append(target.getTbName())
|
|
|
+ .append(" values(")
|
|
|
+ .append(target.getTs()).append(",").append(target.getBottom()).append(",").append(target.getMeter())
|
|
|
+ .append(") ");
|
|
|
+ }
|
|
|
+ count += tdLineFDL15MinMapper.insert(sb.toString());
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
|
|
|
}
|