|
@@ -1,5 +1,7 @@
|
|
|
package com.dayou.service.impl;
|
|
|
|
|
|
+import cn.hutool.core.util.RandomUtil;
|
|
|
+import com.dayou.configuration.AsyncManager;
|
|
|
import com.dayou.configuration.MailSenderConfig;
|
|
|
import com.dayou.dto.PayslipMailMessageDTO;
|
|
|
import com.dayou.entity.HrPayslipEmail;
|
|
@@ -18,6 +20,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
import org.springframework.web.multipart.MultipartFile;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.*;
|
|
|
|
|
@@ -45,7 +48,8 @@ public class HrPayslipEmailServiceImpl extends ServiceImpl<HrPayslipEmailMapper,
|
|
|
|
|
|
/**
|
|
|
* 分页查询邮件发送记录
|
|
|
- * @param page 分页
|
|
|
+ *
|
|
|
+ * @param page 分页
|
|
|
* @param hrPayslipEmail 查询参数
|
|
|
* @return Page<HrPayslipEmailVO>
|
|
|
*/
|
|
@@ -67,51 +71,89 @@ public class HrPayslipEmailServiceImpl extends ServiceImpl<HrPayslipEmailMapper,
|
|
|
*/
|
|
|
@Override
|
|
|
public Boolean sendEmailBatch(MultipartFile file, String subject, String year, String month) throws Exception {
|
|
|
+
|
|
|
+ Long userId = LoginContext.getCurrentUserId();
|
|
|
+ // 异步执行的时候,主线程结束,临时文件就会被清空,会报错 系统找不到指定的文件, 所以把这一步放到外面先执行
|
|
|
ExcelPlusUtil<PayslipMailMessageDTO> util = new ExcelPlusUtil<>(PayslipMailMessageDTO.class);
|
|
|
List<PayslipMailMessageDTO> dtoList = util.importExcel(file.getInputStream());
|
|
|
- // 构建邮件发送
|
|
|
- JavaMailSenderImpl mailSender = senderConfig.getSenderByBusiness("hr_payslip");
|
|
|
- //创建MimeMessage对象
|
|
|
- MimeMessage mimeMessage = mailSender.createMimeMessage();
|
|
|
- MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
|
|
|
- //邮件发送人
|
|
|
- messageHelper.setFrom(Objects.requireNonNull(mailSender.getUsername()));
|
|
|
-
|
|
|
- // 循环发送邮件
|
|
|
- for (PayslipMailMessageDTO dto : dtoList) {
|
|
|
- HrPayslipEmail hrPayslipEmail = new HrPayslipEmail();
|
|
|
- try {
|
|
|
- // 保存发送信息
|
|
|
- hrPayslipEmail.setOperatorId(LoginContext.getCurrentUserId());
|
|
|
- hrPayslipEmail.setSenderEmail(mailSender.getUsername());
|
|
|
- hrPayslipEmail.setRecipientEmail(dto.getEmail());
|
|
|
- hrPayslipEmail.setRecipientName(dto.getName());
|
|
|
- hrPayslipEmail.setIdNo(dto.getIdNo());
|
|
|
- hrPayslipEmail.setDepartment(dto.getDepartment());
|
|
|
- hrPayslipEmail.setSendTime(LocalDateTime.now());
|
|
|
-
|
|
|
- // 发送邮件
|
|
|
- dto.setYear(year);
|
|
|
- dto.setMonth(month);
|
|
|
- messageHelper.setTo(dto.getEmail());
|
|
|
- messageHelper.setSubject(subject);
|
|
|
- // 根据ftl模板构建html内容
|
|
|
- String html = buildHtml(dto);
|
|
|
- // 发送html需要设置为true
|
|
|
- messageHelper.setText(html, true);
|
|
|
- mailSender.send(messageHelper.getMimeMessage());
|
|
|
- // 发送成功状态true
|
|
|
- hrPayslipEmail.setSendingStatus(true);
|
|
|
- } catch (Exception sendException) { // 单个邮件发送失败手动捕获处理
|
|
|
- log.error("邮箱:" + dto.getEmail() + "的薪资邮件发送失败" + sendException.getMessage());
|
|
|
- // 发送失败状态false
|
|
|
- hrPayslipEmail.setSendingStatus(false);
|
|
|
- hrPayslipEmail.setFailureReason(sendException.getMessage());
|
|
|
+ AsyncManager.me().execute(new AsyncManager.BizHandler() {
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Boolean validBefore() {
|
|
|
+ return Boolean.TRUE;
|
|
|
}
|
|
|
- // 保存邮件发送记录
|
|
|
- this.save(hrPayslipEmail);
|
|
|
|
|
|
- }
|
|
|
+ @Override
|
|
|
+ public Object doCustom() {
|
|
|
+ try {
|
|
|
+ // 记录发件次数
|
|
|
+ int sendCount = 0;
|
|
|
+ // 默认使用的邮箱
|
|
|
+ String businessName = "hr_payslip_01";
|
|
|
+ // 循环发送邮件
|
|
|
+ for (PayslipMailMessageDTO dto : dtoList) {
|
|
|
+ // 避免频率限制,使用两个邮箱交替发送
|
|
|
+ if (sendCount == 1) {
|
|
|
+ // 避免频率限制, 随机休眠2-4s
|
|
|
+ Thread.sleep(RandomUtil.randomInt(2000, 4000));
|
|
|
+ sendCount = 0;
|
|
|
+ switch (businessName) {
|
|
|
+ case "hr_payslip_01":
|
|
|
+ businessName = "hr_payslip_02";
|
|
|
+ break;
|
|
|
+ case "hr_payslip_02":
|
|
|
+ businessName = "hr_payslip_01";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 构建邮件发送
|
|
|
+ JavaMailSenderImpl mailSender = senderConfig.getSenderByBusiness(businessName);
|
|
|
+ //创建MimeMessage对象
|
|
|
+ MimeMessage mimeMessage = mailSender.createMimeMessage();
|
|
|
+ MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
|
|
|
+ //邮件发送人
|
|
|
+ messageHelper.setFrom(Objects.requireNonNull(mailSender.getUsername()));
|
|
|
+ HrPayslipEmail hrPayslipEmail = new HrPayslipEmail();
|
|
|
+ try {
|
|
|
+ // 保存发送信息
|
|
|
+ hrPayslipEmail.setOperatorId(userId);
|
|
|
+ hrPayslipEmail.setSenderEmail(mailSender.getUsername());
|
|
|
+ hrPayslipEmail.setRecipientEmail(dto.getEmail());
|
|
|
+ hrPayslipEmail.setRecipientName(dto.getName());
|
|
|
+ hrPayslipEmail.setIdNo(dto.getIdNo());
|
|
|
+ hrPayslipEmail.setDepartment(dto.getDepartment());
|
|
|
+ hrPayslipEmail.setSendTime(LocalDateTime.now());
|
|
|
+ hrPayslipEmail.setSalaryYear(Integer.valueOf(year));
|
|
|
+ hrPayslipEmail.setSalaryMonth(Integer.valueOf(month));
|
|
|
+
|
|
|
+ // 发送邮件
|
|
|
+ dto.setYear(year);
|
|
|
+ dto.setMonth(month);
|
|
|
+ messageHelper.setTo(dto.getEmail());
|
|
|
+ messageHelper.setSubject(subject);
|
|
|
+ // 根据ftl模板构建html内容
|
|
|
+ String html = buildHtml(dto);
|
|
|
+ // 发送html需要设置为true
|
|
|
+ messageHelper.setText(html, true);
|
|
|
+ mailSender.send(messageHelper.getMimeMessage());
|
|
|
+ // 发送成功状态true
|
|
|
+ hrPayslipEmail.setSendingStatus(true);
|
|
|
+ sendCount++;
|
|
|
+ } catch (Exception sendException) { // 单个邮件发送失败手动捕获处理
|
|
|
+ log.error("邮箱:" + dto.getEmail() + "的薪资邮件发送失败" + sendException.getMessage());
|
|
|
+ // 发送失败状态false
|
|
|
+ hrPayslipEmail.setSendingStatus(false);
|
|
|
+ hrPayslipEmail.setFailureReason(sendException.getMessage());
|
|
|
+ }
|
|
|
+ // 保存邮件发送记录
|
|
|
+ hrPayslipEmailMapper.insert(hrPayslipEmail);
|
|
|
+ }
|
|
|
+ }catch (Exception e) {
|
|
|
+ log.error("薪资邮件发送失败:" + e.getMessage());
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ });
|
|
|
return Boolean.TRUE;
|
|
|
}
|
|
|
|