فهرست منبع

解析记录增加查询条件,预测发电量初次提交

fanxiaoyu 8 ماه پیش
والد
کامیت
34ee26110d
16فایلهای تغییر یافته به همراه785 افزوده شده و 18 حذف شده
  1. 2 3
      cpp-admin/src/main/java/com/cpp/web/controller/configManager/ParsingLogController.java
  2. 59 0
      cpp-admin/src/main/java/com/cpp/web/controller/dayPowerGeneration/DayPowerGenerationController.java
  3. 60 0
      cpp-admin/src/main/java/com/cpp/web/domain/powerGeneration/DayPowerGeneration.java
  4. 14 0
      cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerShortTermCloudMapper.java
  5. 16 0
      cpp-admin/src/main/java/com/cpp/web/mapper/powerGeneration/DayPowerGenerationMapper.java
  6. 16 0
      cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerShortTermStationMapper.java
  7. 2 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerShortTermCloudService.java
  8. 12 0
      cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerShortTermCloudServiceImpl.java
  9. 1 1
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingLogService.java
  10. 17 1
      cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingLogServiceImpl.java
  11. 23 0
      cpp-admin/src/main/java/com/cpp/web/service/powerGeneation/DayPowerGenerationService.java
  12. 213 0
      cpp-admin/src/main/java/com/cpp/web/service/powerGeneation/impl/DayPowerGenerationServiceImpl.java
  13. 4 0
      cpp-admin/src/main/java/com/cpp/web/service/station/ForecastPowerShortTermStationService.java
  14. 13 0
      cpp-admin/src/main/java/com/cpp/web/service/station/impl/ForecastPowerShortTermStationServiceImpl.java
  15. 69 13
      cpp-ui/src/views/statistics/analyzeRecords/index.vue
  16. 264 0
      cpp-ui/src/views/statistics/predictedPowerGeneration/index.vue

+ 2 - 3
cpp-admin/src/main/java/com/cpp/web/controller/configManager/ParsingLogController.java

@@ -39,12 +39,11 @@ public class ParsingLogController {
         return R.ok(parsingLogService.page(page, parsingLogService.getByStationCodeAndCreateTimeAndFileStatusAndFileType(stationCode, new Date(time), new Date(time + 60 * 60 * 24 * 1000 - 1000), fileStatus, fileType)));
     }
 
-
     @ApiOperation(value = "根据场站编号分页查询", notes = "分页查询")
     @GetMapping("/getByStationCodeAndCreateTimeAndFileType")
-    public R getByStationCodeAndCreateTimeAndFileType(Long currentPage, Long pageSize, String stationCode, Long startTime,Long endTime, String fileType) {
+    public R getByStationCodeAndCreateTimeAndFileType(Long currentPage, Long pageSize, String stationCode, Long startTime,Long endTime, String fileType,String dataSources,String parsingDescribe,String parsingFileStatus) {
         Page page = new Page(currentPage, pageSize);
         page.setMaxLimit((long) -1);
-        return R.ok(parsingLogService.page(page, parsingLogService.getByStationCodeAndCreateTimeAndFileType(stationCode, new Date(startTime), new Date(endTime), fileType)));
+        return R.ok(parsingLogService.page(page, parsingLogService.getByStationCodeAndCreateTimeAndFileType(stationCode, new Date(startTime), new Date(endTime), fileType,dataSources,parsingDescribe,parsingFileStatus)));
     }
 }

+ 59 - 0
cpp-admin/src/main/java/com/cpp/web/controller/dayPowerGeneration/DayPowerGenerationController.java

@@ -0,0 +1,59 @@
+package com.cpp.web.controller.dayPowerGeneration;
+
+import com.cpp.common.core.domain.R;
+import com.cpp.web.domain.powerGeneration.DayPowerGeneration;
+import com.cpp.web.service.powerGeneation.DayPowerGenerationService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/dayPowerGeneration")
+@Api(value = "dayPowerGeneration", tags = "cpp_day_power_generation管理")
+public class DayPowerGenerationController {
+
+    private final DayPowerGenerationService dayPowerGenerationService;
+
+    @ApiOperation(value = "根据场站编号查询预测发电量", notes = "根据场站编号查询预测发电量")
+    @GetMapping(value = "/getList")
+    public R getList(String stationCode,Long genDate,String predictionDataSource) {
+        String useDate = new SimpleDateFormat("yyyy-MM-dd").format(new Date(genDate));
+        List<DayPowerGeneration> dayPowerGenerationList = dayPowerGenerationService.findByStationCodeAndGenDateAndPredictionDataSource(stationCode,useDate,predictionDataSource);
+        List<DayPowerGeneration> ydList = dayPowerGenerationList.stream().filter(f -> f.getPredictionDataSource().equals("云端下发")).collect(Collectors.toList());
+        List<DayPowerGeneration> zdList = dayPowerGenerationList.stream().filter(f -> f.getPredictionDataSource().equals("站端上传")).collect(Collectors.toList());
+        List<PowerGenerationDto> generationDtoList = new ArrayList<>();
+        for (DayPowerGeneration dayPowerGeneration : ydList){
+            PowerGenerationDto powerGenerationDto = new PowerGenerationDto();
+            powerGenerationDto.setTime(dayPowerGeneration.getTime());
+            powerGenerationDto.setStationCode(dayPowerGeneration.getStationCode());
+            powerGenerationDto.setForecastPowerGenerationYd(dayPowerGeneration.getForecastPowerGeneration());
+            for (int i = 0; i < zdList.size(); i++) {
+                if (dayPowerGeneration.getTime().equals(zdList.get(i).getTime())){
+                    powerGenerationDto.setForecastPowerGenerationZd(zdList.get(i).getForecastPowerGeneration());
+                }
+            }
+            generationDtoList.add(powerGenerationDto);
+        }
+        return R.ok(generationDtoList);
+    }
+    @Data
+    public class PowerGenerationDto {
+
+        private String time;
+
+        private String stationCode;
+
+        private BigDecimal forecastPowerGenerationZd;
+
+        private BigDecimal forecastPowerGenerationYd;
+
+    }
+}

