EmailTemplateService.java 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.simuwang.daq.service;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.lang.Pair;
  4. import cn.hutool.core.util.StrUtil;
  5. import com.simuwang.base.common.conts.ApplicationRuleFileConst;
  6. import com.simuwang.base.common.conts.EmailFieldConst;
  7. import com.simuwang.base.common.util.ExcelUtil;
  8. import com.simuwang.base.mapper.EmailTemplateApplicationRuleMapper;
  9. import com.simuwang.base.mapper.EmailTemplateDataRuleMapper;
  10. import com.simuwang.base.mapper.EmailTemplateMappingMapper;
  11. import com.simuwang.base.pojo.dos.EmailTemplateApplicationRuleDO;
  12. import com.simuwang.base.pojo.dos.EmailTemplateDataRuleDO;
  13. import com.simuwang.base.pojo.dos.EmailTemplateInfoDO;
  14. import com.simuwang.base.pojo.dto.EmailContentInfoDTO;
  15. import com.simuwang.base.pojo.dto.TemplateDetailDTO;
  16. import org.apache.poi.ss.usermodel.Cell;
  17. import org.apache.poi.ss.usermodel.Row;
  18. import org.apache.poi.ss.usermodel.Sheet;
  19. import org.springframework.stereotype.Service;
  20. import java.util.Arrays;
  21. import java.util.HashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. @Service
  26. public class EmailTemplateService {
  27. private final EmailTemplateMappingMapper emailTemplateMappingMapper;
  28. private final EmailTemplateApplicationRuleMapper emailTemplateApplicationRuleMapper;
  29. private final EmailTemplateDataRuleMapper emailTemplateDataRuleMapper;
  30. private final static Map<Integer, String> FILE_TYPE_MAP = new HashMap<>();
  31. static {
  32. // 1-备案编码,2-基金名称,3-净值日期,4-单位净值,5-累计净值,6-资产份额,7-资产净值
  33. FILE_TYPE_MAP.put(1, EmailFieldConst.REGISTER_NUMBER);
  34. FILE_TYPE_MAP.put(2, EmailFieldConst.FUND_NAME);
  35. FILE_TYPE_MAP.put(3, EmailFieldConst.PRICE_DATE);
  36. FILE_TYPE_MAP.put(4, EmailFieldConst.NAV);
  37. FILE_TYPE_MAP.put(5, EmailFieldConst.CUMULATIVE_NAV_WITHDRAWAL);
  38. FILE_TYPE_MAP.put(6, EmailFieldConst.ASSET_SHARE);
  39. FILE_TYPE_MAP.put(7, EmailFieldConst.ASSET_NET);
  40. }
  41. public EmailTemplateService(EmailTemplateMappingMapper emailTemplateMappingMapper, EmailTemplateApplicationRuleMapper emailTemplateApplicationRuleMapper,
  42. EmailTemplateDataRuleMapper emailTemplateDataRuleMapper) {
  43. this.emailTemplateMappingMapper = emailTemplateMappingMapper;
  44. this.emailTemplateApplicationRuleMapper = emailTemplateApplicationRuleMapper;
  45. this.emailTemplateDataRuleMapper = emailTemplateDataRuleMapper;
  46. }
  47. public List<TemplateDetailDTO> getTemplateDetail(EmailContentInfoDTO emailContentInfoDTO, String filePath) {
  48. List<TemplateDetailDTO> templateDetailDTOList = CollUtil.newArrayList();
  49. String senderEmail = emailContentInfoDTO.getSenderEmail();
  50. if (StrUtil.isBlank(senderEmail) || StrUtil.isBlank(filePath)) {
  51. return templateDetailDTOList;
  52. }
  53. // 查询邮箱配置的模板Id
  54. List<EmailTemplateInfoDO> emailTemplateInfoDOList = emailTemplateMappingMapper.queryByEmail(senderEmail);
  55. List<Integer> templateIdList = emailTemplateInfoDOList.stream().map(EmailTemplateInfoDO::getId).collect(Collectors.toList());
  56. if (CollUtil.isEmpty(templateIdList)) {
  57. return templateDetailDTOList;
  58. }
  59. Map<Integer, Integer> templateIdDirectionMap = emailTemplateInfoDOList.stream().collect(Collectors.toMap(EmailTemplateInfoDO::getId, EmailTemplateInfoDO::getDirection));
  60. // 查询模版适用性规则 -> 判断邮件是否满足模板适用性规则
  61. List<EmailTemplateApplicationRuleDO> templateApplicationRuleDOList = emailTemplateApplicationRuleMapper.queryByTemplateId(templateIdList);
  62. if (CollUtil.isEmpty(templateApplicationRuleDOList)) {
  63. return templateDetailDTOList;
  64. }
  65. Map<Integer, List<EmailTemplateApplicationRuleDO>> templateIdApplicationRuleMap = templateApplicationRuleDOList.stream().collect(Collectors.groupingBy(EmailTemplateApplicationRuleDO::getTemplateId));
  66. // 查询模版数据规则
  67. List<EmailTemplateDataRuleDO> templateDataRuleDOList = emailTemplateDataRuleMapper.queryByTemplateId(templateIdList);
  68. Map<Integer, List<EmailTemplateDataRuleDO>> templateIdDataRuleMap = templateDataRuleDOList.stream().collect(Collectors.groupingBy(EmailTemplateDataRuleDO::getTemplateId));
  69. for (Map.Entry<Integer, List<EmailTemplateApplicationRuleDO>> templateIdApplicationRule : templateIdApplicationRuleMap.entrySet()) {
  70. Integer templateId = templateIdApplicationRule.getKey();
  71. List<EmailTemplateApplicationRuleDO> applicationRuleDOList = templateIdApplicationRule.getValue();
  72. // 判断是否满足模板适用性规则
  73. boolean isMatchTemplate = isMatchTemplate(emailContentInfoDTO.getEmailTitle(), emailContentInfoDTO.getFileName(), filePath, applicationRuleDOList);
  74. if (!isMatchTemplate) {
  75. continue;
  76. }
  77. TemplateDetailDTO templateDetailDTO = new TemplateDetailDTO();
  78. templateDetailDTO.setTemplateId(templateId);
  79. // 模板的数据行方向:默认为行
  80. Integer directionOrDefault = templateIdDirectionMap.getOrDefault(templateId, 1);
  81. templateDetailDTO.setDirection(directionOrDefault);
  82. Map<String, Pair<Integer, Integer>> fieldPositionMap = getFieldPosition(templateIdDataRuleMap.get(templateId));
  83. templateDetailDTO.setFieldPositionMap(fieldPositionMap);
  84. templateDetailDTOList.add(templateDetailDTO);
  85. }
  86. return templateDetailDTOList;
  87. }
  88. private Map<String, Pair<Integer, Integer>> getFieldPosition(List<EmailTemplateDataRuleDO> emailTemplateDataRuleDOList) {
  89. Map<String, Pair<Integer, Integer>> fieldPositionMap = new HashMap<>();
  90. for (EmailTemplateDataRuleDO templateDataRuleDO : emailTemplateDataRuleDOList) {
  91. Integer fieldName = templateDataRuleDO.getFieldName();
  92. String fieldValue = FILE_TYPE_MAP.get(fieldName);
  93. int column = columnLetterToIndex(templateDataRuleDO.getColumn());
  94. Pair<Integer, Integer> pair = new Pair<>(templateDataRuleDO.getRow() - 1, column);
  95. fieldPositionMap.put(fieldValue, pair);
  96. }
  97. return fieldPositionMap;
  98. }
  99. private boolean isMatchTemplate(String emailTitle, String fileName, String filePath, List<EmailTemplateApplicationRuleDO> applicationRuleDOList) {
  100. int notMatchCount = 0;
  101. for (EmailTemplateApplicationRuleDO applicationRuleDO : applicationRuleDOList) {
  102. if (!isMathApplicationRule(applicationRuleDO, emailTitle, fileName, filePath)) {
  103. notMatchCount++;
  104. }
  105. }
  106. return notMatchCount == 0;
  107. }
  108. private boolean isMathApplicationRule(EmailTemplateApplicationRuleDO applicationRuleDO, String emailTitle, String fileName, String filePath) {
  109. boolean isMatch = true;
  110. Integer type = applicationRuleDO.getType();
  111. String containKeyword = applicationRuleDO.getContainKeyword();
  112. String notContainKeyword = applicationRuleDO.getNotContainKeyword();
  113. if (ApplicationRuleFileConst.EMAIL_TITLE_FILE.equals(type)) {
  114. if (StrUtil.isNotBlank(containKeyword)) {
  115. isMatch = Arrays.stream(containKeyword.split(",")).allMatch(emailTitle::contains);
  116. }
  117. if (StrUtil.isNotBlank(notContainKeyword)) {
  118. isMatch = Arrays.stream(notContainKeyword.split(",")).noneMatch(emailTitle::contains) && isMatch;
  119. }
  120. }
  121. if (ApplicationRuleFileConst.EMAIL_FILE_NAME_FILE.equals(type)) {
  122. if (StrUtil.isNotBlank(containKeyword)) {
  123. isMatch = Arrays.stream(containKeyword.split(",")).allMatch(fileName::contains);
  124. }
  125. if (StrUtil.isNotBlank(notContainKeyword)) {
  126. isMatch = Arrays.stream(notContainKeyword.split(",")).noneMatch(fileName::contains) && isMatch;
  127. }
  128. }
  129. if (ApplicationRuleFileConst.EMAIL_EXCEL_CONTENT_FILE.equals(type)) {
  130. if (StrUtil.isNotBlank(fileName) && ExcelUtil.isExcel(fileName)) {
  131. if (applicationRuleDO.getRow() == null || StrUtil.isBlank(applicationRuleDO.getColumn())) {
  132. return false;
  133. }
  134. Sheet sheet = ExcelUtil.getFirstSheet(filePath);
  135. if (sheet == null) {
  136. return false;
  137. }
  138. Row row = sheet.getRow(applicationRuleDO.getRow());
  139. if (row == null) {
  140. return false;
  141. }
  142. int column = columnLetterToIndex(applicationRuleDO.getColumn());
  143. Cell cell = row.getCell(column);
  144. if (cell == null) {
  145. return false;
  146. }
  147. String cellValue = ExcelUtil.getCellValue(cell);
  148. if (StrUtil.isBlank(cellValue)) {
  149. return false;
  150. }
  151. if (StrUtil.isNotBlank(containKeyword)) {
  152. isMatch = Arrays.stream(containKeyword.split(",")).allMatch(cellValue::contains);
  153. }
  154. if (StrUtil.isNotBlank(notContainKeyword)) {
  155. isMatch = Arrays.stream(notContainKeyword.split(",")).noneMatch(cellValue::contains) && isMatch;
  156. }
  157. }
  158. }
  159. return isMatch;
  160. }
  161. public static int columnLetterToIndex(String columnName) {
  162. int columnIndex = 0;
  163. int columnLength = columnName.length();
  164. // Excel列的基础是26
  165. int base = 26;
  166. for (int i = 0; i < columnLength; i++) {
  167. char letter = columnName.charAt(i);
  168. // 计算字母的位置(A=0, B=1, ..., Z=25)
  169. int position = letter - 'A';
  170. columnIndex += (int) (position * Math.pow(base, columnLength - i - 1));
  171. }
  172. return columnIndex;
  173. }
  174. }