소스 검색

创建定时任务和触发器方法实现

wangzl 5 달 전
부모
커밋
80a7d4f171

+ 2 - 1
tr-modules/tr-module-quartz/src/main/java/cn/tr/module/quartz/utils/ScheduleUtils.java

@@ -48,7 +48,7 @@ public class ScheduleUtils
     /**
      * 创建定时任务
      */
-    public static void createScheduleJob(Scheduler scheduler, SysJobDTO job) throws SchedulerException, TaskException {
+    public static JobDetail createScheduleJob(Scheduler scheduler, SysJobDTO job) throws SchedulerException, TaskException {
         Class<? extends Job> jobClass = getQuartzJobClass(job);
         // 构建job信息
         String jobId = job.getJobId();
@@ -85,6 +85,7 @@ public class ScheduleUtils
         {
             scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
         }
+        return jobDetail;
     }
 
     /**

+ 21 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/config/JobDetailListType.java

@@ -0,0 +1,21 @@
+package cn.tr.module.smart.common.config;
+
+import cn.tr.plugin.mybatis.config.handler.ListTypeHandler;
+import org.quartz.JobDetail;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/7/29 11:53
+ */
+public class JobDetailListType extends ListTypeHandler<JobDetail> {
+    /**
+     * 具体类型,由子类提供
+     *
+     * @return 具体类型
+     */
+    @Override
+    protected Class specificType() {
+        return JobDetail.class;
+    }
+}

+ 8 - 2
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/po/BizMpPublishTaskPO.java

@@ -1,12 +1,17 @@
 package cn.tr.module.smart.common.po;
 
+import cn.tr.module.smart.app.config.QuestionListType;
+import cn.tr.module.smart.common.config.JobDetailListType;
 import cn.tr.plugin.mybatis.pojo.TenantPO;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.ToString;
+import org.quartz.JobDetail;
+
 /**
  * 公众号推送任务表实体
  *
@@ -40,12 +45,13 @@ public class BizMpPublishTaskPO extends TenantPO {
     @ApiModelProperty(value = "已推送次数", position = 5)
     private Integer publishCount;
 
-    /** cron表达式 */
+    /** c ron表达式 */
     @ApiModelProperty(value = "cron表达式", position = 6)
     private String cron;
 
     /** cron_job */
     @ApiModelProperty(value = "cron_job", position = 7)
-    private String cronJob;
+    @TableField(typeHandler = JobDetailListType.class)
+    private JobDetail cronJob;
 
 }

+ 11 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/IBizMpPublishTaskService.java

@@ -1,10 +1,13 @@
 package cn.tr.module.smart.common.service;
 
 
+import cn.tr.module.quartz.exception.TaskException;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskDTO;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskQueryDTO;
+import org.quartz.SchedulerException;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -54,4 +57,12 @@ public interface IBizMpPublishTaskService{
      * @date    2025/07/25 08:29
      */
     int removeBizMpPublishTaskByIds(Collection<String> ids);
+
+    /**
+     * @description: 创建定时任务
+     * @author wangzl
+     * @date 2025/7/29
+     */
+
+    void createQuestionTask(String clinicId, Date clinicEndTime,String type) throws SchedulerException, TaskException;
 }

+ 55 - 0
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/helper/BizClinicRoomHelper.java

@@ -0,0 +1,55 @@
+package cn.tr.module.smart.common.service.helper;
+
+import cn.tr.module.quartz.constant.ScheduleConstants;
+import cn.tr.module.quartz.job.dto.SysJobDTO;
+import cn.tr.module.smart.common.po.BizMpPublishTaskPO;
+import cn.tr.module.smart.common.util.PushIntervalCalculator;
+import cn.tr.module.smart.common.util.PushIntervalOptions;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @author wangzl
+ * @description: TODO
+ * @date 2025/7/29 11:26
+ */
+public class BizClinicRoomHelper {
+
+
+    public static List<BizMpPublishTaskPO> getMpPublishTask(String clinicId, Date clinicEndTime, Integer pushInterval, Integer totalCount, String type) {
+
+        List<String> pushIntervalUnified = PushIntervalCalculator.getPushIntervalUnified(clinicEndTime, pushInterval,
+                PushIntervalOptions.create()
+                        .strategy(PushIntervalOptions.STRATEGY_DAYS_FIRST)
+                        .maxExpressions(2)
+                        .workHoursOnly(true));
+        return pushIntervalUnified.stream().map(cron -> {
+            BizMpPublishTaskPO bizMpPublishTaskPO = new BizMpPublishTaskPO();
+            bizMpPublishTaskPO.setId(IdWorker.getIdStr());
+            bizMpPublishTaskPO.setClinicRoomId(clinicId);
+            bizMpPublishTaskPO.setType(type);
+            bizMpPublishTaskPO.setTotalCount(totalCount);
+            bizMpPublishTaskPO.setPublishCount(0);
+            bizMpPublishTaskPO.setCron(cron);
+            return bizMpPublishTaskPO;
+        }).collect(Collectors.toList());
+
+    }
+
+    public static SysJobDTO getJobQuestion(BizMpPublishTaskPO pos) {
+        SysJobDTO job = new SysJobDTO();
+        job.setJobId(IdWorker.getIdStr());
+        job.setJobName("QuestionTask_" + pos.getId());
+        job.setJobGroup("QuestionTask");
+        job.setInvokeTarget("QuartzTaskExecutor.execute(" + pos.getId() + ")");
+        job.setCronExpression(pos.getCron());
+        job.setMisfirePolicy(ScheduleConstants.MISFIRE_DO_NOTHING);
+        job.setConcurrent(false);
+        job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
+        return job;
+    }
+
+}