+ 60 - 0
cpp-admin/src/main/java/com/cpp/web/domain/powerGeneration/DayPowerGeneration.java

@@ -0,0 +1,60 @@
+package com.cpp.web.domain.powerGeneration;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.cpp.web.domain.BaseCppEntity;
+import com.cpp.web.domain.enums.DataSourcesEnum;
+import com.cpp.web.domain.enums.ForecastTypeEnum;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 日发电量
+ *
+ * @author fxy
+ * @version 1.0
+ * @since 2024/10/14 10:56
+ */
+@Data
+@TableName("cpp_day_power_generation")
+@EqualsAndHashCode(callSuper = true)
+@ApiModel(value = "cpp_day_power_generation")
+public class DayPowerGeneration extends BaseCppEntity {
+
+    /**
+     * 时间
+     */
+    @ApiModelProperty(value = "预测日期")
+    private String time;
+
+    /**
+     *  预测发电量
+     */
+    @ApiModelProperty(value = "预测发电量")
+    private BigDecimal forecastPowerGeneration;
+
+    /**
+     *  生成时间
+     */
+    @ApiModelProperty(value = "生成时间")
+    private String genDate;
+
+    /**
+     * 提前多久预测
+     */
+    @ApiModelProperty(value = "提前多久预测")
+    private Integer forecastHowLongAgo;
+
+    /**
+     * 预测数据源
+     */
+    @ApiModelProperty(value = "预测数据源")
+    private String predictionDataSource;
+
+
+}

+ 14 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/cloud/ForecastPowerShortTermCloudMapper.java

@@ -3,6 +3,11 @@ package com.cpp.web.mapper.cloud;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * idp_forecast_power_short_term
@@ -12,4 +17,13 @@ import org.apache.ibatis.annotations.Mapper;
  */
 @Mapper
 public interface ForecastPowerShortTermCloudMapper extends BaseMapper<ForecastPowerShortTermCloud> {
+    @Select("SELECT * FROM (  \n" +
+            "    SELECT *,  \n" +
+            "           ROW_NUMBER() OVER (PARTITION BY time ORDER BY forecast_how_long_ago ASC) as rn  \n" +
+            "    FROM cpp_forecast_power_short_term_cloud  \n" +
+            "    WHERE station_code = #{stationCode}  \n" +
+            "      AND time BETWEEN #{startTime} AND #{endTime}  \n" +
+            ") subquery  \n" +
+            "WHERE rn = 1;")
+    List<ForecastPowerShortTermCloud> findByTimeBetweenAndStationCode(@Param("stationCode") String stationCode,@Param("startTime") Date startTime,@Param("endTime") Date endTime);
 }

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/powerGeneration/DayPowerGenerationMapper.java

@@ -0,0 +1,16 @@
+package com.cpp.web.mapper.powerGeneration;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.powerGeneration.DayPowerGeneration;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * cpp_day_power_generation
+ *
+ * @author fxy
+ * @date 2024-10-14 9:47:33
+ */
+@Mapper
+public interface DayPowerGenerationMapper extends BaseMapper<DayPowerGeneration> {
+
+}

+ 16 - 0
cpp-admin/src/main/java/com/cpp/web/mapper/station/ForecastPowerShortTermStationMapper.java

@@ -1,7 +1,13 @@
 package com.cpp.web.mapper.station;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import com.cpp.web.domain.station.ForecastPowerShortTermStation;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.Date;
