Bladeren bron

feat: 邮件解析动态定时任务开发

chenjianhua 7 maanden geleden
bovenliggende
commit
c5604ccd61

+ 10 - 0
service-base/pom.xml

@@ -218,6 +218,16 @@
             <artifactId>easyexcel</artifactId>
             <version>3.1.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-quartz</artifactId>
+        </dependency><!-- json 工具 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>2.0.52</version>
+        </dependency>
+
     </dependencies>
 
 <!--    <build>-->

+ 1 - 1
service-base/src/main/java/com/simuwang/base/common/enums/EmailCron.java

@@ -9,7 +9,7 @@ import java.util.stream.Stream;
  * Description: ${DESCRIPTION}
  */
 public enum EmailCron {
-    EVERY_HOUR(1, "0 0 0/1 * * *"), ONE_AM(2, "0 0 1 * * *");
+    EVERY_HOUR(1, "0 0/1 * * * ?"), ONE_AM(2, "0 0 1 * * ?");
 
     private final Integer text;
     private final String cron;

+ 188 - 0
service-base/src/main/java/com/simuwang/base/common/util/QuartzUtils.java

@@ -0,0 +1,188 @@
+package com.simuwang.base.common.util;
+
+import com.alibaba.fastjson.JSON;
+import com.simuwang.base.pojo.dto.QuartzBean;
+import org.quartz.*;
+import org.quartz.impl.matchers.GroupMatcher;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.ObjectUtils;
+import java.util.*;
+/**
+ * FileName: QuartzUtils
+ * Author:   chenjianhua
+ * Date:     2024/9/17 10:25
+ * Description: ${DESCRIPTION}
+ */
+public class QuartzUtils {
+
+    private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);
+
+
+    /**
+     * 获取所有的定时任务
+     *
+     * @throws Exception
+     */
+    public static List<QuartzBean> getAllJob(Scheduler scheduler) {
+        GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup();
+        List<QuartzBean> jobList = new ArrayList();
+        try {
+            Set<JobKey> jobKeys = scheduler.getJobKeys(matcher);
+            for (JobKey jobKey : jobKeys) {
+                List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey);
+                for (Trigger trigger : triggers) {
+                    QuartzBean job = new QuartzBean();
+                    job.setJobName(jobKey.getName());
+                    job.setGroupName(jobKey.getGroup());
+                    Trigger.TriggerState triggerState = scheduler.getTriggerState(trigger.getKey());
+                    job.setStatus(Trigger.TriggerState.NORMAL.equals(triggerState) ? 1 : 0);
+                    if (trigger instanceof CronTrigger) {
+                        CronTrigger cronTrigger = (CronTrigger) trigger;
+                        String cronExpression = cronTrigger.getCronExpression();
+                        job.setCronExpression(cronExpression);
+                    }
+                    JobDetail jobDetail = scheduler.getJobDetail(jobKey);
+                    JobDataMap jobDataMap = jobDetail.getJobDataMap();
+                    String[] keys = jobDataMap.getKeys();
+                    if (keys != null && keys.length > 0) {
+                        Map<String, String> paramMap = new HashMap<>(keys.length, 1.0f);
+                        for (String key : keys) {
+                            paramMap.put(key, jobDataMap.get(key).toString());
+                        }
+                        String paramStr = JSON.toJSONString(paramMap);
+                        job.setJobParam(paramStr);
+                    }
+                    Class<? extends Job> jobClass = jobDetail.getJobClass();
+                    job.setJobClass(jobClass.getName());
+                    jobList.add(job);
+                }
+            }
+
+        } catch (SchedulerException e) {
+            logger.error(e.getMessage(),e);
+        }
+        return jobList;
+    }
+
+    /**
+     * 创建定时任务 定时任务创建之后默认启动状态
+     *
+     * @param scheduler  调度器
+     * @param quartzBean 定时任务信息类
+     * @throws Exception
+     */
+    public static void createScheduleJob(Scheduler scheduler, QuartzBean quartzBean) {
+        try {
+            //获取到定时任务的执行类  必须是类的绝对路径名称
+            //定时任务类需要是job类的具体实现 QuartzJobBean是job的抽象类。
+            Class<? extends Job> jobClass = (Class<? extends Job>) Class.forName(quartzBean.getJobClass());
+            // 构建定时任务信息
+            JobBuilder jobBuilder = JobBuilder.newJob(jobClass).withIdentity(quartzBean.getJobName(), quartzBean.getGroupName());
+            // 设置参数
+            Map<String, String> paramHashMap = JSON.parseObject(quartzBean.getJobParam(), HashMap.class);
+            if (!ObjectUtils.isEmpty(paramHashMap)) {
+                paramHashMap.forEach(
+                        (param, paramValue) -> {
+                            jobBuilder.usingJobData(param, paramValue);
+                        }
+                );
+            }
+            JobDetail jobDetail = jobBuilder
+                    .storeDurably()
+                    .build();
+            // 设置定时任务执行方式
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzBean.getCronExpression());
+            // 构建触发器trigger
+            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(quartzBean.getJobName()).withSchedule(scheduleBuilder).build();
+            scheduler.scheduleJob(jobDetail, trigger);
+        } catch (ClassNotFoundException e) {
+            logger.error(e.getMessage(),e);
+        } catch (SchedulerException e) {
+            logger.error(e.getMessage(),e);
+        }
+    }
+
+    /**
+     * 根据任务名称暂停定时任务
+     *
+     * @param scheduler  调度器
+     * @param jobKeyName 定时任务名称
+     * @throws SchedulerException
+     */
+    public static void pauseScheduleJob(Scheduler scheduler, String jobKeyName) {
+        String[] jobNameGroupArr = jobKeyName.split("\\.");
+        JobKey jobKey = JobKey.jobKey(jobNameGroupArr[1], jobNameGroupArr[0]);
+        try {
+            scheduler.pauseJob(jobKey);
+        } catch (SchedulerException e) {
+            logger.error("暂停定时任务出错:" +e.getMessage(),e);
+        }
+    }
+
+    /**
+     * 根据任务名称恢复定时任务
+     *
+     * @param scheduler  调度器
+     * @param jobKeyName 定时任务名称
+     * @throws SchedulerException
+     */
+    public static void resumeScheduleJob(Scheduler scheduler, String jobKeyName) {
+        String[] jobNameGroupArr = jobKeyName.split("\\.");
+        JobKey jobKey = JobKey.jobKey(jobNameGroupArr[1], jobNameGroupArr[0]);
+        try {
+            scheduler.resumeJob(jobKey);
+        } catch (SchedulerException e) {
+            logger.error("启动定时任务出错:" +e.getMessage(),e);
+        }
+    }
+
+    /**
+     * 根据任务名称立即运行一次定时任务
+     *
+     * @param scheduler  调度器
+     * @param jobKeyName 定时任务名称
+     * @throws SchedulerException
+     */
+    public static void runOnce(Scheduler scheduler, String jobKeyName) {
+        String[] jobNameGroupArr = jobKeyName.split("\\.");
+        JobKey jobKey = JobKey.jobKey(jobNameGroupArr[1], jobNameGroupArr[0]);
+        try {
+            scheduler.triggerJob(jobKey);
+        } catch (SchedulerException e) {
+            logger.error("运行定时任务出错:" +e.getMessage(),e);
+        }
+    }
+
+    /**
+     * 更新定时任务
+     *
+     * @param scheduler  调度器
+     * @param quartzBean 定时任务信息类
+     * @throws SchedulerException
+     */
+    public static void updateScheduleJob(Scheduler scheduler, QuartzBean quartzBean) {
+        deleteScheduleJob(scheduler, quartzBean.getGroupName() + "." + quartzBean.getJobName());
+        createScheduleJob(scheduler, quartzBean);
+    }
+
+    /**
+     * 根据定时任务名称从调度器当中删除定时任务
+     *
+     * @param scheduler  调度器
+     * @param jobKeyName 定时任务名称
+     * @throws SchedulerException
+     */
+    public static void deleteScheduleJob(Scheduler scheduler, String jobKeyName) {
+        String[] jobNameGroupArr = jobKeyName.split("\\.");
+        JobKey jobKey = JobKey.jobKey(jobNameGroupArr[1], jobNameGroupArr[0]);
+        try {
+            if (ObjectUtils.isEmpty(jobKey)) {
+                return;
+            }
+            scheduler.deleteJob(jobKey);
+        } catch (SchedulerException e) {
+            logger.error("删除定时任务出错:" +e.getMessage(),e);
+        }
+    }
+}

