Przeglądaj źródła

feat: 导入公司对接数据开发

chenjianhua 1 miesiąc temu
rodzic
commit
bb8a9902f4

+ 46 - 0
service-base/src/main/java/com/simuwang/base/common/enums/YesOrNoType.java

@@ -0,0 +1,46 @@
+package com.simuwang.base.common.enums;
+
+import java.util.stream.Stream;
+
+/**
+ * FileName: DistributeType
+ * Author:   chenjianhua
+ * Date:     2024/9/16 13:30
+ * Description: ${DESCRIPTION}
+ */
+public enum YesOrNoType {
+    //单位分红/拆分比例
+    YES(1, "是"), NO(2, "否");
+
+    private final Integer code;
+    private final String info;
+
+    YesOrNoType(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+
+    public static YesOrNoType getYesOrNoTypeByCode(Integer code) {
+        if (null == code){
+            return null;
+        }
+        for(YesOrNoType s : YesOrNoType.values()){
+            if(code.equals(s.getCode())){
+                return s;
+            }
+        }
+        return null;
+    }
+
+    public static YesOrNoType getYesOrNoTypeByInfo(String info) {
+        return Stream.of(YesOrNoType.values()).filter(e -> e.info.equals(info)).findFirst().orElse(null);
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public String getInfo() {
+        return info;
+    }
+}

+ 11 - 9
service-base/src/main/java/com/simuwang/base/common/util/EmailUtil.java

@@ -302,7 +302,7 @@ public class EmailUtil {
         return props;
     }
 
-    public static void senEmail(MailboxInfoDTO mailboxInfoDTO, String emails, File file,String htmlText,String host,String emailTitle) throws Exception {
+    public static void senEmail(MailboxInfoDTO mailboxInfoDTO, String emails, List<File> fileList,String htmlText,String host,String emailTitle) throws Exception {
         logger.info("send email begin .........");
         // 根据Session 构建邮件信息
         MimeMessage message = new MimeMessage(getSession(mailboxInfoDTO));
@@ -328,14 +328,16 @@ public class EmailUtil {
         // 邮件内容
         bodyPart.setContent(htmlText, "text/html;charset=utf-8");
         //设置附件
-        BodyPart filePart = new MimeBodyPart();
-        filePart.setFileName(file.getName());
-        filePart.setDataHandler(
-                new DataHandler(
-                        new ByteArrayDataSource(
-                                Files.readAllBytes(Paths.get(file.getAbsolutePath())), "application/octet-stream")));
+        for (File file : fileList) {
+            BodyPart filePart = new MimeBodyPart();
+            filePart.setFileName(file.getName());
+            filePart.setDataHandler(
+                    new DataHandler(
+                            new ByteArrayDataSource(
+                                    Files.readAllBytes(Paths.get(file.getAbsolutePath())), "application/octet-stream")));
+            mimeMultiPart.addBodyPart(filePart);
+        }
         mimeMultiPart.addBodyPart(bodyPart);
-        mimeMultiPart.addBodyPart(filePart);
         message.setContent(mimeMultiPart);
         message.setSentDate(new Date());
         // 保存邮件
@@ -349,7 +351,7 @@ public class EmailUtil {
             properties.put("mail.smtp.host", mailboxInfoDTO.getHost());
             properties.put("mail.smtp.auth", true);
             properties.setProperty("mail.smtp.port", mailboxInfoDTO.getPort());
-            properties.put("mail.smtp.ssl.enable", false);
+            properties.put("mail.smtp.ssl.enable", true);
             properties.put("mail.smtp.ssl.required", false);
             // 根据邮件的会话属性构造一个发送邮件的Session,
             JakartaUserPassAuthenticator authenticator = new JakartaUserPassAuthenticator(mailboxInfoDTO.getAccount(), mailboxInfoDTO.getPassword());

+ 5 - 3
service-base/src/main/java/com/simuwang/base/mapper/daq/DeletionInfoMapper.java

@@ -41,15 +41,13 @@ public interface DeletionInfoMapper {
 
     void saveDeletionInfoDO(DeletionInfoDO deletionInfoDO);
 
-    void removeDistributeDeletion(@Param("fundId")String fundId);
-
     List<EmailDeletionInfoDO> selectDeletionInfoByFundId(@Param("fundIdList")List<String> fundIdList);
 
     void updateSendStatusByFundId(@Param("fundIdList")List<String> fundIdList);
 
     void deleteDeletionRemark(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType, @Param("list")List<String> tradeDate);
 
-    void deleteDeletion(@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
+    void deleteDeletion(@Param("channelId") Integer channelId,@Param("fundId")String fundId, @Param("deletionType")Integer deletionType);
 
     void updateDeletionInfoDO(DeletionInfoDO oldDeletionDO);
 
@@ -58,4 +56,8 @@ public interface DeletionInfoMapper {
     void batchSaveDeletionInfoDO(@Param("itemDoList")List<DeletionInfoDO> insertDeletionInfoDO);
 
     void batchUpdateRemark(@Param("itemDoList")List<DeletionInfoDO> batchUpdateDeletionInfoDO);
+
+    int countFundDeletion(@Param("fundId")String fundId);
+
+    List<EmailDeletionInfoDO> selectDeletionDetailByFundId(@Param("fundId")String fundId,@Param("updateTime")String updateTime);
 }

+ 5 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/FundInfoMapper.java

@@ -1,6 +1,7 @@
 package com.simuwang.base.mapper.daq;
 
 import com.simuwang.base.pojo.dos.FundAndCompanyInfoDO;
+import com.simuwang.base.pojo.dos.FundDeletionBaseInfoDO;
 import com.simuwang.base.pojo.dos.FundInfoDO;
 import com.simuwang.base.pojo.dos.FundInformationDO;
 import com.simuwang.base.pojo.dto.query.FundInfoPageQuery;
@@ -53,4 +54,8 @@ public interface FundInfoMapper {
     Long countFundTotal();
 
     String getCompanyIdByFundId(@Param("fundId")String fundId);
+
+    List<String> getHasFrequencyFundId();
+
+    List<FundDeletionBaseInfoDO> getHasFrequencyFundInfo();
 }

+ 4 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/EmailDeletionInfoDO.java

@@ -14,6 +14,10 @@ import java.util.Date;
 @Data
 public class EmailDeletionInfoDO {
     /**
+     * 基金ID
+     */
+    private String fundId;
+    /**
      * 基金名称
      */
     private String fundName;

+ 21 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/FundDeletionBaseInfoDO.java

@@ -0,0 +1,21 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+@Data
+public class FundDeletionBaseInfoDO {
+
+    private String fundId;
+
+    private String fundName;
+
+    private String companyName;
+
+    private String isDeletion;
+
+    private String navFrequency;
+
+    private String assetFrequency;
+
+    private String valuationFrequency;
+}

+ 21 - 0
service-base/src/main/java/com/simuwang/base/pojo/dos/FundDeletionDetailDO.java

@@ -0,0 +1,21 @@
+package com.simuwang.base.pojo.dos;
+
+import lombok.Data;
+
+@Data
+public class FundDeletionDetailDO {
+
+    private String fundId;
+
+    private String fundName;
+
+    private String companyName;
+
+    private String deletionType;
+
+    private String deletionDate;
+
+    private Integer channelId;
+
+    private String channelName;
+}

+ 18 - 7
service-base/src/main/resources/mapper/daq/DeletionInfoMapper.xml

@@ -71,7 +71,7 @@
         </foreach>
     </delete>
     <delete id="deleteDeletion">
-        update deletion_info  set isvalid=0,updatetime=now() where isvalid=1 and fund_id=#{fundId} and deletion_type=#{deletionType} and remark is null
+        update deletion_info  set isvalid=0,updatetime=now() where isvalid=1 and fund_id=#{fundId} and channel_id=#{channelId} and deletion_type=#{deletionType} and remark is null
     </delete>
     <select id="searchDeletionList" resultMap="BaseResultMap"
             parameterType="com.simuwang.base.pojo.dto.query.DeletionPageQuery">
@@ -151,7 +151,7 @@
     </select>
     <select id="countDeletion" resultType="java.lang.Long"
             parameterType="com.simuwang.base.pojo.dto.query.DeletionPageQuery">
-        select count(1) from (select
+        select count(1) from
         (select de.channel_id,de.fund_id,de.deletion_type,max(de.deletion_date) as last_deletion_date from deletion_info de where de.isvalid=1
         group by de.fund_id,de.deletion_type,de.channel_id) d
         LEFT JOIN pvn_fund_info info
@@ -204,7 +204,7 @@
         </if>
         <if test="deletionEndNum != null and deletionEndNum != ''">
             and ddn.deletion_num <![CDATA[ <= ]]> #{deletionEndNum}
-        </if>) a
+        </if>
     </select>
     <select id="getLastDeletionDateByFundId" resultType="java.lang.String">
         select max(deletion_date) from deletion_info where fund_id=#{fundId} and deletion_type=#{deletionType}
@@ -283,6 +283,7 @@
     </select>
 
     <resultMap id="BaseEmailMap" type="com.simuwang.base.pojo.dos.EmailDeletionInfoDO">
+        <result column="fund_id" property="fundId"/>
         <result column="fund_name" property="fundName"/>
         <result column="company_name" property="companyName"/>
         <result column="deletion_date" property="deletionDate"/>
@@ -291,7 +292,7 @@
         <result column="channel_name" property="channelName"/>
     </resultMap>
     <select id="selectDeletionInfoByFundId" resultMap="BaseEmailMap">
-            select info.fund_name,c.company_name,d.deletion_type,d.deletion_date,ci.channel_id,ci.channel_name
+            select info.fund_id,info.fund_name,c.company_name,d.deletion_type,d.deletion_date,ci.id as channel_id,ci.channel_name
             from deletion_info d
             join pvn_fund_info info on d.fund_id=info.fund_id
             join pvn_company_info c on c.company_id=info.trust_id
@@ -303,9 +304,19 @@
             </foreach>
             order by info.fund_id desc,d.deletion_type desc,d.deletion_date desc
     </select>
-    <update id="removeDistributeDeletion" parameterType="java.lang.String">
-        update deletion_info set isvalid=0,updatetime=now() where fund_id=#{fundId} and remark is null
-    </update>
+    <select id="countFundDeletion" resultType="java.lang.Integer">
+        select count(1) from deletion_info where isvalid=1 and fund_id =#{fundId} and remark is null
+    </select>
+    <select id="selectDeletionDetailByFundId" resultType="com.simuwang.base.pojo.dos.EmailDeletionInfoDO">
+        select info.fund_id,info.fund_name,c.company_name,d.deletion_type,d.deletion_date,ci.id as channel_id,ci.channel_name
+        from deletion_info d
+        join pvn_fund_info info on d.fund_id=info.fund_id
+        join pvn_company_info c on c.company_id=info.trust_id
+        left join channel_info ci on ci.id=d.channel_id and ci.isvalid=1
+        where d.isvalid=1 and info.isvalid=1 and c.isvalid=1 and d.remark is null and d.is_send=0
+        and d.fund_id = #{fundId} and d.createtime >= #{updateTime}
+        order by info.fund_id desc,d.deletion_type desc,d.deletion_date desc
+    </select>
     <update id="updateSendStatusByFundId">
         update deletion_info d set d.is_send=1,d.updatetime=now() where d.isvalid=1
         and d.fund_id in

+ 23 - 0
service-base/src/main/resources/mapper/daq/FundInfoMapper.xml

@@ -248,4 +248,27 @@
                                        join pvn_fund_info info on info.trust_id=c.company_id
         where info.fund_id=#{fundId} and info.isvalid=1 and c.isvalid=1
     </select>
+    <select id="getHasFrequencyFundId" resultType="java.lang.String">
+        select info.fund_id from pvn_fund_info info
+        join fund_report_frequency ff
+        on info.fund_id = ff.fund_id
+        where info.isvalid=1 and ff.isvalid=1
+    </select>
+    <resultMap id="FundDeletionResultMap" type="com.simuwang.base.pojo.dos.FundDeletionBaseInfoDO">
+        <id column="company_name" property="companyName"/>
+        <result column="fund_id" property="fundId"/>
+        <result column="fund_name" property="fundName"/>
+        <result column="nav_frequency" property="navFrequency"/>
+        <result column="asset_frequency" property="assetFrequency"/>
+        <result column="valuation_frequency" property="valuationFrequency"/>
+    </resultMap>
+    <select id="getHasFrequencyFundInfo" resultMap="FundDeletionResultMap">
+        select info.fund_id,info.fund_name,c.company_name,ff.nav_frequency,ff.asset_frequency,ff.valuation_frequency
+        from pvn_fund_info info
+        join fund_report_frequency ff
+        on info.fund_id = ff.fund_id
+        left join pvn_company_info c
+        on c.company_id = info.trust_id and c.isvalid=1
+        where info.isvalid=1 and ff.isvalid=1
+    </select>
 </mapper>

+ 27 - 4
service-manage/src/main/java/com/simuwang/manage/init/CompleteScheduleConfig.java

@@ -2,10 +2,7 @@ package com.simuwang.manage.init;
 
 import com.simuwang.base.common.util.DateUtils;
 import com.simuwang.base.mapper.daq.system.SysConfigMapper;
-import com.simuwang.manage.task.CompanySendTask;
-import com.simuwang.manage.task.FundDeletionTask;
-import com.simuwang.manage.task.NavAmplitudeTask;
-import com.simuwang.manage.task.SendCompanyEmailTask;
+import com.simuwang.manage.task.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -43,6 +40,9 @@ public class CompleteScheduleConfig implements SchedulingConfigurer {
     private NavAmplitudeTask navAmplitudeTask;
     @Autowired
     private CompanySendTask companySendTask;
+
+    @Autowired
+    private SendDeletionEmailTask sendDeletionEmailTask;
     /**
      * 执行定时任务.
      */
@@ -135,6 +135,29 @@ public class CompleteScheduleConfig implements SchedulingConfigurer {
                     return new CronTrigger(cron).nextExecutionTime(triggerContext).toInstant();
                 }
         );
+
+        taskRegistrar.addTriggerTask(
+                //1.添加任务内容(Runnable)
+                () -> {
+                    try {
+                        logger.info("计算排排缺失数据邮箱发送任务开始"+DateUtils.getTime());
+                        sendDeletionEmailTask.sendDeletionEmail();
+                        logger.info("计算排排缺失数据邮箱发送任务结束========="+ DateUtils.getTime());
+                    } catch (Exception e) {
+                        logger.error("计算排排缺失数据邮箱发送任务任务异常========="+e.getMessage()+ DateUtils.getTime(),e);
+                    }
+                },
+                //2.设置执行周期(Trigger)
+                triggerContext -> {
+                    String cron = sysConfigMapper.selectConfigByKey("ppw_send_task_time");
+                    if(cron == null){
+                        cron = "0 0/5 8-22 * * ?";
+                    }
+                    logger.info("计算排排缺失数据邮箱发送任务定时任务轮训时间:"+cron);
+                    //2.2 返回执行周期(Date)
+                    return new CronTrigger(cron).nextExecutionTime(triggerContext).toInstant();
+                }
+        );
     }
 
 }

+ 8 - 1
service-manage/src/main/java/com/simuwang/manage/service/DeletionService.java

@@ -2,6 +2,9 @@ package com.simuwang.manage.service;
 
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dos.ContactInformationDO;
+import com.simuwang.base.pojo.dos.EmailDeletionInfoDO;
+import com.simuwang.base.pojo.dos.FundDeletionDetailDO;
+import com.simuwang.base.pojo.dos.MailboxInfoDO;
 import com.simuwang.base.pojo.dto.DeletionDownParam;
 import com.simuwang.base.pojo.dto.ExcelDeletionInfoDTO;
 import com.simuwang.base.pojo.dto.query.DeletionPageQuery;
@@ -30,5 +33,9 @@ public interface DeletionService {
 
     List<ExcelDeletionInfoDTO> selectFundDeletionInfoVOList(FundDeletionListVO fundDeletionListVO);
 
-    void computeDeletion(List<ContactInformationDO> contactInformationDOList);
+    void computeDeletion(List<MailboxInfoDO> mailboxInfoDOList);
+
+    int countFundDeletion(String fundId);
+
+    List<EmailDeletionInfoDO> selectDeletionInfoByFundId(String fundId,String updateTime);
 }

+ 1 - 4
service-manage/src/main/java/com/simuwang/manage/service/impl/CompanyEmailConfigServiceImpl.java

@@ -12,14 +12,11 @@ import com.simuwang.base.mapper.daq.system.SysConfigMapper;
 import com.simuwang.base.pojo.dos.CompanyEmailConfigDO;
 import com.simuwang.base.pojo.dos.CompanyEmailSendHistoryDO;
 import com.simuwang.base.pojo.dos.EmailDeletionInfoDO;
-import com.simuwang.base.pojo.dos.ImageInfoDO;
 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.commons.io.FileUtils;
-import org.apache.ibatis.annotations.Mapper;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -165,7 +162,7 @@ public class CompanyEmailConfigServiceImpl implements CompanyEmailConfigService
             // "<p>您好,附件为产品的数据未发送到最新,麻烦尽快发送缺失的数据。若是产品清算或者有其他原因不再发送数据,还请将产品的清算日期或者不再发送数据的原因发送给我们,非常感谢~\n</p>";
             String htmlText = sysConfigMapper.selectConfigByKey("deletion_email_body");
             String emailTitle = sysConfigMapper.selectConfigByKey("deletion_email_title");
-            EmailUtil.senEmail(dto,emails,file,htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
+            EmailUtil.senEmail(dto,emails,List.of(file),htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
             //发送成功之后修改数据为已发送
             deletionInfoMapper.updateSendStatusByFundId(fundIdList);
             //写入发送历史

+ 20 - 9
service-manage/src/main/java/com/simuwang/manage/service/impl/DeletionServiceImpl.java

@@ -127,22 +127,22 @@ public class DeletionServiceImpl implements DeletionService {
     }
 
     @Override
-    public void computeDeletion(List<ContactInformationDO> contactInformationDOList) {
+    public void computeDeletion(List<MailboxInfoDO> mailboxInfoDOList) {
         Map<Integer,List<String>> channelEmailMap = new HashMap<>();
         //按渠道分组
-        for (ContactInformationDO contactInformationDO : contactInformationDOList) {
+        for (MailboxInfoDO mailboxInfoDO : mailboxInfoDOList) {
             try{
-                String email = contactInformationDO.getContactEmail();
+                String email = mailboxInfoDO.getEmail();
                 Integer channelId = channelEmailMapper.selectChannelIdByEmail(email);
                 if(channelId == null){
                     continue;
                 }
                 if(!channelEmailMap.containsKey(channelId)){
-                    List<String> channelEmailList = channelEmailMap.get(channelId);
+                    List<String> channelEmailList = new ArrayList<>();
                     channelEmailList.add(email);
                     channelEmailMap.put(channelId,channelEmailList);
                 }else{
-                    List<String> channelEmailList = new ArrayList<>();
+                    List<String> channelEmailList = channelEmailMap.get(channelId);
                     channelEmailList.add(email);
                     channelEmailMap.put(channelId,channelEmailList);
                 }
@@ -181,12 +181,23 @@ public class DeletionServiceImpl implements DeletionService {
         }
     }
 
+    @Override
+    public int countFundDeletion(String fundId) {
+        return deletionInfoMapper.countFundDeletion(fundId);
+    }
+
+    @Override
+    public List<EmailDeletionInfoDO> selectDeletionInfoByFundId(String fundId,String updateTime) {
+        //只查询每日新增的缺失数据
+        return deletionInfoMapper.selectDeletionDetailByFundId(fundId,updateTime);
+    }
+
     private void distributionDeletion(Integer channelId,String fundId, List<NavDO> navDOList) {
         if(navDOList.size() < 1){
             return;
         }
         //将现有数据无效掉
-        deletionInfoMapper.deleteDeletion(fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(channelId,fundId,DeletionType.DISTRIBUTION_DELETION.getCode());
         //查询是否存在拆分
         List<DistributionDO> distributionDOS = distributionMapper.getDistributionByFundId(channelId,fundId, DistributeType.DIVIDENDS_SPLIT.getCode());
         if(distributionDOS.size() > 0){
@@ -230,7 +241,7 @@ public class DeletionServiceImpl implements DeletionService {
 
     private void assetDeletion(Integer channelId,String fundId, List<AssetDO> assetDOList, List<TradeDateDO> tradeDateDOList, FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
-        deletionInfoMapper.deleteDeletion(fundId,DeletionType.ASSET_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(channelId,fundId,DeletionType.ASSET_DELETION.getCode());
         List<String> tradeDateList = new ArrayList<>();
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getAssetFrequency())){
             Map<String,List<AssetDO>> navListMap = assetDOList.stream().collect(Collectors.groupingBy(e -> DateUtils.format(e.getPriceDate(),DateUtils.YYYY_MM_DD)));
@@ -412,7 +423,7 @@ public class DeletionServiceImpl implements DeletionService {
 
     private void navDeletion(Integer channelId,String fundId,List<NavDO> navDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
-        deletionInfoMapper.deleteDeletion(fundId,DeletionType.NAV_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(channelId,fundId,DeletionType.NAV_DELETION.getCode());
         List<String> tradeDateList = new ArrayList<>();
         //只处理日月季频率
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getNavFrequency())){
@@ -594,7 +605,7 @@ public class DeletionServiceImpl implements DeletionService {
 
     private void valuationDeletion(Integer channelId,String fundId,List<FundPositionDetailDO> fundPositionDetailDOList, List<TradeDateDO> tradeDateDOList,FundReportFrequencyDO fundReportFrequencyDO) {
         //将现有数据无效掉
-        deletionInfoMapper.deleteDeletion(fundId,DeletionType.VALUATION_DELETION.getCode());
+        deletionInfoMapper.deleteDeletion(channelId,fundId,DeletionType.VALUATION_DELETION.getCode());
         List<String> tradeDateList = new ArrayList<>();
         //只处理日月季频率
         if(Frequency.DAY == Frequency.getFrequencyByCode(fundReportFrequencyDO.getValuationFrequency())){

+ 1 - 3
service-manage/src/main/java/com/simuwang/manage/service/impl/ImageSeviceImpl.java

@@ -30,9 +30,7 @@ public class ImageSeviceImpl implements ImageSevice {
     @Override
     public ResultVo saveImage(MultipartFile file) {
         if(!path.endsWith("/")){
-            path +="/image/";
-        }else{
-            path +="image/";
+            path +="/";
         }
         ResultVo vo = new ResultVo(com.smppw.common.pojo.enums.status.ResultCode.SAVE_SUCCESS.getCode());
         ImageInfoDO imageInfoDO = new ImageInfoDO();

+ 6 - 4
service-manage/src/main/java/com/simuwang/manage/task/FundDeletionTask.java

@@ -6,6 +6,7 @@ import com.simuwang.base.mapper.daq.*;
 import com.simuwang.base.pojo.dos.*;
 import com.simuwang.base.pojo.dto.DeletionDownParam;
 import com.simuwang.manage.service.DeletionService;
+import com.simuwang.manage.service.EmailConfigService;
 import com.simuwang.shiro.utils.UserUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -24,8 +25,9 @@ import java.util.*;
 @Component
 public class FundDeletionTask {
     private static final Logger log = LoggerFactory.getLogger(FundDeletionTask.class);
+
     @Autowired
-    private ContactInformationMapper contactInformationMapper;
+    private EmailConfigService emailConfigService;
     @Autowired
     private DeletionService deletionService;
     @Autowired
@@ -33,10 +35,10 @@ public class FundDeletionTask {
 //    @Scheduled(cron = "0 0 5,12,19 * * ?")
     public void computeDeletion(){
         EmailTaskInfoDO emailTaskInfoDO = startEmailTask(null, 1);
-        List<ContactInformationDO> contactInformationDOList = contactInformationMapper.getAllRecords();
+        List<MailboxInfoDO> mailboxInfoOS = emailConfigService.getAll();
         try{
-            if(!contactInformationDOList.isEmpty()){
-                deletionService.computeDeletion(contactInformationDOList);
+            if(!mailboxInfoOS.isEmpty()){
+                deletionService.computeDeletion(mailboxInfoOS);
             }
         }catch (Exception e){
             log.error(e.getMessage(),e);

+ 249 - 0
service-manage/src/main/java/com/simuwang/manage/task/SendDeletionEmailTask.java

@@ -0,0 +1,249 @@
+package com.simuwang.manage.task;
+
+import com.simuwang.base.common.enums.DeletionType;
+import com.simuwang.base.common.enums.Frequency;
+import com.simuwang.base.common.enums.TaskType;
+import com.simuwang.base.common.enums.YesOrNoType;
+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.ContactInformationMapper;
+import com.simuwang.base.mapper.daq.EmailTaskInfoMapper;
+import com.simuwang.base.mapper.daq.FundInfoMapper;
+import com.simuwang.base.mapper.daq.system.SysConfigMapper;
+import com.simuwang.base.pojo.dos.*;
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import com.simuwang.manage.service.DeletionService;
+import com.simuwang.shiro.utils.UserUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+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.Component;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.*;
+
+/**
+ * FileName: FundDeletionTask
+ * Author:   chenjianhua
+ * Date:     2024/9/18 22:43
+ * Description: ${DESCRIPTION}
+ */
+//@EnableScheduling
+@Component
+public class SendDeletionEmailTask {
+    private static final Logger log = LoggerFactory.getLogger(SendDeletionEmailTask.class);
+    @Autowired
+    private FundInfoMapper fundInfoMapper;
+    @Autowired
+    private DeletionService deletionService;
+    @Autowired
+    private EmailTaskInfoMapper emailTaskInfoMapper;
+
+    @Autowired
+    private SysConfigMapper sysConfigMapper;
+
+    @Value("${email.file.path}")
+    private String path;
+
+    public void sendDeletionEmail(){
+        EmailTaskInfoDO emailTaskInfoDO = startEmailTask(null, 1);
+        try{
+            String preDay = DateUtils.getAroundToday(-1) ;
+            //获取有设置净值频率的基金ID
+            List<FundDeletionBaseInfoDO> fundDeletionBaseInfoDOList = fundInfoMapper.getHasFrequencyFundInfo();
+            Map<FundDeletionBaseInfoDO,List<EmailDeletionInfoDO>> fundDeletionBaseInfoDOListMap = new HashMap<>();
+            for (FundDeletionBaseInfoDO fundDeletionBaseInfoDO : fundDeletionBaseInfoDOList) {
+               try{
+                   String fundId = fundDeletionBaseInfoDO.getFundId();
+                   int existsDeletion = deletionService.countFundDeletion(fundId);
+                   if(existsDeletion == 0){
+                       fundDeletionBaseInfoDO.setIsDeletion(YesOrNoType.NO.getInfo());
+                   }else{
+                       fundDeletionBaseInfoDO.setIsDeletion(YesOrNoType.YES.getInfo());
+                   }
+                   List<EmailDeletionInfoDO> fundDeletionDetailDOList = deletionService.selectDeletionInfoByFundId(fundId,preDay);
+                   if(fundDeletionDetailDOList.isEmpty()){
+                       continue;
+                   }
+                   fundDeletionBaseInfoDOListMap.put(fundDeletionBaseInfoDO,fundDeletionDetailDOList);
+               }catch (Exception e){
+                   log.error(e.getMessage(),e);
+               }
+            }
+            if(fundDeletionBaseInfoDOList.isEmpty()){
+                return;
+            }
+            List<File> fileList = new ArrayList<>();
+            File fundBaseInfoFile = writeExcelFile(fundDeletionBaseInfoDOList);
+            fundBaseInfoFile.setWritable(true);
+            fundBaseInfoFile.setReadable(true);
+            fundBaseInfoFile.setExecutable(true);
+            File fundDeletionFile = writeFundDeletionFile(fundDeletionBaseInfoDOListMap);
+            fundDeletionFile.setWritable(true);
+            fundDeletionFile.setReadable(true);
+            fundDeletionFile.setExecutable(true);
+            MailboxInfoDTO dto = getFromEmailInfo();
+            String htmlText = sysConfigMapper.selectConfigByKey("deletion_email_body");
+            String emailTitle = sysConfigMapper.selectConfigByKey("deletion_email_title");
+            String emails = sysConfigMapper.selectConfigByKey("ppw_email");
+            if(StringUtil.isEmpty(emails)){
+                return;
+            }
+            if(!fundDeletionBaseInfoDOListMap.keySet().isEmpty()){
+                fileList.add(fundDeletionFile);
+            }
+            fileList.add(fundBaseInfoFile);
+            EmailUtil.senEmail(dto,emails,fileList,htmlText,sysConfigMapper.selectConfigByKey("email.host")==null?"":sysConfigMapper.selectConfigByKey("email.host"),emailTitle);
+
+        }catch (Exception e){
+            log.error(e.getMessage(),e);
+            endEmailTask(emailTaskInfoDO.getId(),-1);
+            return;
+        }
+        endEmailTask(emailTaskInfoDO.getId(),2);
+    }
+
+    private File writeFundDeletionFile(Map<FundDeletionBaseInfoDO,List<EmailDeletionInfoDO>> fundDeletionBaseInfoDOListMap) {
+        Map<String,List<List<String>>> values = new HashMap<>();
+        List<String> head = new ArrayList<>();
+        head.add("基金ID");
+        head.add("基金名称");
+        head.add("管理人");
+        head.add("净值频率");
+        head.add("规模频率");
+        head.add("估值评率");
+        head.add("缺失类型");
+        head.add("缺失日期");
+        head.add("渠道ID");
+        head.add("渠道名称");
+        String sheetName = "缺失明细";
+        List<List<String>> dataList = new ArrayList<>();
+        for(FundDeletionBaseInfoDO key : fundDeletionBaseInfoDOListMap.keySet()){
+            List<EmailDeletionInfoDO> emailDeletionInfoDOList = fundDeletionBaseInfoDOListMap.get(key);
+            for (EmailDeletionInfoDO emailDeletionInfoDO : emailDeletionInfoDOList) {
+                List<String> data = new ArrayList<>();
+                data.add(emailDeletionInfoDO.getFundId());
+                data.add(emailDeletionInfoDO.getFundName());
+                data.add(emailDeletionInfoDO.getCompanyName());
+                data.add(Frequency.getFrequencyByCode(Integer.parseInt(key.getNavFrequency())).getInfo());
+                data.add(Frequency.getFrequencyByCode(Integer.parseInt(key.getAssetFrequency())).getInfo());
+                data.add(Frequency.getFrequencyByCode(Integer.parseInt(key.getValuationFrequency())).getInfo());
+                data.add(DeletionType.getDeletionTypeByCode(Integer.parseInt(emailDeletionInfoDO.getDeletionType())).getInfo());
+                data.add(emailDeletionInfoDO.getDeletionDate());
+                data.add(String.valueOf(emailDeletionInfoDO.getChannelId()));
+                data.add(emailDeletionInfoDO.getChannelName());
+                dataList.add(data);
+            }
+        }
+        values.put(sheetName,dataList);
+        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName,head,values,null);
+        File file = new File(path+"/"+DateUtils.format(new Date(),DateUtils.YYYYMMDDHHMMSS)+"缺失明细.xls");
+        if(!file.exists()){
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        try {
+            wb.write(file);
+            wb.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return file;
+    }
+
+    private void endEmailTask(Integer id, Integer taskStatus) {
+        try{
+            EmailTaskInfoDO emailTaskInfoDO = new EmailTaskInfoDO();
+            emailTaskInfoDO.setId(id);
+            emailTaskInfoDO.setTaskStatus(taskStatus);
+            emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setEndTime(DateUtils.getNowDate());
+            emailTaskInfoMapper.updateTaskStatusById(emailTaskInfoDO);
+        }catch (Exception e){
+            log.error(e.getMessage());
+        }
+    }
+    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"));
+        return dto;
+    }
+    private EmailTaskInfoDO startEmailTask(String email,Integer taskStatus) {
+        EmailTaskInfoDO  emailTaskInfoDO = new EmailTaskInfoDO();
+        try{
+            emailTaskInfoDO.setTaskName(TaskType.DELETION_COMPUTE.getInfo());
+            emailTaskInfoDO.setTaskType(TaskType.DELETION_COMPUTE.getType());
+            emailTaskInfoDO.setTaskStatus(taskStatus);
+            emailTaskInfoDO.setStartTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setIsvalid(1);
+            emailTaskInfoDO.setEmail(email);
+            emailTaskInfoDO.setCreateTime(DateUtils.getNowDate());
+            emailTaskInfoDO.setUpdateTime(DateUtils.getNowDate());
+            try{
+                emailTaskInfoDO.setCreatorId(UserUtils.getLoginUser().getUserId());
+                emailTaskInfoDO.setUpdaterId(UserUtils.getLoginUser().getUserId());
+            }catch (Exception e){
+                emailTaskInfoDO.setCreatorId(1);
+                emailTaskInfoDO.setUpdaterId(1);
+            }
+            emailTaskInfoMapper.insert(emailTaskInfoDO);
+        }catch (Exception e){
+            log.error(e.getMessage());
+        }
+        return emailTaskInfoDO;
+    }
+
+    private File writeExcelFile(List<FundDeletionBaseInfoDO> emailDeletionInfoDOS) {
+        Map<String,List<List<String>>> values = new HashMap<>();
+        List<String> head = new ArrayList<>();
+        head.add("基金ID");
+        head.add("基金名称");
+        head.add("管理人");
+        head.add("净值频率");
+        head.add("规模频率");
+        head.add("估值评率");
+        head.add("是否缺失");
+        String sheetName = "缺失产品清单";
+        List<List<String>> dataList = new ArrayList<>();
+        for(FundDeletionBaseInfoDO dto : emailDeletionInfoDOS){
+            List<String> data = new ArrayList<>();
+            data.add(dto.getFundId());
+            data.add(dto.getFundName());
+            data.add(dto.getCompanyName());
+            data.add(Frequency.getFrequencyByCode(Integer.parseInt(dto.getNavFrequency())).getInfo());
+            data.add(Frequency.getFrequencyByCode(Integer.parseInt(dto.getAssetFrequency())).getInfo());
+            data.add(Frequency.getFrequencyByCode(Integer.parseInt(dto.getValuationFrequency())).getInfo());
+            data.add(dto.getIsDeletion());
+            dataList.add(data);
+        }
+        values.put(sheetName,dataList);
+        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName,head,values,null);
+        File file = new File(path+"/"+DateUtils.format(new Date(),DateUtils.YYYYMMDDHHMMSS)+"缺失产品清单.xls");
+        if(!file.exists()){
+            try {
+                file.createNewFile();
+            } catch (IOException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        try {
+            wb.write(file);
+            wb.close();
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+        return file;
+    }
+}