CompanyEmailConfigServiceImpl.java 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813
  1. package com.simuwang.manage.service.impl;
  2. import com.simuwang.base.common.enums.DeletionType;
  3. import com.simuwang.base.common.enums.Frequency;
  4. import com.simuwang.base.common.enums.OpenStatusType;
  5. import com.simuwang.base.common.enums.ResultCode;
  6. import com.simuwang.base.common.util.DateUtils;
  7. import com.simuwang.base.common.util.EmailUtil;
  8. import com.simuwang.base.common.util.ExcelUtil;
  9. import com.simuwang.base.common.util.StringUtil;
  10. import com.simuwang.base.mapper.daq.*;
  11. import com.simuwang.base.mapper.daq.system.SysConfigMapper;
  12. import com.simuwang.base.pojo.dos.*;
  13. import com.simuwang.base.pojo.dto.EmailInfoDTO;
  14. import com.simuwang.base.pojo.dto.MailboxInfoDTO;
  15. import com.simuwang.base.pojo.vo.CompanyEmailConfigVO;
  16. import com.simuwang.manage.service.CompanyEmailConfigService;
  17. import com.simuwang.manage.service.ContactInformationService;
  18. import com.simuwang.shiro.utils.UserUtils;
  19. import com.smppw.common.pojo.ResultVo;
  20. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  21. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  22. import org.slf4j.Logger;
  23. import org.slf4j.LoggerFactory;
  24. import org.springframework.beans.factory.annotation.Autowired;
  25. import org.springframework.beans.factory.annotation.Value;
  26. import org.springframework.scheduling.annotation.Async;
  27. import org.springframework.stereotype.Service;
  28. import org.springframework.web.multipart.MultipartFile;
  29. import java.io.File;
  30. import java.io.FileOutputStream;
  31. import java.io.IOException;
  32. import java.io.InputStream;
  33. import java.util.*;
  34. import java.util.stream.Collectors;
  35. /**
  36. * FileName: CompanyEmailConfigServiceImpl
  37. * Author: chenjianhua
  38. * Date: 2024/9/7 12:55
  39. * Description: ${DESCRIPTION}
  40. */
  41. @Service
  42. public class CompanyEmailConfigServiceImpl implements CompanyEmailConfigService {
  43. @Autowired
  44. private CompanyEmailConfigMapper companyEmailConfigMapper;
  45. @Autowired
  46. private CompanyEmailSendHistoryMapper companyEmailSendHistoryMapper;
  47. @Autowired
  48. private FundInfoMapper fundInfoMapper;
  49. @Autowired
  50. private DeletionInfoMapper deletionInfoMapper;
  51. @Autowired
  52. private DeletionTaskLogInfoMapper deletionTaskLogInfoMapper;
  53. @Autowired
  54. private EmailTemplateMapper emailTemplateMapper;
  55. @Autowired
  56. private SysConfigMapper sysConfigMapper;
  57. private static Logger logger = LoggerFactory.getLogger(CompanyEmailConfigServiceImpl.class);
  58. @Value("${email.file.path}")
  59. private String path;
  60. @Autowired
  61. private FundReportFrequencyMapper fundReportFrequencyMapper;
  62. @Autowired
  63. private NavMapper navMapper;
  64. @Autowired
  65. private AssetMapper assetMapper;
  66. private static final String DELETION_TEMPLATE_CODE = "DATA_MISS";
  67. private static final String DISTRIBUTION_DELETION_TEMPLATE_CODE = "DISTRIBUTION_MISS";
  68. @Autowired
  69. private ContactInformationServiceImpl contactInformationServiceImpl;
  70. @Autowired
  71. private ContactInformationService contactInformationService;
  72. @Override
  73. public ResultVo saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS) {
  74. ResultVo vo = new ResultVo(com.smppw.common.pojo.enums.status.ResultCode.SAVE_SUCCESS);
  75. vo.setData(true);
  76. StringBuffer msg = new StringBuffer();
  77. try{
  78. for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
  79. CompanyEmailConfigDO oldEmailConfigDO = companyEmailConfigMapper.selectEmailConfig(emailConfigVO.getCompanyId(),emailConfigVO.getEmail());
  80. if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() == null){
  81. msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(",");
  82. }
  83. if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() != null){
  84. if(!oldEmailConfigDO.getId().equals(emailConfigVO.getId())){
  85. msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(",");
  86. }
  87. }
  88. }
  89. if(StringUtil.isNotEmpty(msg.toString())){
  90. vo.setMsg(msg.toString().substring(0,msg.length()-1));
  91. vo.setData(false);
  92. return vo;
  93. }
  94. for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
  95. CompanyEmailConfigDO emailConfigDO = new CompanyEmailConfigDO();
  96. emailConfigDO.setCompanyId(emailConfigVO.getCompanyId());
  97. emailConfigDO.setCompanyName(emailConfigVO.getCompanyName());
  98. emailConfigDO.setEmail(emailConfigVO.getEmail());
  99. emailConfigDO.setOpenStatus(emailConfigVO.getOpenStatus());
  100. emailConfigDO.setRemark(emailConfigVO.getSendRemark());
  101. emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId());
  102. emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId());
  103. emailConfigDO.setIsvalid(1);
  104. emailConfigDO.setUpdateTime(new Date());
  105. if(emailConfigVO.getId() != null){
  106. emailConfigDO.setId(emailConfigVO.getId());
  107. companyEmailConfigMapper.updateCompanyEmailConfig(emailConfigDO);
  108. }else{
  109. emailConfigDO.setCreateTime(new Date());
  110. companyEmailConfigMapper.saveCompanyEmailConfig(emailConfigDO);
  111. }
  112. }
  113. }catch (Exception e){
  114. }
  115. return vo;
  116. }
  117. @Override
  118. public void deleteCompanyEmailConfig(Integer id) {
  119. CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectById(id);
  120. if (configDO != null) {
  121. configDO.setIsvalid(0);
  122. configDO.setUpdateTime(new Date());
  123. configDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
  124. companyEmailConfigMapper.updateById(configDO);
  125. }
  126. }
  127. @Override
  128. public void updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO) {
  129. CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(companyEmailConfigVO.getId());
  130. if(configDO != null){
  131. configDO.setEmail(companyEmailConfigVO.getEmail());
  132. configDO.setCompanyId(companyEmailConfigVO.getCompanyId());
  133. configDO.setCompanyName(companyEmailConfigVO.getCompanyName());
  134. configDO.setUpdateTime(new Date());
  135. configDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
  136. companyEmailConfigMapper.updateCompanyEmailConfig(configDO);
  137. }
  138. }
  139. @Override
  140. @Async
  141. public void sendCompanyEmail(List<Integer> idList) {
  142. List<ContactInformationDO> configDOList = contactInformationService.selectByIdList(idList);
  143. Map<String,List<ContactInformationDO>> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId()));
  144. for(String companyId : companyListMap.keySet()){
  145. StringBuffer emails = new StringBuffer();
  146. List<ContactInformationDO> configDOS = companyListMap.get(companyId);
  147. for(ContactInformationDO configDO: configDOS){
  148. emails.append(configDO.getContactEmail()).append(";");
  149. }
  150. //把缺失数据的邮件发送到该公司名下的邮箱地址
  151. sendNavAssetEmail(companyId,emails.toString());
  152. }
  153. }
  154. private void sendNavAssetEmail(String companyId, String emails) {
  155. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  156. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  157. for (String fundId : fundIdList) {
  158. getNavNotRemarkDeletion(fundId,emailDeletionInfoDOS);
  159. getAssetNotRemarkDeletion(fundId,emailDeletionInfoDOS);
  160. }
  161. if(emailDeletionInfoDOS.size() > 0){
  162. EmailTemplateDO emailTemplateDO = emailTemplateMapper.selectByCode(DELETION_TEMPLATE_CODE,1);
  163. if(emailTemplateDO == null){
  164. return;
  165. }
  166. String emailTitle = emailTemplateDO.getEmailTitle();
  167. String emailBody = emailTemplateDO.getEmailBody().replaceAll("\r\n", "<br/>").replaceAll("\n", "<br/>");
  168. try {
  169. //将数据写入excel文件
  170. File file = writeExcelFile(emailDeletionInfoDOS);
  171. file.setWritable(true);
  172. file.setReadable(true);
  173. file.setExecutable(true);
  174. MailboxInfoDTO dto = getFromEmailInfo();
  175. try{
  176. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  177. }catch (Exception e){
  178. //有些是因为被识别为垃圾邮件导致的报错,需要在发送一次
  179. logger.error(e.getMessage(),e);
  180. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  181. }
  182. //发送成功之后修改数据为已发送
  183. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  184. //写入发送历史
  185. String[] emailList = emails.split(";");
  186. for(String email : emailList){
  187. saveCompanyEmailSendHistory(companyId,email,emailTitle,1,ResultCode.SEND_SUCCESS.getMsg());
  188. }
  189. } catch (Exception e) {
  190. String[] emailList = emails.split(";");
  191. for(String email : emailList){
  192. saveCompanyEmailSendHistory(companyId,email,emailTitle,0,e.getMessage());
  193. }
  194. logger.error(e.getMessage(),e);
  195. }
  196. }
  197. }
  198. private void getAssetNotRemarkDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  199. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectAssetNotRemarkDeletionInfoByFundId(fundId);
  200. if(fundEmailDeletionInfoDOList.isEmpty()){
  201. return;
  202. }
  203. fundEmailDeletionInfoDOList = fundEmailDeletionInfoDOList.stream().filter(e -> e.getChannelId() != null).collect(Collectors.toList());
  204. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  205. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  206. if(fundReportFrequencyDO == null){
  207. return;
  208. }
  209. for (Integer channelId : channelDeletionMap.keySet()) {
  210. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  211. if(channelEmailDeletionInfoDOList.isEmpty()){
  212. continue;
  213. }
  214. //根据渠道ID和基金ID去查最新的净值日期
  215. Date priceDate = assetMapper.selectMaxPriceDate(channelId,fundId);
  216. if(priceDate == null){
  217. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  218. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  219. continue;
  220. }
  221. try{
  222. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  223. }catch (Exception e){
  224. logger.error(e.getMessage(),e);
  225. }
  226. }
  227. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  228. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  229. //最新净值不再更新,超过五次就不再发送
  230. if(deletionTaskLogInfoDOList.size() >= 5){
  231. continue;
  232. }
  233. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  234. deletionTaskLogInfoDO.setChannelId(channelId);
  235. deletionTaskLogInfoDO.setFundId(fundId);
  236. deletionTaskLogInfoDO.setIsvalid(1);
  237. deletionTaskLogInfoDO.setCreateTime(new Date());
  238. deletionTaskLogInfoDO.setUpdateTime(new Date());
  239. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  240. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  241. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  242. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  243. }
  244. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  245. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  246. //最新净值不再更新,超过3次就不再发送
  247. if(deletionTaskLogInfoDOList.size() >= 3){
  248. continue;
  249. }
  250. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  251. deletionTaskLogInfoDO.setChannelId(channelId);
  252. deletionTaskLogInfoDO.setFundId(fundId);
  253. deletionTaskLogInfoDO.setIsvalid(1);
  254. deletionTaskLogInfoDO.setCreateTime(new Date());
  255. deletionTaskLogInfoDO.setUpdateTime(new Date());
  256. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  257. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  258. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  259. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  260. }
  261. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  262. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  263. //最新净值不再更新,超过1次就不再发送
  264. if(deletionTaskLogInfoDOList.size() >= 1){
  265. continue;
  266. }
  267. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  268. deletionTaskLogInfoDO.setChannelId(channelId);
  269. deletionTaskLogInfoDO.setFundId(fundId);
  270. deletionTaskLogInfoDO.setIsvalid(1);
  271. deletionTaskLogInfoDO.setCreateTime(new Date());
  272. deletionTaskLogInfoDO.setUpdateTime(new Date());
  273. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  274. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  275. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  276. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  277. }
  278. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  279. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  280. }
  281. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  282. }
  283. }
  284. private void getNavNotRemarkDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  285. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectNavNotRemarkDeletionInfoByFundId(fundId);
  286. if(fundEmailDeletionInfoDOList.isEmpty()){
  287. return;
  288. }
  289. fundEmailDeletionInfoDOList = fundEmailDeletionInfoDOList.stream().filter(e -> e.getChannelId() != null).collect(Collectors.toList());
  290. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  291. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  292. if(fundReportFrequencyDO == null){
  293. return;
  294. }
  295. for (Integer channelId : channelDeletionMap.keySet()) {
  296. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  297. if(channelEmailDeletionInfoDOList.isEmpty()){
  298. continue;
  299. }
  300. //根据渠道ID和基金ID去查最新的净值日期
  301. Date priceDate = navMapper.selectMaxPriceDate(channelId,fundId);
  302. if(priceDate == null){
  303. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  304. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  305. continue;
  306. }
  307. try{
  308. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  309. }catch (Exception e){
  310. logger.error(e.getMessage(),e);
  311. }
  312. }
  313. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  314. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  315. //最新净值不再更新,超过五次就不再发送
  316. if(deletionTaskLogInfoDOList.size() >= 5){
  317. continue;
  318. }
  319. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  320. deletionTaskLogInfoDO.setChannelId(channelId);
  321. deletionTaskLogInfoDO.setFundId(fundId);
  322. deletionTaskLogInfoDO.setIsvalid(1);
  323. deletionTaskLogInfoDO.setCreateTime(new Date());
  324. deletionTaskLogInfoDO.setUpdateTime(new Date());
  325. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  326. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  327. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  328. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  329. }
  330. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  331. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  332. //最新净值不再更新,超过3次就不再发送
  333. if(deletionTaskLogInfoDOList.size() >= 3){
  334. continue;
  335. }
  336. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  337. deletionTaskLogInfoDO.setChannelId(channelId);
  338. deletionTaskLogInfoDO.setFundId(fundId);
  339. deletionTaskLogInfoDO.setIsvalid(1);
  340. deletionTaskLogInfoDO.setCreateTime(new Date());
  341. deletionTaskLogInfoDO.setUpdateTime(new Date());
  342. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  343. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  344. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  345. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  346. }
  347. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  348. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  349. //最新净值不再更新,超过1次就不再发送
  350. if(deletionTaskLogInfoDOList.size() >= 1){
  351. continue;
  352. }
  353. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  354. deletionTaskLogInfoDO.setChannelId(channelId);
  355. deletionTaskLogInfoDO.setFundId(fundId);
  356. deletionTaskLogInfoDO.setIsvalid(1);
  357. deletionTaskLogInfoDO.setCreateTime(new Date());
  358. deletionTaskLogInfoDO.setUpdateTime(new Date());
  359. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  360. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  361. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  362. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  363. }
  364. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  365. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  366. }
  367. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  368. }
  369. }
  370. @Override
  371. //邮件校验处理
  372. public void sendEmail(String companyId, String emails) {
  373. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  374. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  375. for (String fundId : fundIdList) {
  376. getNavDeletion(fundId,emailDeletionInfoDOS);
  377. getAssetDeletion(fundId,emailDeletionInfoDOS);
  378. }
  379. if(emailDeletionInfoDOS.size() > 0){
  380. EmailTemplateDO emailTemplateDO = emailTemplateMapper.selectByCode(DELETION_TEMPLATE_CODE,1);
  381. if(emailTemplateDO == null){
  382. return;
  383. }
  384. String emailTitle = emailTemplateDO.getEmailTitle();
  385. String emailBody = emailTemplateDO.getEmailBody().replaceAll("\r\n", "<br/>").replaceAll("\n", "<br/>");
  386. try {
  387. //将数据写入excel文件
  388. File file = writeExcelFile(emailDeletionInfoDOS);
  389. file.setWritable(true);
  390. file.setReadable(true);
  391. file.setExecutable(true);
  392. MailboxInfoDTO dto = getFromEmailInfo();
  393. try{
  394. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  395. }catch (Exception e){
  396. //有些是因为被识别为垃圾邮件导致的报错,需要在发送一次
  397. logger.error(e.getMessage(),e);
  398. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  399. }
  400. //发送成功之后修改数据为已发送
  401. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  402. //写入发送历史
  403. String[] emailList = emails.split(";");
  404. for(String email : emailList){
  405. saveCompanyEmailSendHistory(companyId,email,emailTitle,1,ResultCode.SEND_SUCCESS.getMsg());
  406. }
  407. } catch (Exception e) {
  408. String[] emailList = emails.split(";");
  409. for(String email : emailList){
  410. saveCompanyEmailSendHistory(companyId,email,emailTitle,0,e.getMessage());
  411. }
  412. logger.error(e.getMessage(),e);
  413. }
  414. }
  415. }
  416. private void getNavDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  417. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectNavDeletionInfoByFundId(fundId);
  418. if(fundEmailDeletionInfoDOList.isEmpty()){
  419. return;
  420. }
  421. fundEmailDeletionInfoDOList = fundEmailDeletionInfoDOList.stream().filter(e -> e.getChannelId() != null).collect(Collectors.toList());
  422. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  423. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  424. if(fundReportFrequencyDO == null){
  425. return;
  426. }
  427. for (Integer channelId : channelDeletionMap.keySet()) {
  428. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  429. if(channelEmailDeletionInfoDOList.isEmpty()){
  430. continue;
  431. }
  432. //根据渠道ID和基金ID去查最新的净值日期
  433. Date priceDate = navMapper.selectMaxPriceDate(channelId,fundId);
  434. if(priceDate == null){
  435. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  436. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  437. continue;
  438. }
  439. try{
  440. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  441. }catch (Exception e){
  442. logger.error(e.getMessage(),e);
  443. }
  444. }
  445. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  446. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  447. //最新净值不再更新,超过五次就不再发送
  448. if(deletionTaskLogInfoDOList.size() >= 5){
  449. continue;
  450. }
  451. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  452. deletionTaskLogInfoDO.setChannelId(channelId);
  453. deletionTaskLogInfoDO.setFundId(fundId);
  454. deletionTaskLogInfoDO.setIsvalid(1);
  455. deletionTaskLogInfoDO.setCreateTime(new Date());
  456. deletionTaskLogInfoDO.setUpdateTime(new Date());
  457. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  458. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  459. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  460. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  461. }
  462. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  463. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  464. //最新净值不再更新,超过3次就不再发送
  465. if(deletionTaskLogInfoDOList.size() >= 3){
  466. continue;
  467. }
  468. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  469. deletionTaskLogInfoDO.setChannelId(channelId);
  470. deletionTaskLogInfoDO.setFundId(fundId);
  471. deletionTaskLogInfoDO.setIsvalid(1);
  472. deletionTaskLogInfoDO.setCreateTime(new Date());
  473. deletionTaskLogInfoDO.setUpdateTime(new Date());
  474. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  475. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  476. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  477. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  478. }
  479. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  480. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  481. //最新净值不再更新,超过1次就不再发送
  482. if(deletionTaskLogInfoDOList.size() >= 1){
  483. continue;
  484. }
  485. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  486. deletionTaskLogInfoDO.setChannelId(channelId);
  487. deletionTaskLogInfoDO.setFundId(fundId);
  488. deletionTaskLogInfoDO.setIsvalid(1);
  489. deletionTaskLogInfoDO.setCreateTime(new Date());
  490. deletionTaskLogInfoDO.setUpdateTime(new Date());
  491. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  492. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  493. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  494. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  495. }
  496. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  497. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  498. }
  499. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  500. }
  501. }
  502. private void getAssetDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  503. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectAssetDeletionInfoByFundId(fundId);
  504. if(fundEmailDeletionInfoDOList.isEmpty()){
  505. return;
  506. }
  507. fundEmailDeletionInfoDOList = fundEmailDeletionInfoDOList.stream().filter(e -> e.getChannelId() != null).collect(Collectors.toList());
  508. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  509. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  510. if(fundReportFrequencyDO == null){
  511. return;
  512. }
  513. for (Integer channelId : channelDeletionMap.keySet()) {
  514. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  515. if(channelEmailDeletionInfoDOList.isEmpty()){
  516. continue;
  517. }
  518. //根据渠道ID和基金ID去查最新的净值日期
  519. Date priceDate = assetMapper.selectMaxPriceDate(channelId,fundId);
  520. if(priceDate == null){
  521. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  522. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  523. continue;
  524. }
  525. try{
  526. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  527. }catch (Exception e){
  528. logger.error(e.getMessage(),e);
  529. }
  530. }
  531. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  532. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  533. //最新净值不再更新,超过五次就不再发送
  534. if(deletionTaskLogInfoDOList.size() >= 5){
  535. continue;
  536. }
  537. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  538. deletionTaskLogInfoDO.setChannelId(channelId);
  539. deletionTaskLogInfoDO.setFundId(fundId);
  540. deletionTaskLogInfoDO.setIsvalid(1);
  541. deletionTaskLogInfoDO.setCreateTime(new Date());
  542. deletionTaskLogInfoDO.setUpdateTime(new Date());
  543. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  544. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  545. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  546. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  547. }
  548. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  549. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  550. //最新净值不再更新,超过3次就不再发送
  551. if(deletionTaskLogInfoDOList.size() >= 3){
  552. continue;
  553. }
  554. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  555. deletionTaskLogInfoDO.setChannelId(channelId);
  556. deletionTaskLogInfoDO.setFundId(fundId);
  557. deletionTaskLogInfoDO.setIsvalid(1);
  558. deletionTaskLogInfoDO.setCreateTime(new Date());
  559. deletionTaskLogInfoDO.setUpdateTime(new Date());
  560. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  561. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  562. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  563. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  564. }
  565. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  566. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  567. //最新净值不再更新,超过1次就不再发送
  568. if(deletionTaskLogInfoDOList.size() >= 1){
  569. continue;
  570. }
  571. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  572. deletionTaskLogInfoDO.setChannelId(channelId);
  573. deletionTaskLogInfoDO.setFundId(fundId);
  574. deletionTaskLogInfoDO.setIsvalid(1);
  575. deletionTaskLogInfoDO.setCreateTime(new Date());
  576. deletionTaskLogInfoDO.setUpdateTime(new Date());
  577. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  578. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  579. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  580. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  581. }
  582. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  583. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  584. }
  585. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  586. }
  587. }
  588. @Override
  589. public void sendDistributeEmail(String companyId, String emails) {
  590. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  591. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  592. for (String fundId : fundIdList) {
  593. List<EmailDeletionInfoDO> distributeDeletionList = deletionInfoMapper.selectDistributeDeletionInfoByFundId(fundId);
  594. if(distributeDeletionList.isEmpty()){
  595. continue;
  596. }
  597. DistributeDeletionInfoDO distributeDeletionInfoDO = deletionInfoMapper.getDistributeDeletionInfo(fundId);
  598. //查询第一次缺失日期,如果一样就不在发送,不一样才发生,同时更新最新的最小缺失日期
  599. if(distributeDeletionInfoDO == null){
  600. distributeDeletionInfoDO = new DistributeDeletionInfoDO();
  601. distributeDeletionInfoDO.setFundId(fundId);
  602. distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate());
  603. distributeDeletionInfoDO.setIsvalid(1);
  604. distributeDeletionInfoDO.setUpdateTime(new Date());
  605. distributeDeletionInfoDO.setCreateTime(new Date());
  606. deletionInfoMapper.saveDistributeFirstDeletion(distributeDeletionInfoDO);
  607. }else{
  608. String deletionDate = distributeDeletionInfoDO.getDeletionDate();
  609. if(deletionDate.equals(distributeDeletionList.get(0).getDeletionDate())){
  610. continue;
  611. }else{
  612. distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate());
  613. deletionInfoMapper.updateDistributeDeletionInfoDO(distributeDeletionInfoDO);
  614. }
  615. }
  616. for(EmailDeletionInfoDO infoDO : distributeDeletionList){
  617. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  618. }
  619. emailDeletionInfoDOS.addAll(distributeDeletionList);
  620. }
  621. if(emailDeletionInfoDOS.size() > 0){
  622. EmailTemplateDO emailTemplateDO = emailTemplateMapper.selectByCode(DISTRIBUTION_DELETION_TEMPLATE_CODE,1);
  623. if(emailTemplateDO == null){
  624. return;
  625. }
  626. String emailTitle = emailTemplateDO.getEmailTitle();
  627. String emailBody = emailTemplateDO.getEmailBody().replaceAll("\r\n", "<br/>").replaceAll("\n", "<br/>");
  628. try {
  629. //将数据写入excel文件
  630. File file = writeExcelFile(emailDeletionInfoDOS);
  631. file.setWritable(true);
  632. file.setReadable(true);
  633. file.setExecutable(true);
  634. MailboxInfoDTO dto = getFromEmailInfo();
  635. try{
  636. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  637. }catch (Exception e){
  638. logger.error(e.getMessage(),e);
  639. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  640. }
  641. //发送成功之后修改数据为已发送
  642. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  643. //写入发送历史
  644. String[] emailList = emails.split(";");
  645. for(String email : emailList){
  646. saveCompanyEmailSendHistory(companyId,email,emailTitle,1,ResultCode.SEND_SUCCESS.getMsg());
  647. }
  648. } catch (Exception e) {
  649. String[] emailList = emails.split(";");
  650. for(String email : emailList){
  651. saveCompanyEmailSendHistory(companyId,email,emailTitle,0,e.getMessage());
  652. }
  653. logger.error(e.getMessage(),e);
  654. }
  655. }
  656. }
  657. @Override
  658. public void sendDistributeEmailById(List<Integer> idList) {
  659. List<ContactInformationDO> configDOList = contactInformationService.selectByIdList(idList);
  660. Map<String,List<ContactInformationDO>> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId()));
  661. for(String companyId : companyListMap.keySet()){
  662. StringBuffer emails = new StringBuffer();
  663. List<ContactInformationDO> configDOS = companyListMap.get(companyId);
  664. for(ContactInformationDO configDO: configDOS){
  665. emails.append(configDO.getContactEmail()).append(";");
  666. }
  667. //把缺失数据的邮件发送到该公司名下的邮箱地址
  668. sendDistributeNotRemarkEmail(companyId,emails.toString());
  669. }
  670. }
  671. private void sendDistributeNotRemarkEmail(String companyId, String emails) {
  672. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  673. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  674. for (String fundId : fundIdList) {
  675. List<EmailDeletionInfoDO> distributeDeletionList = deletionInfoMapper.selectDistributeNotRemarkDeletionInfoByFundId(fundId);
  676. if(distributeDeletionList.isEmpty()){
  677. continue;
  678. }
  679. for(EmailDeletionInfoDO infoDO : distributeDeletionList){
  680. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  681. }
  682. emailDeletionInfoDOS.addAll(distributeDeletionList);
  683. }
  684. if(emailDeletionInfoDOS.size() > 0){
  685. EmailTemplateDO emailTemplateDO = emailTemplateMapper.selectByCode(DISTRIBUTION_DELETION_TEMPLATE_CODE,1);
  686. if(emailTemplateDO == null){
  687. return;
  688. }
  689. String emailTitle = emailTemplateDO.getEmailTitle();
  690. String emailBody = emailTemplateDO.getEmailBody().replaceAll("\r\n", "<br/>").replaceAll("\n", "<br/>");
  691. try {
  692. //将数据写入excel文件
  693. File file = writeExcelFile(emailDeletionInfoDOS);
  694. file.setWritable(true);
  695. file.setReadable(true);
  696. file.setExecutable(true);
  697. MailboxInfoDTO dto = getFromEmailInfo();
  698. try{
  699. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  700. }catch (Exception e){
  701. logger.error(e.getMessage(),e);
  702. EmailUtil.senEmail(dto,emails,List.of(file),emailBody,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  703. }
  704. //发送成功之后修改数据为已发送
  705. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  706. //写入发送历史
  707. String[] emailList = emails.split(";");
  708. for(String email : emailList){
  709. saveCompanyEmailSendHistory(companyId,email,emailTitle,1,ResultCode.SEND_SUCCESS.getMsg());
  710. }
  711. } catch (Exception e) {
  712. String[] emailList = emails.split(";");
  713. for(String email : emailList){
  714. saveCompanyEmailSendHistory(companyId,email,emailTitle,0,e.getMessage());
  715. }
  716. logger.error(e.getMessage(),e);
  717. }
  718. }
  719. }
  720. private void saveCompanyEmailSendHistory(String companyId, String email, String emailTitle,Integer sendStatus,String msg) {
  721. CompanyEmailSendHistoryDO historyDO = new CompanyEmailSendHistoryDO();
  722. historyDO.setCompanyId(companyId);
  723. historyDO.setEmail(email);
  724. historyDO.setSendStatus(sendStatus);
  725. historyDO.setSendRemark(msg);
  726. historyDO.setEmailTitle(emailTitle);
  727. historyDO.setIsvalid(1);
  728. historyDO.setSendTime(DateUtils.getNowDate());
  729. historyDO.setCreateTime(DateUtils.getNowDate());
  730. historyDO.setCreateTime(DateUtils.getNowDate());
  731. companyEmailSendHistoryMapper.saveCompanyEmailSendHistory(historyDO);
  732. }
  733. public MailboxInfoDTO getFromEmailInfo(){
  734. MailboxInfoDTO dto = new MailboxInfoDTO();
  735. dto.setAccount(sysConfigMapper.selectConfigByKey("sender.email"));
  736. dto.setProtocol(sysConfigMapper.selectConfigByKey("sender.protocol"));
  737. dto.setPassword(sysConfigMapper.selectConfigByKey("sender.password"));
  738. dto.setPort(sysConfigMapper.selectConfigByKey("sender.port"));
  739. dto.setHost(sysConfigMapper.selectConfigByKey("sender.host"));
  740. dto.setSsl(sysConfigMapper.selectConfigByKey("sender.ssl"));
  741. return dto;
  742. }
  743. private File writeExcelFile(List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  744. Map<String,List<List<String>>> values = new HashMap<>();
  745. List<String> head = new ArrayList<>();
  746. head.add("渠道ID");
  747. head.add("渠道名称");
  748. head.add("基金全称");
  749. head.add("管理人");
  750. head.add("缺失类型");
  751. head.add("缺失日期");
  752. String sheetName = "基金缺失明细";
  753. List<List<String>> dataList = new ArrayList<>();
  754. for(EmailDeletionInfoDO dto : emailDeletionInfoDOS){
  755. List<String> data = new ArrayList<>();
  756. data.add(String.valueOf(dto.getChannelId()));
  757. data.add(dto.getChannelName());
  758. data.add(dto.getFundName());
  759. data.add(dto.getCompanyName());
  760. data.add(dto.getDeletionType());
  761. data.add(dto.getDeletionDate());
  762. dataList.add(data);
  763. }
  764. values.put(sheetName,dataList);
  765. XSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName,head,values,null);
  766. File file = new File(path+"/"+DateUtils.format(new Date(),DateUtils.YYYYMMDDHHMMSS)+"基金缺失明细.xlsx");
  767. if(!file.exists()){
  768. try {
  769. file.createNewFile();
  770. } catch (IOException e) {
  771. throw new RuntimeException(e);
  772. }
  773. }
  774. try {
  775. FileOutputStream fos = new FileOutputStream(file);
  776. wb.write(fos);
  777. wb.close();
  778. fos.close();
  779. } catch (IOException e) {
  780. throw new RuntimeException(e);
  781. }
  782. return file;
  783. }
  784. }