CompanyEmailConfigServiceImpl.java 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  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.shiro.utils.UserUtils;
  18. import com.smppw.common.pojo.ResultVo;
  19. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  20. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  21. import org.slf4j.Logger;
  22. import org.slf4j.LoggerFactory;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.beans.factory.annotation.Value;
  25. import org.springframework.stereotype.Service;
  26. import org.springframework.web.multipart.MultipartFile;
  27. import java.io.File;
  28. import java.io.FileOutputStream;
  29. import java.io.IOException;
  30. import java.io.InputStream;
  31. import java.util.*;
  32. import java.util.stream.Collectors;
  33. /**
  34. * FileName: CompanyEmailConfigServiceImpl
  35. * Author: chenjianhua
  36. * Date: 2024/9/7 12:55
  37. * Description: ${DESCRIPTION}
  38. */
  39. @Service
  40. public class CompanyEmailConfigServiceImpl implements CompanyEmailConfigService {
  41. @Autowired
  42. private CompanyEmailConfigMapper companyEmailConfigMapper;
  43. @Autowired
  44. private CompanyEmailSendHistoryMapper companyEmailSendHistoryMapper;
  45. @Autowired
  46. private FundInfoMapper fundInfoMapper;
  47. @Autowired
  48. private DeletionInfoMapper deletionInfoMapper;
  49. @Autowired
  50. private DeletionTaskLogInfoMapper deletionTaskLogInfoMapper;
  51. @Autowired
  52. private SysConfigMapper sysConfigMapper;
  53. private static Logger logger = LoggerFactory.getLogger(CompanyEmailConfigServiceImpl.class);
  54. @Value("${email.file.path}")
  55. private String path;
  56. @Autowired
  57. private FundReportFrequencyMapper fundReportFrequencyMapper;
  58. @Autowired
  59. private NavMapper navMapper;
  60. @Autowired
  61. private AssetMapper assetMapper;
  62. @Override
  63. public ResultVo saveCompanyEmailConfig(List<CompanyEmailConfigVO> companyEmailConfigVOS) {
  64. ResultVo vo = new ResultVo(com.smppw.common.pojo.enums.status.ResultCode.SAVE_SUCCESS);
  65. vo.setData(true);
  66. StringBuffer msg = new StringBuffer();
  67. try{
  68. for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
  69. CompanyEmailConfigDO oldEmailConfigDO = companyEmailConfigMapper.selectEmailConfig(emailConfigVO.getCompanyId(),emailConfigVO.getEmail());
  70. if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() == null){
  71. msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(",");
  72. }
  73. if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() != null){
  74. if(!oldEmailConfigDO.getId().equals(emailConfigVO.getId())){
  75. msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(",");
  76. }
  77. }
  78. }
  79. if(StringUtil.isNotEmpty(msg.toString())){
  80. vo.setMsg(msg.toString().substring(0,msg.length()-1));
  81. vo.setData(false);
  82. return vo;
  83. }
  84. for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){
  85. CompanyEmailConfigDO emailConfigDO = new CompanyEmailConfigDO();
  86. emailConfigDO.setCompanyId(emailConfigVO.getCompanyId());
  87. emailConfigDO.setCompanyName(emailConfigVO.getCompanyName());
  88. emailConfigDO.setEmail(emailConfigVO.getEmail());
  89. emailConfigDO.setOpenStatus(emailConfigVO.getOpenStatus());
  90. emailConfigDO.setRemark(emailConfigVO.getSendRemark());
  91. emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId());
  92. emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId());
  93. emailConfigDO.setIsvalid(1);
  94. emailConfigDO.setUpdateTime(new Date());
  95. if(emailConfigVO.getId() != null){
  96. emailConfigDO.setId(emailConfigVO.getId());
  97. companyEmailConfigMapper.updateCompanyEmailConfig(emailConfigDO);
  98. }else{
  99. emailConfigDO.setCreateTime(new Date());
  100. companyEmailConfigMapper.saveCompanyEmailConfig(emailConfigDO);
  101. }
  102. }
  103. }catch (Exception e){
  104. }
  105. return vo;
  106. }
  107. @Override
  108. public void deleteCompanyEmailConfig(Integer id) {
  109. CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectById(id);
  110. if (configDO != null) {
  111. configDO.setIsvalid(0);
  112. configDO.setUpdateTime(new Date());
  113. configDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
  114. companyEmailConfigMapper.updateById(configDO);
  115. }
  116. }
  117. @Override
  118. public void updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO) {
  119. CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(companyEmailConfigVO.getId());
  120. if(configDO != null){
  121. configDO.setEmail(companyEmailConfigVO.getEmail());
  122. configDO.setCompanyId(companyEmailConfigVO.getCompanyId());
  123. configDO.setCompanyName(companyEmailConfigVO.getCompanyName());
  124. configDO.setUpdateTime(new Date());
  125. configDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
  126. companyEmailConfigMapper.updateCompanyEmailConfig(configDO);
  127. }
  128. }
  129. @Override
  130. public void sendCompanyEmail(List<Integer> idList) {
  131. List<CompanyEmailConfigDO> configDOList = companyEmailConfigMapper.selectCompanyEmailConfigByIdList(idList);
  132. Map<String,List<CompanyEmailConfigDO>> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId()));
  133. for(String companyId : companyListMap.keySet()){
  134. StringBuffer emails = new StringBuffer();
  135. List<CompanyEmailConfigDO> configDOS = companyListMap.get(companyId);
  136. for(CompanyEmailConfigDO configDO: configDOS){
  137. emails.append(configDO.getEmail()).append(";");
  138. }
  139. //把缺失数据的邮件发送到该公司名下的邮箱地址
  140. sendEmail(companyId,emails.toString());
  141. }
  142. }
  143. @Override
  144. //邮件校验处理
  145. public void sendEmail(String companyId, String emails) {
  146. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  147. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  148. for (String fundId : fundIdList) {
  149. getNavDeletion(fundId,emailDeletionInfoDOS);
  150. getAssetDeletion(fundId,emailDeletionInfoDOS);
  151. }
  152. if(emailDeletionInfoDOS.size() > 0){
  153. try {
  154. //将数据写入excel文件
  155. File file = writeExcelFile(emailDeletionInfoDOS);
  156. file.setWritable(true);
  157. file.setReadable(true);
  158. file.setExecutable(true);
  159. MailboxInfoDTO dto = getFromEmailInfo();
  160. // "<p>您好,附件为产品的数据未发送到最新,麻烦尽快发送缺失的数据。若是产品清算或者有其他原因不再发送数据,还请将产品的清算日期或者不再发送数据的原因发送给我们,非常感谢~\n</p>";
  161. String htmlText = sysConfigMapper.selectConfigByKey("deletion_email_body");
  162. String emailTitle = sysConfigMapper.selectConfigByKey("deletion_email_title");
  163. EmailUtil.senEmail(dto,emails,List.of(file),htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  164. //发送成功之后修改数据为已发送
  165. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  166. //写入发送历史
  167. String[] emailList = emails.split(";");
  168. for(String email : emailList){
  169. saveCompanyEmailSendHistory(companyId,email,1,ResultCode.SEND_SUCCESS.getMsg());
  170. }
  171. } catch (Exception e) {
  172. String[] emailList = emails.split(";");
  173. for(String email : emailList){
  174. saveCompanyEmailSendHistory(companyId,email,0,e.getMessage());
  175. }
  176. logger.error(e.getMessage(),e);
  177. }
  178. }
  179. }
  180. private void getNavDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  181. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectNavDeletionInfoByFundId(fundId);
  182. if(fundEmailDeletionInfoDOList.isEmpty()){
  183. return;
  184. }
  185. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  186. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  187. if(fundReportFrequencyDO == null){
  188. return;
  189. }
  190. for (Integer channelId : channelDeletionMap.keySet()) {
  191. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  192. if(channelEmailDeletionInfoDOList.isEmpty()){
  193. continue;
  194. }
  195. //根据渠道ID和基金ID去查最新的净值日期
  196. Date priceDate = navMapper.selectMaxPriceDate(channelId,fundId);
  197. if(priceDate == null){
  198. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  199. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  200. continue;
  201. }
  202. try{
  203. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  204. }catch (Exception e){
  205. logger.error(e.getMessage(),e);
  206. }
  207. }
  208. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  209. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  210. //最新净值不再更新,超过五次就不再发送
  211. if(deletionTaskLogInfoDOList.size() >= 5){
  212. continue;
  213. }
  214. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  215. deletionTaskLogInfoDO.setChannelId(channelId);
  216. deletionTaskLogInfoDO.setFundId(fundId);
  217. deletionTaskLogInfoDO.setIsvalid(1);
  218. deletionTaskLogInfoDO.setCreateTime(new Date());
  219. deletionTaskLogInfoDO.setUpdateTime(new Date());
  220. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  221. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  222. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  223. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  224. }
  225. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  226. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  227. //最新净值不再更新,超过3次就不再发送
  228. if(deletionTaskLogInfoDOList.size() >= 3){
  229. continue;
  230. }
  231. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  232. deletionTaskLogInfoDO.setChannelId(channelId);
  233. deletionTaskLogInfoDO.setFundId(fundId);
  234. deletionTaskLogInfoDO.setIsvalid(1);
  235. deletionTaskLogInfoDO.setCreateTime(new Date());
  236. deletionTaskLogInfoDO.setUpdateTime(new Date());
  237. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  238. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  239. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  240. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  241. }
  242. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getNavFrequency())){
  243. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  244. //最新净值不再更新,超过1次就不再发送
  245. if(deletionTaskLogInfoDOList.size() >= 1){
  246. continue;
  247. }
  248. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  249. deletionTaskLogInfoDO.setChannelId(channelId);
  250. deletionTaskLogInfoDO.setFundId(fundId);
  251. deletionTaskLogInfoDO.setIsvalid(1);
  252. deletionTaskLogInfoDO.setCreateTime(new Date());
  253. deletionTaskLogInfoDO.setUpdateTime(new Date());
  254. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  255. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  256. deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode());
  257. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  258. }
  259. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  260. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  261. }
  262. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  263. }
  264. }
  265. private void getAssetDeletion(String fundId, List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  266. List<EmailDeletionInfoDO> fundEmailDeletionInfoDOList = deletionInfoMapper.selectAssetDeletionInfoByFundId(fundId);
  267. if(fundEmailDeletionInfoDOList.isEmpty()){
  268. return;
  269. }
  270. Map<Integer, List<EmailDeletionInfoDO>> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId));
  271. FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
  272. if(fundReportFrequencyDO == null){
  273. return;
  274. }
  275. for (Integer channelId : channelDeletionMap.keySet()) {
  276. List<EmailDeletionInfoDO> channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId);
  277. if(channelEmailDeletionInfoDOList.isEmpty()){
  278. continue;
  279. }
  280. //根据渠道ID和基金ID去查最新的净值日期
  281. Date priceDate = assetMapper.selectMaxPriceDate(channelId,fundId);
  282. if(priceDate == null){
  283. FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId);
  284. if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){
  285. continue;
  286. }
  287. try{
  288. priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd");
  289. }catch (Exception e){
  290. logger.error(e.getMessage(),e);
  291. }
  292. }
  293. if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  294. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  295. //最新净值不再更新,超过五次就不再发送
  296. if(deletionTaskLogInfoDOList.size() >= 5){
  297. continue;
  298. }
  299. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  300. deletionTaskLogInfoDO.setChannelId(channelId);
  301. deletionTaskLogInfoDO.setFundId(fundId);
  302. deletionTaskLogInfoDO.setIsvalid(1);
  303. deletionTaskLogInfoDO.setCreateTime(new Date());
  304. deletionTaskLogInfoDO.setUpdateTime(new Date());
  305. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  306. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  307. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  308. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  309. }
  310. if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  311. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  312. //最新净值不再更新,超过3次就不再发送
  313. if(deletionTaskLogInfoDOList.size() >= 3){
  314. continue;
  315. }
  316. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  317. deletionTaskLogInfoDO.setChannelId(channelId);
  318. deletionTaskLogInfoDO.setFundId(fundId);
  319. deletionTaskLogInfoDO.setIsvalid(1);
  320. deletionTaskLogInfoDO.setCreateTime(new Date());
  321. deletionTaskLogInfoDO.setUpdateTime(new Date());
  322. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  323. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  324. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  325. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  326. }
  327. if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){
  328. List<DeletionTaskLogInfoDO> deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode());
  329. //最新净值不再更新,超过1次就不再发送
  330. if(deletionTaskLogInfoDOList.size() >= 1){
  331. continue;
  332. }
  333. DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO();
  334. deletionTaskLogInfoDO.setChannelId(channelId);
  335. deletionTaskLogInfoDO.setFundId(fundId);
  336. deletionTaskLogInfoDO.setIsvalid(1);
  337. deletionTaskLogInfoDO.setCreateTime(new Date());
  338. deletionTaskLogInfoDO.setUpdateTime(new Date());
  339. deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd"));
  340. deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency());
  341. deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode());
  342. deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO);
  343. }
  344. for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){
  345. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  346. }
  347. emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList);
  348. }
  349. }
  350. @Override
  351. public void sendDistributeEmail(String companyId, String emails) {
  352. List<String> fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId);
  353. List<EmailDeletionInfoDO> emailDeletionInfoDOS = new ArrayList<>();
  354. for (String fundId : fundIdList) {
  355. List<EmailDeletionInfoDO> distributeDeletionList = deletionInfoMapper.selectDistributeDeletionInfoByFundId(fundId);
  356. if(distributeDeletionList.isEmpty()){
  357. continue;
  358. }
  359. DistributeDeletionInfoDO distributeDeletionInfoDO = deletionInfoMapper.getDistributeDeletionInfo(fundId);
  360. //查询第一次缺失日期,如果一样就不在发送,不一样才发生,同时更新最新的最小缺失日期
  361. if(distributeDeletionInfoDO == null){
  362. distributeDeletionInfoDO = new DistributeDeletionInfoDO();
  363. distributeDeletionInfoDO.setFundId(fundId);
  364. distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate());
  365. distributeDeletionInfoDO.setIsvalid(1);
  366. distributeDeletionInfoDO.setUpdateTime(new Date());
  367. distributeDeletionInfoDO.setCreateTime(new Date());
  368. deletionInfoMapper.saveDistributeFirstDeletion(distributeDeletionInfoDO);
  369. }else{
  370. String deletionDate = distributeDeletionInfoDO.getDeletionDate();
  371. if(deletionDate.equals(distributeDeletionList.get(0).getDeletionDate())){
  372. continue;
  373. }else{
  374. distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate());
  375. deletionInfoMapper.updateDistributeDeletionInfoDO(distributeDeletionInfoDO);
  376. }
  377. }
  378. for(EmailDeletionInfoDO infoDO : distributeDeletionList){
  379. infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo());
  380. }
  381. emailDeletionInfoDOS.addAll(distributeDeletionList);
  382. }
  383. if(emailDeletionInfoDOS.size() > 0){
  384. try {
  385. //将数据写入excel文件
  386. File file = writeExcelFile(emailDeletionInfoDOS);
  387. file.setWritable(true);
  388. file.setReadable(true);
  389. file.setExecutable(true);
  390. MailboxInfoDTO dto = getFromEmailInfo();
  391. // "<p>您好,附件为产品的数据未发送到最新,麻烦尽快发送缺失的数据。若是产品清算或者有其他原因不再发送数据,还请将产品的清算日期或者不再发送数据的原因发送给我们,非常感谢~\n</p>";
  392. String htmlText = sysConfigMapper.selectConfigByKey("deletion_distribute_email_body");
  393. String emailTitle = sysConfigMapper.selectConfigByKey("deletion_distribute_email_title");
  394. EmailUtil.senEmail(dto,emails,List.of(file),htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
  395. //发送成功之后修改数据为已发送
  396. deletionInfoMapper.updateSendStatusByFundId(fundIdList);
  397. //写入发送历史
  398. String[] emailList = emails.split(";");
  399. for(String email : emailList){
  400. saveCompanyEmailSendHistory(companyId,email,1,ResultCode.SEND_SUCCESS.getMsg());
  401. }
  402. } catch (Exception e) {
  403. String[] emailList = emails.split(";");
  404. for(String email : emailList){
  405. saveCompanyEmailSendHistory(companyId,email,0,e.getMessage());
  406. }
  407. logger.error(e.getMessage(),e);
  408. }
  409. }
  410. }
  411. @Override
  412. public void sendDistributeEmailById(List<Integer> idList) {
  413. List<CompanyEmailConfigDO> configDOList = companyEmailConfigMapper.selectCompanyEmailConfigByIdList(idList);
  414. Map<String,List<CompanyEmailConfigDO>> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId()));
  415. for(String companyId : companyListMap.keySet()){
  416. StringBuffer emails = new StringBuffer();
  417. List<CompanyEmailConfigDO> configDOS = companyListMap.get(companyId);
  418. for(CompanyEmailConfigDO configDO: configDOS){
  419. emails.append(configDO.getEmail()).append(";");
  420. }
  421. //把缺失数据的邮件发送到该公司名下的邮箱地址
  422. sendDistributeEmail(companyId,emails.toString());
  423. }
  424. }
  425. private void saveCompanyEmailSendHistory(String companyId, String email,Integer sendStatus,String msg) {
  426. CompanyEmailSendHistoryDO historyDO = new CompanyEmailSendHistoryDO();
  427. historyDO.setCompanyId(companyId);
  428. historyDO.setEmail(email);
  429. historyDO.setSendStatus(sendStatus);
  430. historyDO.setSendRemark(msg);
  431. historyDO.setIsvalid(1);
  432. historyDO.setSendTime(DateUtils.getNowDate());
  433. historyDO.setCreateTime(DateUtils.getNowDate());
  434. historyDO.setCreateTime(DateUtils.getNowDate());
  435. companyEmailSendHistoryMapper.saveCompanyEmailSendHistory(historyDO);
  436. }
  437. private MailboxInfoDTO getFromEmailInfo(){
  438. MailboxInfoDTO dto = new MailboxInfoDTO();
  439. dto.setAccount(sysConfigMapper.selectConfigByKey("sender.email"));
  440. dto.setProtocol(sysConfigMapper.selectConfigByKey("sender.protocol"));
  441. dto.setPassword(sysConfigMapper.selectConfigByKey("sender.password"));
  442. dto.setPort(sysConfigMapper.selectConfigByKey("sender.port"));
  443. dto.setHost(sysConfigMapper.selectConfigByKey("sender.host"));
  444. dto.setSsl(sysConfigMapper.selectConfigByKey("sender.ssl"));
  445. return dto;
  446. }
  447. private File writeExcelFile(List<EmailDeletionInfoDO> emailDeletionInfoDOS) {
  448. Map<String,List<List<String>>> values = new HashMap<>();
  449. List<String> head = new ArrayList<>();
  450. head.add("渠道ID");
  451. head.add("渠道名称");
  452. head.add("基金全称");
  453. head.add("管理人");
  454. head.add("缺失类型");
  455. head.add("缺失日期");
  456. String sheetName = "基金缺失明细";
  457. List<List<String>> dataList = new ArrayList<>();
  458. for(EmailDeletionInfoDO dto : emailDeletionInfoDOS){
  459. List<String> data = new ArrayList<>();
  460. data.add(String.valueOf(dto.getChannelId()));
  461. data.add(dto.getChannelName());
  462. data.add(dto.getFundName());
  463. data.add(dto.getCompanyName());
  464. data.add(dto.getDeletionType());
  465. data.add(dto.getDeletionDate());
  466. dataList.add(data);
  467. }
  468. values.put(sheetName,dataList);
  469. XSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName,head,values,null);
  470. File file = new File(path+"/"+DateUtils.format(new Date(),DateUtils.YYYYMMDDHHMMSS)+"基金缺失明细.xlsx");
  471. if(!file.exists()){
  472. try {
  473. file.createNewFile();
  474. } catch (IOException e) {
  475. throw new RuntimeException(e);
  476. }
  477. }
  478. try {
  479. FileOutputStream fos = new FileOutputStream(file);
  480. wb.write(fos);
  481. wb.close();
  482. fos.close();
  483. } catch (IOException e) {
  484. throw new RuntimeException(e);
  485. }
  486. return file;
  487. }
  488. }