Explorar el Código

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

RuoYi hace 6 años
padre
commit
d21284f325
Se han modificado 20 ficheros con 1002 adiciones y 778 borrados
  1. 2 2
      ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js
  2. 3 5
      ruoyi-admin/src/main/resources/templates/system/user/add.html
  3. 3 5
      ruoyi-admin/src/main/resources/templates/system/user/edit.html
  4. 2 2
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java
  5. 10 26
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java
  6. 8 24
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java
  7. 5 5
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java
  8. 46 11
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java
  9. 6 0
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java
  10. 1 2
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java
  11. 138 8
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java
  12. 15 75
      ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java
  13. 6 9
      ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml
  14. 10 11
      ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml
  15. 9 10
      ruoyi-quartz/src/main/resources/templates/monitor/job/add.html
  16. 6 6
      ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html
  17. 9 19
      ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html
  18. 23 20
      ruoyi-quartz/src/main/resources/templates/monitor/job/job.html
  19. 13 12
      ruoyi-quartz/src/main/resources/templates/monitor/job/jobLog.html
  20. 687 526
      sql/ry_20190601.sql

+ 2 - 2
ruoyi-admin/src/main/resources/static/ruoyi/js/ry-ui.js

@@ -196,7 +196,7 @@
 				var pageNumber = table.pageNumber;
 				return pageSize * (pageNumber - 1) + index + 1;
 			},
-			// 列超出指定长度浮动提示(单击文本复制
+			// 列超出指定长度浮动提示(单击文本复制)
 			tooltip: function (value, length) {
 				var _length = $.common.isEmpty(length) ? 20 : length;
 				var _text = "";
@@ -386,7 +386,7 @@
             	var actions = [];
                 $.each(datas, function(index, dict) {
                     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));
                         return false;
                     }

+ 3 - 5
ruoyi-admin/src/main/resources/templates/system/user/add.html

@@ -71,11 +71,9 @@
                     <div class="form-group">
                         <label class="col-sm-4 control-label">用户性别:</label>
                         <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')}">
-				                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}"></option>
-				                </select>
-                            </div>
+                            <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>
+				            </select>
                         </div>
                     </div>
                 </div>

+ 3 - 5
ruoyi-admin/src/main/resources/templates/system/user/edit.html

@@ -85,11 +85,9 @@
                     <div class="form-group">
                         <label class="col-sm-4 control-label">用户性别:</label>
                         <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')}">
-				                    <option th:each="dict : ${type}" th:text="${dict.dictLabel}" th:value="${dict.dictValue}" th:field="*{sex}"></option>
-				                </select>
-                            </div>
+                            <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>
+				            </select>
                         </div>
                     </div>
                 </div>

+ 2 - 2
ruoyi-quartz/src/main/java/com/ruoyi/quartz/controller/SysJobController.java

@@ -127,7 +127,7 @@ public class SysJobController extends BaseController
     @ResponseBody
     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
     public AjaxResult editSave(SysJob job) throws SchedulerException, TaskException
     {
-        return toAjax(jobService.updateJobCron(job));
+        return toAjax(jobService.updateJob(job));
     }
 
     /**

+ 10 - 26
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJob.java

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

+ 8 - 24
ruoyi-quartz/src/main/java/com/ruoyi/quartz/domain/SysJobLog.java

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

+ 5 - 5
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/ISysJobService.java

@@ -77,20 +77,20 @@ public interface ISysJobService
     public void run(SysJob job) throws SchedulerException;
 
     /**
-     * 新增任务表达式
+     * 新增任务
      * 
      * @param job 调度信息
      * @return 结果
      */
-    public int insertJobCron(SysJob job) throws SchedulerException, TaskException;
+    public int insertJob(SysJob job) throws SchedulerException, TaskException;
 
     /**
-     * 更新任务的时间表达式
+     * 更新任务
      * 
      * @param job 调度信息
      * @return 结果
      */
-    public int updateJobCron(SysJob job) throws SchedulerException, TaskException;
+    public int updateJob(SysJob job) throws SchedulerException, TaskException;
 
     /**
      * 校验cron表达式是否有效
@@ -99,4 +99,4 @@ public interface ISysJobService
      * @return 结果
      */
     public boolean checkCronExpressionIsValid(String cronExpression);
-}
+}

+ 46 - 11
ruoyi-quartz/src/main/java/com/ruoyi/quartz/service/impl/SysJobServiceImpl.java

@@ -2,6 +2,8 @@ package com.ruoyi.quartz.service.impl;
 
 import java.util.List;
 import javax.annotation.PostConstruct;
+import org.quartz.JobDataMap;
+import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -31,7 +33,8 @@ public class SysJobServiceImpl implements ISysJobService
     private SysJobMapper jobMapper;
 
     /**
-     * 项目启动时,初始化定时器
+     * 项目启动时,初始化定时器 
+     * 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
      */
     @PostConstruct
     public void init() throws SchedulerException, TaskException
