Browse Source

Merge branch 'master' of https://e.coding.net/chuanghaikeji/smartCampus/backend_code

夏文涛 2 years atrás
parent
commit
1746bb594b

+ 5 - 3
src/main/java/com/template/api/SmartDataClassControllerAPI.java

@@ -8,6 +8,8 @@ import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * @Author: binguo
  * @Date: 2023/3/30 星期四 17:28
@@ -19,11 +21,11 @@ import org.springframework.web.bind.annotation.*;
 public interface SmartDataClassControllerAPI {
     @PostMapping(value = "/insertSmartDataClass")
     @ApiOperation(value = "添加数据源类别", notes = "添加数据源类别数据", httpMethod = "POST")
-    CommonResult insertSmartDataClass(@Validated @RequestBody SmartDataClass smartDataClass, BindingResult bindingResult);
+    CommonResult insertSmartDataClass(@Validated @RequestBody SmartDataClass smartDataClass, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/updateSmartDataClassById")
     @ApiOperation(value = "编辑数据源类别数据", notes = "编辑数据源类别数据", httpMethod = "POST")
-    CommonResult updateSmartDataClassById(@Validated @RequestBody SmartDataClass smartDataClass, BindingResult bindingResult);
+    CommonResult updateSmartDataClassById(@Validated @RequestBody SmartDataClass smartDataClass, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @GetMapping(value = "/queryPageSmartDataClass")
     @ApiOperation(value = "数据源类别分页数据", notes = "数据源类别分页数据", httpMethod = "GET")
@@ -31,5 +33,5 @@ public interface SmartDataClassControllerAPI {
 
     @GetMapping(value = "/deleteSmartDataClassById")
     @ApiOperation(value = "根据ID删除指定数据源类别", notes = "根据ID删除指定数据源类别", httpMethod = "GET")
-    CommonResult deleteSmartDataClassById(@RequestParam int id);
+    CommonResult deleteSmartDataClassById(@RequestParam int id, HttpServletRequest httpServletRequest);
 }

+ 5 - 3
src/main/java/com/template/api/SmartDataSourceControllerAPI.java

@@ -9,6 +9,8 @@ import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * @Author: binguo
  * @Date: 2023/3/30 星期四 17:28
@@ -20,7 +22,7 @@ import org.springframework.web.bind.annotation.*;
 public interface SmartDataSourceControllerAPI {
     @PostMapping(value = "/insertSmartDataSource")
     @ApiOperation(value = "添加数据源", notes = "添加数据源数据", httpMethod = "POST")
-    CommonResult insertSmartDataSource(@Validated @RequestBody SmartDataSource smartDataSource, BindingResult bindingResult);
+    CommonResult insertSmartDataSource(@Validated @RequestBody SmartDataSource smartDataSource, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/vcoSmartDataSource")
     @ApiOperation(value = "测试数据源连接有效性", notes = "测试数据源连接有效性", httpMethod = "POST")
@@ -28,7 +30,7 @@ public interface SmartDataSourceControllerAPI {
 
     @PostMapping(value = "/updateSmartDataSourceById")
     @ApiOperation(value = "编辑数据源数据", notes = "编辑数据源数据", httpMethod = "POST")
-    CommonResult updateSmartDataSourceById(@Validated @RequestBody SmartDataSource smartDataSource, BindingResult bindingResult);
+    CommonResult updateSmartDataSourceById(@Validated @RequestBody SmartDataSource smartDataSource, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @GetMapping(value = "/queryPageSmartDataSource")
     @ApiOperation(value = "数据源分页数据", notes = "数据源分页数据", httpMethod = "GET")
@@ -36,5 +38,5 @@ public interface SmartDataSourceControllerAPI {
 
     @GetMapping(value = "/deleteSmartDataSourceById")
     @ApiOperation(value = "根据ID删除指定数据源", notes = "根据ID删除指定数据源", httpMethod = "GET")
-    CommonResult deleteSmartDataSourceById(@RequestParam int id);
+    CommonResult deleteSmartDataSourceById(@RequestParam int id, HttpServletRequest httpServletRequest);
 }

+ 11 - 9
src/main/java/com/template/api/SmartDataTaskControllerAPI.java

@@ -8,6 +8,8 @@ import org.springframework.validation.BindingResult;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * @Author: binguo
  * @Date: 2023/3/30 星期四 17:28
@@ -19,35 +21,35 @@ import org.springframework.web.bind.annotation.*;
 public interface SmartDataTaskControllerAPI {
     @PostMapping(value = "/createJob")
     @ApiOperation(value = "创建定时任务", notes = "创建定时任务", httpMethod = "POST")
-    CommonResult createJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult createJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/pauseJob")
     @ApiOperation(value = "暂定定时任务", notes = "暂停定时任务", httpMethod = "POST")
-    CommonResult pauseJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult pauseJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/resumeJob")
     @ApiOperation(value = "恢复定时任务", notes = "恢复定时任务", httpMethod = "POST")
-    CommonResult resumeJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult resumeJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/updateJob")
     @ApiOperation(value = "修改定时任务", notes = "修改定时任务", httpMethod = "POST")
-    CommonResult updateJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult updateJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/deleteJob")
     @ApiOperation(value = "修改定时任务", notes = "修改定时任务", httpMethod = "POST")
-    CommonResult deleteJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult deleteJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/runOnceJob")
     @ApiOperation(value = "运行一次定时任务", notes = "运行一次定时任务", httpMethod = "POST")
-    CommonResult runOnceJob(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult runOnceJob(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/insertSmartDataTask")
     @ApiOperation(value = "添加数据源任务管理数据", notes = "添加数据源任务管理数据", httpMethod = "POST")
-    CommonResult insertSmartDataTask(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult insertSmartDataTask(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @PostMapping(value = "/updateSmartDataTaskById")
     @ApiOperation(value = "编辑数据源任务管理数据", notes = "编辑数据源任务管理数据", httpMethod = "POST")
-    CommonResult updateSmartDataTaskById(@Validated @RequestBody SmartDataTask smartDataTask, BindingResult bindingResult);
+    CommonResult updateSmartDataTaskById(@Validated @RequestBody SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult);
 
     @GetMapping(value = "/queryPageSmartDataTask")
     @ApiOperation(value = "数据源任务管理分页数据", notes = "数据源任务管理分页数据", httpMethod = "GET")
@@ -55,5 +57,5 @@ public interface SmartDataTaskControllerAPI {
 
     @GetMapping(value = "/deleteSmartDataTaskById")
     @ApiOperation(value = "根据ID删除数据源任务数据", notes = "根据ID删除数据源任务数据", httpMethod = "GET")
-    CommonResult deleteSmartDataTaskById(@RequestParam int id);
+    CommonResult deleteSmartDataTaskById(@RequestParam int id, HttpServletRequest httpServletRequest);
 }

+ 0 - 25
src/main/java/com/template/api/Task.java

@@ -1,25 +0,0 @@
-package com.template.api;
-
-import org.quartz.JobDetail;
-import org.quartz.JobExecutionContext;
-import org.quartz.JobExecutionException;
-import org.quartz.JobKey;
-import org.springframework.scheduling.quartz.QuartzJobBean;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-
-public class Task extends QuartzJobBean {
-    @Override
-    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
-        //输出当前时间
-        Date date = new Date();
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        String dateString = dateFormat.format(date);
-
-        JobDetail jobDetail = jobExecutionContext.getJobDetail();
-        JobKey key = jobDetail.getKey();
-        //工作内容
-        System.out.println("定时任务名称:【" + key.getName() + "】,执行时间:" + dateString);
-    }
-}

+ 56 - 1
src/main/java/com/template/common/utils/CommonUtil.java

@@ -1,5 +1,11 @@
 package com.template.common.utils;
 
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.interfaces.Claim;
+import com.auth0.jwt.interfaces.DecodedJWT;
+import com.template.model.pojo.RepairAdmin;
+import com.template.model.pojo.SmartDataSourceLog;
+import com.template.model.result.CommonResult;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.servlet.http.HttpServletRequest;
@@ -10,6 +16,8 @@ import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * 公共工具类
@@ -18,7 +26,8 @@ import java.util.*;
 public class CommonUtil {
     /**
      * 检测客户端参数
-     * @param code 状态码
+     *
+     * @param code   状态码
      * @param object 对象
      * @return 返回类型
      */
@@ -30,6 +39,52 @@ public class CommonUtil {
     }
 
     /**
+     * 生成日志对象
+     *
+     * @param str                字符串
+     * @param httpServletRequest 请求对象
+     * @return 返回对象
+     */
+    public static SmartDataSourceLog generateLog(String str, HttpServletRequest httpServletRequest) {
+        String serverIp = null;
+        try {
+            serverIp = InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+            throw new RuntimeException(e);
+        }
+        String clientIp = httpServletRequest.getRemoteAddr();
+        String token = httpServletRequest.getHeader("Authorization");
+        String account;
+        if (token != null) {
+            Map<String, Claim> map = JWT.decode(token).getClaims();
+            account = map.get("account").asString();
+        } else {
+            account = "";
+        }
+
+        String[] splitArr = str.split("\\|");
+
+        SmartDataSourceLog smartDataSourceLog = new SmartDataSourceLog();
+        smartDataSourceLog.setLogActionName(splitArr[0]);
+        smartDataSourceLog.setLogActionHost(serverIp);
+        smartDataSourceLog.setLogActionModule(splitArr[1]);
+        smartDataSourceLog.setLogActionBusiness(splitArr[2]);
+        smartDataSourceLog.setLogActionPeople(account);
+        smartDataSourceLog.setLogActionRemote(clientIp);
+        smartDataSourceLog.setLogActionClass(splitArr[3]);
+        return smartDataSourceLog;
+    }
+
+    public static String getNumberFromString(String string) {
+        Pattern pattern = Pattern.compile("\\d+");
+        Matcher matcher = pattern.matcher(string);
+        if (matcher.find()) {
+            return matcher.group();
+        }
+        return null;
+    }
+
+    /**
      * 获取ip
      *
      * @param request

+ 43 - 20
src/main/java/com/template/common/utils/QuartzJobUtils.java

@@ -1,14 +1,16 @@
 package com.template.common.utils;
 
 import com.template.model.pojo.SmartDataTask;
-import com.template.model.result.CommonResult;
 import org.quartz.*;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.Map;
 
 public class QuartzJobUtils {
 
-    private static final String JobClass = "com.template.api.Task";
+    private static final String JobClass = "com.template.controller.Task";
 
     /**
      * 创建定时任务
@@ -17,6 +19,7 @@ public class QuartzJobUtils {
      * @param smartDataTask 定时任务信息类
      */
     public static Map<String, Object> createScheduleJob(Scheduler scheduler, SmartDataTask smartDataTask) {
+        // 判断是否存在该任务
         Map<String, Object> exists = exists(scheduler, smartDataTask.getTkName());
         if ("0".equals(exists.get("code"))) {
             return exists;
@@ -35,7 +38,7 @@ public class QuartzJobUtils {
                     .withIdentity(smartDataTask.getTkName())
                     .withSchedule(cronScheduleBuilder)
                     .build();
-            //把触发器与任务进行绑定
+            // 把触发器与任务进行绑定
             scheduler.scheduleJob(jobDetail, cronTrigger);
 
             return CommonUtil.getReturnMap(String.valueOf(0), "定时任务【" + smartDataTask.getTkName() + "】创建成功!");
@@ -46,28 +49,48 @@ public class QuartzJobUtils {
         }
     }
 
+    public static String getNextExeTime(String cronExpression) {
+        // 创建CronExpression对象
+        CronExpression cron;
+        try {
+            cron = new CronExpression(cronExpression);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+
+        // 获取当前时间
+        long currentTimeMillis = System.currentTimeMillis();
+
+        // 计算下次执行时间
+        Date nextValidTimeMillis = cron.getNextValidTimeAfter(new Date(currentTimeMillis));
+
+        // 格式化输出
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        return sdf.format(nextValidTimeMillis);
+    }
+
     /**
      * 根据任务暂停定时任务
      *
      * @param scheduler 调度器
      * @param jobName   任务名称
      */
-    public static CommonResult pauseScheduleJob(Scheduler scheduler, String jobName) {
+    public static Map<String, Object> pauseScheduleJob(Scheduler scheduler, String jobName) {
         Map<String, Object> exists = exists(scheduler, jobName);
         if ("1".equals(exists.get("code"))) {
-            return CommonResult.fail((String) exists.get("msg"));
+            return exists;
         }
 
         JobKey jobKey = JobKey.jobKey(jobName);
         try {
             scheduler.pauseJob(jobKey);
-            return CommonResult.ok("定时任务【" + jobName + "】暂停成功!");
+            return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】暂停成功!");
         } catch (SchedulerException e) {
-            return CommonResult.ok("定时任务【" + jobName + "】暂停出错:" + e.getMessage());
+            return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】暂停出错:" + e.getMessage());
         }
     }
 
-    public static Map<String, Object> exists(Scheduler scheduler, String jobName) {
+    private static Map<String, Object> exists(Scheduler scheduler, String jobName) {
         JobKey jobKey = new JobKey(jobName);
         try {
             if (scheduler.getJobDetail(jobKey) != null) {
@@ -86,18 +109,18 @@ public class QuartzJobUtils {
      * @param scheduler 调度器
      * @param jobName   任务名称
      */
-    public static CommonResult resumeScheduleJob(Scheduler scheduler, String jobName) {
+    public static Map<String, Object> resumeScheduleJob(Scheduler scheduler, String jobName) {
         Map<String, Object> exists = exists(scheduler, jobName);
         if ("1".equals(exists.get("code"))) {
-            return CommonResult.fail((String) exists.get("msg"));
+            return exists;
         }
 
         JobKey jobKey = JobKey.jobKey(jobName);
         try {
             scheduler.resumeJob(jobKey);
-            return CommonResult.ok("定时任务【" + jobName + "】已恢复成功!");
+            return CommonUtil.getReturnMap("0", "定时任务【" + jobName + "】已恢复成功!");
         } catch (SchedulerException e) {
-            return CommonResult.ok("定时任务【" + jobName + "】恢复出错:" + e.getMessage());
+            return CommonUtil.getReturnMap("1", "定时任务【" + jobName + "】恢复出错:" + e.getMessage());
         }
     }
 
@@ -107,18 +130,18 @@ public class QuartzJobUtils {
      * @param scheduler 调度器
      * @param jobName   任务名称
      */
-    public static CommonResult runOnce(Scheduler scheduler, String jobName) {
+    public static Map<String, Object> runOnce(Scheduler scheduler, String jobName) {
         Map<String, Object> exists = exists(scheduler, jobName);
         if ("1".equals(exists.get("code"))) {
-            return CommonResult.fail((String) exists.get("msg"));
+            return exists;
         }
 
         JobKey jobKey = JobKey.jobKey(jobName);
         try {
             scheduler.triggerJob(jobKey);
-            return CommonResult.ok("定时任务【" + jobName + "】立即运行1次成功!");
+            return CommonUtil.getReturnMap("0","定时任务【" + jobName + "】立即运行1次成功!");
         } catch (SchedulerException e) {
-            return CommonResult.ok("定时任务【" + jobName + "】立即运行1次出错:" + e.getMessage());
+            return CommonUtil.getReturnMap("1","定时任务【" + jobName + "】立即运行1次出错:" + e.getMessage());
         }
     }
 
@@ -128,10 +151,10 @@ public class QuartzJobUtils {
      * @param scheduler     调度器
      * @param smartDataTask 定时任务信息类
      */
-    public static CommonResult updateScheduleJob(Scheduler scheduler, SmartDataTask smartDataTask) {
+    public static Map<String, Object> updateScheduleJob(Scheduler scheduler, SmartDataTask smartDataTask) {
         Map<String, Object> exists = exists(scheduler, smartDataTask.getTkName());
         if ("1".equals(exists.get("code"))) {
-            return CommonResult.fail((String) exists.get("msg"));
+            return exists;
         }
 
         try {
@@ -147,9 +170,9 @@ public class QuartzJobUtils {
                     .build();
             //重置对应的Job
             scheduler.rescheduleJob(triggerKey, trigger);
-            return CommonResult.ok("定时任务【" + smartDataTask.getTkName() + "】刷新成功!");
+            return CommonUtil.getReturnMap("0", "定时任务【" + smartDataTask.getTkName() + "】刷新成功!");
         } catch (SchedulerException e) {
-            return CommonResult.ok("定时任务【" + smartDataTask.getTkName() + "】刷新出错:" + e.getMessage());
+            return CommonUtil.getReturnMap("1", "定时任务【" + smartDataTask.getTkName() + "】刷新出错:" + e.getMessage());
         }
     }
 

+ 47 - 8
src/main/java/com/template/controller/SmartDataClassController.java

@@ -3,19 +3,27 @@ package com.template.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.template.api.SmartDataClassControllerAPI;
+import com.template.common.utils.CommonUtil;
 import com.template.common.utils.paramUtils;
 import com.template.model.pojo.SmartDataClass;
 import com.template.model.pojo.SmartDataSource;
+import com.template.model.pojo.SmartDataSourceLog;
 import com.template.model.result.CommonResult;
 import com.template.model.result.PageUtils;
 import com.template.services.SmartDataClassService;
+import com.template.services.SmartDataSourceLogService;
 import com.template.services.SmartDataSourceService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpRequest;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
 /**
  * <p>
  * 数据源类别 前端控制器
@@ -32,6 +40,9 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
     @Autowired
     private SmartDataSourceService smartDataSourceService;
 
+    @Autowired
+    private SmartDataSourceLogService smartDataSourceLogService;
+
     /**
      * 新增 数据源分类
      *
@@ -40,7 +51,7 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
      * @return
      */
     @Override
-    public CommonResult insertSmartDataClass(SmartDataClass smartDataClass, BindingResult bindingResult) {
+    public CommonResult insertSmartDataClass(SmartDataClass smartDataClass, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
@@ -62,9 +73,18 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
             return CommonResult.fail("数据源分类名称和驱动有重复,新增失败!");
         }
 
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("新增数据源分类|【数据交换中心】→【数据源分类管理】|新增【数据源分类】|create", httpServletRequest);
         int result = smartDataClassService.insertSmartDataClass(smartDataClass);
-
-        return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
+        if (result > 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok("添加成功");
+        } else {
+            smartDataSourceLog.setLogActionStatus(0);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.fail("添加失败");
+        }
     }
 
     /**
@@ -75,7 +95,7 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
      * @return
      */
     @Override
-    public CommonResult updateSmartDataClassById(SmartDataClass smartDataClass, BindingResult bindingResult) {
+    public CommonResult updateSmartDataClassById(SmartDataClass smartDataClass, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
@@ -97,8 +117,18 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
             return CommonResult.fail("数据源分类名称和驱动有重复,更新失败!");
         }
 
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("修改数据源分类|【数据交换中心】→【数据源分类管理】|修改【数据源分类】|update", httpServletRequest);
         int result = smartDataClassService.updateSmartDataClass(smartDataClass);
-        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+        if (result > 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok("修改成功");
+        } else {
+            smartDataSourceLog.setLogActionStatus(0);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.fail("修改失败");
+        }
     }
 
     /**
@@ -118,7 +148,7 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
 
 
     @Override
-    public CommonResult deleteSmartDataClassById(int id) {
+    public CommonResult deleteSmartDataClassById(int id, HttpServletRequest httpServletRequest) {
 
         SmartDataClass data = smartDataClassService.getSmartById(id);
 
@@ -134,9 +164,18 @@ public class SmartDataClassController implements SmartDataClassControllerAPI {
             return CommonResult.fail("当前类别下有数据,不能删除,删除失败!");
         }
 
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("删除数据源分类|【数据交换中心】→【数据源分类管理】|删除【数据源分类】|delete", httpServletRequest);
         int result = smartDataClassService.deleteSmartDataClassById(id);
-
-        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+        if (result > 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok("删除成功");
+        } else {
+            smartDataSourceLog.setLogActionStatus(0);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.fail("删除失败");
+        }
     }
 }
 

+ 45 - 9
src/main/java/com/template/controller/SmartDataSourceController.java

@@ -2,10 +2,13 @@ package com.template.controller;
 
 
 import com.template.api.SmartDataSourceControllerAPI;
+import com.template.common.utils.CommonUtil;
 import com.template.common.utils.paramUtils;
 import com.template.model.pojo.SmartDataSource;
+import com.template.model.pojo.SmartDataSourceLog;
 import com.template.model.result.CommonResult;
 import com.template.model.result.PageUtils;
+import com.template.services.SmartDataSourceLogService;
 import com.template.services.SmartDataSourceService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
@@ -13,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping;
 
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -29,6 +33,9 @@ public class SmartDataSourceController implements SmartDataSourceControllerAPI {
     @Autowired
     private SmartDataSourceService smartDataSourceService;
 
+    @Autowired
+    private SmartDataSourceLogService smartDataSourceLogService;
+
     /**
      * 新增数据源
      * @param smartDataSource 数据源
@@ -36,17 +43,30 @@ public class SmartDataSourceController implements SmartDataSourceControllerAPI {
      * @return
      */
     @Override
-    public CommonResult insertSmartDataSource(SmartDataSource smartDataSource, BindingResult bindingResult) {
+    public CommonResult insertSmartDataSource(SmartDataSource smartDataSource, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("新增数据源|【数据交换中心】→【数据源管理】|新增【数据源】|create", httpServletRequest);
         Map<String, Object> result = smartDataSourceService.insertSmartDataSource(smartDataSource);
-
-        return Integer.parseInt((String) result.get("code")) == 0 ? CommonResult.ok(result.get("msg")) : CommonResult.fail((String) result.get("msg"));
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
+    /**
+     * 测试 数据源连接状态
+     * @param smartDataSource
+     * @param bindingResult
+     * @return
+     */
     @Override
     public CommonResult vcoSmartDataSource(SmartDataSource smartDataSource, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
@@ -66,15 +86,23 @@ public class SmartDataSourceController implements SmartDataSourceControllerAPI {
      * @return
      */
     @Override
-    public CommonResult updateSmartDataSourceById(SmartDataSource smartDataSource, BindingResult bindingResult) {
+    public CommonResult updateSmartDataSourceById(SmartDataSource smartDataSource, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        Map<String, Object> result = smartDataSourceService.updateSmartDataSource(smartDataSource);
 
-        return Integer.parseInt((String) result.get("code")) > 0 ? CommonResult.ok(result.get("msg")) : CommonResult.fail((String) result.get("msg"));
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("更新数据源|【数据交换中心】→【数据源管理】|更新【数据源】|update", httpServletRequest);
+        Map<String, Object> result = smartDataSourceService.updateSmartDataSource(smartDataSource);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     /**
@@ -93,7 +121,7 @@ public class SmartDataSourceController implements SmartDataSourceControllerAPI {
 
 
     @Override
-    public CommonResult deleteSmartDataSourceById(int id) {
+    public CommonResult deleteSmartDataSourceById(int id, HttpServletRequest httpServletRequest) {
 
         SmartDataSource data = smartDataSourceService.getSmartById(id);
 
@@ -101,9 +129,17 @@ public class SmartDataSourceController implements SmartDataSourceControllerAPI {
             return CommonResult.fail("当前数据不存在,删除失败!");
         }
 
-        int result = smartDataSourceService.deleteSmartDataSourceById(id);
 
-        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("删除数据源|【数据交换中心】→【数据源管理】|删除【数据源】|delete", httpServletRequest);
+        int result = smartDataSourceService.deleteSmartDataSourceById(id);
+        if (result > 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok("删除成功");
+        } else {
+            return CommonResult.fail("删除失败");
+        }
     }
 }
 

+ 21 - 17
src/main/java/com/template/controller/SmartDataSourceLogController.java

@@ -60,6 +60,9 @@ public class SmartDataSourceLogController implements SmartDataSourceLogControlle
         if (smartDataSourceLog.getLogActionName() == null) {
             return CommonResult.fail("【操作名称】不能为空!");
         }
+        if (smartDataSourceLog.getLogActionStatus() == null) {
+            return CommonResult.fail("【操作状态】不能为空!");
+        }
 
         int result = smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
 
@@ -67,23 +70,6 @@ public class SmartDataSourceLogController implements SmartDataSourceLogControlle
     }
 
     /**
-     * 更新日志
-     * @param smartDataSourceLog 日志数据
-     * @param bindingResult
-     * @return
-     */
-//    @Override
-//    public CommonResult updateSmartDataSourceLogById(SmartDataSourceLog smartDataSourceLog, BindingResult bindingResult) {
-//        if (bindingResult.hasErrors()) {
-//            String st = paramUtils.getParamError(bindingResult);
-//            return CommonResult.fail(st);
-//        }
-//
-//        int result = smartDataSourceLogService.updateSmartDataSourceLog(smartDataSourceLog);
-//        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
-//    }
-
-    /**
      * 日志分页数据查询
      *
      * @param currentPage        当前页数
@@ -105,6 +91,24 @@ public class SmartDataSourceLogController implements SmartDataSourceLogControlle
     }
 
 
+    /**
+     * 更新日志
+     * @param smartDataSourceLog 日志数据
+     * @param bindingResult
+     * @return
+     */
+//    @Override
+//    public CommonResult updateSmartDataSourceLogById(SmartDataSourceLog smartDataSourceLog, BindingResult bindingResult) {
+//        if (bindingResult.hasErrors()) {
+//            String st = paramUtils.getParamError(bindingResult);
+//            return CommonResult.fail(st);
+//        }
+//
+//        int result = smartDataSourceLogService.updateSmartDataSourceLog(smartDataSourceLog);
+//        return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
+//    }
+
+
 //    @Override
 //    public CommonResult deleteSmartDataSourceLogById(int id) {
 //

+ 110 - 24
src/main/java/com/template/controller/SmartDataTaskController.java

@@ -2,15 +2,19 @@ package com.template.controller;
 
 
 import com.template.api.SmartDataTaskControllerAPI;
+import com.template.common.utils.CommonUtil;
 import com.template.common.utils.paramUtils;
+import com.template.model.pojo.SmartDataSourceLog;
 import com.template.model.pojo.SmartDataTask;
 import com.template.model.result.CommonResult;
 import com.template.model.result.PageUtils;
+import com.template.services.SmartDataSourceLogService;
 import com.template.services.SmartDataTaskService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.BindingResult;
 import org.springframework.web.bind.annotation.RestController;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -27,65 +31,120 @@ public class SmartDataTaskController implements SmartDataTaskControllerAPI {
     @Autowired
     private SmartDataTaskService smartDataTaskService;
 
+    @Autowired
+    private SmartDataSourceLogService smartDataSourceLogService;
 
     @Override
-    public CommonResult createJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult createJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        return smartDataTaskService.createJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("创建定时任务|【数据交换中心】→【数据源数据交换任务】|创建【定时任务】|create", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.createJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     @Override
-    public CommonResult pauseJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult pauseJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        return smartDataTaskService.pauseJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("暂停定时任务|【数据交换中心】→【数据源数据交换任务】|暂停【定时任务】|pause", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.pauseJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     @Override
-    public CommonResult resumeJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult resumeJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        return smartDataTaskService.resumeJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("恢复定时任务|【数据交换中心】→【数据源数据交换任务】|恢复【定时任务】|resume", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.resumeJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     @Override
-    public CommonResult updateJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult updateJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
-
-        return smartDataTaskService.updateJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("更新定时任务|【数据交换中心】→【数据源数据交换任务】|更新【定时任务】|update", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.updateJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     @Override
-    public CommonResult deleteJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult deleteJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        return smartDataTaskService.deleteJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("删除定时任务|【数据交换中心】→【数据源数据交换任务】|删除【定时任务】|delete", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.deleteJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     @Override
-    public CommonResult runOnceJob(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult runOnceJob(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        return smartDataTaskService.runOnceJob(smartDataTask);
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("执行1次定时任务|【数据交换中心】→【数据源数据交换任务】|执行1次【定时任务】|runOnce", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.runOnceJob(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     /**
@@ -96,15 +155,22 @@ public class SmartDataTaskController implements SmartDataTaskControllerAPI {
      * @return
      */
     @Override
-    public CommonResult insertSmartDataTask(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult insertSmartDataTask(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("新增数据源数据交换任务|【数据交换中心】→【数据源数据交换任务】|新增【数据源数据交换任务】|create", httpServletRequest);
         Map<String, Object> result = smartDataTaskService.insertSmartDataTask(smartDataTask);
-
-        return Integer.parseInt((String) result.get("code")) > 0 ? CommonResult.ok(result.get("msg")) : CommonResult.fail((String) result.get("msg"));
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     /**
@@ -115,15 +181,23 @@ public class SmartDataTaskController implements SmartDataTaskControllerAPI {
      * @return
      */
     @Override
-    public CommonResult updateSmartDataTaskById(SmartDataTask smartDataTask, BindingResult bindingResult) {
+    public CommonResult updateSmartDataTaskById(SmartDataTask smartDataTask, HttpServletRequest httpServletRequest, BindingResult bindingResult) {
         if (bindingResult.hasErrors()) {
             String st = paramUtils.getParamError(bindingResult);
             return CommonResult.fail(st);
         }
 
-        Map<String, Object> result = smartDataTaskService.updateSmartDataTaskById(smartDataTask);
 
-        return Integer.parseInt((String) result.get("code")) > 0 ? CommonResult.ok(result.get("msg")) : CommonResult.fail((String) result.get("msg"));
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("更新数据源数据交换任务|【数据交换中心】→【数据源数据交换任务】|更新【数据源数据交换任务】|update", httpServletRequest);
+        Map<String, Object> result = smartDataTaskService.updateSmartDataTaskById(smartDataTask);
+        if (Integer.parseInt((String) result.get("code")) == 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok(result.get("msg"));
+        } else {
+            return CommonResult.fail((String) result.get("msg"));
+        }
     }
 
     /**
@@ -148,17 +222,29 @@ public class SmartDataTaskController implements SmartDataTaskControllerAPI {
      * @return
      */
     @Override
-    public CommonResult deleteSmartDataTaskById(int id) {
+    public CommonResult deleteSmartDataTaskById(int id, HttpServletRequest httpServletRequest) {
 
-        SmartDataTask data = smartDataTaskService.getSmartById(id);
+        SmartDataTask smartDataTask = smartDataTaskService.getSmartById(id);
 
-        if (data == null) {
+        if (smartDataTask == null) {
             return CommonResult.fail("当前数据不存在,删除失败!");
         }
 
-        int result = smartDataTaskService.deleteSmartDataTaskById(id);
+        if (smartDataTask.getTkDeleted() == 1) {
+            return CommonResult.fail("当前数据已是标记为删除状态,删除失败!");
+        }
 
-        return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
+        SmartDataSourceLog smartDataSourceLog =
+                CommonUtil.generateLog("标记为删除数据源数据交换任务|【数据交换中心】→【数据源数据交换任务】|标记为删除【数据源数据交换任务】|delete", httpServletRequest);
+        smartDataTask.setTkDeleted(1);
+        int result = smartDataTaskService.deleteSmartDataTaskById(smartDataTask);
+        if (result > 0) {
+            smartDataSourceLog.setLogActionStatus(1);
+            smartDataSourceLogService.insertSmartDataSourceLog(smartDataSourceLog);
+            return CommonResult.ok("标记为删除状态成功");
+        } else {
+            return CommonResult.fail("标记为删除状态失败");
+        }
     }
 }
 

+ 51 - 0
src/main/java/com/template/controller/Task.java

@@ -0,0 +1,51 @@
+package com.template.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.template.common.utils.QuartzJobUtils;
+import com.template.mapper.SmartDataTaskMapper;
+import com.template.model.pojo.SmartDataTask;
+import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobKey;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.quartz.QuartzJobBean;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+@Component
+public class Task extends QuartzJobBean {
+
+    @Autowired
+    private SmartDataTaskMapper smartDataTaskMapper;
+
+    @Override
+    protected void executeInternal(JobExecutionContext jobExecutionContext) {
+        // 输出当前时间
+        Date date = new Date();
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String dateString = dateFormat.format(date);
+
+        JobDetail jobDetail = jobExecutionContext.getJobDetail();
+        JobKey key = jobDetail.getKey();
+        // 工作内容
+        System.out.println("定时任务名称:【" + key.getName() + "】,执行时间:" + dateString);
+        // 及时更新下次更新时间
+        QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq(key.getName() != null, "tk_name", key.getName());
+        SmartDataTask smartDataTask = smartDataTaskMapper.selectOne(queryWrapper);
+        if (smartDataTask != null) {
+            // 下次执行的时间
+            String nextExeTime = QuartzJobUtils.getNextExeTime(smartDataTask.getTkCron());
+            smartDataTask.setTkNextExeTime(nextExeTime);
+            try {
+                smartDataTaskMapper.updateById(smartDataTask);
+            } catch (Exception e) {
+                System.out.println(e.getMessage());
+            }
+        } else {
+            System.out.println("【下次执行的时间】无法更新至数据库中!");
+        }
+    }
+}

+ 23 - 10
src/main/java/com/template/mapper/SmartDataTaskMapper.java

@@ -3,6 +3,7 @@ package com.template.mapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.template.model.pojo.SmartDataTask;
 import org.apache.ibatis.annotations.Select;
+import org.apache.ibatis.annotations.Update;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
@@ -17,21 +18,33 @@ import java.util.List;
  */
 @Repository
 public interface SmartDataTaskMapper extends BaseMapper<SmartDataTask> {
-
     @Select("SELECT " +
-            "        tk_id, " +
-            "        tk_ds_id, " +
-            "        tk_name, " +
-            "        tk_cron, " +
-            "        tk_sql, " +
-            "        tk_activation, " +
-            "        tk_descrition, " +
-            "        tk_create_time, " +
-            "        tk_update_time  " +
+            "        tk_id " +
+            "        ,tk_name " +
+            "        ,tk_ds_id_source " +
+            "        ,tk_sync_policy " +
+            "        ,tk_sql, " +
+            "        tk_ds_id_destination " +
+            "        ,tk_dest_table " +
+            "        ,tk_manual_or_auto " +
+            "        ,tk_descrition " +
             "    FROM " +
             "        smart_data_task  " +
             "    WHERE " +
             "        tk_name = #{tkName} " +
             "        AND tk_id != #{tkId} ")
     List<SmartDataTask> isRepeatTaskName(SmartDataTask smartDataTask);
+
+    @Update("UPDATE smart_data_task " +
+            "SET tk_deleted = 1 " +
+            "WHERE " +
+            "       tk_id = #{tkId} ")
+    Integer deleteMarkTaskById(SmartDataTask smartDataTask);
+
+    @Update("UPDATE smart_data_task " +
+            "SET tk_activation = #{tkActivation} " +
+            "    ,tk_next_exe_time = #{tkNextExeTime} " +
+            "WHERE " +
+            "       tk_id = #{tkId} ")
+    Integer markTaskById(SmartDataTask smartDataTask);
 }

+ 3 - 0
src/main/java/com/template/model/pojo/SmartDataSourceLog.java

@@ -54,6 +54,9 @@ public class SmartDataSourceLog implements Serializable {
     @ApiModelProperty(value = "操作类型:select login update delete create等")
     private String logActionClass;
 
+    @ApiModelProperty(value = "操作状态:1成功,0失败")
+    private Integer logActionStatus;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "操作日志创建时间")
     private Date logActionCreateTime;

+ 36 - 8
src/main/java/com/template/model/pojo/SmartDataTask.java

@@ -33,24 +33,52 @@ public class SmartDataTask implements Serializable {
     @TableId(value = "tk_id", type = IdType.AUTO)
     private Integer tkId;
 
-    @ApiModelProperty(value = "数据源id")
-    private Integer tkDsId;
-
     @ApiModelProperty(value = "任务名称")
     private String tkName;
 
-    @ApiModelProperty(value = "任务定时表达式")
-    private String tkCron;
+    @ApiModelProperty(value = "来源数据源id")
+    private Integer tkDsIdSource;
+
+    @ApiModelProperty(value = "同步策略:0插入更新,1更新标记,2清空插入")
+    private Integer tkSyncPolicy;
+
+    @ApiModelProperty(value = "交换方式:0自定义SQL语句,1数据视图,2数据表")
+    private Integer tkExchangeType;
 
     @ApiModelProperty(value = "任务使用的SQL语言")
     private String tkSql;
 
-    @ApiModelProperty(value = "是否激活")
-    private Integer tkActivation;
+    @ApiModelProperty(value = "目标数据源id")
+    private Integer tkDsIdDestination;
+
+    @ApiModelProperty(value = "目标数据表")
+    private String tkDestTable;
+
+    @ApiModelProperty(value = "任务定时表达式")
+    private String tkCron;
+
+    @ApiModelProperty(value = "手动或者定时执行:0定时执行,1手动执行")
+    private Integer tkManualOrAuto;
+
+    @ApiModelProperty(value = "执行方式:0间隔执行,1定点执行,2每天,3每周,4每月")
+    private Integer tkExeType;
+
+    @ApiModelProperty(value = "重复时间")
+    private String tkRepetTime;
 
     @ApiModelProperty(value = "任务描述")
     private String tkDescrition;
 
+    @ApiModelProperty(value = "是否激活")
+    private Integer tkActivation;
+
+    @ApiModelProperty(value = "删除标记")
+    private Integer tkDeleted;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @ApiModelProperty(value = "下次执行时间")
+    private String tkNextExeTime;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "创建时间")
     private Date tkCreateTime;
@@ -58,4 +86,4 @@ public class SmartDataTask implements Serializable {
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     @ApiModelProperty(value = "更新时间")
     private Date tkUpdateTime;
-}
+}

+ 2 - 2
src/main/java/com/template/services/SmartDataClassService.java

@@ -14,9 +14,9 @@ import com.template.model.result.PageUtils;
  * @since 2023-12-05
  */
 public interface SmartDataClassService extends IService<SmartDataClass> {
-    int insertSmartDataClass(SmartDataClass rns);
+    int insertSmartDataClass(SmartDataClass smartDataClass);
 
-    int updateSmartDataClass(SmartDataClass rns);
+    int updateSmartDataClass(SmartDataClass smartDataClass);
 
     PageUtils<SmartDataClass> queryPageSmartDataClasss(int currentPage, int pageCount, String name);
 

+ 3 - 3
src/main/java/com/template/services/SmartDataSourceLogService.java

@@ -15,14 +15,14 @@ import org.springframework.web.bind.annotation.RequestParam;
  * @since 2023-12-05
  */
 public interface SmartDataSourceLogService extends IService<SmartDataSourceLog> {
-    int insertSmartDataSourceLog(SmartDataSourceLog rns);
-
-//    int updateSmartDataSourceLog(SmartDataSourceLog rns);
+    int insertSmartDataSourceLog(SmartDataSourceLog smartDataSourceLog);
 
     PageUtils<SmartDataSourceLog> queryPageSmartDataSourceLogs(int currentPage, int pageCount,
                                                                String startTime,
                                                                String endTime, SmartDataSourceLog smartDataSourceLog);
 
+//    int updateSmartDataSourceLog(SmartDataSourceLog rns);
+
 //    int deleteSmartDataSourceLogById(int id);
 
     SmartDataSourceLog getSmartById(int id);

+ 8 - 7
src/main/java/com/template/services/SmartDataTaskService.java

@@ -5,6 +5,7 @@ import com.template.model.pojo.SmartDataTask;
 import com.template.model.result.CommonResult;
 import com.template.model.result.PageUtils;
 
+import javax.servlet.http.HttpServletRequest;
 import java.util.Map;
 
 /**
@@ -22,19 +23,19 @@ public interface SmartDataTaskService extends IService<SmartDataTask> {
 
     PageUtils<SmartDataTask> queryPageSmartDataTasks(int currentPage, int pageCount, SmartDataTask smartDataTask);
 
-    int deleteSmartDataTaskById(int id);
+    int deleteSmartDataTaskById(SmartDataTask smartDataTask);
 
     SmartDataTask getSmartById(int id);
 
-    CommonResult createJob(SmartDataTask smartDataTask);
+    Map<String, Object> createJob(SmartDataTask smartDataTask);
 
-    CommonResult pauseJob(SmartDataTask smartDataTask);
+    Map<String, Object> pauseJob(SmartDataTask smartDataTask);
 
-    CommonResult resumeJob(SmartDataTask smartDataTask);
+    Map<String, Object> resumeJob(SmartDataTask smartDataTask);
 
-    CommonResult updateJob(SmartDataTask smartDataTask);
+    Map<String, Object> updateJob(SmartDataTask smartDataTask);
 
-    CommonResult deleteJob(SmartDataTask smartDataTask);
+    Map<String, Object> deleteJob(SmartDataTask smartDataTask);
 
-    CommonResult runOnceJob(SmartDataTask smartDataTask);
+    Map<String, Object> runOnceJob(SmartDataTask smartDataTask);
 }

+ 14 - 14
src/main/java/com/template/services/impl/SmartDataSourceServiceImpl.java

@@ -92,9 +92,9 @@ public class SmartDataSourceServiceImpl extends ServiceImpl<SmartDataSourceMappe
         // 必填的参数不为null,则进行新增操作
         int result = smartDataSourceMapper.insert(smartDataSource);
         if (result > 0) {
-            return CommonUtil.getReturnMap(String.valueOf(result), "数据源添加成功!");
+            return CommonUtil.getReturnMap("0", "数据源添加成功!");
         } else {
-            return CommonUtil.getReturnMap(String.valueOf(result), "数据源添加失败!");
+            return CommonUtil.getReturnMap("1", "数据源添加失败!");
         }
     }
 
@@ -102,35 +102,35 @@ public class SmartDataSourceServiceImpl extends ServiceImpl<SmartDataSourceMappe
     public Map<String, Object> updateSmartDataSource(SmartDataSource smartDataSource) {
         // 检测参数,还有是否存在重复记录
         if (smartDataSource.getDsId() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源id】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源id】不能为空!");
         }
         SmartDataSource sdc = smartDataSourceMapper.selectById(smartDataSource.getDsId());
         if (sdc == null) {
-            return CommonUtil.getReturnMap("0", "要修改的【数据源】不存在!");
+            return CommonUtil.getReturnMap("1", "要修改的【数据源】不存在!");
         }
         // 检测必要参数是否为null
         if (smartDataSource.getDsClsId() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源类型id】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源类型id】不能为空!");
         }
         SmartDataClass smartDataClass = smartDataClassMapper.selectById(smartDataSource.getDsClsId());
         if (smartDataClass == null) {
-            return CommonUtil.getReturnMap("0", "选择的【数据源类型】不存在!");
+            return CommonUtil.getReturnMap("1", "选择的【数据源类型】不存在!");
         }
 
         if (smartDataSource.getDsName() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源名称】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源名称】不能为空!");
         }
         if (smartDataSource.getDsUrl() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源连接地址】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源连接地址】不能为空!");
         }
         if (smartDataSource.getDsUser() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源用户】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源用户】不能为空!");
         }
         if (smartDataSource.getDsPassword() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源密码】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源密码】不能为空!");
         }
         if (smartDataSource.getDsDescrition() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源描述】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据源描述】不能为空!");
         }
         QueryWrapper<SmartDataSource> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(smartDataSource.getDsId() != null, "ds_id", smartDataSource.getDsId());
@@ -143,14 +143,14 @@ public class SmartDataSourceServiceImpl extends ServiceImpl<SmartDataSourceMappe
         queryWrapper.eq(StringUtils.hasText(smartDataSource.getDsDescrition()), "ds_descrition", smartDataSource.getDsDescrition());
         List<SmartDataSource> smartDataSources = smartDataSourceMapper.selectList(queryWrapper);
         if (smartDataSources.size() > 0) {
-            return CommonUtil.getReturnMap("0", "数据未修改,请修改后再提交!");
+            return CommonUtil.getReturnMap("1", "数据未修改,请修改后再提交!");
         }
 
         int result = smartDataSourceMapper.updateById(smartDataSource);
         if (result > 0) {
-            return CommonUtil.getReturnMap(String.valueOf(result), "数据源修改成功!");
+            return CommonUtil.getReturnMap("0", "数据源修改成功!");
         } else {
-            return CommonUtil.getReturnMap(String.valueOf(result), "数据源修改失败!");
+            return CommonUtil.getReturnMap("1", "数据源修改失败!");
         }
     }
 

+ 267 - 75
src/main/java/com/template/services/impl/SmartDataTaskServiceImpl.java

@@ -9,10 +9,12 @@ import com.template.common.utils.QuartzJobUtils;
 import com.template.mapper.SmartDataSourceMapper;
 import com.template.mapper.SmartDataTaskMapper;
 import com.template.model.pojo.SmartDataSource;
+import com.template.model.pojo.SmartDataSourceLog;
 import com.template.model.pojo.SmartDataTask;
 import com.template.model.result.CommonResult;
 import com.template.model.result.PageUtils;
 import com.template.services.SmartDataTaskService;
+import lombok.val;
 import org.quartz.CronExpression;
 import org.quartz.JobKey;
 import org.quartz.Scheduler;
@@ -21,7 +23,13 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.StringUtils;
 
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * <p>
@@ -47,136 +55,312 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     public Map<String, Object> insertSmartDataTask(SmartDataTask smartDataTask) {
         // 检测参数,还有是否存在重复记录
         if (smartDataTask.getTkName() == null) {
-            return CommonUtil.getReturnMap("0", "【任务名称】不能为空!");
+            return CommonUtil.getReturnMap("1", "【任务名称】不能为空!");
         }
         QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
         SmartDataTask sdt = smartDataTaskMapper.selectOne(queryWrapper);
         if (sdt != null) {
-            return CommonUtil.getReturnMap("0", "任务名有重名!");
+            return CommonUtil.getReturnMap("1", "任务名有重名!");
         }
         // 检测必要参数是否为null
-        if (smartDataTask.getTkDsId() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源id】不能为空!");
+        if (smartDataTask.getTkDsIdSource() == null) {
+            return CommonUtil.getReturnMap("1", "【来源数据源id】不能为空!");
         }
-        SmartDataSource smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsId());
+        SmartDataSource smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsIdSource());
         if (smartDataSource == null) {
-            return CommonUtil.getReturnMap("0", "选择的【数据源】不存在!");
+            return CommonUtil.getReturnMap("1", "选择的【来源数据源】不存在!");
         }
-        if (smartDataTask.getTkCron() == null) {
-            return CommonUtil.getReturnMap("0", "【定时表达式】不能为空!");
+        if (smartDataTask.getTkSyncPolicy() == null) {
+            return CommonUtil.getReturnMap("1", "【同步策略】不能为空!");
         }
-        if (CronExpression.isValidExpression(smartDataTask.getTkCron())) {
-            return CommonUtil.getReturnMap("0", "【定时表达式】不正确!");
+        if (smartDataTask.getTkExchangeType() == null) {
+            return CommonUtil.getReturnMap("1", "【交换方式】不能为空!");
         }
         if (smartDataTask.getTkSql() == null) {
-            return CommonUtil.getReturnMap("0", "【任务sql】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据来源SQL语句】不能为空!");
         }
-        if (smartDataTask.getTkDescrition() == null) {
-            return CommonUtil.getReturnMap("0", "【任务描述】不能为空!");
+        if (smartDataTask.getTkDsIdDestination() == null) {
+            return CommonUtil.getReturnMap("1", "【目标数据源id】不能为空!");
         }
-        if (smartDataTask.getTkActivation() == null) {
-            return CommonUtil.getReturnMap("0", "【是否启用】不能为空!");
+        smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsIdDestination());
+        if (smartDataSource == null) {
+            return CommonUtil.getReturnMap("1", "选择的【目标数据源】不存在!");
+        }
+        if (smartDataTask.getTkDestTable() == null) {
+            return CommonUtil.getReturnMap("1", "【目标数据表】不能为空!");
+        }
+        if (smartDataTask.getTkManualOrAuto() == null) {
+            return CommonUtil.getReturnMap("1", "【手动或定时执行】不能为空!");
+        }
+        if (smartDataTask.getTkManualOrAuto() == 0) {
+            if (smartDataTask.getTkExeType() == null) {
+                return CommonUtil.getReturnMap("1", "【执行方式】不能为空!");
+            }
+            if (smartDataTask.getTkRepetTime() == null) {
+                return CommonUtil.getReturnMap("1", "【重复时间】不能为空!");
+            }
+            // 生成cron表达式
+            Map<String, Object> stringObjectMap = generateCron(smartDataTask.getTkExeType(), smartDataTask.getTkRepetTime());
+            if (stringObjectMap.get("code") == "1") {
+                return stringObjectMap;
+            }
+            String cron = (String) stringObjectMap.get("msg");
+            if (CronExpression.isValidExpression(cron)) {
+                smartDataTask.setTkCron(cron);
+            } else {
+                return CommonUtil.getReturnMap("1", "生成的【定时表达式】不正确!请联系管理员!" + cron);
+            }
+        } else {
+            smartDataTask.setTkExeType(-1);
+            smartDataTask.setTkRepetTime("");
         }
-        queryWrapper.eq(smartDataTask.getTkDsId() != null, "tk_ds_id", smartDataTask.getTkDsId());
-        queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkCron()), "tk_cron", smartDataTask.getTkCron());
+        if (smartDataTask.getTkDescrition() == null) {
+            return CommonUtil.getReturnMap("1", "【任务描述】不能为空!");
+        }
+        queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
+        queryWrapper.eq(smartDataTask.getTkSyncPolicy() != null, "tk_sync_policy", smartDataTask.getTkSyncPolicy());
+        queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
         queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", smartDataTask.getTkSql());
+        queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
+        queryWrapper.eq(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
+        queryWrapper.eq(smartDataTask.getTkManualOrAuto() != null, "tk_manual_or_auto", smartDataTask.getTkManualOrAuto());
         queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkDescrition()), "tk_descrition", smartDataTask.getTkDescrition());
-        queryWrapper.eq(smartDataTask.getTkActivation() != null, "tk_activation", smartDataTask.getTkActivation());
         sdt = smartDataTaskMapper.selectOne(queryWrapper);
         if (sdt != null) {
-            return CommonUtil.getReturnMap("0", "有重复记录!");
+            return CommonUtil.getReturnMap("1", "有重复记录!");
         }
 
         int result = smartDataTaskMapper.insert(smartDataTask);
         if (result > 0) {
-            return CommonUtil.getReturnMap(String.valueOf(result), "任务添加成功!");
+            return CommonUtil.getReturnMap("0", "任务添加成功!");
+        } else {
+            return CommonUtil.getReturnMap("1", "任务添加失败!");
+        }
+    }
+
+    // 生成cron表达式
+    private Map<String, Object> generateCron(Integer exeType, String repetTime) {
+        if (exeType == 0) {
+            if (repetTime.endsWith("天")) {
+                String n = CommonUtil.getNumberFromString(repetTime);
+                if (n != null) {
+                    return CommonUtil.getReturnMap("0", "0 0 0 1/" + n + " * ?");
+                } else {
+                    return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x天");
+                }
+            } else if (repetTime.endsWith("小时")) {
+                String n = CommonUtil.getNumberFromString(repetTime);
+                if (n != null) {
+                    return CommonUtil.getReturnMap("0", "0 0 0/" + n + " * * ?");
+                } else {
+                    return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x小时");
+                }
+            } else if (repetTime.endsWith("分钟")) {
+                String n = CommonUtil.getNumberFromString(repetTime);
+                if (n != null) {
+                    return CommonUtil.getReturnMap("0", "0 0/" + n + " * * * ?");
+                } else {
+                    return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x分钟");
+                }
+            } else {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:x天 或者 x小时 或者 x分钟");
+            }
+        } else if (exeType == 1) {
+            // 检查是否是格式:2023-12-19 09:40
+            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
+            try {
+                LocalDateTime dateTime = LocalDateTime.parse(repetTime, formatter);
+                int year = dateTime.getYear();
+                int month = dateTime.getMonthValue();
+                int day = dateTime.getDayOfMonth();
+                int hour = dateTime.getHour();
+                int minute = dateTime.getMinute();
+
+                return CommonUtil.getReturnMap("0", String.format("0 %d %d %d %d ? %d", minute, hour, day, month, year));
+            } catch (DateTimeParseException e) {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:2023-12-19 09:40");
+            }
+        } else if (exeType == 2) {
+            // 检查是否是格式:09:40
+            if (isOnlyHourAndMinute(repetTime)) {
+                String[] split = repetTime.split(":");
+                int hour = Integer.parseInt(split[0]);
+                int minute = Integer.parseInt(split[1]);
+                return CommonUtil.getReturnMap("0", String.format("0 %d %d 1/1 * ?", minute, hour));
+            } else {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误,要求:09:40");
+            }
+        } else if (exeType == 3) {
+            // 检查是否是格式:周日 09:40
+            String[] split = repetTime.split(" ");
+            if (split.length != 2) {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误1,要求:周日 09:40");
+            }
+
+            String weekday = ""; // MON, TUE, WED, THU, FRI, SAT, SUN
+            if ("周一".equals(split[0])) weekday = "MON";
+            else if ("周二".equals(split[0])) weekday = "TUE";
+            else if ("周三".equals(split[0])) weekday = "WED";
+            else if ("周四".equals(split[0])) weekday = "THU";
+            else if ("周五".equals(split[0])) weekday = "FRI";
+            else if ("周六".equals(split[0])) weekday = "SAT";
+            else if ("周日".equals(split[0])) weekday = "SUN";
+            else CommonUtil.getReturnMap("1", "【重复时间】格式错误2,要求:周日 09:40");
+
+            if (isOnlyHourAndMinute(split[1])) {
+                String[] hour_minute = split[1].split(":");
+                int hour = Integer.parseInt(hour_minute[0]);
+                int minute = Integer.parseInt(hour_minute[1]);
+
+                return CommonUtil.getReturnMap("0", String.format("0 %d %d ? * %s", minute, hour, weekday));
+            } else  {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误3,要求:周日 09:40");
+            }
+        } else if (exeType == 4) {
+            // 检查是否是格式:19 09:40
+            String[] split = repetTime.split(" ");
+            if (split.length != 2) {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误1,要求:19 09:40");
+            }
+
+            int day = Integer.parseInt(split[0]);
+            if (day > 30 || day < 1)
+                CommonUtil.getReturnMap("1", "【重复时间】格式错误2,要求:19 09:40");
+
+            if (isOnlyHourAndMinute(split[1])) {
+                String[] hour_minute = split[1].split(":");
+                int hour = Integer.parseInt(hour_minute[0]);
+                int minute = Integer.parseInt(hour_minute[1]);
+
+                return CommonUtil.getReturnMap("0", String.format("0 %d %d %d * ?", minute, hour, day));
+            } else  {
+                return CommonUtil.getReturnMap("1", "【重复时间】格式错误3,要求:19 09:40");
+            }
         } else {
-            return CommonUtil.getReturnMap(String.valueOf(result), "任务添加失败!");
+            return CommonUtil.getReturnMap("1", "【执行方式】格式错误,要求:0间隔执行,1定点执行,2每天,3每周,4每月");
         }
     }
 
+    // 判断时分
+    private boolean isOnlyHourAndMinute(String time) {
+        String regex = "^([01]?[0-9]|2[0-3]):[0-5][0-9]$";
+        Pattern pattern = Pattern.compile(regex);
+        Matcher matcher = pattern.matcher(time);
+        return matcher.matches();
+    }
+
     @Override
     public Map<String, Object> updateSmartDataTaskById(SmartDataTask smartDataTask) {
         if (smartDataTask.getTkId() == null) {
-            return CommonUtil.getReturnMap("0", "【任务id】不能为空!");
+            return CommonUtil.getReturnMap("1", "【任务id】不能为空!");
         }
         if (smartDataTask.getTkName() == null) {
-            return CommonUtil.getReturnMap("0", "【任务名称】不能为空!");
+            return CommonUtil.getReturnMap("1", "【任务名称】不能为空!");
         }
         // 检测参数,还有是否存在重复记录
         List<SmartDataTask> smartDataSources = smartDataTaskMapper.isRepeatTaskName(smartDataTask);
         if (smartDataSources.size() > 0) {
-            return CommonUtil.getReturnMap("0", "任务名有重名!");
+            return CommonUtil.getReturnMap("1", "任务名有重名!");
         }
         SmartDataTask sdc = smartDataTaskMapper.selectById(smartDataTask.getTkId());
         if (sdc == null) {
-            return CommonUtil.getReturnMap("0", "要修改的【任务】不存在!");
+            return CommonUtil.getReturnMap("1", "要修改的【任务】不存在!");
         }
-        if (smartDataTask.getTkDsId() == null) {
-            return CommonUtil.getReturnMap("0", "【数据源id】不能为空!");
+        if (smartDataTask.getTkDsIdSource() == null) {
+            return CommonUtil.getReturnMap("1", "【来源数据源id】不能为空!");
         }
-        SmartDataSource smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsId());
+        SmartDataSource smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsIdSource());
         if (smartDataSource == null) {
-            return CommonUtil.getReturnMap("0", "选择的【数据源】不存在!");
+            return CommonUtil.getReturnMap("1", "选择的【来源数据源】不存在!");
         }
-        if (smartDataTask.getTkCron() == null) {
-            return CommonUtil.getReturnMap("0", "【定时表达式】不能为空!");
+        if (smartDataTask.getTkSyncPolicy() == null) {
+            return CommonUtil.getReturnMap("1", "【同步策略】不能为空!");
         }
-        if (CronExpression.isValidExpression(smartDataTask.getTkCron())) {
-            return CommonUtil.getReturnMap("0", "【定时表达式】不正确!");
+        if (smartDataTask.getTkExchangeType() == null) {
+            return CommonUtil.getReturnMap("1", "【交换方式】不能为空!");
         }
         if (smartDataTask.getTkSql() == null) {
-            return CommonUtil.getReturnMap("0", "【任务sql】不能为空!");
+            return CommonUtil.getReturnMap("1", "【数据来源SQL语句】不能为空!");
         }
-        if (smartDataTask.getTkDescrition() == null) {
-            return CommonUtil.getReturnMap("0", "【任务描述】不能为空!");
+        if (smartDataTask.getTkDsIdDestination() == null) {
+            return CommonUtil.getReturnMap("1", "【目标数据源id】不能为空!");
         }
-        if (smartDataTask.getTkActivation() == null) {
-            return CommonUtil.getReturnMap("0", "【是否启动】不能为空!");
+        smartDataSource = smartDataSourceMapper.selectById(smartDataTask.getTkDsIdDestination());
+        if (smartDataSource == null) {
+            return CommonUtil.getReturnMap("1", "选择的【目标数据源】不存在!");
+        }
+        if (smartDataTask.getTkDestTable() == null) {
+            return CommonUtil.getReturnMap("1", "【目标数据表】不能为空!");
+        }
+        if (smartDataTask.getTkManualOrAuto() == null) {
+            return CommonUtil.getReturnMap("1", "【手动或定时执行】不能为空!");
+        }
+        if (smartDataTask.getTkManualOrAuto() == 0) {
+            if (smartDataTask.getTkExeType() == null) {
+                return CommonUtil.getReturnMap("1", "【执行方式】不能为空!");
+            }
+            if (smartDataTask.getTkRepetTime() == null) {
+                return CommonUtil.getReturnMap("1", "【重复时间】不能为空!");
+            }
+            // 生成cron表达式
+            Map<String, Object> stringObjectMap = generateCron(smartDataTask.getTkExeType(), smartDataTask.getTkRepetTime());
+            if (stringObjectMap.get("code") == "1") {
+                return stringObjectMap;
+            }
+            smartDataTask.setTkCron((String) stringObjectMap.get("msg"));
+        } else {
+            smartDataTask.setTkExeType(0);
+            smartDataTask.setTkRepetTime("");
+        }
+        if (smartDataTask.getTkDescrition() == null) {
+            return CommonUtil.getReturnMap("1", "【任务描述】不能为空!");
         }
         QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(smartDataTask.getTkId() != null, "tk_id", smartDataTask.getTkId());
-        queryWrapper.eq(smartDataTask.getTkDsId() != null, "tk_ds_id", smartDataTask.getTkDsId());
         queryWrapper.eq(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
-        queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkCron()), "tk_cron", smartDataTask.getTkCron());
+        queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
+        queryWrapper.eq(smartDataTask.getTkSyncPolicy() != null, "tk_sync_policy", smartDataTask.getTkSyncPolicy());
+        queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
         queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkSql()), "tk_sql", smartDataTask.getTkSql());
+        queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
+        queryWrapper.eq(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
+        queryWrapper.eq(smartDataTask.getTkManualOrAuto() != null, "tk_manual_or_auto", smartDataTask.getTkManualOrAuto());
         queryWrapper.eq(StringUtils.hasText(smartDataTask.getTkDescrition()), "tk_descrition", smartDataTask.getTkDescrition());
-        queryWrapper.eq(smartDataTask.getTkActivation() != null, "tk_activation", smartDataTask.getTkActivation());
         SmartDataTask sdt = smartDataTaskMapper.selectOne(queryWrapper);
         if (sdt != null) {
-            return CommonUtil.getReturnMap("0", "数据未修改,请修改后再提交!");
+            return CommonUtil.getReturnMap("1", "数据未修改,请修改后再提交!");
         }
 
         int result = smartDataTaskMapper.updateById(smartDataTask);
         if (result > 0) {
-            return CommonUtil.getReturnMap(String.valueOf(result), "任务修改成功!");
+            return CommonUtil.getReturnMap("0", "任务修改成功!");
         } else {
-            return CommonUtil.getReturnMap(String.valueOf(result), "任务修改失败!");
+            return CommonUtil.getReturnMap("1", "任务修改失败!");
         }
     }
 
-    private Map<String, Object> updateSmartDataTaskActivation(SmartDataTask smartDataTask) {
+    // 判断之前状态是否启用
+    public Map<String, Object> updateSmartDataTaskActivation(SmartDataTask smartDataTask) {
         // 检测参数,还有是否存在重复记录
         if (smartDataTask.getTkId() == null) {
-            return CommonUtil.getReturnMap("0", "【任务id】不能为空!");
+            return CommonUtil.getReturnMap("1", "【任务id】不能为空!");
         }
         SmartDataTask sdc = smartDataTaskMapper.selectById(smartDataTask.getTkId());
         if (sdc == null) {
-            return CommonUtil.getReturnMap("0", "要修改的【任务】不存在!");
+            return CommonUtil.getReturnMap("1", "要修改的【任务】不存在!");
         }
         if (smartDataTask.getTkActivation() == null) {
-            return CommonUtil.getReturnMap("0", "【是否启用】不能为空!");
+            return CommonUtil.getReturnMap("1", "【是否启用】不能为空!");
         }
 
-        int result = smartDataTaskMapper.updateById(smartDataTask);
+        int result = smartDataTaskMapper.markTaskById(smartDataTask);
         if (result > 0) {
             return CommonUtil.getReturnMap(String.valueOf(result), "标注成功!");
         } else {
             if (smartDataTask.getTkActivation() == 1) {
-                return CommonUtil.getReturnMap(String.valueOf(result), "标注失败,之前已是启用状态!");
+                return CommonUtil.getReturnMap("0", "标注失败,之前已是启用状态!");
             } else {
-                return CommonUtil.getReturnMap(String.valueOf(result), "标注失败,之前已是启用状态!");
+                return CommonUtil.getReturnMap("1", "标注失败,之前已是启用状态!");
             }
         }
     }
@@ -185,8 +369,12 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     public PageUtils<SmartDataTask> queryPageSmartDataTasks(int currentPage, int pageCount, SmartDataTask smartDataTask) {
         Page<SmartDataTask> page = new Page<>(currentPage, pageCount);
         QueryWrapper<SmartDataTask> queryWrapper = new QueryWrapper<>();
-        queryWrapper.eq(smartDataTask.getTkDsId() != null, "tk_ds_id", smartDataTask.getTkDsId());
         queryWrapper.like(smartDataTask.getTkName() != null, "tk_name", smartDataTask.getTkName());
+        queryWrapper.eq(smartDataTask.getTkDsIdSource() != null, "tk_ds_id_source", smartDataTask.getTkDsIdSource());
+        queryWrapper.eq(smartDataTask.getTkDsIdDestination() != null, "tk_ds_id_destination", smartDataTask.getTkDsIdDestination());
+        queryWrapper.eq(smartDataTask.getTkExchangeType() != null, "tk_exchange_type", smartDataTask.getTkExchangeType());
+        queryWrapper.eq(smartDataTask.getTkExeType() != null, "tk_exe_type", smartDataTask.getTkExeType());
+        queryWrapper.like(smartDataTask.getTkDestTable() != null, "tk_dest_table", smartDataTask.getTkDestTable());
         queryWrapper.eq(smartDataTask.getTkActivation() != null, "tk_activation", smartDataTask.getTkActivation());
         queryWrapper.like(smartDataTask.getTkDescrition() != null, "tk_descrition", smartDataTask.getTkDescrition());
         queryWrapper.orderByDesc("tk_update_time");
@@ -195,18 +383,16 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     }
 
     @Override
-    public int deleteSmartDataTaskById(int id) {
-        int result = smartDataTaskMapper.deleteById(id);
-        return result;
+    public int deleteSmartDataTaskById(SmartDataTask smartDataTask) {
+        return smartDataTaskMapper.deleteMarkTaskById(smartDataTask);
     }
 
     @Override
     public SmartDataTask getSmartById(int id) {
-        SmartDataTask result = smartDataTaskMapper.selectById(id);
-        return result;
+        return smartDataTaskMapper.selectById(id);
     }
 
-    private Map<String, Object> TaskNameValidator(SmartDataTask smartDataTask) {
+    public Map<String, Object> TaskNameValidator(SmartDataTask smartDataTask) {
         if (smartDataTask.getTkName() == null) {
             return CommonUtil.getReturnMap(String.valueOf(1), "任务名称为空!");
         }
@@ -221,16 +407,20 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     }
 
     @Override
-    public CommonResult createJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> createJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
         Map<String, Object> returnMap = QuartzJobUtils.createScheduleJob(scheduler, smartDataTask_return);
         if ("0".equals(returnMap.get("code"))) {
             smartDataTask.setTkId(smartDataTask_return.getTkId());
+            // 下次执行的时间
+            String nextExeTime = QuartzJobUtils.getNextExeTime(smartDataTask_return.getTkCron());
+            // 更新数据库中的下次执行时间
+            smartDataTask.setTkNextExeTime(nextExeTime);
             smartDataTask.setTkActivation(1);
             Map<String, Object> stringStringMap = updateSmartDataTaskActivation(smartDataTask);
             String msg;
@@ -239,17 +429,17 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
             } else {
                 msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
             }
-            return CommonResult.ok(msg);
+            return CommonUtil.getReturnMap("0", msg);
         } else {
-            return CommonResult.fail((String) returnMap.get("msg"));
+            return returnMap;
         }
     }
 
     @Override
-    public CommonResult pauseJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> pauseJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
@@ -258,10 +448,10 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     }
 
     @Override
-    public CommonResult resumeJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> resumeJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
@@ -270,10 +460,10 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     }
 
     @Override
-    public CommonResult updateJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> updateJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
@@ -282,10 +472,10 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
     }
 
     @Override
-    public CommonResult deleteJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> deleteJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");
@@ -293,6 +483,8 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
         Map<String, Object> returnMap = QuartzJobUtils.deleteScheduleJob(scheduler, smartDataTask_return.getTkName());
         if ("0".equals(returnMap.get("code"))) {
             smartDataTask.setTkId(smartDataTask_return.getTkId());
+            // 更新数据库中的下次执行时间
+            smartDataTask.setTkNextExeTime(null);
             smartDataTask.setTkActivation(0);
             Map<String, Object> stringStringMap = updateSmartDataTaskActivation(smartDataTask);
             String msg;
@@ -301,17 +493,17 @@ public class SmartDataTaskServiceImpl extends ServiceImpl<SmartDataTaskMapper, S
             } else {
                 msg = (String) returnMap.get("msg") + stringStringMap.get("msg");
             }
-            return CommonResult.ok(msg);
+            return CommonUtil.getReturnMap("0", msg);
         } else {
-            return CommonResult.fail((String) returnMap.get("msg"));
+            return CommonUtil.getReturnMap("1", returnMap.get("msg"));
         }
     }
 
     @Override
-    public CommonResult runOnceJob(SmartDataTask smartDataTask) {
+    public Map<String, Object> runOnceJob(SmartDataTask smartDataTask) {
         Map<String, Object> tmp_map = TaskNameValidator(smartDataTask);
         if ("1".equals(tmp_map.get("code"))) {
-            return CommonResult.fail((String) tmp_map.get("msg"));
+            return tmp_map;
         }
 
         SmartDataTask smartDataTask_return = (SmartDataTask) tmp_map.get("msg");