+import java.util.List;
 
 /**
  * cpp_forecast_power_short_term_his
@@ -12,4 +18,14 @@ import org.apache.ibatis.annotations.Mapper;
 @Mapper
 public interface ForecastPowerShortTermStationMapper extends BaseMapper<ForecastPowerShortTermStation> {
 
+    @Select("SELECT * FROM (  \n" +
+            "    SELECT *,  \n" +
+            "           ROW_NUMBER() OVER (PARTITION BY time ORDER BY forecast_how_long_ago ASC) as rn  \n" +
+            "    FROM cpp_forecast_power_short_term_station  \n" +
+            "    WHERE station_code = #{stationCode}  \n" +
+            "      AND time BETWEEN #{startTime} AND #{endTime}  \n" +
+            ") subquery  \n" +
+            "WHERE rn = 1;")
+    List<ForecastPowerShortTermStation> findByTimeBetweenAndStationCode(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("stationCode") String stationCode);
+
 }

+ 2 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/ForecastPowerShortTermCloudService.java

@@ -29,4 +29,6 @@ public interface ForecastPowerShortTermCloudService extends IService<ForecastPow
     List<ForecastPowerShortTermCloud> findByForecastTimeBetweenAndHowLongAgo(Date startTime, Date endTime, Integer howLongAgo);
 
     List<ForecastPowerShortTermCloud> findByForecastTimeBetweenAndHowLongAgoAndStationCode(Date startTime, Date endTime, Integer howLongAgo, String stationCode);
+
+    List<ForecastPowerShortTermCloud> findByForecastTimeBetweenAndStationCode(Date startTime,Date endTime,String stationCode);
 }

+ 12 - 0
cpp-admin/src/main/java/com/cpp/web/service/cloud/impl/ForecastPowerShortTermCloudServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import com.cpp.web.mapper.cloud.ForecastPowerShortTermCloudMapper;
 import com.cpp.web.service.cloud.ForecastPowerShortTermCloudService;
+import org.springframework.security.core.parameters.P;
 import org.springframework.stereotype.Service;
 
 import java.util.Date;
@@ -19,6 +20,11 @@ import java.util.List;
 @Service
 public class ForecastPowerShortTermCloudServiceImpl extends ServiceImpl<ForecastPowerShortTermCloudMapper, ForecastPowerShortTermCloud> implements ForecastPowerShortTermCloudService {
 
+    private final ForecastPowerShortTermCloudMapper forecastPowerShortTermCloudMapper;
+
+    public ForecastPowerShortTermCloudServiceImpl(ForecastPowerShortTermCloudMapper forecastPowerShortTermCloudMapper) {
+        this.forecastPowerShortTermCloudMapper = forecastPowerShortTermCloudMapper;
+    }
 
     @Override
     public List<ForecastPowerShortTermCloud> findByStationCodeAndStartTimeAndEndTime(String stationCode, Date startTime, Date endTime) {
@@ -73,4 +79,10 @@ public class ForecastPowerShortTermCloudServiceImpl extends ServiceImpl<Forecast
         return list(wrapper);
     }
 
+    @Override
+    public List<ForecastPowerShortTermCloud> findByForecastTimeBetweenAndStationCode(Date startTime, Date endTime, String stationCode) {
+        return forecastPowerShortTermCloudMapper.findByTimeBetweenAndStationCode(stationCode,startTime,endTime);
+
+    }
+
 }

+ 1 - 1
cpp-admin/src/main/java/com/cpp/web/service/datafactory/ParsingLogService.java

@@ -18,7 +18,7 @@ public interface ParsingLogService extends IService<ParsingLog> {
 
     QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileStatusAndFileType(String stationCode, Date startTime, Date endTime, String fileStatus, String fileType);
 
-    QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileType(String stationCode, Date startTime, Date endTime,String fileType);
+    QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileType(String stationCode, Date startTime, Date endTime,String fileType,String dataSources,String parsingDescribe,String parsingFileStatus);
 
     List<ParsingLog> findByTimeBetweenAndFileTypeAndStationCode(Date startTime,Date endTime,String fileType,String stationCode);
 }

+ 17 - 1
cpp-admin/src/main/java/com/cpp/web/service/datafactory/impl/ParsingLogServiceImpl.java

@@ -3,6 +3,7 @@ package com.cpp.web.service.datafactory.impl;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.cpp.web.domain.datafactory.ParsingLog;
+import com.cpp.web.domain.enums.DataSourcesEnum;
 import com.cpp.web.mapper.datafactory.ParsingLogMapper;
 import com.cpp.web.service.datafactory.ParsingLogService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -45,7 +46,7 @@ public class ParsingLogServiceImpl extends ServiceImpl<ParsingLogMapper, Parsing
     }
 
     @Override
-    public QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileType(String stationCode, Date startTime, Date endTime, String fileType) {
+    public QueryWrapper<ParsingLog> getByStationCodeAndCreateTimeAndFileType(String stationCode, Date startTime, Date endTime, String fileType,String dataSources,String parsingDescribe,String parsingFileStatus) {
         QueryWrapper<ParsingLog> wrapper = new QueryWrapper<>();
         if (stationCode != null && !"".equals(stationCode)){
             wrapper.eq("station_code", stationCode);
@@ -56,6 +57,21 @@ public class ParsingLogServiceImpl extends ServiceImpl<ParsingLogMapper, Parsing
         if (null != fileType && !"".equals(fileType)){
             wrapper.eq("file_type", fileType);
         }
+        if (null != dataSources && !"".equals(dataSources)){
+            wrapper.eq("data_sources", DataSourcesEnum.valueOf(dataSources));
+        }
+        if ("null".equals(parsingDescribe)){
+            wrapper.eq("parsing_describe","");
+        }
+        if ("notNull".equals(parsingDescribe)){
+            wrapper.isNotNull("parsing_describe");
+        }
+        if (null != parsingFileStatus && !"".equals(parsingFileStatus) && "成功".equals(parsingFileStatus)){
+            wrapper.eq("parsing_file_status",parsingFileStatus);
+        }
+        if (null != parsingFileStatus && !"".equals(parsingFileStatus) && "失败".equals(parsingFileStatus)){
+            wrapper.eq("parsing_file_status",parsingFileStatus);
+        }
         return wrapper;
     }
 

+ 23 - 0
cpp-admin/src/main/java/com/cpp/web/service/powerGeneation/DayPowerGenerationService.java

@@ -0,0 +1,23 @@
+package com.cpp.web.service.powerGeneation;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.powerGeneration.DayPowerGeneration;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * cpp_day_power_generation
+ *
+ * @author tl
+ * @date 2024-10-14 15:28:33
+ */
+public interface DayPowerGenerationService extends IService<DayPowerGeneration> {
+
+    DayPowerGeneration findByStationCodeAndGenDate(String stationCode, Date genDate);
+
+    void generatePower(String stationCode);
+
+    List<DayPowerGeneration> findByStationCodeAndGenDateAndPredictionDataSource(String StationCode,String genDate,String predictionDataSource);
+}

