From 1c929141597ff5ccbc0d56725526141b396ccf7e Mon Sep 17 00:00:00 2001
From: liriming <1343021927@qq.com>
Date: 星期四, 06 二月 2025 09:02:22 +0800
Subject: [PATCH] 添加清理数据定时任务

---
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/init/JobCommandLineRunner.java                           |   38 +
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/utils/ScheduleJob.java                                      |    7 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java        |   10 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAlarmMessageServiceImpl.java   |    6 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobEntity.java                            |   58 +
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictAlarmMessageDao.xml                                         |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobLogDao.java                               |   17 
 iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/config/ScheduleJobListConfig.java                           |   23 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordDetailServiceImpl.java |    6 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobController.java              |  127 ++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java       |    6 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleJobListConfig.java                        |   27 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java      |    7 
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmItemResultJsonDao.xml                                              |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleJob.java                                   |   87 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobLogDTO.java                               |   53 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/package-info.java                             |    1 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/vo/ScheduleJobReqVO.java                                 |   23 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanStScheduleSuggestTask.java                     |   46 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleUtils.java                                 |  153 +++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java                       |    5 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java                                  |  292 +++++++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanMmPredictAlarmMessageTask.java                 |   46 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAlarmMessageService.java            |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAlarmMessageDao.java                    |    5 
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDetailDao.xml                                        |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmItemResultJsonDao.java                         |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordDetailService.java          |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java                 |    3 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobLogController.java           |   62 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java                |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleSuggestService.java               |    4 
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml                                              |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobLogEntity.java                         |   59 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanItemResultJsonTask.java                        |   47 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobServiceImpl.java                 |  124 ++++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanScheduleRecordTask.java                        |   50 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/ITask.java                                          |   25 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobLogServiceImpl.java              |   54 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDetailDao.java                  |    4 
 iailab-module-model/iailab-module-model-biz/pom.xml                                                                                            |    5 
 iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleSuggestDao.xml                                             |    8 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobDTO.java                                  |   62 ++
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobDao.java                                  |   34 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobService.java                          |   55 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java                        |    4 
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleConfig.java                               |   58 +
 iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobLogService.java                       |   28 
 48 files changed, 1,768 insertions(+), 4 deletions(-)

diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/config/ScheduleJobListConfig.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/config/ScheduleJobListConfig.java
new file mode 100644
index 0000000..d52df17
--- /dev/null
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/config/ScheduleJobListConfig.java
@@ -0,0 +1,23 @@
+package com.iailab.module.data.job.config;
+
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月06日
+ */
+@Component
+public class ScheduleJobListConfig {
+    public static List<String> scheduleJobList = new ArrayList<>();
+
+    public ScheduleJobListConfig() {
+        scheduleJobList.add("CleanItemResultJsonTask");
+        scheduleJobList.add("CleanMmPredictAlarmMessageTask");
+        scheduleJobList.add("CleanScheduleRecordTask");
+        scheduleJobList.add("CleanStScheduleSuggestTask");
+    }
+}
diff --git a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/utils/ScheduleJob.java b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/utils/ScheduleJob.java
index bc3eaad..c4c5bbe 100644
--- a/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/utils/ScheduleJob.java
+++ b/iailab-module-data/iailab-module-data-biz/src/main/java/com/iailab/module/data/job/utils/ScheduleJob.java
@@ -4,6 +4,7 @@
 import com.iailab.framework.common.exception.ExceptionUtils;
 import com.iailab.framework.common.util.spring.SpringContextUtils;
 import com.iailab.framework.tenant.core.context.TenantContextHolder;
+import com.iailab.module.data.job.config.ScheduleJobListConfig;
 import com.iailab.module.data.job.entity.ScheduleJobEntity;
 import com.iailab.module.data.job.entity.ScheduleJobLogEntity;
 import com.iailab.module.data.job.service.ScheduleJobLogService;
@@ -31,6 +32,12 @@
         ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap().
 				get(ScheduleUtils.JOB_PARAM_KEY);
 
+		// 过滤定时任务
+		if (ScheduleJobListConfig.scheduleJobList.contains(scheduleJob.getBeanName())) {
+			logger.info("过滤定时任务,BeanName=" + scheduleJob.getBeanName());
+			return;
+		}
+
         //设置当前租户
 		TenantContextHolder.setTenantId(scheduleJob.getTenantId());
 		Long tenantId = TenantContextHolder.getRequiredTenantId();
diff --git a/iailab-module-model/iailab-module-model-biz/pom.xml b/iailab-module-model/iailab-module-model-biz/pom.xml
index 5f11ebd..ce7bdcb 100644
--- a/iailab-module-model/iailab-module-model-biz/pom.xml
+++ b/iailab-module-model/iailab-module-model-biz/pom.xml
@@ -158,6 +158,11 @@
             <version>6.8.0</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+            <version>2.3.2</version>
