yuanhao il y a 2 ans
Parent
commit
4730e9d984

+ 8 - 0
in-cloud-ui/src/api/quartz.js

@@ -31,6 +31,14 @@ export function getJobName(name) {
   })
 }
 
+
+export function getJobTime(name) {
+  return request({
+    url: '/quartz/jobTime/'+name,
+    method: 'get'
+  })
+}
+
 export function delObj(id) {
   return request({
     url: '/quartz/' + id,

+ 7 - 0
in-cloud-ui/src/api/quartzBase.js

@@ -37,6 +37,13 @@ export function getInCode(code) {
   })
 }
 
+export function getChoose(code) {
+  return request({
+    url: '/quartzBase/choose/' + code,
+    method: 'get'
+  })
+}
+
 
 export function delObj(id) {
   return request({

+ 92 - 32
in-cloud-ui/src/views/quartz/quartzBase/index.vue

@@ -51,15 +51,14 @@
         label="执行类"
       />
 
+      <el-table-column show-overflow-tooltip prop="code" label="编码" />
+      <el-table-column show-overflow-tooltip prop="sor" label="排序" />
+
       <el-table-column
         show-overflow-tooltip
-        prop="code"
-        label="编码"
-      />
-      <el-table-column
-        show-overflow-tooltip
-        prop="sor"
-        label="排序"
+        prop="type"
+        label="类型"
+        :formatter="formatType"
       />
       <el-table-column show-overflow-tooltip prop="description" label="描述" />
       <el-table-column
@@ -108,10 +107,7 @@
         </el-form-item>
 
         <el-form-item label="编码" prop="code">
-          <el-input
-            v-model.trim="form.code"
-            autocomplete="off"
-          ></el-input>
+          <el-input v-model.trim="form.code" autocomplete="off"></el-input>
         </el-form-item>
 
         <el-form-item label="排序" prop="sor">
@@ -122,15 +118,30 @@
           ></el-input>
         </el-form-item>
 
-        <el-form-item label="描述" prop="description">
-          <el-input
-            v-model.trim="form.description"
-            autocomplete="off"
-          ></el-input>
+        <el-form-item label="类型" prop="type">
+          <el-select
+            v-model.trim="form.type"
+            clearable
+            placeholder="请选择"
+            :disabled="typeEdit"
+            @change="typeChange"
+          >
+            <el-option
+              v-for="item in types"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
         </el-form-item>
 
         <el-form-item label="所属公司" prop="inCode">
-          <el-select v-model.trim="form.inCode" clearable placeholder="请选择">
+          <el-select
+            v-model.trim="form.inCode"
+            clearable
+            placeholder="请选择"
+            :disabled="companyEdit"
+          >
             <el-option
               v-for="item in companys"
               :key="item.code"
@@ -139,6 +150,13 @@
             ></el-option>
           </el-select>
         </el-form-item>
+
+        <el-form-item label="描述" prop="description">
+          <el-input
+            v-model.trim="form.description"
+            autocomplete="off"
+          ></el-input>
+        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="close">取 消</el-button>
@@ -149,13 +167,14 @@
 </template>
 
 <script>
-import {
-  fetchList,
-  addObj,
-  putObj,
-  delObj,
-  getExecuteClass, getCode
-} from "@/api/quartzBase";
+  import {
+    fetchList,
+    addObj,
+    putObj,
+    delObj,
+    getExecuteClass,
+    getCode,
+  } from '@/api/quartzBase'
   import { getAll } from '@/api/integrationCompany'
   export default {
     name: 'QuartzBase',
@@ -191,26 +210,40 @@ import {
         })
       }
 
+      const validateSor = (rule, value, callback) => {
+
+        if (!value) {
+          return callback(new Error('请输入排序'))
+        }
+        let isTel =/^([0-9]+\.?[0-9]*|-[0-9]+\.?[0-9]*)$/.test(value);
+        if (!isTel) {
+          return callback(new Error('请输入整数'))
+        } else {
+          return callback()
+        }
+      }
+
       return {
+        typeEdit: false,
+        companyEdit: false,
         dialogFormVisible: false,
         dialogType: '',
         title: '',
         tableData: [],
         companys: [],
-
         searchForm: {
           code: null,
           name: null,
         },
         form: {},
-        imgShow: true,
-        list: [],
-        imageList: [],
+        types: [
+          { label: '公共', value: 'PUBLIC' },
+          { label: '私有', value: 'PRIVATE' },
+        ],
         listLoading: true,
         layout: 'total, sizes, prev, pager, next, jumper',
         total: 0,
         background: true,
-        selectRows: '',
         elementLoadingText: '正在加载...',
         page: {
           total: 0, // 总页数
@@ -237,11 +270,19 @@ import {
               validator: validateCode,
             },
           ],
+
+          type: [
+            {
+              required: true,
+              trigger: 'blur',
+              message: '请输入类型'
+            },
+          ],
           sor: [
             {
               required: true,
               trigger: 'blur',
-              message: '请输入排序'
+              validator: validateSor,
             },
           ],
         },
@@ -256,8 +297,9 @@ import {
       this.getCompany()
     },
     methods: {
-      handleChange(value){this.form.sor = value}
-      ,
+      handleChange(value) {
+        this.form.sor = value
+      },
       getCompany() {
         getAll()
           .then((response) => {
@@ -316,12 +358,14 @@ import {
         this.$emit('fetch-data')
       },
       handleAdd() {
+        this.typeEdit = false
         this.form = {}
         this.title = '新增'
         this.dialogType = 'add'
         this.dialogFormVisible = true
       },
       handleEdit(row) {
+        this.typeEdit = true
         this.form = row
         this.title = '修改'
         this.dialogType = 'edit'
@@ -394,6 +438,22 @@ import {
           }
         }
       },
+      formatType(row, column) {
+        for (let i = 0; i < this.types.length; i++) {
+          if (row.type == this.types[i].value) {
+            return this.types[i].label
+          }
+        }
+      },
+
+      typeChange(value) {
+        if (value == 'PUBLIC') {
+          this.$set(this.form, 'inCode', null)
+          this.companyEdit = true
+        } else {
+          this.companyEdit = false
+        }
+      },
     },
   }
 </script>

+ 39 - 29
in-cloud-ui/src/views/quartz/quartzInfo/index.vue

@@ -41,20 +41,18 @@
       :height="height"
       :header-cell-style="{ 'text-align': 'center' }"
       :cell-style="{ 'text-align': 'center' }"
+      @expand-change="expandChange"
     >
       >
 
       <el-table-column type="expand">
         <template slot-scope="props">
           <el-form label-position="left" inline class="demo-table-expand">
-            <el-form-item label="鉴权URL:">
-              <span>{{ props.row.comUrl }}</span>
+            <el-form-item label="最后执行时间:">
+              <span>{{ props.row.nextFireTime }}</span>
             </el-form-item>
-            <el-form-item label="推送数据URL:">
-              <span>{{ props.row.pushUrl }}</span>
-            </el-form-item>
-            <el-form-item label="拉取数据URL:">
-              <span>{{ props.row.pullUrl }}</span>
+            <el-form-item label="下次执行时间:">
+              <span>{{ props.row.laetFireTime }}</span>
             </el-form-item>
           </el-form>
         </template>
@@ -110,6 +108,7 @@
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="场站" prop="name">
           <el-select
+            :disabled="isEdit"
             v-model="form.stationCode"
             placeholder="请选择"
             @change="selectStationChange($event)"
@@ -125,6 +124,8 @@
 
         <el-form-item label="执行类" prop="executeClass">
           <el-select
+            :disabled="isEdit"
+            style="width: 100%"
             v-model="form.executeClass"
             placeholder="请选择"
             @change="selectExecuteClassChange($event)"
@@ -134,7 +135,11 @@
               :key="item.executeClass"
               :label="item.name"
               :value="item.executeClass"
-            ></el-option>
+            >
+
+              <span style="float: left">{{ item.name }}</span>
+              <span style="float: right; color: #8492a6; font-size: 13px">{{ item.type }}</span>
+            </el-option>
           </el-select>
         </el-form-item>
 
@@ -171,13 +176,13 @@
           <el-input v-model.trim="form.name" autocomplete="off"></el-input>
         </el-form-item>
 
-        <el-form-item label="任务状态" prop="jobState">
+        <el-form-item label="任务操作" prop="operate">
           <el-select
-            v-model="form.jobState"
+            v-model="form.operate"
             placeholder="请选择"
           >
             <el-option
-              v-for="item in state"
+              v-for="item in operates"
               :key="item.value"
               :label="item.label"
               :value="item.value"
@@ -190,14 +195,12 @@
         <el-form-item label="开始时间" prop="startTime">
           <el-date-picker
             v-model.trim="form.startTime"
+            value-format="timestamp"
             type="datetime"
             placeholder="选择日期时间">
           </el-date-picker>
         </el-form-item>
 
-        <el-form-item label="类型" prop="jobType">
-          <el-input v-model.trim="form.jobType" autocomplete="off"></el-input>
-        </el-form-item>
       </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button @click="close">取 消</el-button>
@@ -208,8 +211,8 @@
 </template>
 
 <script>
-  import { fetchList, addObj, putObj, delObj,getJobName } from '@/api/quartz'
-  import { getCode, getInCode } from "@/api/quartzBase";
+  import { fetchList, addObj, putObj, delObj,getJobName,getJobTime } from '@/api/quartz'
+  import { getChoose } from "@/api/quartzBase";
 
   import { getAll } from '@/api/station'
   import { cron } from 'vue-cron'
@@ -222,7 +225,7 @@
         if (!value) {
           return callback(new Error('请输入任务标识'))
         }
-        getJobName(this.form.code, value).then((response) => {
+        getJobName(this.form.jobName, value).then((response) => {
           if (this.dialogType === 'edit') callback()
           let result = response.data
           if (result !== null) {
@@ -233,6 +236,7 @@
         })
       }
       return {
+        isEdit: false,
         cronPopover: false,
         cron: '',
         stations: [],
@@ -243,7 +247,7 @@
         title: '',
         tableData: [],
         companys: [],
-        state: [
+        operates: [
           { label: '启动', value: 'start' },
           { label: '停止', value: 'stop' },
           { label: '重载', value: 'restart' },
@@ -257,14 +261,10 @@
           jobName: null,
           cronExpression: null,
         },
-        imgShow: true,
-        list: [],
-        imageList: [],
         listLoading: true,
         layout: 'total, sizes, prev, pager, next, jumper',
         total: 0,
         background: true,
-        selectRows: '',
         elementLoadingText: '正在加载...',
         page: {
           total: 0, // 总页数
@@ -279,7 +279,7 @@
           ],
 
           jobName: [
-            { required: true, trigger: 'blur',  validator: validateJobName, },
+            { required: true, trigger: 'change',  validator: validateJobName, },
           ],
 
           cronExpression: [
@@ -289,9 +289,6 @@
           startTime: [
             { required: true, trigger: 'blur', message: '请输入开始时间' },
           ],
-          jobState: [
-            { required: true, trigger: 'blur', message: '请输入状态' },
-          ],
         },
       }
     },
@@ -304,6 +301,15 @@
       this.getStations()
     },
     methods: {
+      expandChange(row, expandedRows){
+        getJobTime(row.jobName)
+          .then((response) => {
+            row.nextFireTime = response.data.nextFireTime
+            row.laetFireTime = response.data.previousFireTime
+
+          })
+
+      },
       changeCron(v) {
         this.form.cronExpression = v
       },
@@ -320,7 +326,7 @@
           })
       },
       getQuartzBaseInCode() {
-        getInCode(this.inCode)
+        getChoose(this.inCode)
           .then((response) => {
             this.quartzBases = response.data
 
@@ -401,6 +407,7 @@
         this.dialogFormVisible = true
       },
       handleEdit(row) {
+      this.isEdit = true
         this.form = row
         this.title = '修改'
         this.dialogType = 'edit'
@@ -408,12 +415,14 @@
       },
       handleDelete(row) {
         this.$baseConfirm('你确定要删除当前项吗', null, async () => {
-          const { msg } = await delObj(row.id)
-          this.$baseMessage(msg, 'success')
+          await delObj(row.id)
+          this.$baseMessage("删除成功", 'success')
           this.fetchData()
         })
       },
       saveOrUpdate() {
+        this.form.nextFireTime = null;
+        this.form.laetFireTime = null;
         if (this.dialogType == 'add') {
           this.save()
         } else {
@@ -439,6 +448,7 @@
         })
       },
       update() {
+        console.log(this.form)
         this.$refs.form.validate((valid) => {
           if (valid) {
             this.listLoading = true

+ 9 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/controller/QuartzBaseController.java

@@ -4,12 +4,15 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.insu.common.core.util.R;
+import com.jiayue.insu.incloud.constants.CommonStant;
 import com.jiayue.insu.incloud.entity.Quartz;
 import com.jiayue.insu.incloud.entity.QuartzBase;
 import com.jiayue.insu.incloud.service.QuartzBaseService;
 import lombok.RequiredArgsConstructor;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 
 /**
  * QuartzController
@@ -80,6 +83,12 @@ public class QuartzBaseController {
         return R.ok(quartzBaseService.findByIncode(inCode));
     }
 
+    @GetMapping("/choose/{inCode}")
+    public R getChooseQuartz(@PathVariable("inCode") String  inCode){
+        return R.ok( quartzBaseService.getChooseQuartz(inCode));
+
+    }
+
     /**
      * 新增quartzBase
      *

+ 66 - 7
in-cloud/src/main/java/com/jiayue/insu/incloud/controller/QuartzController.java

@@ -1,15 +1,25 @@
 package com.jiayue.insu.incloud.controller;
 
+import cn.hutool.core.date.DateUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.insu.common.core.util.R;
 import com.jiayue.insu.incloud.entity.IntegrationCompany;
 import com.jiayue.insu.incloud.entity.Quartz;
+import com.jiayue.insu.incloud.quartz.ScheduledTask;
 import com.jiayue.insu.incloud.service.IntegrationCompanyService;
 import com.jiayue.insu.incloud.service.QuartzService;
 import lombok.RequiredArgsConstructor;
+import org.quartz.SchedulerException;
 import org.springframework.web.bind.annotation.*;
 
+import java.text.ParseException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Handler;
+
 
 /**
  * QuartzController
@@ -23,6 +33,7 @@ import org.springframework.web.bind.annotation.*;
 public class QuartzController {
 
     private final QuartzService quartzService;
+    private final ScheduledTask scheduledTask;
 
     /**
      * 分页查询
@@ -34,7 +45,17 @@ public class QuartzController {
 
     @GetMapping("/page")
     public R getStationPage(Page page, Quartz quartz) {
-        return R.ok(quartzService.page(page, Wrappers.query(quartz)));
+        Page data = quartzService.page(page, Wrappers.query(quartz));
+        List<Quartz> records = data.getRecords();
+        try {
+            for (Quartz q:records){
+                q.setJobState(scheduledTask.getJobStatus(q.getJobName()));
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        return R.ok(data);
     }
 
     @GetMapping("/all")
@@ -62,8 +83,9 @@ public class QuartzController {
      */
 
     @PostMapping
-    public R save(@RequestBody  Quartz quartz) {
-        return R.ok(quartzService.save(quartz));
+    public R save(@RequestBody  Quartz quartz) throws SchedulerException, ParseException, ClassNotFoundException {
+
+        return R.ok(quartzService.saveQuartz(quartz));
     }
 
     /**
@@ -74,8 +96,8 @@ public class QuartzController {
      */
 
     @PutMapping
-    public R updateById(@RequestBody Quartz quartz) {
-        return R.ok(quartzService.updateById(quartz));
+    public R updateById(@RequestBody Quartz quartz) throws SchedulerException, ParseException, ClassNotFoundException {
+        return R.ok(quartzService.updateQuartz(quartz));
     }
 
     /**
@@ -85,8 +107,45 @@ public class QuartzController {
      * @return R
      */
     @DeleteMapping("/{id}")
-    public R removeById(@PathVariable Integer id) {
-        return R.ok(quartzService.removeById(id));
+    public R removeById(@PathVariable Integer id) throws SchedulerException {
+        return R.ok(quartzService.deleteQuartz(id));
+    }
+
+
+    /**
+     * 通过code查询定时任务
+     *
+     * @param jobName jobName
+     * @return R
+     */
+    @GetMapping("/jobTime/{jobName}")
+    public R getJobTime(@PathVariable("jobName") String  jobName) throws SchedulerException {
+        Map<String,String> map = new HashMap<>();
+        try {
+            Date jobNextFireTime = scheduledTask.getJobNextFireTime(jobName);
+
+            if(jobNextFireTime !=null){
+                map.put("nextFireTime", DateUtil.format(jobNextFireTime, "yyyy/MM/dd HH:mm:ss"));
+            }
+
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("nextFireTime", "不存在");
+        }
+
+        try {
+            Date previousFireTime = scheduledTask.getJobPreviousFireTime(jobName);
+            if(previousFireTime !=null){
+                map.put("previousFireTime", DateUtil.format(previousFireTime, "yyyy/MM/dd HH:mm:ss"));
+            }
+        }catch (Exception e){
+            e.printStackTrace();
+            map.put("previousFireTime", "不存在");
+        }
+
+
+        return R.ok(map);
+
     }
 
 

+ 2 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/entity/QuartzBase.java

@@ -33,6 +33,8 @@ public class QuartzBase extends BaseEntity{
     private String inCode;
     /*任务标识*/
     private String code;
+    /*任务类型*/
+    private String type;
 
 
 }

+ 0 - 13
in-cloud/src/main/java/com/jiayue/insu/incloud/quartz/job/TestJob.java

@@ -1,13 +0,0 @@
-package com.jiayue.insu.incloud.quartz.job;
-
-import cn.hutool.core.date.DateUtil;
-import org.quartz.Job;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-
-public class TestJob implements Job {
-    @Override
-    public void execute(JobExecutionContext context) throws JobExecutionException {
-        System.out.println(DateUtil.now());
-    }
-}

+ 4 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/QuartzBaseService.java

@@ -14,4 +14,8 @@ public interface QuartzBaseService extends IService<QuartzBase> {
 
     List<QuartzBase> findByIncode(String inCode);
 
+
+    List<QuartzBase> findByType(String type);
+
+    List<QuartzBase> getChooseQuartz(String inCode);
 }

+ 1 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/QuartzService.java

@@ -14,4 +14,5 @@ public interface QuartzService extends IService<Quartz> {
 
     boolean updateQuartz(Quartz quartz) throws SchedulerException, ClassNotFoundException, ParseException;
 
+    boolean deleteQuartz(Integer id) throws SchedulerException;
 }

+ 26 - 0
in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/QuartzBaseServiceImpl.java

@@ -2,11 +2,15 @@ package com.jiayue.insu.incloud.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.insu.incloud.constants.CommonStant;
 import com.jiayue.insu.incloud.entity.QuartzBase;
 import com.jiayue.insu.incloud.mapper.QuartzBaseMapper;
 import com.jiayue.insu.incloud.service.QuartzBaseService;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 
 @Service
@@ -32,4 +36,26 @@ public class QuartzBaseServiceImpl extends ServiceImpl<QuartzBaseMapper, QuartzB
         lambdaQueryWrapper.eq(QuartzBase::getInCode,inCode);
         return this.list(lambdaQueryWrapper);
     }
+
+    @Override
+    public List<QuartzBase> findByType(String type) {
+        LambdaQueryWrapper<QuartzBase> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(QuartzBase::getType, CommonStant.JOB_TYPE_PUBLIC);
+        return this.list(lambdaQueryWrapper);
+
+    }
+
+    @Override
+    public List<QuartzBase> getChooseQuartz(String inCode){
+        List<QuartzBase> result = new ArrayList<>();
+        LambdaQueryWrapper<QuartzBase> lambdaQueryWrapper = new LambdaQueryWrapper<>();
+        lambdaQueryWrapper.eq(QuartzBase::getType, CommonStant.JOB_TYPE_PUBLIC);
+        List<QuartzBase> list = this.list(lambdaQueryWrapper);
+        Collections.sort(list, Comparator.comparing(QuartzBase::getSor));
+        result.addAll(list);
+        List<QuartzBase> byIncode = findByIncode(inCode);
+        Collections.sort(byIncode, Comparator.comparing(QuartzBase::getSor));
+        result.addAll(byIncode);
+        return result;
+    }
 }

+ 11 - 3
in-cloud/src/main/java/com/jiayue/insu/incloud/service/impl/QuartzServiceImpl.java

@@ -28,7 +28,7 @@ public class QuartzServiceImpl extends ServiceImpl<QuartzMapper, Quartz> impleme
     @Override
     public boolean saveQuartz(Quartz quartz) throws SchedulerException, ClassNotFoundException, ParseException {
         this.save(quartz);
-        if(!quartz.getJobState().equals("stop")){
+        if(!quartz.getOperate().equals("stop")){
             scheduledTask.deleteJob(quartz.getJobName());
             Class c = Class.forName(quartz.getExecuteClass());
             scheduledTask.scheduleJob(c,quartz.getJobName(),quartz.getStartTime(),quartz.getCronExpression(),null);
@@ -38,8 +38,8 @@ public class QuartzServiceImpl extends ServiceImpl<QuartzMapper, Quartz> impleme
 
     @Override
     public boolean updateQuartz(Quartz quartz) throws SchedulerException, ClassNotFoundException, ParseException {
-        this.updateQuartz(quartz);
-        if(!quartz.getJobState().equals("stop")){
+        this.updateById(quartz);
+        if(!quartz.getOperate().equals("stop")){
             scheduledTask.deleteJob(quartz.getJobName());
             Class c = Class.forName(quartz.getExecuteClass());
             scheduledTask.scheduleJob(c,quartz.getJobName(),quartz.getStartTime(),quartz.getCronExpression(),null);
@@ -48,4 +48,12 @@ public class QuartzServiceImpl extends ServiceImpl<QuartzMapper, Quartz> impleme
         }
         return Boolean.TRUE;
     }
+
+    @Override
+    public boolean deleteQuartz(Integer id) throws SchedulerException {
+        Quartz quartz = this.getById(id);
+        this.removeById(quartz);
+        scheduledTask.deleteJob(quartz.getJobName());
+        return Boolean.TRUE;
+    }
 }