+ 213 - 0
cpp-admin/src/main/java/com/cpp/web/service/powerGeneation/impl/DayPowerGenerationServiceImpl.java

@@ -0,0 +1,213 @@
+package com.cpp.web.service.powerGeneation.impl;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.common.utils.DateUtils;
+import com.cpp.web.domain.BaseCppEntity;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
+import com.cpp.web.domain.powerGeneration.DayPowerGeneration;
+import com.cpp.web.domain.station.ForecastPowerShortTermStation;
+import com.cpp.web.mapper.powerGeneration.DayPowerGenerationMapper;
+import com.cpp.web.service.cloud.ForecastPowerShortTermCloudService;
+import com.cpp.web.service.powerGeneation.DayPowerGenerationService;
+import com.cpp.web.service.station.ForecastPowerShortTermStationService;
+import com.cpp.web.utils.DateTimeUtil;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Propagation;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * cpp_day_power_generation
+ *
+ * @author fxy
+ * @date 2024-10-14 9:47:33
+ */
+@Service
+@RequiredArgsConstructor
+public class DayPowerGenerationServiceImpl extends ServiceImpl<DayPowerGenerationMapper, DayPowerGeneration> implements DayPowerGenerationService {
+
+    private final DayPowerGenerationMapper dayPowerGenerationMapper;
+
+    private final ForecastPowerShortTermCloudService forecastPowerShortTermCloudService;
+
+    private final ForecastPowerShortTermStationService forecastPowerShortTermStationService;
+
+    private final String dateFormat = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+
+    @Override
+    public DayPowerGeneration findByStationCodeAndGenDate(String stationCode, Date genDate) {
+        QueryWrapper<DayPowerGeneration> wrapper = new QueryWrapper<>();
+        if (null != stationCode && !"".equals(stationCode)) {
+            wrapper.eq("station_code", stationCode);
+        }
+        if (null != genDate) {
+            wrapper.eq("gen_date", genDate);
+        }
+        return dayPowerGenerationMapper.selectOne(wrapper);
+    }
+
+    /**
+     *  发电量业务
+     * @param stationCode
+     */
+    @Override
+    public void generatePower(String stationCode) {
+
+        Date startTime = DateTimeUtil.getDayStartTime(System.currentTimeMillis() + 24 * 60 * 60 * 1000L);
+
+        Date endTime = DateTimeUtil.getDayLastTime(startTime.getTime() + 10 * 24 * 60 * 60 * 1000L - 1);
+
+        List<DayPowerGeneration> dayPowerGenerationList = findByGenDate(dateFormat,stationCode);
+
+        if (dayPowerGenerationList.size() > 0){
+            return;
+        }
+        // 云端预测
+        List<ForecastPowerShortTermCloud> forecastPowerShortTermCloudList = forecastPowerShortTermCloudService.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
+        // 站端预测
+        List<ForecastPowerShortTermStation> forecastPowerShortTermStationList = forecastPowerShortTermStationService.findByForecastTimeBetweenAndStationCode(startTime, endTime, stationCode);
+
+        List<DayPowerGeneration> ydList = calculator(forecastPowerShortTermCloudList, "yd", startTime, stationCode);
+        List<DayPowerGeneration> zdList = calculator(forecastPowerShortTermStationList, "zd", startTime, stationCode);
+
+        this.saveBatch(ydList);
+        this.saveBatch(zdList);
+    }
+
+    @Override
+    public List<DayPowerGeneration> findByStationCodeAndGenDateAndPredictionDataSource(String stationCode, String genDate, String predictionDataSource) {
+        QueryWrapper<DayPowerGeneration> wrapper = new QueryWrapper<>();
+        if (null != stationCode && !"".equals(stationCode)){
+            wrapper.eq("station_code",stationCode);
+        }
+        if (null != genDate && !"".equals(genDate)){
+            wrapper.eq("gen_date",genDate);
+        }
+        if (null != predictionDataSource && !"".equals(predictionDataSource)){
+            wrapper.eq("prediction_data_source",predictionDataSource);
+        }
+        return list(wrapper);
+    }
+
+
+    /**
+     * 计算发电量
+     *
+     * @param list
+     * @param type
+     * @param startTime
+     * @param stationCode
+     * @return
+     */
+
+    public List<DayPowerGeneration> calculator(List<? extends BaseCppEntity> list, String type, Date startTime, String stationCode) {
+        List<DayPowerGeneration> resultList = new ArrayList<>();
+        BigDecimal radio = new BigDecimal(0.025);
+        BigDecimal sumValue;
+        String[] datas;
+        Date date;
+        String dateStr;
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+        for (int i = 1; i <= 10; i++) {
+            DayPowerGeneration dayPowerGeneration = new DayPowerGeneration();
+            sumValue = BigDecimal.ZERO;
+            date = DateUtils.addDays(startTime, i - 1);
+            dateStr = simpleDateFormat.format(date);
+            datas = findSendData(startTime.getTime() + 1000L * 60 * 60 * 24 * (i - 1), startTime.getTime() + 1000L * 60 * 60 * 24 * i - 1000L * 60 * 15, list);
+            if (datas.length > 0) {
+                BigDecimal value;
+                for (int j = 0; j < datas.length; j++) {
+                    String s = datas[j];
+                    if (StrUtil.isNotEmpty(s)) {
+                        value = new BigDecimal(s).multiply(radio).setScale(2, RoundingMode.HALF_UP);
+                        sumValue = sumValue.add(value);
+                    }
+                }
+            }
+            dayPowerGeneration.setGenDate(simpleDateFormat.format(new Date()));
+            dayPowerGeneration.setForecastPowerGeneration(sumValue);
+            dayPowerGeneration.setForecastHowLongAgo(i);
+            dayPowerGeneration.setTime(dateStr);
+            dayPowerGeneration.setStationCode(stationCode);
+            if (type.equals("yd")) {
+                dayPowerGeneration.setPredictionDataSource("云端下发");
+            } else {
+                dayPowerGeneration.setPredictionDataSource("站端上传");
+            }
+            resultList.add(dayPowerGeneration);
+        }
+        return resultList;
+    }
+
+    /**
+     * 查询回传数据
+     *
+     * @param stTime 开始时间
+     * @param eTime  结束时间
+     * @return
+     */
+    @Transactional(propagation = Propagation.REQUIRED)
+    public String[] findSendData(Long stTime, Long eTime, List<? extends BaseCppEntity> list) {
+        String[] datas = new String[0];
+        List<ForecastPowerShortTermCloud> forecastPowerShortTermCloudList = new ArrayList<>();
+        List<ForecastPowerShortTermStation> forecastPowerShortTermStationList = new ArrayList<>();
+        for (BaseCppEntity entity : list) {
+            if (entity instanceof ForecastPowerShortTermCloud) {
+                forecastPowerShortTermCloudList.add((ForecastPowerShortTermCloud) entity);
+            } else if (entity instanceof ForecastPowerShortTermStation) {
+                forecastPowerShortTermStationList.add((ForecastPowerShortTermStation) entity);
+            }
+        }
+        if (forecastPowerShortTermCloudList.size() > 0) {
+            List<ForecastPowerShortTermCloud> collectList = forecastPowerShortTermCloudList.stream().filter(s -> s.getTime().getTime() >= stTime && s.getTime().getTime() <= eTime).collect(Collectors.toList());
+            if (null != forecastPowerShortTermCloudList && forecastPowerShortTermCloudList.size() > 0) {
+                datas = new String[collectList.size()];
+                int index = 0;
+                for (ForecastPowerShortTermCloud f : collectList) {
+                    datas[index] = String.valueOf(f.getFpValue());
+                    index++;
+                }
+            }
+        } else {
+            List<ForecastPowerShortTermStation> collectList = forecastPowerShortTermStationList.stream().filter(s -> s.getTime().getTime() >= stTime && s.getTime().getTime() <= eTime).collect(Collectors.toList());
+            if (null != forecastPowerShortTermStationList && forecastPowerShortTermStationList.size() > 0) {
+                datas = new String[collectList.size()];
+                int index = 0;
+                for (ForecastPowerShortTermStation f : collectList) {
+                    datas[index] = String.valueOf(f.getFpValue());
+                    index++;
+                }
+            }
+        }
+
+        return datas;
+    }
+
+    public List<DayPowerGeneration> findByGenDate(String genDate,String stationCode){
+        QueryWrapper<DayPowerGeneration> wrapper = new QueryWrapper<>();
+        if (null != genDate && !"".equals(genDate)){
+            wrapper.eq("gen_date",genDate);
+        }
+        if (null != stationCode && !"".equals(stationCode)){
+            wrapper.eq("station_code",stationCode);
+        }
+        return list(wrapper);
+    }
+
+}
+
+
+
+

