Commit 5b6e43cd authored by ZWT's avatar ZWT

feat(零碳): 长庆

1.对接第三方接口,接入第三方数据,完成Token接口验证,抽取公用方法封装调用工具类;
2.对接第三方接口,完成获取日耗电日产液等信息接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
3.对接第三方接口,完成获取有功功率数据信息接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
4.对接第三方接口,完成获取甘特图数据接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
5.对接第三方接口,完成本日累计数据接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
6.对接第三方接口,完成光伏发电量接口调用,创建数据表,同时生成对应代码,开发定时任务及对外接口,完成第三方数据接入及系统展示功能,添加线上接口文档并完成接口及定时任务冒烟测试;
7.对接第三方接口,完成三叠登录接口调用,添加线上接口文档并完成接口及定时任务冒烟测试;

BREAKING CHANGE: 无

Closes 无

[skip ci]
parent 142c549e
...@@ -5,6 +5,8 @@ import xstartup.annotation.XText; ...@@ -5,6 +5,8 @@ import xstartup.annotation.XText;
import xstartup.base.XContext; import xstartup.base.XContext;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
import java.text.ParseException;
/** /**
* 天气数据接收Cloud模块 * 天气数据接收Cloud模块
* *
...@@ -22,5 +24,5 @@ public interface IBaseWeatherCloudService { ...@@ -22,5 +24,5 @@ public interface IBaseWeatherCloudService {
* @return {@link XServiceResult} * @return {@link XServiceResult}
*/ */
@XText("天气数据接收Cloud模块--天气数据处理") @XText("天气数据接收Cloud模块--天气数据处理")
XServiceResult weatherDataProcess(XContext context); XServiceResult weatherDataProcess(XContext context) throws ParseException;
} }
...@@ -8,12 +8,12 @@ import cn.hutool.core.io.IoUtil; ...@@ -8,12 +8,12 @@ import cn.hutool.core.io.IoUtil;
import cn.hutool.core.io.NioUtil; import cn.hutool.core.io.NioUtil;
import cn.hutool.core.io.file.FileReader; import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.ArrayUtil;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.web.client.RestTemplate;
import pps.cloud.base.service.IBaseWeatherCloudService; import pps.cloud.base.service.IBaseWeatherCloudService;
import pps.core.base.entity.BasePhotovoltaicPlantView; import pps.core.base.entity.BasePhotovoltaicPlantView;
import pps.core.base.entity.PlantPredictedPowerDataEnt; import pps.core.base.entity.PlantPredictedPowerDataEnt;
...@@ -22,6 +22,7 @@ import pps.core.base.mapper.BasePhotovoltaicPlantViewMapper; ...@@ -22,6 +22,7 @@ import pps.core.base.mapper.BasePhotovoltaicPlantViewMapper;
import pps.core.base.mapper.PlantPredictedPowerDataMapper; import pps.core.base.mapper.PlantPredictedPowerDataMapper;
import pps.core.base.mapper.PlantPredictedPowerDataViewMapper; import pps.core.base.mapper.PlantPredictedPowerDataViewMapper;
import pps.core.base.service.data.DailyData; import pps.core.base.service.data.DailyData;
import pps.core.base.utils.ReceivedIMAPMail;
import pps.core.common.constant.BusinessConstant; import pps.core.common.constant.BusinessConstant;
import pps.core.common.utils.BaseUtils; import pps.core.common.utils.BaseUtils;
import xstartup.annotation.XService; import xstartup.annotation.XService;
...@@ -30,10 +31,12 @@ import xstartup.base.XStartup; ...@@ -30,10 +31,12 @@ import xstartup.base.XStartup;
import xstartup.base.exception.XServiceException; import xstartup.base.exception.XServiceException;
import xstartup.base.tool.XLoggerTool; import xstartup.base.tool.XLoggerTool;
import xstartup.base.util.XCopyUtils; import xstartup.base.util.XCopyUtils;
import xstartup.core.base.helper.XThreadHelper;
import xstartup.data.XServiceResult; import xstartup.data.XServiceResult;
import xstartup.helper.XTransactionHelper; import xstartup.helper.XTransactionHelper;
import javax.mail.*; import javax.mail.*;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility; import javax.mail.internet.MimeUtility;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
...@@ -70,52 +73,15 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -70,52 +73,15 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
Store store = null; Store store = null;
Folder folder = null; Folder folder = null;
try { try {
// Properties props = System.getProperties();
// props.setProperty("mail.store.protocol", protocol);
// Session session = Session.getDefaultInstance(props, null);
// store = session.getStore(protocol);
// store.connect(host, username, password);
// folder = store.getFolder("INBOX");
// if (folder instanceof IMAPFolder) {
// IMAPFolder imapFolder = (IMAPFolder) folder;
// // javamail中使用id命令有校验checkOpened, 所以要去掉id方法中的checkOpened();
// imapFolder.doCommand(p -> {
// Map<String, String> gmap = new HashMap<>();
// gmap.put("GUID", "FUTONG");
// p.id(gmap);
// return null;
// });
// }
Properties props = new Properties(); Properties props = new Properties();
Session session = Session.getDefaultInstance(props, null); Session session = Session.getDefaultInstance(props, null);
store = session.getStore(protocol); store = session.getStore(protocol);
store.connect(host, username, password); store.connect(host, username, password);
folder = store.getFolder("INBOX"); folder = store.getFolder("INBOX");
if (Objects.nonNull(folder)) { folder.open(Folder.READ_WRITE);
folder.open(Folder.READ_WRITE);
}
logger.info("------ weatherDataProcess connect mail ------"); logger.info("------ weatherDataProcess connect mail ------");
Message[] messages = folder.getMessages(); List<Message> messageList = ReceivedIMAPMail.filterMessage(folder.getMessages(), null, null);
if (ArrayUtil.isNotEmpty(messages)) { if (CollUtil.isNotEmpty(messageList)) {
List<Message> messageList = new ArrayList<>(16);
for (Message message : messages) {
logger.info("------ weatherDataProcess " + message.getSubject() + " ------");
// boolean isNew = false;
for (Flags.Flag flag : message.getFlags().getSystemFlags()) {
logger.info("------ weatherDataProcess " + flag.toString() + " ------");
if (flag == Flags.Flag.SEEN) {
// isNew = true;
}
}
// if (!isNew && CharSequenceUtil.endWith(message.getSubject(), "天气预测数据")) {
if (CharSequenceUtil.endWith(message.getSubject(), "天气预测数据")) {
messageList.add(message);
}
}
if (CollUtil.isEmpty(messageList)) {
logger.info("------ weatherDataProcess messageList is empty ------");
return null;
}
//取电站 //取电站
BasePhotovoltaicPlantViewMapper viewMapper = context.getBean(BasePhotovoltaicPlantViewMapper.class); BasePhotovoltaicPlantViewMapper viewMapper = context.getBean(BasePhotovoltaicPlantViewMapper.class);
List<BasePhotovoltaicPlantView> plantList = viewMapper.selectPlantList(); List<BasePhotovoltaicPlantView> plantList = viewMapper.selectPlantList();
...@@ -129,8 +95,16 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -129,8 +95,16 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class); PlantPredictedPowerDataMapper mapper = context.getBean(PlantPredictedPowerDataMapper.class);
PlantPredictedPowerDataViewMapper dataViewMapper = context.getBean(PlantPredictedPowerDataViewMapper.class); PlantPredictedPowerDataViewMapper dataViewMapper = context.getBean(PlantPredictedPowerDataViewMapper.class);
List<String> timeList = Arrays.asList("15:00", "30:00", "45:00"); List<String> timeList = Arrays.asList("15:00", "30:00", "45:00");
//读取附件 ReceivedIMAPMail re;
for (Message message : messageList) { for (Message message : messageList) {
re = new ReceivedIMAPMail((MimeMessage) message);
String subject = re.getSubject();
logger.info("------ weatherDataProcess " + subject + " ------");
if (!CharSequenceUtil.endWith(subject, "天气预测数据")) {
continue;
}
//读取附件
re.getMailContent(message);
String tempFilePath = this.saveAttachment(message); String tempFilePath = this.saveAttachment(message);
logger.info("------ weatherDataProcess load file: {}", tempFilePath); logger.info("------ weatherDataProcess load file: {}", tempFilePath);
FileReader fileReader = new FileReader(tempFilePath); FileReader fileReader = new FileReader(tempFilePath);
...@@ -291,18 +265,17 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService { ...@@ -291,18 +265,17 @@ public class BaseWeatherCloudServiceImpl implements IBaseWeatherCloudService {
} }
//训练接口http://127.0.0.1:10098/aiprediction/xgbtrain?plantId=018a64635ac47cf58895147b0e1bf7e3 //训练接口http://127.0.0.1:10098/aiprediction/xgbtrain?plantId=018a64635ac47cf58895147b0e1bf7e3
//自动调用预测接口 //自动调用预测接口
// XThreadHelper.async(() -> { XThreadHelper.async(() -> {
// try { try {
// Thread.sleep(3000); Thread.sleep(3000);
// logger.info("------ weatherDataProcess http prediction plantId: {} ", plantId); logger.info("------ weatherDataProcess http prediction plantId: {} ", plantId);
// RestTemplate restTemplate = context.getBean(RestTemplate.class); RestTemplate restTemplate = context.getBean(RestTemplate.class);
// String forObject = restTemplate.getForObject("http://127.0.0.1:10098/aiprediction/xgbreason?plantId=" + plantId, String.class); String forObject = restTemplate.getForObject("http://127.0.0.1:10098/aiprediction/xgbreason?plantId=" + plantId, String.class);
// logger.info("------ weatherDataProcess http prediction res: {} ", forObject); logger.info("------ weatherDataProcess http prediction res: {} ", forObject);
// } catch (Exception e) { } catch (Exception e) {
// logger.error("------ weatherDataProcess Exception", e); logger.error("------ weatherDataProcess Exception", e);
// throw new XServiceException(e); }
// } });
// });
} }
} }
} }
......
package pps.core.base.utils;
import org.springframework.util.ObjectUtils;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeUtility;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 收到imapmail
*
* @author ZWT
* @date 2024/03/21
*/
public class ReceivedIMAPMail {
public static String NORM_DATETIME_PATTERN = "yyyy-MM-dd hh:mm:ss";
private MimeMessage mimeMessage;
/**
* 存放邮件内容的StringBuffer对象
*/
private StringBuffer bodyText = new StringBuffer();
/**
* 构造函数,初始化一个MimeMessage对象
*
* @param mimeMessage
*/
public ReceivedIMAPMail(MimeMessage mimeMessage) {
this.mimeMessage = mimeMessage;
}
/**
* 获得发件人的地址和姓名
*
* @return
* @throws MessagingException
*/
public String getFrom() throws MessagingException {
InternetAddress address[] = (InternetAddress[]) mimeMessage.getFrom();
String from = address[0].getAddress();
if (from == null) {
from = "";
}
String personal = address[0].getPersonal();
if (personal == null) {
personal = "";
}
String fromAddr = null;
if (personal != null || from != null) {
fromAddr = personal + "<" + from + ">";
}
return fromAddr;
}
/**
* 获得邮件主题
*
* @return
* @throws MessagingException
* @throws UnsupportedEncodingException
*/
public String getSubject() throws MessagingException, UnsupportedEncodingException {
String subject = MimeUtility.decodeText(mimeMessage.getSubject());
if (subject == null) {
subject = "";
}
return subject;
}
/**
* 解析邮件,把得到的邮件内容保存到一个StringBuffer对象中,解析邮件 主要是根据MimeType类型的不同执行不同的操作,一步一步的解析
*
* @param part
* @throws MessagingException
* @throws IOException
*/
public void getMailContent(Part part) throws MessagingException, IOException {
String contentType = part.getContentType();
int nameIndex = contentType.indexOf("name");
boolean conName = false;
if (nameIndex != -1) {
conName = true;
}
if (part.isMimeType("text/plain") && conName == false) {
bodyText.append((String) part.getContent());
} else if (part.isMimeType("text/html") && conName == false) {
bodyText.append((String) part.getContent());
} else if (part.isMimeType("multipart/*")) {
Multipart multipart = (Multipart) part.getContent();
int counts = multipart.getCount();
for (int i = 0; i < counts; i++) {
this.getMailContent(multipart.getBodyPart(i));
}
} else if (part.isMimeType("message/rfc822")) {
this.getMailContent((Part) part.getContent());
}
}
/**
* 判断此邮件是否已读,如果未读返回false,反之返回true
*
* @return
* @throws MessagingException
*/
public boolean isNew() throws MessagingException {
boolean isNew = false;
Flags flags = mimeMessage.getFlags();
Flags.Flag[] flag = flags.getSystemFlags();
for (int i = 0; i < flag.length; i++) {
if (flag[i] == Flags.Flag.SEEN) {
isNew = true;
}
}
return isNew;
}
/**
* 过滤邮箱信息
*
* @param messages
* @param fromMail 只读取该邮箱发来的邮件,如果为空则不过滤
* @param startDate 只读取该日期以后的邮件,如果为空则不过滤
* @return
* @throws MessagingException
*/
public static List<Message> filterMessage(Message[] messages, String fromMail, String startDate)
throws MessagingException, ParseException {
List<Message> messageList = new ArrayList<>();
if (ObjectUtils.isEmpty(messages)) {
return messageList;
}
boolean isEnptyFromMail = ObjectUtils.isEmpty(fromMail);
boolean isEnptyStartDate = ObjectUtils.isEmpty(startDate);
if (isEnptyFromMail && isEnptyStartDate) {
return Arrays.asList(messages);
}
String from;
for (Message message : messages) {
from = (message.getFrom()[0]).toString();
if (isEnptyFromMail) {
if (new SimpleDateFormat(NORM_DATETIME_PATTERN).parse(startDate).getTime() > message.getSentDate()
.getTime()) {
continue;
}
} else if (null != from && from.contains(fromMail)) {
if (!isEnptyStartDate && new SimpleDateFormat(NORM_DATETIME_PATTERN).parse(startDate)
.getTime() > message.getSentDate().getTime()) {
continue;
}
} else {
continue;
}
messageList.add(message);
}
return messageList;
}
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment