Commit d495a98d authored by ZWT's avatar ZWT

feat(吉林演示): 松原

1.开发间开优化结果统计功能,创建间开优化效果统计表,生成对应代码;
2.修改15天,10天,3天,1天间开优化功能,修改代码结构;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent c5fa02d9
...@@ -31,7 +31,7 @@ public class ExcelSelectedResolve { ...@@ -31,7 +31,7 @@ public class ExcelSelectedResolve {
public String[] resolveSelectedSource(ExcelSelected excelSelected) { public String[] resolveSelectedSource(ExcelSelected excelSelected) {
if (ObjectUtil.isNull(excelSelected)) { if (ObjectUtil.isNull(excelSelected)) {
return null; return new String[0];
} }
// 获取固定下拉框的内容 // 获取固定下拉框的内容
String[] source = excelSelected.source(); String[] source = excelSelected.source();
...@@ -51,6 +51,6 @@ public class ExcelSelectedResolve { ...@@ -51,6 +51,6 @@ public class ExcelSelectedResolve {
log.error("解析动态下拉框数据异常", e); log.error("解析动态下拉框数据异常", e);
} }
} }
return null; return new String[0];
} }
} }
\ No newline at end of file
...@@ -5,6 +5,7 @@ import xstartup.cache.XCacheLife; ...@@ -5,6 +5,7 @@ import xstartup.cache.XCacheLife;
import xstartup.cache.XCacheObject; import xstartup.cache.XCacheObject;
import xstartup.cache.XListCache; import xstartup.cache.XListCache;
import java.util.Collections;
import java.util.List; import java.util.List;
/** /**
...@@ -99,7 +100,7 @@ public class RolePermissionCache implements XCacheObject, XCacheLife { ...@@ -99,7 +100,7 @@ public class RolePermissionCache implements XCacheObject, XCacheLife {
static class Tool extends XListCache<RolePermissionCache> { static class Tool extends XListCache<RolePermissionCache> {
@Override @Override
protected List<RolePermissionCache> restore(XContext context, String listKey) { protected List<RolePermissionCache> restore(XContext context, String listKey) {
return null; return Collections.emptyList();
} }
} }
} }
...@@ -6,6 +6,7 @@ import xstartup.cache.XCacheLife; ...@@ -6,6 +6,7 @@ import xstartup.cache.XCacheLife;
import xstartup.cache.XCacheObject; import xstartup.cache.XCacheObject;
import xstartup.cache.XListCache; import xstartup.cache.XListCache;
import java.util.Collections;
import java.util.List; import java.util.List;
public class SysAreaCache implements XCacheObject, XCacheLife { public class SysAreaCache implements XCacheObject, XCacheLife {
...@@ -96,7 +97,7 @@ public class SysAreaCache implements XCacheObject, XCacheLife { ...@@ -96,7 +97,7 @@ public class SysAreaCache implements XCacheObject, XCacheLife {
static class Tool extends XListCache<SysAreaCache> { static class Tool extends XListCache<SysAreaCache> {
@Override @Override
protected List<SysAreaCache> restore(XContext context, String listKey) { protected List<SysAreaCache> restore(XContext context, String listKey) {
return null; return Collections.emptyList();
} }
} }
} }
...@@ -9,6 +9,7 @@ import xstartup.cache.XCacheLife; ...@@ -9,6 +9,7 @@ import xstartup.cache.XCacheLife;
import xstartup.cache.XCacheObject; import xstartup.cache.XCacheObject;
import xstartup.cache.XListCache; import xstartup.cache.XListCache;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -330,7 +331,7 @@ public class SysDictionaryCache implements XCacheObject, XCacheLife { ...@@ -330,7 +331,7 @@ public class SysDictionaryCache implements XCacheObject, XCacheLife {
static class Tool extends XListCache<SysDictionaryCache> { static class Tool extends XListCache<SysDictionaryCache> {
@Override @Override
protected List<SysDictionaryCache> restore(XContext context, String listKey) { protected List<SysDictionaryCache> restore(XContext context, String listKey) {
return null; return Collections.emptyList();
} }
} }
} }
...@@ -6,6 +6,7 @@ import xstartup.cache.XCacheLife; ...@@ -6,6 +6,7 @@ import xstartup.cache.XCacheLife;
import xstartup.cache.XCacheObject; import xstartup.cache.XCacheObject;
import xstartup.cache.XListCache; import xstartup.cache.XListCache;
import java.util.Collections;
import java.util.List; import java.util.List;
public class SysOrganizationCache implements XCacheObject, XCacheLife { public class SysOrganizationCache implements XCacheObject, XCacheLife {
...@@ -126,7 +127,7 @@ public class SysOrganizationCache implements XCacheObject, XCacheLife { ...@@ -126,7 +127,7 @@ public class SysOrganizationCache implements XCacheObject, XCacheLife {
static class Tool extends XListCache<SysOrganizationCache> { static class Tool extends XListCache<SysOrganizationCache> {
@Override @Override
protected List<SysOrganizationCache> restore(XContext context, String listKey) { protected List<SysOrganizationCache> restore(XContext context, String listKey) {
return null; return Collections.emptyList();
} }
} }
} }
...@@ -36,6 +36,7 @@ import xstartup.data.XListResult; ...@@ -36,6 +36,7 @@ import xstartup.data.XListResult;
import xstartup.data.XSingleResult; import xstartup.data.XSingleResult;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static pps.core.common.constant.BusinessConstant.LOGIN_FLAG_SIMULATE; import static pps.core.common.constant.BusinessConstant.LOGIN_FLAG_SIMULATE;
...@@ -103,7 +104,7 @@ public class PpsUserSessionInjectProviderImpl implements XSessionInjectProvider ...@@ -103,7 +104,7 @@ public class PpsUserSessionInjectProviderImpl implements XSessionInjectProvider
if (ObjectUtil.isNotNull(mediaTypesView)) { if (ObjectUtil.isNotNull(mediaTypesView)) {
String mediaType = mediaTypesView.getMediaType(); String mediaType = mediaTypesView.getMediaType();
if (CharSequenceUtil.isNotBlank(mediaType)) { if (CharSequenceUtil.isNotBlank(mediaType)) {
set.addAll(CharSequenceUtil.split(mediaType, ',')); set.addAll(CharSequenceUtil.split(mediaType, Pattern.quote(",")));
} }
} }
if (CollUtil.isNotEmpty(set)) { if (CollUtil.isNotEmpty(set)) {
...@@ -202,7 +203,7 @@ public class PpsUserSessionInjectProviderImpl implements XSessionInjectProvider ...@@ -202,7 +203,7 @@ public class PpsUserSessionInjectProviderImpl implements XSessionInjectProvider
if (CharSequenceUtil.equals(OuLevelConstant.JI_GUAN_CHU_SHI.getCode(), org.getOuLevel()) || if (CharSequenceUtil.equals(OuLevelConstant.JI_GUAN_CHU_SHI.getCode(), org.getOuLevel()) ||
CharSequenceUtil.equals(OuLevelConstant.JI_GUAN_KE_SHI.getCode(), org.getOuLevel())) { CharSequenceUtil.equals(OuLevelConstant.JI_GUAN_KE_SHI.getCode(), org.getOuLevel())) {
//查找上级机构 //查找上级机构
List<String> idPathList = CharSequenceUtil.split(org.getOuPath(), '/'); List<String> idPathList = CharSequenceUtil.split(org.getOuPath(), Pattern.quote("/"));
if (CollUtil.isEmpty(idPathList)) { if (CollUtil.isEmpty(idPathList)) {
return null; return null;
} else { } else {
......
...@@ -37,6 +37,7 @@ import xstartup.helper.XTransactionHelper; ...@@ -37,6 +37,7 @@ import xstartup.helper.XTransactionHelper;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@XText("字典接口") @XText("字典接口")
...@@ -315,7 +316,7 @@ public class SysDictionaryService { ...@@ -315,7 +316,7 @@ public class SysDictionaryService {
List<String> collect = sysDictionaryEnts.stream() List<String> collect = sysDictionaryEnts.stream()
.map(p -> { .map(p -> {
if (CharSequenceUtil.isNotBlank(p.getDicPath())) { if (CharSequenceUtil.isNotBlank(p.getDicPath())) {
String[] split = p.getDicPath().split("/"); String[] split = p.getDicPath().split(Pattern.quote("/"));
if (ArrayUtil.isNotEmpty(split)) { if (ArrayUtil.isNotEmpty(split)) {
return split[1]; return split[1];
} else { } else {
...@@ -369,7 +370,7 @@ public class SysDictionaryService { ...@@ -369,7 +370,7 @@ public class SysDictionaryService {
//添加子节点是否打开的标志 //添加子节点是否打开的标志
out.setChildren(null); out.setChildren(null);
} }
out.setXh(++i + ""); out.setXh(String.valueOf(++i));
} }
} }
return query; return query;
...@@ -400,7 +401,7 @@ public class SysDictionaryService { ...@@ -400,7 +401,7 @@ public class SysDictionaryService {
tree.setChildren(null); tree.setChildren(null);
if (CharSequenceUtil.isBlank(tree.getPid()) || "1".equals(tree.getPid())) { if (CharSequenceUtil.isBlank(tree.getPid()) || "1".equals(tree.getPid())) {
trees.add(tree); trees.add(tree);
tree.setXh(++i + ""); tree.setXh(String.valueOf(++i));
} }
//子集 //子集
int j = 0; int j = 0;
...@@ -409,7 +410,7 @@ public class SysDictionaryService { ...@@ -409,7 +410,7 @@ public class SysDictionaryService {
if (CollUtil.isEmpty(tree.getChildren())) { if (CollUtil.isEmpty(tree.getChildren())) {
tree.setChildren(Collections.emptyList()); tree.setChildren(Collections.emptyList());
} }
it.setXh(++j + ""); it.setXh(String.valueOf(++j));
tree.set_showChildren(true); tree.set_showChildren(true);
tree.setBeHasChildren(1); tree.setBeHasChildren(1);
tree.getChildren().add(it); tree.getChildren().add(it);
...@@ -447,7 +448,7 @@ public class SysDictionaryService { ...@@ -447,7 +448,7 @@ public class SysDictionaryService {
if (CollUtil.isNotEmpty(sysDictionaryEnts)) { if (CollUtil.isNotEmpty(sysDictionaryEnts)) {
List<String> collect = sysDictionaryEnts.stream().map(p -> { List<String> collect = sysDictionaryEnts.stream().map(p -> {
if (CharSequenceUtil.isNotBlank(p.getDicPath())) { if (CharSequenceUtil.isNotBlank(p.getDicPath())) {
String[] split = p.getDicPath().split("/"); String[] split = p.getDicPath().split(Pattern.quote("/"));
if (ArrayUtil.isNotEmpty(split)) { if (ArrayUtil.isNotEmpty(split)) {
return split[1]; return split[1];
} else { } else {
...@@ -506,7 +507,7 @@ public class SysDictionaryService { ...@@ -506,7 +507,7 @@ public class SysDictionaryService {
//添加子节点是否打开的标志 //添加子节点是否打开的标志
out.setChildren(null); out.setChildren(null);
} }
out.setXh(++i + ""); out.setXh(String.valueOf(++i));
} }
} }
return query; return query;
......
...@@ -31,6 +31,7 @@ import java.util.ArrayList; ...@@ -31,6 +31,7 @@ import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@XText("角色管理") @XText("角色管理")
...@@ -83,7 +84,7 @@ public class SysRoleService { ...@@ -83,7 +84,7 @@ public class SysRoleService {
SysOrganizationRelEnt relEnt = ouRelEnts.get(0); SysOrganizationRelEnt relEnt = ouRelEnts.get(0);
String ouIdPath = relEnt.getOuIdPath(); String ouIdPath = relEnt.getOuIdPath();
if (CharSequenceUtil.isNotBlank(ouIdPath)) { if (CharSequenceUtil.isNotBlank(ouIdPath)) {
List<String> ouIds = CharSequenceUtil.split(ouIdPath, '/').stream() List<String> ouIds = CharSequenceUtil.split(ouIdPath, Pattern.quote("/")).stream()
.filter(id -> !CharSequenceUtil.equals(id, input.getOuId())) .filter(id -> !CharSequenceUtil.equals(id, input.getOuId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
record.setOuIds(ouIds); record.setOuIds(ouIds);
......
package pps.cloud.base.service;
import pps.cloud.base.service.data.CrawlBaseWatherInput;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
@XService
public interface BaseWatherCloudService {
@XText("获取电站天气信息")
XServiceResult crawlPlantBaseWatherData(XContext context);
@XText("获取天气信息")
XServiceResult crawlBaseWatherData(XContext context);
@XText("获取天气信息")
XServiceResult crawlBaseWatherDataByCityCode(XContext context, CrawlBaseWatherInput input);
}
...@@ -4,108 +4,37 @@ import cn.hutool.core.collection.CollUtil; ...@@ -4,108 +4,37 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.github.pagehelper.PageInfo; import com.github.pagehelper.PageInfo;
import pps.core.base.entity.BaseLineAttenuationRateEnt; import pps.core.base.entity.BaseLineAttenuationRateEnt;
import pps.core.base.entity.BaseLineAttenuationRateView;
import pps.core.base.entity.BaseProjectInfoEnt; import pps.core.base.entity.BaseProjectInfoEnt;
import pps.core.base.entity.BaseProjectInfoPredictedDataEnt; import pps.core.base.entity.BaseProjectInfoPredictedDataEnt;
import pps.core.base.mapper.*; import pps.core.base.mapper.BaseLineAttenuationRateMapper;
import pps.core.base.mapper.BaseProjectInfoMapper;
import pps.core.base.mapper.BaseProjectInfoPredictedDataMapper;
import pps.core.base.service.data.base_line_attenuation_rate.CreateBaseLineAttenuationRateInput; import pps.core.base.service.data.base_line_attenuation_rate.CreateBaseLineAttenuationRateInput;
import pps.core.base.service.data.base_project_info.*; import pps.core.base.service.data.base_project_info.*;
import pps.core.common.session.PpsUserSession;
import pps.core.system.entity.SysAreaEnt;
import pps.core.system.mapper.SysAreaMapper;
import xstartup.annotation.XService; import xstartup.annotation.XService;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils; import xstartup.base.util.XCopyUtils;
import xstartup.base.util.XHttpUtils;
import xstartup.base.util.XJsonUtils;
import xstartup.core.base.helper.XThreadHelper;
import xstartup.data.XListResult; import xstartup.data.XListResult;
import xstartup.data.XPageResult;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
import xstartup.data.XSingleResult; import xstartup.data.XSingleResult;
import xstartup.error.XError; import xstartup.error.XError;
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.math.BigDecimal; import java.util.List;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@XService @XService
public class BaseProjectInfoService { public class BaseProjectInfoService {
@XApiPost @XApiPost
public XServiceResult createProjectInfo(XContext context, CreateBaseProjectInfoInput input) { public XServiceResult createProjectInfo(XContext context, CreateBaseProjectInfoInput input) {
BaseProjectInfoMapper mapper = context.getBean(BaseProjectInfoMapper.class);
BaseProjectInfoEnt entity = new BaseProjectInfoEnt();
XCopyUtils.copyObject(input, entity);
Date now = new Date();
PpsUserSession session = context.getSession(PpsUserSession.class);
entity.setCreateById(session.getId());
entity.setCreateByName(session.getUserName());
entity.setCreateTime(now);
entity.setIsDeleted(0);
mapper.insert(entity);
List<BaseLineAttenuationRateView> list = new ArrayList<>();
if (CollUtil.isNotEmpty(input.getList())) {
BaseLineAttenuationRateViewMapper rateMapper = context.getBean(BaseLineAttenuationRateViewMapper.class);
for (CreateBaseLineAttenuationRateInput rateInput : input.getList()) {
BaseLineAttenuationRateView ent = XCopyUtils.copyNewObject(rateInput, BaseLineAttenuationRateView.class);
ent.setType(1);
ent.setCreateTime(now);
ent.setLineId(entity.getId());
ent.setCreateById(session.getId());
ent.setCreateByName(session.getUserName());
list.add(ent);
}
rateMapper.batchInsert(list);
}
//开始预测
XThreadHelper.async(() -> predictedData(context, entity, list));
return XServiceResult.OK; return XServiceResult.OK;
} }
@XApiPost @XApiPost
public XServiceResult updateProjectInfo(XContext context, UpdateBaseProjectInfoInput input) { public XServiceResult updateProjectInfo(XContext context, UpdateBaseProjectInfoInput input) {
BaseProjectInfoMapper mapper = context.getBean(BaseProjectInfoMapper.class);
BaseProjectInfoEnt entity = mapper.selectOne(new LambdaQueryWrapper<BaseProjectInfoEnt>()
.eq(BaseProjectInfoEnt::getId, input.getId()));
if (ObjectUtil.isNull(entity)) {
return XServiceResult.error(context, XError.NotFound);
}
XCopyUtils.copyObject(input, entity);
Date now = new Date();
PpsUserSession session = context.getSession(PpsUserSession.class);
entity.setIsDeleted(0);
entity.setModifyTime(now);
entity.setModifyById(session.getId());
entity.setModifyByName(session.getUserName());
mapper.updateById(entity);
BaseLineAttenuationRateMapper rateMapper = context.getBean(BaseLineAttenuationRateMapper.class);
rateMapper.delete(new LambdaQueryWrapper<BaseLineAttenuationRateEnt>()
.eq(BaseLineAttenuationRateEnt::getType, 1)
.eq(BaseLineAttenuationRateEnt::getLineId, entity.getId())
);
List<BaseLineAttenuationRateView> list = new ArrayList<>();
if (CollUtil.isNotEmpty(input.getList())) {
BaseLineAttenuationRateViewMapper rateViewMapper = context.getBean(BaseLineAttenuationRateViewMapper.class);
for (CreateBaseLineAttenuationRateInput rateInput : input.getList()) {
BaseLineAttenuationRateView ent = XCopyUtils.copyNewObject(rateInput, BaseLineAttenuationRateView.class);
ent.setType(1);
ent.setCreateTime(now);
ent.setLineId(entity.getId());
ent.setCreateById(session.getId());
ent.setCreateByName(session.getUserName());
list.add(ent);
}
rateViewMapper.batchInsert(list);
}
//开始预测
XThreadHelper.async(() -> predictedData(context, entity, list));
return XServiceResult.OK; return XServiceResult.OK;
} }
...@@ -146,28 +75,6 @@ public class BaseProjectInfoService { ...@@ -146,28 +75,6 @@ public class BaseProjectInfoService {
return XSingleResult.success(output); return XSingleResult.success(output);
} }
@XApiGet
public XPageResult<QueryBaseProjectInfoOutput> queryProjectInfoList(XContext context, QueryProjectInfoInput input) {
BaseProjectInfoMapper mapper = context.getBean(BaseProjectInfoMapper.class);
List<BaseProjectInfoEnt> list = mapper.selectList(new LambdaQueryWrapper<BaseProjectInfoEnt>()
.like(CharSequenceUtil.isNotBlank(input.getProjectName()), BaseProjectInfoEnt::getProjectName, input.getProjectName())
.like(CharSequenceUtil.isNotBlank(input.getProductionYear()), BaseProjectInfoEnt::getProductionYear, input.getProductionYear())
);
PageInfo<BaseProjectInfoEnt> pageInfo = new PageInfo<>(list);
List<QueryBaseProjectInfoOutput> outputs = XCopyUtils.copyNewList(pageInfo.getList(), QueryBaseProjectInfoOutput.class);
SysAreaMapper areaMapper = context.getBean(SysAreaMapper.class);
List<SysAreaEnt> areaEntList = areaMapper.selectList(new QueryWrapper<>());
outputs.forEach(item -> {
if (CharSequenceUtil.isNotBlank(item.getProvince())) {
areaEntList.stream()
.filter(area -> CharSequenceUtil.equals(item.getProvince(), area.getId().toString()))
.findFirst()
.ifPresent(areaEnt -> item.setProvince(getParentNameStr(areaEntList, areaEnt)));
}
});
return XPageResult.success(outputs, input, pageInfo.getTotal());
}
@XApiGet @XApiGet
public XListResult<GetProjectInfoPredictedDataOutput> queryProjectInfoPredictedDataList(XContext context, GetProjectInfoPredictedDataInput input) { public XListResult<GetProjectInfoPredictedDataOutput> queryProjectInfoPredictedDataList(XContext context, GetProjectInfoPredictedDataInput input) {
BaseProjectInfoPredictedDataMapper mapper = context.getBean(BaseProjectInfoPredictedDataMapper.class); BaseProjectInfoPredictedDataMapper mapper = context.getBean(BaseProjectInfoPredictedDataMapper.class);
...@@ -178,70 +85,4 @@ public class BaseProjectInfoService { ...@@ -178,70 +85,4 @@ public class BaseProjectInfoService {
List<GetProjectInfoPredictedDataOutput> outputs = XCopyUtils.copyNewList(pageInfo.getList(), GetProjectInfoPredictedDataOutput.class); List<GetProjectInfoPredictedDataOutput> outputs = XCopyUtils.copyNewList(pageInfo.getList(), GetProjectInfoPredictedDataOutput.class);
return XListResult.success(outputs); return XListResult.success(outputs);
} }
private void predictedData(XContext context, BaseProjectInfoEnt entity, List<BaseLineAttenuationRateView> list) {
CalcProjectInfoPredictedDataInput input = new CalcProjectInfoPredictedDataInput();
input.setLat(entity.getLatitude());
input.setLon(entity.getLongitude());
input.setAngle(entity.getArrayIncidence());
input.setDirection(entity.getArrayToward());
input.setCapacity(entity.getInstallCapacity());
input.setEfficiency(new BigDecimal("0.35").setScale(2, RoundingMode.HALF_EVEN));
input.setWeather(new BigDecimal("0.7").setScale(2, RoundingMode.HALF_EVEN));
list.sort(Comparator.comparing(BaseLineAttenuationRateView::getSort));
List<BigDecimal> decimals = list.stream().map(BaseLineAttenuationRateView::getAttenuationRate).collect(Collectors.toList());
input.setDecline(decimals);
Map<String, Object> map = getPredictedData(context, input);
//插入数据
BaseProjectInfoPredictedDataMapper mapper = context.getBean(BaseProjectInfoPredictedDataMapper.class);
mapper.delete(new LambdaQueryWrapper<BaseProjectInfoPredictedDataEnt>()
.eq(BaseProjectInfoPredictedDataEnt::getProjectId, entity.getId()));
List<Double> powers = (List<Double>) map.get("power");
Integer particularYear = Integer.valueOf(entity.getProductionYear());
PpsUserSession userSession = context.getSession(PpsUserSession.class);
Date date = new Date();
List<BaseProjectInfoPredictedDataEnt> entList = new ArrayList<>();
for (Double decimal : powers) {
BaseProjectInfoPredictedDataEnt ent = new BaseProjectInfoPredictedDataEnt();
ent.setProjectId(entity.getId());
ent.setParticularYear(particularYear + "");
ent.setPredictedPower(BigDecimal.valueOf(decimal));
ent.setCreateById(userSession.getId());
ent.setCreateByName(userSession.getUserName());
ent.setCreateTime(date);
particularYear++;
entList.add(ent);
}
BaseProjectInfoPredictedDataViewMapper dataViewMapper = context.getBean(BaseProjectInfoPredictedDataViewMapper.class);
dataViewMapper.batchInsert(entList);
}
public Map<String, Object> getPredictedData(XContext context, CalcProjectInfoPredictedDataInput calcProjectInfoPredictedDataInput) {
Map<String, Object> returnMap;
try {
String jsonString = XJsonUtils.toJson(calcProjectInfoPredictedDataInput);
context.getLogger().info(jsonString);
String result = XHttpUtils.postAsJson("http://121.36.43.217:8098//model/yearmodel", jsonString, 10000);
returnMap = XJsonUtils.toMap(result);
return returnMap;
} catch (Exception e) {
throw new RuntimeException("调用预测接口失败");
}
}
/**
* 根据子节点获取最上层节点
*
* @return
*/
private String getParentNameStr(List<SysAreaEnt> areaList, SysAreaEnt child) {
String parentNameStr = child.getName();
Integer parentId = child.getParentId();
if (!parentId.equals(120)) {
SysAreaEnt parent = areaList.stream().filter(item -> item.getId().equals(parentId)).findFirst().orElse(null);
String nameStr = getParentNameStr(areaList, parent);
parentNameStr = nameStr + "/" + parentNameStr;
}
return parentNameStr;
}
} }
\ No newline at end of file
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import pps.cloud.base.service.BaseWatherCloudService;
import pps.cloud.base.service.data.CrawlBaseWatherInput;
import pps.core.base.entity.BasePhotovoltaicPlantView;
import pps.core.base.entity.BaseWatherEnt;
import pps.core.base.entity.PlantPredictedPowerDataEnt;
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.mapper.WeatherDataMapper;
import pps.core.common.constant.BusinessConstant;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.base.util.XHttpUtils;
import xstartup.core.base.helper.XThreadHelper;
import xstartup.data.XServiceResult;
import xstartup.feature.api.annotation.XApiGet;
import java.math.BigDecimal;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
@XService
public class BaseWatherCloudServiceImpl implements BaseWatherCloudService {
final String provinceUrl = "http://weather.cma.cn/api/dict/province";
final String cityUrl = "http://weather.cma.cn/api/dict/province/";
public static void insertData(XContext context, String plantId, String provinceCode, String cityCode, int runCount) {
String url = "http://weather.cma.cn/web/weather/" + cityCode + ".html";
try {
List<String> timeList = Arrays.asList("15:00", "30:00", "45:00");
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
Document document = Jsoup.parse(new URL(url), 30000);
Elements elements = document.getElementsByClass("mt15"); // 获取class name 是‘mt15’的都有元素对象
Element element;
if (elements.isEmpty()) {
return;
} else {
element = elements.get(1); //根据页面结构获取到需要的元素对象
}
Elements tables = element.getElementsByTag("table");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> hourTimeArray;// 时间
List<String> weatherArray; // 天气
List<String> temperatureArray; // 气温
List<String> precipitationArray; // 降水
List<String> windSpeedArray; // 风速
List<String> windDirectionArray; // 风向
List<String> pressureArray; // 气压
List<String> humidityArray;// 湿度
List<String> cloudCoverArray; // 云量
Date date;
Calendar calendar;
String dayTime;
List<PlantPredictedPowerDataEnt> objList = new ArrayList<>();
List<PlantPredictedPowerDataEnt> allList = new ArrayList<>();
if (!tables.isEmpty()) {
for (int i = 0; i < tables.size(); i++) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, i);
date = calendar.getTime();
dayTime = sdf.format(date);
Elements trs = tables.get(i).select("tr");
hourTimeArray = new ArrayList<>();// 时间
weatherArray = new ArrayList<>(); // 天气
temperatureArray = new ArrayList<>(); // 气温
precipitationArray = new ArrayList<>(); // 降水
windSpeedArray = new ArrayList<>(); // 风速
windDirectionArray = new ArrayList<>(); // 风向
pressureArray = new ArrayList<>(); // 气压
humidityArray = new ArrayList<>(); // 湿度
cloudCoverArray = new ArrayList<>(); // 云量
if (!trs.isEmpty()) {
for (int j = 0; j < trs.size(); j++) { // 循环行
Elements tds = trs.get(j).select("td");
for (int k = 1; k < tds.size(); k++) { // 循环列
Element td = tds.get(k);
String td_text;
if ("wicon".equals(td.className()))
td_text = td.getElementsByTag("img").attr("src");
else
td_text = td.text();
if (j == 0)
hourTimeArray.add(td_text);
if (j == 1)
weatherArray.add(td_text);
if (j == 2)
temperatureArray.add(td_text);
if (j == 3)
precipitationArray.add(td_text);
if (j == 4)
windSpeedArray.add(td_text);
if (j == 5)
windDirectionArray.add(td_text);
if (j == 6)
pressureArray.add(td_text);
if (j == 7)
humidityArray.add(td_text);
if (j == 8)
cloudCoverArray.add(td_text);
}
}
}
int Hous = 0;
for (int y = 0; y < 8; y++) {
PlantPredictedPowerDataEnt dao = new PlantPredictedPowerDataEnt();
dao.setCreateTime(new Date());
dao.setPlantId(plantId);
dao.setHourTime(hourTimeArray.get(y));
dao.setTemperature(new BigDecimal(temperatureArray.get(y).replace("℃", "")));
dao.setWindSpeed(new BigDecimal(windSpeedArray.get(y).replace("m/s", "")));
dao.setWindDirection(new BigDecimal(WindDirection.findByValue(windDirectionArray.get(y)).getValue()));
dao.setPressure(new BigDecimal(pressureArray.get(y).replace("hPa", "")));
dao.setHumidity(new BigDecimal(humidityArray.get(y).replace("%", "")));
//判断小时数与查到的小时数,如果查到的小时数小,判断为第二天
if (Hous >= LocalTime.parse(hourTimeArray.get(y)).getHour()) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, (i + 1));
date = calendar.getTime();
dayTime = sdf.format(date);
}
Hous = LocalTime.parse(hourTimeArray.get(y)).getHour();
dao.setYearTime(LocalDate.parse(dayTime).getYear() + "");
dao.setMonthTime(LocalDate.parse(dayTime).getMonthValue() < 10 ? "0" + LocalDate.parse(dayTime).getMonthValue() : LocalDate.parse(dayTime).getMonthValue() + "");
dao.setDayTime(LocalDate.parse(dayTime).getDayOfMonth() < 10 ? "0" + LocalDate.parse(dayTime).getDayOfMonth() : LocalDate.parse(dayTime).getDayOfMonth() + "");
dao.setHourTime(Hous < 10 ? "0" + Hous : Hous + "");
// 5.执行SQL
mapper.delete(new QueryWrapper<PlantPredictedPowerDataEnt>().lambda().eq(PlantPredictedPowerDataEnt::getPlantId, plantId)
.eq(PlantPredictedPowerDataEnt::getYearTime, dao.getYearTime())
.eq(PlantPredictedPowerDataEnt::getMonthTime, dao.getMonthTime())
.eq(PlantPredictedPowerDataEnt::getDayTime, dao.getDayTime())
.eq(PlantPredictedPowerDataEnt::getHourTime, dao.getHourTime()));
dao.setMinTime("00:00");
dao.setDataDate(dao.getYearTime() + "-" + dao.getMonthTime() + "-" + dao.getDayTime() + " " + dao.getHourTime() + ":" + dao.getMinTime());
PlantPredictedPowerDataEnt insertDao = XCopyUtils.copyNewObject(dao, PlantPredictedPowerDataEnt.class);
allList.add(insertDao);
PlantPredictedPowerDataEnt isExit = objList.stream().filter(item -> item.getYearTime().equals(dao.getYearTime()) &&
item.getMonthTime().equals(dao.getMonthTime()) &&
item.getDayTime().equals(dao.getDayTime()) &&
item.getHourTime().equals(dao.getHourTime())).findFirst().orElse(null);
if (isExit == null)
objList.add(dao);
}
}
// 原站点时间结构为:08:00 11:00 14:00 17:00 20:00 23:00 02:00 05:00
// 两条数据中间差了两个小时,使用上下两条数据推算出中间差掉的两个小时
for (int i = 0; i < objList.size() - 1; i++) {
for (int y = 1; y < 3; y++) {
PlantPredictedPowerDataEnt dao = new PlantPredictedPowerDataEnt();
dao.setCreateTime(new Date());
dao.setPlantId(plantId);
int I_i = i + 1;
BigDecimal temperature_1 = objList.get(i).getTemperature();
BigDecimal temperature_2 = objList.get(I_i).getTemperature();
dao.setTemperature(temperature_1.add(temperature_2.subtract(temperature_1).multiply(new BigDecimal(0.3 * y))));
BigDecimal windspeed_1 = objList.get(i).getWindSpeed();
BigDecimal windspeed_2 = objList.get(I_i).getWindSpeed();
dao.setWindSpeed(windspeed_1.add(windspeed_2.subtract(windspeed_1).multiply(new BigDecimal(0.3 * y))));
dao.setWindDirection(objList.get(i).getWindDirection());
BigDecimal pressure_1 = objList.get(i).getPressure();
BigDecimal pressure_2 = objList.get(I_i).getPressure();
dao.setPressure(pressure_1.add(pressure_2.subtract(pressure_1).multiply(new BigDecimal(0.3 * y))));
BigDecimal humidity_1 = objList.get(i).getHumidity();
BigDecimal humidity_2 = objList.get(I_i).getHumidity();
dao.setHumidity(humidity_1.add(humidity_2.subtract(humidity_1).multiply(new BigDecimal(0.3 * y))));
date = sdf.parse(objList.get(i).getYearTime() + "-" + objList.get(i).getMonthTime() + "-" + objList.get(i).getDayTime());
String Hour;
if (23 == Integer.parseInt(objList.get(i).getHourTime())) {
calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, 1);
date = calendar.getTime();
Hour = "0" + (y - 1);
} else {
if ((Integer.parseInt(objList.get(i).getHourTime()) + y) < 10) {
Hour = "0" + (Integer.parseInt(objList.get(i).getHourTime()) + y);
} else {
Hour = (Integer.parseInt(objList.get(i).getHourTime()) + y) + "";
}
}
dayTime = sdf.format(date);
dao.setYearTime(LocalDate.parse(dayTime).getYear() + "");
dao.setMonthTime(LocalDate.parse(dayTime).getMonthValue() < 10 ? "0" + LocalDate.parse(dayTime).getMonthValue() : LocalDate.parse(dayTime).getMonthValue() + "");
dao.setDayTime(LocalDate.parse(dayTime).getDayOfMonth() < 10 ? "0" + LocalDate.parse(dayTime).getDayOfMonth() : LocalDate.parse(dayTime).getDayOfMonth() + "");
dao.setHourTime(Hour);
// 5.执行SQL
mapper.delete(new LambdaQueryWrapper<PlantPredictedPowerDataEnt>()
.eq(PlantPredictedPowerDataEnt::getPlantId, plantId)
.eq(PlantPredictedPowerDataEnt::getYearTime, dao.getYearTime())
.eq(PlantPredictedPowerDataEnt::getMonthTime, dao.getMonthTime())
.eq(PlantPredictedPowerDataEnt::getDayTime, dao.getDayTime())
.eq(PlantPredictedPowerDataEnt::getHourTime, dao.getHourTime()));
dao.setMinTime("00:00");
dao.setDataDate(dao.getYearTime() + "-" + dao.getMonthTime() + "-" + dao.getDayTime() + " " + dao.getHourTime() + ":" + dao.getMinTime());
PlantPredictedPowerDataEnt insertDao = XCopyUtils.copyNewObject(dao, PlantPredictedPowerDataEnt.class);
allList.add(insertDao);
}
}
List<PlantPredictedPowerDataEnt> batchList = new ArrayList<>();
PlantPredictedPowerDataViewMapper dataViewMapper = context.getBean(PlantPredictedPowerDataViewMapper.class);
List<PlantPredictedPowerDataEnt> sortList = allList.stream().sorted(Comparator.comparing(PlantPredictedPowerDataEnt::getDataDate)).collect(Collectors.toList());
for (int i = 0; i < sortList.size(); i++) {
PlantPredictedPowerDataEnt item = sortList.get(i);
batchList.add(item);
if (i < sortList.size() - 1) {
for (int y = 0; y < timeList.size(); y++) {
PlantPredictedPowerDataEnt dao = XCopyUtils.copyNewObject(item);
dao.setMinTime(timeList.get(y));
dao.setDataDate(dao.getYearTime() + "-" + dao.getMonthTime() + "-" + dao.getDayTime() + " " + dao.getHourTime() + ":" + dao.getMinTime());
int I_i = i + 1;
BigDecimal temperature_1 = sortList.get(i).getTemperature() == null ? new BigDecimal(0) : sortList.get(i).getTemperature();
BigDecimal temperature_2 = sortList.get(I_i).getTemperature() == null ? new BigDecimal(0) : sortList.get(I_i).getTemperature();
dao.setTemperature(temperature_1.add(temperature_2.subtract(temperature_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal humidity_1 = sortList.get(i).getHumidity() == null ? new BigDecimal(0) : sortList.get(i).getHumidity();
BigDecimal humidity_2 = sortList.get(I_i).getHumidity() == null ? new BigDecimal(0) : sortList.get(I_i).getHumidity();
dao.setHumidity(humidity_1.add(humidity_2.subtract(humidity_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal windSpeed_1 = sortList.get(i).getWindSpeed() == null ? new BigDecimal(0) : sortList.get(i).getWindSpeed();
BigDecimal windSpeed_2 = sortList.get(I_i).getWindSpeed() == null ? new BigDecimal(0) : sortList.get(I_i).getWindSpeed();
dao.setWindSpeed(windSpeed_1.add(windSpeed_2.subtract(windSpeed_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal pressure_1 = sortList.get(i).getPressure() == null ? new BigDecimal(0) : sortList.get(i).getPressure();
BigDecimal pressure_2 = sortList.get(I_i).getPressure() == null ? new BigDecimal(0) : sortList.get(I_i).getPressure();
dao.setPressure(pressure_1.add(pressure_2.subtract(pressure_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal planeIrradiance_1 = sortList.get(i).getPlaneIrradiance() == null ? new BigDecimal(0) : sortList.get(i).getPlaneIrradiance();
BigDecimal planeIrradiance_2 = sortList.get(I_i).getPlaneIrradiance() == null ? new BigDecimal(0) : sortList.get(I_i).getPlaneIrradiance();
dao.setPlaneIrradiance(planeIrradiance_1.add(planeIrradiance_2.subtract(planeIrradiance_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal horizontalIrradiance_1 = sortList.get(i).getHorizontalIrradiance() == null ? new BigDecimal(0) : sortList.get(i).getHorizontalIrradiance();
BigDecimal horizontalIrradiance_2 = sortList.get(I_i).getHorizontalIrradiance() == null ? new BigDecimal(0) : sortList.get(I_i).getHorizontalIrradiance();
dao.setHorizontalIrradiance(horizontalIrradiance_1.add(horizontalIrradiance_2.subtract(horizontalIrradiance_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal power_1 = sortList.get(i).getPower() == null ? new BigDecimal(0) : sortList.get(i).getPower();
BigDecimal power_2 = sortList.get(I_i).getPower() == null ? new BigDecimal(0) : sortList.get(I_i).getPower();
dao.setPower(power_1.add(power_2.subtract(power_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
batchList.add(dao);
}
}
if (batchList.size() > 500) {
dataViewMapper.insertBatch(batchList);
batchList = new ArrayList<>();
}
}
if (CollUtil.isNotEmpty(batchList)) {
dataViewMapper.insertBatch(batchList);
}
//训练接口http://127.0.0.1:10098/aiprediction/xgbtrain?plantId=018a64635ac47cf58895147b0e1bf7e3
//自动调用预测接口
XHttpUtils.postAsJson("http://127.0.0.1:10098/aiprediction/xgbreason?plantId=" + plantId);
}
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
}
public static void insertData(XContext context, String provinceCode, String provinceName, String cityCode, String cityName, int runCount) {
String url = "http://weather.cma.cn/web/weather/" + cityCode + ".html";
try {
WeatherDataMapper mapper = context.getBean(WeatherDataMapper.class);
Document document = Jsoup.parse(new URL(url), 30000);
Elements elements = document.getElementsByClass("mt15"); // 获取class name 是‘mt15’的都有元素对象
Element element;
if (elements.isEmpty()) {
return;
} else {
element = elements.get(1); //根据页面结构获取到需要的元素对象
}
Elements tables = element.getElementsByTag("table");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> hourTimeArray;// 时间
List<String> weatherArray; // 天气
List<String> temperatureArray; // 气温
List<String> precipitationArray; // 降水
List<String> windSpeedArray; // 风速
List<String> windDirectionArray; // 风向
List<String> pressureArray; // 气压
List<String> humidityArray;// 湿度
List<String> cloudCoverArray; // 云量
Date date;
Calendar calendar;
String dayTime;
BaseWatherEnt dao;
List<BaseWatherEnt> objList = new ArrayList<>();
if (!tables.isEmpty()) {
for (int i = 0; i < tables.size(); i++) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, i);
date = calendar.getTime();
dayTime = sdf.format(date);
Elements trs = tables.get(i).select("tr");
hourTimeArray = new ArrayList<>(10);// 时间
weatherArray = new ArrayList<>(10); // 天气
temperatureArray = new ArrayList<>(10); // 气温
precipitationArray = new ArrayList<>(10); // 降水
windSpeedArray = new ArrayList<>(10); // 风速
windDirectionArray = new ArrayList<>(10); // 风向
pressureArray = new ArrayList<>(10); // 气压
humidityArray = new ArrayList<>(10); // 湿度
cloudCoverArray = new ArrayList<>(10); // 云量
if (!trs.isEmpty()) {
for (int j = 0; j < trs.size(); j++) { // 循环行
Elements tds = trs.get(j).select("td");
for (int k = 1; k < tds.size(); k++) { // 循环列
Element td = tds.get(k);
String td_text;
if (CharSequenceUtil.equals("wicon", td.className()))
td_text = td.getElementsByTag("img").attr("src");
else
td_text = td.text();
if (j == 0)
hourTimeArray.add(td_text);
if (j == 1)
weatherArray.add(td_text);
if (j == 2)
temperatureArray.add(td_text);
if (j == 3)
precipitationArray.add(td_text);
if (j == 4)
windSpeedArray.add(td_text);
if (j == 5)
windDirectionArray.add(td_text);
if (j == 6)
pressureArray.add(td_text);
if (j == 7)
humidityArray.add(td_text);
if (j == 8)
cloudCoverArray.add(td_text);
}
}
}
int Hous = 0;
for (int y = 0; y < 8; y++) {
dao = new BaseWatherEnt();
dao.setCityCode(cityCode);
dao.setCityName(cityName);
dao.setProvinceCode(provinceCode);
dao.setProvinceName(provinceName);
dao.setHourTime(hourTimeArray.get(y));
dao.setWeather(weatherArray.get(y));
dao.setTemperature(temperatureArray.get(y));
dao.setPrecipitation(precipitationArray.get(y));
dao.setWindSpeed(windSpeedArray.get(y));
dao.setWindDirection(windDirectionArray.get(y));
dao.setPressure(pressureArray.get(y));
dao.setHumidity(humidityArray.get(y));
dao.setCloudCover(cloudCoverArray.get(y));
//由于界面时间为当日8点到第二日5点数据,所以写了下面的判断分支
if (Hous == 0 || Hous <= LocalTime.parse(hourTimeArray.get(y)).getHour()) {
dao.setDayTime(dayTime);
Hous = LocalTime.parse(hourTimeArray.get(y)).getHour();
} else if (2 == LocalTime.parse(hourTimeArray.get(y)).getHour() || 5 == LocalTime.parse(hourTimeArray.get(y)).getHour()) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, (i + 1));
date = calendar.getTime();
dayTime = sdf.format(date);
dao.setDayTime(dayTime);
} else
continue;
// 5.执行SQL
mapper.delete(new LambdaQueryWrapper<BaseWatherEnt>()
.eq(BaseWatherEnt::getProvinceCode, dao.getProvinceCode())
.eq(BaseWatherEnt::getCityCode, dao.getCityCode())
.eq(BaseWatherEnt::getDataDate, dao.getDayTime() + ' ' + dao.getHourTime()));
dao.setDataDate(dao.getDayTime() + ' ' + dao.getHourTime());
mapper.insert(dao);
objList.add(dao);
}
}
// 原站点时间结构为:08:00 11:00 14:00 17:00 20:00 23:00 02:00 05:00
// 两条数据中间差了两个小时,使用上下两条数据推算出中间差掉的两个小时
for (int i = 0; i < objList.size() - 1; i++) {
for (int y = 1; y < 3; y++) {
dao = new BaseWatherEnt();
dao.setCityCode(cityCode);
dao.setCityName(cityName);
dao.setProvinceCode(provinceCode);
dao.setProvinceName(provinceName);
dao.setWeather(objList.get(i).getWeather());
int I_i = i + 1;
double temperature_1 = Double.parseDouble(objList.get(i).getTemperature());
double temperature_2 = Double.parseDouble(objList.get(I_i).getTemperature());
dao.setTemperature((temperature_1 + (temperature_2 - temperature_1) * (0.3 * y)) + "℃");
dao.setPrecipitation(objList.get(i).getPrecipitation());
double windspeed_1 = Double.parseDouble(objList.get(i).getWindSpeed());
double windspeed_2 = Double.parseDouble(objList.get(I_i).getWindSpeed());
dao.setWindSpeed((windspeed_1 + (windspeed_2 - windspeed_1) * (0.3 * y)) + "m/s");
dao.setWindDirection(objList.get(i).getWindDirection());
double pressure_1 = Double.parseDouble(objList.get(i).getPressure());
double pressure_2 = Double.parseDouble(objList.get(I_i).getPressure());
dao.setPressure((pressure_1 + (pressure_2 - pressure_1) * (0.3 * y)) + "hPa");
double humidity_1 = Double.parseDouble(objList.get(i).getHumidity());
double humidity_2 = Double.parseDouble(objList.get(I_i).getHumidity());
dao.setHumidity((humidity_1 + (humidity_2 - humidity_1) * (0.3 * y)) + "%");
double cloudcover_1 = Double.parseDouble(objList.get(i).getCloudCover());
double cloudcover_2 = Double.parseDouble(objList.get(I_i).getCloudCover());
dao.setCloudCover((cloudcover_1 + (cloudcover_2 - cloudcover_1) * (0.3 * y)) + "%");
if (23 == LocalTime.parse(objList.get(i).getHourTime()).getHour()) {
date = sdf.parse(objList.get(i).getDayTime());
calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date tomorrow = calendar.getTime();
dao.setDayTime(sdf.format(tomorrow));
dao.setHourTime("0" + (y - 1) + ":00:00");
} else {
dao.setDayTime(objList.get(i).getDayTime());
String Hour;
if ((LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) < 10) {
Hour = "0" + (LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) + ":00:00";
} else {
Hour = (LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) + ":00:00";
}
dao.setHourTime(Hour);
}
// 5.执行SQL
mapper.delete(new LambdaQueryWrapper<BaseWatherEnt>().eq(BaseWatherEnt::getProvinceCode, dao.getProvinceCode())
.eq(BaseWatherEnt::getCityCode, dao.getCityCode())
.eq(BaseWatherEnt::getDataDate, dao.getDayTime() + ' ' + dao.getHourTime()));
dao.setDataDate(dao.getDayTime() + ' ' + dao.getHourTime());
mapper.insert(dao);
}
}
}
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
}
@Override
@XApiGet
public XServiceResult crawlPlantBaseWatherData(XContext context) {
try {
//1.获取电站数据,并根据电站数据,获取到电站所在城市,然后获取到天气数据
BasePhotovoltaicPlantViewMapper mapper = context.getBean(BasePhotovoltaicPlantViewMapper.class);
BasePhotovoltaicPlantView view = new BasePhotovoltaicPlantView();
view.setIsDeleted(BusinessConstant.ONE);
List<BasePhotovoltaicPlantView> plantList = mapper.selectPlantDetailList(view);
for (BasePhotovoltaicPlantView item : plantList) {
if (CharSequenceUtil.isAllNotBlank(item.getCityCode(), item.getProvinceCode())) {
insertData(context, item.getId(), item.getProvinceCode(), item.getCityCode(), 1);
}
}
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
return XServiceResult.OK;
}
@Override
public XServiceResult crawlBaseWatherData(XContext context) {
try {
//请求省份接口。获取省份列表
String provinceStr = XHttpUtils.postAsJson(provinceUrl);
//解析省份列表字符串,把字符串解析成json对象
JSONObject jsonObject = JSONObject.parseObject(provinceStr);
//处理json对象,变为数组
String[] provinceList = CharSequenceUtil.splitToArray(jsonObject.getString("data"), '|');
for (String proStr : provinceList) {
if (CharSequenceUtil.isNotBlank(proStr)) {
String[] pro = CharSequenceUtil.splitToArray(proStr, ',');
String provinceCode = pro[0];//省编码
String provinceName = pro[1];//省名称
//甘肃 .陕西 (全国周期抓取耗费时间超长,共有2400个城市)
if (CharSequenceUtil.equals(provinceCode, "AJL")) {
//请求省份下的区信息
String cityString = XHttpUtils.postAsJson(cityUrl + provinceCode);
//解析区json,把字符串解析成json对象
JSONObject cityObj = JSONObject.parseObject(cityString);
//处理json对象,变为数组
String[] cityList = CharSequenceUtil.splitToArray(cityObj.getString("data"), '|');
for (String cityStr : cityList) {
if (CharSequenceUtil.isNotBlank(cityStr)) {
String[] city = CharSequenceUtil.splitToArray(cityStr, ',');
String cityCode = city[0];//区编码
String cityName = city[1];//区名称
XThreadHelper.async(() -> insertData(context, provinceCode, provinceName, cityCode, cityName, 1));
}
}
}
}
}
} catch (Exception e) {
context.getLogger().error(e);
}
return XServiceResult.OK;
}
@Override
public XServiceResult crawlBaseWatherDataByCityCode(XContext context, CrawlBaseWatherInput input) {
insertData(context, input.getProvinceCode(), input.getProvinceName(), input.getCityCode(), input.getCityName(), 1);
return XServiceResult.OK;
}
@XApiGet
public XServiceResult crawlPlantBaseWatherDataTest(XContext context) {
crawlPlantBaseWatherData(context);
return XServiceResult.OK;
}
}
\ No newline at end of file
package pps.core.base.service;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import pps.core.base.entity.BaseWatherEnt;
import pps.core.base.mapper.WeatherDataMapper;
import pps.core.base.service.data.base_wather.GetBaseWatherInput;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.base.util.XHttpUtils;
import xstartup.core.base.helper.XThreadHelper;
import xstartup.data.XServiceResult;
import xstartup.feature.api.annotation.XApiGet;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@XService
public class BaseWatherService {
public static void insertData(XContext context, String provinceCode, String provinceName, String cityCode, String cityName, int runCount) {
String url = "http://weather.cma.cn/web/weather/" + cityCode + ".html";
try {
WeatherDataMapper mapper = context.getBean(WeatherDataMapper.class);
Document document = Jsoup.parse(new URL(url), 30000);
Elements elements = document.getElementsByClass("mt15"); // 获取class name 是‘mt15’的都有元素对象
Element element;
if (elements.isEmpty()) {
return;
} else {
element = elements.get(1); //根据页面结构获取到需要的元素对象
}
Elements tables = element.getElementsByTag("table");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<String> hourTimeArray;// 时间
List<String> weatherArray; // 天气
List<String> temperatureArray; // 气温
List<String> precipitationArray; // 降水
List<String> windSpeedArray; // 风速
List<String> windDirectionArray; // 风向
List<String> pressureArray; // 气压
List<String> humidityArray;// 湿度
List<String> cloudCoverArray; // 云量
Date date;
Calendar calendar;
String dayTime;
BaseWatherEnt dao;
List<BaseWatherEnt> objList = new ArrayList<>();
if (!tables.isEmpty()) {
for (int i = 0; i < tables.size(); i++) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, i);
date = calendar.getTime();
dayTime = sdf.format(date);
Elements trs = tables.get(i).select("tr");
hourTimeArray = new ArrayList<>();// 时间
weatherArray = new ArrayList<>(); // 天气
temperatureArray = new ArrayList<>(); // 气温
precipitationArray = new ArrayList<>(); // 降水
windSpeedArray = new ArrayList<>(); // 风速
windDirectionArray = new ArrayList<>(); // 风向
pressureArray = new ArrayList<>(); // 气压
humidityArray = new ArrayList<>(); // 湿度
cloudCoverArray = new ArrayList<>(); // 云量
if (!trs.isEmpty()) {
for (int j = 0; j < trs.size(); j++) { // 循环行
Elements tds = trs.get(j).select("td");
for (int k = 1; k < tds.size(); k++) { // 循环列
Element td = tds.get(k);
String td_text;
if ("wicon".equals(td.className()))
td_text = td.getElementsByTag("img").attr("src");
else
td_text = td.text();
if (j == 0)
hourTimeArray.add(td_text);
if (j == 1)
weatherArray.add(td_text);
if (j == 2)
temperatureArray.add(td_text);
if (j == 3)
precipitationArray.add(td_text);
if (j == 4)
windSpeedArray.add(td_text);
if (j == 5)
windDirectionArray.add(td_text);
if (j == 6)
pressureArray.add(td_text);
if (j == 7)
humidityArray.add(td_text);
if (j == 8)
cloudCoverArray.add(td_text);
}
}
}
int Hous = 0;
for (int y = 0; y < 8; y++) {
dao = new BaseWatherEnt();
dao.setCityCode(cityCode);
dao.setCityName(cityName);
dao.setProvinceCode(provinceCode);
dao.setProvinceName(provinceName);
dao.setHourTime(hourTimeArray.get(y));
dao.setWeather(weatherArray.get(y));
dao.setTemperature(temperatureArray.get(y));
dao.setPrecipitation(precipitationArray.get(y));
dao.setWindSpeed(windSpeedArray.get(y));
dao.setWindDirection(windDirectionArray.get(y));
dao.setPressure(pressureArray.get(y));
dao.setHumidity(humidityArray.get(y));
dao.setCloudCover(cloudCoverArray.get(y));
//由于界面时间为当日8点到第二日5点数据,所以写了下面的判断分支
if (Hous == 0 || Hous <= LocalTime.parse(hourTimeArray.get(y)).getHour()) {
dao.setDayTime(dayTime);
Hous = LocalTime.parse(hourTimeArray.get(y)).getHour();
} else if (2 == LocalTime.parse(hourTimeArray.get(y)).getHour() || 5 == LocalTime.parse(hourTimeArray.get(y)).getHour()) {
calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, (i + 1));
date = calendar.getTime();
dayTime = sdf.format(date);
dao.setDayTime(dayTime);
} else
continue;
// 5.执行SQL
mapper.delete(new LambdaQueryWrapper<BaseWatherEnt>().eq(BaseWatherEnt::getProvinceCode, dao.getProvinceCode())
.eq(BaseWatherEnt::getCityCode, dao.getCityCode())
.eq(BaseWatherEnt::getDataDate, dao.getDayTime() + ' ' + dao.getHourTime()));
dao.setDataDate(dao.getDayTime() + ' ' + dao.getHourTime());
mapper.insert(dao);
objList.add(dao);
}
}
// 原站点时间结构为:08:00 11:00 14:00 17:00 20:00 23:00 02:00 05:00
// 两条数据中间差了两个小时,使用上下两条数据推算出中间差掉的两个小时
for (int i = 0; i < objList.size() - 1; i++) {
for (int y = 1; y < 3; y++) {
dao = new BaseWatherEnt();
dao.setCityCode(cityCode);
dao.setCityName(cityName);
dao.setProvinceCode(provinceCode);
dao.setProvinceName(provinceName);
dao.setWeather(objList.get(i).getWeather());
int I_i = i + 1;
double temperature_1 = Double.parseDouble(objList.get(i).getTemperature());
double temperature_2 = Double.parseDouble(objList.get(I_i).getTemperature());
dao.setTemperature((temperature_1 + (temperature_2 - temperature_1) * (0.3 * y)) + "℃");
dao.setPrecipitation(objList.get(i).getPrecipitation());
double windspeed_1 = Double.parseDouble(objList.get(i).getWindSpeed());
double windspeed_2 = Double.parseDouble(objList.get(I_i).getWindSpeed());
dao.setWindSpeed((windspeed_1 + (windspeed_2 - windspeed_1) * (0.3 * y)) + "m/s");
dao.setWindDirection(objList.get(i).getWindDirection());
double pressure_1 = Double.parseDouble(objList.get(i).getPressure());
double pressure_2 = Double.parseDouble(objList.get(I_i).getPressure());
dao.setPressure((pressure_1 + (pressure_2 - pressure_1) * (0.3 * y)) + "hPa");
double humidity_1 = Double.parseDouble(objList.get(i).getHumidity());
double humidity_2 = Double.parseDouble(objList.get(I_i).getHumidity());
dao.setHumidity((humidity_1 + (humidity_2 - humidity_1) * (0.3 * y)) + "%");
double cloudcover_1 = Double.parseDouble(objList.get(i).getCloudCover());
double cloudcover_2 = Double.parseDouble(objList.get(I_i).getCloudCover());
dao.setCloudCover((cloudcover_1 + (cloudcover_2 - cloudcover_1) * (0.3 * y)) + "%");
if (23 == LocalTime.parse(objList.get(i).getHourTime()).getHour()) {
date = sdf.parse(objList.get(i).getDayTime());
calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, 1);
Date tomorrow = calendar.getTime();
dao.setDayTime(sdf.format(tomorrow));
dao.setHourTime("0" + (y - 1) + ":00:00");
} else {
dao.setDayTime(objList.get(i).getDayTime());
String Hour;
if ((LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) < 10) {
Hour = "0" + (LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) + ":00:00";
} else {
Hour = (LocalTime.parse(objList.get(i).getHourTime()).getHour() + y) + ":00:00";
}
dao.setHourTime(Hour);
}
// 5.执行SQL
mapper.delete(new LambdaQueryWrapper<BaseWatherEnt>()
.eq(BaseWatherEnt::getProvinceCode, dao.getProvinceCode())
.eq(BaseWatherEnt::getCityCode, dao.getCityCode())
.eq(BaseWatherEnt::getDataDate, dao.getDayTime() + ' ' + dao.getHourTime()));
dao.setDataDate(dao.getDayTime() + ' ' + dao.getHourTime());
mapper.insert(dao);
}
}
}
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
}
@XApiGet
public XServiceResult crawlBaseWeaterData(XContext context, GetBaseWatherInput input) {
try {
String provinceUrl = "http://weather.cma.cn/api/dict/province";
String cityUrl = "http://weather.cma.cn/api/dict/province/";
//请求省份接口。获取省份列表
String provinceStr = XHttpUtils.postAsJson(provinceUrl);
//解析省份列表字符串,把字符串解析成json对象
JSONObject jsonObject = JSONObject.parseObject(provinceStr);
//处理json对象,变为数组
String[] provinceList = CharSequenceUtil.splitToArray(jsonObject.getString("data"), '|');
for (String proStr : provinceList) {
if (CharSequenceUtil.isNotBlank(proStr)) {
String[] pro = CharSequenceUtil.splitToArray(proStr, ',');
String provinceCode = pro[0];//省编码
String provinceName = pro[1];//省名称
//甘肃 .陕西 (全国周期抓取耗费时间超长,共有2400个城市)
if (CharSequenceUtil.equals(provinceCode, "AJL")) {
//请求省份下的区信息
String cityString = XHttpUtils.postAsJson(provinceUrl + provinceCode);
//解析区json,把字符串解析成json对象
JSONObject cityObj = JSONObject.parseObject(cityString);
//处理json对象,变为数组
String[] cityList = CharSequenceUtil.splitToArray(cityObj.getString("data"), '|');
for (String cityStr : cityList) {
if (CharSequenceUtil.isNotBlank(cityStr)) {
String[] city = CharSequenceUtil.splitToArray(cityStr, ',');
String cityCode = city[0];//区编码
String cityName = city[1];//区名称
XThreadHelper.async(() -> insertData(context, provinceCode, provinceName, cityCode, cityName, 1));
}
}
}
}
}
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
return XServiceResult.OK;
}
@XApiGet
public XServiceResult crawlBaseWeaterDataByCityCode(XContext context, GetBaseWatherInput input) {
insertData(context, "ASN", "陕西", "57022", "麟游", 1);
return XServiceResult.OK;
}
}
\ No newline at end of file
...@@ -208,7 +208,12 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -208,7 +208,12 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
dateTime = DateUtil.date(dailyData.getDateTime()); dateTime = DateUtil.date(dailyData.getDateTime());
for (int i = 0; i < 8; i++) { for (int i = 0; i < 8; i++) {
int hour = LocalTime.parse(dailyData.getHourTimeArray().get(i)).getHour(); int hour = LocalTime.parse(dailyData.getHourTimeArray().get(i)).getHour();
DateTime parse = DateUtil.parse(DateUtil.formatDate(dateTime) + ' ' + this.int2Str(hour) + ':' + BusinessConstant.START_OF_DAY_TIME); DateTime parse = DateUtil.parse(String.format(
"%s %s:%s",
DateUtil.formatDate(dateTime),
this.int2Str(hour),
BusinessConstant.START_OF_DAY_TIME
));
if (DateUtil.compare(parse, dateTime) < 0 && flag == 0) { if (DateUtil.compare(parse, dateTime) < 0 && flag == 0) {
parse = DateUtil.offsetDay(parse, 1); parse = DateUtil.offsetDay(parse, 1);
dateTime = DateUtil.offsetDay(dateTime, 1); dateTime = DateUtil.offsetDay(dateTime, 1);
...@@ -389,7 +394,12 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -389,7 +394,12 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
} }
//判断小时数与查到的小时数,如果查到的小时数小,判断为第二天 //判断小时数与查到的小时数,如果查到的小时数小,判断为第二天
int hour = LocalTime.parse(dailyData.getHourTimeArray().get(i)).getHour(); int hour = LocalTime.parse(dailyData.getHourTimeArray().get(i)).getHour();
DateTime parse = DateUtil.parse(DateUtil.formatDate(dateTime) + ' ' + this.int2Str(hour) + ':' + BusinessConstant.START_OF_DAY_TIME); DateTime parse = DateUtil.parse(String.format(
"%s %s:%s",
DateUtil.formatDate(dateTime),
this.int2Str(hour),
BusinessConstant.START_OF_DAY_TIME
));
if (hour == 23) { if (hour == 23) {
nextDay = true; nextDay = true;
} else { } else {
......
package pps.cloud.prediction.service;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
@XService
@XText("光伏预测长期")
public interface PlantPredictedPowerLongTermDataCloudService {
@XText("定时运行预测长期数据")
XServiceResult runPlantPredictedPowerLongTermData(XContext context);
}
\ No newline at end of file
package pps.core.prediction.service;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.cloud.base.service.data.base_photovoltaic_plant.GetBasePhotovoltaicPlantCloudInput;
import pps.cloud.base.service.data.base_photovoltaic_plant.GetBasePhotovoltaicPlantCloudOutput;
import pps.cloud.prediction.service.PlantPredictedPowerLongTermDataCloudService;
import pps.core.prediction.entity.PlantPowerDataEnt;
import pps.core.prediction.entity.PlantPredictedPowerLongTermDataEnt;
import pps.core.prediction.mapper.PlantPowerDataMapper;
import pps.core.prediction.mapper.PlantPredictedPowerLongTermDataMapper;
import pps.core.prediction.mapper.PlantPredictedPowerLongTermDataViewMapper;
import pps.core.prediction.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XServiceResult;
import xstartup.feature.api.annotation.XApiGet;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
/**
* 光伏预测Cloud模块
*
* @author ZWT
* @date 2023/09/13 19:05
*/
@XService
public class PlantPredictedPowerLongTermDataCloudServiceImpl implements PlantPredictedPowerLongTermDataCloudService {
@Override
@XApiGet
@XText("定时运行预测长期数据")
public XServiceResult runPlantPredictedPowerLongTermData(XContext context) {
//获取所有的电站
List<GetBasePhotovoltaicPlantCloudOutput> list = ServiceUtil.getBasePhotovoltaicPlantList(context, new GetBasePhotovoltaicPlantCloudInput());
PlantPowerDataMapper powerDataMapper = context.getBean(PlantPowerDataMapper.class);
Date currentDate = new Date();
for (GetBasePhotovoltaicPlantCloudOutput output : list) {
//获取最近七天的实际数据
QueryWrapper<PlantPowerDataEnt> queryWrapper = new QueryWrapper<>();
queryWrapper.select("IFNULL(avg(power ) , 0 ) power")
.lambda()
.eq(PlantPowerDataEnt::getPlantId, output.getId())
.ge(PlantPowerDataEnt::getDataDate, DateUtil.offsetDay(currentDate, -7));
PlantPowerDataEnt currentEnt = powerDataMapper.selectOne(queryWrapper);
//获取同期七天的实际数据
queryWrapper.clear();
queryWrapper.select("IFNULL(avg(power ) , 0 ) power")
.lambda()
.eq(PlantPowerDataEnt::getPlantId, output.getId())
.ge(PlantPowerDataEnt::getDataDate, DateUtil.offset(currentDate, DateField.YEAR, -1));
PlantPowerDataEnt lastEnt = powerDataMapper.selectOne(queryWrapper);
//获取同比 = 当前/同期
BigDecimal compare = new BigDecimal(1);
if (lastEnt.getPower().compareTo(BigDecimal.ZERO) > 0 && currentEnt.getPower().compareTo(BigDecimal.ZERO) != 0) {
compare = currentEnt.getPower().divide(lastEnt.getPower(), 6, RoundingMode.HALF_UP);
}
//获取同期30天数据
queryWrapper.clear();
queryWrapper.select("plant_id, data_date, temperature, humidity, wind_speed, wind_direction, pressure, plane_irradiance, horizontal_irradiance, power");
queryWrapper.lambda()
.eq(PlantPowerDataEnt::getPlantId, output.getId())
.ge(PlantPowerDataEnt::getDataDate, DateUtil.offset(currentDate, DateField.YEAR, -1))
.le(PlantPowerDataEnt::getDataDate, DateUtil.offsetMonth(currentDate, -11));
List<PlantPowerDataEnt> lastList = powerDataMapper.selectList(queryWrapper);
//未来30天=同期30*同比
List<PlantPredictedPowerLongTermDataEnt> insertList = new ArrayList<>();
for (PlantPowerDataEnt item : lastList) {
item.setPower(item.getPower().multiply(compare));
item.setDataDate(DateUtil.formatDate(DateUtil.offset(DateUtil.parseDateTime(item.getDataDate()), DateField.YEAR, 1)));
PlantPredictedPowerLongTermDataEnt insertData = XCopyUtils.copyNewObject(item, PlantPredictedPowerLongTermDataEnt.class);
insertData.setCreateTime(currentDate);
insertList.add(insertData);
}
//插入数据前,先删除数据
PlantPredictedPowerLongTermDataMapper longTermDataMapper = context.getBean(PlantPredictedPowerLongTermDataMapper.class);
longTermDataMapper.delete(new QueryWrapper<PlantPredictedPowerLongTermDataEnt>().lambda()
.eq(PlantPredictedPowerLongTermDataEnt::getPlantId, output.getId())
.ge(PlantPredictedPowerLongTermDataEnt::getDataDate, currentDate)
.le(PlantPredictedPowerLongTermDataEnt::getDataDate, DateUtil.offsetMonth(currentDate, 1)));
PlantPredictedPowerLongTermDataViewMapper longTermDataViewMapper = context.getBean(PlantPredictedPowerLongTermDataViewMapper.class);
List<PlantPredictedPowerLongTermDataEnt> batchList = new ArrayList<>();
List<String> timeList = Arrays.asList("15", "30", "45");
for (int i = 0; i < insertList.size(); i++) {
PlantPredictedPowerLongTermDataEnt item = insertList.get(i);
DateTime dateTime = DateUtil.parseDateTime(item.getDataDate());
item.setYearTime(dateTime.year() + "");
item.setMonthTime(String.format("%02d", dateTime.monthBaseOne()));
item.setDayTime(String.format("%02d", dateTime.dayOfMonth()));
item.setHourTime(String.format("%02d", dateTime.hour(true)));
item.setMinTime(String.format("%02d", dateTime.minute() + ":00"));
batchList.add(item);
if (i < insertList.size() - 1) {
for (int y = 0; y < timeList.size(); y++) {
PlantPredictedPowerLongTermDataEnt dao = XCopyUtils.copyNewObject(item);
dao.setMinTime(timeList.get(y) + ":00");
dao.setDataDate(dao.getYearTime() + "-" + dao.getMonthTime() + "-" + dao.getDayTime() + " " + dao.getHourTime() + ":" + dao.getMinTime());
int I_i = i + 1;
BigDecimal temperature_1 = insertList.get(i).getTemperature() == null ? new BigDecimal(0) : insertList.get(i).getTemperature();
BigDecimal temperature_2 = insertList.get(I_i).getTemperature() == null ? new BigDecimal(0) : insertList.get(I_i).getTemperature();
dao.setTemperature(temperature_1.add(temperature_2.subtract(temperature_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal humidity_1 = insertList.get(i).getHumidity() == null ? new BigDecimal(0) : insertList.get(i).getHumidity();
BigDecimal humidity_2 = insertList.get(I_i).getHumidity() == null ? new BigDecimal(0) : insertList.get(I_i).getHumidity();
dao.setHumidity(humidity_1.add(humidity_2.subtract(humidity_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal windSpeed_1 = insertList.get(i).getWindSpeed() == null ? new BigDecimal(0) : insertList.get(i).getWindSpeed();
BigDecimal windSpeed_2 = insertList.get(I_i).getWindSpeed() == null ? new BigDecimal(0) : insertList.get(I_i).getWindSpeed();
dao.setWindSpeed(windSpeed_1.add(windSpeed_2.subtract(windSpeed_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal pressure_1 = insertList.get(i).getPressure() == null ? new BigDecimal(0) : insertList.get(i).getPressure();
BigDecimal pressure_2 = insertList.get(I_i).getPressure() == null ? new BigDecimal(0) : insertList.get(I_i).getPressure();
dao.setPressure(pressure_1.add(pressure_2.subtract(pressure_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal planeIrradiance_1 = insertList.get(i).getPlaneIrradiance() == null ? new BigDecimal(0) : insertList.get(i).getPlaneIrradiance();
BigDecimal planeIrradiance_2 = insertList.get(I_i).getPlaneIrradiance() == null ? new BigDecimal(0) : insertList.get(I_i).getPlaneIrradiance();
dao.setPlaneIrradiance(planeIrradiance_1.add(planeIrradiance_2.subtract(planeIrradiance_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal horizontalIrradiance_1 = insertList.get(i).getHorizontalIrradiance() == null ? new BigDecimal(0) : insertList.get(i).getHorizontalIrradiance();
BigDecimal horizontalIrradiance_2 = insertList.get(I_i).getHorizontalIrradiance() == null ? new BigDecimal(0) : insertList.get(I_i).getHorizontalIrradiance();
dao.setHorizontalIrradiance(horizontalIrradiance_1.add(horizontalIrradiance_2.subtract(horizontalIrradiance_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
BigDecimal power_1 = insertList.get(i).getPower() == null ? new BigDecimal(0) : insertList.get(i).getPower();
BigDecimal power_2 = insertList.get(I_i).getPower() == null ? new BigDecimal(0) : insertList.get(I_i).getPower();
dao.setPower(power_1.add(power_2.subtract(power_1).multiply(BigDecimal.valueOf(0.3 * (y + 1)))));
batchList.add(dao);
}
}
if (batchList.size() > 500) {
longTermDataViewMapper.insertBatch(batchList);
batchList = new ArrayList<>();
}
}
if (!batchList.isEmpty())
longTermDataViewMapper.insertBatch(batchList);
}
return XServiceResult.OK;
}
}
\ 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