package com.simuwang.manage.service.impl; import com.simuwang.base.common.enums.DeletionType; import com.simuwang.base.common.enums.Frequency; import com.simuwang.base.common.enums.OpenStatusType; import com.simuwang.base.common.enums.ResultCode; import com.simuwang.base.common.util.DateUtils; import com.simuwang.base.common.util.EmailUtil; import com.simuwang.base.common.util.ExcelUtil; import com.simuwang.base.common.util.StringUtil; import com.simuwang.base.mapper.daq.*; import com.simuwang.base.mapper.daq.system.SysConfigMapper; import com.simuwang.base.pojo.dos.*; import com.simuwang.base.pojo.dto.EmailInfoDTO; import com.simuwang.base.pojo.dto.MailboxInfoDTO; import com.simuwang.base.pojo.vo.CompanyEmailConfigVO; import com.simuwang.manage.service.CompanyEmailConfigService; import com.simuwang.shiro.utils.UserUtils; import com.smppw.common.pojo.ResultVo; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.*; import java.util.stream.Collectors; /** * FileName: CompanyEmailConfigServiceImpl * Author: chenjianhua * Date: 2024/9/7 12:55 * Description: ${DESCRIPTION} */ @Service public class CompanyEmailConfigServiceImpl implements CompanyEmailConfigService { @Autowired private CompanyEmailConfigMapper companyEmailConfigMapper; @Autowired private CompanyEmailSendHistoryMapper companyEmailSendHistoryMapper; @Autowired private FundInfoMapper fundInfoMapper; @Autowired private DeletionInfoMapper deletionInfoMapper; @Autowired private DeletionTaskLogInfoMapper deletionTaskLogInfoMapper; @Autowired private SysConfigMapper sysConfigMapper; private static Logger logger = LoggerFactory.getLogger(CompanyEmailConfigServiceImpl.class); @Value("${email.file.path}") private String path; @Autowired private FundReportFrequencyMapper fundReportFrequencyMapper; @Autowired private NavMapper navMapper; @Autowired private AssetMapper assetMapper; @Override public ResultVo saveCompanyEmailConfig(List companyEmailConfigVOS) { ResultVo vo = new ResultVo(com.smppw.common.pojo.enums.status.ResultCode.SAVE_SUCCESS); vo.setData(true); StringBuffer msg = new StringBuffer(); try{ for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){ CompanyEmailConfigDO oldEmailConfigDO = companyEmailConfigMapper.selectEmailConfig(emailConfigVO.getCompanyId(),emailConfigVO.getEmail()); if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() == null){ msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(","); } if(!StringUtil.isNull(oldEmailConfigDO) && emailConfigVO.getId() != null){ if(!oldEmailConfigDO.getId().equals(emailConfigVO.getId())){ msg.append(emailConfigVO.getCompanyName()+"已存在邮箱"+emailConfigVO.getEmail()).append(","); } } } if(StringUtil.isNotEmpty(msg.toString())){ vo.setMsg(msg.toString().substring(0,msg.length()-1)); vo.setData(false); return vo; } for(CompanyEmailConfigVO emailConfigVO : companyEmailConfigVOS){ CompanyEmailConfigDO emailConfigDO = new CompanyEmailConfigDO(); emailConfigDO.setCompanyId(emailConfigVO.getCompanyId()); emailConfigDO.setCompanyName(emailConfigVO.getCompanyName()); emailConfigDO.setEmail(emailConfigVO.getEmail()); emailConfigDO.setOpenStatus(emailConfigVO.getOpenStatus()); emailConfigDO.setRemark(emailConfigVO.getSendRemark()); emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId()); emailConfigDO.setCreatorId(UserUtils.getLoginUser().getUserId()); emailConfigDO.setIsvalid(1); emailConfigDO.setUpdateTime(new Date()); if(emailConfigVO.getId() != null){ emailConfigDO.setId(emailConfigVO.getId()); companyEmailConfigMapper.updateCompanyEmailConfig(emailConfigDO); }else{ emailConfigDO.setCreateTime(new Date()); companyEmailConfigMapper.saveCompanyEmailConfig(emailConfigDO); } } }catch (Exception e){ } return vo; } @Override public void deleteCompanyEmailConfig(Integer id) { CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectById(id); if (configDO != null) { configDO.setIsvalid(0); configDO.setUpdateTime(new Date()); configDO.setUpdaterId(UserUtils.getLoginUser().getUserId()); companyEmailConfigMapper.updateById(configDO); } } @Override public void updateCompanyEmailConfig(CompanyEmailConfigVO companyEmailConfigVO) { CompanyEmailConfigDO configDO = companyEmailConfigMapper.selectCompanyEmailConfigById(companyEmailConfigVO.getId()); if(configDO != null){ configDO.setEmail(companyEmailConfigVO.getEmail()); configDO.setCompanyId(companyEmailConfigVO.getCompanyId()); configDO.setCompanyName(companyEmailConfigVO.getCompanyName()); configDO.setUpdateTime(new Date()); configDO.setUpdaterId(UserUtils.getLoginUser().getUserId()); companyEmailConfigMapper.updateCompanyEmailConfig(configDO); } } @Override public void sendCompanyEmail(List idList) { List configDOList = companyEmailConfigMapper.selectCompanyEmailConfigByIdList(idList); Map> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId())); for(String companyId : companyListMap.keySet()){ StringBuffer emails = new StringBuffer(); List configDOS = companyListMap.get(companyId); for(CompanyEmailConfigDO configDO: configDOS){ emails.append(configDO.getEmail()).append(";"); } //把缺失数据的邮件发送到该公司名下的邮箱地址 sendEmail(companyId,emails.toString()); } } @Override //邮件校验处理 public void sendEmail(String companyId, String emails) { List fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId); List emailDeletionInfoDOS = new ArrayList<>(); for (String fundId : fundIdList) { getNavDeletion(fundId,emailDeletionInfoDOS); getAssetDeletion(fundId,emailDeletionInfoDOS); } if(emailDeletionInfoDOS.size() > 0){ try { //将数据写入excel文件 File file = writeExcelFile(emailDeletionInfoDOS); file.setWritable(true); file.setReadable(true); file.setExecutable(true); MailboxInfoDTO dto = getFromEmailInfo(); // "

您好,附件为产品的数据未发送到最新,麻烦尽快发送缺失的数据。若是产品清算或者有其他原因不再发送数据,还请将产品的清算日期或者不再发送数据的原因发送给我们,非常感谢~\n

"; String htmlText = sysConfigMapper.selectConfigByKey("deletion_email_body"); String emailTitle = sysConfigMapper.selectConfigByKey("deletion_email_title"); EmailUtil.senEmail(dto,emails,List.of(file),htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle); //发送成功之后修改数据为已发送 deletionInfoMapper.updateSendStatusByFundId(fundIdList); //写入发送历史 String[] emailList = emails.split(";"); for(String email : emailList){ saveCompanyEmailSendHistory(companyId,email,1,ResultCode.SEND_SUCCESS.getMsg()); } } catch (Exception e) { String[] emailList = emails.split(";"); for(String email : emailList){ saveCompanyEmailSendHistory(companyId,email,0,e.getMessage()); } logger.error(e.getMessage(),e); } } } private void getNavDeletion(String fundId, List emailDeletionInfoDOS) { List fundEmailDeletionInfoDOList = deletionInfoMapper.selectNavDeletionInfoByFundId(fundId); if(fundEmailDeletionInfoDOList.isEmpty()){ return; } Map> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId)); FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId); if(fundReportFrequencyDO == null){ return; } for (Integer channelId : channelDeletionMap.keySet()) { List channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId); if(channelEmailDeletionInfoDOList.isEmpty()){ continue; } //根据渠道ID和基金ID去查最新的净值日期 Date priceDate = navMapper.selectMaxPriceDate(channelId,fundId); if(priceDate == null){ FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId); if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){ continue; } try{ priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd"); }catch (Exception e){ logger.error(e.getMessage(),e); } } if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getNavFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过五次就不再发送 if(deletionTaskLogInfoDOList.size() >= 5){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getNavFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过3次就不再发送 if(deletionTaskLogInfoDOList.size() >= 3){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getNavFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过1次就不再发送 if(deletionTaskLogInfoDOList.size() >= 1){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.NAV_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){ infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo()); } emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList); } } private void getAssetDeletion(String fundId, List emailDeletionInfoDOS) { List fundEmailDeletionInfoDOList = deletionInfoMapper.selectAssetDeletionInfoByFundId(fundId); if(fundEmailDeletionInfoDOList.isEmpty()){ return; } Map> channelDeletionMap = fundEmailDeletionInfoDOList.stream().collect(Collectors.groupingBy(EmailDeletionInfoDO::getChannelId)); FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId); if(fundReportFrequencyDO == null){ return; } for (Integer channelId : channelDeletionMap.keySet()) { List channelEmailDeletionInfoDOList = channelDeletionMap.get(channelId); if(channelEmailDeletionInfoDOList.isEmpty()){ continue; } //根据渠道ID和基金ID去查最新的净值日期 Date priceDate = assetMapper.selectMaxPriceDate(channelId,fundId); if(priceDate == null){ FundInfoDO fundInformationDO = fundInfoMapper.searchFundDetail(fundId); if(fundInformationDO != null && fundInformationDO.getInceptionDate() == null){ continue; } try{ priceDate = DateUtils.parse(fundInformationDO.getInceptionDate(),"yyyy-MM-dd"); }catch (Exception e){ logger.error(e.getMessage(),e); } } if(Frequency.DAY.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过五次就不再发送 if(deletionTaskLogInfoDOList.size() >= 5){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } if(Frequency.WEEK.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过3次就不再发送 if(deletionTaskLogInfoDOList.size() >= 3){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } if(Frequency.MONTH.getCode().equals(fundReportFrequencyDO.getAssetFrequency())){ List deletionTaskLogInfoDOList = deletionTaskLogInfoMapper.selectDeletionTaskLogInfoDO(fundId,channelId,fundReportFrequencyDO.getNavFrequency(),DateUtils.format(priceDate,"yyyy-MM-dd"),DeletionType.NAV_DELETION.getCode()); //最新净值不再更新,超过1次就不再发送 if(deletionTaskLogInfoDOList.size() >= 1){ continue; } DeletionTaskLogInfoDO deletionTaskLogInfoDO = new DeletionTaskLogInfoDO(); deletionTaskLogInfoDO.setChannelId(channelId); deletionTaskLogInfoDO.setFundId(fundId); deletionTaskLogInfoDO.setIsvalid(1); deletionTaskLogInfoDO.setCreateTime(new Date()); deletionTaskLogInfoDO.setUpdateTime(new Date()); deletionTaskLogInfoDO.setPriceDate(DateUtils.format(priceDate,"yyyy-MM-dd")); deletionTaskLogInfoDO.setFrequency(fundReportFrequencyDO.getNavFrequency()); deletionTaskLogInfoDO.setDeletionType(DeletionType.ASSET_DELETION.getCode()); deletionTaskLogInfoMapper.saveDeletionTaskLogInfoDO(deletionTaskLogInfoDO); } for(EmailDeletionInfoDO infoDO : channelEmailDeletionInfoDOList){ infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo()); } emailDeletionInfoDOS.addAll(channelEmailDeletionInfoDOList); } } @Override public void sendDistributeEmail(String companyId, String emails) { List fundIdList = fundInfoMapper.getFundIdByCompanyId(companyId); List emailDeletionInfoDOS = new ArrayList<>(); for (String fundId : fundIdList) { List distributeDeletionList = deletionInfoMapper.selectDistributeDeletionInfoByFundId(fundId); if(distributeDeletionList.isEmpty()){ continue; } DistributeDeletionInfoDO distributeDeletionInfoDO = deletionInfoMapper.getDistributeDeletionInfo(fundId); //查询第一次缺失日期,如果一样就不在发送,不一样才发生,同时更新最新的最小缺失日期 if(distributeDeletionInfoDO == null){ distributeDeletionInfoDO = new DistributeDeletionInfoDO(); distributeDeletionInfoDO.setFundId(fundId); distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate()); distributeDeletionInfoDO.setIsvalid(1); distributeDeletionInfoDO.setUpdateTime(new Date()); distributeDeletionInfoDO.setCreateTime(new Date()); deletionInfoMapper.saveDistributeFirstDeletion(distributeDeletionInfoDO); }else{ String deletionDate = distributeDeletionInfoDO.getDeletionDate(); if(deletionDate.equals(distributeDeletionList.get(0).getDeletionDate())){ continue; }else{ distributeDeletionInfoDO.setDeletionDate(distributeDeletionList.get(0).getDeletionDate()); deletionInfoMapper.updateDistributeDeletionInfoDO(distributeDeletionInfoDO); } } for(EmailDeletionInfoDO infoDO : distributeDeletionList){ infoDO.setDeletionType(DeletionType.getDeletionTypeByCode(Integer.valueOf(infoDO.getDeletionType())).getInfo()); } emailDeletionInfoDOS.addAll(distributeDeletionList); } if(emailDeletionInfoDOS.size() > 0){ try { //将数据写入excel文件 File file = writeExcelFile(emailDeletionInfoDOS); file.setWritable(true); file.setReadable(true); file.setExecutable(true); MailboxInfoDTO dto = getFromEmailInfo(); // "

您好,附件为产品的数据未发送到最新,麻烦尽快发送缺失的数据。若是产品清算或者有其他原因不再发送数据,还请将产品的清算日期或者不再发送数据的原因发送给我们,非常感谢~\n

"; String htmlText = sysConfigMapper.selectConfigByKey("deletion_distribute_email_body"); String emailTitle = sysConfigMapper.selectConfigByKey("deletion_distribute_email_title"); EmailUtil.senEmail(dto,emails,List.of(file),htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle); //发送成功之后修改数据为已发送 deletionInfoMapper.updateSendStatusByFundId(fundIdList); //写入发送历史 String[] emailList = emails.split(";"); for(String email : emailList){ saveCompanyEmailSendHistory(companyId,email,1,ResultCode.SEND_SUCCESS.getMsg()); } } catch (Exception e) { String[] emailList = emails.split(";"); for(String email : emailList){ saveCompanyEmailSendHistory(companyId,email,0,e.getMessage()); } logger.error(e.getMessage(),e); } } } @Override public void sendDistributeEmailById(List idList) { List configDOList = companyEmailConfigMapper.selectCompanyEmailConfigByIdList(idList); Map> companyListMap = configDOList.stream().collect(Collectors.groupingBy(e -> e.getCompanyId())); for(String companyId : companyListMap.keySet()){ StringBuffer emails = new StringBuffer(); List configDOS = companyListMap.get(companyId); for(CompanyEmailConfigDO configDO: configDOS){ emails.append(configDO.getEmail()).append(";"); } //把缺失数据的邮件发送到该公司名下的邮箱地址 sendDistributeEmail(companyId,emails.toString()); } } private void saveCompanyEmailSendHistory(String companyId, String email,Integer sendStatus,String msg) { CompanyEmailSendHistoryDO historyDO = new CompanyEmailSendHistoryDO(); historyDO.setCompanyId(companyId); historyDO.setEmail(email); historyDO.setSendStatus(sendStatus); historyDO.setSendRemark(msg); historyDO.setIsvalid(1); historyDO.setSendTime(DateUtils.getNowDate()); historyDO.setCreateTime(DateUtils.getNowDate()); historyDO.setCreateTime(DateUtils.getNowDate()); companyEmailSendHistoryMapper.saveCompanyEmailSendHistory(historyDO); } private MailboxInfoDTO getFromEmailInfo(){ MailboxInfoDTO dto = new MailboxInfoDTO(); dto.setAccount(sysConfigMapper.selectConfigByKey("sender.email")); dto.setProtocol(sysConfigMapper.selectConfigByKey("sender.protocol")); dto.setPassword(sysConfigMapper.selectConfigByKey("sender.password")); dto.setPort(sysConfigMapper.selectConfigByKey("sender.port")); dto.setHost(sysConfigMapper.selectConfigByKey("sender.host")); dto.setSsl(sysConfigMapper.selectConfigByKey("sender.ssl")); return dto; } private File writeExcelFile(List emailDeletionInfoDOS) { Map>> values = new HashMap<>(); List head = new ArrayList<>(); head.add("渠道ID"); head.add("渠道名称"); head.add("基金全称"); head.add("管理人"); head.add("缺失类型"); head.add("缺失日期"); String sheetName = "基金缺失明细"; List> dataList = new ArrayList<>(); for(EmailDeletionInfoDO dto : emailDeletionInfoDOS){ List data = new ArrayList<>(); data.add(String.valueOf(dto.getChannelId())); data.add(dto.getChannelName()); data.add(dto.getFundName()); data.add(dto.getCompanyName()); data.add(dto.getDeletionType()); data.add(dto.getDeletionDate()); dataList.add(data); } values.put(sheetName,dataList); XSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName,head,values,null); File file = new File(path+"/"+DateUtils.format(new Date(),DateUtils.YYYYMMDDHHMMSS)+"基金缺失明细.xlsx"); if(!file.exists()){ try { file.createNewFile(); } catch (IOException e) { throw new RuntimeException(e); } } try { FileOutputStream fos = new FileOutputStream(file); wb.write(fos); wb.close(); fos.close(); } catch (IOException e) { throw new RuntimeException(e); } return file; } }