Files
xservice-script/script/src/main/java/com/xiang/schedule/xb/FundCountJob.java
2025-06-06 16:01:37 +08:00

105 lines
4.5 KiB
Java

package com.xiang.schedule.xb;
import com.alibaba.fastjson2.JSONObject;
import com.google.common.collect.Lists;
import com.xiang.dingTalk.service.DingTalkService;
import com.xiang.entity.pojo.xb.XbFundCount;
import com.xiang.entity.pojo.xb.XbFundList;
import com.xiang.entity.response.xbyj.fund.FundList;
import com.xiang.service.FundService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* @Author: xiang
* @Date: 2025-05-21 13:59
*/
@Component
@RequiredArgsConstructor
@Slf4j
public class FundCountJob {
private final FundService fundService;
private final DingTalkService dingTalkService;
@Value("${DingTalk.chatId}")
private String chatId;
@Scheduled(cron = "0 0 22 * * ?")
public void countFundJob() {
// 周六周日过滤
if (Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SATURDAY) ||
Objects.equals(LocalDateTime.now().getDayOfWeek(), DayOfWeek.SUNDAY)) {
return;
}
log.info("==========================[基金统计] 基金统计定时任务启动!==========================");
List<XbFundList> lists = fundService.queryFundList(null);
if (CollectionUtils.isEmpty(lists)) {
return;
}
List<XbFundCount> counts = Lists.newCopyOnWriteArrayList();
String date = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
lists.parallelStream().forEach(xbFundList -> {
List<FundList> fund = fundService.queryTodayList(date, "2", Boolean.TRUE, Collections.singletonList(xbFundList.getCode()));
if (CollectionUtils.isNotEmpty(fund)) {
XbFundCount xbFundCount = new XbFundCount();
xbFundCount.setLId(xbFundList.getId());
xbFundCount.setCode(xbFundList.getCode());
xbFundCount.setName(xbFundList.getName());
xbFundCount.setChange(fund.get(0).getChange());
xbFundCount.setUpdateTime(LocalDateTime.now());
counts.add(xbFundCount);
}
});
if (CollectionUtils.isNotEmpty(counts)) {
log.info("[基金统计] 基金统计记录,需要插入的数据:{}", JSONObject.toJSONString(counts));
fundService.addCounts(counts);
}
log.info("==========================[基金统计] 基金统计定时任务结束!==========================");
}
@Scheduled(cron = "0 40 14 * * ? ")
public void countFundInWeek() throws Exception {
log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务启动!==========================");
List<XbFundCount> xbFundCounts = fundService.queryFundCountInWeek();
if (CollectionUtils.isEmpty(xbFundCounts)) {
return;
}
StringBuilder sb = new StringBuilder();
Map<String, List<XbFundCount>> map = xbFundCounts.stream().collect(Collectors.groupingBy(XbFundCount::getCode));
map.forEach((k, v) -> {
List<XbFundCount> fundCounts = map.get(k);
if (CollectionUtils.isNotEmpty(fundCounts)) {
return;
}
List<BigDecimal> decimals = fundCounts.stream().map(XbFundCount::getChange).collect(Collectors.toList());
BigDecimal sum = BigDecimal.ZERO;
for (BigDecimal decimal : decimals) {
sum = sum.add(decimal);
}
BigDecimal avg = sum.divide(BigDecimal.valueOf(decimals.size()), 2, RoundingMode.HALF_UP);
sb.append("").append(fundCounts.get(0).getName()).append("】本周平均涨跌幅为:").append(avg).append("\n");
});
if (StringUtils.isNotBlank(sb)) {
dingTalkService.sendChatMessage(chatId, sb.toString());
}
log.info("==========================[基金统计] 基金本周涨跌幅消息发送定时任务结束!==========================");
}
}