+ 3 - 1
service-base/src/main/java/com/simuwang/base/mapper/MailboxInfoMapper.java

@@ -23,9 +23,11 @@ public interface MailboxInfoMapper extends BaseMapper<MailboxInfoDO> {
 
     void deleteEmailConfigByIds(@Param("ids") List<Integer> split);
 
-    MailboxInfoDO checkEmailUnique(@Param("email") String email);
+    MailboxInfoDO selectEmailConfigByEmail(@Param("email") String email);
 
     long countEmailConfig(EmailPageQuery emailPageQuery);
 
     MailboxInfoDO searchEmailConfigById(@Param("id")Integer id);
+
+    List<MailboxInfoDO> getAll();
 }

+ 49 - 0
service-base/src/main/java/com/simuwang/base/pojo/dto/QuartzBean.java

@@ -0,0 +1,49 @@
+package com.simuwang.base.pojo.dto;
+
+/**
+ * FileName: QuartzBean
+ * Author:   chenjianhua
+ * Date:     2024/9/17 10:26
+ * Description: ${DESCRIPTION}
+ */
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class QuartzBean implements Serializable {
+    /**
+     * 任务id
+     */
+    private String id;
+
+    /**
+     * 任务名称
+     */
+    private String jobName;
+
+    /**
+     * 任务执行类
+     */
+    private String jobClass;
+
+    /**
+     * 组名
+     */
+    private String groupName;
+
+    /**
+     * 任务 参数信息
+     */
+    private String jobParam;
+
+    /**
+     * 任务状态 启动还是暂停
+     */
+    private Integer status;
+
+    /**
+     * 任务运行时间表达式
+     */
+    private String cronExpression;
+}

