Browse Source

1分钟平均指标计算补数

xushili 1 year ago
parent
commit
363165744f

+ 15 - 2
electricity/wind/src/main/java/com/gyee/gaia/electricity/wind/init/CacheContext.java

@@ -45,7 +45,15 @@ public class CacheContext implements ApplicationRunner {
     /**
      * 风场,风机
      */
-    public static Map<String, List<Equipment>> stationEquipMap;
+    public static Map<String, List<String>> stationEquipidMap;
+    /**
+     * 期次,风机
+     */
+    public static Map<String, List<String>> projectEquipidMap;
+    /**
+     * 期次,风机
+     */
+    public static Map<String, List<String>> lineEquipidMap;
     /**
      * 风机,机型
      */
@@ -61,13 +69,18 @@ public class CacheContext implements ApplicationRunner {
         log.info("加载风机!");
         List<Equipment> emList = equipmentService.list();
         equipMap = emList.stream().collect(Collectors.toMap(Equipment::getId, Function.identity()));
-        stationEquipMap = emList.stream().collect(Collectors.groupingBy(Equipment::getWindpowerstationId));
         equipModelMap = emList.stream().collect(Collectors.toMap(Equipment::getId, Equipment::getModelId));
 
         log.info("加载风场信息!");
         List<Powerstation> stationList = powerstationService.list();
         stationMap = stationList.stream().collect(Collectors.toMap(Powerstation::getId, Function.identity()));
 
+        log.info("加载线路、期次、风场信息!");
+        List<Equipment> emCollect = emList.stream().filter(e -> "WT".equals(e.getSpare1())).collect(Collectors.toList());
+        stationEquipidMap = emCollect.stream().collect(Collectors.groupingBy(Equipment::getWindpowerstationId,Collectors.mapping(Equipment::getId,Collectors.toList())));
+        projectEquipidMap = emCollect.stream().collect(Collectors.groupingBy(Equipment::getProjectId,Collectors.mapping(Equipment::getId,Collectors.toList())));
+        lineEquipidMap = emCollect.stream().collect(Collectors.groupingBy(Equipment::getLineId,Collectors.mapping(Equipment::getId,Collectors.toList())));
+
         calcEquipPowerGenDay.calcEquipPowerGenDay();
     }
 }

+ 69 - 0
electricity/wind/src/main/java/com/gyee/gaia/electricity/wind/job/CalcEquipPowerGenDay.java

@@ -11,6 +11,7 @@ import com.gyee.gaia.dao.sql.taos.IRealtimeAverageTargetService;
 import com.gyee.gaia.electricity.wind.adapter.IAdapterApi;
 import com.gyee.gaia.electricity.wind.entity.EquipPowerGenDay;
 import com.gyee.gaia.electricity.wind.entity.StateCause;
+import com.gyee.gaia.electricity.wind.init.CacheContext;
 import com.gyee.gaia.electricity.wind.iservice.IEquipPowerGenDayService;
 import com.gyee.gaia.electricity.wind.iservice.IStateCauseService;
 import com.xxl.job.core.handler.annotation.XxlJob;
