package com.dataeasy.server.task; import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig; import com.dataeasy.server.pojo.task.ScheduleTaskContext; import com.dataeasy.server.pojo.task.TemplateData; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils; import com.dataeasy.server.atomic.entity.DataIpoBond; import com.dataeasy.server.atomic.service.IDataIpoBondService; import com.dataeasy.server.common.annotation.ScheduleTask; import com.dataeasy.server.constant.CacheNameConstant; import com.dataeasy.server.constant.ScheduleTaskEnum; import com.dataeasy.server.core.aop.ScheduleTaskLogAspect; import com.dataeasy.server.feign.FinanceFeign; import com.dataeasy.server.feign.dto.finance.BondResponse; import com.dataeasy.server.feign.dto.finance.FinanceRequest; import com.dataeasy.server.utiis.DateUtils; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; /** * @author tyuio * @version 1.0.0 * @description 新债定时任务,执行时间:每天早上8:35 * @date 2025/3/7 11:25 */ @Slf4j @Component @ScheduleTask(ScheduleTaskEnum.IPO_BOND) public class IpoBondTask extends AbstractDataTask { /** * 新债数量 */ private static final String CONTEXT_BOND_NUM = "bondNum"; /** * 申购日期 */ private static final String CONTEXT_SUBSCRIPTION_DATE = "subscriptionDate"; @Autowired private FinanceFeign financeFeign; @Autowired private IDataIpoBondService ipoBondService; @Scheduled(cron = "0 35 8 * * *") public void execute() { super.execute(); } @Override public boolean fetchData() { // 拉取数据 String todayStr = DateUtils.YYYYMMDD_FORMATTER.format(LocalDate.now()); FinanceRequest financeRequest = new FinanceRequest(); financeRequest.setStartDate(todayStr); financeRequest.setEndDate(todayStr); List bondCovIssueCninfos = financeFeign.getBondCovIssueCninfo(financeRequest); if (CollectionUtils.isEmpty(bondCovIssueCninfos)) { log.warn("拉取新债数据失败,返回结果对象为空"); return false; } // 删除历史数据数据,以防重复执行导致数据重复引发系统异常 String subscriptionDate = DateUtils.YYYY_MM_DD_FORMATTER.format(LocalDate.now()); ipoBondService.deleteBySubscriptionDate(subscriptionDate); List ipoBonds = bondCovIssueCninfos.stream().map(v -> { DataIpoBond ipoBond = new DataIpoBond(); BeanUtils.copyProperties(v, ipoBond); return ipoBond; }).collect(Collectors.toList()); // 数据入库 ipoBondService.insertList(ipoBonds); // 清除缓存,以防缓存中数据过时 cacheManager.getCache(CacheNameConstant.DATA_IPO_BOND_LIST).evict(todayStr); // 设置上下文 Map context = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get().getContext(); context.put(CONTEXT_BOND_NUM, ipoBonds.size()); context.put(CONTEXT_SUBSCRIPTION_DATE, todayStr); return true; } @Override public TemplateData getTemplateMessage() { ScheduleTaskContext scheduleTaskContext = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get(); // 获取上下文 Map context = scheduleTaskContext.getContext(); int bondNum = (int) context.get(CONTEXT_BOND_NUM); String subscriptionDate = (String) context.get(CONTEXT_SUBSCRIPTION_DATE); // 获取任务配置并构建完整页面路径 SubscriptionTaskConfig subscriptionTaskConfig = scheduleTaskContext.getSubscriptionTaskConfig(); String pagePath = String.format("%s?subscriptionDate=%s", subscriptionTaskConfig.getPagePath(), subscriptionDate); // 模板所需数据 List templateDataList = new ArrayList(); templateDataList.add(new WxMpTemplateData("thing76", String.format("新债申购,今天发行%s只新债", bondNum))); templateDataList.add(new WxMpTemplateData("time4", subscriptionDate)); TemplateData templateData = new TemplateData(); templateData.setTemplateMessage(templateDataList); templateData.setPagePath(pagePath); return templateData; } }