+ 6 - 2
service-base/src/main/java/com/simuwang/base/pojo/vo/OpenStatusVO.java

@@ -10,8 +10,12 @@ import lombok.Data;
  */
 @Data
 public class OpenStatusVO {
-
+    /**
+     * 是否开启,0-不开启,1-开启
+     */
     private Integer openStatus;
-
+    /**
+     * 主键ID
+     */
     private Integer id;
 }

+ 6 - 2
service-base/src/main/resources/mapper/MailBoxInfoMapper.xml

@@ -43,9 +43,9 @@
         select id, type, email, password, protocol, server, port, cron, open_status,description,isvalid,creatorid,createtime,updaterid,updatetime
         from PPW_EMAIL.mailbox_info
     </sql>
-    <select id="checkEmailUnique" resultType="com.simuwang.base.pojo.dos.MailboxInfoDO">
+    <select id="selectEmailConfigByEmail" resultType="com.simuwang.base.pojo.dos.MailboxInfoDO">
         <include refid="selectConfigVo"/>
-        where email = #{email} limit 1
+        where email = #{email} and isvalid =1 limit 1
     </select>
     <select id="countEmailConfig" resultType="java.lang.Long"
             parameterType="com.simuwang.base.pojo.dto.query.EmailPageQuery">
@@ -60,5 +60,9 @@
         <include refid="selectConfigVo"/>
         where id = #{id}
     </select>