@@ -39,7 +42,7 @@ public class SysJobServiceImpl implements ISysJobService
         List<SysJob> jobList = jobMapper.selectJobAll();
         for (SysJob job : jobList)
         {
-            ScheduleUtils.updateScheduleJob(scheduler, job);
+            updateSchedulerJob(job, job.getJobGroup());
         }
     }
 
@@ -76,11 +79,13 @@ public class SysJobServiceImpl implements ISysJobService
     @Transactional
     public int pauseJob(SysJob job) throws SchedulerException
     {
+        Long jobId = job.getJobId();
+        String jobGroup = job.getJobGroup();
         job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
         int rows = jobMapper.updateJob(job);
         if (rows > 0)
         {
-            ScheduleUtils.pauseJob(scheduler, job.getJobId());
+            scheduler.pauseJob(ScheduleUtils.getJobKey(jobId, jobGroup));
         }
         return rows;
     }
@@ -94,11 +99,13 @@ public class SysJobServiceImpl implements ISysJobService
     @Transactional
     public int resumeJob(SysJob job) throws SchedulerException
     {
+        Long jobId = job.getJobId();
+        String jobGroup = job.getJobGroup();
         job.setStatus(ScheduleConstants.Status.NORMAL.getValue());
         int rows = jobMapper.updateJob(job);
         if (rows > 0)
         {
-            ScheduleUtils.resumeJob(scheduler, job.getJobId());
+            scheduler.resumeJob(ScheduleUtils.getJobKey(jobId, jobGroup));
         }
         return rows;
     }
@@ -112,10 +119,12 @@ public class SysJobServiceImpl implements ISysJobService
     @Transactional
     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)
         {
-            ScheduleUtils.deleteScheduleJob(scheduler, job.getJobId());
+            scheduler.deleteJob(ScheduleUtils.getJobKey(jobId, jobGroup));
         }
         return rows;
     }
@@ -169,7 +178,13 @@ public class SysJobServiceImpl implements ISysJobService
     @Transactional
     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
     @Transactional
-    public int insertJobCron(SysJob job) throws SchedulerException, TaskException
+    public int insertJob(SysJob job) throws SchedulerException, TaskException
     {
         job.setStatus(ScheduleConstants.Status.PAUSE.getValue());
         int rows = jobMapper.insertJob(job);
@@ -197,17 +212,37 @@ public class SysJobServiceImpl implements ISysJobService
      */
     @Override
     @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);
         if (rows > 0)
         {
-            ScheduleUtils.updateScheduleJob(scheduler, job);
+            updateSchedulerJob(job, properties.getJobGroup());
         }
         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表达式是否有效
      * 
      * @param cronExpression 表达式
@@ -218,4 +253,4 @@ public class SysJobServiceImpl implements ISysJobService
     {
         return CronUtils.isValid(cronExpression);
     }
-}
+}

+ 6 - 0
ruoyi-quartz/src/main/java/com/ruoyi/quartz/task/RyTask.java

@@ -1,6 +1,7 @@
 package com.ruoyi.quartz.task;
 
 import org.springframework.stereotype.Component;
+import com.ruoyi.common.utils.StringUtils;
 
 /**
  * 定时任务调度测试
@@ -10,6 +11,11 @@ import org.springframework.stereotype.Component;
 @Component("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)
     {
         System.out.println("执行有参方法:" + params);

+ 1 - 2
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/AbstractQuartzJob.java

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

+ 138 - 8
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/JobInvokeUtil.java

@@ -2,6 +2,8 @@ package com.ruoyi.quartz.util;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.spring.SpringUtils;
 import com.ruoyi.quartz.domain.SysJob;
@@ -20,11 +22,21 @@ public class JobInvokeUtil
      */
     public static void invokeMethod(SysJob sysJob) throws Exception
     {
-        Object bean = SpringUtils.getBean(sysJob.getJobName());
-        String methodName = sysJob.getMethodName();
-        String methodParams = sysJob.getMethodParams();
+        String invokeTarget = sysJob.getInvokeTarget();
+        String beanName = getBeanName(invokeTarget);
+        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 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,
             InvocationTargetException
     {
-        if (StringUtils.isNotEmpty(methodParams))
+        if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0)
         {
-            Method method = bean.getClass().getDeclaredMethod(methodName, String.class);
-            method.invoke(bean, methodParams);
+            Method method = bean.getClass().getDeclaredMethod(methodName, getMethodParamsType(methodParams));
+            method.invoke(bean, getMethodParamsValue(methodParams));
         }
         else
         {
@@ -49,4 +61,122 @@ public class JobInvokeUtil
             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;
+    }
 }

