Selaa lähdekoodia

feat:净值频率计算任务开发

chenjianhua 2 viikkoa sitten
vanhempi
commit
17f4a49818

+ 2 - 1
service-base/src/main/java/com/simuwang/base/common/enums/TaskType.java

@@ -13,7 +13,8 @@ public enum TaskType {
     EMAIL_PARSE(1, "邮件解析"),
     DELETION_COMPUTE(2, "缺失计算"),
     DELETION_NOTIFICATIONS(3, "缺失明细通知"),
-    NAV_AMPLITUDE(4, "净值振幅检测任务");
+    NAV_AMPLITUDE(4, "净值振幅检测任务"),
+    NAV_FREQUENCY(5, "净值频率计算任务");
 
     private final int type;
     private final String info;

+ 1 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/FundReportFrequencyMapper.java

@@ -18,4 +18,5 @@ public interface FundReportFrequencyMapper extends BaseMapper<FundReportFrequenc
     public FundReportFrequencyDO getFrequencyByFundId(@Param("fundId") String fundId);
 
     List<String> selectFundId(@Param("item")List<String> fundIdList);
+
 }

+ 2 - 0
service-base/src/main/java/com/simuwang/base/mapper/daq/NavMapper.java

@@ -36,4 +36,6 @@ public interface NavMapper {
     NavDO queryLastNavByFundIdDate(@Param("fundId")String fundId, @Param("priceDate")String priceDate,@Param("channelId")Integer channelId);
 
     List<NavDO> selectNavByChannelId(@Param("channelId")Integer channelId);
+
+    List<NavDO> selectNavByFundIdAndDate(@Param("fundId")String fundId, @Param("priceDate")String priceDate);
 }

+ 8 - 1
service-base/src/main/resources/mapper/daq/NavMapper.xml

@@ -96,7 +96,7 @@
         </if>
     </select>
     <select id="getAllFundId" resultType="java.lang.String">
-        select distinct fund_id from nav where isvalid=1
+        select fund_id from nav where isvalid=1 group by fund_id
     </select>
     <select id="selectNavByFundId" resultMap="BaseResultMap"
             parameterType="java.lang.String">
@@ -143,6 +143,13 @@
           and channel_id = #{channelId}
         order by price_date
     </select>
+    <select id="selectNavByFundIdAndDate" resultMap="BaseResultMap">
+        SELECT id, fund_id,price_date,nav,cumulative_nav,cumulative_nav_withdrawal,
+               isvalid, creatorid, createtime, updaterid, updatetime,channel_id
+        from nav
+        where isvalid = 1
+          and fund_id = #{fundId} and price_date >= #{priceDate}
+    </select>
 
 
 </mapper>

+ 26 - 1
service-manage/src/main/java/com/simuwang/manage/init/CompleteScheduleConfig.java

@@ -39,6 +39,10 @@ public class CompleteScheduleConfig implements SchedulingConfigurer {
 
     @Autowired
     private NavAmplitudeTask navAmplitudeTask;
+
+    @Autowired
+    private NavFrequencyComputeTask navFrequencyComputeTask;
+
     @Autowired
     private CompanySendTask companySendTask;
 
@@ -96,7 +100,7 @@ public class CompleteScheduleConfig implements SchedulingConfigurer {
                     return new CronTrigger(cron).nextExecutionTime(triggerContext).toInstant();
                 }
         );
-        //发送基金缺失预警
+        //计算净值振幅任务开始
         taskRegistrar.addTriggerTask(
                 //1.添加任务内容(Runnable)
                 () -> {
@@ -117,6 +121,27 @@ public class CompleteScheduleConfig implements SchedulingConfigurer {
                 }
         );
 
+        //计算净值频率任务开始
+        taskRegistrar.addTriggerTask(
+                //1.添加任务内容(Runnable)
+                () -> {
+                    try {
+                        logger.info("计算净值频率任务开始"+DateUtils.getTime());
+                        navFrequencyComputeTask.navFrequencyCompute();
+                        logger.info("计算净值频率任务结束========="+ DateUtils.getTime());
+                    } catch (Exception e) {
+                        logger.error("计算净值频率任务异常========="+e.getMessage()+ DateUtils.getTime(),e);
+                    }
+                },
+                //2.设置执行周期(Trigger)
+                triggerContext -> {
+                    String cron = sysConfigMapper.selectConfigByKey("nav_frequency_time");
+                    logger.info("计算净值频率任务定时任务轮训时间:"+cron);
+                    //2.2 返回执行周期(Date)
+                    return new CronTrigger(cron).nextExecutionTime(triggerContext).toInstant();
+                }
+        );
+
         taskRegistrar.addTriggerTask(
                 //1.添加任务内容(Runnable)
                 () -> {

+ 3 - 0
service-manage/src/main/java/com/simuwang/manage/service/FundReportFrequencyService.java

@@ -1,5 +1,6 @@
 package com.simuwang.manage.service;
 
+import com.simuwang.base.pojo.dos.FundReportFrequencyDO;
 import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
 
 /**
@@ -10,4 +11,6 @@ import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
  */
 public interface FundReportFrequencyService {
     void saveFundReportFrequency(FundReportFrequencyVO fundReportFrequency);
+
+    FundReportFrequencyDO getFundReportFrequency(String fundId);
 }

+ 5 - 0
service-manage/src/main/java/com/simuwang/manage/service/impl/FundReportFrequencyServiceImpl.java

@@ -46,4 +46,9 @@ public class FundReportFrequencyServiceImpl implements FundReportFrequencyServic
             }
         }
     }
