Commit 2dc76c6c authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.新建气象局数据收集表,同时生成相关代码;
2.修改天气数据处理转换定时任务,增加处理保存气象局天气数据逻辑,同时解决接收数据入库重复问题;
3.修改风资源功率预测中期三天功率预测结果接口,增加风速等响应字段;
4.修改风资源功率预测中期十天功率预测结果接口,增加风速等响应字段;
5.修改风资源功率预测超短期4小时功率预测结果接口,增加风速等响应字段;
6.修复登录后没有清除验证码导致可以重复登录问题;
7.开发风预测训练集数据保存定时任务,完成定时任务冒烟测试;
8.开发风资源历史数据导入功能,完成接口冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 81840eb4
package pps.core.base.excel;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.read.listener.ReadListener;
import pps.core.base.service.BaseLineService;
import pps.core.base.service.data.base_excel.WindPredictionExcelData;
import xstartup.base.XContext;
import java.util.ArrayList;
import java.util.List;
/**
* 风资源数据
*
* @author ZWT
* @date 2024/08/30 15:46
*/
public class WindPredictionDataListener implements ReadListener<WindPredictionExcelData> {
private XContext context;
private String stationId;
/**
* 缓存的数据
*/
private List<WindPredictionExcelData> cachedDataList = new ArrayList<>(4096);
public WindPredictionDataListener(XContext context, String stationId) {
this.context = context;
this.stationId = stationId;
}
@Override
public void invoke(WindPredictionExcelData windPredictionExcelData, AnalysisContext analysisContext) {
cachedDataList.add(windPredictionExcelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
BaseLineService bean = context.getBean(BaseLineService.class);
bean.saveWindPredictionHistory(context, cachedDataList, stationId);
}
}
......@@ -5,12 +5,11 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import pps.core.base.entity.BasePhotovoltaicPlantView;
import pps.core.base.entity.PlantPredictedPowerDataEnt;
import pps.core.base.entity.ThirdWeatherDataEnt;
import pps.core.base.entity.ThirdWeatherDataView;
import pps.core.base.entity.*;
import pps.core.base.excel.ThirdApiWeatherDataListener;
import pps.core.base.excel.WindPredictionDataListener;
import pps.core.base.mapper.*;
import pps.core.base.service.data.base_excel.WindPredictionExcelData;
import pps.core.base.service.data.third_weather_data.ThirdApiWeatherExcelData;
import pps.core.base.service.data.third_weather_data.WeatherDeleteCondition;
import pps.core.common.constant.BusinessConstant;
......@@ -23,6 +22,7 @@ import xstartup.feature.api.annotation.XApiGet;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
......@@ -38,6 +38,16 @@ public class BaseLineService {
return XServiceResult.OK;
}
@XText("风资源历史数据配置导入")
@XApiGet(anonymous = true)
public XServiceResult importWindPrediction(XContext context) {
String fileName = "D:\\工作\\尚博信\\数据智能事业部\\零碳\\演示\\吉林\\新需求\\20240828\\data\\19.csv";
String stationId = "b6688f07d34b4121ba42e17b4c7e6437";
// 这里 需要指定读用哪个class去读,然后读取第一个sheet 文件流会自动关闭
EasyExcel.read(fileName, WindPredictionExcelData.class, new WindPredictionDataListener(context, stationId)).sheet().doRead();
return XServiceResult.OK;
}
@XText("天气历史数据导入")
@XApiGet
public XServiceResult importHistory(XContext context) {
......@@ -83,6 +93,77 @@ public class BaseLineService {
return XServiceResult.OK;
}
public void saveWindPredictionHistory(XContext context, List<WindPredictionExcelData> cachedDataList, String stationId) {
if (CollUtil.isNotEmpty(cachedDataList)) {
List<WindPredictionFutureView> futureList = new ArrayList<>(cachedDataList.size());
List<WindPredictionHistoryView> historyList = new ArrayList<>(cachedDataList.size());
//按日期顺序排序
cachedDataList.sort(Comparator.comparing(WindPredictionExcelData::getDataTime));
//数据分界线
DateTime futureFlag = DateUtil.offsetDay(DateUtil.beginOfDay(CollUtil.getLast(cachedDataList).getDataTime()), -20);
//数据分片
for (WindPredictionExcelData excelData : cachedDataList) {
if (DateUtil.compare(excelData.getDataTime(), futureFlag) >= 0) {
//未来数据
futureList.add(
WindPredictionFutureView.builder()
.stationId(stationId)
.dataTime(excelData.getDataTime())
.windDirection(excelData.getWindDirection())
.windSpeed(excelData.getWindSpeed())
.airTemperature(excelData.getAirTemperature())
.humidity(excelData.getHumidity())
.pressure(excelData.getPressure())
.actualWindSpeed(excelData.getActualWindSpeed())
.actualPower(excelData.getActualPower())
.predictedPower(excelData.getPredictedPower())
.build()
);
} else {
//历史数据
historyList.add(
WindPredictionHistoryView.builder()
.stationId(stationId)
.dataTime(excelData.getDataTime())
.windDirection(excelData.getWindDirection())
.windSpeed(excelData.getWindSpeed())
.airTemperature(excelData.getAirTemperature())
.humidity(excelData.getHumidity())
.pressure(excelData.getPressure())
.actualWindSpeed(excelData.getActualWindSpeed())
.actualPower(excelData.getActualPower())
.predictedPower(excelData.getPredictedPower())
.build()
);
}
}
//记录
String futureStart = DateUtil.formatDateTime(CollUtil.getFirst(futureList).getDataTime());
String futureEnd = DateUtil.formatDateTime(CollUtil.getLast(futureList).getDataTime());
String historyStart = DateUtil.formatDateTime(CollUtil.getFirst(historyList).getDataTime());
String historyEnd = DateUtil.formatDateTime(CollUtil.getLast(historyList).getDataTime());
//入库
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);
}
}
}
}
public void saveHistory(XContext context, List<ThirdApiWeatherExcelData> cachedDataList) {
DateTime date = DateUtil.date();
//查第二采油厂所有电站
......
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 WindPredictionExcelData {
@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;
}
......@@ -56,7 +56,7 @@
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO wind_prediction_future (station_id, data_time, wind_direction, wind_speed, air_temperature,
humidity, pressure ) VALUES
humidity, pressure ,actual_wind_speed ,actual_power ,predicted_power) VALUES
<foreach collection="list" separator="," item="item">
(
#{item.stationId},
......@@ -65,7 +65,10 @@
#{item.windSpeed},
#{item.airTemperature},
#{item.humidity},
#{item.pressure}
#{item.pressure},
#{item.actualWindSpeed},
#{item.actualPower},
#{item.predictedPower}
)
</foreach>
</insert>
......
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