@@ -19,12 +20,14 @@ import org.springframework.stereotype.Component;
 import javax.annotation.Resource;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 @Component
 public class CalcEquipPowerGenDay {
@@ -61,6 +64,72 @@ public class CalcEquipPowerGenDay {
         calcLossPower(startDateTime, endDateTime);
 
         equipPowerGenDayService.saveBatch(sepgdMap.values());
+
+        List<EquipPowerGenDay> clpsw = calcLineProjectStationWindpower(startDateTime.toLocalDateTime().toLocalDate());
+        equipPowerGenDayService.saveBatch(clpsw);
+    }
+
+    /**
+     * 计算线路、期次、场站,风电的日电量信息(发电量、理论电量、损失电量、五损电量)
+     */
+    private List<EquipPowerGenDay> calcLineProjectStationWindpower(LocalDate time1) {
+
+        QueryWrapper<EquipPowerGenDay> epgdWrapper = new QueryWrapper<>();
+        epgdWrapper.eq("category", "windturbine").eq("date", time1);
+        List<EquipPowerGenDay> epgdList = equipPowerGenDayService.list(epgdWrapper);
+
+        List<EquipPowerGenDay> equipPowerGenDayList = new ArrayList<>();
+        CacheContext.lineEquipidMap.forEach((line,equipidList)->{
+            EquipPowerGenDay genDay = new EquipPowerGenDay();
+            genDay.setDate(time1);
+            genDay.setStation(CacheContext.equipMap.get(equipidList.get(0)).getWindpowerstationId());
+            genDay.setCategory("line");
+            genDay.setFacilityId(line);
+            List<EquipPowerGenDay> filterStream = epgdList.stream().filter(epgd -> equipidList.contains(epgd.getFacilityId())).collect(Collectors.toList());
+            extracted(genDay, filterStream);
+            equipPowerGenDayList.add(genDay);
+        });
+        CacheContext.projectEquipidMap.forEach((project,equipidList)->{
+            EquipPowerGenDay genDay = new EquipPowerGenDay();
+            genDay.setDate(time1);
+            genDay.setStation(CacheContext.equipMap.get(equipidList.get(0)).getWindpowerstationId());
+            genDay.setCategory("project");
+            genDay.setFacilityId(project);
+            List<EquipPowerGenDay> filterStream = epgdList.stream().filter(epgd -> equipidList.contains(epgd.getFacilityId())).collect(Collectors.toList());
+            extracted(genDay, filterStream);
+            equipPowerGenDayList.add(genDay);
+        });
+        CacheContext.stationEquipidMap.forEach((station,equipidList)->{
+            EquipPowerGenDay genDay = new EquipPowerGenDay();
+            genDay.setDate(time1);
+            genDay.setStation(station);
+            genDay.setCategory("station");
+            genDay.setFacilityId(station);
+            List<EquipPowerGenDay> filterStream = epgdList.stream().filter(epgd -> equipidList.contains(epgd.getFacilityId())).collect(Collectors.toList());
+            extracted(genDay, filterStream);
+            equipPowerGenDayList.add(genDay);
+        });
+        EquipPowerGenDay genDay = new EquipPowerGenDay();
+        genDay.setDate(time1);
+        genDay.setCategory("windpower");
+        genDay.setFacilityId("NX");
+        extracted(genDay, epgdList);
+        equipPowerGenDayList.add(genDay);
+
+        return equipPowerGenDayList;
+    }
+
+    private void extracted(EquipPowerGenDay genDay, List<EquipPowerGenDay> filterStream) {
+        genDay.setGeneratingCapacity(filterStream.stream().map(e->e.getGeneratingCapacity()!=null?e.getGeneratingCapacity():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setTheoryGeneration(filterStream.stream().map(e->e.getTheoryGeneration()!=null?e.getTheoryGeneration():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setLossPower(filterStream.stream().map(e->e.getLossPower()!=null?e.getLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+
+        genDay.setFaultLossPower(filterStream.stream().map(e->e.getFaultLossPower()!=null?e.getFaultLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setMaintainLossPower(filterStream.stream().map(e->e.getMaintainLossPower()!=null?e.getMaintainLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setImplicateLossPower(filterStream.stream().map(e->e.getImplicateLossPower()!=null?e.getImplicateLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setLimitLossPower(filterStream.stream().map(e->e.getLimitLossPower()!=null?e.getLimitLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setPerformanceLossPower(filterStream.stream().map(e->e.getPerformanceLossPower()!=null?e.getPerformanceLossPower():BigDecimal.valueOf(0)).reduce(BigDecimal.ZERO,BigDecimal::add));
+        genDay.setMeanWindSpeed(BigDecimal.valueOf(filterStream.stream().filter(e->e.getMeanWindSpeed()!=null&&e.getMeanWindSpeed().doubleValue()!=0).mapToDouble(e->e.getMeanWindSpeed().doubleValue()).average().getAsDouble()).setScale(2,RoundingMode.HALF_UP));
     }
 
     /**

+ 1 - 1
realtime/wind/build.gradle

@@ -33,7 +33,7 @@ dependencies {
     implementation("org.postgresql:postgresql:$postgresqlDriverVersion")
     implementation "com.baomidou:mybatis-plus-boot-starter:$mybatisPlusVersion"
     implementation("com.alibaba:druid:$alibabaDruidVersion")
-    implementation("com.alibaba:fastjson:$fastjsonVersion")
+    //implementation("com.alibaba:fastjson:$fastjsonVersion")
 
     implementation("$bootGroup:spring-boot-starter-test")
     implementation("com.xuxueli:xxl-job-core:$xxlJobVersion")

+ 6 - 1
realtime/wind/src/main/java/com/gyee/gaia/realtime/wind/adapter/IAdapterApi.java

@@ -1,6 +1,7 @@
 package com.gyee.gaia.realtime.wind.adapter;
 
 import com.gyee.gaia.common.data.point.PointData;
+import com.gyee.gaia.common.data.timeseries.DoubleStatData;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
@@ -23,5 +24,9 @@ public interface IAdapterApi {
     Map<String, PointData> getHistorySection(@PathVariable(value = "tagNames") String tagNames, @PathVariable(value = "ts") long ts);
 
     @GetMapping("/ts/latest?keys={keys}")
-    public Map<String, PointData> getLatest(@PathVariable(value = "keys") String keys);
+    Map<String, PointData> getLatest(@PathVariable(value = "keys") String keys);
+
+    @GetMapping("/ts/history/stat?tagName={tagName}&startTs={startTs}&endTs={endTs}")
+    List<DoubleStatData> getHistoryStat(@PathVariable(value = "tagName") String tagName, @PathVariable(value = "startTs") long startTs,
+                                        @PathVariable(value = "endTs") long endTs);
 }

+ 38 - 0
realtime/wind/src/main/java/com/gyee/gaia/realtime/wind/init/CacheContext.java

@@ -1,14 +1,17 @@
 package com.gyee.gaia.realtime.wind.init;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.gyee.gaia.common.data.point.TestingPoint;
 import com.gyee.gaia.common.data.power.ModelPowerDetails;
 import com.gyee.gaia.common.data.taos.RealtimeAverageTarget;
 import com.gyee.gaia.common.data.windturbine.Equipment;
 import com.gyee.gaia.common.data.windturbine.Powerstation;
 import com.gyee.gaia.dao.sql.Windturbine.IEquipmentService;
 import com.gyee.gaia.dao.sql.Windturbine.IPowerstationService;
+import com.gyee.gaia.dao.sql.point.ITestingPointService;
 import com.gyee.gaia.dao.sql.power.IModelPowerDetailsService;
 import com.gyee.gaia.dao.sql.taos.IRealtimeAverageTargetService;
+import com.gyee.gaia.realtime.wind.config.AppConfig;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.boot.ApplicationArguments;
 import org.springframework.boot.ApplicationRunner;
@@ -16,6 +19,8 @@ import org.springframework.core.annotation.Order;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
@@ -54,11 +59,20 @@ public class CacheContext implements ApplicationRunner {
      * 机型,风速,功率
      */
     public static Map<String, Map<Double, Double>> mpdsMapMap;
+    @Resource
+    private ITestingPointService testingPointService;
+    @Resource
+    private AppConfig appConfig;
 
     /**
      * 风机id,1分钟平均指标测点
      */
     public static Map<String, String> pjzb1fzMap;
+    /**
+     * 风机id,uniformcode,点名
+     */
+    public static Map<String, Map<String, String>> equipUcMap = new HashMap<>();
+    public static String pointCodes;
 
     @Override
     public void run(ApplicationArguments args) throws Exception {
@@ -84,5 +98,29 @@ public class CacheContext implements ApplicationRunner {
         ratWrapper.select("tbname", "equipment_id").eq("uniform_code", "1FZPJZB");
         List<RealtimeAverageTarget> ratList = realtimeAverageTargetService.list(ratWrapper);
         pjzb1fzMap = ratList.stream().collect(Collectors.toMap(RealtimeAverageTarget::getEquipmentId, RealtimeAverageTarget::getTbname));
+
+        log.info("加载测点!");
+        equipMap.keySet().forEach(em -> equipUcMap.put(em, new HashMap<>()));
+        Collection<String> uniformCodeList = appConfig.getUniformcodeOne().values();
+
+        //根据uniformcode获取测点
+        QueryWrapper<TestingPoint> tpWrapper = new QueryWrapper<>();
+        tpWrapper.eq("thing_type", "windturbine");
+        StringBuilder sb = new StringBuilder();
+
+        //5个指标
+        for (String value : uniformCodeList) {
+            //每个指标407个风机
+            List<TestingPoint> list = testingPointService.list(tpWrapper.clone().eq("uniform_code", value));
+
+            //每个指标每个风机
+            for (TestingPoint point : list) {
+                String thingId = point.getThingId();
+                sb.append(",").append(point.getCode());
+                equipUcMap.get(thingId).put(value, point.getCode());
+            }
+        }
+
+        pointCodes = sb.delete(0, 1).toString();
     }
 }

+ 24 - 103
realtime/wind/src/main/java/com/gyee/gaia/realtime/wind/job/CauseJobHandler.java

@@ -2,11 +2,8 @@ package com.gyee.gaia.realtime.wind.job;
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.NumberUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.gyee.gaia.common.data.point.PointData;
-import com.gyee.gaia.common.data.point.TestingPoint;
 import com.gyee.gaia.common.data.taos.RealtimeAverageTarget;
-import com.gyee.gaia.dao.sql.point.ITestingPointService;
 import com.gyee.gaia.dao.sql.taos.IRealtimeAverageTargetService;
 import com.gyee.gaia.realtime.wind.adapter.IAdapterApi;
 import com.gyee.gaia.realtime.wind.config.AppConfig;
@@ -19,122 +16,46 @@ import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
 import javax.annotation.Resource;
-import java.time.LocalDateTime;
-import java.util.*;
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.stream.Collectors;
 
 @Order(2)
 @Component
 public class CauseJobHandler implements ApplicationRunner {
 
     @Resource
-    private ITestingPointService testingPointService;
-    @Resource
     private AppConfig appConfig;
     @Resource
-    private IRealtimeAverageTargetService realtimeAverageTargetService;
-    @Resource
     private IAdapterApi adapterApi;
     @Resource
+    private IRealtimeAverageTargetService realtimeAverageTargetService;
+    @Resource
     private ThreadPoolTaskExecutor taskExecutor;
-    private String pointCodes;
+
     private Map<String, ArrayDeque<PointData>> pdaqMap = new ConcurrentHashMap<>();
-    /**
-     * 风机id,uniformcode,点名
-     */
-    private Map<String, Map<String, String>> equipUcMap = new HashMap<>();
 
     private boolean isload = false;
 
+    //@Resource
+    //private DataFillJobHandler dataFillJobHandler;
+
     @Override
     public void run(ApplicationArguments args) throws Exception {
 
-        CacheContext.equipMap.keySet().forEach(em -> equipUcMap.put(em, new HashMap<>()));
-
-        Collection<String> uniformCodeList = appConfig.getUniformcodeOne().values();
-
-        //根据uniformcode获取测点
-        QueryWrapper<TestingPoint> tpWrapper = new QueryWrapper<>();
-        tpWrapper.eq("thing_type", "windturbine");
-        StringBuilder sb = new StringBuilder();
-
-        //获取最新更新时间
-        /*QueryWrapper<RealtimeAverageTarget> ratWrapper = new QueryWrapper<>();
-        ratWrapper.select("max(time)");
-        Map<String, Object> map = realtimeAverageTargetService.getMap(ratWrapper);
-        Date max;
-        if (map != null && map.size() > 0) {
-            max = (Date) map.get("max");
-        } else {
-            max = DateUtil.beginOfDay(DateUtil.date());
-        }*/
-
-        //风机号,时间,RealtimeAverageTarget
-        Map<String, Map<Long, RealtimeAverageTarget>> ratssmm = new HashMap<>();
-        List<RealtimeAverageTarget> rats = new ArrayList<>();
-        //5个指标
-        for (String value : uniformCodeList) {
-            //每个指标407个风机
-            List<TestingPoint> list = testingPointService.list(tpWrapper.clone().eq("uniform_code", value));
-
-            List<PointData> rawByKey;
-            RealtimeAverageTarget target = null;
-            //每个指标每个风机
-            for (TestingPoint point : list) {
-                String thingId = point.getThingId();
-                sb.append(",").append(point.getCode());
-                equipUcMap.get(thingId).put(value, point.getCode());
-                /*rawByKey = adapterApi.getRawByKey(point.getCode(), max.getTime(), System.currentTimeMillis());
-                Map<Long, Double> collect = rawByKey.stream().collect(Collectors.groupingBy(data -> data.getTs() / 60000, Collectors.averagingDouble(PointData::getDoubleValue)));
-                //TODO 补缺的时间
-                for (Map.Entry<Long, Double> entry : collect.entrySet()) {
-                    if(target==null){
-                        target = new RealtimeAverageTarget();
-                        target.setTime(new Timestamp(entry.getKey()*60000));
-                        target.setEquipmentId(thingId);
-                        setRats(target, value,entry.getValue());
-                        rats.add(target);
-
-                        if(!ratssmm.containsKey(thingId)) ratssmm.put(thingId, new HashMap<>());
-                        ratssmm.get(thingId).put(entry.getKey(), target);
-                    }else {
-                        RealtimeAverageTarget averageTarget = ratssmm.get(thingId).get(entry.getKey());
-                        if(averageTarget!=null) setRats(averageTarget, value, entry.getValue());
-                    }
-                }*/
-            }
-        }
-        //realtimeAverageTargetService.saveBatch(rats, 3000);
-
-        pointCodes = sb.delete(0, 1).toString();
+        //dataFillJobHandler.calcEquipPowerGenDay();
         init();
         taskExecutor.submit(this::refreshQueue);
         isload = true;
-        //taskExecutor.submit(this::calcRealtimeAverageTarget);
-    }
-
-    private void setRats(RealtimeAverageTarget target, String uc, double value) {
-        if (uc.equals(appConfig.getUniformcodeOne().get("wind-speed"))) {
-            target.setWindSpeed((float) value);
-        } else if (uc.equals(appConfig.getUniformcodeOne().get("active-power"))) {
-            target.setPower((float) value);
-        } else if (uc.equals(appConfig.getUniformcodeOne().get("generator_speed"))) {
-            target.setGeneratorSpeed((float) value);
-        } else if (uc.equals(appConfig.getUniformcodeOne().get("impeller_speed"))) {
-            target.setImpellerSpeed((float) value);
-        } else if (uc.equals(appConfig.getUniformcodeOne().get("wind_direction"))) {
-            target.setWindDirection((float) value);
-        }
     }
 
     private void init() throws InterruptedException {
 
         //缓存1分钟的值填满pdaqMap
         for (int i = 0; i < 60; i++) {
-            Map<String, PointData> latest = adapterApi.getLatest(pointCodes);
+            Map<String, PointData> latest = adapterApi.getLatest(CacheContext.pointCodes);
             if (i == 0) {
                 latest.forEach((k, v) -> {
                     ArrayDeque<PointData> pdaq = new ArrayDeque<>(60);
@@ -154,7 +75,7 @@ public class CauseJobHandler implements ApplicationRunner {
 
         try {
             while (true) {
-                Map<String, PointData> latest = adapterApi.getLatest(pointCodes);
+                Map<String, PointData> latest = adapterApi.getLatest(CacheContext.pointCodes);
                 latest.forEach((k, v) -> {
                     pdaqMap.get(k).poll();
                     pdaqMap.get(k).offer(v);
@@ -169,7 +90,7 @@ public class CauseJobHandler implements ApplicationRunner {
     @Scheduled(fixedRate = 60000)
     private void calcRealtimeAverageTarget() {
 
-        if(!isload) return;
+        if (!isload) return;
         try {
             String pointCode = null;
             RealtimeAverageTarget target;
@@ -177,11 +98,11 @@ public class CauseJobHandler implements ApplicationRunner {
             //uniformcode,点名
             Map<String, String> entryValue;
             Map<String, String> uniformcodeOne = appConfig.getUniformcodeOne();
-            float speed;
+            double speed;
             Double power;
 
             List<RealtimeAverageTarget> targets = new ArrayList<>();
-            for (Map.Entry<String, Map<String, String>> entry : equipUcMap.entrySet()) {
+            for (Map.Entry<String, Map<String, String>> entry : CacheContext.equipUcMap.entrySet()) {
 
                 entryValue = entry.getValue();
 
@@ -193,18 +114,18 @@ public class CauseJobHandler implements ApplicationRunner {
                 pointCode = entryValue.get(uniformcodeOne.get("wind-speed"));
                 if (pointCode != null) {
                     v = pdaqMap.get(pointCode).stream().mapToDouble(data -> data.getDoubleValue()).average().orElse(0);
-                    speed = NumberUtil.round(v, 2).floatValue();
-                    target.setWindSpeed(speed);
-                    if(speed<3) {
+                    speed = NumberUtil.round(v, 2).doubleValue();
+                    target.setWindSpeed((float) speed);
+                    if (speed < 3) {
                         power = Double.valueOf(0);
-                    }else {
+                    } else {
                         power = CacheContext.mpdsMapMap.get(CacheContext.equipModelMap.get(entry.getKey())).get(speed);
                     }
-                    if(power==null){
+                    if (power == null) {
                         power = Double.valueOf(0);
-                        System.out.println(entry.getKey()+speed);
+                        System.out.println(entry.getKey() + speed);
                     }
-                    target.setTheoryGeneration(NumberUtil.round(power/60, 3).floatValue());
+                    target.setTheoryGeneration(NumberUtil.round(power / 60, 3).floatValue());
                 }
                 pointCode = entryValue.get(uniformcodeOne.get("active-power"));
                 if (pointCode != null) {
@@ -228,7 +149,7 @@ public class CauseJobHandler implements ApplicationRunner {
                 }
                 targets.add(target);
             }
-            //realtimeAverageTargetService.saveBatch(targets);
+            realtimeAverageTargetService.saveBatch(targets);
         } catch (Exception e) {
             e.printStackTrace();
         }

+ 143 - 0
realtime/wind/src/main/java/com/gyee/gaia/realtime/wind/job/DataFillJobHandler.java

@@ -0,0 +1,143 @@
+package com.gyee.gaia.realtime.wind.job;
+
+import cn.hutool.core.date.DateField;
+import cn.hutool.core.date.DateTime;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.gyee.gaia.common.data.point.PointData;
+import com.gyee.gaia.common.data.taos.RealtimeAverageTarget;
+import com.gyee.gaia.dao.sql.taos.IRealtimeAverageTargetService;
+import com.gyee.gaia.realtime.wind.adapter.IAdapterApi;
+import com.gyee.gaia.realtime.wind.config.AppConfig;
+import com.gyee.gaia.realtime.wind.init.CacheContext;
+import com.xxl.job.core.context.XxlJobHelper;
+import com.xxl.job.core.handler.annotation.XxlJob;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.sql.Timestamp;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@Component
+public class DataFillJobHandler {
+
+    @Resource
+    private IRealtimeAverageTargetService realtimeAverageTargetService;
+    @Resource
+    private IAdapterApi adapterApi;
+    @Resource
+    private AppConfig appConfig;
+
+    /**
+     * 风机id,uniformcode,平均数据
+     */
+    private Map<String, Map<String, List<PointData>>> dsdlssMap;
+
+    @XxlJob("DataFilling")
+    public void calcEquipPowerGenDay() {
+        String command = XxlJobHelper.getJobParam();
+        Map<String, String> map = new HashMap<>();
+        if (StrUtil.isNotBlank(command)) {
+            map = JSON.parseObject(command, Map.class);
+        }
+        String start = map.get("start");
+        String end = map.get("end");
+        Date startDate;
+        Date endDate;
+        if (start == null || end == null) {
+            startDate = DateUtil.beginOfDay(DateUtil.yesterday());
+            endDate = DateUtil.endOfDay(DateUtil.yesterday());
+        } else {
+            startDate = DateUtil.parse(start);
+            endDate = DateUtil.parse(end);
+        }
+
+        //getDatas(startDate.getTime(), endDate.getTime());
+
+        List<RealtimeAverageTarget> realtimeAverageTargetList = new ArrayList<>();
+        QueryWrapper<RealtimeAverageTarget> ratWrapper = new QueryWrapper<>();
+        ratWrapper.select("time", "station_id", "equipment_id").eq("uniform_code", "1FZPJZB")
+                .between("time", startDate.getTime(), endDate.getTime());
+        List<RealtimeAverageTarget> ratList = realtimeAverageTargetService.list(ratWrapper);
+        //按风机分组
+        Map<String, List<RealtimeAverageTarget>> ratslMap = ratList.stream().collect(Collectors.groupingBy(RealtimeAverageTarget::getEquipmentId));
+        for (List<RealtimeAverageTarget> value : ratslMap.values()) {
+            String equipmentId = value.get(0).getEquipmentId();
+            Map<String, List<PointData>> lpdsMap = new HashMap<>();
+            CacheContext.equipUcMap.get(equipmentId).forEach((uc, point) -> {
+                List<PointData> rawByKey = adapterApi.getRawByKey(point, startDate.getTime(), endDate.getTime());
+                lpdsMap.put(uc, rawByKey);
+            });
+            int i = 0;
+            for (DateTime minute = DateUtil.beginOfMinute(startDate); minute.isBefore(endDate); minute.offset(DateField.MINUTE, 1)) {
+                if (i>=value.size() || (minute.getTime() != value.get(i).getTime().getTime())) {
+                    RealtimeAverageTarget rat = new RealtimeAverageTarget();
+                    rat.setTime(new Timestamp(minute.getTime()));
+                    setRats(rat, equipmentId, minute.getTime(), minute.getTime() + 59999L,lpdsMap);
+                    realtimeAverageTargetList.add(rat);
+                } else {
+                    i++;
+                }
+            }
+        }
+        realtimeAverageTargetService.saveBatch(realtimeAverageTargetList);
+    }
+
+    private void getDatas(long time1, long time2) {
+        dsdlssMap = new HashMap<>();
+        CacheContext.equipUcMap.forEach((equipId, ucode) -> {
+            Map<String, List<PointData>> map = new HashMap<>();
+            ucode.forEach((uc, point) -> {
+                List<PointData> rawByKey = adapterApi.getRawByKey(point, time1, time2);
+                map.put(uc, rawByKey);
+            });
+            dsdlssMap.put(equipId, map);
+        });
+    }
+
+    private void setRats(RealtimeAverageTarget rat, String equipId, long time1, long time2, Map<String, List<PointData>> lpdsMap) {
+
+        List<PointData> wind_speeds = lpdsMap.get(appConfig.getUniformcodeOne().get("wind-speed"));
+        List<PointData> active_powers = lpdsMap.get(appConfig.getUniformcodeOne().get("active-power"));
+        List<PointData> generator_speeds = lpdsMap.get(appConfig.getUniformcodeOne().get("generator_speed"));
+        List<PointData> impeller_speeds = lpdsMap.get(appConfig.getUniformcodeOne().get("impeller_speed"));
+        List<PointData> wind_directions = lpdsMap.get(appConfig.getUniformcodeOne().get("wind_direction"));
+
+        double wsdv = 0;
+        double apdv = 0;
+        double gsdv = 0;
+        double isdv = 0;
+        double wddv = 0;
+
+        if (!wind_speeds.isEmpty())
+            wsdv = wind_speeds.stream().filter(pd -> pd.getTs() >= time1 && pd.getTs() <= time2).mapToDouble(PointData::getDoubleValue).average().orElse(0);
+        if (!active_powers.isEmpty())
+            apdv = active_powers.stream().filter(pd -> pd.getTs() >= time1 && pd.getTs() <= time2).mapToDouble(PointData::getDoubleValue).average().orElse(0);
+        if (!generator_speeds.isEmpty())
+            gsdv = generator_speeds.stream().filter(pd -> pd.getTs() >= time1 && pd.getTs() <= time2).mapToDouble(PointData::getDoubleValue).average().orElse(0);
+        if (!impeller_speeds.isEmpty())
+            isdv = impeller_speeds.stream().filter(pd -> pd.getTs() >= time1 && pd.getTs() <= time2).mapToDouble(PointData::getDoubleValue).average().orElse(0);
+        if (!wind_directions.isEmpty())
+            wddv = wind_directions.stream().filter(pd -> pd.getTs() >= time1 && pd.getTs() <= time2).mapToDouble(PointData::getDoubleValue).average().orElse(0);
+
+        double speed = NumberUtil.round(wsdv, 2).doubleValue();
+
+        rat.setWindSpeed((float) speed);
+        rat.setPower(NumberUtil.round(apdv, 2).floatValue());
+        rat.setGeneratorSpeed(NumberUtil.round(gsdv, 2).floatValue());
+        rat.setImpellerSpeed(NumberUtil.round(isdv, 2).floatValue());
+        rat.setWindDirection(NumberUtil.round(wddv, 2).floatValue());
+        if (speed < 3) {
+            rat.setTheoryGeneration(0f);
+        } else {
+            rat.setTheoryGeneration(NumberUtil.round(CacheContext.mpdsMapMap.get(CacheContext.equipModelMap.get(equipId)).get(speed) / 60, 3).floatValue());
+        }
+    }
+}
+
+
+

+ 1 - 1
realtime/wind/src/main/resources/bootstrap.yaml

@@ -96,7 +96,7 @@ mybatis-plus:
     #配置JdbcTypeForNull, oracle数据库必须配置
     jdbc-type-for-null: 'null'
     callSettersOnNulls: true
-    #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
 
 xxl:
   job: