|
@@ -1,6 +1,7 @@
|
|
package com.simuwang.manage.task;
|
|
package com.simuwang.manage.task;
|
|
|
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
|
+import cn.hutool.core.collection.ListUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.date.DateUtil;
|
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
|
import cn.hutool.core.exceptions.ExceptionUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
import cn.hutool.core.util.StrUtil;
|
|
@@ -21,7 +22,9 @@ import com.simuwang.manage.service.competition.FundNavService;
|
|
import com.simuwang.task.CompetitionIndicatorCalcTask;
|
|
import com.simuwang.task.CompetitionIndicatorCalcTask;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.Logger;
|
|
import org.slf4j.LoggerFactory;
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
+import org.springframework.beans.factory.annotation.Qualifier;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
import org.springframework.scheduling.annotation.Scheduled;
|
|
|
|
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
|
|
import org.springframework.stereotype.Component;
|
|
import org.springframework.stereotype.Component;
|
|
|
|
|
|
import java.io.File;
|
|
import java.io.File;
|
|
@@ -42,10 +45,12 @@ public class CompetitionTask {
|
|
private final RcCompetitionCalcDateMapper competitionCalcDateMapper;
|
|
private final RcCompetitionCalcDateMapper competitionCalcDateMapper;
|
|
private final FundDeletionTask fundDeletionTask;
|
|
private final FundDeletionTask fundDeletionTask;
|
|
private final CompetitionIndicatorCalcTask competitionIndicatorCalcTask;
|
|
private final CompetitionIndicatorCalcTask competitionIndicatorCalcTask;
|
|
|
|
+ private final ThreadPoolTaskExecutor asyncExecutor;
|
|
|
|
|
|
public CompetitionTask(FundNavService fundNavService, CompetitionConfig competitionConfig,
|
|
public CompetitionTask(FundNavService fundNavService, CompetitionConfig competitionConfig,
|
|
EmailSystemConfigService emailSystemConfigService, RcCompetitionTaskDateMapper competitionTaskDateMapper,
|
|
EmailSystemConfigService emailSystemConfigService, RcCompetitionTaskDateMapper competitionTaskDateMapper,
|
|
- RcCompetitionCalcDateMapper competitionCalcDateMapper, FundDeletionTask fundDeletionTask, CompetitionIndicatorCalcTask competitionIndicatorCalcTask) {
|
|
|
|
|
|
+ RcCompetitionCalcDateMapper competitionCalcDateMapper, FundDeletionTask fundDeletionTask,
|
|
|
|
+ CompetitionIndicatorCalcTask competitionIndicatorCalcTask, @Qualifier("asyncExecutor") ThreadPoolTaskExecutor asyncExecutor) {
|
|
this.fundNavService = fundNavService;
|
|
this.fundNavService = fundNavService;
|
|
this.competitionConfig = competitionConfig;
|
|
this.competitionConfig = competitionConfig;
|
|
this.emailSystemConfigService = emailSystemConfigService;
|
|
this.emailSystemConfigService = emailSystemConfigService;
|
|
@@ -53,8 +58,29 @@ public class CompetitionTask {
|
|
this.competitionCalcDateMapper = competitionCalcDateMapper;
|
|
this.competitionCalcDateMapper = competitionCalcDateMapper;
|
|
this.fundDeletionTask = fundDeletionTask;
|
|
this.fundDeletionTask = fundDeletionTask;
|
|
this.competitionIndicatorCalcTask = competitionIndicatorCalcTask;
|
|
this.competitionIndicatorCalcTask = competitionIndicatorCalcTask;
|
|
|
|
+ this.asyncExecutor = asyncExecutor;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ public String getResult(Integer type, Integer competitionId, String period) {
|
|
|
|
+ asyncExecutor.execute(() -> {
|
|
|
|
+ if (type == 1) {
|
|
|
|
+ outputFundNavDetail(competitionId, period);
|
|
|
|
+ } else if (type == 2) {
|
|
|
|
+ List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(ListUtil.toList(period), competitionId);
|
|
|
|
+ if (CollUtil.isNotEmpty(calcDateDOList)) {
|
|
|
|
+ outputFundNavDeletion(competitionId, period, calcDateDOList.get(0).getBeginDate(), calcDateDOList.get(0).getEndDate());
|
|
|
|
+ }
|
|
|
|
+ } else if (type == 3) {
|
|
|
|
+ List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(ListUtil.toList(period), competitionId);
|
|
|
|
+ if (CollUtil.isNotEmpty(calcDateDOList)) {
|
|
|
|
+ outputCompetitionResult(competitionId, period, calcDateDOList.get(0));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ return "操作成功,请等到结果输出...";
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* 输出基金净值采集结果明细任务
|
|
* 输出基金净值采集结果明细任务
|
|
* 每天10:00,15:00执行任务
|
|
* 每天10:00,15:00执行任务
|
|
@@ -69,30 +95,7 @@ public class CompetitionTask {
|
|
}
|
|
}
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
String period = taskDateDO.getPriod();
|
|
String period = taskDateDO.getPriod();
|
|
- List<FundNavDataDTO> navDataDTOList = fundNavService.getFungNavData(competitionId);
|
|
|
|
- if (CollUtil.isEmpty(navDataDTOList)) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_" + period + "_榜单_基金净值采集结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
- EasyExcel.write(filePath, FundNavDataDTO.class)
|
|
|
|
- .sheet("基金净值采集结果明细")
|
|
|
|
- .doWrite(navDataDTOList);
|
|
|
|
- log.info("基金净值采集结果明细表格已输出 -> 文件:{}", filePath);
|
|
|
|
-
|
|
|
|
- // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
- if (competitionConfig.getMethod() == 1) {
|
|
|
|
- MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
- String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
- if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- try {
|
|
|
|
- EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值采集结果明细", "", period + "基金净值采集结果明细");
|
|
|
|
- log.info("基金净值采集结果明细表 -> 邮件已发送");
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- log.error("邮件发送基金净值采集结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ outputFundNavDetail(competitionId, period);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -108,34 +111,20 @@ public class CompetitionTask {
|
|
if (CollUtil.isEmpty(taskDateDOList)) {
|
|
if (CollUtil.isEmpty(taskDateDOList)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ // 输出之前 -> 执行净值缺失检测(确保净值不全的基金不参与榜单)
|
|
|
|
+ fundDeletionTask.computeDeletion();
|
|
|
|
+
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().toList();
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
Map<String, RcCompetitionCalcDateDO> periodCalcDataDoMap = calcDateDOList.stream().collect(Collectors.toMap(RcCompetitionCalcDateDO::getPriod, v -> v));
|
|
Map<String, RcCompetitionCalcDateDO> periodCalcDataDoMap = calcDateDOList.stream().collect(Collectors.toMap(RcCompetitionCalcDateDO::getPriod, v -> v));
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
- String period = taskDateDO.getPriod();
|
|
|
|
- RcCompetitionCalcDateDO calcDateDO = periodCalcDataDoMap.get(period);
|
|
|
|
- List<FundNavDeletionDTO> navDeletionDTOList = fundNavService.getFundNavDeletion(competitionId, calcDateDO.getBeginDate(), calcDateDO.getEndDate());
|
|
|
|
- if (CollUtil.isEmpty(navDeletionDTOList)) {
|
|
|
|
- return;
|
|
|
|
- }
|
|
|
|
- String filePath = competitionConfig.getDirectory() + period + "_榜单_基金净值缺失明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
- EasyExcel.write(filePath, FundNavDeletionDTO.class)
|
|
|
|
- .sheet("基金净值缺失明细")
|
|
|
|
- .doWrite(navDeletionDTOList);
|
|
|
|
- // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
- if (competitionConfig.getMethod() == 1) {
|
|
|
|
- MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
- String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
- if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- try {
|
|
|
|
- EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值缺失明细", "", period + "_榜单_基金净值缺失明细");
|
|
|
|
- log.info("基金净值缺失明细表 -> 邮件已发送");
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- log.error("邮件发送基金净值缺失明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
- }
|
|
|
|
|
|
+ RcCompetitionCalcDateDO calcDateDO = periodCalcDataDoMap.get(taskDateDO.getPriod());
|
|
|
|
+ if (calcDateDO == null) {
|
|
|
|
+ continue;
|
|
}
|
|
}
|
|
|
|
+ String beginDate = calcDateDO.getBeginDate();
|
|
|
|
+ String endDate = calcDateDO.getEndDate();
|
|
|
|
+ outputFundNavDeletion(competitionId, taskDateDO.getPriod(), beginDate, endDate);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -151,45 +140,103 @@ public class CompetitionTask {
|
|
if (CollUtil.isEmpty(taskDateDOList)) {
|
|
if (CollUtil.isEmpty(taskDateDOList)) {
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- // 输出榜单之前 -> 执行净值缺失检测(确保净值不全的基金不参与榜单)
|
|
|
|
- fundDeletionTask.computeDeletion();
|
|
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().collect(Collectors.toList());
|
|
List<String> periodList = taskDateDOList.stream().map(RcCompetitionTaskDateDO::getPriod).distinct().collect(Collectors.toList());
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
List<RcCompetitionCalcDateDO> calcDateDOList = competitionCalcDateMapper.queryByPriod(periodList, competitionId);
|
|
Map<String, RcCompetitionCalcDateDO> periodCalcDataDoMap = calcDateDOList.stream().collect(Collectors.toMap(RcCompetitionCalcDateDO::getPriod, v -> v));
|
|
Map<String, RcCompetitionCalcDateDO> periodCalcDataDoMap = calcDateDOList.stream().collect(Collectors.toMap(RcCompetitionCalcDateDO::getPriod, v -> v));
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
for (RcCompetitionTaskDateDO taskDateDO : taskDateDOList) {
|
|
String period = taskDateDO.getPriod();
|
|
String period = taskDateDO.getPriod();
|
|
RcCompetitionCalcDateDO calcDateDO = periodCalcDataDoMap.get(period);
|
|
RcCompetitionCalcDateDO calcDateDO = periodCalcDataDoMap.get(period);
|
|
- // 输出榜单之前 -> 执行基金净值指标计算
|
|
|
|
- competitionIndicatorCalcTask.calculateIndicator(competitionId, calcDateDO);
|
|
|
|
|
|
+ outputCompetitionResult(competitionId, period, calcDateDO);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
|
|
- List<? extends CompetitionBaseResultDTO> competitionResultDTOList = fundNavService.getCompetitionResult(competitionId, period);
|
|
|
|
- if (CollUtil.isEmpty(competitionResultDTOList)) {
|
|
|
|
|
|
+ public void outputFundNavDetail(Integer competitionId, String period) {
|
|
|
|
+ List<FundNavDataDTO> navDataDTOList = fundNavService.getFungNavData(competitionId);
|
|
|
|
+ if (CollUtil.isEmpty(navDataDTOList)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_" + period + "_榜单_基金净值采集结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
+ EasyExcel.write(filePath, FundNavDataDTO.class)
|
|
|
|
+ .sheet("基金净值采集结果明细")
|
|
|
|
+ .doWrite(navDataDTOList);
|
|
|
|
+ log.info("基金净值采集结果明细表格已输出 -> 文件:{}", filePath);
|
|
|
|
+
|
|
|
|
+ // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
+ if (competitionConfig.getMethod() == 1) {
|
|
|
|
+ MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
+ String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
+ if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
+ log.info("未配置发件箱和收件箱,无法发送邮件");
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
- Class<? extends CompetitionBaseResultDTO> aClass = competitionResultDTOList.get(0).getClass();
|
|
|
|
- String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_" + period + "_榜单_基金净值衍生指标及排名结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
- EasyExcel.write(filePath, aClass)
|
|
|
|
- .sheet("基金净值衍生指标及排名结果明细")
|
|
|
|
- .doWrite(competitionResultDTOList);
|
|
|
|
- log.info("基金净值衍生指标及排名结果明细表已输出 -> 文件:{}", filePath);
|
|
|
|
-
|
|
|
|
- Integer method = competitionConfig.getMethod();
|
|
|
|
- // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
- if (method == 1) {
|
|
|
|
- MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
- String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
- if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
- continue;
|
|
|
|
- }
|
|
|
|
- try {
|
|
|
|
- String emailTitle = period + "_榜单_基金净值衍生指标及排名结果明细";
|
|
|
|
- EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), emailTitle, "", emailTitle);
|
|
|
|
- log.info("基金净值衍生指标及排名结果明细表 -> 邮件已发送");
|
|
|
|
- } catch (Exception e) {
|
|
|
|
- log.error("邮件发送基金净值衍生指标及排名结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
- }
|
|
|
|
|
|
+ try {
|
|
|
|
+ EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值采集结果明细", "", period + "基金净值采集结果明细");
|
|
|
|
+ log.info("基金净值采集结果明细表 -> 邮件已发送");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("邮件发送基金净值采集结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ private void outputFundNavDeletion(Integer competitionId, String period, String beginDate, String endDate) {
|
|
|
|
+ List<FundNavDeletionDTO> navDeletionDTOList = fundNavService.getFundNavDeletion(competitionId, beginDate, endDate);
|
|
|
|
+ if (CollUtil.isEmpty(navDeletionDTOList)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_" + period + "_榜单_基金净值缺失明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
+ EasyExcel.write(filePath, FundNavDeletionDTO.class)
|
|
|
|
+ .sheet("基金净值缺失明细")
|
|
|
|
+ .doWrite(navDeletionDTOList);
|
|
|
|
+ // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
+ if (competitionConfig.getMethod() == 1) {
|
|
|
|
+ MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
+ String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
+ if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
+ log.info("未配置发件箱和收件箱,无法发送邮件");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), "基金净值缺失明细", "", period + "_榜单_基金净值缺失明细");
|
|
|
|
+ log.info("基金净值缺失明细表 -> 邮件已发送");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("邮件发送基金净值缺失明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ private void outputCompetitionResult(Integer competitionId, String period, RcCompetitionCalcDateDO calcDateDO) {
|
|
|
|
+ long startTime = System.currentTimeMillis();
|
|
|
|
+ // 输出榜单之前 -> 执行净值缺失检测(确保净值不全的基金不参与榜单)
|
|
|
|
+ fundDeletionTask.computeDeletion();
|
|
|
|
+ // 输出榜单之前 -> 执行基金净值指标计算
|
|
|
|
+ competitionIndicatorCalcTask.calculateIndicator(competitionId, calcDateDO);
|
|
|
|
+ List<? extends CompetitionBaseResultDTO> competitionResultDTOList = fundNavService.getCompetitionResult(competitionId, period);
|
|
|
|
+ if (CollUtil.isEmpty(competitionResultDTOList)) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ Class<? extends CompetitionBaseResultDTO> aClass = competitionResultDTOList.get(0).getClass();
|
|
|
|
+ String filePath = competitionConfig.getDirectory() + competitionConfig.getName() + "_" + period + "_榜单_基金净值衍生指标及排名结果明细_" + DateUtil.format(new Date(), DateConst.YYYYMMDD) + ".xlsx";
|
|
|
|
+ EasyExcel.write(filePath, aClass)
|
|
|
|
+ .sheet("基金净值衍生指标及排名结果明细")
|
|
|
|
+ .doWrite(competitionResultDTOList);
|
|
|
|
+ log.info("基金净值衍生指标及排名结果明细表已输出 -> 文件:{},耗时:{}", filePath, (System.currentTimeMillis() - startTime));
|
|
|
|
+
|
|
|
|
+ Integer method = competitionConfig.getMethod();
|
|
|
|
+ // 通过邮件发送"基金净值采集结果明细表格"
|
|
|
|
+ if (method == 1) {
|
|
|
|
+ MailboxInfoDTO mailboxInfoDTO = emailSystemConfigService.getFromEmailInfo();
|
|
|
|
+ String receivingMailbox = emailSystemConfigService.getRecipientEmail();
|
|
|
|
+ if (mailboxInfoDTO == null || StrUtil.isBlank(receivingMailbox)) {
|
|
|
|
+ log.info("未配置发件箱和收件箱,无法发送邮件");
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+ try {
|
|
|
|
+ String emailTitle = period + "_榜单_基金净值衍生指标及排名结果明细";
|
|
|
|
+ EmailUtil.senEmail(mailboxInfoDTO, receivingMailbox, new File(filePath), emailTitle, "", emailTitle);
|
|
|
|
+ log.info("基金净值衍生指标及排名结果明细表 -> 邮件已发送");
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("邮件发送基金净值衍生指标及排名结果明细表异常 -> 堆栈信息:{}", ExceptionUtil.stacktraceToString(e));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|