Commit 1df7399c authored by ZWT's avatar ZWT

feat(吉林演示): 松原

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

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent a262448d
package pps.core.auth;
/**
* 基础认证Auth
*
* @author ZWT
* @date 2023/01/09
*/
public interface Auth {
/**
* 基础认证Auth
*
* @return {@link String}
*/
String getAuth();
}
\ No newline at end of file
package pps.core.auth;
import org.apache.commons.codec.binary.Base64;
import java.nio.charset.StandardCharsets;
/**
* 用户名密码认证
*
* @author ZWT
* @date 2023/01/09
*/
public class BasicAuth implements Auth {
private String username;
private String password;
public BasicAuth(String username, String password) {
this.username = username;
this.password = password;
}
@Override
public String getAuth() {
String auth = String.format("%s:%s", this.username, this.password);
byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.ISO_8859_1));
return "Basic " + new String(encodedAuth);
}
}
\ No newline at end of file
package pps.core.auth;
/**
* Bearer Token 认证
*
* @author ZWT
* @date 2023/01/09
*/
public class BearerAuth implements Auth {
private String token;
public BearerAuth(String token) {
this.token = token;
}
@Override
public String getAuth() {
return "Bearer " + this.token;
}
}
\ No newline at end of file
package pps.core.auth;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.http.HttpMethod;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.IOException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* http请求客户端
*
* @author ZWT
* @date 2023/01/09
*/
@Slf4j
public class HttpRequestClient {
/**
* 默认连接超时(10s)
*/
private static final int DEFAULT_CONNECT_TIMEOUT = 30_000;
/**
* 默认读取超时(10s)
*/
private static final int DEFAULT_READ_TIMEOUT = 30_000;
/**
* 身份验证
*/
private Auth auth;
/**
* http客户端
*/
private HttpClient httpClient;
/**
* 用户名密码认证,默认的超时时间(10s)
*
* @param username 用户名
* @param password
* @param httpsFlag
*/
public HttpRequestClient(String username, String password, boolean httpsFlag) throws NoSuchAlgorithmException, KeyManagementException {
this(username, password,
DEFAULT_CONNECT_TIMEOUT,
DEFAULT_READ_TIMEOUT,
httpsFlag
);
}
/**
* 用户名密码认证,自定义超时时间
*
* @param username 用户名
* @param password
* @param connectTimeout
* @param readTimeout
* @param httpsFlag
*/
public HttpRequestClient(String username, String password, int connectTimeout, int readTimeout, boolean httpsFlag) throws NoSuchAlgorithmException, KeyManagementException {
this.auth = new BasicAuth(username, password);
HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
httpClientBuilder.setDefaultRequestConfig(getRequestConfig(connectTimeout, readTimeout));
if (httpsFlag) {
httpClientBuilder.setSSLSocketFactory(this.createIgnoreVerifySSL());
}
this.httpClient = httpClientBuilder.build();
}
/**
* BearerToken 认证,默认的超时时间(10s)
*
* @param bearerToken
*/
public HttpRequestClient(String bearerToken) {
this(bearerToken,
DEFAULT_CONNECT_TIMEOUT,
DEFAULT_READ_TIMEOUT
);
}
/**
* BearerToken 认证,自定义超时时间
*
* @param bearerToken 不记名令牌
* @param connectTimeout 连接超时
* @param readTimeout 读取超时
*/
public HttpRequestClient(String bearerToken, int connectTimeout, int readTimeout) {
this.auth = new BearerAuth(bearerToken);
this.httpClient = HttpClientBuilder.create()
.setDefaultRequestConfig(getRequestConfig(connectTimeout, readTimeout))
.build();
}
/**
* 设置 HTTP 请求超时时间
*
* @param connectTimeout tcp 连接超时时间
* @param readTimeout 读取数据超时时间
* @return {@link RequestConfig }
*/
private RequestConfig getRequestConfig(int connectTimeout, int readTimeout) {
return RequestConfig.custom()
.setConnectTimeout(connectTimeout)
.setConnectionRequestTimeout(connectTimeout)
.setSocketTimeout(readTimeout)
.build();
}
/**
* 发送 GET 请求,不带参数
*
* @param url url
* @return {@link String }
*/
public String doGet(String url) {
return doGet(url, new HashMap<>());
}
/**
* 发送 GET 请求,不带参数
*
* @param uri
* @return {@link String }
*/
public String doGet(URI uri) {
return doGet(uri, new HashMap<>());
}
/**
* 发送 GET 请求,K-V 形式参数
*
* @param url url
* @param params 参数个数
* @return {@link String}
*/
public String doGet(String url, Map<String, String> params) {
RequestBuilder reqBuilder = RequestBuilder.get(url);
return doGet(reqBuilder, params);
}
/**
* 发送 GET 请求,K-V 形式参数
*
* @param uri
* @param params
* @return {@link String }
*/
public String doGet(URI uri, Map<String, String> params) {
RequestBuilder reqBuilder = RequestBuilder.get(uri);
return doGet(reqBuilder, params);
}
/**
* 发送 GET 请求,不带参数,返回指定类型的 class
*
* @param url url
* @param responseType 响应类型
* @return {@link T}
*/
public <T> T getForObject(String url, Class<T> responseType) {
RequestBuilder reqBuilder = RequestBuilder.get(url);
return getForObject(reqBuilder, responseType);
}
/**
* 发送 GET 请求,不带参数,返回指定类型的 class
*
* @param uri uri
* @param responseType 响应类型
* @return {@link T}
*/
public <T> T getForObject(URI uri, Class<T> responseType) {
RequestBuilder reqBuilder = RequestBuilder.get(uri);
return getForObject(reqBuilder, responseType);
}
/**
* 发送 GET 请求,不带参数,返回指定类型的 class(需要认证)
*
* @param reqBuilder 构造器
* @param responseType 响应类型
* @return {@link T}
*/
public <T> T getForObject(RequestBuilder reqBuilder, Class<T> responseType) {
reqBuilder.addHeader(HttpHeaders.AUTHORIZATION, auth.getAuth());
try {
HttpResponse resp = httpClient.execute(reqBuilder.build());
String result = EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8);
return JSONUtil.toBean(result, responseType);
} catch (IOException e) {
log.error("getForObject 异常: reqBuilder={}, responseType={}", reqBuilder, responseType, e);
return null;
}
}
/**
* 发送 POST 请求,JSON 形式
*
* @param url
* @param json json字符串
* @return {@link String }
*/
public String doPost(String url, String json) {
try {
HttpResponse resp = this.exchange(HttpMethod.POST, url, json);
if (ObjectUtil.isNull(resp)) {
log.error("doPost resp is null : url={}", url);
return null;
}
return EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8);
} catch (IOException e) {
log.error("doPost 异常: url={}, json={}", url, json, e);
return null;
}
}
/**
* 发送 POST 请求,x-www-form-urlencoded 形式
*
* @param url
* @param param 参数
* @return {@link String}
*/
public String doPostForm(String url, Map<String, Object> param) {
try {
HttpResponse resp = this.exchangeForm(url, param);
if (ObjectUtil.isNull(resp)) {
log.error("doPost resp is null : url={}", url);
return null;
}
return EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8);
} catch (IOException e) {
log.error("doPost form 异常: url={}", url, e);
return null;
}
}
/**
* 发送 POST 请求,JSON 形式,返回 HttpResponse
*
* @param url
* @param json json字符串
* @return {@link HttpResponse }
*/
public HttpResponse doPostResp(String url, String json) {
return this.exchange(HttpMethod.POST, url, json);
}
/**
* 发送 PUT 请求,JSON 形式
*
* @param url
* @param json json字符串
* @return {@link HttpResponse }
*/
public HttpResponse doPut(String url, String json) {
return this.exchange(HttpMethod.PUT, url, json);
}
/**
* 发送 PUT 请求,JSON 形式
*
* @param url
* @param json json字符串
* @return {@link HttpResponse }
*/
public HttpResponse doDelete(String url, String json) {
return this.exchange(HttpMethod.DELETE, url, json);
}
/*---------------------------------------私有方法---------------------------------------*/
/**
* 发送请求POST x-www-form-urlencoded
*
* @param url
* @param param 参数
* @return {@link HttpResponse}
*/
private HttpResponse exchangeForm(String url, Map<String, Object> param) {
List<NameValuePair> params = new ArrayList<>();
for (Map.Entry<String, Object> entry : param.entrySet()) {
params.add(new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue())));
}
try {
String authString = auth.getAuth();
RequestBuilder reqBuilder = RequestBuilder.create(HttpMethod.POST.toString())
.setUri(url)
.addHeader(HttpHeaders.AUTHORIZATION, authString)
.addHeader("Content-Type", ContentType.APPLICATION_FORM_URLENCODED.toString());
log.info("exchangeForm,接口地址:{}", url);
log.info("exchangeForm,认证头:{} {}", HttpHeaders.AUTHORIZATION, authString);
log.info("exchangeForm,认证头:{} {}", "Content-Type", ContentType.APPLICATION_FORM_URLENCODED);
reqBuilder.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
return httpClient.execute(reqBuilder.build());
} catch (IOException e) {
log.error("doPost form 异常: url={}", url, e);
return null;
}
}
/**
* 发送请求
*
* @param method 方法
* @param url url
* @param json json
* @return {@link HttpResponse}
*/
private HttpResponse exchange(HttpMethod method, String url, String json) {
RequestBuilder reqBuilder = RequestBuilder.create(method.toString())
.setUri(url)
.addHeader(HttpHeaders.AUTHORIZATION, auth.getAuth())
.addHeader("Accept", ContentType.APPLICATION_JSON.toString())
.addHeader("Content-type", ContentType.APPLICATION_JSON.toString());
if (CharSequenceUtil.isNotBlank(json)) {
reqBuilder.setEntity(new StringEntity(json, ContentType.APPLICATION_JSON));
}
try {
return httpClient.execute(reqBuilder.build());
} catch (IOException e) {
log.error("doPost 异常: url={}, json={}", url, json, e);
return null;
}
}
/**
* 发送get请求
*
* @param reqBuilder 构造器
* @param params 参数
* @return {@link String}
*/
private String doGet(RequestBuilder reqBuilder, Map<String, String> params) {
reqBuilder.addHeader(HttpHeaders.AUTHORIZATION, auth.getAuth());
for (Map.Entry<String, String> entry : params.entrySet()) {
reqBuilder.addParameter(entry.getKey(), entry.getValue());
}
try {
HttpResponse resp = httpClient.execute(reqBuilder.build());
return EntityUtils.toString(resp.getEntity(), StandardCharsets.UTF_8);
} catch (IOException e) {
log.error("doGet 异常: reqBuilder={}, params={}", reqBuilder, params, e);
return null;
}
}
/**
* 绕过SSL、TLS证书
*
* @return {@link SSLConnectionSocketFactory}
* @throws NoSuchAlgorithmException 没有这样算法异常
* @throws KeyManagementException 密钥管理例外
*/
private SSLConnectionSocketFactory createIgnoreVerifySSL() throws NoSuchAlgorithmException, KeyManagementException {
// 创建一个上下文(此处指定的协议类型似乎不是重点)
SSLContext ctx = SSLContext.getInstance("TLS");
// 创建一个跳过SSL证书的策略
X509TrustManager tm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] arg0, String arg1) {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1) {
}
};
// 使用上面的策略初始化上下文
ctx.init(null, new TrustManager[]{tm}, null);
// 创建一个包含各种SSL协议的SSLConnectionSocketFactory实例对象
return new SSLConnectionSocketFactory(ctx, new String[]{"SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"}, null, NoopHostnameVerifier.INSTANCE);
}
}
\ No newline at end of file
......@@ -250,8 +250,9 @@ public class EasyExcelUtil {
}
}
private static <T> ExcelListener<T> readExcelListener(MultipartFile file, Class<T> clazz, ExcelListener<T> excelListener) throws IOException {
ExcelReader excelReader = getReader(file.getInputStream(), file.getOriginalFilename(), clazz, excelListener);
private static <T> ExcelListener<T> readExcelListener(MultipartFile file, Class<T> clazz, ExcelListener<T> excelListener) {
try (InputStream inputStream = file.getInputStream()) {
ExcelReader excelReader = getReader(inputStream, file.getOriginalFilename(), clazz, excelListener);
if (ObjectUtil.isNull(excelReader)) {
return excelListener;
}
......@@ -260,6 +261,9 @@ public class EasyExcelUtil {
excelReader.read(readSheet);
}
excelReader.finish();
} catch (IOException e) {
throw new RuntimeException(e);
}
return excelListener;
}
......
package pps.core.common.utils;
/**
* @author lixueyan
* @date 2022/12/22 0022 18:52
*/
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Arrays;
import java.util.Base64;
public class RSAUtil {
//将Base64编码后的公钥转换成PublicKey对象
public static PublicKey string2PublicKey(String pubStr) throws Exception {
byte[] keyBytes = base642Byte(pubStr);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}
//将Base64编码后的私钥转换成PrivateKey对象
public static PrivateKey string2PrivateKey(String priStr) throws Exception {
byte[] keyBytes = base642Byte(priStr);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
//Base64编码转字节数组
public static byte[] base642Byte(String base64Key) {
Base64.Decoder decoder = Base64.getDecoder();
return decoder.decode(base64Key);
}
/**
* 解密方法
*
* @param byte2Base64
* @return
*/
public static String RsaDecrypt(String byte2Base64, String privateKeyStr) {
byte[] decryptedData = null;
try {
//将Base64编码后的私钥转换成PrivateKey对象
PrivateKey privateKey = RSAUtil.string2PrivateKey(privateKeyStr);
Cipher cipher = Cipher.getInstance(privateKey.getAlgorithm());
cipher.init(2, privateKey);
byte[] encryptedData = RSAUtil.base642Byte(byte2Base64);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
for (int i = 0; inputLen - offSet > 0; offSet = i * 256) {
byte[] cache;
if (inputLen - offSet > 256) {
cache = cipher.doFinal(encryptedData, offSet, 256);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
++i;
}
decryptedData = out.toByteArray();
out.close();
} catch (Exception ignored) {
}
return new String(decryptedData);
}
/**
* 分断加密
*
* @param byte2Base642
* @return
*/
public static String rsaEncrypt(String byte2Base642, String publicKeyStr) {
String result = "";
try {
// 将Base64编码后的公钥转换成PublicKey对象
PublicKey publicKey = RSAUtil.string2PublicKey(publicKeyStr);
// 加密
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] inputArray = byte2Base642.getBytes();
int inputLength = inputArray.length;
// 最大加密字节数,超出最大字节数需要分组加密
int MAX_ENCRYPT_BLOCK = 117;
// 标识
int offSet = 0;
byte[] resultBytes = {};
byte[] cache;
while (inputLength - offSet > 0) {
if (inputLength - offSet > MAX_ENCRYPT_BLOCK) {
cache = cipher.doFinal(inputArray, offSet, MAX_ENCRYPT_BLOCK);
offSet += MAX_ENCRYPT_BLOCK;
} else {
cache = cipher.doFinal(inputArray, offSet, inputLength - offSet);
offSet = inputLength;
}
resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length);
System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length);
}
Base64.Encoder encoder = Base64.getEncoder();
result = encoder.encodeToString(resultBytes);
} catch (Exception ignored) {
}
return result;
}
}
\ No newline at end of file
......@@ -3,6 +3,7 @@ package pps.core.system.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -15,7 +16,6 @@ import pps.core.system.entity.*;
import pps.core.system.error.LoginError;
import pps.core.system.mapper.*;
import pps.core.system.service.data.sys_user.*;
import pps.core.system.utils.UserInfoUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
......@@ -59,9 +59,9 @@ public class SysUserService {
PageInfo<SysUserView> pageInfo = new PageInfo<>(list);
List<QuerySysUserViewOutput> outputs = XCopyUtils.copyNewList(pageInfo.getList(), QuerySysUserViewOutput.class);
for (QuerySysUserViewOutput output : outputs) {
output.setPhone(UserInfoUtil.desensitization(output.getPhone()));
output.setIdentifyNo(UserInfoUtil.desensitization(output.getIdentifyNo()));
output.setEmail(UserInfoUtil.desensitization(output.getEmail()));
output.setPhone(DesensitizedUtil.mobilePhone(output.getPhone()));
output.setIdentifyNo(DesensitizedUtil.idCardNum(output.getIdentifyNo(), 1, 2));
output.setEmail(DesensitizedUtil.email(output.getEmail()));
if (ObjectUtil.isNull(output.getStatus())) {
output.setStatus(0);
}
......@@ -94,9 +94,9 @@ public class SysUserService {
}
entity.setCreateTime(new Date());
//加密敏感信息
entity.setPhone(UserInfoUtil.encrypt(entity.getPhone()));
entity.setIdentifyNo(UserInfoUtil.encrypt(entity.getIdentifyNo()));
entity.setEmail(UserInfoUtil.encrypt(entity.getEmail()));
entity.setPhone(DesensitizedUtil.mobilePhone(entity.getPhone()));
entity.setIdentifyNo(DesensitizedUtil.idCardNum(entity.getIdentifyNo(), 1, 2));
entity.setEmail(DesensitizedUtil.email(entity.getEmail()));
mapper.insert(entity);
//新增用户和组织机构关系表
insertSysUserOrganizationRel(context, uuid, input.getOuId(), session);
......@@ -154,17 +154,17 @@ public class SysUserService {
}
//加密敏感信息
if (CharSequenceUtil.isNotBlank(input.getPhone()) && !CharSequenceUtil.contains(input.getPhone(), '*')) {
entity.setPhone(UserInfoUtil.encrypt(input.getPhone()));
entity.setPhone(DesensitizedUtil.mobilePhone(input.getPhone()));
} else {
entity.setPhone(null);
}
if (CharSequenceUtil.isNotBlank(input.getIdentifyNo()) && !CharSequenceUtil.contains(input.getIdentifyNo(), '*')) {
entity.setIdentifyNo(UserInfoUtil.encrypt(input.getIdentifyNo()));
entity.setIdentifyNo(DesensitizedUtil.idCardNum(input.getIdentifyNo(), 1, 2));
} else {
entity.setIdentifyNo(null);
}
if (CharSequenceUtil.isNotBlank(input.getEmail()) && !CharSequenceUtil.contains(input.getEmail(), '*')) {
entity.setEmail(UserInfoUtil.encrypt(input.getEmail()));
entity.setEmail(DesensitizedUtil.email(input.getEmail()));
} else {
entity.setEmail(null);
}
......
package pps.core.system.utils;
import cn.hutool.core.text.CharSequenceUtil;
import pps.core.common.utils.PatternUtil;
import pps.core.common.utils.RSAUtil;
import pps.core.system.config.LoginConfig;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.XServiceContext;
import xstartup.base.util.XEncryptUtils;
/**
* @author lixueyan
* @date 2023/3/8 0008 10:45
*/
@XText("用户信息处理工具类")
public class UserInfoUtil {
//敏感信息rsa加密
public static String encrypt(String str) {
if (CharSequenceUtil.isBlank(str)) {
return str;
}
XContext context = XServiceContext.build(UserInfoUtil.class);
String publicKeyValue = LoginConfig.userRsaPublicKey.findValue(context);
publicKeyValue = XEncryptUtils.decrypt(publicKeyValue);
return RSAUtil.rsaEncrypt(str, publicKeyValue);
}
//敏感信息rsa解密
public static String decrypt(String str) {
if (CharSequenceUtil.isBlank(str)) {
return str;
}
XContext context = XServiceContext.build(UserInfoUtil.class);
try {
String privateKeyValue = LoginConfig.userRsaPrivateKey.findValue(context);
privateKeyValue = XEncryptUtils.decrypt(privateKeyValue);
return RSAUtil.RsaDecrypt(str, privateKeyValue);
} catch (Exception e) {
context.getLogger().error("敏感信息解密失败, 使用原信息");
return str;
}
}
//敏感信息解密并脱敏
public static String desensitization(String str) {
return PatternUtil.desensitization(decrypt(str));
}
}
......@@ -24,13 +24,4 @@ public interface IBaseWeatherCloudService {
*/
@XText("天气数据接收Cloud模块--天气数据处理")
XServiceResult weatherDataProcess(XContext context, String oilFieldName);
/**
* 天气数据接收Cloud模块--天气Api数据处理
*
* @param context 上下文
* @return {@link XServiceResult}
*/
@XText("天气数据接收Cloud模块--天气Api数据处理")
XServiceResult weatherApiDataProcess(XContext context);
}
package pps.cloud.base.service;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03 16:30
*/
@XService
@XText("第三方风力发电数据Cloud模块")
public interface IThirdWindPowerGenerationCloudService {
/**
* 第三方风力发电数据Cloud模块--第三方风力发电数据定时任务
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@XText("第三方风力发电数据Cloud模块--第三方风力发电数据定时任务")
XServiceResult thirdWindPowerGenerationJob(XContext context);
}
package pps.cloud.base.service;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 风资源训练集数据Cloud模块
*
* @author ZWT
* @date 2024/08/30 14:03
*/
@XService
@XText("风资源训练集数据Cloud模块")
public interface IWindPredictionHistoryCloudService {
/**
* 风资源训练集数据Cloud模块--风资源训练集定时任务
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@XText("风资源训练集数据Cloud模块--风资源训练集定时任务")
XServiceResult windPredictionHistoryJob(XContext context);
}
......@@ -51,6 +51,7 @@ import xstartup.helper.XTransactionHelper;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
......@@ -265,7 +266,7 @@ public class BasePhotovoltaicPlantService {
SysOrganizationView record = new SysOrganizationView();
XCopyUtils.copyObject(input, record);
record.setIsDeleted(BusinessConstant.ONE);
List<SysOrganizationView> viewList = null;
List<SysOrganizationView> viewList = new ArrayList<>(16);
String ouId = "00000000-0000-0000-0000-000000000000";
String ouName = input.getOuName();
if (CharSequenceUtil.isBlank(ouName)) {
......@@ -288,6 +289,7 @@ public class BasePhotovoltaicPlantService {
}
}
if (CollUtil.isEmpty(viewList)) {
viewList = new ArrayList<>(2);
BasePhotovoltaicPlantMapper plantMapper = context.getBean(BasePhotovoltaicPlantMapper.class);
List<BasePhotovoltaicPlantEnt> plantList = plantMapper.selectList(new LambdaQueryWrapper<BasePhotovoltaicPlantEnt>()
.eq(CharSequenceUtil.isBlank(ouName), BasePhotovoltaicPlantEnt::getOuId, ouId)
......
......@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.NioUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil;
......@@ -12,7 +11,6 @@ import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import pps.cloud.base.service.IBaseWeatherCloudService;
import pps.cloud.middle.service.IWeatherAttachmentCloudService;
import pps.cloud.middle.service.data.weather_attachment_record.GetWeatherAttachmentRecordInput;
......@@ -22,10 +20,6 @@ import pps.core.base.enums.WeatherIconEnum;
import pps.core.base.enums.WindDirection;
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;
import xstartup.annotation.XService;
......@@ -37,15 +31,8 @@ import xstartup.core.base.helper.XThreadHelper;
import xstartup.data.XServiceResult;
import xstartup.data.XSingleResult;
import javax.mail.*;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
......@@ -59,10 +46,6 @@ import java.util.stream.Collectors;
@XService
public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
private static final String host = XStartup.getCurrent().getProperty("weather.mail.host");
private static final String username = XStartup.getCurrent().getProperty("weather.mail.username");
private static final String password = XStartup.getCurrent().getProperty("weather.mail.password");
private static final String protocol = XStartup.getCurrent().getProperty("weather.mail.protocol");
private static final String storeDir = XStartup.getCurrent().getProperty("weather.file.temp.path");
/**
......@@ -76,9 +59,6 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
public XServiceResult weatherDataProcess(XContext context, String oilFieldCode) {
XLoggerTool logger = context.getLogger();
List<JSONObject> jsonObjectList = new ArrayList<>(48);
//区分环境
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
logger.info("------ weatherDataProcess select mail ------");
IWeatherAttachmentCloudService service = context.getBean(IWeatherAttachmentCloudService.class);
XSingleResult<GetWeatherAttachmentRecordOutput> result = service.getEmail(context, new GetWeatherAttachmentRecordInput());
......@@ -92,50 +72,6 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
jsonObjectList.add(jsonObject);
FileUtil.del(filePath);
}
break;
case BusinessConstant.ENV_CQ:
//取未读邮件
Store store = null;
Folder folder = null;
try {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
store = session.getStore(protocol);
store.connect(host, username, password);
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
logger.info("------ weatherDataProcess connect mail ------");
List<Message> messageList = ReceivedIMAPMail.filterMessage(folder.getMessages(), null, null);
if (CollUtil.isNotEmpty(messageList)) {
for (Message message : messageList) {
ReceivedIMAPMail re = new ReceivedIMAPMail((MimeMessage) message);
String subject = re.getSubject();
if (!CharSequenceUtil.endWith(subject, "天气预测数据" + oilFieldCode)) {
continue;
}
logger.info("------ weatherDataProcess subject: {}", subject);
//读取附件
re.getMailContent(message);
String tempFilePath = this.saveAttachment(message);
logger.info("------ weatherDataProcess load file: {}", tempFilePath);
JSONObject jsonObject = JSON.parseObject(FileUtil.readUtf8String(tempFilePath));
jsonObjectList.add(jsonObject);
logger.info("------ weatherDataProcess del temp file path: {}", tempFilePath);
FileUtil.del(tempFilePath);
message.setFlag(Flags.Flag.DELETED, true);
}
}
} catch (MessagingException | IOException | ParseException e) {
logger.error("------ weatherDataProcess Exception", e);
} finally {
logger.info("------ weatherDataProcess mail finally close");
NioUtil.close(folder);
NioUtil.close(store);
}
break;
default:
return XServiceResult.OK;
}
logger.info("------ weatherDataProcess jsonObjectList size: {}", jsonObjectList.size());
if (CollUtil.isNotEmpty(jsonObjectList)) {
//气象局数据处理
......@@ -163,202 +99,8 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
return XServiceResult.OK;
}
/**
* 天气数据接收Cloud模块--天气Api数据处理
*
* @param context 上下文
* @return {@link XServiceResult}
*/
@Override
public XServiceResult weatherApiDataProcess(XContext context) {
XLoggerTool logger = context.getLogger();
DateTime date = DateUtil.date();
//查第二采油厂所有电站
BasePhotovoltaicPlantViewMapper viewMapper = context.getBean(BasePhotovoltaicPlantViewMapper.class);
//todo 暂时就一个点,第二采油厂全用API这一个点的数据
List<BasePhotovoltaicPlantView> plantList = viewMapper.selectPlantList(BasePhotovoltaicPlantView.builder()
.ouId("2c4c9d1c-ad55-4c14-b889-4dc33e3461e2")
.build());
if (CollUtil.isEmpty(plantList)) {
logger.info("------ weatherDataProcess plantList is empty ------");
return XServiceResult.OK;
}
//新数据删除接收
List<WeatherDeleteCondition> deleteList = new ArrayList<>(32);
List<ThirdWeatherDataView> weatherDataViewList = new ArrayList<>(2048);
//todo 老表逻辑(后期删除):后续可能替换
List<String> oldDeleteList = new ArrayList<>(32);
List<PlantPredictedPowerDataEnt> oldBatchList = new ArrayList<>(BusinessConstant.LIST_MAX_SIZE);
//取未读邮件
Store store = null;
Folder folder = null;
DateTime startTime = date;
try {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null);
store = session.getStore(protocol);
store.connect(host, username, password);
folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
logger.info("------ weatherApiDataProcess connect mail ------");
List<Message> messageList = ReceivedIMAPMail.filterMessage(folder.getMessages(), null, null);
if (CollUtil.isNotEmpty(messageList)) {
ReceivedIMAPMail re;
for (Message message : messageList) {
re = new ReceivedIMAPMail((MimeMessage) message);
String subject = re.getSubject();
if (!CharSequenceUtil.endWith(subject, "天气预报接口数据")) {
continue;
}
//读取附件
re.getMailContent(message);
String tempFilePath = this.saveAttachment(message);
logger.info("------ weatherApiDataProcess load file: {}", tempFilePath);
//处理读取流部分数据丢失精度问题
String jsonString = FileUtil.readUtf8String(tempFilePath);
jsonString = CharSequenceUtil.replace(jsonString, "%", ".");
List<Weather15mData> weather15mDataList = JSON.parseArray(jsonString, Weather15mData.class);
if (CollUtil.isEmpty(weather15mDataList)) {
logger.info("------ weatherApiDataProcess weather15mDataList isEmpty ------");
return XServiceResult.OK;
}
int count = 0;
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();
//获取15天明细数据
List<ThirdApiWeatherData> data = weather15mData.getData();
//获取开始结束时间,添加删除条件
DateTime beginTime = DateUtil.offsetMinute(data.get(0).getForecastTime(), -5);
Date endTime = DateUtil.offsetMinute(data.get(data.size() - 1).getForecastTime(), 15);
if (count == 0) {
startTime = beginTime;
}
count++;
deleteList.add(
WeatherDeleteCondition.builder()
.longitude(longitude)
.latitude(latitude)
.beginTime(beginTime)
.endTime(endTime)
.build()
);
//todo 老表逻辑(后期删除):删除数据逻辑
for (BasePhotovoltaicPlantView plantView : plantList) {
oldDeleteList.add(plantView.getId());
}
//天气数据处理
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);
//todo 老表逻辑(后期删除):封装预测数据
for (BasePhotovoltaicPlantView plantView : plantList) {
this.addPlantPredictedPower(oldBatchList, plantView.getId(), thirdWeatherDataView);
}
}
}
logger.info("------ weatherApiDataProcess del temp file path: {}", tempFilePath);
FileUtil.del(tempFilePath);
message.setFlag(Flags.Flag.DELETED, true);
}
}
} catch (MessagingException e) {
logger.error("------ weatherApiDataProcess MessagingException", e);
} catch (ParseException e) {
logger.error("------ weatherApiDataProcess ParseException", e);
} catch (UnsupportedEncodingException e) {
logger.error("------ weatherApiDataProcess UnsupportedEncodingException", e);
} catch (IOException e) {
logger.error("------ weatherApiDataProcess IOException", e);
} finally {
logger.info("------ weatherApiDataProcess finally close");
NioUtil.close(folder);
NioUtil.close(store);
}
//todo 老表逻辑(后期删除):删除/新增预测数据
this.deletePlantPredictedPowerList(context, oldDeleteList, startTime, DateUtil.offsetDay(startTime, 16));
this.insertBatchPlantPredictedPowerList(context, oldBatchList);
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;
}
/*------------------------- private -------------------------*/
/**
* 添加电厂预测功率
*
* @param batchList 批处理列表
* @param plantId 植物id
* @param thirdWeatherDataView 第三天气数据视图
*/
private void addPlantPredictedPower(List<PlantPredictedPowerDataEnt> batchList, String plantId, ThirdWeatherDataView thirdWeatherDataView) {
DateTime date = DateUtil.date(thirdWeatherDataView.getForecastTime());
batchList.add(PlantPredictedPowerDataEnt.builder()
.plantId(plantId)
.createTime(thirdWeatherDataView.getCreateTime())
.yearTime(String.valueOf(date.year()))
.monthTime(this.zeroFill(date.monthBaseOne()))
.dayTime(this.zeroFill(date.dayOfMonth()))
.hourTime(this.zeroFill(date.hour(true)))
.minTime(this.zeroFill(date.minute()))
.dataDate(date.toString(BusinessConstant.DATE_FORMAT_ALL))
.temperature(thirdWeatherDataView.getTem())
.windSpeed(thirdWeatherDataView.getWns100m())
.windDirection(new BigDecimal(thirdWeatherDataView.getWnd()))
.pressure(thirdWeatherDataView.getPrsQfe())
.humidity(thirdWeatherDataView.getRhu())
.planeIrradiance(thirdWeatherDataView.getDni())
.horizontalIrradiance(thirdWeatherDataView.getGhi())
.power(BigDecimal.ZERO)
.build());
}
/**
* 计算
*
......@@ -381,63 +123,6 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
return num < 10 ? "0" + num : String.valueOf(num);
}
/**
* 保存附件
*
* @param part 部分
* @return {@link String}
* @throws MessagingException 消息传递异常
* @throws IOException IOException
*/
private String saveAttachment(Part part) throws MessagingException, IOException {
String fileName;
String filePath = null;
if (part.isMimeType("multipart/*")) {
Multipart mp = (Multipart) part.getContent();
BodyPart mPart;
for (int i = 0; i < mp.getCount(); i++) {
mPart = mp.getBodyPart(i);
String disposition = mPart.getDisposition();
if (Part.ATTACHMENT.equals(disposition) || Part.INLINE.equals(disposition)) {
fileName = mPart.getFileName();
if (CharSequenceUtil.isNotEmpty(fileName) && StringUtils.lowerCase(fileName).contains("GB2312")) {
fileName = MimeUtility.decodeText(fileName);
}
filePath = this.saveTempFile(mPart, CharSequenceUtil.replace(fileName, "\\?|=", ""));
} else if (mPart.isMimeType("multipart/*")) {
this.saveAttachment(mPart);
} else {
fileName = mPart.getFileName();
if (CharSequenceUtil.isNotEmpty(fileName) && StringUtils.lowerCase(fileName).contains("GB2312")) {
filePath = this.saveTempFile(mPart, MimeUtility.decodeText(fileName));
}
}
}
} else if (part.isMimeType("message/rfc822")) {
this.saveAttachment((Part) part.getContent());
}
return filePath;
}
/**
* 保存临时文件
*
* @param mPart m部分
* @param fileName 文件名
* @return {@link String }
*/
private String saveTempFile(BodyPart mPart, String fileName) {
String filePath;
try (InputStream inputStream = mPart.getInputStream()) {
filePath = this.createFilePath(fileName);
FileUtil.touch(filePath);
FileUtil.writeFromStream(inputStream, filePath);
} catch (IOException | MessagingException e) {
throw new RuntimeException(e);
}
return filePath;
}
/**
* 创建文件路径
*
......@@ -451,18 +136,6 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
return stringBuilder.append(File.separator).append(fileName).toString();
}
/**
* 零填充
*
* @param number 数字
* @return {@link String}
*/
private String zeroFill(int number) {
if (number < 10) {
return "0" + number;
}
return String.valueOf(number);
}
/**
* 气象局数据处理
......
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import pps.cloud.base.service.IThirdWindPowerGenerationCloudService;
import pps.core.base.entity.ThirdWindPowerGenerationUpdateView;
import pps.core.base.entity.ThirdWindPowerGenerationView;
import pps.core.base.mapper.ThirdWindPowerGenerationUpdateViewMapper;
import pps.core.base.mapper.ThirdWindPowerGenerationViewMapper;
import pps.core.base.utils.ServiceUtil;
import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XServiceResult;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 第三方风力发电数据
*
* @author ZWT
* @date 2024/09/03 16:34
*/
@XService
public class ThirdWindPowerGenerationCloudServiceImpl implements IThirdWindPowerGenerationCloudService {
/**
* 第三方风力发电数据定时任务
* todo 模拟数据生成
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@Override
public XServiceResult thirdWindPowerGenerationJob(XContext context) {
DateTime endTime = DateUtil.date();
DateTime startTime = DateUtil.offsetMinute(endTime, -30);
ThirdWindPowerGenerationViewMapper viewMapper = context.getBean(ThirdWindPowerGenerationViewMapper.class);
List<ThirdWindPowerGenerationView> list = viewMapper.generateSimulatedData(ThirdWindPowerGenerationView.builder()
.startTime(startTime)
.endTime(endTime)
.build());
if (CollUtil.isNotEmpty(list)) {
List<ThirdWindPowerGenerationView> batchList = new ArrayList<>(list.size() * 2);
List<ThirdWindPowerGenerationUpdateView> batchUpdateList = new ArrayList<>(list.size());
//查当前环境
String systemSource = ServiceUtil.getOilFieldCode(context);
ThirdWindPowerGenerationView copy;
for (ThirdWindPowerGenerationView view : list) {
view.setSystemSource(systemSource);
view.setInputTime(endTime);
copy = this.newThirdWindPowerGenerationView(view);
batchList.add(copy);
batchList.add(view);
//每日最新数据
batchUpdateList.add(XCopyUtils.copyNewObject(view, ThirdWindPowerGenerationUpdateView.class));
}
//批量新增
if (batchList.size() > BaseUtils.BATCH_SIZE) {
List<List<ThirdWindPowerGenerationView>> subList = BaseUtils.getSubList(batchList);
subList.forEach(viewMapper::batchInsert);
} else {
viewMapper.batchInsert(batchList);
}
//生成每日最新数据
ThirdWindPowerGenerationUpdateViewMapper mapper = context.getBean(ThirdWindPowerGenerationUpdateViewMapper.class);
mapper.deleteBatch(list.stream()
.map(ThirdWindPowerGenerationView::getStationId)
.collect(Collectors.toList()),
DateUtil.beginOfDay(endTime), DateUtil.endOfDay(endTime));
//批量新增
if (batchUpdateList.size() > BaseUtils.BATCH_SIZE) {
List<List<ThirdWindPowerGenerationUpdateView>> subList = BaseUtils.getSubList(batchUpdateList);
subList.forEach(mapper::batchInsert);
} else {
mapper.batchInsert(batchUpdateList);
}
}
return XServiceResult.OK;
}
/*--------------------------------- private ---------------------------------*/
/**
* 第三代风力发电新观点
*
* @param view 看法
* @return {@link ThirdWindPowerGenerationView }
*/
private ThirdWindPowerGenerationView newThirdWindPowerGenerationView(ThirdWindPowerGenerationView view) {
return ThirdWindPowerGenerationView.builder()
.stationName(view.getStationName())
.stationId(view.getStationId())
.collectTime(DateUtil.offsetMinute(view.getCollectTime(), -15))
.actualWindSpeed(view.getActualWindSpeed())
.actualPower(view.getActualPower())
.actualGeneration(view.getActualGeneration())
.actualWindDirection(view.getActualWindDirection())
.inputTime(view.getInputTime())
.systemSource(view.getSystemSource())
.build();
}
}
\ No newline at end of file
package pps.core.base.service;
import cn.hutool.core.collection.CollUtil;
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.IWindPredictionHistoryCloudService;
import pps.core.base.entity.ThirdWindPowerGenerationEnt;
import pps.core.base.entity.WindPredictionFutureEnt;
import pps.core.base.entity.WindPredictionHistoryView;
import pps.core.base.mapper.ThirdWindPowerGenerationMapper;
import pps.core.base.mapper.WindPredictionFutureMapper;
import pps.core.base.mapper.WindPredictionHistoryViewMapper;
import pps.core.base.utils.ServiceUtil;
import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 风资源训练集数据Cloud模块
*
* @author ZWT
* @date 2024/08/30 14:07
*/
@XService
public class WindPredictionHistoryCloudServiceImpl implements IWindPredictionHistoryCloudService {
/**
* 风资源训练集定时任务
* wind_prediction_history的 actual_power存实际功率
* wind_prediction_future的 actual_power为预测功率
*
* @param context 上下文
* @return {@link XServiceResult }
*/
@Override
public XServiceResult windPredictionHistoryJob(XContext context) {
DateTime startTime = DateUtil.beginOfDay(DateUtil.yesterday());
DateTime endTime = DateUtil.endOfDay(startTime);
//取日期范围内已预测数据
WindPredictionFutureMapper mapper = context.getBean(WindPredictionFutureMapper.class);
List<WindPredictionFutureEnt> list = mapper.selectList(new QueryWrapper<WindPredictionFutureEnt>()
.select("station_id",
"data_time",
"wind_direction",
"wind_speed",
"air_temperature",
"humidity",
"pressure",
"actual_wind_speed",
"actual_power AS predicted_power")
.lambda()
.between(WindPredictionFutureEnt::getDataTime, startTime, endTime)
);
if (CollUtil.isNotEmpty(list)) {
//查实际发电数据
ThirdWindPowerGenerationMapper generationMapper = context.getBean(ThirdWindPowerGenerationMapper.class);
List<ThirdWindPowerGenerationEnt> generationList = generationMapper.selectList(new QueryWrapper<ThirdWindPowerGenerationEnt>()
.select("station_id", "collect_time", "MAX( actual_power ) AS actual_power",
"MAX( actual_generation ) AS actual_generation", "MAX( actual_wind_speed ) AS actual_wind_speed",
"MAX( actual_wind_direction ) AS actual_wind_direction")
.lambda()
.between(ThirdWindPowerGenerationEnt::getCollectTime, startTime, endTime)
.eq(ThirdWindPowerGenerationEnt::getSystemSource, ServiceUtil.getOilFieldCode(context))
.groupBy(ThirdWindPowerGenerationEnt::getStationId, ThirdWindPowerGenerationEnt::getCollectTime)
);
Map<String, Map<Date, ThirdWindPowerGenerationEnt>> collect;
if (CollUtil.isEmpty(generationList)) {
collect = Collections.emptyMap();
} else {
collect = generationList.stream()
.collect(Collectors.groupingBy(ThirdWindPowerGenerationEnt::getStationId, Collectors.toMap(ThirdWindPowerGenerationEnt::getCollectTime, Function.identity())));
}
//数据处理
List<WindPredictionHistoryView> historyList = this.dataProcess(list, collect);
//按时间范围删除数据
WindPredictionHistoryViewMapper viewMapper = context.getBean(WindPredictionHistoryViewMapper.class);
viewMapper.deleteByTimeRange(startTime, endTime);
if (historyList.size() > BaseUtils.BATCH_SIZE) {
List<List<WindPredictionHistoryView>> subList = BaseUtils.getSubList(historyList);
subList.forEach(viewMapper::batchInsert);
} else {
viewMapper.batchInsert(historyList);
}
}
return XServiceResult.OK;
}
/*------------------------- private -------------------------*/
/**
* 数据处理
* todo 模拟数据
*
* @param list 列表
* @param collect 收集
* @return {@link List }<{@link WindPredictionHistoryView }>
*/
private List<WindPredictionHistoryView> dataProcess(List<WindPredictionFutureEnt> list, Map<String, Map<Date, ThirdWindPowerGenerationEnt>> collect) {
List<WindPredictionHistoryView> historyList = new ArrayList<>(list.size());
Map<Date, ThirdWindPowerGenerationEnt> map;
ThirdWindPowerGenerationEnt ent;
for (WindPredictionFutureEnt future : list) {
WindPredictionHistoryView view = new WindPredictionHistoryView();
view.setStationId(future.getStationId());
view.setDataTime(future.getDataTime());
view.setWindDirection(future.getWindDirection());
view.setWindSpeed(future.getWindSpeed());
view.setAirTemperature(future.getAirTemperature());
view.setHumidity(future.getHumidity());
view.setPressure(future.getPressure());
view.setPredictedPower(future.getPredictedPower());
//匹配真实数据
boolean flag = true;
if (collect.containsKey(future.getStationId())) {
map = collect.get(future.getStationId());
if (map.containsKey(future.getDataTime())) {
flag = false;
ent = map.get(future.getDataTime());
view.setActualPower(ent.getActualPower());
view.setActualWindSpeed(ent.getActualWindSpeed());
view.setActualWindDirection(ent.getAccurateWindDirection());
}
}
if (flag) {
view.setActualPower(BigDecimal.ZERO);
view.setActualWindSpeed(BigDecimal.ZERO);
view.setActualWindDirection(BigDecimal.ZERO);
}
historyList.add(view);
}
return historyList;
}
}
\ No newline at end of file
......@@ -126,5 +126,5 @@ public class TaskConstant {
/**
* 任务锁定键
*/
public static final String TASK_LOCK_KEY = "pps.task_lock_key.";
public static final String TASK_LOCK_FLAG = "pps.task_lock_key.";
}
\ No newline at end of file
......@@ -29,10 +29,10 @@ public class DailyElectricityTrendJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ DailyElectricityTrendJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "DailyElectricityTrendJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "DailyElectricityTrendJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IDailyElectricityTrendCloudService service = xContext.getBean(IDailyElectricityTrendCloudService.class);
XServiceResult result = service.dailyElectricityTrendJob(xContext);
......@@ -41,7 +41,7 @@ public class DailyElectricityTrendJob {
xContext.getLogger().error("------ DailyElectricityTrendJob Exception: ", e);
} finally {
xContext.getLogger().info("------ DailyElectricityTrendJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -29,10 +29,10 @@ public class EnergyConsumptionAnalysisJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ EnergyConsumptionAnalysisJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "EnergyConsumptionAnalysisJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "EnergyConsumptionAnalysisJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.energyConsumptionAnalysisJob(xContext);
......@@ -41,7 +41,7 @@ public class EnergyConsumptionAnalysisJob {
xContext.getLogger().error("------ EnergyConsumptionAnalysisJob Exception: ", e);
} finally {
xContext.getLogger().info("------ EnergyConsumptionAnalysisJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -30,10 +30,10 @@ public class PhotovoltaicTrainJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ PhotovoltaicTrainJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "PhotovoltaicTrainJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "PhotovoltaicTrainJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
XThreadHelper.async(() -> {
try {
......@@ -46,7 +46,7 @@ public class PhotovoltaicTrainJob {
xContext.getLogger().error("------ PhotovoltaicTrainJob Exception: ", e);
} finally {
xContext.getLogger().info("------ PhotovoltaicTrainJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
//package pps.core.task.job;
//
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.ObjectUtil;
//import pps.cloud.prediction.service.PlantPredictedPowerLongTermDataCloudService;
//import pps.core.common.cache.TaskLockCache;
//import pps.core.task.constant.TaskConstant;
//import pps.core.task.utils.ServiceUtil;
//import xstartup.annotation.XService;
//import xstartup.annotation.XText;
//import xstartup.base.XContext;
//import xstartup.data.XServiceResult;
//import xstartup.service.job.XJob;
//import xstartup.service.job.annotation.XCronTrigger;
//
//@XText("长期预测数据,每天更新一次")
//@XService
//public class PlantPredictedPowerLongTermDataJob implements XJob {
// @XCronTrigger(value = "0 45 1 * * ?")
// @Override
// public XServiceResult execute(XContext xContext) {
// xContext.getLogger().info("------ PlantPredictedPowerLongTermDataJob start:{}", DateUtil.date());
// String key = TaskConstant.TASK_LOCK_KEY + "PlantPredictedPowerLongTermDataJob";
// TaskLockCache exist = TaskLockCache.exist(xContext, key);
// if (ObjectUtil.isNull(exist)) {
// ServiceUtil.setCache(xContext, key);
// try {
// PlantPredictedPowerLongTermDataCloudService cloudService = xContext.getBean(PlantPredictedPowerLongTermDataCloudService.class);
// XServiceResult result = cloudService.runPlantPredictedPowerLongTermData(xContext);
// result.throwIfFail();
// } catch (Exception e) {
// xContext.getLogger().error("------ PlantPredictedPowerLongTermDataJob Exception: ", e);
// } finally {
// xContext.getLogger().info("------ PlantPredictedPowerLongTermDataJob end:{}", DateUtil.date());
// TaskLockCache.delete(xContext, key);
// }
// }
// return XServiceResult.OK;
// }
//}
......@@ -33,10 +33,10 @@ public class SpaceCalibrationJob implements XJob {
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ SpaceCalibrationJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "SpaceCalibrationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "SpaceCalibrationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
ISpaceCalibrationCloudService service = xContext.getBean(ISpaceCalibrationCloudService.class);
XServiceResult result = service.calibrateJob(xContext);
......@@ -45,7 +45,7 @@ public class SpaceCalibrationJob implements XJob {
xContext.getLogger().error("------ SpaceCalibrationJob Exception: ", e);
} finally {
xContext.getLogger().info("------ SpaceCalibrationJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -33,10 +33,10 @@ public class SpaceOptimizeLongJob implements XJob {
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ SpaceOptimizeLongJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "SpaceOptimizeLongJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "SpaceOptimizeLongJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
ISpaceOptimizeLongCloudService service = xContext.getBean(ISpaceOptimizeLongCloudService.class);
XServiceResult result = service.optimizeLongJob(xContext);
......@@ -45,7 +45,7 @@ public class SpaceOptimizeLongJob implements XJob {
xContext.getLogger().error("------ SpaceOptimizeLongJob Exception: ", e);
} finally {
xContext.getLogger().info("------ SpaceOptimizeLongJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -33,10 +33,10 @@ public class SpaceOptimizeMidJob implements XJob {
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ SpaceOptimizeMidJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "SpaceOptimizeMidJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "SpaceOptimizeMidJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
ISpaceOptimizeMidCloudService service = xContext.getBean(ISpaceOptimizeMidCloudService.class);
XServiceResult result = service.optimizeMidJob(xContext);
......@@ -45,7 +45,7 @@ public class SpaceOptimizeMidJob implements XJob {
xContext.getLogger().error("------ SpaceOptimizeMidJob Exception: ", e);
} finally {
xContext.getLogger().info("------ SpaceOptimizeMidJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -33,10 +33,10 @@ public class SpaceOptimizeShortJob implements XJob {
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ SpaceOptimizeShortJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "SpaceOptimizeShortJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "SpaceOptimizeShortJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
ISpaceOptimizeShortCloudService service = xContext.getBean(ISpaceOptimizeShortCloudService.class);
XServiceResult result = service.optimizeShortJob(xContext);
......@@ -45,7 +45,7 @@ public class SpaceOptimizeShortJob implements XJob {
xContext.getLogger().error("------ SpaceOptimizeShortJob Exception: ", e);
} finally {
xContext.getLogger().info("------ SpaceOptimizeShortJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -33,10 +33,10 @@ public class SpaceOptimizeUltraJob implements XJob {
@Override
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ SpaceOptimizeUltraJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "SpaceOptimizeUltraJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "SpaceOptimizeUltraJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
ISpaceOptimizeUltraCloudService service = xContext.getBean(ISpaceOptimizeUltraCloudService.class);
XServiceResult result = service.optimizeUltraJob(xContext);
......@@ -45,7 +45,7 @@ public class SpaceOptimizeUltraJob implements XJob {
xContext.getLogger().error("------ SpaceOptimizeUltraJob Exception: ", e);
} finally {
xContext.getLogger().info("------ SpaceOptimizeUltraJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -27,10 +27,10 @@ public class StationDailyProductionSituationJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ StationDailyProductionSituationJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "StationDailyProductionSituationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "StationDailyProductionSituationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IStationDailyCloudService service = xContext.getBean(IStationDailyCloudService.class);
XServiceResult result = service.stationDailyJob(xContext);
......@@ -39,7 +39,7 @@ public class StationDailyProductionSituationJob {
xContext.getLogger().error("------ StationDailyProductionSituationJob Exception: ", e);
} finally {
xContext.getLogger().info("------ StationDailyProductionSituationJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class ThirdActivePowerJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdActivePowerJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdActivePowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdActivePowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.thirdActivePowerJob(xContext);
......@@ -40,7 +40,7 @@ public class ThirdActivePowerJob {
xContext.getLogger().error("------ ThirdActivePowerJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdActivePowerJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class ThirdCurrentWellConditionJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdCurrentWellConditionJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdCurrentWellConditionJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdCurrentWellConditionJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.thirdCurrentWellConditionJob(xContext);
......@@ -40,7 +40,7 @@ public class ThirdCurrentWellConditionJob {
xContext.getLogger().error("------ ThirdCurrentWellConditionJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdCurrentWellConditionJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class ThirdDailyAccumulationJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdDailyAccumulationJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdDailyAccumulationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdDailyAccumulationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.thirdDailyAccumulationJob(xContext);
......@@ -40,7 +40,7 @@ public class ThirdDailyAccumulationJob {
xContext.getLogger().error("------ ThirdDailyAccumulationJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdDailyAccumulationJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class ThirdPhotovoltaicPowerJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdPhotovoltaicPowerJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdPhotovoltaicPowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdPhotovoltaicPowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.thirdPhotovoltaicPowerJob(xContext);
......@@ -40,7 +40,7 @@ public class ThirdPhotovoltaicPowerJob {
xContext.getLogger().error("------ ThirdPhotovoltaicPowerJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdPhotovoltaicPowerJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class ThirdWellAvgActivePowerJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdWellAvgActivePowerJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdWellAvgActivePowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdWellAvgActivePowerJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdDataAccessCloudService service = xContext.getBean(IThirdDataAccessCloudService.class);
XServiceResult result = service.thirdWellAvgActivePowerJob(xContext);
......@@ -40,7 +40,7 @@ public class ThirdWellAvgActivePowerJob {
xContext.getLogger().error("------ ThirdWellAvgActivePowerJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdWellAvgActivePowerJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -2,7 +2,6 @@ package pps.core.task.job;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import pps.cloud.base.service.IThirdWindPowerGenerationCloudService;
import pps.core.common.cache.TaskLockCache;
import pps.core.task.constant.TaskConstant;
import pps.core.task.utils.ServiceUtil;
......@@ -30,10 +29,10 @@ public class ThirdWindPowerGenerationJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ ThirdWindPowerGenerationJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "ThirdWindPowerGenerationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "ThirdWindPowerGenerationJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IThirdWindPowerGenerationCloudService service = xContext.getBean(IThirdWindPowerGenerationCloudService.class);
XServiceResult result = service.thirdWindPowerGenerationJob(xContext);
......@@ -42,7 +41,7 @@ public class ThirdWindPowerGenerationJob {
xContext.getLogger().error("------ ThirdWindPowerGenerationJob Exception: ", e);
} finally {
xContext.getLogger().info("------ ThirdWindPowerGenerationJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
package pps.core.task.job;
import cn.hutool.core.util.ObjectUtil;
import pps.cloud.base.service.IBaseWeatherCloudService;
import pps.core.common.cache.TaskLockCache;
import pps.core.task.constant.TaskConstant;
import pps.core.task.utils.ServiceUtil;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 天气API数据邮件接收定时任务
*
* @author ZWT
* @date 2024/04/22 17:24
*/
@XText("天气API数据邮件接收定时任务")
public class WeatherApiReceiveJob {
/**
* 早/晚九点十五分执行 0 15 9/12 * * ?
*
* @param xContext x上下文
* @return {@link XServiceResult}
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ WeatherApiReceiveJob start:{}", System.currentTimeMillis());
String key = TaskConstant.TASK_LOCK_KEY + "WeatherApiReceiveJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
try {
IBaseWeatherCloudService service = xContext.getBean(IBaseWeatherCloudService.class);
XServiceResult result = service.weatherApiDataProcess(xContext);
result.throwIfFail();
} catch (Exception e) {
xContext.getLogger().error("------ WeatherApiReceiveJob Exception: ", e);
} finally {
xContext.getLogger().info("------ WeatherApiReceiveJob end:{}", System.currentTimeMillis());
TaskLockCache.delete(xContext, key);
}
}
return XServiceResult.OK;
}
}
\ No newline at end of file
......@@ -28,10 +28,10 @@ public class WeatherReceiveJob {
*/
public XServiceResult execute(XContext xContext, String oilFieldCode) {
xContext.getLogger().info("------ WeatherReceiveJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "WeatherReceiveJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "WeatherReceiveJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IBaseWeatherCloudService service = xContext.getBean(IBaseWeatherCloudService.class);
XServiceResult result = service.weatherDataProcess(xContext, oilFieldCode);
......@@ -40,7 +40,7 @@ public class WeatherReceiveJob {
xContext.getLogger().error("------ WeatherReceiveJob Exception: ", e);
} finally {
xContext.getLogger().info("------ WeatherReceiveJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
......@@ -28,10 +28,10 @@ public class WellTechDailyJob {
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ WellTechDailyJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "WellTechDailyJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
String redisFlag = TaskConstant.TASK_LOCK_FLAG + "WellTechDailyJob";
TaskLockCache exist = TaskLockCache.exist(xContext, redisFlag);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
ServiceUtil.setCache(xContext, redisFlag);
try {
IPlantPredictedPowerCloudService service = xContext.getBean(IPlantPredictedPowerCloudService.class);
XServiceResult result = service.wellTechDailyJob(xContext);
......@@ -40,7 +40,7 @@ public class WellTechDailyJob {
xContext.getLogger().error("------ WellTechDailyJob Exception: ", e);
} finally {
xContext.getLogger().info("------ WellTechDailyJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
TaskLockCache.delete(xContext, redisFlag);
}
}
return XServiceResult.OK;
......
package pps.core.task.job;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import pps.cloud.base.service.IWindPredictionHistoryCloudService;
import pps.core.common.cache.TaskLockCache;
import pps.core.task.constant.TaskConstant;
import pps.core.task.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.data.XServiceResult;
/**
* 风资源训练集数据定时任务
*
* @author ZWT
* @date 2024/08/30 13:50
*/
@XText("风资源训练集数据定时任务")
@XService
public class WindPredictionHistoryJob {
/**
* 每天00:12执行 0 12 0 * * ?
*
* @param xContext x上下文
* @return {@link XServiceResult }
*/
public XServiceResult execute(XContext xContext) {
xContext.getLogger().info("------ WindPredictionHistoryJob start:{}", DateUtil.date());
String key = TaskConstant.TASK_LOCK_KEY + "WindPredictionHistoryJob";
TaskLockCache exist = TaskLockCache.exist(xContext, key);
if (ObjectUtil.isNull(exist)) {
ServiceUtil.setCache(xContext, key);
try {
IWindPredictionHistoryCloudService service = xContext.getBean(IWindPredictionHistoryCloudService.class);
XServiceResult result = service.windPredictionHistoryJob(xContext);
result.throwIfFail();
} catch (Exception e) {
xContext.getLogger().error("------ WindPredictionHistoryJob Exception: ", e);
} finally {
xContext.getLogger().info("------ WindPredictionHistoryJob end:{}", DateUtil.date());
TaskLockCache.delete(xContext, key);
}
}
return XServiceResult.OK;
}
}
......@@ -38,7 +38,6 @@ import pps.core.space.enums.BusinessError;
import pps.core.space.mapper.*;
import pps.core.space.service.data.*;
import pps.core.space.service.data.space_institution_detail.OptimizeWellResult;
import pps.core.space.service.data.space_optimize_effect.GetSpaceOptimizeEffectOutput;
import pps.core.space.service.data.space_optimize_period.GetPredictedPowerOutput;
import pps.core.space.service.data.space_optimize_period.GetSpaceOptimizePeriodInput;
import pps.core.space.service.data.space_optimize_period.GetSpaceOptimizePeriodOutput;
......@@ -700,9 +699,15 @@ public class SpaceOptimizeBaseService {
}
//计算权重时间轴
//每日最小开井时长(分钟)
int minOpenMinute = tundraStrategyWellhead.getMinOpen()
int minOpenMinute;
BigDecimal minOpen = tundraStrategyWellhead.getMinOpen();
if (ObjectUtil.isNull(minOpen)) {
minOpenMinute = 0;
} else {
minOpenMinute = minOpen
.multiply(BusinessConstant.BIG_DECIMAL_60)
.intValue();
}
serviceRating = serviceRating.add(tundraStrategyWellhead.getServiceRating());
List<SpaceOptimizeWeight> weightList = this.calculateWeightList(serviceRating, rangeToList, powerList, strategyList, isOffGrid);
List<SpaceOptimizeWeightDuration> weightDurationList = this.weightListProcessing(weightList, minOpenMinute);
......@@ -2028,24 +2033,6 @@ public class SpaceOptimizeBaseService {
wellheadOutputs = Collections.emptyList();
} else {
if (CollUtil.isNotEmpty(durationOutputs)) {
//查能耗
SpaceOptimizeEffectMapper mapper = context.getBean(SpaceOptimizeEffectMapper.class);
List<SpaceOptimizeEffectEnt> effectList = mapper.selectList(new LambdaQueryWrapper<SpaceOptimizeEffectEnt>()
.select(SpaceOptimizeEffectEnt::getWellheadId, SpaceOptimizeEffectEnt::getGreenPowerRate, SpaceOptimizeEffectEnt::getPowerCost,
SpaceOptimizeEffectEnt::getOptimalGreenPowerRate, SpaceOptimizeEffectEnt::getOptimalPowerCost, SpaceOptimizeEffectEnt::getInstitutionResult,
SpaceOptimizeEffectEnt::getGreenPowerUpgrade, SpaceOptimizeEffectEnt::getCostDown, SpaceOptimizeEffectEnt::getOptimalResult)
.eq(BaseModel::getIsDeleted, 1)
.eq(SpaceOptimizeEffectEnt::getPeriodId, periodId)
.eq(SpaceOptimizeEffectEnt::getOptimizeDate, optimizeDate)
);
Map<String, SpaceOptimizeEffectEnt> effectMap;
if (CollUtil.isNotEmpty(effectList)) {
effectMap = effectList.stream()
.collect(Collectors.toMap(SpaceOptimizeEffectEnt::getWellheadId, Function.identity()));
} else {
effectMap = Collections.emptyMap();
}
//处理间开
Map<String, List<SpaceOptimizeDateDuration>> collect = new HashMap<>(16);
for (SpaceOptimizeDateDuration durationOutput : durationOutputs) {
if (CharSequenceUtil.isEmpty(durationOutput.getGenerationTypeKey())) {
......@@ -2062,55 +2049,13 @@ public class SpaceOptimizeBaseService {
}
//封装
Map<Integer, List<SpaceOptimizeDateDuration>> listMap;
SpaceOptimizeEffectEnt effect;
boolean isOptimal;
BigDecimal costDown;
String optimalResult;
BigDecimal optimalGreenPowerRate;
BigDecimal optimalPowerCost;
BigDecimal greenPowerUpgrade;
for (GetSpaceOptimizeWellheadOutput w : wellheadOutputs) {
//封装能耗分析
if (effectMap.containsKey(w.getWellheadId())) {
effect = effectMap.get(w.getWellheadId());
costDown = effect.getCostDown();
//降低成本大于等于0才优化(1天/3天间开不处理结果)
isOptimal = BusinessConstant.FOUR.equals(flag) || BusinessConstant.THREE.equals(flag) || costDown.compareTo(BigDecimal.ZERO) >= 0;
if (isOptimal) {
optimalResult = effect.getOptimalResult();
optimalGreenPowerRate = effect.getOptimalGreenPowerRate();
optimalPowerCost = effect.getOptimalPowerCost();
greenPowerUpgrade = effect.getGreenPowerUpgrade();
} else {
optimalResult = effect.getInstitutionResult();
optimalGreenPowerRate = effect.getGreenPowerRate();
optimalPowerCost = effect.getPowerCost();
greenPowerUpgrade = BigDecimal.ZERO;
costDown = BigDecimal.ZERO;
}
w.setEffect(GetSpaceOptimizeEffectOutput.builder()
.optimalResult(optimalResult)
.greenPowerRate(effect.getGreenPowerRate())
.powerCost(effect.getPowerCost())
.optimalGreenPowerRate(optimalGreenPowerRate)
.optimalPowerCost(optimalPowerCost)
.greenPowerUpgrade(greenPowerUpgrade)
.costDown(costDown)
.build());
} else {
w.setEffect(new GetSpaceOptimizeEffectOutput());
isOptimal = false;
}
//封装间开
if (collect.containsKey(w.getWellheadId())) {
listMap = collect.get(w.getWellheadId()).stream()
.collect(Collectors.groupingBy(SpaceOptimizeDateDuration::getIsOptimize));
//填充关井时间(降低成本大于等于0才优化)
if (isOptimal) {
w.setOptimizeList(ServiceUtil.getAllDateDuration(listMap.get(0)));
} else {
w.setOptimizeList(ServiceUtil.getAllDateDuration(listMap.get(1)));
}
w.setInitializeList(ServiceUtil.getAllDateDuration(listMap.get(1)));
} else {
w.setOptimizeList(Collections.emptyList());
......@@ -3719,7 +3664,7 @@ public class SpaceOptimizeBaseService {
beginTypeKey = weight.getGenerationTypeKey();
beginTime = startTime;
}
if (!CharSequenceUtil.equals(beginTypeKey, weight.getGenerationTypeKey())) {
if (!CharSequenceUtil.equals(beginTypeKey, weight.getGenerationTypeKey()) && ObjectUtil.isNotNull(beginTime)) {
this.createOptimizeDuration(durationDTOList, durationDTO.getPeriodId(), durationDTO.getRecordId(), durationDTO.getWellheadId(), beginTypeKey,
beginTime.toString(BusinessConstant.MINUTES_FORMAT),
weight.getTimestamp().toString(BusinessConstant.MINUTES_FORMAT),
......@@ -3730,7 +3675,7 @@ public class SpaceOptimizeBaseService {
}
}
//时间戳大于结束时间,跳出循环设置下次索引位置
if (DateUtil.compare(weight.getTimestamp(), endTime) > 0) {
if (DateUtil.compare(weight.getTimestamp(), endTime) > 0 && ObjectUtil.isNotNull(beginTime)) {
this.createOptimizeDuration(durationDTOList, durationDTO.getPeriodId(), durationDTO.getRecordId(), durationDTO.getWellheadId(), beginTypeKey,
beginTime.toString(BusinessConstant.MINUTES_FORMAT),
endTime.toString(BusinessConstant.MINUTES_FORMAT),
......
......@@ -859,11 +859,23 @@ public class HomePageService {
cumulativeProduction = BigDecimal.ZERO;
powerGeneration = BigDecimal.ZERO;
dailyElectricityConsumption = BigDecimal.ZERO;
} else {
if (ObjectUtil.isNull(dailyAccumulation.getDailyLiquidProduction())) {
cumulativeProduction = BigDecimal.ZERO;
} else {
cumulativeProduction = dailyAccumulation.getDailyLiquidProduction().setScale(2, RoundingMode.HALF_UP);
}
if (ObjectUtil.isNull(dailyAccumulation.getPhotovoltaicPower())) {
powerGeneration = BigDecimal.ZERO;
} else {
powerGeneration = dailyAccumulation.getPhotovoltaicPower().setScale(2, RoundingMode.HALF_UP);
}
if (ObjectUtil.isNull(dailyAccumulation.getDailyElectricityConsumption())) {
dailyElectricityConsumption = BigDecimal.ZERO;
} else {
dailyElectricityConsumption = dailyAccumulation.getDailyElectricityConsumption().setScale(2, RoundingMode.HALF_UP);
}
}
return XSingleResult.success(GetLineViewOutput.builder()
.wellList(wellheadList)
.operatingLoad(operatingLoad)
......
......@@ -5,17 +5,13 @@ import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.EasyExcelFactory;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.excel.util.EasyExcelUtil;
import pps.core.common.excel.util.ExcelStyleTool;
import pps.core.prediction.entity.PlantPowerDataEnt;
import pps.core.prediction.entity.PlantPowerDataView;
import pps.core.prediction.enums.ImportFieldDic;
import pps.core.prediction.mapper.PlantPowerDataMapper;
import pps.core.prediction.mapper.PlantPowerDataViewMapper;
import pps.core.prediction.service.data.plant_power_data.ExcelPlantPowerTemplate;
import pps.core.prediction.service.data.plant_power_data.ImportFileInput;
import pps.core.prediction.service.data.plant_power_data.QueryPlantPowerDataInput;
......@@ -24,7 +20,6 @@ import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.tool.XStorageTool;
import xstartup.base.util.XHttpUtils;
import xstartup.data.XFileResult;
import xstartup.data.XFileType;
import xstartup.data.XPageResult;
......@@ -34,8 +29,6 @@ import xstartup.feature.api.annotation.XApiUpload;
import xstartup.feature.mybatis.helper.XMapperHelper;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
@XService
@XText("电站实际发电数据")
......@@ -95,71 +88,6 @@ public class PlantPowerDataService {
@XText("导入电站实际发电数据")
@XApiUpload
public XServiceResult importPlantPowerData(XContext context, ImportFileInput input) {
List<ExcelPlantPowerTemplate> list = EasyExcelUtil.getExcelDataAndCheck(input.getFile(), ExcelPlantPowerTemplate.class,
null, null);
if (CollUtil.isNotEmpty(list)) {
DateTime dateTime;
DateTime minDate = null;
DateTime maxDate = null;
List<PlantPowerDataView> dataList = new ArrayList<>(list.size());
for (ExcelPlantPowerTemplate template : list) {
if (ObjectUtil.isNotNull(template.getDataDate())) {
dateTime = DateUtil.date(template.getDataDate());
if (ObjectUtil.isNull(minDate)) {
minDate = dateTime;
maxDate = dateTime;
}
if (minDate.compareTo(dateTime) > 0) {
minDate = dateTime;
} else if (dateTime.compareTo(maxDate) > 0) {
maxDate = dateTime;
}
dataList.add(
PlantPowerDataView.builder()
.dataDate(dateTime)
.windSpeed(BusinessConstant.BIG_DECIMAL_6_67)
.windDirection(BigDecimal.ZERO)
.temperature(BusinessConstant.BIG_DECIMAL_4)
.pressure(BigDecimal.ONE)
.humidity(BusinessConstant.BIG_DECIMAL_3)
.planeIrradiance(BusinessConstant.BIG_DECIMAL_2)
.horizontalIrradiance(BusinessConstant.BIG_DECIMAL_4)
.power(BusinessConstant.BIG_DECIMAL_60)
.build()
);
}
}
PlantPowerDataMapper mapper = context.getBean(PlantPowerDataMapper.class);
mapper.delete(new QueryWrapper<PlantPowerDataEnt>()
.lambda()
.eq(PlantPowerDataEnt::getPlantId, input.getPlantId())
.ge(PlantPowerDataEnt::getDataDate, minDate)
.le(PlantPowerDataEnt::getDataDate, maxDate));
PlantPowerDataViewMapper viewMapper = context.getBean(PlantPowerDataViewMapper.class);
viewMapper.insertBatch(dataList);
//进行训练
doTrainData(context, input.getPlantId());
}
return XServiceResult.OK;
}
private List<String> getExcelHeaderList() {
List<Map<String, Object>> fieldList = new ArrayList<>();
for (ImportFieldDic value : ImportFieldDic.values()) {
Map<String, Object> map = new HashMap<>();
map.put("col", value.getCol());
map.put("sort", value.getSort());
fieldList.add(map);
}
fieldList.sort(Comparator.comparing(o -> ((Integer) o.get("sort"))));
return fieldList.stream().map(x -> ((String) x.get("col"))).collect(Collectors.toList());
}
public void doTrainData(XContext context, String plantId) {
try {
XHttpUtils.postAsJson("http://127.0.0.1:10098/aiprediction/xgbtrain?plantId=" + plantId, 10000);
} catch (Exception e) {
context.getLogger().error(e.getMessage());
}
}
}
\ No newline at end of file
......@@ -3,9 +3,8 @@ package pps.core.prediction.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadInput;
import pps.cloud.base.service.data.base_wellhead.DynamicQueryBaseWellheadOutput;
import pps.cloud.middle.service.IWellDailyProductionSituationCloudService;
......@@ -14,10 +13,7 @@ import pps.cloud.middle.service.data.wellhead_daily_production_situation.GetWell
import pps.cloud.prediction.service.IPlantPredictedPowerCloudService;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerInput;
import pps.cloud.prediction.service.data.plant_predicted_power_data.DynamicQueryPlantPredictedPowerOutput;
import pps.core.auth.HttpRequestClient;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.BaseUtils;
import pps.core.prediction.constant.ThirdPartyApiConstant;
import pps.core.prediction.entity.PredictedPowerView;
import pps.core.prediction.entity.WellheadDailyProductionSituationView;
import pps.core.prediction.mapper.PredictedPowerViewMapper;
......@@ -26,14 +22,16 @@ import pps.core.prediction.service.data.wellhead_daily_production_situation.Well
import pps.core.prediction.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.base.XContext;
import xstartup.base.XStartup;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XListResult;
import xstartup.data.XServiceResult;
import xstartup.helper.XTransactionHelper;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -206,9 +204,12 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
if (CollUtil.isEmpty(list)) {
return XServiceResult.OK;
}
List<String> collect = list.stream()
.map(WellheadDailyProductionSituationJob::getWellNumber)
.collect(Collectors.toList());
List<String> collect = new ArrayList<>(16);
for (WellheadDailyProductionSituationJob job : list) {
if (CharSequenceUtil.isNotBlank(job.getWellNumber())) {
collect.add(job.getWellNumber());
}
}
Map<String, String> map = ServiceUtil.getBaseWellheadList(context, DynamicQueryBaseWellheadInput.builder()
.wellNumbers(collect)
.build()).stream()
......@@ -263,8 +264,6 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
List<WellheadDailyProductionSituationJob> list = null;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
IWellDailyProductionSituationCloudService service = context.getBean(IWellDailyProductionSituationCloudService.class);
XListResult<GetWellheadDailyProductionSituationOutput> result = service.getWellDailyProductionSituationList(context, GetWellheadDailyProductionSituationInput.builder()
.dataDate(DateUtil.beginOfDay(DateUtil.yesterday()).toDateStr())
......@@ -295,29 +294,16 @@ public class PlantPredictedPowerCloudServiceImpl implements IPlantPredictedPower
);
}
}
break;
case BusinessConstant.ENV_CQ:
String token = ServiceUtil.getToken(context);
HttpRequestClient client = new HttpRequestClient(token);
Map<String, Object> param = new HashMap<>(4);
param.put("Calc_Date", DateUtil.yesterday().toString(BusinessConstant.DATE_FORMAT_DAY));
String url = XStartup.getCurrent().getProperty("third-party.chang-qing.url");
url += ThirdPartyApiConstant.CQ_WELL_TECH_DAILY;
String resultStr = client.doPostForm(url, param);
context.getLogger().info("*** CQ_WELL_TECH_DAILY : {}", resultStr);
JSONObject jsonObject = JSON.parseObject(resultStr);
String data = jsonObject.getString("data");
list = JSON.parseArray(data, WellheadDailyProductionSituationJob.class);
break;
default:
}
if (CollUtil.isEmpty(list)) {
context.getLogger().info("------ WellTechDailyJob 未发现数据: {}", DateUtil.yesterday().toString("yyyy-MM-dd"));
return XServiceResult.OK;
}
List<String> collect = list.stream()
.map(WellheadDailyProductionSituationJob::getWellNumber)
.collect(Collectors.toList());
List<String> collect = new ArrayList<>(16);
for (WellheadDailyProductionSituationJob job : list) {
if (CharSequenceUtil.isNotBlank(job.getWellNumber())) {
collect.add(job.getWellNumber());
}
}
Map<String, String> map = ServiceUtil.getBaseWellheadList(context, DynamicQueryBaseWellheadInput.builder()
.wellNumbers(collect)
.build()).stream()
......
......@@ -13,7 +13,6 @@ import pps.core.prediction.mapper.PlantPredictedPowerLongTermDataMapper;
import pps.core.prediction.service.data.plant_predicted_power_data.DoPlantPredictedPowerDataInput;
import pps.core.prediction.service.data.plant_predicted_power_data.GetPlantPredictedPowerDataInput;
import pps.core.prediction.service.data.plant_predicted_power_data.GetPlantPredictedPowerDataOutput;
import pps.core.prediction.utils.HttpUtils;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
......@@ -150,17 +149,6 @@ public class PlantPredictedPowerDataService {
@XText("预测电站发电数据")
@XApiPost
public XServiceResult doPredictedPowerData(XContext context, DoPlantPredictedPowerDataInput input) {
doPredictedData(context, input.getPlantId());
return XServiceResult.OK;
}
public void doPredictedData(XContext context, String plantId) {
try {
Object ret = HttpUtils.send2("http://127.0.0.1:10098/aiprediction/xgbreason?plantId=" + plantId,
"");
context.getLogger().info(ret.toString());
} catch (Exception e) {
throw new RuntimeException("调用训练接口失败");
}
}
}
\ No newline at end of file
......@@ -4,7 +4,6 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import pps.cloud.base.service.data.base_photovoltaic_plant.GetBasePhotovoltaicPlantCloudInput;
......@@ -21,9 +20,7 @@ import pps.cloud.middle.service.data.third_photovoltaic_power.GetThirdPhotovolta
import pps.cloud.middle.service.data.third_photovoltaic_power.GetThirdPhotovoltaicPowerOutput;
import pps.cloud.middle.service.data.third_well_avg_active_power.GetThirdWellAvgActivePowerInput;
import pps.cloud.prediction.service.IThirdDataAccessCloudService;
import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.BaseUtils;
import pps.core.prediction.constant.ThirdPartyApiConstant;
import pps.core.prediction.entity.*;
import pps.core.prediction.mapper.*;
import pps.core.prediction.service.data.third_active_power.GetThirdActivePowerViewOutput;
......@@ -151,11 +148,8 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
*/
@Override
public XServiceResult thirdActivePowerJob(XContext context) {
List<GetThirdActivePowerViewOutput> outputs;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
//查数据表最新记录数据时间
ThirdActivePowerDailyUpdateMapper mapper = context.getBean(ThirdActivePowerDailyUpdateMapper.class);
ThirdActivePowerDailyUpdateEnt maxEnt = mapper.selectOne(new QueryWrapper<ThirdActivePowerDailyUpdateEnt>()
......@@ -171,18 +165,7 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
.createDate(createDate)
.build());
result.throwIfFail();
outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdActivePowerViewOutput.class);
break;
case BusinessConstant.ENV_CQ:
String resultStr = ServiceUtil.doPostFormCq(context,
ThirdPartyApiConstant.CQ_WELL_STATION_PV_DATA,
new HashMap<>(0));
context.getLogger().info("*** CQ_WELL_STATION_PV_DATA : {}", resultStr);
outputs = JSON.parseArray(resultStr, GetThirdActivePowerViewOutput.class);
break;
default:
return XServiceResult.OK;
}
List<GetThirdActivePowerViewOutput> outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdActivePowerViewOutput.class);
//数据处理
if (CollUtil.isEmpty(outputs)) {
return XServiceResult.OK;
......@@ -236,14 +219,14 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
//删除重复数据
ThirdActivePowerMapper powerMapper = context.getBean(ThirdActivePowerMapper.class);
powerMapper.delete(queryWrapper);
ThirdActivePowerViewMapper mapper = context.getBean(ThirdActivePowerViewMapper.class);
ThirdActivePowerViewMapper mapper2 = context.getBean(ThirdActivePowerViewMapper.class);
//保存历史数据
if (CollUtil.isNotEmpty(dtoList)) {
if (dtoList.size() > BaseUtils.BATCH_SIZE) {
List<List<ThirdActivePowerView>> subList = BaseUtils.getSubList(dtoList);
subList.forEach(mapper::batchInsertList);
subList.forEach(mapper2::batchInsertList);
} else {
mapper.batchInsertList(dtoList);
mapper2.batchInsertList(dtoList);
}
}
ThirdActivePowerDailyUpdateViewMapper dailyMapper = context.getBean(ThirdActivePowerDailyUpdateViewMapper.class);
......@@ -270,30 +253,16 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
*/
@Override
public XServiceResult thirdCurrentWellConditionJob(XContext context) {
List<GetThirdCurrentWellConditionViewOutput> outputs;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
IThirdCurrentWellConditionCloudService service = context.getBean(IThirdCurrentWellConditionCloudService.class);
XListResult<GetThirdCurrentWellConditionOutput> result = service.getCurrentWellConditionList(context, new GetThirdCurrentWellConditionInput());
result.throwIfFail();
outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdCurrentWellConditionViewOutput.class);
break;
case BusinessConstant.ENV_CQ:
String resultStr = ServiceUtil.doPostFormCq(context,
ThirdPartyApiConstant.CQ_WELL_REAL_PV_DATA,
new HashMap<>(0));
context.getLogger().info("*** CQ_WELL_REAL_PV_DATA : {}", resultStr);
outputs = JSON.parseArray(resultStr, GetThirdCurrentWellConditionViewOutput.class);
break;
default:
return XServiceResult.OK;
}
List<GetThirdCurrentWellConditionViewOutput> outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdCurrentWellConditionViewOutput.class);
if (CollUtil.isEmpty(outputs)) {
return XServiceResult.OK;
}
DateTime date = DateUtil.date();
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
//先删后增
BigDecimal cumulativeProduction;
List<ThirdCurrentWellConditionView> dtoList = new ArrayList<>(outputs.size());
......@@ -379,33 +348,17 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
*/
@Override
public XServiceResult thirdPhotovoltaicPowerJob(XContext context) {
List<GetThirdPhotovoltaicPowerViewOutput> outputs;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
IThirdPhotovoltaicPowerCloudService service = context.getBean(IThirdPhotovoltaicPowerCloudService.class);
XListResult<GetThirdPhotovoltaicPowerOutput> result = service.getPhotovoltaicPowerList(context, GetThirdPhotovoltaicPowerInput.builder()
.createDate(DateUtil.beginOfDay(DateUtil.yesterday()))
.build());
result.throwIfFail();
outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdPhotovoltaicPowerViewOutput.class);
break;
case BusinessConstant.ENV_CQ:
Map<String, Object> param = new HashMap<>(4);
param.put("Calc_Date", DateUtil.yesterday().toString("yyyy-MM-dd"));
String resultStr = ServiceUtil.doPostFormCq(context,
ThirdPartyApiConstant.CQ_STATION_DAILY_PV_DATA,
param);
context.getLogger().info("*** CQ_STATION_DAILY_PV_DATA : {}", resultStr);
outputs = JSON.parseArray(resultStr, GetThirdPhotovoltaicPowerViewOutput.class);
break;
default:
return XServiceResult.OK;
}
List<GetThirdPhotovoltaicPowerViewOutput> outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdPhotovoltaicPowerViewOutput.class);
if (CollUtil.isEmpty(outputs)) {
return XServiceResult.OK;
}
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
BigDecimal photovoltaicPower;
List<ThirdPhotovoltaicPowerView> dtoList = new ArrayList<>(outputs.size());
for (GetThirdPhotovoltaicPowerViewOutput output : outputs) {
......@@ -495,26 +448,12 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
*/
@Override
public XServiceResult thirdDailyAccumulationJob(XContext context) {
List<GetCumulativePowerGenerationOutput> outputs;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
IThirdDailyAccumulationCloudService service = context.getBean(IThirdDailyAccumulationCloudService.class);
XListResult<GetThirdDailyAccumulationOutput> result = service.getDailyAccumulationList(context, new GetThirdDailyAccumulationInput());
result.throwIfFail();
outputs = XCopyUtils.copyNewList(result.getResult(), GetCumulativePowerGenerationOutput.class);
break;
case BusinessConstant.ENV_CQ:
String resultStr = ServiceUtil.doPostFormCq(context,
ThirdPartyApiConstant.CQ_GROUP_REAL_PV_DATA,
new HashMap<>(0));
context.getLogger().info("*** CQ_GROUP_REAL_PV_DATA : {}", resultStr);
outputs = JSON.parseArray(resultStr, GetCumulativePowerGenerationOutput.class);
break;
default:
return XServiceResult.OK;
}
List<GetCumulativePowerGenerationOutput> outputs = XCopyUtils.copyNewList(result.getResult(), GetCumulativePowerGenerationOutput.class);
if (CollUtil.isEmpty(outputs)) {
return XServiceResult.OK;
}
......@@ -634,29 +573,15 @@ public class ThirdDataAccessCloudServiceImpl implements IThirdDataAccessCloudSer
*/
@Override
public XServiceResult thirdWellAvgActivePowerJob(XContext context) {
List<GetThirdWellAvgActivePowerOutput> outputs;
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
switch (oilFieldCode) {
case BusinessConstant.ENV_SY:
IThirdWellAvgActivePowerCloudService service = context.getBean(IThirdWellAvgActivePowerCloudService.class);
XListResult<pps.cloud.middle.service.data.third_well_avg_active_power.GetThirdWellAvgActivePowerOutput> result = service.getThirdActivePowerList(context, new GetThirdWellAvgActivePowerInput());
result.throwIfFail();
outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdWellAvgActivePowerOutput.class);
break;
case BusinessConstant.ENV_CQ:
String resultStr = ServiceUtil.doPostFormCq(context,
ThirdPartyApiConstant.CQ_AVG_ACTIVE_POWER,
new HashMap<>(0));
context.getLogger().info("*** CQ_AVG_ACTIVE_POWER : {}", resultStr);
outputs = JSON.parseArray(resultStr, GetThirdWellAvgActivePowerOutput.class);
break;
default:
return XServiceResult.OK;
}
List<GetThirdWellAvgActivePowerOutput> outputs = XCopyUtils.copyNewList(result.getResult(), GetThirdWellAvgActivePowerOutput.class);
if (CollUtil.isEmpty(outputs)) {
return XServiceResult.OK;
}
//区分环境
String oilFieldCode = ServiceUtil.getOilFieldCode(context);
DateTime beginOfDay = DateUtil.date();
//封装数据
List<ThirdWellAvgActivePowerView> dtoList = new ArrayList<>(outputs.size());
......
package pps.core.prediction.service;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.page.PageMethod;
import pps.core.auth.HttpRequestClient;
import pps.core.common.constant.BusinessConstant;
import pps.core.prediction.constant.ThirdPartyApiConstant;
import pps.core.prediction.entity.WellheadDailyProductionSituationEnt;
import pps.core.prediction.excel.listener.ThirdActivePowerDataListener;
import pps.core.prediction.mapper.WellheadDailyProductionSituationMapper;
......@@ -20,11 +15,9 @@ import pps.core.prediction.service.data.wellhead_daily_production_situation.GetW
import pps.core.prediction.service.data.wellhead_daily_production_situation.GetWellheadDailyProductionSituationOutput;
import pps.core.prediction.service.data.wellhead_daily_production_situation.QueryWellheadDailyProductionSituationInput;
import pps.core.prediction.service.data.wellhead_daily_production_situation.QueryWellheadDailyProductionSituationOutput;
import pps.core.prediction.utils.ServiceUtil;
import xstartup.annotation.XService;
import xstartup.annotation.XText;
import xstartup.base.XContext;
import xstartup.base.XStartup;
import xstartup.base.util.XCopyUtils;
import xstartup.data.XListResult;
import xstartup.data.XPageResult;
......@@ -33,9 +26,7 @@ import xstartup.feature.api.annotation.XApiGet;
import xstartup.feature.api.annotation.XApiPost;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 井口生产情况模块
......@@ -88,21 +79,7 @@ public class WellheadDailyProductionSituationService {
@XText("井口生产情况--甘特图")
@XApiPost
public XListResult<GetWellheadDailyProductionSituationOutput> queryRptSystemStartStop(XContext context, GetWellheadDailyProductionSituationInput input) {
String token = ServiceUtil.getToken(context);
HttpRequestClient client = new HttpRequestClient(token);
Map<String, Object> param = new HashMap<>(4);
param.put("Org_Name", input.getStationName());
param.put("WELL_NAME", input.getWellNumber());
String url = XStartup.getCurrent().getProperty("third-party.chang-qing.url");
url += ThirdPartyApiConstant.CQ_RPT_SYSTEM_START_STOP;
String resultStr = client.doPostForm(url, param);
JSONObject jsonObject = JSON.parseObject(resultStr);
String data = jsonObject.getString("data");
List<GetWellheadDailyProductionSituationOutput> outputs = JSON.parseArray(data, GetWellheadDailyProductionSituationOutput.class);
if (CollUtil.isEmpty(outputs)) {
outputs = Collections.emptyList();
}
return XListResult.success(outputs);
return XListResult.success(Collections.emptyList());
}
@XText("有功功率历史数据导入")
......
package pps.core.prediction.utils;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class HttpUtils {
public static String send2(String url, String param) throws Exception {
URL localURL = new URL(url);
URLConnection connection = localURL.openConnection();
HttpURLConnection httpURLConnection = (HttpURLConnection) connection;
httpURLConnection.setDoOutput(true);
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setRequestProperty("Accept", "application/json");
httpURLConnection.setRequestProperty("Content-Type", "application/json");
httpURLConnection.setRequestProperty("Content-Length", String.valueOf(param.length()));
httpURLConnection.setConnectTimeout(10000);
OutputStream outputStream = null;
OutputStreamWriter outputStreamWriter = null;
InputStream inputStream = null;
String resultBuffer = "";
try {
outputStream = httpURLConnection.getOutputStream();
outputStreamWriter = new OutputStreamWriter(outputStream);
outputStreamWriter.write(param);
outputStreamWriter.flush();
if (httpURLConnection.getResponseCode() >= 300) {
throw new Exception(
"HTTP Request is not success, Response code is " + httpURLConnection.getResponseCode());
}
inputStream = httpURLConnection.getInputStream();
resultBuffer = convertStreamToString(inputStream);
} finally {
if (outputStreamWriter != null) {
outputStreamWriter.close();
}
if (outputStream != null) {
outputStream.close();
}
if (inputStream != null) {
inputStream.close();
}
}
return resultBuffer;
}
public static String convertStreamToString(InputStream is) {
StringBuilder sb1 = new StringBuilder();
byte[] bytes = new byte[4096];
int size;
try {
while ((size = is.read(bytes)) > 0) {
String str = new String(bytes, 0, size, "UTF-8");
sb1.append(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return sb1.toString();
}
}
......@@ -3,7 +3,6 @@ package pps.core.prediction.utils;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ObjectUtil;
......@@ -29,7 +28,6 @@ import pps.cloud.base.service.data.config_oil_field.GetConfigOilFieldOutput;
import pps.cloud.system.service.SysOrganizationCloudService;
import pps.cloud.system.service.data.sys_organization.GetAllOuListByOuIdInput;
import pps.cloud.system.service.data.sys_organization.GetSysOrganizationViewOutput;
import pps.core.auth.HttpRequestClient;
import pps.core.common.cache.ThirdPartyConfigCache;
import pps.core.common.constant.BusinessConstant;
import pps.core.prediction.constant.ThirdPartyApiConstant;
......@@ -62,47 +60,6 @@ import java.util.stream.Collectors;
*/
public class ServiceUtil {
/**
* 调用接口(长庆)
*
* @param context 上下文
* @param api 应用程序编程接口
* @param param 参数
* @return {@link String}
*/
public static String doPostFormCq(XContext context, String api, Map<String, Object> param) {
String url = XStartup.getCurrent().getProperty("third-party.chang-qing.url");
String token = ServiceUtil.getToken(context);
HttpRequestClient client = new HttpRequestClient(token);
String resultStr = client.doPostForm(url + api, param);
JSONObject jsonObject = JSON.parseObject(resultStr);
context.getLogger().info("**** doPostFormCq api: {}", api);
context.getLogger().info("**** doPostFormCq resultStr: {}", resultStr);
return jsonObject.getString("data");
}
/**
* 获取长庆TOKEN
*
* @param context 上下文
* @return {@link String}
*/
public static String getToken(XContext context) {
String token;
ThirdPartyConfigCache exist = ThirdPartyConfigCache.exist(context, ThirdPartyApiConstant.CQ_TOKEN_CACHE_KEY);
if (ObjectUtil.isNull(exist)) {
token = ServiceUtil.getCqToken(context);
} else {
long duration = (long) exist.getDuration();
if (duration - DateUtil.between(exist.getCurrentDate(), DateUtil.date(), DateUnit.SECOND) < ThirdPartyApiConstant.MAX_SECOND) {
token = ServiceUtil.getCqToken(context);
} else {
token = exist.getCode();
}
}
return token;
}
/**
* 获得预测功率输出
*
......
......@@ -42,11 +42,6 @@ x.db.pps.core.middle.databaseId=@x.db.pps.core.middle.databaseId@
x.druid.validation-query=
# \u81EA\u5B9A\u4E49\u914D\u7F6E
weather.file.temp.path=@weather.file.temp.path@
weather.file.icon=@weather.file.icon@
weather.mail.host=@weather.mail.host@
weather.mail.username=@weather.mail.username@
weather.mail.password=@weather.mail.password@
weather.mail.protocol=@weather.mail.protocol@
#\u9996\u9875
home.image.path=@home.image.path@
#\u7B2C\u4E09\u65B9\u63A5\u53E3\u5730\u5740(\u957F\u5E86)
......
......@@ -34,13 +34,7 @@ x.db.pps.core.middle.password=BJ8HiKUS_Rg=
x.db.pps.core.middle.naming=snake-case
x.db.pps.core.middle.databaseId=Oracle
# \u81EA\u5B9A\u4E49\u914D\u7F6E
#weather.file.temp.path=D:/home/weather/temp/receive
weather.file.temp.path=/home/weather-jar/temp/receive
weather.file.icon=/home/weather-jar/icon
weather.mail.host=pop.qq.com
weather.mail.username=2289169069@qq.com
weather.mail.password=xiytzwcreqphdiga
weather.mail.protocol=pop3
#\u9996\u9875
home.image.path=/home/gf-jar/homeImg
#\u7B2C\u4E09\u65B9\u63A5\u53E3\u5730\u5740(\u957F\u5E86)
......
......@@ -35,12 +35,6 @@ x.db.pps.core.middle.naming=snake-case
x.db.pps.core.middle.databaseId=Oracle
# \u81EA\u5B9A\u4E49\u914D\u7F6E
weather.file.temp.path=D:\\IDE\\Project\\temp\\receive
weather.file.icon=D:\\IDE\\Project\\icon
#weather.file.temp.path=/home/weather-jar/temp/receive
weather.mail.host=mail.petrochina
weather.mail.username=lingtanproject@petrochina.com.cn
weather.mail.password=Cppeilingtan2024
weather.mail.protocol=pop3
#\u9996\u9875
home.image.path=/home/gf-jar/homeImg
#\u7B2C\u4E09\u65B9\u63A5\u53E3\u5730\u5740(\u957F\u5E86)
......
......@@ -34,13 +34,7 @@ x.db.pps.core.middle.password=ECqrraM3I35AFJ-VC0XOpw==
x.db.pps.core.middle.naming=snake-case
x.db.pps.core.middle.databaseId=Oracle
# \u81EA\u5B9A\u4E49\u914D\u7F6E
#weather.file.temp.path=D:/home/weather/temp/receive
weather.file.temp.path=/home/weather-jar/temp/receive
weather.file.icon=/home/weather-jar/icon
weather.mail.host=mail.petrochina
weather.mail.username=lingtanproject@petrochina.com.cn
weather.mail.password=Cppeilingtan2024
weather.mail.protocol=pop3
#\u9996\u9875
home.image.path=/home/gf-jar/homeImg
#\u7B2C\u4E09\u65B9\u63A5\u53E3\u5730\u5740(\u957F\u5E86)
......
......@@ -35,12 +35,6 @@ x.db.pps.core.middle.naming=snake-case
x.db.pps.core.middle.databaseId=Oracle
# \u81EA\u5B9A\u4E49\u914D\u7F6E
weather.file.temp.path=D:\\IDE\\Project\\temp\\receive
weather.file.icon=D:\\IDE\\Project\\icon
#weather.file.temp.path=/home/weather-jar/temp/receive
weather.mail.host=mail.petrochina
weather.mail.username=lingtanproject@petrochina.com.cn
weather.mail.password=Cppeilingtan2024
weather.mail.protocol=pop3
#\u9996\u9875
home.image.path=/home/gf-jar/homeImg
#\u7B2C\u4E09\u65B9\u63A5\u53E3\u5730\u5740(\u957F\u5E86)
......
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