+
+    @Override
+    public FundReportFrequencyDO getFundReportFrequency(String fundId) {
+        return fundReportFrequencyMapper.getFrequencyByFundId(fundId);
+    }
 }

+ 117 - 0
service-manage/src/main/java/com/simuwang/manage/task/NavFrequencyComputeTask.java

@@ -0,0 +1,117 @@
+package com.simuwang.manage.task;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.simuwang.base.common.conts.NavParseStatusConst;
+import com.simuwang.base.common.enums.Frequency;
+import com.simuwang.base.common.enums.TaskType;
+import com.simuwang.base.common.util.DateUtils;
+import com.simuwang.base.mapper.daq.EmailTaskInfoMapper;
+import com.simuwang.base.mapper.daq.FundReportFrequencyMapper;
+import com.simuwang.base.mapper.daq.NavMapper;
+import com.simuwang.base.pojo.dos.EmailFundNavDO;
+import com.simuwang.base.pojo.dos.EmailTaskInfoDO;
+import com.simuwang.base.pojo.dos.FundReportFrequencyDO;
+import com.simuwang.base.pojo.dos.NavDO;
+import com.simuwang.base.pojo.vo.FundReportFrequencyVO;
+import com.simuwang.manage.service.EmailFundNavService;
+import com.simuwang.manage.service.FundReportFrequencyService;
+import com.simuwang.shiro.utils.UserUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * FileName: NavFrequencyComputeTask
+ * Author:   chenjianhua
+ * Date:     2024/12/9 15:46
+ * Description: ${DESCRIPTION}
+ */
+@Component
+public class NavFrequencyComputeTask {
+    private static final Logger log = LoggerFactory.getLogger(NavFrequencyComputeTask.class);
+    @Autowired
+    private NavMapper navMapper;
+    @Autowired
+    private EmailTaskInfoMapper emailTaskInfoMapper;
+    @Autowired
+    private FundReportFrequencyMapper fundReportFrequencyMapper;
+
+    /**
+     * 取近一月(35天)净值数量判断
+     * 净值数 >= 8, 设置为“日频”
+     * 2 < 净值数 < 8, 设置为“周频”
+     * 1 <= 净值数 <= 2, 设置为“月频”
+     * 不满足上述规则,默认为空。
+     */
+    public void navFrequencyCompute(){
+        EmailTaskInfoDO emailTaskInfoDO = startEmailTask(null, 1);
+        //获取净值振幅错误的数据总量
+        List<String> fundIdList = navMapper.getAllFundId();
+        String priceDate = DateUtils.getAroundToday(-35);
+        for (String fundId : fundIdList) {
+            FundReportFrequencyDO fundReportFrequencyDO = fundReportFrequencyMapper.getFrequencyByFundId(fundId);
+            if(fundReportFrequencyDO != null){
+                continue;
+            }
+            List<NavDO> navDOList = navMapper.selectNavByFundIdAndDate(fundId,priceDate);
+            FundReportFrequencyDO fundReportFrequency = new FundReportFrequencyDO();
+            fundReportFrequency.setFundId(fundId);
+            if(navDOList.size() >= 8){
+                fundReportFrequency.setNavFrequency(Frequency.DAY.getCode());
+            }
+            if(navDOList.size() > 2 && navDOList.size() < 8){
+                fundReportFrequency.setNavFrequency(Frequency.WEEK.getCode());
+            }
+            if(navDOList.size() >= 1 && navDOList.size() <= 2){
+                fundReportFrequency.setNavFrequency(Frequency.MONTH.getCode());
+            }
+            if(fundReportFrequency.getNavFrequency() != null){
+                fundReportFrequencyMapper.insert(fundReportFrequency);
+            }
+        }
+        endEmailTask(emailTaskInfoDO.getId(),2);
+    }
+
+    private EmailTaskInfoDO startEmailTask(String email,Integer taskStatus) {
+        EmailTaskInfoDO  emailTaskInfoDO = new EmailTaskInfoDO();
+        try{
+            emailTaskInfoDO.setTaskName(TaskType.NAV_FREQUENCY.getInfo());
+            emailTaskInfoDO.setTaskType(TaskType.NAV_FREQUENCY.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 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());
+        }
+    }
+}