package com.ots.project.monitor.job.task; import com.ots.common.enums.LangTypeEnum; import com.ots.common.enums.ReportTypeEnum; import com.ots.common.enums.SenderCode; import com.ots.common.utils.StringUtils; import com.ots.common.utils.poi.WordUtil; import com.ots.framework.config.EssConfig; import com.ots.project.exam.domain.TExamReport; import com.ots.project.exam.domain.TReportTemplate; import com.ots.project.exam.mapper.TExamReportMapper; import com.ots.project.exam.mapper.TReportTemplateMapper; import com.ots.project.exam.service.IEntTestSendtaskMailService; import com.ots.project.exam.service.ITExamReportService; import com.ots.project.exam.service.ITReportTemplateService; import com.ots.project.exam.service.impl.EntTestMemberServiceImpl; import com.ots.project.exam.service.impl.EntTestSendtaskServiceImpl; import com.ots.project.tool.email.EmailMessage; import com.ots.project.tool.exam.ExamUtil; import com.ots.project.tool.report.MAQ.MAQReport; import com.ots.project.tool.report.ReportResultData; import com.ots.project.tool.sms.ShortMessage; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 邮件短信发送任务 */ @Component("SenderEmailReportTask") @Slf4j public class SenderEmailReportTask { private static final String SMS_ZJCM = "SMS_ZJCM"; private static final String SMS_ZJCM_INTERNATIONAL = "SMS_ZJCM_INTERNATIONAL"; private static final String EMAIL_126 = "EMAIL_126"; @Autowired EntTestSendtaskServiceImpl entTestSendtaskService; @Autowired EntTestMemberServiceImpl entTestMemberService; @Autowired ShortMessage shortMessage; @Autowired EmailMessage emailMessage; @Autowired IEntTestSendtaskMailService entTestSendtaskMailService; @Autowired TExamReportMapper tExamReportMapper; @Autowired private ITExamReportService tExamReportService; @Autowired private TReportTemplateMapper tReportTemplateMapper; @Autowired private ITReportTemplateService itReportTemplateService; public void senderTask() { // 查找report表得出要发送报告的用户 TExamReport tExamReportTemp = new TExamReport(); tExamReportTemp.setFinish(1); tExamReportTemp.setSendTesterStatus(0); List tExamReportList = tExamReportMapper.selectTExamReportList(tExamReportTemp); if (ExamUtil.isListEmpty(tExamReportList)) { return; } // textMapList的 List> textMapList = new ArrayList<>(); List deleteFileStrList = new ArrayList<>(); // 语言类型 Map langTypeEnumMap = getLangTypeEnumMap(); // 报告类型 Map reportTypeEnumMap = getStringReportTypeEnumMap(); // 查出全部的报告,减少消耗的性能 Map tReportTemplateMap = getAllTReportTemplateMap(); // 遍历每个report表 // 给测试者发送邮件 List allReportList = new ArrayList<>(); // hr 邮箱 Map> hrEmail = new HashMap<>(); // 循环每个个报告记录 for (TExamReport tExamReport : tExamReportList) { String[] reportIds = tExamReport.getReportTemplateId().split(","); // 遍历出模版生成文件 List reprotList = saveReport(textMapList, deleteFileStrList, langTypeEnumMap, reportTypeEnumMap, tReportTemplateMap, allReportList, tExamReport, reportIds); // 调用发送程序发给用户 if (emailMessage.sendEmailwithAttachment(tExamReport.getMemberEmail(), "测试报告", "您已完成测试", reprotList.stream().toArray(String[]::new)).isResult()) { tExamReport.setSendTesterStatus(SenderCode.success.getCode()); } else { // 发送成功,发送失败处理 tExamReport.setSendTesterStatus(SenderCode.fail.getCode()); } // 发送给Hr if (emailMessage.sendEmailwithAttachment(tExamReport.getTestEmail(), "测试报告", "您已完成测试", reprotList.stream().toArray(String[]::new)).isResult()) { tExamReport.setSendHrStatus(SenderCode.success.getCode()); } else { // 发送成功,发送失败处理 tExamReport.setSendHrStatus(SenderCode.fail.getCode()); } tExamReportService.updateTExamReportStatus(tExamReport); } } private void setHrFiles(Map> hrEmail, TExamReport tExamReport, List reprotList) { // 保留发给Hr的邮箱 List hrEmailList = hrEmail.get(tExamReport.getTestEmail()); if (ExamUtil.isListEmpty(hrEmailList)) { List hrFileList = new ArrayList<>(); hrFileList.addAll(reprotList); hrEmail.put(tExamReport.getTestEmail(), hrFileList); } else { hrEmailList.addAll(reprotList); } } private List saveReport(List> textMapList, List deleteFileStrList, Map langTypeEnumMap, Map reportTypeEnumMap, Map tReportTemplateMap, List allReportList, TExamReport tExamReport, String[] reportIds) { List sendReportList = new ArrayList<>(); for (String reportId : reportIds) { // 模拟调用接口 Map thaiCalculationMap = new HashMap<>(); MAQReport report = new MAQReport(); WordUtil util = new WordUtil(); // 导出基础版本还是详细版 String reportType = tReportTemplateMap.get(Long.valueOf(reportId)).getReportType();// "Brief"; String templateType = tReportTemplateMap.get(Long.valueOf(reportId)).getTemplateType();// "Brief"; String path = ""; Map textMap = new HashMap<>(); TReportTemplate tReportTemplate = tReportTemplateMap.get(Long.valueOf(reportId)); try { ReportResultData reportResultData = report.getTemplateParameters(thaiCalculationMap, reportTypeEnumMap.get(templateType), langTypeEnumMap.get(tExamReport.getLangType())); tExamReportService.setTextPicture(tExamReport, reportResultData, deleteFileStrList, langTypeEnumMap.get(tExamReport.getLangType()), textMap); path = itReportTemplateService.selectTReportTemplateFilePath(tReportTemplate); if (StringUtils.isEmpty(path)) { continue; } } catch (Exception e) { e.printStackTrace(); continue; } // 生成报告文件 String zipFileName = util.makeReportFile(path, tReportTemplate, textMap, new HashMap<>(), deleteFileStrList); allReportList.add(zipFileName); for (String fileName : allReportList) { sendReportList.add(EssConfig.getProfile() + "/" + fileName); } // 清空,给下一个用户用 textMapList.clear(); textMap.clear(); // 删除临时文件 util.deleteFileByStr(deleteFileStrList); } return sendReportList; } private Map getAllTReportTemplateMap() { List tReportTemplateList = tReportTemplateMapper.selectTReportTemplateList(new TReportTemplate()); Map tReportTemplateMap = new HashMap<>(); for (TReportTemplate tReportTemplate : tReportTemplateList) { tReportTemplateMap.put(tReportTemplate.getId(), tReportTemplate); } return tReportTemplateMap; } private Map getStringReportTypeEnumMap() { Map reportTypeEnumMap = new HashMap<>(); for (ReportTypeEnum reportTypeEnumTemp : ReportTypeEnum.values()) { reportTypeEnumMap.put(reportTypeEnumTemp.getCode(), reportTypeEnumTemp); } return reportTypeEnumMap; } private Map getLangTypeEnumMap() { Map langTypeEnumMap = new HashMap<>(); for (LangTypeEnum langTypeEnumTemp : LangTypeEnum.values()) { langTypeEnumMap.put(langTypeEnumTemp.getCode(), langTypeEnumTemp); } return langTypeEnumMap; } }