Browse Source

taos批量插入

malijun 1 year ago
parent
commit
67840f8a75

+ 12 - 6
electricity/meter/src/main/java/com/gyee/gaia/meter/entity/TDLineFDL15Min.java

@@ -27,24 +27,30 @@ public class TDLineFDL15Min extends Model<TDLineFDL15Min> implements Serializabl
     /**
      * 子表名
      */
-    private String tbname;
+    private String tbName;
 
 
     /**
-     * 开始时间
+     * 时间
      */
-    private Timestamp  ts;
+    private long  ts;
+    /**
+     * 底码
+     */
+    private double bottom;
 
     /**
-     * 开始值
+     * 电量
      */
-    private float meter;
+    private double meter;
+
+
 
 
     /**
      * 测点编码
      */
-    private String windpowerstation;
+    private String powerstation;
 
     /**
      * 创建人;创建人

+ 24 - 13
electricity/meter/src/main/java/com/gyee/gaia/meter/mapper/TDLineFDL15MinMapper.java

@@ -9,6 +9,7 @@ import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
 
+import java.sql.Timestamp;
 import java.util.List;
 
 
@@ -16,32 +17,42 @@ import java.util.List;
 @DS("meter")
 public interface TDLineFDL15MinMapper extends BaseMapper<TDLineFDL15Min> {
 
+    /**
+     * 插入数据,sql拼接字符串
+     * @param entity 后面拼的字符串
+     */
     @Insert("insert into ${entity}")
     int insert(String entity);
 
 
-    @Insert("INSERT INTO #{tbName} VALUES (#{ts}, #{value})")
-    void insertLineFDL15Min1(@Param("tbName") String tbName, @Param("ts") long ts, @Param("value") double value);
-
-    @Insert("INSERT INTO #{tbName} USING LineFDL15Min TAGS(#{windpowerstationId},#{projectId},#{name}) VALUES (#{ts}, #{value})")
+    /**
+     * 插入数据,如果没有表则使用超级表自动建表
+     * @param tbName 子表名
+     * @param powerstationId 场站ID
+     * @param projectId 期次
+     * @param name 名称
+     * @param ts 时间戳
+     * @param bottom 底码
+     * @param meter 电量
+     */
+    @Insert("INSERT INTO #{tbName} USING LineFDL15Min TAGS(#{powerstationId},#{projectId},#{name}) VALUES (#{ts}, #{bottom},#{meter})")
     void insertLineFDL15Min(
             @Param("tbName") String tbName,
-            @Param("windpowerstationId") String windpowerstationId,
+            @Param("powerstationId") String powerstationId,
             @Param("projectId") String projectId,
             @Param("name") String name,
             @Param("ts") long ts,
-            @Param("value") double value
-    );
+            @Param("bottom") double bottom,
+            @Param("meter") double meter
 
+    );
 
-//    @Select("select * from  MHSDJL_NX_GD_MHSF_DD_P1_L1_001_ZXYG045;")
-//    int selectLineFDL15Min1(@Param("tbName") String tbName);
-     List<TDLineFDL15Min> selectLineFDL15Min2();
 
-    @Select("select * from  tb1")
+    /**
+     * 查询
+     */
+    @Select("select tbname,* from  linefdl15min")
     List<TDLineFDL15Min> selectLineFDL15Min1();
 
 
-
-
 }

+ 245 - 40
electricity/meter/src/main/java/com/gyee/gaia/meter/service/saveTDengine/TDSaveLineFDL15MinTest.java

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

+ 0 - 4
electricity/meter/src/main/resources/mappers-postgresql/TDLineFDL15MinMapper.xml

@@ -3,9 +3,4 @@
 <mapper namespace="com.gyee.gaia.meter.mapper.TDLineFDL15MinMapper">
 
 
-    <select id="selectLineFDL15Min2" resultType="com.gyee.gaia.meter.entity.TDLineFDL15Min">
-        select tbname,ts,meter,powerstation ,project ,name  from  tb1;
-    </select>
-
 </mapper>

+ 0 - 1
electricity/wind/src/main/java/com/gyee/gaia/electricity/wind/serviceimpl/RealtimeAverageTargetServiceImpl.java

@@ -24,7 +24,6 @@ public class RealtimeAverageTargetServiceImpl extends ServiceImpl<RealtimeAverag
 
     public int saveBatch(List<RealtimeAverageTarget> entityList) {
         List<List<RealtimeAverageTarget>> split = ListUtil.split(entityList, 3000);
-
         int count = 0;
         for (List<RealtimeAverageTarget> targets : split) {
             StringBuilder sb = new StringBuilder();

+ 2 - 1
metrics/build.gradle

@@ -2,7 +2,7 @@ plugins {
     id 'java'
     id 'org.springframework.boot' version '2.7.11'
     id 'io.spring.dependency-management' version '1.0.11.RELEASE'
-    id 'org.jetbrains.kotlin.jvm' version '1.8.21'
+    id 'org.jetbrains.kotlin.jvm' version '1.8.22'
 }
 
 group = 'com.gyee.gaia'
@@ -34,6 +34,7 @@ dependencies {
     implementation 'com.netflix.feign:feign-jackson:8.18.0'
 
     testImplementation 'org.springframework.boot:spring-boot-starter-test'
+
 }
 
 tasks.named('test') {