From 51a208c7715ecfea9faeccd5ee56ed2d0a697c95 Mon Sep 17 00:00:00 2001
From: nidapeng <jp@doumee.com>
Date: 星期六, 20 四月 2024 15:24:28 +0800
Subject: [PATCH] 工作调度

---
 server/dmvisit_admin/src/main/java/com/doumee/api/timer/QuartzController.java         |   54 ++++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/JobState.java        |   29 ++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/LogState.java        |   28 ++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzJob.java       |   50 ++++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java |  146 ++++++++++++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzJobMapper.java |   10 
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/TimerJob.java           |   24 ++
 /dev/null                                                                             |   81 ------
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzRecord.java |   50 ++++
 server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzJobService.java   |  111 +++++++++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/JobService.java         |   11 
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/PrintJob.java           |   20 +
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzLog.java       |   38 +++
 server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzLogMapper.java |   10 
 server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzLogService.java   |   23 +
 15 files changed, 604 insertions(+), 81 deletions(-)

diff --git a/server/dmvisit_admin/src/main/java/com/doumee/api/timer/QuartzController.java b/server/dmvisit_admin/src/main/java/com/doumee/api/timer/QuartzController.java
new file mode 100644
index 0000000..0291c32
--- /dev/null
+++ b/server/dmvisit_admin/src/main/java/com/doumee/api/timer/QuartzController.java
@@ -0,0 +1,54 @@
+package com.doumee.api.timer1;
+
+import com.doumee.entity.QuartzJob;
+import com.doumee.service.QuartzJobService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("/business/quartz")
+@Api(tags = "瀹氭椂浠诲姟鎺ュ彛")
+public class QuartzController  {
+
+    @Resource
+    private QuartzJobService quartzJobService ;
+
+    @ApiOperation( "浠诲姟鏌ヨ")
+    @GetMapping("/job/{id}")
+    public QuartzJob getById(@PathVariable Integer id){
+        return quartzJobService.getById(id) ;
+    }
+
+    @ApiOperation( "浠诲姟鏂板")
+    @PostMapping("/job")
+    public Integer insert(@RequestBody QuartzJob quartzJob){
+        return quartzJobService.insert(quartzJob) ;
+    }
+
+   @ApiOperation( "鏇存柊浠诲姟")
+    @PostMapping("/job/update")
+    public Integer update(@RequestBody QuartzJob quartzJob){
+        return quartzJobService.update(quartzJob) ;
+    }
+
+   @ApiOperation( "鍋滄浠诲姟")
+    @PostMapping("/job/pause/{id}")
+    public void pause(@PathVariable("id") Integer id) {
+        quartzJobService.pause(id);
+    }
+
+   @ApiOperation( "鎭㈠浠诲姟")
+    @PostMapping("/job/resume/{id}")
+    public void resume(@PathVariable("id") Integer id) {
+        quartzJobService.resume(id) ;
+    }
+
+   @ApiOperation( "鎵ц涓�娆�")
+    @GetMapping("/job/runOnce/{id}")
+    public void runOnce(@PathVariable("id") Integer id) {
+        quartzJobService.runOnce(id) ;
+    }
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/JobState.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/JobState.java
new file mode 100644
index 0000000..a4c325c
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/JobState.java
@@ -0,0 +1,29 @@
+package com.doumee.constant;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 10:05
+ */
+public enum JobState {
+
+    JOB_RUN(1, "杩愯"),
+    JOB_STOP(2, "鏆傚仠"),
+    JOB_DEL(3, "鍒犻櫎");
+
+    private int status;
+    private String desc;
+
+    JobState(int status, String desc) {
+        this.status = status;
+        this.desc = desc;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/LogState.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/LogState.java
new file mode 100644
index 0000000..f8cfd30
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/LogState.java
@@ -0,0 +1,28 @@
+package com.doumee.constant;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 10:06
+ */
+public enum LogState {
+
+    LOG_SUS(1, "鎴愬姛"),
+    LOG_FAIL(2, "澶辫触");
+
+    private int status;
+    private String desc;
+
+    LogState(int status, String desc) {
+        this.status = status;
+        this.desc = desc;
+    }
+
+    public int getStatus() {
+        return status;
+    }
+
+    public String getDesc() {
+        return desc;
+    }
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzJob.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzJob.java
new file mode 100644
index 0000000..05c1f32
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzJob.java
@@ -0,0 +1,50 @@
+package com.doumee.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:04
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Schema(description = "QuartzJob瀹炰綋绫�")
+public class QuartzJob implements Serializable {
+    private static final long serialVersionUID = 1L;
+    /**
+     * 浠诲姟璋冨害鍙傛暟key
+     */
+    public static final String JOB_PARAM_KEY = "BOOT_JOB_PARAM_KEY";
+
+    @Schema(description = "浠诲姟id")
+    @TableId(value = "id",type = IdType.AUTO)
+    private Integer id;
+
+    @Schema(description = "Bean鍚嶇О")
+    private String beanName;
+
+    @Schema(description = "鎵ц鍙傛暟")
+    private String params;
+
+    @Schema(description = "Cron琛ㄨ揪寮�")
+    private String cronExpres;
+
+    @Schema(description = "浠诲姟鐘舵�侊細1姝e父锛�2鏆傚仠锛�3鍒犻櫎")
+    private Integer state;
+
+    @Schema(description = "澶囨敞")
+    private String remark;
+
+    @Schema(description = "鍒涘缓鏃堕棿")
+    private Date createTime;
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzLog.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzLog.java
new file mode 100644
index 0000000..40cfb92
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/entity/QuartzLog.java
@@ -0,0 +1,38 @@
+package com.doumee.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+/**
+ *
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:04
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class QuartzLog {
+
+    @TableId(value = "id",type = IdType.AUTO)
+    private Long id;
+
+    private Integer jobId;
+
+    private String beanName;
+
+    private String params;
+
+    private Integer state;
+
+    private String error;
+
+    private Integer times;
+
+    private Date createTime;
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/JobService.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/JobService.java
new file mode 100644
index 0000000..754e1ba
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/JobService.java
@@ -0,0 +1,11 @@
+package com.doumee.job;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:43
+ */
+public interface JobService {
+
+    void run(String params);
+
+}
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/PrintJob.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/PrintJob.java
new file mode 100644
index 0000000..40f67b9
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/PrintJob.java
@@ -0,0 +1,20 @@
+package com.doumee.job;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:44
+ */
+@Component("printJob")
+public class PrintJob implements JobService {
+
+    private static final Logger log = LoggerFactory.getLogger(PrintJob.class);
+
+    @Override
+    public void run(String params) {
+        log.info("\n ======== \n print-job-params:{} \n ========",params);
+    }
+}
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/TimerJob.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/TimerJob.java
new file mode 100644
index 0000000..2b75c41
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/job/TimerJob.java
@@ -0,0 +1,24 @@
+package com.doumee.job;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 14:51
+ */
+@Component("timerJob")
+public class TimerJob implements JobService {
+
+    private static final Logger log = LoggerFactory.getLogger(TimerJob.class);
+    private static final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss") ;
+
+    @Override
+    public void run(String params) {
+        log.info("\n ======== \n timer-job-params:{} \n ========",params);
+        log.info("time-now:{}",format.format(new Date()));
+    }
+}
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzJobMapper.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzJobMapper.java
new file mode 100644
index 0000000..8c0a355
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzJobMapper.java
@@ -0,0 +1,10 @@
+package com.doumee.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.entity.QuartzJob;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QuartzJobMapper extends BaseMapper<QuartzJob> {
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzLogMapper.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzLogMapper.java
new file mode 100644
index 0000000..70f6159
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/mapper/QuartzLogMapper.java
@@ -0,0 +1,10 @@
+package com.doumee.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.entity.QuartzLog;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QuartzLogMapper extends BaseMapper<QuartzLog> {
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java
new file mode 100644
index 0000000..50ad1f9
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzManage.java
@@ -0,0 +1,146 @@
+package com.doumee.scheduler;
+
+import com.doumee.constant.JobState;
+import com.doumee.entity.QuartzJob;
+import org.quartz.*;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+
+/**
+ * 浠诲姟鎿嶄綔鍩虹灏佽
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 14:04
+ */
+@Component
+public class QuartzManage {
+
+    private static final String SCHEDULE_NAME = "BOOT_JOB_" ;
+
+    @Resource
+    private Scheduler scheduler ;
+
+    /**
+     * 瑙﹀彂鍣� KEY
+     */
+    public TriggerKey getTriggerKey(Integer jobId){
+        return TriggerKey.triggerKey(SCHEDULE_NAME+jobId) ;
+    }
+
+    /**
+     * 瀹氭椂浠诲姟 Key
+     */
+    public JobKey getJobKey (Integer jobId){
+        return JobKey.jobKey(SCHEDULE_NAME+jobId) ;
+    }
+
+    /**
+     * 琛ㄨ揪寮忚Е鍙戝櫒
+     */
+    public org.quartz.CronTrigger getCronTrigger (Integer jobId){
+        try {
+            return (CronTrigger) this.scheduler.getTrigger(getTriggerKey(jobId)) ;
+        } catch (SchedulerException e){
+            throw new RuntimeException("getCronTrigger Fail",e) ;
+        }
+    }
+
+    /**
+     * 鍒涘缓瀹氭椂鍣�
+     */
+    public void createJob (QuartzJob quartzJob){
+        try {
+            // 鏋勫缓浠诲姟
+            JobDetail jobDetail = JobBuilder.newJob(QuartzRecord.class)
+                                            .withIdentity(getJobKey(quartzJob.getId())).build() ;
+
+            // 鏋勫缓Cron璋冨害鍣�
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
+                                                .cronSchedule(quartzJob.getCronExpres())
+                                                .withMisfireHandlingInstructionDoNothing() ;
+            // 浠诲姟瑙﹀彂鍣�
+            org.quartz.CronTrigger trigger = TriggerBuilder.newTrigger()
+                                                .withIdentity(getTriggerKey(quartzJob.getId()))
+                                                .withSchedule(scheduleBuilder).build() ;
+            jobDetail.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY,quartzJob);
+            scheduler.scheduleJob(jobDetail,trigger) ;
+            // 鐘舵�佹牎楠�
+            checkStop(quartzJob) ;
+        } catch (SchedulerException e){
+            throw new RuntimeException("createJob Fail",e) ;
+        }
+    }
+
+    /**
+     * 鏇存柊瀹氭椂浠诲姟
+     */
+    public void updateJob(QuartzJob quartzJob) {
+        try {
+            // 鏌ヨ瑙﹀彂鍣↘ey
+            TriggerKey triggerKey = getTriggerKey(quartzJob.getId());
+            // 鏋勫缓Cron璋冨害鍣�
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
+                                                .cronSchedule(quartzJob.getCronExpres())
+                                                .withMisfireHandlingInstructionDoNothing();
+            // 浠诲姟瑙﹀彂鍣�
+            org.quartz.CronTrigger trigger = getCronTrigger(quartzJob.getId())
+                                .getTriggerBuilder().withIdentity(triggerKey)
+                                .withSchedule(scheduleBuilder).build();
+            trigger.getJobDataMap().put(QuartzJob.JOB_PARAM_KEY, quartzJob);
+            scheduler.rescheduleJob(triggerKey, trigger);
+            // 鐘舵�佹牎楠�
+            checkStop(quartzJob) ;
+        } catch (SchedulerException e) {
+            throw new RuntimeException("updateJob Fail",e) ;
+        }
+    }
+
+    /**
+     * 鎭㈠瀹氭椂鍣�
+     */
+    public void resumeJob (Integer jobId){
+        try {
+            this.scheduler.resumeJob(getJobKey(jobId));
+        } catch (SchedulerException e){
+            throw new RuntimeException("resumeJob Fail",e) ;
+        }
+    }
+
+    /**
+     * 鍒犻櫎瀹氭椂鍣�
+     */
+    public void deleteJob (Integer jobId){
+        try {
+            scheduler.deleteJob(getJobKey(jobId));
+        } catch (SchedulerException e){
+            throw new RuntimeException("deleteJob Fail",e) ;
+        }
+    }
+
+    /**
+     * 鎵ц瀹氭椂鍣�
+     */
+    public void run (QuartzJob quartzJob){
+        try {
+            JobDataMap dataMap = new JobDataMap() ;
+            dataMap.put(QuartzJob.JOB_PARAM_KEY,quartzJob);
+            this.scheduler.triggerJob(getJobKey(quartzJob.getId()),dataMap);
+        } catch (SchedulerException e){
+            throw new RuntimeException("run Fail",e) ;
+        }
+    }
+
+    /**
+     * 鏍¢獙鍋滄瀹氭椂鍣�
+     */
+    public void checkStop (QuartzJob quartzJob){
+        try {
+            if(quartzJob.getState() != JobState.JOB_RUN.getStatus()){
+                this.scheduler.pauseJob(getJobKey(quartzJob.getId()));
+            }
+        } catch (SchedulerException e){
+            throw new RuntimeException("pauseJob Fail",e) ;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzRecord.java b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzRecord.java
new file mode 100644
index 0000000..f8889af
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/dao/timer/scheduler/QuartzRecord.java
@@ -0,0 +1,50 @@
+package com.doumee.scheduler;
+
+import com.doumee.constant.LogState;
+import com.doumee.entity.QuartzJob;
+import com.doumee.entity.QuartzLog;
+import com.doumee.service.QuartzLogService;
+import org.quartz.JobExecutionContext;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * 浠诲姟璁板綍
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 10:21
+ */
+public class QuartzRecord extends QuartzJobBean {
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        QuartzJob quartzJob = (QuartzJob)context.getMergedJobDataMap().get(QuartzJob.JOB_PARAM_KEY) ;
+        QuartzLogService quartzLogService = (QuartzLogService)SpringContextUtil.getBean("quartzLogService") ;
+        // 瀹氭椂鍣ㄦ棩蹇楄褰�
+        QuartzLog quartzLog = new QuartzLog () ;
+        quartzLog.setJobId(quartzJob.getId());
+        quartzLog.setBeanName(quartzJob.getBeanName());
+        quartzLog.setParams(quartzJob.getParams());
+        quartzLog.setCreateTime(new Date());
+        long beginTime = System.currentTimeMillis() ;
+        try {
+            // 鍔犺浇骞舵墽琛�
+            Object target = SpringContextUtil.getBean(quartzJob.getBeanName());
+            Method method = target.getClass().getDeclaredMethod("run", String.class);
+            method.invoke(target, quartzJob.getParams());
+            long executeTime = System.currentTimeMillis() - beginTime;
+            quartzLog.setTimes((int)executeTime);
+            quartzLog.setState(LogState.LOG_SUS.getStatus());
+        } catch (Exception e){
+            // 寮傚父淇℃伅
+            long executeTime = System.currentTimeMillis() - beginTime;
+            quartzLog.setTimes((int)executeTime);
+            quartzLog.setState(LogState.LOG_FAIL.getStatus());
+            quartzLog.setError(e.getMessage());
+        } finally {
+            // 淇濆瓨鎵ц鏃ュ織
+            quartzLogService.insert(quartzLog) ;
+        }
+    }
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzJobService.java b/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzJobService.java
new file mode 100644
index 0000000..efc2738
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzJobService.java
@@ -0,0 +1,111 @@
+package com.doumee.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.doumee.constant.JobState;
+import com.doumee.entity.QuartzJob;
+import com.doumee.mapper.QuartzJobMapper;
+import com.doumee.scheduler.QuartzManage;
+import org.quartz.CronTrigger;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:08
+ */
+@Service
+public class QuartzJobService {
+
+    @Resource
+    private QuartzJobMapper quartzJobMapper ;
+
+    @Resource
+    private QuartzManage quartzManage;
+
+    /**
+     * 鍒濆鍖栧姞杞藉畾鏃朵换鍔�
+     */
+    @PostConstruct
+    public void init () {
+        LambdaQueryWrapper<QuartzJob> queryWrapper = new LambdaQueryWrapper<>() ;
+        queryWrapper.in(QuartzJob::getState, JobState.JOB_RUN.getStatus(),JobState.JOB_STOP.getStatus());
+        List<QuartzJob> jobList = quartzJobMapper.selectList(queryWrapper);
+        jobList.forEach(quartzJob -> {
+            CronTrigger cronTrigger = quartzManage.getCronTrigger(quartzJob.getId()) ;
+            if (Objects.isNull(cronTrigger)){
+                quartzManage.createJob(quartzJob);
+            } else {
+                quartzManage.updateJob(quartzJob);
+            }
+        });
+    }
+
+    /**
+     * 浠诲姟涓婚敭鏌ヨ
+     */
+    public QuartzJob getById(Integer id) {
+        return quartzJobMapper.selectById(id) ;
+    }
+
+    /**
+     * 鏂板浠诲姟
+     */
+    public int insert(QuartzJob quartzJob) {
+        int flag = quartzJobMapper.insert(quartzJob) ;
+        if (flag > 0){
+            quartzManage.createJob(quartzJob) ;
+        }
+        return flag;
+    }
+
+    /**
+     * 鏇存柊浠诲姟
+     */
+    public int update(QuartzJob quartzJob) {
+        int flag = quartzJobMapper.updateById(quartzJob);
+        if (flag > 0){
+            quartzManage.updateJob(quartzJob);
+        }
+        return flag ;
+    }
+
+    /**
+     * 鏆傚仠浠诲姟
+     */
+    public void pause(Integer id) {
+        QuartzJob quartzJob = quartzJobMapper.selectById(id) ;
+        if (!Objects.isNull(quartzJob)){
+            quartzJob.setState(JobState.JOB_STOP.getStatus());
+            if (quartzJobMapper.updateById(quartzJob)>0){
+                quartzManage.checkStop(quartzJob);
+            }
+        }
+    }
+
+    /**
+     * 鎭㈠浠诲姟
+     */
+    public void resume(Integer id) {
+        QuartzJob quartzJob = quartzJobMapper.selectById(id) ;
+        if (!Objects.isNull(quartzJob)){
+            quartzJob.setState(JobState.JOB_RUN.getStatus());
+            if (quartzJobMapper.updateById(quartzJob)>0){
+                quartzManage.resumeJob(id);
+            }
+        }
+    }
+
+    /**
+     * 鎵ц浠诲姟涓�娆�
+     */
+    public void runOnce(Integer id) {
+        QuartzJob quartzJob = quartzJobMapper.selectById(id) ;
+        if (!Objects.isNull(quartzJob) && quartzJob.getState() != JobState.JOB_DEL.getStatus()){
+            quartzManage.run(quartzJob);
+        }
+    }
+}
\ No newline at end of file
diff --git a/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzLogService.java b/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzLogService.java
new file mode 100644
index 0000000..93a4ec4
--- /dev/null
+++ b/server/dmvisit_service/src/main/java/com/doumee/service/timer/QuartzLogService.java
@@ -0,0 +1,23 @@
+package com.doumee.service;
+
+import com.doumee.entity.QuartzLog;
+import com.doumee.mapper.QuartzLogMapper;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+/**
+ *
+ * @author 鍏紬鍙�:鐭ヤ簡涓�绗�
+ * @since 2023-07-26 11:02
+ */
+@Service("quartzLogService")
+public class QuartzLogService {
+
+    @Resource
+    private QuartzLogMapper quartzLogMapper ;
+
+    public Integer insert(QuartzLog quartzLog) {
+        return quartzLogMapper.insert(quartzLog);
+    }
+}
diff --git a/server/dmvisit_service/src/main/resources/application-proHS.yml b/server/dmvisit_service/src/main/resources/application-proHS.yml
deleted file mode 100644
index 05e27a4..0000000
--- a/server/dmvisit_service/src/main/resources/application-proHS.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-spring:
-  # 鏁版嵁婧愰厤缃�
-  datasource:
-    url: jdbc:mysql://10.10.99.68:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: root
-    password: Hs@20240307
-    driver-class-name: com.mysql.cj.jdbc.Driver
-    type: com.alibaba.druid.pool.DruidDataSource
-  redis:
-    #    database: 0
-    host: 127.0.0.1
-    port: 6379
-    password:
-    timeout: 5000      # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
-  jackson:
-    time-zone: GMT+8
-    date-format: yyyy-MM-dd HH:mm:ss
-
-#rocketmq:
-#  namesrvAddr: rmq-cn-pe335rcnn06.cn-shanghai.rmq.aliyuncs.com:8080
-#  groupId: GID-wakatest
-#  topic: waka-test
-#  username: 4derRb4Sw5EkqUMI
-#  password: v50N97wf4av8Q8I4
-
-knife4j:
-  enable: true
-  basic:
-    enable: true
-    username: admin
-    password: 111111
-
-debug_model: false
-
-# Swagger閰嶇疆
-swagger:
-  host: dmtest.ahapp.net
-  title: ${project.name}鎺ュ彛鏂囨。
-  description: ${project.name}鎺ュ彛鏂囨。
-  enabled: true
-  context-path: /erp_interface
-  # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
-  redirect-uri: /
-
-########################鍚屾鏁版嵁妯″紡  ########################
-data-sync:
-  org-user-data-origin: 1 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
-  visitor-data-origin: 1 #璁垮鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
-  need-deal-img: true #鏄惁闇�瑕佸鐞嗗浘鐗囨暟鎹�
-
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-wx:
-  pay:
-    appId: wxfab6da18632e28de
-    appSecret: 4ee3b22afa90287834319fc3c1635271
-    mchId: 1229817002
-    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    notifyUrl: https://dmtest.ahapp.net/smartmeeting_interface/web/api/wxPayNotify
-    keyPath: /usr/local/apiclient_cert.p12
-
-tencent:
-  map:
-    remoteHost: https://apis.map.qq.com
-    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
-
-
-des_pwd: 123456SDFKDJF
-
-## MQTT##
-mqtt:
-  host: tcp://192.168.10.198:1883
-  userName: root
-  passWord: 123456
-  qos: 1
-  clientId: ClientId_local #ClientId_local蹇呴』鍞竴 姣斿浣犲凡缁忓畾浜嗗彨ABC  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
-  timeout: 10
-  keepalive: 20
-  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
-  topic2: A/cmd/resp
-  topic3: ABCF
-  topic4: ABCH
diff --git a/server/dmvisit_service/src/main/resources/application-testHS.yml b/server/dmvisit_service/src/main/resources/application-testHS.yml
deleted file mode 100644
index 2680b48..0000000
--- a/server/dmvisit_service/src/main/resources/application-testHS.yml
+++ /dev/null
@@ -1,81 +0,0 @@
-spring:
-  # 鏁版嵁婧愰厤缃�
-  datasource:
-    url: jdbc:mysql://10.10.99.63:3306/visit?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
-    username: root
-    password: HS!20240227
-    driver-class-name: com.mysql.cj.jdbc.Driver
-    type: com.alibaba.druid.pool.DruidDataSource
-  redis:
-    #    database: 0
-    host: 127.0.0.1
-    port: 6379
-    password: huasun618
-    timeout: 5000      # 杩炴帴姹犱腑鐨勬渶灏忕┖闂茶繛鎺�
-  jackson:
-    time-zone: GMT+8
-    date-format: yyyy-MM-dd HH:mm:ss
-
-#rocketmq:
-#  namesrvAddr: rmq-cn-pe335rcnn06.cn-shanghai.rmq.aliyuncs.com:8080
-#  groupId: GID-wakatest
-#  topic: waka-test
-#  username: 4derRb4Sw5EkqUMI
-#  password: v50N97wf4av8Q8I4
-
-knife4j:
-  enable: true
-  basic:
-    enable: true
-    username: admin
-    password: 111111
-
-debug_model: true
-
-# Swagger閰嶇疆
-swagger:
-  host: dmtest.ahapp.net
-  title: ${project.name}鎺ュ彛鏂囨。
-  description: ${project.name}鎺ュ彛鏂囨。
-  enabled: true
-  context-path: /erp_interface
-  # 绂佺敤swagger鏃剁殑閲嶅畾鍚戝湴鍧�
-  redirect-uri: /
-
-########################鍚屾鏁版嵁妯″紡  ########################
-data-sync:
-  org-user-data-origin: 1 #缁勭粐鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
-  visitor-data-origin: 1 #璁垮鏁版嵁 0鑷缓 2浠ユ捣搴蜂负涓� 1鍗庢櫉ERP绯荤粺
-  need-deal-img: true #鏄惁闇�瑕佸鐞嗗浘鐗囨暟鎹�
-
-########################寰俊鏀粯鐩稿叧閰嶇疆########################
-wx:
-  pay:
-    appId: wxfab6da18632e28de
-    appSecret: 4ee3b22afa90287834319fc3c1635271
-    mchId: 1229817002
-    mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
-    notifyUrl: https://dmtest.ahapp.net/smartmeeting_interface/web/api/wxPayNotify
-    keyPath: /usr/local/apiclient_cert.p12
-
-tencent:
-  map:
-    remoteHost: https://apis.map.qq.com
-    appKey: 3AYBZ-I5R3V-2BVP3-UWBDQ-ETBM5-B2BBQ
-
-
-des_pwd: 123456SDFKDJF
-
-## MQTT##
-mqtt:
-  host: tcp://192.168.10.198:1883
-  userName: root
-  passWord: 123456
-  qos: 1
-  clientId: ClientId_local #ClientId_local蹇呴』鍞竴 姣斿浣犲凡缁忓畾浜嗗彨ABC  閭d綘灏变竴鐩村彨ABC  鍏朵粬鍦版柟灏变笉瑕佷娇鐢ˋBC浜�
-  timeout: 10
-  keepalive: 20
-  topic1: A/pick/warn/#  #绗﹀彿鏄唬琛ㄦ暣涓獁arn涓嬮潰鐨勫叏閮ㄥ瓙涓婚 娌℃湁鐞嗚В鐨勮瘽 鍙互鐧惧害浠旂粏鐞嗚В涓�涓�
-  topic2: A/cmd/resp
-  topic3: ABCF
-  topic4: ABCH

--
Gitblit v1.9.3