From f1c757fe6f1380050f5fe9fff72cde23bab252c5 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Mon, 19 Jun 2023 18:04:50 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E5=AE=9A=E6=97=B6=E6=8A=A5=E5=91=8A):=20?= =?UTF-8?q?=E9=82=AE=E4=BB=B6=E6=94=AF=E6=8C=81pdf=E9=99=84=E4=BB=B6?= =?UTF-8?q?=E6=A0=BC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../strategy/impl/EmailTaskHandler.java | 23 ++++++--- .../plugins/server/XEmailTaskServer.java | 2 +- .../dataease/service/system/EmailService.java | 50 +++++++++++++++++-- .../resources/db/migration/V55__1.18.8.sql | 4 ++ frontend/src/lang/en.js | 1 + frontend/src/lang/tw.js | 1 + frontend/src/lang/zh.js | 1 + 7 files changed, 72 insertions(+), 10 deletions(-) diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index 7d49457f92..55826bd92b 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -35,7 +35,10 @@ import io.dataease.service.system.EmailService; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.quartz.*; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import org.springframework.web.util.HtmlUtils; @@ -173,10 +176,6 @@ public class EmailTaskHandler extends TaskHandler implements Job { String url = panelUrl(panelId); token = tokenByUser(user); XpackPixelEntity xpackPixelEntity = buildPixel(emailTemplateDTO); - LogUtil.info("url is " + url); - LogUtil.info("token is " + token); - byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); - LogUtil.info("picture of " + url + " is finished"); // 下面继续执行发送邮件的 String recipients = emailTemplateDTO.getRecipients(); String reciUsers = emailTemplateDTO.getReciUsers(); @@ -232,7 +231,15 @@ public class EmailTaskHandler extends TaskHandler implements Job { case "email": if (StringUtils.isNotBlank(recipients)) try { - emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); + Integer panelFormat = emailTemplateDTO.getPanelFormat(); + if (ObjectUtils.isEmpty(panelFormat) || panelFormat == 0) { + byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); + emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); + } else { + byte[] bytes = emailXpackService.printPdf(url, token, xpackPixelEntity, false, true); + emailService.sendPdfWithFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); + } + } catch (Exception e) { errorMsgs.add("email: " + e.getMessage()); } @@ -253,6 +260,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { if (CollectionUtils.isNotEmpty(wecomUsers)) { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); + byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); WecomMsgResult wecomMsgResult = wecomXpackService.pushOaMsg(wecomUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); if (wecomMsgResult.getErrcode() != 0) { errorMsgs.add("wecom: " + wecomMsgResult.getErrmsg()); @@ -277,6 +285,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { if (CollectionUtils.isNotEmpty(dingTalkUsers)) { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); + byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); DingtalkMsgResult dingtalkMsgResult = dingtalkXpackService.pushOaMsg(dingTalkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); if (dingtalkMsgResult.getErrcode() != 0) { errorMsgs.add("dingtalk: " + dingtalkMsgResult.getErrmsg()); @@ -301,6 +310,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { if (CollectionUtils.isNotEmpty(larkUsers)) { LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); + byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); LarkMsgResult larkMsgResult = larkXpackService.pushOaMsg(larkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); if (larkMsgResult.getCode() != 0) { errorMsgs.add("lark: " + larkMsgResult.getMsg()); @@ -325,6 +335,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { if (CollectionUtils.isNotEmpty(larksuiteUsers)) { LarksuiteXpackService larksuiteXpackService = SpringContextUtil.getBean(LarksuiteXpackService.class); + byte[] bytes = emailXpackService.printData(url, token, xpackPixelEntity); LarksuiteMsgResult larksuiteMsgResult = larksuiteXpackService.pushOaMsg(larksuiteUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); if (larksuiteMsgResult.getCode() != 0) { errorMsgs.add("larksuite: " + larksuiteMsgResult.getMsg()); diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index ba3447052f..8b9c9b8744 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -174,7 +174,7 @@ public class XEmailTaskServer { String currentToken = ServletUtils.getToken(); Future future = priorityExecutor.submit(() -> { try { - return emailXpackService.printPdf(url, currentToken, buildPixel(request.getPixel()), request.isShowPageNo()); + return emailXpackService.printPdf(url, currentToken, buildPixel(request.getPixel()), request.isShowPageNo(), false); } catch (Exception e) { LogUtil.error(e.getMessage(), e); DEException.throwException("预览失败,请联系管理员"); diff --git a/backend/src/main/java/io/dataease/service/system/EmailService.java b/backend/src/main/java/io/dataease/service/system/EmailService.java index a8880db29a..e1578c352a 100644 --- a/backend/src/main/java/io/dataease/service/system/EmailService.java +++ b/backend/src/main/java/io/dataease/service/system/EmailService.java @@ -83,8 +83,35 @@ public class EmailService { } + public void sendPdfWithFiles(String to, String title, String content, byte[] bytes, List files) { + if (ArrayUtil.isEmpty(bytes)) { + send(to, title, content); + return; + } + if (StringUtils.isBlank(to)) + return; + MailInfo mailInfo = proxy().mailInfo(); + checkMailInfo(mailInfo); + JavaMailSenderImpl driver = driver(mailInfo); - + MimeMultipart multipart = new MimeMultipart(); + MimeMessage mimeMessage = driver.createMimeMessage(); + try { + multipart = addContent(multipart, content); + multipart = addPdf(multipart, bytes); + if (CollectionUtils.isNotEmpty(files)) { + multipart = addFiles(multipart, files); + } + mimeMessage.setSubject(title); + mimeMessage.setFrom(driver.getUsername()); + mimeMessage.setRecipients(Message.RecipientType.TO, to); + mimeMessage.setContent(multipart); + driver.send(mimeMessage); + } catch (Exception e) { + LogUtil.error(e.getMessage(), e); + DEException.throwException(e); + } + } public void sendWithImageAndFiles(String to, String title, String content, byte[] bytes, List files) { if (StringUtils.isBlank(to)) @@ -116,7 +143,14 @@ public class EmailService { } } - private MimeMultipart addImage(MimeMultipart multipart, byte[] bytes, String content) throws Exception{ + private MimeMultipart addContent(MimeMultipart multipart, String content) throws Exception { + MimeBodyPart text = new MimeBodyPart(); + text.setContent(content, "text/html; charset=gb2312"); + multipart.addBodyPart(text); + return multipart; + } + + private MimeMultipart addImage(MimeMultipart multipart, byte[] bytes, String content) throws Exception { MimeBodyPart image = new MimeBodyPart(); DataHandler png = new DataHandler(new ByteArrayDataSource(bytes, "image/png")); String uuid = UUID.randomUUID().toString(); @@ -131,7 +165,17 @@ public class EmailService { return multipart; } - private MimeMultipart addFiles(MimeMultipart multipart, List files) throws Exception{ + private MimeMultipart addPdf(MimeMultipart multipart, byte[] bytes) throws Exception { + MimeBodyPart attach = new MimeBodyPart(); + ByteArrayDataSource fileDataSource = new ByteArrayDataSource(bytes, "application/pdf"); + attach.setDataHandler(new DataHandler(fileDataSource)); + attach.setFileName(MimeUtility.encodeText("panel.pdf", "gb2312", null)); + multipart.addBodyPart(attach); + multipart.setSubType("related"); + return multipart; + } + + private MimeMultipart addFiles(MimeMultipart multipart, List files) throws Exception { for (int i = 0; i < files.size(); i++) { File file = files.get(i); diff --git a/backend/src/main/resources/db/migration/V55__1.18.8.sql b/backend/src/main/resources/db/migration/V55__1.18.8.sql index 7729e8ba7b..a6da001669 100644 --- a/backend/src/main/resources/db/migration/V55__1.18.8.sql +++ b/backend/src/main/resources/db/migration/V55__1.18.8.sql @@ -2,3 +2,7 @@ UPDATE `my_plugin` SET `version` = '1.18.8' where `plugin_id` > 0 and `version` = '1.18.7'; + +ALTER TABLE `sys_task_email` + ADD COLUMN `panel_format` INT(1) NOT NULL DEFAULT 0 COMMENT '仪表板格式0:jpeg,1:pdf' AFTER `panel_id`; + diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 7825c1cb37..e78404581a 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -2711,6 +2711,7 @@ export default { preview: 'Preview', emial_preview: 'Report preview', chart_data_range: 'View data range', + panel_format: 'Panel format', simple_repeat: 'Simple repeat', once_a_day: 'Once a day', once_a_week: 'Once a week', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index 64b8917d15..9c09e989fa 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -2705,6 +2705,7 @@ export default { preview: '預覽', emial_preview: '報告預覽', chart_data_range: '視圖數據範圍', + panel_format: '儀表板格式', simple_repeat: '簡單重複', once_a_day: '每天', once_a_week: '每周', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index b8db2dde44..fc55889561 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -2720,6 +2720,7 @@ export default { preview: '预览', emial_preview: '报告预览', chart_data_range: '视图数据范围', + panel_format: '仪表板格式', simple_repeat: '简单重复', once_a_day: '每天', once_a_week: '每周',