+ 15 - 75
ruoyi-quartz/src/main/java/com/ruoyi/quartz/util/ScheduleUtils.java

@@ -4,15 +4,12 @@ import org.quartz.CronScheduleBuilder;
 import org.quartz.CronTrigger;
 import org.quartz.Job;
 import org.quartz.JobBuilder;
-import org.quartz.JobDataMap;
 import org.quartz.JobDetail;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
 import org.quartz.SchedulerException;
 import org.quartz.TriggerBuilder;
 import org.quartz.TriggerKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 import com.ruoyi.common.constant.ScheduleConstants;
 import com.ruoyi.common.exception.job.TaskException;
 import com.ruoyi.common.exception.job.TaskException.Code;
@@ -26,8 +23,6 @@ import com.ruoyi.quartz.domain.SysJob;
  */
 public class ScheduleUtils
 {
-    private static final Logger log = LoggerFactory.getLogger(ScheduleUtils.class);
-
     /**
      * 得到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);
-    }
-
-    /**
-     * 获取表达式触发器
-     */
-    public static CronTrigger getCronTrigger(Scheduler scheduler, Long jobId)
-    {
-        try
-        {
-            return (CronTrigger) scheduler.getTrigger(getTriggerKey(jobId));
-        }
-        catch (SchedulerException e)
-        {
-            log.error("getCronTrigger 异常:", e);
-        }
-        return null;
+        return JobKey.jobKey(ScheduleConstants.TASK_CLASS_NAME + jobId, jobGroup);
     }
 
     /**
@@ -79,24 +58,26 @@ public class ScheduleUtils
     {
         Class<? extends Job> jobClass = getQuartzJobClass(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 = handleCronScheduleMisfirePolicy(job, cronScheduleBuilder);
 
         // 按新的cronExpression表达式构建一个新的trigger
-        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(job.getJobId()))
+        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(getTriggerKey(jobId, jobGroup))
                 .withSchedule(cronScheduleBuilder).build();
 
         // 放入参数,运行时的方法可以获取
         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);
@@ -104,54 +85,13 @@ public class ScheduleUtils
         // 暂停任务
         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)
             throws TaskException
     {
@@ -170,4 +110,4 @@ public class ScheduleUtils
                         + "' cannot be used in cron schedule tasks", Code.CONFIG_ERROR);
         }
     }
-}
+}

+ 6 - 9
ruoyi-quartz/src/main/resources/mapper/quartz/SysJobLogMapper.xml

@@ -8,8 +8,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 		<id     property="jobLogId"       column="job_log_id"      />
 		<result property="jobName"        column="job_name"        />
 		<result property="jobGroup"       column="job_group"       />
-		<result property="methodName"     column="method_name"     />
-		<result property="methodParams"   column="method_params"   />
+		<result property="invokeTarget"   column="invoke_target"   />
 		<result property="jobMessage"     column="job_message"     />
 		<result property="status"         column="status"          />
 		<result property="exceptionInfo"  column="exception_info"  />
@@ -17,7 +16,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 	</resultMap>
 	
 	<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
     </sql>
 	
@@ -30,8 +29,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 			<if test="status != null and status != ''">
 				AND status = #{status}
 			</if>
-			<if test="methodName != null and methodName != ''">
-				AND method_name like concat('%', #{methodName}, '%')
+			<if test="invokeTarget != null and invokeTarget != ''">
+				AND invoke_target like concat('%', #{invokeTarget}, '%')
 			</if>
 			<if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
 				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="jobName != null and jobName != ''">job_name,</if>
  			<if test="jobGroup != null and jobGroup != ''">job_group,</if>
- 			<if test="methodName != null and methodName != ''">method_name,</if>
- 			<if test="methodParams != null and methodParams != ''">method_params,</if>
+ 			<if test="invokeTarget != null and invokeTarget != ''">invoke_target,</if>
  			<if test="jobMessage != null and jobMessage != ''">job_message,</if>
  			<if test="status != null and status != ''">status,</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="jobName != null and jobName != ''">#{jobName},</if>
  			<if test="jobGroup != null and jobGroup != ''">#{jobGroup},</if>
- 			<if test="methodName != null and methodName != ''">#{methodName},</if>
- 			<if test="methodParams != null and methodParams != ''">#{methodParams},</if>
+ 			<if test="invokeTarget != null and invokeTarget != ''">#{invokeTarget},</if>
  			<if test="jobMessage != null and jobMessage != ''">#{jobMessage},</if>
  			<if test="status != null and status != ''">#{status},</if>
  			<if test="exceptionInfo != null and exceptionInfo != ''">#{exceptionInfo},</if>

+ 10 - 11
ruoyi-quartz/src/main/resources/mapper/quartz/SysJobMapper.xml

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

+ 9 - 10
ruoyi-quartz/src/main/resources/templates/monitor/job/add.html

@@ -14,21 +14,20 @@
 				</div>
 			</div>
 			<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">
-					<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 class="form-group">
-				<label class="col-sm-3 control-label ">方法名称:</label>
+				<label class="col-sm-3 control-label ">调用目标字符串:</label>
 				<div class="col-sm-8">
-					<input class="form-control" type="text" name="methodName" id="methodName" required>
-				</div>
-			</div>
-			<div class="form-group">
-				<label class="col-sm-3 control-label ">方法参数:</label>
-				<div class="col-sm-8">
-					<input class="form-control" type="text" name="methodParams" id="methodParams">
+					<input class="form-control" type="text" name="invokeTarget" id="invokeTarget" required>
+				    <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Bean调用示例:ryTask.ryParams('ry')</span>
+				    <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> Class类调用示例:com.ruoyi.quartz.task.RyTask.ryParams('ry')</span>
+				    <span class="help-block m-b-none"><i class="fa fa-info-circle"></i> 参数说明:支持字符串,布尔类型,长整型,浮点型,整形</span>
 				</div>
 			</div>
 			<div class="form-group">

+ 6 - 6
ruoyi-quartz/src/main/resources/templates/monitor/job/detail.html

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

+ 9 - 19
ruoyi-quartz/src/main/resources/templates/monitor/job/edit.html

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

+ 23 - 20
ruoyi-quartz/src/main/resources/templates/monitor/job/job.html

@@ -14,7 +14,10 @@
 								任务名称:<input type="text" name="jobName"/>
 							</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>
 								任务状态:<select name="status" th:with="type=${@dict.getType('sys_job_status')}">
@@ -60,7 +63,7 @@
 		var editFlag = [[${@permission.hasPermi('monitor:job:edit')}]];
 		var removeFlag = [[${@permission.hasPermi('monitor:job:remove')}]];
 		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";
 
 		$(function() {
@@ -84,20 +87,20 @@
 		        {
 		            field: 'jobName',
 		            title: '任务名称',
-		            sortable: true
 		        },
 		        {
 		            field: 'jobGroup',
-		            title: '任务组名',
-		            sortable: true
-		        },
-		        {
-		            field: 'methodName',
-		            title: '方法名称'
+		            title: '任务分组',
+		            formatter: function(value, row, index) {
+		            	return $.table.selectDictLabel(datas, value);
+		            }
 		        },
 		        {
-		            field: 'methodParams',
-		            title: '方法参数'
+		            field: 'invokeTarget',
+		            title: '调用目标字符串',
+		            formatter: function(value, row, index) {
+                    	return $.table.tooltip(value);
+                    }
 		        },
 		        {
 		            field: 'cronExpression',
@@ -121,7 +124,7 @@
 		            align: 'center',
 		            formatter: function(value, row, index) {
 		                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> ');
 		                return actions.join('');
 		            }
@@ -133,30 +136,30 @@
 		/* 调度任务状态显示 */
 		function statusTools(row) {
 		    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 {
-    			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() {
-				$.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() {
-				$.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() {
-				$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "status": 0 });
+				$.operate.post(prefix + "/changeStatus", { "jobId": jobId, "jobGroup": jobGroup, "status": 0 });
 		    })
 		}
 

+ 13 - 12
ruoyi-quartz/src/main/resources/templates/monitor/job/jobLog.html

@@ -58,7 +58,8 @@
 	<th:block th:include="include :: footer" />
 	<script th:inline="javascript">
 		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";
 
 		$(function() {
@@ -80,21 +81,21 @@
 		        },
 		        {
 		            field: 'jobName',
-		            title: '任务名称',
-		            sortable: true
+		            title: '任务名称'
 		        },
 		        {
 		            field: 'jobGroup',
-		            title: '任务组名',
-		            sortable: true
-		        },
-		        {
-		            field: 'methodName',
-		            title: '方法名称'
+		            title: '任务分组',
+		            formatter: function(value, row, index) {
+		            	return $.table.selectDictLabel(groupDatas, value);
+		            }
 		        },
 		        {
-		            field: 'methodParams',
-		            title: '方法参数'
+		            field: 'invokeTarget',
+		            title: '调用目标字符串',
+		            formatter: function(value, row, index) {
+                    	return $.table.tooltip(value);
+                    }
 		        },
 		        {
 		            field: 'jobMessage',
@@ -105,7 +106,7 @@
 		            title: '状态',
 		            align: 'center',
 		            formatter: function(value, row, index) {
-		            	return $.table.selectDictLabel(datas, value);
+		            	return $.table.selectDictLabel(statusDatas, value);
 		            }
 		        },
 		        {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 687 - 526
sql/ry_20190601.sql