package com.dataeasy.server.task; import java.sql.Timestamp; import java.util.Arrays; import java.util.List; import java.util.Objects; import java.util.Set; import java.util.stream.Collectors; import com.binarywang.spring.starter.wxjava.miniapp.properties.WxMaProperties; import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cache.CacheManager; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import com.dataeasy.server.atomic.entity.SubscriptionTaskConfig; import com.dataeasy.server.atomic.entity.SubscriptionUserConfig; import com.dataeasy.server.atomic.entity.User; import com.dataeasy.server.atomic.service.ISubscriptionTaskConfigService; import com.dataeasy.server.atomic.service.ISubscriptionUserConfigService; import com.dataeasy.server.atomic.service.ISysScheduleTaskLogService; import com.dataeasy.server.atomic.service.IUserService; import com.dataeasy.server.constant.PushOptionEnum; import com.dataeasy.server.constant.ScheduleTaskEnum; import com.dataeasy.server.core.aop.ScheduleTaskLogAspect; import com.dataeasy.server.pojo.subscription.SubscriptionUserConfigQuery; import com.dataeasy.server.pojo.task.ScheduleTaskContext; import com.dataeasy.server.service.manager.IWxManager; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.mp.bean.template.WxMpTemplateData; /** * @author tyuio * @version 1.0.0 * @description 数据定时任务 抽象类 * @date 2025/3/7 10:44 */ @Slf4j public abstract class AbstractDataTask { @Autowired protected ISysScheduleTaskLogService taskLogService; @Autowired protected ISubscriptionTaskConfigService taskConfigService; @Autowired protected ISubscriptionUserConfigService userConfigService; @Autowired protected IUserService userService; @Autowired protected IWxManager wxMpManager; @Autowired protected CacheManager cacheManager; @Autowired private WxMaProperties wxMaProperties; /** * 定时任务执行逻辑 */ public void execute() { // 获取定时任务上下文 ScheduleTaskContext scheduleTaskContext = ScheduleTaskLogAspect.scheduleTaskContextThreadLocal.get(); ScheduleTaskEnum task = scheduleTaskContext.getTask(); SubscriptionTaskConfig subscriptionTaskConfig = scheduleTaskContext.getSubscriptionTaskConfig(); // 拉取数据并入库 boolean fetchResult = fetchData(); if (!fetchResult) { log.warn("任务:{},任务编码:{},拉取数据失败,结束执行", task.getName(), task); return; } // 寻找要推送数据的用户 SubscriptionUserConfigQuery userConfigQuery = new SubscriptionUserConfigQuery(); userConfigQuery.setSubscriptionSourceIds(Arrays.asList(subscriptionTaskConfig.getId())); userConfigQuery.setPushOption(PushOptionEnum.ENABLED); userConfigQuery.setCurrentTime(new Timestamp(System.currentTimeMillis())); List userConfigList = userConfigService.getByCondition(userConfigQuery); if (CollectionUtils.isEmpty(userConfigList)) { log.warn("任务:{},任务编码:{},没有找到推送状态为启用的用户配置,结束执行", task.getName(), task); return; } Set userIds = userConfigList.stream().filter(v -> Objects.nonNull(v.getUserId())) .map(SubscriptionUserConfig::getUserId) .collect(Collectors.toSet()); if (CollectionUtils.isEmpty(userIds)) { log.warn("任务:{},任务编码:{},没有找到推送状态为启用的用户,结束执行", task.getName(), task); return; } List userList = userService.getByIds(userIds); if (CollectionUtils.isEmpty(userList)) { log.warn("任务:{},任务编码:{},没有找到待推送的用户列表,结束执行", task.getName(), task); return; } Set mpOpenIds = userList.stream().filter(v -> StringUtils.hasText(v.getMpOpenId())) .map(User::getMpOpenId) .collect(Collectors.toSet()); if (CollectionUtils.isEmpty(mpOpenIds)) { log.warn("任务:{},任务编码:{},待推送的用户列表中没有找到服务号openid,结束执行", task.getName(), task); return; } // 获取消息模板所需数据 List templateDataList = getTemplateMessage(); // 设置小程序 WxMpTemplateMessage.MiniProgram miniProgram = new WxMpTemplateMessage.MiniProgram(); miniProgram.setAppid(wxMaProperties.getAppid()); miniProgram.setPagePath(subscriptionTaskConfig.getPagePath()); // 推送 for (String mpOpenId : mpOpenIds) { // 生成模板信息 WxMpTemplateMessage mpTemplateMessage = WxMpTemplateMessage.builder() .toUser(mpOpenId) .templateId(subscriptionTaskConfig.getTemplateId()) .miniProgram(miniProgram) .data(templateDataList) .build(); wxMpManager.sendTemplateMessage(mpTemplateMessage); } } /** * 拉取所需数据并入库 * @return false-拉取数据入库失败 true-拉取数据入库成功 */ public abstract boolean fetchData(); /** * 获取消息模板所需数据 * @return */ public abstract List getTemplateMessage(); }