Commit 37631698 authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.天气数据接收定时任务,解决代码扫描问题,修改文件读取相关代码,解决资源未关流问题;
2.修改登录验证码生成工具类,解决代码扫描问题,修复随机数不安全问题;
3.删除除主程序启动类外其他启动类模块,解决代码扫描问题;
4.删除自定义httputlis类,解决代码扫描问题,替换部分代码远程调用方法;
5.重构光伏预测模块下载电站实际发电数据导入模板接口,解决代码扫描问题;
6.重构光伏预测模块导入电站实际发电数据接口,解决代码扫描问题;
7.删除公用excel导入导出工具类及poi相关pom依赖,解决代码扫描问题;
8.光伏功率预测模块,增加查询线路列表接口,解决页面接口报错问题;
9.增加测试用历史数据导入接口;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 33864889
package pps.core.base.entity; package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText; import xstartup.annotation.XText;
import java.io.Serializable; import java.io.Serializable;
...@@ -15,6 +18,9 @@ import java.util.Date; ...@@ -15,6 +18,9 @@ import java.util.Date;
* @date 2024/09/04 * @date 2024/09/04
*/ */
@Data @Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThirdWindPowerGenerationUpdateView implements Serializable { public class ThirdWindPowerGenerationUpdateView implements Serializable {
@XText("ID") @XText("ID")
@TableField @TableField
......
package pps.core.base.excel;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.core.base.entity.ThirdWindPowerGenerationEnt;
import pps.core.base.entity.WindPredictionFutureView;
import pps.core.base.entity.WindPredictionHistoryView;
import pps.core.base.mapper.ThirdWindPowerGenerationMapper;
import pps.core.base.mapper.WindPredictionFutureViewMapper;
import pps.core.base.mapper.WindPredictionHistoryViewMapper;
import pps.core.base.service.data.third_weather_data.ThirdApiWeatherExcelData;
import pps.core.common.utils.BaseUtils;
import xstartup.base.XContext;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 天气数据监听器(测试用)
*
* @author ZWT
* @date 2024/04/30 11:04
*/
public class ThirdApiWeatherDataListener2 implements ReadListener<ThirdApiWeatherExcelData> {
private XContext context;
/**
* 缓存的数据
*/
private List<ThirdApiWeatherExcelData> cachedDataList = new ArrayList<>(4096);
public ThirdApiWeatherDataListener2(XContext context) {
this.context = context;
}
@Override
public void invoke(ThirdApiWeatherExcelData thirdApiWeatherData, AnalysisContext analysisContext) {
cachedDataList.add(thirdApiWeatherData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
this.saveHistory(context, cachedDataList);
}
private void saveHistory(XContext context, List<ThirdApiWeatherExcelData> cachedDataList) {
if (CollUtil.isNotEmpty(cachedDataList)) {
String stationId = "f4816d9e4e134aaba0dbd483775e36b2";
String stationName = "吉林油田模拟电站";
ThirdApiWeatherExcelData first = CollUtil.getFirst(cachedDataList);
ThirdApiWeatherExcelData last = CollUtil.getLast(cachedDataList);
//每个csv只要第一天
DateTime beginTime = DateUtil.parseDateTime(first.getTime());
DateTime endTime = DateUtil.endOfDay(beginTime);
//查实际信息
ThirdWindPowerGenerationMapper mapper = context.getBean(ThirdWindPowerGenerationMapper.class);
List<ThirdWindPowerGenerationEnt> list = mapper.selectList(new LambdaQueryWrapper<ThirdWindPowerGenerationEnt>()
.eq(ThirdWindPowerGenerationEnt::getStationId, stationId)
.between(ThirdWindPowerGenerationEnt::getCollectTime, beginTime, endTime)
.orderByAsc(ThirdWindPowerGenerationEnt::getCollectTime)
);
Map<Date, ThirdWindPowerGenerationEnt> collect = list.stream()
.collect(Collectors.toMap(ThirdWindPowerGenerationEnt::getCollectTime, Function.identity()));
//封装数据
List<WindPredictionFutureView> futureList = new ArrayList<>(96);
List<WindPredictionHistoryView> historyList = new ArrayList<>(96);
DateTime dateTime;
ThirdWindPowerGenerationEnt generationEnt;
for (ThirdApiWeatherExcelData data : cachedDataList) {
dateTime = DateUtil.parseDateTime(data.getTime());
if (endTime.compareTo(dateTime) <= 0) {
break;
}
WindPredictionHistoryView historyView = new WindPredictionHistoryView();
historyView.setStationId(stationId);
historyView.setDataTime(dateTime);
historyView.setWindDirection(data.getWnd());
historyView.setWindSpeed(data.getGust());
historyView.setAirTemperature(data.getTem());
historyView.setHumidity(data.getRhu());
historyView.setPressure(data.getPrsQfe());
WindPredictionFutureView futureView = new WindPredictionFutureView();
futureView.setStationId(stationId);
futureView.setDataTime(dateTime);
futureView.setWindDirection(data.getWnd());
futureView.setWindSpeed(data.getGust());
futureView.setAirTemperature(data.getTem());
futureView.setHumidity(data.getRhu());
futureView.setPressure(data.getPrsQfe());
futureView.setActualPower(BigDecimal.ZERO);
//匹配实际
if (collect.containsKey(dateTime)) {
generationEnt = collect.get(dateTime);
futureView.setActualWindSpeed(generationEnt.getActualWindSpeed());
historyView.setActualWindSpeed(generationEnt.getActualWindSpeed());
historyView.setActualPower(generationEnt.getActualPower());
historyView.setActualWindDirection(generationEnt.getAccurateWindDirection());
} else {
futureView.setActualWindSpeed(BigDecimal.ZERO);
historyView.setActualWindSpeed(BigDecimal.ZERO);
historyView.setActualPower(BigDecimal.ZERO);
}
futureList.add(futureView);
historyList.add(historyView);
}
//入库
if (CollUtil.isNotEmpty(futureList)) {
WindPredictionFutureViewMapper futureMapper = context.getBean(WindPredictionFutureViewMapper.class);
if (futureList.size() > BaseUtils.BATCH_SIZE) {
List<List<WindPredictionFutureView>> subList = BaseUtils.getSubList(futureList);
subList.forEach(futureMapper::insertBatch);
} else {
futureMapper.insertBatch(futureList);
}
}
if (CollUtil.isNotEmpty(historyList)) {
WindPredictionHistoryViewMapper historyMapper = context.getBean(WindPredictionHistoryViewMapper.class);
if (historyList.size() > BaseUtils.BATCH_SIZE) {
List<List<WindPredictionHistoryView>> subList = BaseUtils.getSubList(historyList);
subList.forEach(historyMapper::batchInsert);
} else {
historyMapper.batchInsert(historyList);
}
}
}
}
}
\ No newline at end of file
...@@ -18,7 +18,7 @@ import java.util.Comparator; ...@@ -18,7 +18,7 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
/** /**
* 风资源数据 * 风资源数据(测试用)
* *
* @author ZWT * @author ZWT
* @date 2024/08/30 15:46 * @date 2024/08/30 15:46
......
package pps.core.base.excel;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import pps.core.base.entity.ThirdWindPowerGenerationView;
import pps.core.base.mapper.ThirdWindPowerGenerationViewMapper;
import pps.core.base.service.data.base_excel.WindPredictionExcel2Data;
import pps.core.common.utils.BaseUtils;
import xstartup.base.XContext;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* 风资源数据(测试用)
*
* @author ZWT
* @date 2024/08/30 15:46
*/
public class WindPredictionDataListener2 implements ReadListener<WindPredictionExcel2Data> {
private XContext context;
/**
* 缓存的数据
*/
private List<WindPredictionExcel2Data> cachedDataList = new ArrayList<>(4096);
public WindPredictionDataListener2(XContext context) {
this.context = context;
}
@Override
public void invoke(WindPredictionExcel2Data windPredictionExcelData, AnalysisContext analysisContext) {
cachedDataList.add(windPredictionExcelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
this.saveWindPredictionHistory(context, cachedDataList);
}
public void saveWindPredictionHistory(XContext context, List<WindPredictionExcel2Data> cachedDataList) {
if (CollUtil.isNotEmpty(cachedDataList)) {
List<ThirdWindPowerGenerationView> batchList = new ArrayList<>(cachedDataList.size());
String stationId = "f4816d9e4e134aaba0dbd483775e36b2";
String stationName = "吉林油田模拟电站";
DateTime date;
DateTime beginOfDay;
int minute;
Integer actualWindDirection;
for (WindPredictionExcel2Data data : cachedDataList) {
date = DateUtil.date(data.getDataTime());
beginOfDay = DateUtil.beginOfDay(date);
minute = date.minute();
//转换时间
switch (minute) {
case 10:
continue;
case 20:
date = DateUtil.offsetMinute(date, -5);
break;
case 40:
continue;
case 50:
date = DateUtil.offsetMinute(date, -5);
break;
}
//转换风向
BigDecimal accurateWindDirection = data.getAccurateWindDirection();
if (BigDecimal.valueOf(45).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 0;
} else if (BigDecimal.valueOf(90).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 45;
} else if (BigDecimal.valueOf(135).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 90;
} else if (BigDecimal.valueOf(180).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 135;
} else if (BigDecimal.valueOf(225).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 180;
} else if (BigDecimal.valueOf(270).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 225;
} else if (BigDecimal.valueOf(315).compareTo(accurateWindDirection) > 0) {
actualWindDirection = 270;
} else {
actualWindDirection = 315;
}
//封装
batchList.add(
ThirdWindPowerGenerationView.builder()
.stationName(stationName)
.stationId(stationId)
.collectTime(date)
.actualWindSpeed(data.getActualWindSpeed())
.actualPower(data.getActualPower())
.actualGeneration(BigDecimal.ZERO)
.accurateWindDirection(data.getAccurateWindDirection())
.actualWindDirection(actualWindDirection)
.inputTime(beginOfDay)
.systemSource("SY")
.build()
);
}
ThirdWindPowerGenerationViewMapper viewMapper = context.getBean(ThirdWindPowerGenerationViewMapper.class);
//批量新增
if (batchList.size() > BaseUtils.BATCH_SIZE) {
List<List<ThirdWindPowerGenerationView>> subList = BaseUtils.getSubList(batchList);
subList.forEach(viewMapper::batchInsert);
} else {
viewMapper.batchInsert(batchList);
}
}
}
}
package pps.core.base.service; package pps.core.base.service;
import cn.hutool.core.io.FileUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import pps.core.base.excel.ThirdApiWeatherDataListener; import pps.core.base.excel.ThirdApiWeatherDataListener;
import pps.core.base.excel.ThirdApiWeatherDataListener2;
import pps.core.base.excel.WindPredictionDataListener; import pps.core.base.excel.WindPredictionDataListener;
import pps.core.base.excel.WindPredictionDataListener2;
import pps.core.base.service.data.base_data.GetBaseDataInput; import pps.core.base.service.data.base_data.GetBaseDataInput;
import pps.core.base.service.data.base_excel.WindPredictionExcel2Data;
import pps.core.base.service.data.base_excel.WindPredictionExcelData; import pps.core.base.service.data.base_excel.WindPredictionExcelData;
import pps.core.base.service.data.base_power_line.DynamicQueryBasePowerLineInput; import pps.core.base.service.data.base_power_line.DynamicQueryBasePowerLineInput;
import pps.core.base.service.data.base_power_line.DynamicQueryBasePowerLineOutput; import pps.core.base.service.data.base_power_line.DynamicQueryBasePowerLineOutput;
...@@ -16,7 +20,9 @@ import xstartup.data.XServiceResult; ...@@ -16,7 +20,9 @@ import xstartup.data.XServiceResult;
import xstartup.feature.api.annotation.XApiGet; import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiPost; import xstartup.feature.api.annotation.XApiPost;
import java.io.File;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
@XService @XService
...@@ -61,6 +67,25 @@ public class BaseLineService { ...@@ -61,6 +67,25 @@ public class BaseLineService {
return XServiceResult.OK; return XServiceResult.OK;
} }
@XText("实际风资源数据")
@XApiGet
public XServiceResult importWindPrediction2(XContext context) {
String fileName = "D:\\工作\\尚博信\\数据智能事业部\\零碳\\演示\\吉林\\新需求\\20240919\\导入实际数据.xlsx";
EasyExcel.read(fileName, WindPredictionExcel2Data.class, new WindPredictionDataListener2(context)).sheet().doRead();
return XServiceResult.OK;
}
@XText("风资源历史数据配置导入2")
@XApiGet
public XServiceResult importWindPrediction3(XContext context) {
String fileName = "D:\\工作\\尚博信\\数据智能事业部\\零碳\\演示\\吉林\\新需求\\20240919\\result 3\\result 3";
List<File> files = FileUtil.loopFiles(fileName);
for (File file : files) {
EasyExcel.read(file, ThirdApiWeatherExcelData.class, new ThirdApiWeatherDataListener2(context)).sheet().doRead();
}
return XServiceResult.OK;
}
@XText("天气历史数据导入") @XText("天气历史数据导入")
@XApiGet @XApiGet
public XServiceResult importHistory(XContext context) { public XServiceResult importHistory(XContext context) {
......
package pps.core.base.service.data.base_excel;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 风资源数据(测试用)
*
* @author ZWT
* @date 2024/08/30 15:33
*/
@Data
@ExcelIgnoreUnannotated
public class WindPredictionExcel2Data {
@ExcelProperty(value = "时间")
private Date dataTime;
@ExcelProperty(value = "实际风速")
private BigDecimal actualWindSpeed;
@ExcelProperty(value = "实际功率")
private BigDecimal actualPower;
@ExcelProperty(value = "实际风向")
private BigDecimal accurateWindDirection;
}
...@@ -9,7 +9,7 @@ import java.math.BigDecimal; ...@@ -9,7 +9,7 @@ import java.math.BigDecimal;
import java.util.Date; import java.util.Date;
/** /**
* 风资源数据 * 风资源数据(测试用)
* *
* @author ZWT * @author ZWT
* @date 2024/08/30 15:33 * @date 2024/08/30 15:33
......
package pps.core.base.service.data.base_excel;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 风资源数据(测试用)
*
* @author ZWT
* @date 2024/08/30 15:33
*/
@Data
@ExcelIgnoreUnannotated
public class WindPredictionExcelData3 {
@XText("记录时间")
@ExcelProperty(value = "DATATIME")
private Date dataTime;
@XText("风向")
@ExcelProperty(value = "WINDDIRECTION")
private Integer windDirection;
@XText("预报风速(m/s)")
@ExcelProperty(value = "WINDSPEED")
private BigDecimal windSpeed;
@XText("气温(℃)")
@ExcelProperty(value = "TEMPERATURE")
private BigDecimal airTemperature;
@XText("湿度(%)")
@ExcelProperty(value = "HUMIDITY")
private BigDecimal humidity;
@XText("气压(hPa)")
@ExcelProperty(value = "PRESSURE")
private BigDecimal pressure;
@XText("实际风速(m/s)")
@ExcelProperty(value = "ROUND(A.WS,1)")
private BigDecimal actualWindSpeed;
@XText("实际功率(kw)")
@ExcelProperty(value = "ROUND(A.POWER,0)")
private BigDecimal actualPower;
@XText("预测功率(kw)")
@ExcelProperty(value = "PREPOWER")
private BigDecimal predictedPower;
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment