Commit 2c416527 authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.修复登录页面登录接口验证码输入后不需要验证直接能登录的问题;
2.长庆演示,首页展示大屏功能修改,修改线路详情接口,增加查询日平均用电量逻辑,同时重构查询日产液量和日发电量逻辑,更新接口文档并完成接口冒烟测试,同时生成用例;
3.长庆极短期间开优化随动算法功能开发,设置自定义参数,初步完成极短时间,间开时间段优化测试功能;
4.间开制度管理模块,间开制度关联井口信息表表结构修改,增加"单次最高开井时长(h)","单次最低开井时长(h)","单次最高关井时长(h)","单次最低关井时长(h)"字段,同时修改数据表对应代码实体及表单参数,修改部分相关模块功能查询修改逻辑;
5.接收天气服务定时任务优化,优化代码结构,修改保存删除逻辑,减少数据库链接次数,优化各类变量大小,修改日期拆分逻辑,解决插入重复数据bug,修改查询电站信息逻辑,增加过滤条件排除第二采油厂数据;
6.修改发送邮件服务,增加获取心知天气未来15天天气预测数据接口,同时创建定时任务,添加获取天气数据后发送到邮箱逻辑;
7.创建定时任务,用于接收心知天气预测数据;
8.设计并创建心知天气数据接收表,生成相关代码并上传到远程git仓库,修改心知天气数据接收定时任务逻辑,增加天气数据新增及删除逻辑;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 28717e7d
package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import xstartup.annotation.XText;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 第三方气象数据
*
* @author ZWT
* @date 2024/04/23
*/
@Data
@TableName("third_weather_data")
public class ThirdWeatherDataEnt implements Serializable {
@XText("ID")
@TableId(type = IdType.AUTO)
private Long id;
@XText("太阳直接辐射[W/m2]")
@TableField
private BigDecimal dni;
@XText("太阳总辐射(水平面)[W/m2]")
@TableField
private BigDecimal ghi;
@XText("太阳散射辐射(水平面)[W/m2]")
@TableField
private BigDecimal dhi;
@XText("预报时间")
@TableField
private Date forecastTime;
@XText("气温 [C]")
@TableField
private BigDecimal tem;
@XText("相对湿度 [%]")
@TableField
private BigDecimal rhu;
@XText("风速(地面10米)[m/s]")
@TableField
private BigDecimal wns;
@XText("风向角度(地面10米)[degree]")
@TableField
private Integer wnd;
@XText("风力等级(地面10米)")
@TableField
private Integer wnsGrd;
@XText("阵风风速(地面10米)[m/s]")
@TableField
private BigDecimal gust;
@XText("降水量(1小时累计)[mm]")
@TableField
private BigDecimal pre;
@XText("地面气压 [hPa]")
@TableField
private BigDecimal prsQfe;
@XText("能见度 [km]")
@TableField
private BigDecimal vis;
@XText("云量 [%]")
@TableField
private BigDecimal clo;
@XText("紫外线UV辐照度(1小时累计)[kWh/m2]")
@TableField
private BigDecimal uvb;
@XText("紫外线UV辐照指数")
@TableField
private Integer uvi;
@XText("降水相态:(0无降水, 1雨, 3冻雨, 5雪, 6湿雪, 7雨夹雪, 8冰雹)")
@TableField
private Integer phs;
@XText("天气现象代码")
@TableField
private Integer wep;
@XText("风向角度(地面100米)[degree]")
@TableField
private Integer wnd100m;
@XText("风速(地面100米)[m/s]")
@TableField
private BigDecimal wns100m;
@XText("风力等级(地面100米)")
@TableField
private Integer wnsGrd100m;
@XText("天气数据更新时间")
@TableField
private Date updateTime;
@XText("数据创建时间")
@TableField
private Date createTime;
@XText("经度(°)")
@TableField
private BigDecimal longitude;
@XText("纬度(°)")
@TableField
private BigDecimal latitude;
}
package pps.core.base.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
/**
* 第三方气象数据
*
* @author ZWT
* @date 2024/04/23
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ThirdWeatherDataView implements Serializable {
@XText("ID")
@TableField
private Long id;
@XText("太阳直接辐射[W/m2]")
@TableField
private BigDecimal dni;
@XText("太阳总辐射(水平面)[W/m2]")
@TableField
private BigDecimal ghi;
@XText("太阳散射辐射(水平面)[W/m2]")
@TableField
private BigDecimal dhi;
@XText("预报时间")
@TableField
private Date forecastTime;
@XText("气温 [C]")
@TableField
private BigDecimal tem;
@XText("相对湿度 [%]")
@TableField
private BigDecimal rhu;
@XText("风速(地面10米)[m/s]")
@TableField
private BigDecimal wns;
@XText("风向角度(地面10米)[degree]")
@TableField
private Integer wnd;
@XText("风力等级(地面10米)")
@TableField
private Integer wnsGrd;
@XText("阵风风速(地面10米)[m/s]")
@TableField
private BigDecimal gust;
@XText("降水量(1小时累计)[mm]")
@TableField
private BigDecimal pre;
@XText("地面气压 [hPa]")
@TableField
private BigDecimal prsQfe;
@XText("能见度 [km]")
@TableField
private BigDecimal vis;
@XText("云量 [%]")
@TableField
private BigDecimal clo;
@XText("紫外线UV辐照度(1小时累计)[kWh/m2]")
@TableField
private BigDecimal uvb;
@XText("紫外线UV辐照指数")
@TableField
private Integer uvi;
@XText("降水相态:(0无降水, 1雨, 3冻雨, 5雪, 6湿雪, 7雨夹雪, 8冰雹)")
@TableField
private Integer phs;
@XText("天气现象代码")
@TableField
private Integer wep;
@XText("风向角度(地面100米)[degree]")
@TableField
private Integer wnd100m;
@XText("风速(地面100米)[m/s]")
@TableField
private BigDecimal wns100m;
@XText("风力等级(地面100米)")
@TableField
private Integer wnsGrd100m;
@XText("天气数据更新时间")
@TableField
private Date updateTime;
@XText("数据创建时间")
@TableField
private Date createTime;
@XText("经度(°)")
@TableField
private BigDecimal longitude;
@XText("纬度(°)")
@TableField
private BigDecimal latitude;
}
package pps.core.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.ThirdWeatherDataEnt;
/**
* 第三方气象数据
*
* @author ZWT
* @date 2024/04/23
*/
@Repository(value = "pps.core.base.mapper.ThirdWeatherDataMapper")
public interface ThirdWeatherDataMapper extends BaseMapper<ThirdWeatherDataEnt> {
}
package pps.core.base.mapper;
import org.springframework.stereotype.Repository;
import pps.core.base.entity.ThirdWeatherDataView;
import java.util.List;
/**
* 第三方气象数据
*
* @author ZWT
* @date 2024/04/23
*/
@Repository(value = "pps.core.base.mapper.ThirdWeatherDataViewMapper")
public interface ThirdWeatherDataViewMapper {
ThirdWeatherDataView selectOne(ThirdWeatherDataView record);
List<ThirdWeatherDataView> selectList(ThirdWeatherDataView record);
/**
* 批量新增
*
* @param list 列表
* @return int
*/
int insertBatch(List<ThirdWeatherDataView> list);
}
......@@ -16,11 +16,14 @@ import org.apache.commons.lang3.StringUtils;
import pps.cloud.base.service.IBaseWeatherCloudService;
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.enums.WindDirection;
import pps.core.base.mapper.BasePhotovoltaicPlantViewMapper;
import pps.core.base.mapper.PlantPredictedPowerDataMapper;
import pps.core.base.mapper.PlantPredictedPowerDataViewMapper;
import pps.core.base.service.data.DailyData;
import pps.core.base.mapper.*;
import pps.core.base.service.data.third_weather_data.DailyData;
import pps.core.base.service.data.third_weather_data.ThirdApiWeatherData;
import pps.core.base.service.data.third_weather_data.Weather15mData;
import pps.core.base.service.data.third_weather_data.WeatherDeleteCondition;
import pps.core.base.utils.ReceivedIMAPMail;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.BaseUtils;
......@@ -270,12 +273,11 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
NioUtil.close(folder);
NioUtil.close(store);
}
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
PlantPredictedPowerDataViewMapper dataViewMapper = context.getBean(PlantPredictedPowerDataViewMapper.class);
int size;
if (CollUtil.isNotEmpty(deleteList)) {
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
size = deleteList.size();
logger.info("------ weatherDataProcess batchDelete delete plantId: {}", size);
logger.info("------ weatherDataProcess batchDelete delete size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
List<List<PlantPredictedPowerDataEnt>> subList = BaseUtils.getSubList(deleteList);
for (List<PlantPredictedPowerDataEnt> list : subList) {
......@@ -298,6 +300,7 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
}
}
if (CollUtil.isNotEmpty(batchList)) {
PlantPredictedPowerDataViewMapper dataViewMapper = context.getBean(PlantPredictedPowerDataViewMapper.class);
size = batchList.size();
logger.info("------ weatherDataProcess batchList insert size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
......@@ -319,6 +322,7 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
@Override
public XServiceResult weatherApiDataProcess(XContext context) {
XLoggerTool logger = context.getLogger();
DateTime date = DateUtil.date();
//查第二采油厂所有电站
BasePhotovoltaicPlantViewMapper viewMapper = context.getBean(BasePhotovoltaicPlantViewMapper.class);
//todo 暂时就一个点,第二采油厂全用API这一个点的数据
......@@ -329,6 +333,8 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
logger.info("------ weatherDataProcess plantList is empty ------");
return XServiceResult.OK;
}
List<WeatherDeleteCondition> deleteList = new ArrayList<>(32);
List<ThirdWeatherDataView> weatherDataViewList = new ArrayList<>(2048);
//取未读邮件
Store store = null;
Folder folder = null;
......@@ -355,8 +361,36 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
logger.info("------ weatherApiDataProcess load file: {}", tempFilePath);
FileReader fileReader = new FileReader(tempFilePath);
String jsonString = fileReader.readString();
JSONArray jsonArray = JSON.parseArray(jsonString);
System.out.println();
List<Weather15mData> weather15mDataList = JSON.parseArray(jsonString, Weather15mData.class);
if (CollUtil.isEmpty(weather15mDataList)) {
logger.info("------ weatherApiDataProcess weather15mDataList isEmpty ------");
return XServiceResult.OK;
}
for (Weather15mData weather15mData : weather15mDataList) {
List<String> split = CharSequenceUtil.split(weather15mData.getLocation().getQuery(), ':');
BigDecimal latitude = new BigDecimal(split.get(0));
BigDecimal longitude = new BigDecimal(split.get(1));
Date timeUpdated = weather15mData.getTimeUpdated();
List<ThirdApiWeatherData> data = weather15mData.getData();
Date beginTime = data.get(0).getForecastTime();
Date endTime = data.get(data.size() - 1).getForecastTime();
deleteList.add(
WeatherDeleteCondition.builder()
.longitude(longitude)
.latitude(latitude)
.beginTime(beginTime)
.endTime(DateUtil.offsetMinute(endTime, 15))
.build()
);
List<ThirdWeatherDataView> weatherDataList = XCopyUtils.copyNewList(data, ThirdWeatherDataView.class);
for (ThirdWeatherDataView thirdWeatherDataView : weatherDataList) {
thirdWeatherDataView.setLongitude(longitude);
thirdWeatherDataView.setLatitude(latitude);
thirdWeatherDataView.setUpdateTime(timeUpdated);
thirdWeatherDataView.setCreateTime(date);
weatherDataViewList.add(thirdWeatherDataView);
}
}
}
}
} catch (MessagingException e) {
......@@ -376,6 +410,45 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
NioUtil.close(folder);
NioUtil.close(store);
}
int size;
if (CollUtil.isNotEmpty(deleteList)) {
ThirdWeatherDataMapper dataMapper = context.getBean(ThirdWeatherDataMapper.class);
size = deleteList.size();
logger.info("------ weatherApiDataProcess batchDelete delete size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
List<List<WeatherDeleteCondition>> subList = BaseUtils.getSubList(deleteList);
for (List<WeatherDeleteCondition> list : subList) {
LambdaQueryWrapper<ThirdWeatherDataEnt> wrapper = new LambdaQueryWrapper<>();
for (WeatherDeleteCondition dataEnt : list) {
wrapper.or(w -> w.eq(ThirdWeatherDataEnt::getLatitude, dataEnt.getLatitude())
.eq(ThirdWeatherDataEnt::getLongitude, dataEnt.getLongitude())
.between(ThirdWeatherDataEnt::getForecastTime, dataEnt.getBeginTime(), dataEnt.getEndTime())
);
}
dataMapper.delete(wrapper);
}
} else {
LambdaQueryWrapper<ThirdWeatherDataEnt> wrapper = new LambdaQueryWrapper<>();
for (WeatherDeleteCondition dataEnt : deleteList) {
wrapper.or(w -> w.eq(ThirdWeatherDataEnt::getLatitude, dataEnt.getLatitude())
.eq(ThirdWeatherDataEnt::getLongitude, dataEnt.getLongitude())
.between(ThirdWeatherDataEnt::getForecastTime, dataEnt.getBeginTime(), dataEnt.getEndTime())
);
}
dataMapper.delete(wrapper);
}
}
if (CollUtil.isNotEmpty(weatherDataViewList)) {
ThirdWeatherDataViewMapper dataViewMapper = context.getBean(ThirdWeatherDataViewMapper.class);
size = weatherDataViewList.size();
logger.info("------ weatherApiDataProcess batchList insert size: {}", size);
if (size > BaseUtils.BATCH_SIZE) {
List<List<ThirdWeatherDataView>> subList = BaseUtils.getSubList(weatherDataViewList);
subList.forEach(dataViewMapper::insertBatch);
} else {
dataViewMapper.insertBatch(weatherDataViewList);
}
}
return XServiceResult.OK;
}
......
package pps.core.base.service.data;
package pps.core.base.service.data.third_weather_data;
import lombok.AllArgsConstructor;
import lombok.Builder;
......
package pps.core.base.service.data.third_weather_data;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 位置信息
*
* @author ZWT
* @date 2024/04/23
*/
@NoArgsConstructor
@Data
public class LocationDTO {
/**
* 纬度:经度
*/
private String query;
}
\ No newline at end of file
package pps.core.base.service.data.third_weather_data;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 第三方气象数据
*
* @author ZWT
* @date 2024/04/23
*/
@Data
public class ThirdApiWeatherData {
@XText("太阳直接辐射[W/m2]")
private BigDecimal dni;
@XText("太阳总辐射(水平面)[W/m2]")
private BigDecimal ghi;
@XText("太阳散射辐射(水平面)[W/m2]")
private BigDecimal dhi;
@XText("预报时间")
@JSONField(name = "time")
private Date forecastTime;
@XText("气温 [C]")
private BigDecimal tem;
@XText("相对湿度 [%]")
private BigDecimal rhu;
@XText("风速(地面10米)[m/s]")
private BigDecimal wns;
@XText("风向角度(地面10米)[degree]")
private Integer wnd;
@XText("风力等级(地面10米)")
private Integer wnsGrd;
@XText("阵风风速(地面10米)[m/s]")
private BigDecimal gust;
@XText("降水量(1小时累计)[mm]")
private BigDecimal pre;
@XText("地面气压 [hPa]")
private BigDecimal prsQfe;
@XText("能见度 [km]")
private BigDecimal vis;
@XText("云量 [%]")
private BigDecimal clo;
@XText("紫外线UV辐照度(1小时累计)[kWh/m2]")
private BigDecimal uvb;
@XText("紫外线UV辐照指数")
private Integer uvi;
@XText("降水相态:(0无降水, 1雨, 3冻雨, 5雪, 6湿雪, 7雨夹雪, 8冰雹)")
private Integer phs;
@XText("天气现象代码")
private Integer wep;
@XText("风向角度(地面100米)[degree]")
private Integer wnd100m;
@XText("风速(地面100米)[m/s]")
private BigDecimal wns100m;
@XText("风力等级(地面100米)")
private Integer wnsGrd100m;
@XText("天气数据更新时间")
private Date updateTime;
@XText("数据创建时间")
private Date createTime;
@XText("经度(°)")
private BigDecimal longitude;
@XText("纬度(°)")
private BigDecimal latitude;
}
package pps.core.base.service.data.third_weather_data;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* 15分钟数据
*
* @author ZWT
* @date 2024/04/23 10:00
*/
@NoArgsConstructor
@Data
public class Weather15mData {
/**
* 15天每15分钟气象数据
*/
private List<ThirdApiWeatherData> data;
/**
* 位置信息
*/
private LocationDTO location;
/**
* 更新日期
*/
private Date timeUpdated;
}
package pps.core.base.service.data.third_weather_data;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import xstartup.annotation.XText;
import java.math.BigDecimal;
import java.util.Date;
/**
* 删除条件
*
* @author ZWT
* @date 2024/04/23 10:53
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class WeatherDeleteCondition {
@XText("经度(°)")
private BigDecimal longitude;
@XText("纬度(°)")
private BigDecimal latitude;
@XText("开始时间")
private Date beginTime;
@XText("结束时间")
private Date endTime;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="pps.core.base.mapper.ThirdWeatherDataViewMapper">
<resultMap id="BaseResultMap" type="pps.core.base.entity.ThirdWeatherDataView">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="dni" property="dni" jdbcType="DECIMAL"/>
<result column="ghi" property="ghi" jdbcType="DECIMAL"/>
<result column="dhi" property="dhi" jdbcType="DECIMAL"/>
<result column="forecast_time" property="forecastTime" jdbcType="DATE"/>
<result column="tem" property="tem" jdbcType="DECIMAL"/>
<result column="rhu" property="rhu" jdbcType="DECIMAL"/>
<result column="wns" property="wns" jdbcType="DECIMAL"/>
<result column="wnd" property="wnd" jdbcType="INTEGER"/>
<result column="wns_grd" property="wnsGrd" jdbcType="INTEGER"/>
<result column="gust" property="gust" jdbcType="DECIMAL"/>
<result column="pre" property="pre" jdbcType="DECIMAL"/>
<result column="prs_qfe" property="prsQfe" jdbcType="DECIMAL"/>
<result column="vis" property="vis" jdbcType="DECIMAL"/>
<result column="clo" property="clo" jdbcType="DECIMAL"/>
<result column="uvb" property="uvb" jdbcType="DECIMAL"/>
<result column="uvi" property="uvi" jdbcType="INTEGER"/>
<result column="phs" property="phs" jdbcType="INTEGER"/>
<result column="wep" property="wep" jdbcType="INTEGER"/>
<result column="wnd_100m" property="wnd100m" jdbcType="INTEGER"/>
<result column="wns_100m" property="wns100m" jdbcType="DECIMAL"/>
<result column="wns_grd_100m" property="wnsGrd100m" jdbcType="INTEGER"/>
<result column="update_time" property="updateTime" jdbcType="DATE"/>
<result column="create_time" property="createTime" jdbcType="DATE"/>
<result column="longitude" property="longitude" jdbcType="DECIMAL"/>
<result column="latitude" property="latitude" jdbcType="DECIMAL"/>
</resultMap>
<sql id="Base_Column_List">
id
,
dni,
ghi,
dhi,
forecast_time,
tem,
rhu,
wns,
wnd,
wns_grd,
gust,
pre,
prs_qfe,
vis,
clo,
uvb,
uvi,
phs,
wep,
wnd_100m,
wns_100m,
wns_grd_100m,
update_time,
create_time,
longitude,
latitude
</sql>
<select id="selectOne" parameterType="pps.core.base.entity.ThirdWeatherDataView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from third_weather_data
where
id=#{id}
</select>
<select id="selectList" parameterType="pps.core.base.entity.ThirdWeatherDataView" resultMap="BaseResultMap">
select
<include refid="Base_Column_List"/>
from third_weather_data
where
id=#{id}
</select>
<insert id="insertBatch" parameterType="java.util.List">
INSERT INTO third_weather_data ( dni, ghi, dhi, forecast_time, tem, rhu, wns, wnd, wns_grd, gust, pre,
prs_qfe, vis, clo, uvb, uvi, phs, wep, wnd_100m, wns_100m, wns_grd_100m, update_time, create_time, longitude,
latitude) VALUES
<foreach collection="list" separator="," item="item">
(
#{item.dni},
#{item.ghi},
#{item.dhi},
#{item.forecastTime},
#{item.tem},
#{item.rhu},
#{item.wns},
#{item.wnd},
#{item.wnsGrd},
#{item.gust},
#{item.pre},
#{item.prsQfe},
#{item.vis},
#{item.clo},
#{item.uvb},
#{item.uvi},
#{item.phs},
#{item.wep},
#{item.wnd100m},
#{item.wns100m},
#{item.wnsGrd100m},
#{item.updateTime},
#{item.createTime},
#{item.longitude},
#{item.latitude}
)
</foreach>
</insert>
</mapper>
\ No newline at end of file
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