+    <select id="getAll" resultMap="BaseResultMap">
+        <include refid="selectConfigVo"/>
+        where isvalid = 1
+    </select>
 
 </mapper>

+ 15 - 7
service-manage/src/main/java/com/simuwang/manage/api/email/EmailConfigController.java

@@ -2,10 +2,7 @@ package com.simuwang.manage.api.email;
 
 import com.simuwang.base.common.support.MybatisPage;
 import com.simuwang.base.pojo.dto.query.EmailPageQuery;
-import com.simuwang.base.pojo.vo.IdVO;
-import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
-import com.simuwang.base.pojo.vo.MailboxInfoVO;
-import com.simuwang.base.pojo.vo.OpenStatusVO;
+import com.simuwang.base.pojo.vo.*;
 import com.simuwang.manage.api.base.BaseController;
 import com.simuwang.manage.service.EmailConfigService;
 import com.smppw.common.pojo.ResultVo;
@@ -102,12 +99,23 @@ public class EmailConfigController extends BaseController {
 
     /**
      * 批量删除邮箱配置
-     * @param idVO --idList
+     * @param idListVO
      * @return
      */
     @RequestMapping("delete-email-config")
-    public boolean deleteEmailConfig(@RequestBody IdVO idVO){
-        emailConfigService.deleteEmailConfig(idVO.getId());
+    public boolean deleteEmailConfig(@RequestBody IdListVO idListVO){
+        emailConfigService.deleteEmailConfig(idListVO.getIdList());
+        return true;
+    }
+
+    /**
+     * 立即执行一次
+     * @param idVO
+     * @return
+     */
+    @RequestMapping("run-once")
+    public boolean runOnce(@RequestBody IdVO idVO){
+        emailConfigService.runOnce(idVO.getId());
         return true;
     }
 

+ 65 - 0
service-manage/src/main/java/com/simuwang/manage/init/QuartzConfig.java

@@ -0,0 +1,65 @@
+package com.simuwang.manage.init;
+
+import com.alibaba.fastjson.JSON;
+import com.simuwang.base.common.util.QuartzUtils;
+import com.simuwang.base.pojo.dos.MailboxInfoDO;
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import com.simuwang.base.pojo.dto.QuartzBean;
+import com.simuwang.manage.service.EmailConfigService;
+import org.quartz.Scheduler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+
+import java.util.List;
+
+/**
+ * 定时任务启动类
+ * Author:   chenjianhua
+ * Date:     2024/9/17 11:55
+ * Description: ${DESCRIPTION}
+ */
+@Configuration
+@Order(2)
+public class QuartzConfig implements ApplicationRunner {
+    @Autowired
+    private Scheduler scheduler;
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
+    @Autowired
+    private EmailConfigService emailConfigService;
+
+    @Value("${spring.application.name}")
+    private String groupName;
+    private String JOB_CLASS="com.simuwang.manage.task.ParseSchedulerTask";
+    @Override
+    public void run(ApplicationArguments args){
+        List<MailboxInfoDO> mailboxInfoDOS = emailConfigService.getAll();
+        for(MailboxInfoDO mailboxInfoDO : mailboxInfoDOS){
+            try{
+                QuartzBean quartzBean = new QuartzBean();
+                quartzBean.setCronExpression(mailboxInfoDO.getCron());
+                quartzBean.setStatus(mailboxInfoDO.getOpenStatus());
+                quartzBean.setGroupName(groupName);
+                quartzBean.setJobName(mailboxInfoDO.getEmail());
+                quartzBean.setJobClass(JOB_CLASS);
+                //请求参数
+                MailboxInfoDTO paramDTO = new MailboxInfoDTO();
+                paramDTO.setAccount(mailboxInfoDO.getEmail());
+                paramDTO.setPassword(mailboxInfoDO.getPassword());
+                paramDTO.setPort(mailboxInfoDO.getPort());
+                paramDTO.setHost(mailboxInfoDO.getServer());
+                paramDTO.setProtocol(mailboxInfoDO.getProtocol());
+                quartzBean.setJobParam(JSON.toJSONString(paramDTO));
+                QuartzUtils.createScheduleJob(scheduler,quartzBean);
+            }catch (Exception e) {
+                logger.error(e.getMessage(),e);
+            }
+        }
+    }
+}

+ 8 - 1
service-manage/src/main/java/com/simuwang/manage/service/EmailConfigService.java

@@ -1,6 +1,7 @@
 package com.simuwang.manage.service;
 
 import com.simuwang.base.common.support.MybatisPage;
+import com.simuwang.base.pojo.dos.MailboxInfoDO;
 import com.simuwang.base.pojo.dto.query.EmailPageQuery;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
@@ -22,11 +23,17 @@ public interface EmailConfigService {
 
     ResultVo connectTest(MailboxInfoVO mailboxInfoVO);
 
-    void deleteEmailConfig(Integer id);
+    void deleteEmailConfig(List<Integer> id);
 
     boolean checkEmailUnique(String email);
 
     MailboxInfoVO searchEmailConfigById(Integer id);
 
     void controlEmailConfig(OpenStatusVO openStatusVO);
+
+    List<MailboxInfoDO> getAll();
+
+    MailboxInfoDO selectEmailConfigByEmail(String email);
+
+    void runOnce(Integer id);
 }

+ 69 - 15
service-manage/src/main/java/com/simuwang/manage/service/impl/EmailConfigServiceImpl.java

@@ -1,16 +1,16 @@
 package com.simuwang.manage.service.impl;
 
+import com.alibaba.fastjson.JSON;
 import com.simuwang.base.common.conts.UserConstants;
 import com.simuwang.base.common.enums.EmailCron;
+import com.simuwang.base.common.enums.OpenStatusType;
 import com.simuwang.base.common.enums.ResultCode;
 import com.simuwang.base.common.support.MybatisPage;
-import com.simuwang.base.common.util.DateUtils;
-import com.simuwang.base.common.util.EmailUtil;
-import com.simuwang.base.common.util.StringUtil;
+import com.simuwang.base.common.util.*;
 import com.simuwang.base.mapper.MailboxInfoMapper;
-import com.simuwang.base.pojo.dos.CompanyEmailSendHistoryDO;
 import com.simuwang.base.pojo.dos.MailboxInfoDO;
 import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import com.simuwang.base.pojo.dto.QuartzBean;
 import com.simuwang.base.pojo.dto.query.EmailPageQuery;
 import com.simuwang.base.pojo.vo.MailboxInfoTableVO;
 import com.simuwang.base.pojo.vo.MailboxInfoVO;
@@ -20,7 +20,10 @@ import com.smppw.common.pojo.ResultVo;
 import jakarta.mail.MessagingException;
 import jakarta.mail.Store;
 import org.quartz.Scheduler;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
@@ -42,6 +45,13 @@ public class EmailConfigServiceImpl implements EmailConfigService {
 
     @Autowired
     private Scheduler scheduler;
+
+    @Value("${spring.application.name}")
+    private String groupName;
+
+    private String JOB_CLASS="com.simuwang.manage.task.ParseSchedulerTask";
+    private static final Logger logger = LoggerFactory.getLogger(EmailConfigServiceImpl.class);
+
     @Override
     public MybatisPage<MailboxInfoTableVO> searchEmailConfigList(EmailPageQuery emailPageQuery) {
         List<MailboxInfoDO> mailboxInfoOS = emailConfigMapper.searchEmailConfigList(emailPageQuery);
@@ -49,9 +59,8 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         long total = emailConfigMapper.countEmailConfig(emailPageQuery);
         return MybatisPage.of(total,mailboxInfoTableVOS);
     }
-
     @Override
-    @Transactional
+    @Transactional(rollbackFor=Exception.class)
     public void saveEmailConfig(MailboxInfoVO mailboxInfoVO) {
         MailboxInfoDO mailboxInfoDO = toMailboxInfoDO(mailboxInfoVO);
         if(mailboxInfoVO.getId() == null){
@@ -61,8 +70,32 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         }else{
             emailConfigMapper.updateById(mailboxInfoDO);
         }
+        //添加任务
+        addJob(mailboxInfoVO);
+    }
+    private void addJob(MailboxInfoVO mailboxInfoVO) {
+        try{
+            QuartzUtils.deleteScheduleJob(scheduler,mailboxInfoVO.getEmail());
+            MailboxInfoDO infoDO = emailConfigMapper.selectEmailConfigByEmail(mailboxInfoVO.getEmail());
+            QuartzBean quartzBean = new QuartzBean();
+            quartzBean.setCronExpression(infoDO.getCron());
+            quartzBean.setStatus(infoDO.getOpenStatus());
+            quartzBean.setGroupName(groupName);
+            quartzBean.setJobName(mailboxInfoVO.getEmail());
+            quartzBean.setJobClass(JOB_CLASS);
+            //请求参数
+            MailboxInfoDTO paramDTO = new MailboxInfoDTO();
+            paramDTO.setAccount(infoDO.getEmail());
+            paramDTO.setPassword(infoDO.getPassword());
+            paramDTO.setPort(infoDO.getPort());
+            paramDTO.setHost(infoDO.getServer());
+            paramDTO.setProtocol(infoDO.getProtocol());
+            quartzBean.setJobParam(JSON.toJSONString(paramDTO));
+            QuartzUtils.createScheduleJob(scheduler,quartzBean);
+        }catch (Exception e){
+            logger.error(e.getMessage(),e);
+        }
     }
-
     @Override
     public ResultVo connectTest(MailboxInfoVO mailboxInfoVO) {
         ResultVo vo = new ResultVo(ResultCode.CONNECT_SUCCESS);
@@ -88,37 +121,58 @@ public class EmailConfigServiceImpl implements EmailConfigService {
         vo.setMsg(ResultCode.CONNECT_ERROR.getMsg());
         return vo;
     }
-
     @Override
-    public void deleteEmailConfig(Integer id) {
-        List<Integer> idList = new ArrayList<>();
-        idList.add(id);
+    public void deleteEmailConfig(List<Integer> idList) {
+        //删除定时任务
+        for(Integer id : idList){
+            MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(id);
+            QuartzUtils.deleteScheduleJob(scheduler,mailboxInfoDO.getEmail());
+        }
         emailConfigMapper.deleteEmailConfigByIds(idList);
     }
-
     @Override
     public boolean checkEmailUnique(String email) {
-        MailboxInfoDO mailboxInfoDO = emailConfigMapper.checkEmailUnique(email);
+        MailboxInfoDO mailboxInfoDO = emailConfigMapper.selectEmailConfigByEmail(email);
         if (StringUtil.isNotNull(mailboxInfoDO))
         {
             return UserConstants.NOT_UNIQUE;
         }
         return UserConstants.UNIQUE;
     }
-
     @Override
     public MailboxInfoVO searchEmailConfigById(Integer id) {
         MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(id);
         MailboxInfoVO mailboxInfoVO = mailboxInfoDO.toVo();
         return mailboxInfoVO;
     }
-
     @Override
     public void controlEmailConfig(OpenStatusVO openStatusVO) {
         MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(openStatusVO.getId());
         mailboxInfoDO.setOpenStatus(openStatusVO.getOpenStatus());
         mailboxInfoDO.setUpdateTime(DateUtils.getNowDate());
         emailConfigMapper.updateById(mailboxInfoDO);
+        //设置定时任务
+        if(openStatusVO.getOpenStatus().equals(OpenStatusType.YES.getCode())){
+            QuartzUtils.resumeScheduleJob(scheduler,mailboxInfoDO.getEmail());
+        }else{
+            QuartzUtils.pauseScheduleJob(scheduler,mailboxInfoDO.getEmail());
+        }
+
+    }
+    @Override
+    public List<MailboxInfoDO> getAll() {
+        return emailConfigMapper.getAll();
+    }
+
+    @Override
+    public MailboxInfoDO selectEmailConfigByEmail(String email) {
+        return emailConfigMapper.selectEmailConfigByEmail(email);
+    }
+
+    @Override
+    public void runOnce(Integer id) {
+        MailboxInfoDO mailboxInfoDO = emailConfigMapper.searchEmailConfigById(id);
+        QuartzUtils.runOnce(scheduler,mailboxInfoDO.getEmail());
     }
 
     private MailboxInfoDO toMailboxInfoDO(MailboxInfoVO mailboxInfoVO) {

+ 70 - 0
service-manage/src/main/java/com/simuwang/manage/task/ParseSchedulerTask.java

@@ -0,0 +1,70 @@
+package com.simuwang.manage.task;
+
+import ch.qos.logback.core.util.StringUtil;
+import com.alibaba.fastjson.JSON;
+import com.simuwang.base.common.enums.EmailCron;
+import com.simuwang.base.common.util.DateUtils;
+import com.simuwang.base.common.util.QuartzUtils;
+import com.simuwang.base.pojo.dos.MailboxInfoDO;
+import com.simuwang.base.pojo.dto.MailboxInfoDTO;
+import com.simuwang.daq.service.EmailParseApiService;
+import com.simuwang.manage.service.EmailConfigService;
+import org.quartz.JobDataMap;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.time.Duration;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * FileName: ParseSchedulerTask
+ * Author:   chenjianhua
+ * Date:     2024/9/17 10:48
+ * Description: ${DESCRIPTION}
+ */
+
+public class ParseSchedulerTask  extends QuartzJobBean {
+
+    @Autowired
+    private EmailParseApiService emailParseApiService;
+    @Autowired
+    private EmailConfigService emailConfigService;
+    private static final Logger log = LoggerFactory.getLogger(ParseSchedulerTask.class);
+    @Override
+    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
+        log.info("ParseSchedulerTask {}", context.getJobDetail().getKey());
+        JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
+        log.info("ParseSchedulerTask jobDataMap {}", JSON.toJSONString(jobDataMap));
+        String account = jobDataMap.get("account").toString();
+        String port = jobDataMap.get("port").toString();
+        String protocol = jobDataMap.get("protocol").toString();
+        String host = jobDataMap.get("host").toString();
+        String password = jobDataMap.get("password").toString();
+        MailboxInfoDTO paramDTO = new MailboxInfoDTO();
+        paramDTO.setAccount(account);
+        paramDTO.setPassword(password);
+        paramDTO.setPort(port);
+        paramDTO.setHost(host);
+        paramDTO.setProtocol(protocol);
+        MailboxInfoDO mailboxInfoDO = emailConfigService.selectEmailConfigByEmail(account);
+        if(mailboxInfoDO != null){
+            Date startDate = null;
+            Date endDate = null;
+            if(EmailCron.getEmailCronByCron(mailboxInfoDO.getCron()) == EmailCron.EVERY_HOUR){
+                endDate = DateUtils.getNowDate();
+                startDate = DateUtils.addHours(DateUtils.getNowDate(),-1);;
+            }else if (EmailCron.getEmailCronByCron(mailboxInfoDO.getCron()) == EmailCron.ONE_AM){
+                endDate = DateUtils.getNowDate();
+                startDate = DateUtils.addHours(DateUtils.getNowDate(),-24);;
+            }
+            log.info(account+"开始执行邮件解析任务,时间:"+LocalDateTime.now());
+            emailParseApiService.parseEmail(paramDTO,startDate,endDate);
+            log.info(account+"結束执行邮件解析任务,时间:"+LocalDateTime.now());
+        }
+    }
+}