+ 104 - 40
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/service/impl/BizMpPublishTaskServiceImpl.java

@@ -3,92 +3,156 @@ package cn.tr.module.smart.common.service.impl;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
+import cn.tr.module.quartz.exception.TaskException;
+import cn.tr.module.quartz.job.dto.SysJobDTO;
+import cn.tr.module.quartz.utils.ScheduleUtils;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskDTO;
 import cn.tr.module.smart.common.dto.BizMpPublishTaskQueryDTO;
 import cn.tr.module.smart.common.mapper.BizMpPublishTaskMapper;
+import cn.tr.module.smart.common.po.BizClinicRoomPO;
+import cn.tr.module.smart.common.po.BizDeptPO;
 import cn.tr.module.smart.common.po.BizMpPublishTaskPO;
+import cn.tr.module.smart.common.po.BizQuestionGroupPO;
+import cn.tr.module.smart.common.repository.BizClinicRoomRepository;
+import cn.tr.module.smart.common.repository.BizDeptRepository;
 import cn.tr.module.smart.common.repository.BizMpPublishTaskRepository;
+import cn.tr.module.smart.common.repository.BizQuestionGroupRepository;
 import cn.tr.module.smart.common.service.IBizMpPublishTaskService;
+import cn.tr.module.smart.common.service.helper.BizClinicRoomHelper;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.Collection;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
+
 /**
  * 公众号推送任务表Service接口实现类
  *
  * @author wangzl
- * @date  2025/07/25 08:29
+ * @date 2025/07/25 08:29
  **/
 @Service
 public class BizMpPublishTaskServiceImpl implements IBizMpPublishTaskService {
     @Autowired
     private BizMpPublishTaskRepository baseRepository;
+    @Autowired
+    private Scheduler scheduler;
+
+    @Autowired
+    private BizQuestionGroupRepository questionGroupRepository;
+    @Autowired
+    private BizClinicRoomRepository bizClinicRoomRepository;
+
+    @Autowired
+    private BizDeptRepository bizDeptRepository;
 
 
     /**
-    * 根据条件查询公众号推送任务表
-    * @param    query 查询参数
-    * @author   wangzl
-    * @date      2025/07/25 08:29
-    */
+     * 根据条件查询公众号推送任务表
+     *
+     * @param query 查询参数
+     * @author wangzl
+     * @date 2025/07/25 08:29
+     */
     @Override
-    public List<BizMpPublishTaskDTO> selectBizMpPublishTaskList(BizMpPublishTaskQueryDTO query){
+    public List<BizMpPublishTaskDTO> selectBizMpPublishTaskList(BizMpPublishTaskQueryDTO query) {
         return BizMpPublishTaskMapper.INSTANCE.convertDtoList(
                 baseRepository.selectList(new LambdaQueryWrapper<BizMpPublishTaskPO>()
                 )
         );
-    };
+    }
 
     /**
-    * 根据id查询公众号推送任务表
-    * @param    id 主键id
-    * @author   wangzl
-    * @date      2025/07/25 08:29
-    */
+     * 根据id查询公众号推送任务表
+     *
+     * @param id 主键id
+     * @author wangzl
+     * @date 2025/07/25 08:29
+     */
     @Override
-    public BizMpPublishTaskDTO selectBizMpPublishTaskById(String id){
+    public BizMpPublishTaskDTO selectBizMpPublishTaskById(String id) {
         return BizMpPublishTaskMapper.INSTANCE.convertDto(baseRepository.selectById(id));
-    };
+    }
 
     /**
-    * 编辑公众号推送任务表
-    * @param   source 编辑实体类
-    * @author  wangzl
-    * @date     2025/07/25 08:29
-    */
+     * 编辑公众号推送任务表
+     *
+     * @param source 编辑实体类
+     * @author wangzl
+     * @date 2025/07/25 08:29
+     */
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public boolean updateBizMpPublishTaskById(BizMpPublishTaskDTO source){
-            return baseRepository.updateById(BizMpPublishTaskMapper.INSTANCE.convertPO(source))!=0;
-    };
+    public boolean updateBizMpPublishTaskById(BizMpPublishTaskDTO source) {
+        return baseRepository.updateById(BizMpPublishTaskMapper.INSTANCE.convertPO(source)) != 0;
+    }
 
     /**
-    * 新增公众号推送任务表
-    * @param   source 新增实体类
-    * @author wangzl
-    * @date  2025/07/25 08:29
-    */
+     * 新增公众号推送任务表
+     *
+     * @param source 新增实体类
+     * @author wangzl
+     * @date 2025/07/25 08:29
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean insertBizMpPublishTask(BizMpPublishTaskDTO source){
-        return baseRepository.insert(BizMpPublishTaskMapper.INSTANCE.convertPO(source))!=0;
-    };
+    public boolean insertBizMpPublishTask(BizMpPublishTaskDTO source) {
+        return baseRepository.insert(BizMpPublishTaskMapper.INSTANCE.convertPO(source)) != 0;
+    }
 
     /**
-    * 删除公众号推送任务表详情
-    * @param  ids 删除主键集合
-    * @author wangzl
-    * @date    2025/07/25 08:29
-    */
+     * 删除公众号推送任务表详情
+     *
+     * @param ids 删除主键集合
+     * @author wangzl
+     * @date 2025/07/25 08:29
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public int removeBizMpPublishTaskByIds(Collection<String> ids){
-        if(CollectionUtil.isEmpty(ids)){
-            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"请选择要删除的数据");
+    public int removeBizMpPublishTaskByIds(Collection<String> ids) {
+        if (CollectionUtil.isEmpty(ids)) {
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "请选择要删除的数据");
         }
         return baseRepository.deleteBatchIds(ids);
-    };
+    }
+
+
+    /**
+     * @description: 创建定时任务
+     * @author wangzl
+     * @date 2025/7/29
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void createQuestionTask(String clinicId, Date clinicEndTime, String type) throws SchedulerException, TaskException {
+        //查询推送频次和推送次数
+        BizClinicRoomPO bizClinicRoomPO = bizClinicRoomRepository.selectById(clinicId);
+        if (Objects.isNull(bizClinicRoomPO)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到手术信息");
+        }
+        BizDeptPO bizDeptPO = bizDeptRepository.selectById(bizClinicRoomPO.getDeptId());
+        if (Objects.isNull(bizDeptPO)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到科室信息");
+        }
+        BizQuestionGroupPO bizQuestionGroupPO = questionGroupRepository.selectById(bizDeptPO.getGroupId());
+        if (Objects.isNull(bizQuestionGroupPO)){
+            throw new ServiceException(TRExcCode.SYSTEM_ERROR_B0001, "未查询到问卷组信息");
+        }
+        List<BizMpPublishTaskPO> mpPublishTask = BizClinicRoomHelper.getMpPublishTask(clinicId, clinicEndTime,
+                bizQuestionGroupPO.getInterval(), bizQuestionGroupPO.getFrequency(), type);
+        for (BizMpPublishTaskPO task : mpPublishTask) {
+            SysJobDTO job = BizClinicRoomHelper.getJobQuestion(task);
+            JobDetail scheduleJob = ScheduleUtils.createScheduleJob(scheduler, job);
+            task.setCronJob(scheduleJob);
+            baseRepository.insert(task);
+        }
+    }
+
 }

+ 5 - 7
tr-modules/tr-module-smartFollowUp/src/main/java/cn/tr/module/smart/common/task/QuartzTaskExecutor.java

@@ -4,11 +4,13 @@ import cn.hutool.core.util.ObjectUtil;
 import cn.tr.core.exception.ServiceException;
 import cn.tr.core.exception.TRExcCode;
 import cn.tr.module.quartz.job.service.ISysJobService;
+import cn.tr.module.quartz.utils.ScheduleUtils;
 import cn.tr.module.smart.common.po.BizMpPublishTaskPO;
 import cn.tr.module.smart.common.repository.BizMpPublishTaskRepository;
 import cn.tr.plugin.lock.annotation.DistributeLock;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import lombok.extern.slf4j.Slf4j;
+import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.transaction.annotation.Transactional;
@@ -37,7 +39,7 @@ public class QuartzTaskExecutor {
      */
     @DistributeLock(name = "#taskId")
     @Transactional(rollbackFor = Exception.class)
-    public void execute(String taskId)   {
+    public void execute(String taskId) throws SchedulerException {
         BizMpPublishTaskPO bizMpPublishTaskPO = bizMpPublishTaskRepository.selectById(taskId);
         if (ObjectUtil.isNull(bizMpPublishTaskPO)) {
             log.info("任务不存在");
@@ -50,17 +52,13 @@ public class QuartzTaskExecutor {
                     .set(BizMpPublishTaskPO::getPublishCount,bizMpPublishTaskPO.getPublishCount()+1)
                     .eq(BizMpPublishTaskPO::getId,taskId));
             //执行推送数据
+
         } else {
             log.info("任务执行次数已完成");
             //删除任务
             bizMpPublishTaskRepository.deleteById(taskId);
             //删除触发器
-            try {
-                sysJobService.removeSysJobByIds(new ArrayList<>());
-                throw  new ServiceException(TRExcCode.SYSTEM_ERROR_B0001,"测试异常");
-            }catch (Exception e){
-                log.warn("删除定时任务 {}:执行异常了 :{}",taskId,e.getStackTrace());
-            }
+            sysJobService.removeSysJobByIds(new ArrayList<>());
         }
     }
 }