+        </dependency>
 
     </dependencies>
 
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java
new file mode 100644
index 0000000..2d4fddc
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/common/utils/DateUtils.java
@@ -0,0 +1,292 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ * <p>
+ * https://www.renren.io
+ * <p>
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.common.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.joda.time.DateTime;
+import org.joda.time.LocalDate;
+import org.joda.time.format.DateTimeFormat;
+import org.joda.time.format.DateTimeFormatter;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 日期处理
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class DateUtils {
+    /** 时间格式(yyyy-MM-dd) */
+    public final static String DATE_PATTERN = "yyyy-MM-dd";
+    /** 时间格式(yyyy-MM-dd HH:mm:ss) */
+    public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+
+    public final static String DATE_TIME_PATTERN_MIN = "yyyy-MM-dd HH:mm";
+
+    public final static String TIME2_PATTERN = "mmss";
+
+    public final static String DATE_PATTERN_MON = "yyyy-MM";
+
+    public final static String DATE_PATTERN_YEAR = "yyyy";
+
+    /**
+     * 日期格式化 日期格式为:yyyy-MM-dd
+     * @param date  日期
+     * @return 返回yyyy-MM-dd格式日期
+     */
+    public static String format(Date date) {
+        return format(date, DATE_PATTERN);
+    }
+
+    /**
+     * 日期格式化 日期格式为:yyyy-MM-dd
+     * @param date  日期
+     * @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN
+     * @return 返回yyyy-MM-dd格式日期
+     */
+    public static String format(Date date, String pattern) {
+        if (date != null) {
+            SimpleDateFormat df = new SimpleDateFormat(pattern);
+            return df.format(date);
+        }
+        return null;
+    }
+
+    /**
+     * 日期解析
+     * @param date  日期
+     * @param pattern  格式,如:DateUtils.DATE_TIME_PATTERN
+     * @return 返回Date
+     */
+    public static Date parse(String date, String pattern) {
+        try {
+            return new SimpleDateFormat(pattern).parse(date);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    /**
+     * 字符串转换成日期
+     * @param strDate 日期字符串
+     * @param pattern 日期的格式,如:DateUtils.DATE_TIME_PATTERN
+     */
+    public static Date stringToDate(String strDate, String pattern) {
+        if (StringUtils.isBlank(strDate)) {
+            return null;
+        }
+
+        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
+        return fmt.parseLocalDateTime(strDate).toDate();
+    }
+
+    /**
+     * 根据周数,获取开始日期、结束日期
+     * @param week  周期  0本周,-1上周,-2上上周,1下周,2下下周
+     * @return 返回date[0]开始日期、date[1]结束日期
+     */
+    public static Date[] getWeekStartAndEnd(int week) {
+        DateTime dateTime = new DateTime();
+        LocalDate date = new LocalDate(dateTime.plusWeeks(week));
+
+        date = date.dayOfWeek().withMinimumValue();
+        Date beginDate = date.toDate();
+        Date endDate = date.plusDays(6).toDate();
+        return new Date[]{beginDate, endDate};
+    }
+
+    /**
+     * 对日期的【秒】进行加/减
+     *
+     * @param date 日期
+     * @param seconds 秒数,负数为减
+     * @return 加/减几秒后的日期
+     */
+    public static Date addDateSeconds(Date date, int seconds) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusSeconds(seconds).toDate();
+    }
+
+    /**
+     * 对日期的【分钟】进行加/减
+     *
+     * @param date 日期
+     * @param minutes 分钟数,负数为减
+     * @return 加/减几分钟后的日期
+     */
+    public static Date addDateMinutes(Date date, int minutes) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusMinutes(minutes).toDate();
+    }
+
+    /**
+     * 对日期的【小时】进行加/减
+     *
+     * @param date 日期
+     * @param hours 小时数,负数为减
+     * @return 加/减几小时后的日期
+     */
+    public static Date addDateHours(Date date, int hours) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusHours(hours).toDate();
+    }
+
+    /**
+     * 对日期的【天】进行加/减
+     *
+     * @param date 日期
+     * @param days 天数,负数为减
+     * @return 加/减几天后的日期
+     */
+    public static Date addDateDays(Date date, int days) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusDays(days).toDate();
+    }
+
+    /**
+     * 对日期的【周】进行加/减
+     *
+     * @param date 日期
+     * @param weeks 周数,负数为减
+     * @return 加/减几周后的日期
+     */
+    public static Date addDateWeeks(Date date, int weeks) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusWeeks(weeks).toDate();
+    }
+
+    /**
+     * 对日期的【月】进行加/减
+     *
+     * @param date 日期
+     * @param months 月数,负数为减
+     * @return 加/减几月后的日期
+     */
+    public static Date addDateMonths(Date date, int months) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusMonths(months).toDate();
+    }
+
+    /**
+     * 对日期的【年】进行加/减
+     *
+     * @param date 日期
+     * @param years 年数,负数为减
+     * @return 加/减几年后的日期
+     */
+    public static Date addDateYears(Date date, int years) {
+        DateTime dateTime = new DateTime(date);
+        return dateTime.plusYears(years).toDate();
+    }
+
+    public static List<String> getDays(Date startDate, Date endDate) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+
+        while (calendar.getTime().compareTo(endDate) < 0) {
+            days.add(DateUtils.format(calendar.getTime(), "yyyy-MM-dd"));
+            calendar.add(6, 1);
+        }
+        return days;
+    }
+
+    public static Date getTime(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        return calendar.getTime();
+    }
+
+    public static List<String> getYearTime(Date startDate, Date endDate) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+
+        while (calendar.getTime().compareTo(endDate) <= 0) {
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN_YEAR));
+            calendar.add(Calendar.YEAR, 1);
+        }
+        return days;
+    }
+
+    public static List<String> getMonTime(Date startDate, Date endDate) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+
+        while (calendar.getTime().compareTo(endDate) <= 0) {
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN_MON));
+            calendar.add(Calendar.MONTH, 1);
+        }
+        return days;
+    }
+
+    public static List<String> getDayTime(Date startDate, Date endDate) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+
+        while (calendar.getTime().compareTo(endDate) <= 0) {
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN));
+            calendar.add(Calendar.DAY_OF_YEAR, 1);
+        }
+        return days;
+    }
+
+    public static List<String> getDayTime(Date startDate, Date endDate, int seconds) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+        while (calendar.getTime().compareTo(endDate) <= 0) {
+            days.add(DateUtils.format(calendar.getTime(), DATE_TIME_PATTERN));
+            calendar.add(Calendar.SECOND, seconds);
+        }
+        return days;
+    }
+
+    public static List<String> getClassTime(Date startDate, Date endDate) {
+        List<String> days = new ArrayList<String>();
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(startDate);
+        while (calendar.getTime().compareTo(endDate) <= 0) {
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN) + " 0点班");
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN) + " 8点班");
+            days.add(DateUtils.format(calendar.getTime(), DATE_PATTERN) + " 16点班");
+            calendar.add(Calendar.DAY_OF_YEAR, 1);
+        }
+        return days;
+    }
+
+
+    public static Map<String, Date> getIntervalDate(int days) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.add(Calendar.DAY_OF_YEAR, days);
+        calendar.set(Calendar.MILLISECOND, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Date tEndDate = calendar.getTime();
+        calendar.add(Calendar.HOUR_OF_DAY, -1);
+        Date tStartDate = calendar.getTime();
+        Map<String, Date> tMap = new HashMap<String, Date>(2);
+        tMap.put("startdate", tStartDate);
+        tMap.put("enddate", tEndDate);
+        return tMap;
+
+    }
+
+    public static boolean isNotBlank(Date date) {
+        if (date == null) {
+            return false;
+        }
+        return true;
+    }
+
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleConfig.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleConfig.java
new file mode 100644
index 0000000..f5be213
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleConfig.java
@@ -0,0 +1,58 @@
+package com.iailab.module.model.job.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+
+import javax.sql.DataSource;
+import java.util.Properties;
+
+/**
+ * 定时任务配置
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Configuration
+public class ScheduleConfig {
+
+    @Bean
+    public SchedulerFactoryBean schedulerFactoryBean(DataSource dataSource) {
+        SchedulerFactoryBean factory = new SchedulerFactoryBean();
+        factory.setDataSource(dataSource);
+
+        //quartz参数
+        Properties prop = new Properties();
+        prop.put("org.quartz.scheduler.instanceName", "IailabModelScheduler");
+        prop.put("org.quartz.scheduler.instanceId", "AUTO");
+        //线程池配置
+        prop.put("org.quartz.threadPool.class", "org.quartz.simpl.SimpleThreadPool");
+        prop.put("org.quartz.threadPool.threadCount", "20");
+        prop.put("org.quartz.threadPool.threadPriority", "5");
+        //JobStore配置
+        prop.put("org.quartz.jobStore.class", "org.springframework.scheduling.quartz.LocalDataSourceJobStore");
+        //集群配置
+        prop.put("org.quartz.jobStore.isClustered", "false");
+        prop.put("org.quartz.jobStore.clusterCheckinInterval", "15000");
+        prop.put("org.quartz.jobStore.maxMisfiresToHandleAtATime", "1");
+
+        prop.put("org.quartz.jobStore.misfireThreshold", "12000");
+        prop.put("org.quartz.jobStore.tablePrefix", "QRTZ_");
+        prop.put("org.quartz.jobStore.selectWithLockSQL", "SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?");
+
+        //PostgreSQL数据库,需要打开此注释
+        //prop.put("org.quartz.jobStore.driverDelegateClass", "org.quartz.impl.jdbcjobstore.PostgreSQLDelegate");
+
+        factory.setQuartzProperties(prop);
+
+        factory.setSchedulerName("IailabModelScheduler");
+        //延时启动
+        factory.setStartupDelay(30);
+        factory.setApplicationContextSchedulerContextKey("applicationContextKey");
+        //可选,QuartzScheduler 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
+        factory.setOverwriteExistingJobs(true);
+        //设置自动启动,默认为true
+        factory.setAutoStartup(true);
+
+        return factory;
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleJobListConfig.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleJobListConfig.java
new file mode 100644
index 0000000..b62cef0
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/config/ScheduleJobListConfig.java
@@ -0,0 +1,27 @@
+package com.iailab.module.model.job.config;
+
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月06日
+ */
+@Component
+public class ScheduleJobListConfig {
+    public static List<String> scheduleJobList = new ArrayList<>();
+
+    public ScheduleJobListConfig() {
+        scheduleJobList.add("DevCameraDahuaTask");
+        scheduleJobList.add("DevCameraHikvisionTask");
+        scheduleJobList.add("PointCollectTaskNet1h");
+        scheduleJobList.add("PointCollectTaskNet10");
+        scheduleJobList.add("PointCollectTaskNet30");
+        scheduleJobList.add("PointCollectTaskNet60");
+        scheduleJobList.add("PointCollectTaskNetKIO10");
+        scheduleJobList.add("PointCollectTaskNetKIO60");
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobController.java
new file mode 100644
index 0000000..004631b
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobController.java
@@ -0,0 +1,127 @@
+package com.iailab.module.model.job.controller.admin;
+
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.util.object.BeanUtils;
+import com.iailab.framework.common.util.validation.ValidationUtils;
+import com.iailab.framework.common.validation.group.AddGroup;
+import com.iailab.framework.common.validation.group.DefaultGroup;
+import com.iailab.framework.common.validation.group.UpdateGroup;
+import com.iailab.framework.tenant.core.context.TenantContextHolder;
+import com.iailab.module.model.job.dto.ScheduleJobDTO;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.service.ScheduleJobService;
+import com.iailab.module.model.job.vo.ScheduleJobReqVO;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+import static com.iailab.framework.common.pojo.CommonResult.success;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("/model/job/schedule")
+@Tag(name = "定时任务")
+public class ScheduleJobController {
+	@Resource
+	private ScheduleJobService scheduleJobService;
+
+	@GetMapping("page")
+	@Operation(summary = "分页")
+	@Parameters({
+		@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true) ,
+		@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true) ,
+		@Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
+		@Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)") ,
+		@Parameter(name = "beanName", description = "beanName")
+	})
+	@PreAuthorize("@ss.hasPermission('model:schedule:query')")
+	public CommonResult<PageResult<ScheduleJobDTO>> page(@Validated ScheduleJobReqVO reqVO){
+		reqVO.setTenantId(TenantContextHolder.getTenantId());
+		PageResult<ScheduleJobEntity> page = scheduleJobService.page(reqVO);
+
+		return success(BeanUtils.toBean(page, ScheduleJobDTO.class));
+	}
+
+	@GetMapping("info")
+	@Operation(summary = "信息")
+	@PreAuthorize("@ss.hasPermission('model:schedule:query')")
+	public CommonResult<ScheduleJobDTO> info(@RequestParam("id") Long id){
+		ScheduleJobDTO schedule = scheduleJobService.get(id);
+		
+		return new CommonResult<ScheduleJobDTO>().setData(schedule);
+	}
+
+	@PostMapping("/create")
+	@Operation(summary = "保存")
+	@PreAuthorize("@ss.hasPermission('model:schedule:create')")
+	public CommonResult save(@RequestBody ScheduleJobDTO dto){
+		ValidationUtils.validate(dto, AddGroup.class, DefaultGroup.class);
+		
+		scheduleJobService.save(dto);
+		
+		return new CommonResult();
+	}
+
+	@PutMapping("/update")
+	@Operation(summary = "修改")
+	@PreAuthorize("@ss.hasPermission('model:schedule:update')")
+	public CommonResult update(@RequestBody ScheduleJobDTO dto){
+		ValidationUtils.validate(dto, UpdateGroup.class, DefaultGroup.class);
+				
+		scheduleJobService.update(dto);
+		
+		return new CommonResult();
+	}
+
+	@DeleteMapping("/delete")
+	@Operation(summary = "删除")
+	@PreAuthorize("@ss.hasPermission('model:schedule:delete')")
+	public CommonResult delete(@RequestParam("id") Long id){
+		scheduleJobService.deleteBatch(id);
+		
+		return new CommonResult();
+	}
+
+	@PutMapping("/run")
+	@Operation(summary = "立即执行")
+	public CommonResult run(@RequestParam("id") Long id){
+		Long[] ids = new Long[1];
+		ids[0] = id;
+		scheduleJobService.run(ids);
+		
+		return new CommonResult();
+	}
+
+	@PutMapping("/pause")
+	@Operation(summary = "暂停")
+	public CommonResult pause(@RequestParam("id") Long id){
+		Long[] ids = new Long[1];
+		ids[0] = id;
+		scheduleJobService.pause(ids);
+		
+		return new CommonResult();
+	}
+
+	@PutMapping("/resume")
+	@Operation(summary = "恢复")
+	public CommonResult resume(@RequestParam("id") Long id){
+		Long[] ids = new Long[1];
+		ids[0] = id;
+		scheduleJobService.resume(ids);
+		
+		return new CommonResult();
+	}
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobLogController.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobLogController.java
new file mode 100644
index 0000000..6a0293d
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/admin/ScheduleJobLogController.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.controller.admin;
+
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.module.model.job.dto.ScheduleJobLogDTO;
+import com.iailab.module.model.job.service.ScheduleJobLogService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@RestController
+@RequestMapping("/sys/scheduleLog")
+@Tag(name = "定时任务日志")
+public class ScheduleJobLogController {
+	@Resource
+	private ScheduleJobLogService scheduleJobLogService;
+
+	@GetMapping("page")
+	@Operation(summary = "分页")
+	@Parameters({
+		@Parameter(name = Constant.PAGE, description = "当前页码,从1开始", required = true) ,
+		@Parameter(name = Constant.LIMIT, description = "每页显示记录数", required = true) ,
+		@Parameter(name = Constant.ORDER_FIELD, description = "排序字段") ,
+		@Parameter(name = Constant.ORDER, description = "排序方式,可选值(asc、desc)") ,
+		@Parameter(name = "jobId", description = "jobId")
+	})
+	@PreAuthorize("@ss.hasPermission('sys:schedule:log')")
+	public CommonResult<PageData<ScheduleJobLogDTO>> page(@RequestParam Map<String, Object> params){
+		PageData<ScheduleJobLogDTO> page = scheduleJobLogService.page(params);
+		
+		return new CommonResult<PageData<ScheduleJobLogDTO>>().setData(page);
+	}
+
+	@GetMapping("{id}")
+	@Operation(summary = "信息")
+	@PreAuthorize("@ss.hasPermission('sys:schedule:log')")
+	public CommonResult<ScheduleJobLogDTO> info(@PathVariable("id") Long id){
+		ScheduleJobLogDTO log = scheduleJobLogService.get(id);
+		
+		return new CommonResult<ScheduleJobLogDTO>().setData(log);
+	}
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/package-info.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/package-info.java
new file mode 100644
index 0000000..4f83d6e
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/controller/package-info.java
@@ -0,0 +1 @@
+package com.iailab.module.model.job.controller;
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobDao.java
new file mode 100644
index 0000000..dd2a6fa
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobDao.java
@@ -0,0 +1,34 @@
+package com.iailab.module.model.job.dao;
+
+import com.baomidou.dynamic.datasource.annotation.Master;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.mybatis.core.mapper.BaseMapperX;
+import com.iailab.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.vo.ScheduleJobReqVO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Map;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Master
+@Mapper
+public interface ScheduleJobDao extends BaseMapperX<ScheduleJobEntity> {
+
+	default PageResult<ScheduleJobEntity> selectPage(ScheduleJobReqVO reqVO) {
+		return selectPage(reqVO, new LambdaQueryWrapperX<ScheduleJobEntity>()
+				.likeIfPresent(ScheduleJobEntity::getBeanName, reqVO.getBeanName())
+				.eqIfPresent(ScheduleJobEntity::getTenantId, reqVO.getTenantId())
+				.orderByDesc(ScheduleJobEntity::getCreateDate));
+
+	}
+	
+	/**
+	 * 批量更新状态
+	 */
+	int updateBatch(Map<String, Object> map);
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobLogDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobLogDao.java
new file mode 100644
index 0000000..25ef781
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dao/ScheduleJobLogDao.java
@@ -0,0 +1,17 @@
+package com.iailab.module.model.job.dao;
+
+import com.baomidou.dynamic.datasource.annotation.Master;
+import com.iailab.framework.common.dao.BaseDao;
+import com.iailab.module.model.job.entity.ScheduleJobLogEntity;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Master
+@Mapper
+public interface ScheduleJobLogDao extends BaseDao<ScheduleJobLogEntity> {
+	
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobDTO.java
new file mode 100644
index 0000000..810f3c3
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobDTO.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.dto;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.iailab.framework.common.validation.group.AddGroup;
+import com.iailab.framework.common.validation.group.DefaultGroup;
+import com.iailab.framework.common.validation.group.UpdateGroup;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Null;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@Tag(name = "定时任务")
+public class ScheduleJobDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "id")
+    @Null(message="{id.null}", groups = AddGroup.class)
+    @NotNull(message="{id.require}", groups = UpdateGroup.class)
+    private Long id;
+
+    @Schema(description = "spring bean名称")
+    @NotBlank(message = "{schedule.bean.require}", groups = DefaultGroup.class)
+    private String beanName;
+
+    @Schema(description = "参数")
+    private String params;
+
+    @Schema(description = "cron表达式")
+    @NotBlank(message = "{schedule.cron.require}", groups = DefaultGroup.class)
+    private String cronExpression;
+
+    @Schema(description = "任务状态  0:暂停  1:正常")
+    private Integer status;
+
+    @Schema(description = "备注")
+    private String remark;
+
+    @Schema(description = "创建时间")
+    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
+    private Date createDate;
+
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobLogDTO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobLogDTO.java
new file mode 100644
index 0000000..adcd483
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/dto/ScheduleJobLogDTO.java
@@ -0,0 +1,53 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Data
+@Tag(name = "定时任务日志")
+public class ScheduleJobLogDTO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Schema(description = "id")
+    private Long id;
+
+    @Schema(description = "任务id")
+    private Long jobId;
+
+    @Schema(description = "spring bean名称")
+    private String beanName;
+
+    @Schema(description = "参数")
+    private String params;
+
+    @Schema(description = "任务状态    0:失败    1:成功")
+    private Integer status;
+
+    @Schema(description = "失败信息")
+    private String error;
+
+    @Schema(description = "耗时(单位:毫秒)")
+    private Integer times;
+
+    @Schema(description = "创建时间")
+    private Date createDate;
+
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobEntity.java
new file mode 100644
index 0000000..4639c92
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobEntity.java
@@ -0,0 +1,58 @@
+package com.iailab.module.model.job.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.iailab.framework.common.entity.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("schedule_job")
+public class ScheduleJobEntity extends BaseEntity {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * spring bean名称
+	 */
+	private String beanName;
+	/**
+	 * 参数
+	 */
+	private String params;
+	/**
+	 * cron表达式
+	 */
+	private String cronExpression;
+	/**
+	 * 任务状态  0:暂停  1:正常
+	 */
+	private Integer status;
+	/**
+	 * 备注
+	 */
+	private String remark;
+	/**
+	 * 更新者
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private Long updater;
+	/**
+	 * 更新时间
+	 */
+	@TableField(fill = FieldFill.INSERT_UPDATE)
+	private Date updateDate;
+
+	/**
+	 * 多租户编号
+	 */
+	private Long tenantId;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobLogEntity.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobLogEntity.java
new file mode 100644
index 0000000..276cf8e
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/entity/ScheduleJobLogEntity.java
@@ -0,0 +1,59 @@
+package com.iailab.module.model.job.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@Data
+@TableName("schedule_job_log")
+public class ScheduleJobLogEntity implements Serializable {
+	private static final long serialVersionUID = 1L;
+
+	/**
+	 * id
+	 */
+	@TableId
+	private Long id;
+	/**
+	 * 任务id
+	 */
+	private Long jobId;
+	/**
+	 * spring bean名称
+	 */
+	private String beanName;
+	/**
+	 * 参数
+	 */
+	private String params;
+	/**
+	 * 任务状态    0:失败    1:成功
+	 */
+	private Integer status;
+	/**
+	 * 失败信息
+	 */
+	private String error;
+	/**
+	 * 耗时(单位:毫秒)
+	 */
+	private Integer times;
+	/**
+	 * 创建时间
+	 */
+	private Date createDate;
+
+	/**
+	 * 多租户编号
+	 */
+	private Long tenantId;
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/init/JobCommandLineRunner.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/init/JobCommandLineRunner.java
new file mode 100644
index 0000000..3a68732
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/init/JobCommandLineRunner.java
@@ -0,0 +1,38 @@
+package com.iailab.module.model.job.init;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iailab.module.model.job.dao.ScheduleJobDao;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.utils.ScheduleUtils;
+import org.quartz.CronTrigger;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.stereotype.Component;
+import org.quartz.Scheduler;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * 初始化定时任务数据
+ */
+@Component
+public class JobCommandLineRunner implements CommandLineRunner {
+    @Resource
+    private Scheduler scheduler;
+    @Resource
+    private ScheduleJobDao scheduleJobDao;
+
+    @Override
+    public void run(String... args) {
+        List<ScheduleJobEntity> scheduleJobList = scheduleJobDao.selectList(new QueryWrapper<>());
+        for(ScheduleJobEntity scheduleJob : scheduleJobList){
+            CronTrigger cronTrigger = ScheduleUtils.getCronTrigger(scheduler, scheduleJob.getId());
+            //如果不存在,则创建
+            if(cronTrigger == null) {
+                ScheduleUtils.createScheduleJob(scheduler, scheduleJob);
+            }else {
+                ScheduleUtils.updateScheduleJob(scheduler, scheduleJob);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobLogService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobLogService.java
new file mode 100644
index 0000000..ff76432
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobLogService.java
@@ -0,0 +1,28 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.service;
+
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.job.dto.ScheduleJobLogDTO;
+import com.iailab.module.model.job.entity.ScheduleJobLogEntity;
+
+import java.util.Map;
+
+/**
+ * 定时任务日志
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface ScheduleJobLogService extends BaseService<ScheduleJobLogEntity> {
+
+	PageData<ScheduleJobLogDTO> page(Map<String, Object> params);
+
+	ScheduleJobLogDTO get(Long id);
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobService.java
new file mode 100644
index 0000000..81bdeaa
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/ScheduleJobService.java
@@ -0,0 +1,55 @@
+package com.iailab.module.model.job.service;
+
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.service.BaseService;
+import com.iailab.module.model.job.dto.ScheduleJobDTO;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.vo.ScheduleJobReqVO;
+
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public interface ScheduleJobService extends BaseService<ScheduleJobEntity> {
+
+	PageResult<ScheduleJobEntity> page(ScheduleJobReqVO reqVO);
+
+	ScheduleJobDTO get(Long id);
+
+	/**
+	 * 保存定时任务
+	 */
+	void save(ScheduleJobDTO dto);
+	
+	/**
+	 * 更新定时任务
+	 */
+	void update(ScheduleJobDTO dto);
+	
+	/**
+	 * 批量删除定时任务
+	 */
+	void deleteBatch(Long id);
+	
+	/**
+	 * 批量更新定时任务状态
+	 */
+	int updateBatch(Long[] ids, int status);
+	
+	/**
+	 * 立即执行
+	 */
+	void run(Long[] ids);
+	
+	/**
+	 * 暂停运行
+	 */
+	void pause(Long[] ids);
+	
+	/**
+	 * 恢复运行
+	 */
+	void resume(Long[] ids);
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobLogServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobLogServiceImpl.java
new file mode 100644
index 0000000..c341cbb
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobLogServiceImpl.java
@@ -0,0 +1,54 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.page.PageData;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.module.model.job.dao.ScheduleJobLogDao;
+import com.iailab.module.model.job.dto.ScheduleJobLogDTO;
+import com.iailab.module.model.job.entity.ScheduleJobLogEntity;
+import com.iailab.module.model.job.service.ScheduleJobLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+@Service
+public class ScheduleJobLogServiceImpl extends BaseServiceImpl<ScheduleJobLogDao, ScheduleJobLogEntity> implements ScheduleJobLogService {
+
+	@Override
+	public PageData<ScheduleJobLogDTO> page(Map<String, Object> params) {
+		IPage<ScheduleJobLogEntity> page = baseDao.selectPage(
+			getPage(params, Constant.CREATE_DATE, false),
+			getWrapper(params)
+		);
+		return getPageData(page, ScheduleJobLogDTO.class);
+	}
+
+	private QueryWrapper<ScheduleJobLogEntity> getWrapper(Map<String, Object> params){
+		String jobId = (String)params.get("jobId");
+
+		QueryWrapper<ScheduleJobLogEntity> wrapper = new QueryWrapper<>();
+		wrapper.eq(StringUtils.isNotBlank(jobId), "job_id", jobId);
+
+		return wrapper;
+	}
+
+	@Override
+	public ScheduleJobLogDTO get(Long id) {
+		ScheduleJobLogEntity entity = baseDao.selectById(id);
+
+		return ConvertUtils.sourceToTarget(entity, ScheduleJobLogDTO.class);
+	}
+
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobServiceImpl.java
new file mode 100644
index 0000000..3c31126
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/service/impl/ScheduleJobServiceImpl.java
@@ -0,0 +1,124 @@
+package com.iailab.module.model.job.service.impl;
+
+import com.alibaba.cloud.commons.lang.StringUtils;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.pojo.PageResult;
+import com.iailab.framework.common.service.impl.BaseServiceImpl;
+import com.iailab.framework.common.util.object.ConvertUtils;
+import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
+import com.iailab.framework.tenant.core.context.TenantContextHolder;
+import com.iailab.module.model.job.dao.ScheduleJobDao;
+import com.iailab.module.model.job.dto.ScheduleJobDTO;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.service.ScheduleJobService;
+import com.iailab.module.model.job.utils.ScheduleUtils;
+import com.iailab.module.model.job.vo.ScheduleJobReqVO;
+import org.quartz.Scheduler;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+@Service
+public class ScheduleJobServiceImpl extends BaseServiceImpl<ScheduleJobDao, ScheduleJobEntity> implements ScheduleJobService {
+	@Resource
+	private Scheduler scheduler;
+
+	@Override
+	public PageResult<ScheduleJobEntity> page(ScheduleJobReqVO reqVO) {
+		return baseDao.selectPage(reqVO);
+	}
+
+	@Override
+	public ScheduleJobDTO get(Long id) {
+		ScheduleJobEntity entity = baseDao.selectById(id);
+
+		return ConvertUtils.sourceToTarget(entity, ScheduleJobDTO.class);
+	}
+
+	private QueryWrapper<ScheduleJobEntity> getWrapper(Map<String, Object> params){
+		String beanName = (String)params.get("beanName");
+
+		QueryWrapper<ScheduleJobEntity> wrapper = new QueryWrapper<>();
+		wrapper.like(StringUtils.isNotBlank(beanName), "bean_name", beanName);
+
+		return wrapper;
+	}
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void save(ScheduleJobDTO dto) {
+		Long tenantId = TenantContextHolder.getRequiredTenantId();
+		ScheduleJobEntity entity = ConvertUtils.sourceToTarget(dto, ScheduleJobEntity.class);
+		entity.setId(System.currentTimeMillis());
+		entity.setStatus(Constant.ScheduleStatus.NORMAL.getValue());
+		entity.setTenantId(tenantId);
+		entity.setCreator(SecurityFrameworkUtils.getLoginUser().getId());
+		entity.setCreateDate(new Date());
+        this.insert(entity);
+        
+        ScheduleUtils.createScheduleJob(scheduler, entity);
+    }
+	
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+	public void update(ScheduleJobDTO dto) {
+		Long tenantId = TenantContextHolder.getRequiredTenantId();
+		ScheduleJobEntity entity = ConvertUtils.sourceToTarget(dto, ScheduleJobEntity.class);
+		entity.setUpdateDate(new Date());
+		entity.setUpdater(SecurityFrameworkUtils.getLoginUser().getId());
+		entity.setTenantId(tenantId);
+        ScheduleUtils.updateScheduleJob(scheduler, entity);
+                
+        this.updateById(entity);
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public void deleteBatch(Long id) {
+		ScheduleUtils.deleteScheduleJob(scheduler, id);
+
+		baseDao.deleteById(id);
+	}
+
+	@Override
+    public int updateBatch(Long[] ids, int status){
+    	Map<String, Object> map = new HashMap<>(2);
+    	map.put("ids", ids);
+    	map.put("status", status);
+    	return baseDao.updateBatch(map);
+    }
+    
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public void run(Long[] ids) {
+    	for(Long id : ids){
+    		ScheduleUtils.run(scheduler, this.selectById(id));
+    	}
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public void pause(Long[] ids) {
+        for(Long id : ids){
+    		ScheduleUtils.pauseJob(scheduler, id);
+    	}
+        
+    	updateBatch(ids, Constant.ScheduleStatus.PAUSE.getValue());
+    }
+
+	@Override
+	@Transactional(rollbackFor = Exception.class)
+    public void resume(Long[] ids) {
+    	for(Long id : ids){
+    		ScheduleUtils.resumeJob(scheduler, id);
+    	}
+
+    	updateBatch(ids, Constant.ScheduleStatus.NORMAL.getValue());
+    }
+    
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanItemResultJsonTask.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanItemResultJsonTask.java
new file mode 100644
index 0000000..dd0da10
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanItemResultJsonTask.java
@@ -0,0 +1,47 @@
+package com.iailab.module.model.job.task;
+
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService;
+import com.iailab.module.model.mcs.sche.service.StScheduleRecordDetailService;
+import com.iailab.module.model.mcs.sche.service.StScheduleRecordService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 清理预测json数据表
+ *
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月05日
+ */
+@Component("cleanItemResultJsonTask")
+public class CleanItemResultJsonTask implements ITask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    @Autowired
+    private MmItemResultJsonService mmItemResultJsonService;
+
+    @Override
+    public void run(String params) {
+        logger.info("CleanItemResultJsonTask定时任务正在执行,参数为:{}",params );
+        try {
+            int days = -40;
+            if (StringUtils.isNotBlank(params)) {
+                days = Math.abs(Integer.parseInt(params)) * -1;
+            }
+            Map<String, Date> tMap = DateUtils.getIntervalDate(days);
+            mmItemResultJsonService.cleanResultJson(tMap);
+        } catch (Exception ex) {
+            logger.error("CleanItemResultJsonTask运行异常");
+            ex.printStackTrace();
+        }
+        logger.info("CleanItemResultJsonTask运行完成");
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanMmPredictAlarmMessageTask.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanMmPredictAlarmMessageTask.java
new file mode 100644
index 0000000..71ac55f
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanMmPredictAlarmMessageTask.java
@@ -0,0 +1,46 @@
+package com.iailab.module.model.job.task;
+
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.mcs.pre.service.MmItemResultJsonService;
+import com.iailab.module.model.mcs.pre.service.MmPredictAlarmMessageService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 清理预警消息表
+ *
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月05日
+ */
+@Component("cleanMmPredictAlarmMessageTask")
+public class CleanMmPredictAlarmMessageTask implements ITask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    @Autowired
+    private MmPredictAlarmMessageService mmPredictAlarmMessageService;
+
+    @Override
+    public void run(String params) {
+        logger.info("CleanMmPredictAlarmMessageTask定时任务正在执行,参数为:{}",params );
+        try {
+            int days = -40;
+            if (StringUtils.isNotBlank(params)) {
+                days = Math.abs(Integer.parseInt(params)) * -1;
+            }
+            Map<String, Date> tMap = DateUtils.getIntervalDate(days);
+            mmPredictAlarmMessageService.cleanAlarmMessage(tMap);
+        } catch (Exception ex) {
+            logger.error("CleanMmPredictAlarmMessageTask运行异常");
+            ex.printStackTrace();
+        }
+        logger.info("CleanMmPredictAlarmMessageTask运行完成");
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanScheduleRecordTask.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanScheduleRecordTask.java
new file mode 100644
index 0000000..b3cce4c
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanScheduleRecordTask.java
@@ -0,0 +1,50 @@
+package com.iailab.module.model.job.task;
+
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.mcs.sche.service.StScheduleRecordDetailService;
+import com.iailab.module.model.mcs.sche.service.StScheduleRecordService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 清理调度记录表
+ *
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月05日
+ */
+@Component("cleanScheduleRecordTask")
+public class CleanScheduleRecordTask implements ITask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    @Autowired
+    private StScheduleRecordService stScheduleRecordService;
+
+    @Autowired
+    private StScheduleRecordDetailService stScheduleRecordDetailService;
+
+    @Override
+    public void run(String params) {
+        logger.info("CleanScheduleRecordTask定时任务正在执行,参数为:{}",params );
+        try {
+            int days = -40;
+            if (StringUtils.isNotBlank(params)) {
+                days = Math.abs(Integer.parseInt(params)) * -1;
+            }
+            Map<String, Date> tMap = DateUtils.getIntervalDate(days);
+            stScheduleRecordService.cleanScheduleRecord(tMap);
+            stScheduleRecordDetailService.cleanScheduleRecordDetail(tMap);
+        } catch (Exception ex) {
+            logger.error("CleanScheduleRecordTask运行异常");
+            ex.printStackTrace();
+        }
+        logger.info("CleanScheduleRecordTask运行完成");
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanStScheduleSuggestTask.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanStScheduleSuggestTask.java
new file mode 100644
index 0000000..bbc2009
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/CleanStScheduleSuggestTask.java
@@ -0,0 +1,46 @@
+package com.iailab.module.model.job.task;
+
+import com.iailab.module.model.common.utils.DateUtils;
+import com.iailab.module.model.mcs.pre.service.MmPredictAlarmMessageService;
+import com.iailab.module.model.mcs.sche.service.StScheduleSuggestService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 清理调度建议表
+ *
+ * @author lirm
+ * @Description
+ * @createTime 2025年02月05日
+ */
+@Component("cleanStScheduleSuggestTask")
+public class CleanStScheduleSuggestTask implements ITask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+
+    @Autowired
+    private StScheduleSuggestService stScheduleSuggestService;
+
+    @Override
+    public void run(String params) {
+        logger.info("CleanStScheduleSuggestTask定时任务正在执行,参数为:{}",params );
+        try {
+            int days = -40;
+            if (StringUtils.isNotBlank(params)) {
+                days = Math.abs(Integer.parseInt(params)) * -1;
+            }
+            Map<String, Date> tMap = DateUtils.getIntervalDate(days);
+            stScheduleSuggestService.cleanScheduleSuggest(tMap);
+        } catch (Exception ex) {
+            logger.error("CleanStScheduleSuggestTask运行异常");
+            ex.printStackTrace();
+        }
+        logger.info("CleanStScheduleSuggestTask运行完成");
+    }
+}
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/ITask.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/ITask.java
new file mode 100644
index 0000000..516317b
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/task/ITask.java
@@ -0,0 +1,25 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.iailab.module.model.job.task;
+
+/**
+ * 定时任务接口,所有定时任务都要实现该接口
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public interface ITask {
+
+    /**
+     * 执行定时任务接口
+     *
+     * @param params   参数,多参数使用JSON数据
+     */
+    void run(String params);
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleJob.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleJob.java
new file mode 100644
index 0000000..f75962b
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleJob.java
@@ -0,0 +1,87 @@
+package com.iailab.module.model.job.utils;
+
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.exception.ExceptionUtils;
+import com.iailab.framework.common.util.spring.SpringContextUtils;
+import com.iailab.framework.tenant.core.context.TenantContextHolder;
+import com.iailab.module.model.job.config.ScheduleJobListConfig;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import com.iailab.module.model.job.entity.ScheduleJobLogEntity;
+import com.iailab.module.model.job.service.ScheduleJobLogService;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+import java.lang.reflect.Method;
+import java.util.Date;
+
+
+/**
+ * 定时任务
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+@DisallowConcurrentExecution
+public class ScheduleJob extends QuartzJobBean {
+	private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Override
+    protected void executeInternal(JobExecutionContext context) {
+        ScheduleJobEntity scheduleJob = (ScheduleJobEntity) context.getMergedJobDataMap().
+				get(ScheduleUtils.JOB_PARAM_KEY);
+
+		// 过滤定时任务
+		if (ScheduleJobListConfig.scheduleJobList.contains(scheduleJob.getBeanName())) {
+			logger.info("过滤定时任务,BeanName=" + scheduleJob.getBeanName());
+			return;
+		}
+
+        //设置当前租户
+		TenantContextHolder.setTenantId(scheduleJob.getTenantId());
+		Long tenantId = TenantContextHolder.getRequiredTenantId();
+
+        //数据库保存执行记录
+        ScheduleJobLogEntity log = new ScheduleJobLogEntity();
+		log.setId(System.currentTimeMillis());
+        log.setJobId(scheduleJob.getId());
+        log.setBeanName(scheduleJob.getBeanName());
+        log.setParams(scheduleJob.getParams());
+		log.setCreateDate(new Date());
+		log.setTenantId(tenantId);
+
+        //任务开始时间
+        long startTime = System.currentTimeMillis();
+        
+        try {
+			//执行任务
+			logger.info("任务准备执行,任务ID:{}", scheduleJob.getId());
+			Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
+			Method method = target.getClass().getDeclaredMethod("run", String.class);
+			method.invoke(target, scheduleJob.getParams());
+
+			//任务执行总时长
+			long times = System.currentTimeMillis() - startTime;
+			log.setTimes((int)times);
+			//任务状态
+			log.setStatus(Constant.SUCCESS);
+			
+			logger.info("任务执行完毕,任务ID:{}  总共耗时:{} 毫秒", scheduleJob.getId(), times);
+		} catch (Exception e) {
+			logger.error("任务执行失败,任务ID:{}", scheduleJob.getId(), e);
+			
+			//任务执行总时长
+			long times = System.currentTimeMillis() - startTime;
+			log.setTimes((int)times);
+			
+			//任务状态
+			log.setStatus(Constant.FAIL);
+			log.setError(ExceptionUtils.getErrorStackTrace(e));
+		}finally {
+			//获取spring bean
+			ScheduleJobLogService scheduleJobLogService = SpringContextUtils.getBean(ScheduleJobLogService.class);
+			//scheduleJobLogService.insert(log);
+		}
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleUtils.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleUtils.java
new file mode 100644
index 0000000..e61a5be
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/utils/ScheduleUtils.java
@@ -0,0 +1,153 @@
+package com.iailab.module.model.job.utils;
+
+import com.iailab.framework.common.constant.Constant;
+import com.iailab.framework.common.enums.ErrorCode;
+import com.iailab.framework.common.exception.ServerException;
+import com.iailab.module.model.job.entity.ScheduleJobEntity;
+import org.quartz.*;
+
+/**
+ * 定时任务工具类
+ *
+ * @author Mark sunlightcs@gmail.com
+ */
+public class ScheduleUtils {
+    private final static String JOB_NAME = "TASK_";
+    /**
+     * 任务调度参数key
+     */
+    public static final String JOB_PARAM_KEY = "JOB_PARAM_KEY";
+    
+    /**
+     * 获取触发器key
+     */
+    public static TriggerKey getTriggerKey(Long jobId) {
+        return TriggerKey.triggerKey(JOB_NAME + jobId);
+    }
+    
+    /**
+     * 获取jobKey
+     */
+    public static JobKey getJobKey(Long jobId) {
+        return JobKey.jobKey(JOB_NAME + jobId);
+    }
+
+    /**
+     * 获取表达式触发器
+     */
+    public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId) {
+        try {
+            return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+
+    /**
+     * 创建定时任务
+     */
+    public static void createScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+        try {
+        	//构建job信息
+            JobDetail jobDetail = JobBuilder.newJob(ScheduleJob.class).withIdentity(getJobKey(scheduleJob.getId())).build();
+
+            //表达式调度构建器
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+            		.withMisfireHandlingInstructionDoNothing();
+
+            //按新的cronExpression表达式构建一个新的trigger
+            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(scheduleJob.getId())).withSchedule(scheduleBuilder).build();
+
+            //放入参数,运行时的方法可以获取
+            jobDetail.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
+
+            scheduler.scheduleJob(jobDetail, trigger);
+            
+            //暂停任务
+            if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
+            	pauseJob(scheduler, scheduleJob.getId());
+            }
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+    
+    /**
+     * 更新定时任务
+     */
+    public static void updateScheduleJob(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+        try {
+            TriggerKey triggerKey = getTriggerKey(scheduleJob.getId());
+
+            //表达式调度构建器
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression())
+            		.withMisfireHandlingInstructionDoNothing();
+
+            CronTrigger trigger = getCronTrigger(scheduler, scheduleJob.getId());
+            
+            //按新的cronExpression表达式重新构建trigger
+            trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
+            
+            //参数
+            trigger.getJobDataMap().put(JOB_PARAM_KEY, scheduleJob);
+            
+            scheduler.rescheduleJob(triggerKey, trigger);
+            
+            //暂停任务
+            if(scheduleJob.getStatus() == Constant.ScheduleStatus.PAUSE.getValue()){
+            	pauseJob(scheduler, scheduleJob.getId());
+            }
+            
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+
+    /**
+     * 立即执行任务
+     */
+    public static void run(Scheduler scheduler, ScheduleJobEntity scheduleJob) {
+        try {
+        	//参数
+        	JobDataMap dataMap = new JobDataMap();
+        	dataMap.put(JOB_PARAM_KEY, scheduleJob);
+        	
+            scheduler.triggerJob(getJobKey(scheduleJob.getId()), dataMap);
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+
+    /**
+     * 暂停任务
+     */
+    public static void pauseJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.pauseJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+
+    /**
+     * 恢复任务
+     */
+    public static void resumeJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.resumeJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+
+    /**
+     * 删除定时任务
+     */
+    public static void deleteScheduleJob(Scheduler scheduler, Long jobId) {
+        try {
+            scheduler.deleteJob(getJobKey(jobId));
+        } catch (SchedulerException e) {
+            throw new ServerException(ErrorCode.JOB_ERROR, e.getMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/vo/ScheduleJobReqVO.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/vo/ScheduleJobReqVO.java
new file mode 100644
index 0000000..0e68e83
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/job/vo/ScheduleJobReqVO.java
@@ -0,0 +1,23 @@
+package com.iailab.module.model.job.vo;
+
+import com.iailab.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+/**
+ * @author PanZhibao
+ * @Description
+ * @createTime 2024年08月23日
+ */
+@Schema(description = "数据平台 - 定时任务分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class ScheduleJobReqVO extends PageParam {
+
+    private String beanName;
+
+    private Long tenantId;
+}
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmItemResultJsonDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmItemResultJsonDao.java
index a7386b9..40be248 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmItemResultJsonDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmItemResultJsonDao.java
@@ -5,6 +5,9 @@
 import com.iailab.module.model.mcs.pre.entity.MmItemResultJsonEntity;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.Map;
+
 /**
  * @author PanZhibao
  * @Description
@@ -13,4 +16,5 @@
 @TenantDS
 @Mapper
 public interface MmItemResultJsonDao extends BaseMapperX<MmItemResultJsonEntity> {
+    void cleanResultJson(Map<String, Date> tMap);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAlarmMessageDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAlarmMessageDao.java
index 4fb7078..66a63d4 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAlarmMessageDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/dao/MmPredictAlarmMessageDao.java
@@ -8,6 +8,9 @@
 import com.iailab.module.model.mcs.pre.vo.MmPredictAlarmMessagePageReqVO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.Map;
+
 /**
  * @author PanZhibao
  * @Description
@@ -27,4 +30,6 @@
                 .leIfPresent(MmPredictAlarmMessageEntity::getAlarmTime, reqVO.getEndTime())
                 .orderByDesc(MmPredictAlarmMessageEntity::getCreateTime));
     }
+
+    void cleanAlarmMessage(Map<String, Date> tMap);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
index dbee2e4..5df7b12 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmItemResultJsonService.java
@@ -5,6 +5,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -16,4 +17,6 @@
     List<Object[]> getData(String outputId, Date predictTime, String timeFormat);
 
     void insert(List<MmItemResultJsonEntity> resultJsonList);
+
+    void cleanResultJson(Map<String, Date> tMap);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAlarmMessageService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAlarmMessageService.java
index e809416..fc02943 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAlarmMessageService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/MmPredictAlarmMessageService.java
@@ -8,6 +8,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -29,4 +30,6 @@
     void update(MmPredictAlarmMessageSaveReqVO reqVO);
 
     void delete(String id);
+
+    void cleanAlarmMessage(Map<String, Date> tMap);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
index 7f7a424..d2d988f 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmItemResultJsonServiceImpl.java
@@ -11,10 +11,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 
 /**
  * @author PanZhibao
@@ -53,4 +50,9 @@
     public void insert(List<MmItemResultJsonEntity> resultJsonList) {
         baseDao.insertBatch(resultJsonList);
     }
+
+    @Override
+    public void cleanResultJson(Map<String, Date> tMap) {
+        baseDao.cleanResultJson(tMap);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAlarmMessageServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAlarmMessageServiceImpl.java
index 33790c6..f181254 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAlarmMessageServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/pre/service/impl/MmPredictAlarmMessageServiceImpl.java
@@ -14,6 +14,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 /**
@@ -71,4 +72,9 @@
     public void delete(String id) {
         baseDao.deleteById(id);
     }
+
+    @Override
+    public void cleanAlarmMessage(Map<String, Date> tMap) {
+        baseDao.cleanAlarmMessage(tMap);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
index 7655577..806fe22 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDao.java
@@ -10,7 +10,9 @@
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -31,4 +33,6 @@
     }
 
     List<StScheduleRecordVO> getLastScheduleResult(@Param("scheduleCode") String scheduleCode, @Param("limit") Integer limit);
+
+    void cleanScheduleRecord(Map<String, Date> tMap);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDetailDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDetailDao.java
index 8fc1694..1fe637e 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDetailDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleRecordDetailDao.java
@@ -5,6 +5,9 @@
 import com.iailab.module.model.mcs.sche.entity.StScheduleRecordDetailEntity;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.Map;
+
 /**
  * @author PanZhibao
  * @Description
@@ -13,4 +16,5 @@
 @TenantDS
 @Mapper
 public interface StScheduleRecordDetailDao extends BaseMapperX<StScheduleRecordDetailEntity> {
+    void cleanScheduleRecordDetail(Map<String, Date> tMap);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
index ea81414..fe62a48 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/dao/StScheduleSuggestDao.java
@@ -8,6 +8,9 @@
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestPageReqVO;
 import org.apache.ibatis.annotations.Mapper;
 
+import java.util.Date;
+import java.util.Map;
+
 /**
  * @author PanZhibao
  * @Description
@@ -23,4 +26,6 @@
                 .likeIfPresent(StScheduleSuggestEntity::getScheduleObj, reqVO.getScheduleObj())
                 .orderByDesc(StScheduleSuggestEntity::getCreateTime));
     }
+
+    void cleanScheduleSuggest(Map<String, Date> tMap);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordDetailService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordDetailService.java
index 2566752..7e3c092 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordDetailService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordDetailService.java
@@ -4,7 +4,9 @@
 import com.iailab.module.model.mcs.sche.entity.StScheduleRecordDetailEntity;
 import com.iailab.module.model.mdk.vo.ScheduleResultVO;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -16,4 +18,6 @@
     void create(String recordId, ScheduleResultVO resultVO);
 
     List<StScheduleRecordDetailEntity> getByRecordId(String recordId);
+
+    void cleanScheduleRecordDetail(Map<String, Date> tMap);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
index c6ab60a..370f80a 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleRecordService.java
@@ -9,7 +9,9 @@
 import com.iailab.module.model.mdk.vo.ScheduleResultVO;
 import org.apache.ibatis.annotations.Param;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -25,4 +27,6 @@
     void create(ScheduleResultVO resultVO);
 
     List<StScheduleRecordVO> getLastScheduleResult(String scheduleCode, Integer limit);
+
+    void cleanScheduleRecord(Map<String, Date> tMap);
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleSuggestService.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleSuggestService.java
index 489487f..1c7b436 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleSuggestService.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/StScheduleSuggestService.java
@@ -6,7 +6,9 @@
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestPageReqVO;
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author PanZhibao
@@ -26,4 +28,6 @@
     StScheduleSuggestEntity getInfo(String id);
 
     List<StScheduleSuggestEntity> getList(String scheduleObj, Integer limit);
+
+    void cleanScheduleSuggest(Map<String, Date> tMap);
 }
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordDetailServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordDetailServiceImpl.java
index 8f68a9f..4029cb9 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordDetailServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordDetailServiceImpl.java
@@ -10,6 +10,7 @@
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
@@ -49,4 +50,9 @@
         queryWrapper.orderByAsc("result_key");
         return baseDao.selectList(queryWrapper);
     }
+
+    @Override
+    public void cleanScheduleRecordDetail(Map<String, Date> tMap) {
+        baseDao.cleanScheduleRecordDetail(tMap);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
index caa952d..07be020 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleRecordServiceImpl.java
@@ -20,6 +20,7 @@
 
 import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 /**
@@ -67,4 +68,9 @@
     public List<StScheduleRecordVO> getLastScheduleResult(String scheduleCode, Integer limit) {
         return baseDao.getLastScheduleResult(scheduleCode,limit);
     }
+
+    @Override
+    public void cleanScheduleRecord(Map<String, Date> tMap) {
+        baseDao.cleanScheduleRecord(tMap);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
index e23aa21..b0276da 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
+++ b/iailab-module-model/iailab-module-model-biz/src/main/java/com/iailab/module/model/mcs/sche/service/impl/StScheduleSuggestServiceImpl.java
@@ -12,7 +12,9 @@
 import com.iailab.module.model.mcs.sche.vo.StScheduleSuggestSaveReqVO;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
+import java.util.Map;
 import java.util.UUID;
 
 /**
@@ -62,4 +64,9 @@
                 .last("limit " + limit);
         return baseDao.selectList(queryWrapper);
     }
+
+    @Override
+    public void cleanScheduleSuggest(Map<String, Date> tMap) {
+        baseDao.cleanScheduleSuggest(tMap);
+    }
 }
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmItemResultJsonDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmItemResultJsonDao.xml
new file mode 100644
index 0000000..3269ec7
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmItemResultJsonDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.pre.dao.MmItemResultJsonDao">
+    <delete id="cleanResultJson">
+        delete from t_mm_item_result_json
+        where predicttime between #{startdate} and #{enddate}
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictAlarmMessageDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictAlarmMessageDao.xml
new file mode 100644
index 0000000..adef635
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/MmPredictAlarmMessageDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.pre.dao.MmPredictAlarmMessageDao">
+    <delete id="cleanAlarmMessage">
+        delete from t_mm_predict_alarm_message
+        where alarm_time between #{startdate} and #{enddate}
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
index 3e75434..69e222f 100644
--- a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDao.xml
@@ -1,6 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" ?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
 <mapper namespace="com.iailab.module.model.mcs.sche.dao.StScheduleRecordDao">
+    <delete id="cleanScheduleRecord">
+        delete from t_st_schedule_record
+        where schedule_time between #{startdate} and #{enddate}
+    </delete>
     <select id="getLastScheduleResult" resultType="com.iailab.module.model.api.mdk.dto.StScheduleRecordVO">
         SELECT t2.* FROM t_st_schedule_scheme t1 LEFT JOIN t_st_schedule_record t2 on t1.id = t2.scheme_id
         WHERE t1.`code` = #{scheduleCode} AND result_code = "100"
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDetailDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDetailDao.xml
new file mode 100644
index 0000000..4eb8b1b
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleRecordDetailDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.sche.dao.StScheduleRecordDetailDao">
+    <delete id="cleanScheduleRecordDetail">
+        delete from t_st_schedule_record_detail
+        where schedule_time between #{startdate} and #{enddate}
+    </delete>
+</mapper>
\ No newline at end of file
diff --git a/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleSuggestDao.xml b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleSuggestDao.xml
new file mode 100644
index 0000000..c8607f2
--- /dev/null
+++ b/iailab-module-model/iailab-module-model-biz/src/main/resources/mapper/mcs/StScheduleSuggestDao.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
+<mapper namespace="com.iailab.module.model.mcs.sche.dao.StScheduleSuggestDao">
+    <delete id="cleanScheduleSuggest">
+        delete from t_st_schedule_suggest
+        where schedule_time between #{startdate} and #{enddate}
+    </delete>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.3