+ 4 - 0
cpp-admin/src/main/java/com/cpp/web/service/station/ForecastPowerShortTermStationService.java

@@ -1,6 +1,7 @@
 package com.cpp.web.service.station;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import com.cpp.web.domain.station.ForecastPowerShortTermStation;
 
 import java.util.Date;
@@ -62,4 +63,7 @@ public interface ForecastPowerShortTermStationService extends IService<ForecastP
 
 
     List<ForecastPowerShortTermStation> findByForecastTimeBetween(Date startTime, Date endTime);
+
+    List<ForecastPowerShortTermStation> findByForecastTimeBetweenAndStationCode(Date startTime, Date endTime, String stationCode);
+
 }

+ 13 - 0
cpp-admin/src/main/java/com/cpp/web/service/station/impl/ForecastPowerShortTermStationServiceImpl.java

@@ -2,6 +2,7 @@ package com.cpp.web.service.station.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.cpp.web.domain.cloud.ForecastPowerShortTermCloud;
 import com.cpp.web.domain.station.ForecastPowerShortTermStation;
 import com.cpp.web.mapper.station.ForecastPowerShortTermStationMapper;
 import com.cpp.web.service.station.ForecastPowerShortTermStationService;
@@ -18,6 +19,13 @@ import java.util.List;
  */
 @Service
 public class ForecastPowerShortTermStationServiceImpl extends ServiceImpl<ForecastPowerShortTermStationMapper, ForecastPowerShortTermStation> implements ForecastPowerShortTermStationService {
+
+    private final ForecastPowerShortTermStationMapper forecastPowerShortTermStationMapper;
+
+    public ForecastPowerShortTermStationServiceImpl(ForecastPowerShortTermStationMapper forecastPowerShortTermStationMapper) {
+        this.forecastPowerShortTermStationMapper = forecastPowerShortTermStationMapper;
+    }
+
     @Override
     public ForecastPowerShortTermStation findByForecastTimeAndForecastHowLongAgoAndStationCodeAndForecastManufactor(Long pointEndTime, int howLongAgo, String stationCode, String forecastManufactor) {
         QueryWrapper<ForecastPowerShortTermStation> wrapper = new QueryWrapper<>();
@@ -70,6 +78,11 @@ public class ForecastPowerShortTermStationServiceImpl extends ServiceImpl<Foreca
     }
 
     @Override
+    public List<ForecastPowerShortTermStation> findByForecastTimeBetweenAndStationCode(Date startTime, Date endTime, String stationCode) {
+        return forecastPowerShortTermStationMapper.findByTimeBetweenAndStationCode(startTime,endTime,stationCode);
+    }
+
+    @Override
     public ForecastPowerShortTermStation findByForecastTimeAndForecastHowLongAgoAndStationCode(Long time, int howLongAgo, String stationCode) {
         QueryWrapper<ForecastPowerShortTermStation> wrapper = new QueryWrapper<>();
 

+ 69 - 13
cpp-ui/src/views/statistics/analyzeRecords/index.vue

@@ -14,7 +14,7 @@
         />
       </el-form-item>
       <el-form-item label="场站名称">
-        <el-select v-model="stationCode" placeholder="请选择" style="width: 255px" popper-class="cpp-popper">
+        <el-select v-model="stationCode" placeholder="请选择" style="width: 150px" popper-class="cpp-popper">
           <el-option
             v-for="item in stationList"
             :key="item.value"
@@ -24,7 +24,7 @@
         </el-select>
       </el-form-item>
       <el-form-item label="文件类型">
-        <el-select v-model="fileTypeName" placeholder="请选择" style="width: 255px" popper-class="cpp-popper" clearable>
+        <el-select v-model="fileTypeName" placeholder="请选择" style="width: 150px" popper-class="cpp-popper" clearable>
           <el-option
             v-for="item in fileType"
             :key="item.value"
@@ -33,6 +33,36 @@
           </el-option>
         </el-select>
       </el-form-item>
+      <el-form-item label="数据源">
+        <el-select v-model="dataSources" placeholder="请选择" style="width: 150px" popper-class="cpp-popper" clearable>
+          <el-option
+            v-for="item in dataSourcesList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="文件解析状态">
+        <el-select v-model="fileStatus" placeholder="请选择" style="width: 100px" popper-class="cpp-popper" clearable>
+          <el-option
+            v-for="item in fileStatusList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="文件解析状态描述">
+        <el-select v-model="fileDescribe" placeholder="请选择" style="width: 100px" popper-class="cpp-popper" clearable>
+          <el-option
+            v-for="item in fileDescribeList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item>
         <el-button type="primary" size="mini" style="margin-left: 5px" icon="el-icon-search"
                    @click="queryByStationCode">查询
@@ -83,6 +113,30 @@ export default {
       dateTime: [new Date(new Date().toLocaleDateString()).getTime(), new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1],
       fileType: [],
       fileTypeName: '',
+      fileStatus: '',
+      fileDescribe: '',
+      dataSources: '',
+      dataSourcesList: [],
+      fileDescribeList: [
+        {
+          value:'null',
+          label:'空'
+        },
+        {
+          value: 'notNull',
+          label: '非空'
+        }
+      ],
+      fileStatusList: [
+        {
+          value: '成功',
+          label: '成功'
+        },
+        {
+          value: '失败',
+          label: '失败'
+        }
+      ],
       title: "",
       total: 0,
       pageSize: 10,
@@ -97,6 +151,7 @@ export default {
   },
   created() {
     this.getStationCode()
+    this.getDataSourcesEnum()
   },
   mounted() {
   },
@@ -121,6 +176,11 @@ export default {
       const s = (date.getSeconds() < 10 ? '0' : '') + date.getSeconds()
       return Y + M + D + h + m + s
     },
+    getDataSourcesEnum(){
+      this.$axios.get("/enumSelect/dataSourcesEnum").then(response => {
+        this.dataSourcesList = response.data
+      })
+    },
     getStationCode() {
       this.$axios({url: '/electricfield/all', method: 'get'}).then(response => {
         this.stationList = response.data
@@ -212,6 +272,9 @@ export default {
         "fileType": this.fileTypeName,
         "startTime": startTime,
         "endTime": endTime,
+        "dataSources": this.dataSources,
+        "parsingDescribe": this.fileDescribe,
+        "parsingFileStatus": this.fileStatus,
         "pageSize": this.pageSize,
         "currentPage": this.currentPage
       }
@@ -230,17 +293,10 @@ export default {
       }
     },
     changeDataSource(row) {
-      if (row.cellValue === "E1") {
-        return "ftp(场站端)"
-      }
-      if (row.cellValue === "E2") {
-        return "云端(中心端)"
-      }
-      if (row.cellValue === "E3") {
-        return "集中预测(控制端)"
-      }
-      if (row.cellValue === "E4") {
-        return "ftp(场站端经集中调控)"
+      for (let i = 0; i < this.dataSourcesList.length; i++) {
+        if (row.cellValue === this.dataSourcesList[i].value) {
+          return this.dataSourcesList[i].label
+        }
       }
     },
     changeFileName(row) {

+ 264 - 0
cpp-ui/src/views/statistics/predictedPowerGeneration/index.vue

@@ -0,0 +1,264 @@
+<template>
+  <div class="app-container">
+    <el-form :inline="true" size="small" class="dark-el-input dark-el-button">
+      <el-form-item label="生成日期" prop="startTime">
+        <el-date-picker
+          popper-class="cpp-popper"
+          v-model="dateTime"
+          :clearable="false"
+          type="date"
+          value-format="timestamp"
+          placeholder="选择开始日期"
+          style="width: 255px">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="场站名称">
+        <el-select v-model="stationCode" placeholder="请选择" style="width: 255px" popper-class="cpp-popper">
+          <el-option
+            v-for="item in stationList"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" size="mini" style="margin-left: 5px" icon="el-icon-search"
+                   @click="queryByStationCode">查询
+        </el-button>
+      </el-form-item>
+    </el-form>
+    <div style="padding-top: 20px">
+      <el-row :gutter="24">
+        <el-col :span="6">
+          <vxe-table
+            ref="xTable"
+            align="center"
+            class="mytable-style"
+            auto-resize
+            border
+            resizable
+            export-config
+            highlight-current-row
+            show-overflow
+            max-height="700"
+            :data="tableData">
+            <vxe-table-column field="time" title="预测日期"></vxe-table-column>
+            <vxe-table-column field="forecastPowerGenerationZd" title="站端预测"></vxe-table-column>
+            <vxe-table-column field="forecastPowerGenerationYd" title="云端预测"></vxe-table-column>
+          </vxe-table>
+        </el-col>
+        <el-col :span="18">
+          <div style="width: 100%;height:600px" id="contrastCharts"></div>
+        </el-col>
+      </el-row>
+    </div>
+  </div>
+</template>
+
+
+<script>
+import * as echarts from "echarts";
+
+export default {
+  name: 'predictedPowerGeneration',
+  data() {
+    return {
+      dateTime: new Date(new Date().toLocaleDateString()).getTime(),
+      stationList: [],
+      stationCode: '',
+      stationName: undefined,
+      tableData: [],
+      loading: false,
+      predictionDataSource: '',
+      predictionDataSourceList: [
+        {
+          value: '云端下发',
+          label: '云端下发'
+        },
+        {
+          value: '站端上传',
+          label: '站端上传'
+        }
+      ],
+      total: 0,
+      pageSize: 10,
+      currentPage: 1,
+      contrastChart: null
+    }
+  },
+  created() {
+    this.getStationCode()
+  },
+  mounted() {
+  },
+  beforeDestroy() {
+    if (this.contrastChart) {
+      this.contrastChart.dispose()
+      this.contrastChart = null
+    }
+  },
+  computed: {},
+  methods: {
+    handlePageChange({currentPage, pageSize}) {
+      this.currentPage = currentPage
+      if (this.pageSize != pageSize) {
+        this.changePageSize(pageSize)
+      }
+      this.pageSize = pageSize
+    },
+    getStationCode() {
+      this.$axios({url: '/electricfield/all', method: 'get'}).then(response => {
+        this.stationList = response.data
+        if (this.stationList.length > 0) {
+          this.stationCode = this.stationList[0].value
+          this.queryByStationCode()
+        }
+      })
+    },
+    queryByStationCode() {
+      let genDate = this.dateTime
+      const param = {
+        "stationCode": this.stationCode,
+        "genDate": genDate,
+        "predictionDataSource": this.predictionDataSource
+      }
+      this.$axios.get('/dayPowerGeneration/getList', {params: param}).then(response => {
+        this.tableData = response.data
+        this.total = this.tableData.length
+        this.loading = false
+        var times = []
+        var yd = []
+        var zd = []
+        for (let i = 0; i < this.tableData.length; i++) {
+          times.push(this.tableData[i].time);
+          yd.push(this.tableData[i].forecastPowerGenerationYd);
+          zd.push(this.tableData[i].forecastPowerGenerationZd);
+        }
+        this.contrastDraw(times, zd, yd)
+      })
+    },
+    codeChangeName(row) {
+      var codeList = this.stationList
+      for (let i = 0; i < codeList.length; i++) {
+        if (row.cellValue == codeList[i].value) {
+          return codeList[i].label
+        }
+      }
+    },
+    contrastDraw(times, zd, yd) {
+      this.contrastChart = echarts.init(document.getElementById('contrastCharts'), "dark", {renderer: 'svg'})
+
+      var option = {
+        backgroundColor: 'transparent',
+        title: {
+          text: '发电量变化',
+          textStyle: {
+            fontWeight: 'normal',
+            fontSize: 16,
+          },
+          left: '1%'
+        },
+        tooltip: {
+          trigger: 'axis',
+          axisPointer: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        },
+        legend: [{
+          top: 20,
+          icon: 'rect',
+          itemWidth: 14,
+          itemHeight: 5,
+          itemGap: 13,
+          data: ['站端预测', '云端预测'],
+          right: '4%',
+          textStyle: {
+            fontSize: 12,
+          }
+        }],
+        grid: {
+          top: '10%',
+          left: '3%',
+          right: '3%',
+          bottom: '8%',
+          containLabel: true
+        },
+        xAxis: {
+          type: 'category',
+          boundaryGap: false,
+          data: times,
+          axisLabel: {
+            formatter: '{value}',
+            hideOverlap: true
+          },
+
+        },
+        yAxis: [{
+          type: 'value',
+          name: '(万千瓦时)',
+          axisLabel: {
+            margin: 10,
+            textStyle: {
+              fontSize: 14
+            }
+          },
+          splitLine: {
+            lineStyle: {
+              color: '#57617B'
+            }
+          }
+        }],
+        series: [
+          {
+            name: '站端预测',
+            type: 'line',
+            data: zd,
+            lineStyle: {
+              normal: {
+                width: 2
+              }
+            },
+            itemStyle: {
+              normal: {
+                color: '#c9daf8',
+                borderColor: 'rgba(50,194,219,0.2)',
+                borderWidth: 12
+              }
+            }
+          },
+          {
+            name: '云端预测',
+            type: 'line',
+            data: yd,
+            lineStyle: {
+              normal: {
+                width: 1
+              }
+            },
+            itemStyle: {
+              normal: {
+
+                color: '#aef899',
+                borderColor: 'rgba(87,219,50,0.2)',
+                borderWidth: 12
+              }
+            }
+          }
+        ]
+      }
+
+      this.contrastChart.setOption(option, true)
+      var _this = this
+      window.addEventListener("resize", function () {
+        _this.contrastChart.resize();
+      });
+    },
+  }
+}
+</script>
+
+<style scoped>
+</style>