定时任务支持Class类调用&多类型参数

master
RuoYi 5 years ago committed by Limy
parent 451d6fe861
commit a73d5bd9d7

@ -196,7 +196,7 @@
var pageNumber = table.pageNumber; var pageNumber = table.pageNumber;
return pageSize * (pageNumber - 1) + index + 1; return pageSize * (pageNumber - 1) + index + 1;
}, },
// 列超出指定长度浮动提示(单击文本复制 // 列超出指定长度浮动提示(单击文本复制
tooltip: function (value, length) { tooltip: function (value, length) {
var _length = $.common.isEmpty(length) ? 20 : length; var _length = $.common.isEmpty(length) ? 20 : length;
var _text = ""; var _text = "";
@ -386,7 +386,7 @@
var actions = []; var actions = [];
$.each(datas, function(index, dict) { $.each(datas, function(index, dict) {
if (dict.dictValue == ('' + value)) { if (dict.dictValue == ('' + value)) {
var listClass = $.common.equals("default", dict.listClass) ? "" : "badge badge-" + dict.listClass; var listClass = $.common.equals("default", dict.listClass) || $.common.isEmpty(dict.listClass) ? "" : "badge badge-" + dict.listClass;
actions.push($.common.sprintf("<span class='%s'>%s</span>", listClass, dict.dictLabel)); actions.push($.common.sprintf("<span class='%s'>%s</span>", listClass, dict.dictLabel));
return false; return false;
} }

@ -71,14 +71,12 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label">用户性别:</label> <label class="col-sm-4 control-label">用户性别:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group">
<select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}"> <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="col-sm-6"> <div class="col-sm-6">
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label">用户状态:</label> <label class="col-sm-4 control-label">用户状态:</label>

@ -85,7 +85,6 @@
<div class="form-group"> <div class="form-group">
<label class="col-sm-4 control-label">用户性别:</label> <label class="col-sm-4 control-label">用户性别:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<div class="input-group">
<select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}"> <select name="sex" class="form-control m-b" th:with="type=${@dict.getType('sys_user_sex')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{sex}"></option> <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{sex}"></option>
</select> </select>
@ -93,7 +92,6 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
<div class="form-group"> <div class="form-group">

@ -127,7 +127,7 @@ public class SysJobController extends BaseController
@ResponseBody @ResponseBody
public AjaxResult addSave(SysJob job) throws SchedulerException, TaskException public AjaxResult addSave(SysJob job) throws SchedulerException, TaskException
{ {
return toAjax(jobService.insertJobCron(job)); return toAjax(jobService.insertJob(job));
} }
/** /**
@ -149,7 +149,7 @@ public class SysJobController extends BaseController
@ResponseBody @ResponseBody
public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException
{ {
return toAjax(jobService.updateJobCron(job)); return toAjax(jobService.updateJob(job));
} }
/** /**

@ -31,20 +31,16 @@ public class SysJob extends BaseEntity implements Serializable
@Excel(name = "任务组名") @Excel(name = "任务组名")
private String jobGroup; private String jobGroup;
/** 任务方法 */ /** 调用目标字符串 */
@Excel(name = "任务方法") @Excel(name = "调用目标字符串")
private String methodName; private String invokeTarget;
/** 方法参数 */
@Excel(name = "方法参数")
private String methodParams;
/** cron执行表达式 */ /** cron执行表达式 */
@Excel(name = "执行表达式 ") @Excel(name = "执行表达式 ")
private String cronExpression; private String cronExpression;
/** cron计划策略 */ /** cron计划策略 */
@Excel(name = "计划策略 ") @Excel(name = "计划策略 ", readConverterExp = "0=默认,1=立即触发执行,2=触发一次执行,3=不触发立即执行")
private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT; private String misfirePolicy = ScheduleConstants.MISFIRE_DEFAULT;
/** 是否并发执行0允许 1禁止 */ /** 是否并发执行0允许 1禁止 */
@ -85,24 +81,14 @@ public class SysJob extends BaseEntity implements Serializable
this.jobGroup = jobGroup; this.jobGroup = jobGroup;
} }
public String getMethodName() public String getInvokeTarget()
{
return methodName;
}
public void setMethodName(String methodName)
{
this.methodName = methodName;
}
public String getMethodParams()
{ {
return methodParams; return invokeTarget;
} }
public void setMethodParams(String methodParams) public void setInvokeTarget(String invokeTarget)
{ {
this.methodParams = methodParams; this.invokeTarget = invokeTarget;
} }
public String getCronExpression() public String getCronExpression()
@ -160,8 +146,6 @@ public class SysJob extends BaseEntity implements Serializable
.append("jobId", getJobId()) .append("jobId", getJobId())
.append("jobName", getJobName()) .append("jobName", getJobName())
.append("jobGroup", getJobGroup()) .append("jobGroup", getJobGroup())
.append("methodName", getMethodName())
.append("methodParams", getMethodParams())
.append("cronExpression", getCronExpression()) .append("cronExpression", getCronExpression())
.append("nextValidTime", getNextValidTime()) .append("nextValidTime", getNextValidTime())
.append("misfirePolicy", getMisfirePolicy()) .append("misfirePolicy", getMisfirePolicy())

@ -27,13 +27,9 @@ public class SysJobLog extends BaseEntity
@Excel(name = "任务组名") @Excel(name = "任务组名")
private String jobGroup; private String jobGroup;
/** 任务方法 */ /** 调用目标字符串 */
@Excel(name = "任务方法") @Excel(name = "调用目标字符串")
private String methodName; private String invokeTarget;
/** 方法参数 */
@Excel(name = "方法参数")
private String methodParams;
/** 日志信息 */ /** 日志信息 */
@Excel(name = "日志信息") @Excel(name = "日志信息")
@ -83,24 +79,14 @@ public class SysJobLog extends BaseEntity
this.jobGroup = jobGroup; this.jobGroup = jobGroup;
} }
public String getMethodName() public String getInvokeTarget()
{
return methodName;
}
public void setMethodName(String methodName)
{
this.methodName = methodName;
}
public String getMethodParams()
{ {
return methodParams; return invokeTarget;
} }
public void setMethodParams(String methodParams) public void setInvokeTarget(String invokeTarget)
{ {
this.methodParams = methodParams; this.invokeTarget = invokeTarget;
} }
public String getJobMessage() public String getJobMessage()
@ -159,8 +145,6 @@ public class SysJobLog extends BaseEntity
.append("jobLogId", getJobLogId()) .append("jobLogId", getJobLogId())
.append("jobName", getJobName()) .append("jobName", getJobName())
.append("jobGroup", getJobGroup()) .append("jobGroup", getJobGroup())
.append("methodName", getMethodName())
.append("methodParams", getMethodParams())
.append("jobMessage", getJobMessage()) .append("jobMessage", getJobMessage())
.append("status", getStatus()) .append("status", getStatus())
.append("exceptionInfo", getExceptionInfo()) .append("exceptionInfo", getExceptionInfo())

@ -77,20 +77,20 @@ public interface ISysJobService
public void run(SysJob job) throws SchedulerException; public void run(SysJob job) throws SchedulerException;
/** /**
* *
* *
* @param job * @param job
* @return * @return
*/ */
public int insertJobCron(SysJob job) throws SchedulerException, TaskException; public int insertJob(SysJob job) throws SchedulerException, TaskException;
/** /**
* *
* *
* @param job * @param job
* @return * @return
*/ */
public int updateJobCron(SysJob job) throws SchedulerException, TaskException; public int updateJob(SysJob job) throws SchedulerException, TaskException;
/** /**
* cron * cron

@ -2,6 +2,8 @@ package com.ruoyi.quartz.service.impl;
import java.util.List; import java.util.List;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import org.quartz.JobDataMap;
import org.quartz.JobKey;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -32,6 +34,7 @@ public class SysJobServiceImpl implements ISysJobService
/** /**
* *
* ID
*/ */
@PostConstruct @PostConstruct
public void init() throws SchedulerException, TaskException public void init() throws SchedulerException, TaskException
@ -39,7 +42,7 @@ public class SysJobServiceImpl implements ISysJobService
List<SysJob> jobList = jobMapper.selectJobAll(); List<SysJob> jobList = jobMapper.selectJobAll();
for (SysJob job : jobList) for (SysJob job : jobList)
{ {
ScheduleUtils.updateScheduleJob(scheduler, job); updateSchedulerJob(job, job.getJobGroup());
} }
} }
@ -76,11 +79,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int pauseJob(SysJob job) throws SchedulerException public int pauseJob(SysJob job) throws SchedulerException
{ {
Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
int rows = jobMapper.updateJob(job); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.pauseJob(scheduler, job.getJobId()); scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -94,11 +99,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int resumeJob(SysJob job) throws SchedulerException public int resumeJob(SysJob job) throws SchedulerException
{ {
Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
job.setStatus(ScheduleConstants.Status.NORMAL.getValue()); job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
int rows = jobMapper.updateJob(job); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.resumeJob(scheduler, job.getJobId()); scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -112,10 +119,12 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public int deleteJob(SysJob job) throws SchedulerException public int deleteJob(SysJob job) throws SchedulerException
{ {
int rows = jobMapper.deleteJobById(job.getJobId()); Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
int rows = jobMapper.deleteJobById(jobId);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.deleteScheduleJob(scheduler, job.getJobId()); scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
} }
return rows; return rows;
} }
@ -169,7 +178,13 @@ public class SysJobServiceImpl implements ISysJobService
@Transactional @Transactional
public void run(SysJob job) throws SchedulerException public void run(SysJob job) throws SchedulerException
{ {
ScheduleUtils.run(scheduler, selectJobById(job.getJobId())); Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
SysJob properties = selectJobById(job.getJobId());
// 参数
JobDataMap dataMap = new JobDataMap();
dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties);
scheduler.triggerJob(ScheduleUtils.getJobKey(jobId, jobGroup), dataMap);
} }
/** /**
@ -179,7 +194,7 @@ public class SysJobServiceImpl implements ISysJobService
*/ */
@Override @Override
@Transactional @Transactional
public int insertJobCron(SysJob job) throws SchedulerException, TaskException public int insertJob(SysJob job) throws SchedulerException, TaskException
{ {
job.setStatus(ScheduleConstants.Status.PAUSE.getValue()); job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
int rows = jobMapper.insertJob(job); int rows = jobMapper.insertJob(job);
@ -197,16 +212,36 @@ public class SysJobServiceImpl implements ISysJobService
*/ */
@Override @Override
@Transactional @Transactional
public int updateJobCron(SysJob job) throws SchedulerException, TaskException public int updateJob(SysJob job) throws SchedulerException, TaskException
{ {
SysJob properties = selectJobById(job.getJobId());
int rows = jobMapper.updateJob(job); int rows = jobMapper.updateJob(job);
if (rows > 0) if (rows > 0)
{ {
ScheduleUtils.updateScheduleJob(scheduler, job); updateSchedulerJob(job, properties.getJobGroup());
} }
return rows; return rows;
} }
/**
*
*
* @param job
* @param jobGroup
*/
public void updateSchedulerJob(SysJob job, String jobGroup) throws SchedulerException, TaskException
{
Long jobId = job.getJobId();
// 判断是否存在
JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
if (scheduler.checkExists(jobKey))
{
// 防止创建时存在数据问题 先移除,然后在执行创建操作
scheduler.deleteJob(jobKey);
}
ScheduleUtils.createScheduleJob(scheduler, job);
}
/** /**
* cron * cron
* *

@ -1,6 +1,7 @@
package com.ruoyi.quartz.task; package com.ruoyi.quartz.task;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import com.ruoyi.common.utils.StringUtils;
/** /**
* *
@ -10,6 +11,11 @@ import org.springframework.stereotype.Component;
@Component("ryTask") @Component("ryTask")
public class RyTask public class RyTask
{ {
public void ryMultipleParams(String s, Boolean b, Long l, Double d, Integer i)
{
System.out.println(StringUtils.format("执行多参方法: 字符串类型{},布尔类型{},长整型{},浮点型{},整形{}", s, b, l, d, i));
}
public void ryParams(String params) public void ryParams(String params)
{ {
System.out.println("执行有参方法:" + params); System.out.println("执行有参方法:" + params);

@ -76,8 +76,7 @@ public abstract class AbstractQuartzJob implements Job
final SysJobLog sysJobLog = new SysJobLog(); final SysJobLog sysJobLog = new SysJobLog();
sysJobLog.setJobName(sysJob.getJobName()); sysJobLog.setJobName(sysJob.getJobName());
sysJobLog.setJobGroup(sysJob.getJobGroup()); sysJobLog.setJobGroup(sysJob.getJobGroup());
sysJobLog.setMethodName(sysJob.getMethodName()); sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
sysJobLog.setMethodParams(sysJob.getMethodParams());
sysJobLog.setStartTime(startTime); sysJobLog.setStartTime(startTime);
sysJobLog.setEndTime(new Date()); sysJobLog.setEndTime(new Date());
long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime(); long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime();

@ -2,6 +2,8 @@ package com.ruoyi.quartz.util;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.LinkedList;
import java.util.List;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils; import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.quartz.domain.SysJob; import com.ruoyi.quartz.domain.SysJob;
@ -20,11 +22,21 @@ public class JobInvokeUtil
*/ */
public static void invokeMethod(SysJob sysJob) throws Exception public static void invokeMethod(SysJob sysJob) throws Exception
{ {
Object bean = SpringUtils.getBean(sysJob.getJobName()); String invokeTarget = sysJob.getInvokeTarget();
String methodName = sysJob.getMethodName(); String beanName = getBeanName(invokeTarget);
String methodParams = sysJob.getMethodParams(); String methodName = getMethodName(invokeTarget);
List<Object[]> methodParams = getMethodParams(invokeTarget);
invokeSpringBean(bean, methodName, methodParams); if (!isValidClassName(beanName))
{
Object bean = SpringUtils.getBean(beanName);
invokeMethod(bean, methodName, methodParams);
}
else
{
Object bean = Class.forName(beanName).newInstance();
invokeMethod(bean, methodName, methodParams);
}
} }
/** /**
@ -34,14 +46,14 @@ public class JobInvokeUtil
* @param methodName * @param methodName
* @param methodParams * @param methodParams
*/ */
private static void invokeSpringBean(Object bean, String methodName, String methodParams) private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
InvocationTargetException InvocationTargetException
{ {
if (StringUtils.isNotEmpty(methodParams)) if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
{ {
Method method = bean.getClass().getDeclaredMethod(methodName, String.class); Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
method.invoke(bean, methodParams); method.invoke(bean, getMethodParamsValue(methodParams));
} }
else else
{ {
@ -49,4 +61,122 @@ public class JobInvokeUtil
method.invoke(bean); method.invoke(bean);
} }
} }
/**
* class
*
* @param str
* @return true false
*/
public static boolean isValidClassName(String invokeTarget)
{
return StringUtils.countMatches(invokeTarget, ".") > 1;
}
/**
* bean
*
* @param invokeTarget
* @return bean
*/
public static String getBeanName(String invokeTarget)
{
String beanName = StringUtils.substringBefore(invokeTarget, "(");
return StringUtils.substringBeforeLast(beanName, ".");
}
/**
* bean
*
* @param invokeTarget
* @return method
*/
public static String getMethodName(String invokeTarget)
{
String methodName = StringUtils.substringBefore(invokeTarget, "(");
return StringUtils.substringAfterLast(methodName, ".");
}
/**
* method
*
* @param invokeTarget
* @return method
*/
public static List<Object[]> getMethodParams(String invokeTarget)
{
String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
if (StringUtils.isEmpty(methodStr))
{
return null;
}
String[] methodParams = methodStr.split(",");
List<Object[]> classs = new LinkedList<>();
for (int i = 0; i < methodParams.length; i++)
{
String str = StringUtils.trimToEmpty(methodParams[i]);
// String字符串类型包含'
if (StringUtils.contains(str, "'"))
{
classs.add(new Object[] { StringUtils.replace(str, "'", ""), String.class });
}
// boolean布尔类型等于true或者false
else if (StringUtils.equals(str, "true") || StringUtils.equalsIgnoreCase(str, "false"))
{
classs.add(new Object[] { Boolean.valueOf(str), Boolean.class });
}
// long长整形包含L
else if (StringUtils.containsIgnoreCase(str, "L"))
{
classs.add(new Object[] { Long.valueOf(StringUtils.replaceIgnoreCase(str, "L", "")), Long.class });
}
// double浮点类型包含D
else if (StringUtils.containsIgnoreCase(str, "D"))
{
classs.add(new Object[] { Double.valueOf(StringUtils.replaceIgnoreCase(str, "D", "")), Double.class });
}
// 其他类型归类为整形
else
{
classs.add(new Object[] { Integer.valueOf(str), Integer.class });
}
}
return classs;
}
/**
*
*
* @param methodParams
* @return
*/
public static Class<?>[] getMethodParamsType(List<Object[]> methodParams)
{
Class<?>[] classs = new Class<?>[methodParams.size()];
int index = 0;
for (Object[] os : methodParams)
{
classs[index] = (Class<?>) os[1];
index++;
}
return classs;
}
/**
*
*
* @param methodParams
* @return
*/
public static Object[] getMethodParamsValue(List<Object[]> methodParams)
{
Object[] classs = new Object[methodParams.size()];
int index = 0;
for (Object[] os : methodParams)
{
classs[index] = (Object) os[0];
index++;
}
return classs;
}
} }

@ -4,15 +4,12 @@ import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger; import org.quartz.CronTrigger;
import org.quartz.Job; import org.quartz.Job;
import org.quartz.JobBuilder; import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail; import org.quartz.JobDetail;
import org.quartz.JobKey; import org.quartz.JobKey;
import org.quartz.Scheduler; import org.quartz.Scheduler;
import org.quartz.SchedulerException; import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder; import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey; import org.quartz.TriggerKey;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ruoyi.common.constant.ScheduleConstants; import com.ruoyi.common.constant.ScheduleConstants;
import com.ruoyi.common.exception.job.TaskException; import com.ruoyi.common.exception.job.TaskException;
import com.ruoyi.common.exception.job.TaskException.Code; import com.ruoyi.common.exception.job.TaskException.Code;
@ -26,8 +23,6 @@ import com.ruoyi.quartz.domain.SysJob;
*/ */
public class ScheduleUtils public class ScheduleUtils
{ {
private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class);
/** /**
* quartz * quartz
* *
@ -41,35 +36,19 @@ public class ScheduleUtils
} }
/** /**
* key *
*/ */
public static TriggerKey getTriggerKey(Long jobId) public static TriggerKey getTriggerKey(Long jobId, String jobGroup)
{ {
return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId); return TriggerKey.triggerKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
} }
/** /**
* jobKey *
*/ */
public static JobKey getJobKey(Long jobId) public static JobKey getJobKey(Long jobId, String jobGroup)
{ {
return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId); return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
}
/**
*
*/
public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId)
{
try
{
return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
}
catch (SchedulerException e)
{
log.error("getCronTrigger 异常:", e);
}
return null;
} }
/** /**
@ -79,24 +58,26 @@ public class ScheduleUtils
{ {
Class<? extends Job> jobClass = getQuartzJobClass(job); Class<? extends Job> jobClass = getQuartzJobClass(job);
// 构建job信息 // 构建job信息
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(job.getJobId())).build(); Long jobId = job.getJobId();
String jobGroup = job.getJobGroup();
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(getJobKey(jobId, jobGroup)).build();
// 表达式调度构建器 // 表达式调度构建器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression());
cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder); cronScheduleBuilder = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
// 按新的cronExpression表达式构建一个新的trigger // 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId())) CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
.withSchedule(cronScheduleBuilder).build(); .withSchedule(cronScheduleBuilder).build();
// 放入参数,运行时的方法可以获取 // 放入参数,运行时的方法可以获取
jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job); jobDetail.getJobDataMap().put(ScheduleConstants.TASK_PROPERTIES, job);
// 判断是否存在 // 判断是否存在
if (scheduler.checkExists(getJobKey(job.getJobId()))) if (scheduler.checkExists(getJobKey(jobId, jobGroup)))
{ {
// 防止创建时存在数据问题 先移除,然后在执行创建操作 // 防止创建时存在数据问题 先移除,然后在执行创建操作
scheduler.deleteJob(getJobKey(job.getJobId())); scheduler.deleteJob(getJobKey(jobId, jobGroup));
} }
scheduler.scheduleJob(jobDetail, trigger); scheduler.scheduleJob(jobDetail, trigger);
@ -104,54 +85,13 @@ public class ScheduleUtils
// 暂停任务 // 暂停任务
if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue())) if (job.getStatus().equals(ScheduleConstants.Status.PAUSE.getValue()))
{ {
pauseJob(scheduler, job.getJobId()); scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
}
}
/**
*
*/
public static void updateScheduleJob(Scheduler scheduler, SysJob job) throws SchedulerException, TaskException
{
createScheduleJob(scheduler, job);
}
/**
*
*/
public static void run(Scheduler scheduler, SysJob job) throws SchedulerException
{
// 参数
JobDataMap dataMap = new JobDataMap();
dataMap.put(ScheduleConstants.TASK_PROPERTIES, job);
scheduler.triggerJob(getJobKey(job.getJobId()), dataMap);
} }
/**
*
*/
public static void pauseJob(Scheduler scheduler, Long jobId) throws SchedulerException
{
scheduler.pauseJob(getJobKey(jobId));
} }
/** /**
* *
*/ */
public static void resumeJob(Scheduler scheduler, Long jobId) throws SchedulerException
{
scheduler.resumeJob(getJobKey(jobId));
}
/**
*
*/
public static void deleteScheduleJob(Scheduler scheduler, Long jobId) throws SchedulerException
{
scheduler.deleteJob(getJobKey(jobId));
}
public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb) public static CronScheduleBuilder handleCronScheduleMisfirePolicy(SysJob job, CronScheduleBuilder cb)
throws TaskException throws TaskException
{ {

@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<id property="jobLogId" column="job_log_id" /> <id property="jobLogId" column="job_log_id" />
<result property="jobName" column="job_name" /> <result property="jobName" column="job_name" />
<result property="jobGroup" column="job_group" /> <result property="jobGroup" column="job_group" />
<result property="methodName" column="method_name" /> <result property="invokeTarget" column="invoke_target" />
<result property="methodParams" column="method_params" />
<result property="jobMessage" column="job_message" /> <result property="jobMessage" column="job_message" />
<result property="status" column="status" /> <result property="status" column="status" />
<result property="exceptionInfo" column="exception_info" /> <result property="exceptionInfo" column="exception_info" />
@ -17,7 +16,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectJobLogVo"> <sql id="selectJobLogVo">
select job_log_id, job_name, job_group, method_name, method_params, job_message, status, exception_info, create_time select job_log_id, job_name, job_group, invoke_target, job_message, status, exception_info, create_time
from sys_job_log from sys_job_log
</sql> </sql>
@ -30,8 +29,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="status != null and status != ''"> <if test="status != null and status != ''">
AND status = #{status} AND status = #{status}
</if> </if>
<if test="methodName != null and methodName != ''"> <if test="invokeTarget != null and invokeTarget != ''">
AND method_name like concat('%', #{methodName}, '%') AND invoke_target like concat('%', #{invokeTarget}, '%')
</if> </if>
<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 --> <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d') and date_format(create_time,'%y%m%d') &gt;= date_format(#{params.beginTime},'%y%m%d')
@ -71,8 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobLogId != null and jobLogId != 0">job_log_id,</if> <if test="jobLogId != null and jobLogId != 0">job_log_id,</if>
<if test="jobName != null and jobName != ''">job_name,</if> <if test="jobName != null and jobName != ''">job_name,</if>
<if test="jobGroup != null and jobGroup != ''">job_group,</if> <if test="jobGroup != null and jobGroup != ''">job_group,</if>
<if test="methodName != null and methodName != ''">method_name,</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
<if test="methodParams != null and methodParams != ''">method_params,</if>
<if test="jobMessage != null and jobMessage != ''">job_message,</if> <if test="jobMessage != null and jobMessage != ''">job_message,</if>
<if test="status != null and status != ''">status,</if> <if test="status != null and status != ''">status,</if>
<if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if> <if test="exceptionInfo != null and exceptionInfo != ''">exception_info,</if>
@ -81,8 +79,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if> <if test="jobLogId != null and jobLogId != 0">#{jobLogId},</if>
<if test="jobName != null and jobName != ''">#{jobName},</if> <if test="jobName != null and jobName != ''">#{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
<if test="methodName != null and methodName != ''">#{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if> <if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
<if test="status != null and status != ''">#{status},</if> <if test="status != null and status != ''">#{status},</if>
<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if> <if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>

@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<id property="jobId" column="job_id" /> <id property="jobId" column="job_id" />
<result property="jobName" column="job_name" /> <result property="jobName" column="job_name" />
<result property="jobGroup" column="job_group" /> <result property="jobGroup" column="job_group" />
<result property="methodName" column="method_name" /> <result property="invokeTarget" column="invoke_target" />
<result property="methodParams" column="method_params" />
<result property="cronExpression" column="cron_expression" /> <result property="cronExpression" column="cron_expression" />
<result property="misfirePolicy" column="misfire_policy" /> <result property="misfirePolicy" column="misfire_policy" />
<result property="concurrent" column="concurrent" /> <result property="concurrent" column="concurrent" />
@ -22,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap> </resultMap>
<sql id="selectJobVo"> <sql id="selectJobVo">
select job_id, job_name, job_group, method_name, method_params, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark select job_id, job_name, job_group, invoke_target, cron_expression, misfire_policy, concurrent, status, create_by, create_time, remark
from sys_job from sys_job
</sql> </sql>
@ -32,11 +31,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobName != null and jobName != ''"> <if test="jobName != null and jobName != ''">
AND job_name like concat('%', #{jobName}, '%') AND job_name like concat('%', #{jobName}, '%')
</if> </if>
<if test="jobGroup != null and jobGroup != ''">
AND job_group = #{jobGroup}
</if>
<if test="status != null and status != ''"> <if test="status != null and status != ''">
AND status = #{status} AND status = #{status}
</if> </if>
<if test="methodName != null and methodName != ''"> <if test="invokeTarget != null and invokeTarget != ''">
AND method_name like concat('%', #{methodName}, '%') AND invoke_target like concat('%', #{invokeTarget}, '%')
</if> </if>
</where> </where>
</select> </select>
@ -66,8 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<set> <set>
<if test="jobName != null and jobName != ''">job_name = #{jobName},</if> <if test="jobName != null and jobName != ''">job_name = #{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">job_group = #{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">job_group = #{jobGroup},</if>
<if test="methodName != null and methodName != ''">method_name = #{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target = #{invokeTarget},</if>
<if test="methodParams != null">method_params = #{methodParams},</if>
<if test="cronExpression != null and cronExpression != ''">cron_expression = #{cronExpression},</if> <if test="cronExpression != null and cronExpression != ''">cron_expression = #{cronExpression},</if>
<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy = #{misfirePolicy},</if> <if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy = #{misfirePolicy},</if>
<if test="concurrent != null and concurrent != ''">concurrent = #{concurrent},</if> <if test="concurrent != null and concurrent != ''">concurrent = #{concurrent},</if>
@ -84,8 +85,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobId != null and jobId != 0">job_id,</if> <if test="jobId != null and jobId != 0">job_id,</if>
<if test="jobName != null and jobName != ''">job_name,</if> <if test="jobName != null and jobName != ''">job_name,</if>
<if test="jobGroup != null and jobGroup != ''">job_group,</if> <if test="jobGroup != null and jobGroup != ''">job_group,</if>
<if test="methodName != null and methodName != ''">method_name,</if> <if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
<if test="methodParams != null and methodParams != ''">method_params,</if>
<if test="cronExpression != null and cronExpression != ''">cron_expression,</if> <if test="cronExpression != null and cronExpression != ''">cron_expression,</if>
<if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy,</if> <if test="misfirePolicy != null and misfirePolicy != ''">misfire_policy,</if>
<if test="concurrent != null and concurrent != ''">concurrent,</if> <if test="concurrent != null and concurrent != ''">concurrent,</if>
@ -97,8 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="jobId != null and jobId != 0">#{jobId},</if> <if test="jobId != null and jobId != 0">#{jobId},</if>
<if test="jobName != null and jobName != ''">#{jobName},</if> <if test="jobName != null and jobName != ''">#{jobName},</if>
<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if> <if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
<if test="methodName != null and methodName != ''">#{methodName},</if> <if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
<if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if> <if test="cronExpression != null and cronExpression != ''">#{cronExpression},</if>
<if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if> <if test="misfirePolicy != null and misfirePolicy != ''">#{misfirePolicy},</if>
<if test="concurrent != null and concurrent != ''">#{concurrent},</if> <if test="concurrent != null and concurrent != ''">#{concurrent},</if>

@ -14,21 +14,20 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="jobGroup" id="jobGroup" required> <select name="jobGroup" class="form-control m-b" th:with="type=${@dict.getType('sys_job_group')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label ">方法名称</label> <label class="col-sm-3 control-label ">调用目标字符串</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="methodName" id="methodName" required> <input class="form-control" type="text" name="invokeTarget" id="invokeTarget" required>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Bean调用示例ryTask.ryParams('ry')</span>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')</span>
<div class="form-group"> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 参数说明:支持字符串,布尔类型,长整型,浮点型,整形</span>
<label class="col-sm-3 control-label ">方法参数:</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="methodParams" id="methodParams">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

@ -18,13 +18,13 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="form-control-static" th:text="${jobLog.jobGroup}"> <div class="form-control-static" th:text="${jobLog.jobGroup}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务方法</label> <label class="col-sm-3 control-label">调用目标字符串</label>
<div class="form-control-static" th:text="${jobLog.methodName} + '(' + ${#strings.defaultString(jobLog.methodParams,'')} + ')'"> <div class="form-control-static" th:text="${jobLog.invokeTarget}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -56,13 +56,13 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="form-control-static" th:text="${job.jobGroup}"> <div class="form-control-static" th:text="${job.jobGroup}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务方法</label> <label class="col-sm-3 control-label">调用目标字符串</label>
<div class="form-control-static" th:text="${job.methodName} + '(' + ${#strings.defaultString(job.methodParams,'')} + ')'"> <div class="form-control-static" th:text="${job.invokeTarget}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">

@ -15,21 +15,20 @@
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label">任务组</label> <label class="col-sm-3 control-label">任务组:</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="jobGroup" id="jobGroup" th:field="*{jobGroup}" required> <select name="jobGroup" class="form-control m-b" th:with="type=${@dict.getType('sys_job_group')}">
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{jobGroup}"></option>
</select>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
<label class="col-sm-3 control-label ">方法名称</label> <label class="col-sm-3 control-label ">调用目标字符串</label>
<div class="col-sm-8"> <div class="col-sm-8">
<input class="form-control" type="text" name="methodName" id="methodName" th:field="*{methodName}" required> <input class="form-control" type="text" name="invokeTarget" id="invokeTarget" th:field="*{invokeTarget}" required>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Bean调用示例ryTask.ryParams('ry')</span>
</div> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Class类调用示例com.ruoyi.quartz.task.RyTask.ryParams('ry')</span>
<div class="form-group"> <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 参数说明:支持字符串,布尔类型,长整型,浮点型,整形</span>
<label class="col-sm-3 control-label ">方法参数:</label>
<div class="col-sm-8">
<input class="form-control" type="text" name="methodParams" id="methodParams" th:field="*{methodParams}">
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -77,15 +76,6 @@
$("#form-job-edit").validate({ $("#form-job-edit").validate({
onkeyup: false, onkeyup: false,
rules:{ rules:{
jobName:{
required:true,
},
jobGroup:{
required:true,
},
methodName:{
required:true,
},
cronExpression:{ cronExpression:{
required:true, required:true,
remote: { remote: {

@ -14,7 +14,10 @@
任务名称:<input type="text" name="jobName"/> 任务名称:<input type="text" name="jobName"/>
</li> </li>
<li> <li>
方法名称:<input type="text" name="methodName"/> 任务分组:<select name="jobGroup" th:with="type=${@dict.getType('sys_job_group')}">
<option value="">所有</option>
<option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
</select>
</li> </li>
<li> <li>
任务状态:<select name="status" th:with="type=${@dict.getType('sys_job_status')}"> 任务状态:<select name="status" th:with="type=${@dict.getType('sys_job_status')}">
@ -60,7 +63,7 @@
var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]]; var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]];
var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]]; var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]];
var statusFlag = [[${@permission.hasPermi('monitor:job:changeStatus')}]]; var statusFlag = [[${@permission.hasPermi('monitor:job:changeStatus')}]];
var datas = [[${@dict.getType('sys_job_status')}]]; var datas = [[${@dict.getType('sys_job_group')}]];
var prefix = ctx + "monitor/job"; var prefix = ctx + "monitor/job";
$(function() { $(function() {
@ -84,20 +87,20 @@
{ {
field: 'jobName', field: 'jobName',
title: '任务名称', title: '任务名称',
sortable: true
}, },
{ {
field: 'jobGroup', field: 'jobGroup',
title: '任务组名', title: '任务分组',
sortable: true formatter: function(value, row, index) {
}, return $.table.selectDictLabel(datas, value);
{ }
field: 'methodName',
title: '方法名称'
}, },
{ {
field: 'methodParams', field: 'invokeTarget',
title: '方法参数' title: '调用目标字符串',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
}, },
{ {
field: 'cronExpression', field: 'cronExpression',
@ -121,7 +124,7 @@
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
var actions = []; var actions = [];
actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="javascript:void(0)" onclick="run(\'' + row.jobId + '\')"><i class="fa fa-play-circle-o"></i> 执行一次</a> '); actions.push('<a class="btn btn-primary btn-xs ' + statusFlag + '" href="javascript:void(0)" onclick="run(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"><i class="fa fa-play-circle-o"></i> 执行一次</a> ');
actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> '); actions.push('<a class="btn btn-warning btn-xs ' + detailFlag + '" href="javascript:void(0)" onclick="$.operate.detail(\'' + row.jobId + '\')"><i class="fa fa-search"></i>详细</a> ');
return actions.join(''); return actions.join('');
} }
@ -133,30 +136,30 @@
/* 调度任务状态显示 */ /* 调度任务状态显示 */
function statusTools(row) { function statusTools(row) {
if (row.status == 1) { if (row.status == 1) {
return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\')"></i> '; return '<i class=\"fa fa-toggle-off text-info fa-2x\" onclick="start(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"></i> ';
} else { } else {
return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\')"></i> '; return '<i class=\"fa fa-toggle-on text-info fa-2x\" onclick="stop(\'' + row.jobId + '\', \'' + row.jobGroup + '\')"></i> ';
} }
} }
/* 立即执行一次 */ /* 立即执行一次 */
function run(jobId) { function run(jobId, jobGroup) {
$.modal.confirm("确认要立即执行一次任务吗?", function() { $.modal.confirm("确认要立即执行一次任务吗?", function() {
$.operate.post(prefix + "/run", { "jobId": jobId}); $.operate.post(prefix + "/run", { "jobId": jobId, "jobId": jobId, "jobGroup": jobGroup});
}) })
} }
/* 调度任务-停用 */ /* 调度任务-停用 */
function stop(jobId) { function stop(jobId, jobGroup) {
$.modal.confirm("确认要停用任务吗?", function() { $.modal.confirm("确认要停用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 1 }); $.operate.post(prefix + "/changeStatus", { "jobId": jobId, "jobGroup": jobGroup, "status": 1 });
}) })
} }
/* 调度任务-启用 */ /* 调度任务-启用 */
function start(jobId) { function start(jobId, jobGroup) {
$.modal.confirm("确认要启用任务吗?", function() { $.modal.confirm("确认要启用任务吗?", function() {
$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 0 }); $.operate.post(prefix + "/changeStatus", { "jobId": jobId, "jobGroup": jobGroup, "status": 0 });
}) })
} }

@ -58,7 +58,8 @@
<th:block th:include="include :: footer" /> <th:block th:include="include :: footer" />
<script th:inline="javascript"> <script th:inline="javascript">
var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]]; var detailFlag = [[${@permission.hasPermi('monitor:job:detail')}]];
var datas = [[${@dict.getType('sys_common_status')}]]; var statusDatas = [[${@dict.getType('sys_common_status')}]];
var groupDatas = [[${@dict.getType('sys_job_group')}]];
var prefix = ctx + "monitor/jobLog"; var prefix = ctx + "monitor/jobLog";
$(function() { $(function() {
@ -80,21 +81,21 @@
}, },
{ {
field: 'jobName', field: 'jobName',
title: '任务名称', title: '任务名称'
sortable: true
}, },
{ {
field: 'jobGroup', field: 'jobGroup',
title: '任务组名', title: '任务分组',
sortable: true formatter: function(value, row, index) {
}, return $.table.selectDictLabel(groupDatas, value);
{ }
field: 'methodName',
title: '方法名称'
}, },
{ {
field: 'methodParams', field: 'invokeTarget',
title: '方法参数' title: '调用目标字符串',
formatter: function(value, row, index) {
return $.table.tooltip(value);
}
}, },
{ {
field: 'jobMessage', field: 'jobMessage',
@ -105,7 +106,7 @@
title: '状态', title: '状态',
align: 'center', align: 'center',
formatter: function(value, row, index) { formatter: function(value, row, index) {
return $.table.selectDictLabel(datas, value); return $.table.selectDictLabel(statusDatas, value);
} }
}, },
{ {

@ -34,6 +34,7 @@ insert into sys_dept values(107, 101, '0,100,101', '运维部门', 5, '若
insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); insert into sys_dept values(108, 102, '0,100,102', '市场部门', 1, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00'); insert into sys_dept values(109, 102, '0,100,102', '财务部门', 2, '若依', '15888888888', 'ry@qq.com', '0', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00');
-- ---------------------------- -- ----------------------------
-- 2、用户信息表 -- 2、用户信息表
-- ---------------------------- -- ----------------------------
@ -244,7 +245,9 @@ insert into sys_menu values('1054', '任务详细', '110', '6', '#', '', 'F', '
insert into sys_menu values('1055', '任务导出', '110', '7', '#', '', 'F', '0', 'monitor:job:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('1055', '任务导出', '110', '7', '#', '', 'F', '0', 'monitor:job:export', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- 代码生成按钮 -- 代码生成按钮
insert into sys_menu values('1056', '生成查询', '114', '1', '#', '', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('1056', '生成查询', '114', '1', '#', '', 'F', '0', 'tool:gen:list', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('1057', '生成代码', '114', '2', '#', '', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_menu values('1057', '生成修改', '114', '2', '#', '', 'F', '0', 'tool:gen:edit', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('1058', '生成删除', '114', '3', '#', '', 'F', '0', 'tool:gen:remove', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_menu values('1059', '生成代码', '114', '4', '#', '', 'F', '0', 'tool:gen:code', '#', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- ---------------------------- -- ----------------------------
@ -356,6 +359,8 @@ insert into sys_role_menu values ('2', '1054');
insert into sys_role_menu values ('2', '1055'); insert into sys_role_menu values ('2', '1055');
insert into sys_role_menu values ('2', '1056'); insert into sys_role_menu values ('2', '1056');
insert into sys_role_menu values ('2', '1057'); insert into sys_role_menu values ('2', '1057');
insert into sys_role_menu values ('2', '1058');
insert into sys_role_menu values ('2', '1059');
-- ---------------------------- -- ----------------------------
-- 8、角色和部门关联表 角色1-N部门 -- 8、角色和部门关联表 角色1-N部门
@ -468,7 +473,6 @@ create table sys_dict_data
primary key (dict_code) primary key (dict_code)
) engine=innodb auto_increment=100 comment = '字典数据表'; ) engine=innodb auto_increment=100 comment = '字典数据表';
insert into sys_dict_data values(1, 1, '', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别男'); insert into sys_dict_data values(1, 1, '', '0', 'sys_user_sex', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别男');
insert into sys_dict_data values(2, 2, '', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别女'); insert into sys_dict_data values(2, 2, '', '1', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别女');
insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别未知'); insert into sys_dict_data values(3, 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '性别未知');
@ -478,23 +482,25 @@ insert into sys_dict_data values(6, 1, '正常', '0', 'sys_normal_disable
insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态'); insert into sys_dict_data values(7, 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态'); insert into sys_dict_data values(8, 1, '正常', '0', 'sys_job_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态'); insert into sys_dict_data values(9, 2, '暂停', '1', 'sys_job_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
insert into sys_dict_data values(10, 1, '', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认是'); insert into sys_dict_data values(10, 1, '默认', 'DEFAULT', 'sys_job_group', '', '', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '任务分组');
insert into sys_dict_data values(11, 2, '', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认否'); insert into sys_dict_data values(11, 2, '系统', 'SYSTEM', 'sys_job_group', '', '', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '任务分组');
insert into sys_dict_data values(12, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '通知'); insert into sys_dict_data values(12, 1, '', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认是');
insert into sys_dict_data values(13, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '公告'); insert into sys_dict_data values(13, 2, '', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '系统默认否');
insert into sys_dict_data values(14, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态'); insert into sys_dict_data values(14, 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '通知');
insert into sys_dict_data values(15, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '关闭状态'); insert into sys_dict_data values(15, 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '公告');
insert into sys_dict_data values(16, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作'); insert into sys_dict_data values(16, 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
insert into sys_dict_data values(17, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '修改操作'); insert into sys_dict_data values(17, 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '关闭状态');
insert into sys_dict_data values(18, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '删除操作'); insert into sys_dict_data values(18, 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '新增操作');
insert into sys_dict_data values(19, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '授权操作'); insert into sys_dict_data values(19, 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '修改操作');
insert into sys_dict_data values(20, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '导出操作'); insert into sys_dict_data values(20, 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '删除操作');
insert into sys_dict_data values(21, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '导入操作'); insert into sys_dict_data values(21, 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '授权操作');
insert into sys_dict_data values(22, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '强退操作'); insert into sys_dict_data values(22, 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '导出操作');
insert into sys_dict_data values(23, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '生成操作'); insert into sys_dict_data values(23, 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '导入操作');
insert into sys_dict_data values(24, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '清空操作'); insert into sys_dict_data values(24, 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '强退操作');
insert into sys_dict_data values(25, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态'); insert into sys_dict_data values(25, 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '生成操作');
insert into sys_dict_data values(26, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态'); insert into sys_dict_data values(26, 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '清空操作');
insert into sys_dict_data values(27, 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '正常状态');
insert into sys_dict_data values(28, 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '停用状态');
-- ---------------------------- -- ----------------------------
@ -564,9 +570,8 @@ drop table if exists sys_job;
create table sys_job ( create table sys_job (
job_id bigint(20) not null auto_increment comment '任务ID', job_id bigint(20) not null auto_increment comment '任务ID',
job_name varchar(64) default '' comment '任务名称', job_name varchar(64) default '' comment '任务名称',
job_group varchar(64) default '' comment '任务组名', job_group varchar(64) default 'DEFAULT' comment '任务组名',
method_name varchar(500) default '' comment '任务方法', invoke_target varchar(500) not null comment '调用目标字符串',
method_params varchar(50) default null comment '方法参数',
cron_expression varchar(255) default '' comment 'cron执行表达式', cron_expression varchar(255) default '' comment 'cron执行表达式',
misfire_policy varchar(20) default '3' comment '计划执行错误策略1立即执行 2执行一次 3放弃执行', misfire_policy varchar(20) default '3' comment '计划执行错误策略1立即执行 2执行一次 3放弃执行',
concurrent char(1) default '1' comment '是否并发执行0允许 1禁止', concurrent char(1) default '1' comment '是否并发执行0允许 1禁止',
@ -579,8 +584,9 @@ create table sys_job (
primary key (job_id, job_name, job_group) primary key (job_id, job_name, job_group)
) engine=innodb auto_increment=100 comment = '定时任务调度表'; ) engine=innodb auto_increment=100 comment = '定时任务调度表';
insert into sys_job values(1, 'ryTask', '系统默认(无参)', 'ryNoParams', '', '0/10 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_job values(1, '系统默认(无参)', 'DEFAULT', 'ryTask.ryNoParams', '0/10 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_job values(2, 'ryTask', '系统默认(有参)', 'ryParams', 'ry', '0/20 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', ''); insert into sys_job values(2, '系统默认(有参)', 'DEFAULT', 'ryTask.ryParams(\'ry\')', '0/15 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
insert into sys_job values(3, '系统默认(多参)', 'DEFAULT', 'ryTask.ryMultipleParams(\'ry\', true, 2000L, 316.50D, 100)', '0/20 * * * * ?', '3', '1', '1', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '');
-- ---------------------------- -- ----------------------------
@ -591,8 +597,7 @@ create table sys_job_log (
job_log_id bigint(20) not null auto_increment comment '任务日志ID', job_log_id bigint(20) not null auto_increment comment '任务日志ID',
job_name varchar(64) not null comment '任务名称', job_name varchar(64) not null comment '任务名称',
job_group varchar(64) not null comment '任务组名', job_group varchar(64) not null comment '任务组名',
method_name varchar(500) comment '任务方法', invoke_target varchar(500) not null comment '调用目标字符串',
method_params varchar(50) default null comment '方法参数',
job_message varchar(500) comment '日志信息', job_message varchar(500) comment '日志信息',
status char(1) default '0' comment '执行状态0正常 1失败', status char(1) default '0' comment '执行状态0正常 1失败',
exception_info varchar(2000) default '' comment '异常信息', exception_info varchar(2000) default '' comment '异常信息',
@ -624,3 +629,59 @@ create table sys_notice (
-- ---------------------------- -- ----------------------------
insert into sys_notice values('1', '温馨提醒2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员'); insert into sys_notice values('1', '温馨提醒2018-07-01 若依新版本发布啦', '2', '新版本内容', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
insert into sys_notice values('2', '维护通知2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员'); insert into sys_notice values('2', '维护通知2018-07-01 若依系统凌晨维护', '1', '维护内容', '0', 'admin', '2018-03-16 11-33-00', 'ry', '2018-03-16 11-33-00', '管理员');
-- ----------------------------
-- 19、代码生成业务表
-- ----------------------------
drop table if exists gen_table;
create table gen_table (
table_id bigint(20) not null auto_increment comment '编号',
table_name varchar(200) default '' comment '表名称',
table_comment varchar(500) default '' comment '表描述',
class_name varchar(100) default '' comment '实体类名称',
tpl_category varchar(200) comment '使用的模板1单表操作',
package_name varchar(100) comment '生成包路径',
module_name varchar(30) comment '生成模块名',
business_name varchar(30) comment '生成业务名',
function_name varchar(50) comment '生成功能名',
function_author varchar(50) comment '生成功能作者',
options varchar(1000) comment '其它生成选项',
create_by varchar(64) default '' comment '创建者',
create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者',
update_time datetime comment '更新时间',
remark varchar(500) default null comment '备注',
primary key (table_id)
) engine=innodb auto_increment=1 comment = '代码生成业务表';
-- ----------------------------
-- 20、代码生成业务表字段
-- ----------------------------
drop table if exists gen_table_column;
create table gen_table_column (
column_id bigint(20) not null auto_increment comment '编号',
table_id varchar(64) comment '归属表编号',
column_name varchar(200) comment '列名称',
column_comment varchar(500) comment '列描述',
column_type varchar(100) comment '列类型',
java_type varchar(500) comment 'JAVA类型',
java_field varchar(200) comment 'JAVA字段名',
is_pk char(1) comment '是否主键1是',
is_increment char(1) comment '是否自增1是',
is_required char(1) comment '是否必填1是',
is_insert char(1) comment '是否为插入字段1是',
is_edit char(1) comment '是否编辑字段1是',
is_list char(1) comment '是否列表字段1是',
is_query char(1) comment '是否查询字段1是',
query_type varchar(200) default '=' comment '查询方式(等于、不等于、大于、小于、范围)',
html_type varchar(200) comment '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
dict_type varchar(200) default '' comment '字典类型',
sort int comment '排序',
create_by varchar(64) default '' comment '创建者',
create_time datetime comment '创建时间',
update_by varchar(64) default '' comment '更新者',
update_time datetime comment '更新时间',
primary key (column_id)
) comment = '代码生成业务表字段';
Loading…
Cancel
Save