diff --git a/backend/src/main/java/io/dataease/commons/utils/CronUtils.java b/backend/src/main/java/io/dataease/commons/utils/CronUtils.java index 26a3c203cc..c35aecdee1 100644 --- a/backend/src/main/java/io/dataease/commons/utils/CronUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/CronUtils.java @@ -21,6 +21,7 @@ public class CronUtils { /** * 解析表达式,获取CronTrigger + * * @param cron * @return */ @@ -33,6 +34,7 @@ public class CronUtils { /** * 获取以指定时间为开始时间的下一次执行时间 + * * @param cron * @param start * @return @@ -40,7 +42,7 @@ public class CronUtils { public static Date getNextTriggerTime(String cron, Date start) { if (start == null) { return getNextTriggerTime(cron); - }else{ + } else { CronTrigger trigger = getCronTrigger(cron); return trigger.getFireTimeAfter(start); } @@ -48,19 +50,20 @@ public class CronUtils { /** * 获取以当前日期为准的下一次执行时间 + * * @param cron * @return */ public static Date getNextTriggerTime(String cron) { Date date = null; - try{ + try { CronTrigger trigger = getCronTrigger(cron); Date startDate = trigger.getStartTime(); date = trigger.getFireTimeAfter(startDate); - }catch (Exception e){ + } catch (Exception e) { } - return date; + return date; } public static String cron(GlobalTaskEntity taskEntity) { @@ -98,6 +101,15 @@ public class CronUtils { return null; } + + public static String cron() { + Calendar instance = Calendar.getInstance(); + instance.add(Calendar.SECOND, 5); + return instance.get(Calendar.SECOND) + " " + + instance.get(Calendar.MINUTE) + " " + + instance.get(Calendar.HOUR_OF_DAY) + " * * ?"; + } + private static String getDayOfWeek(Calendar instance) { int index = instance.get(Calendar.DAY_OF_WEEK); index = (index % 7) + 1; diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java index bb5da23d0a..be507d3732 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/TaskHandler.java @@ -12,6 +12,8 @@ import java.util.Date; public abstract class TaskHandler implements InitializingBean { + protected static final String IS_TEMP_TASK = "isTempTask"; + public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { // 1。首先看看是否过期 Long endTime = taskEntity.getEndTime(); @@ -24,21 +26,31 @@ public abstract class TaskHandler implements InitializingBean { Date start = new Date(taskEntity.getStartTime()); Date end = null; if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) { - new Date(taskEntity.getEndTime()); + end = new Date(taskEntity.getEndTime()); } Class executor = this.getClass(); String cron = CronUtils.cron(taskEntity); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(taskEntity)); } + public void addTempTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception { + removeTask(scheduleManager, taskEntity); + JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); + TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); + Date start = new Date(taskEntity.getStartTime()); + Class executor = this.getClass(); + String cron = CronUtils.cron(); + JobDataMap jobDataMap = jobDataMap(taskEntity); + jobDataMap.put(IS_TEMP_TASK, true); + scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, null, jobDataMap); + } + protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity); - public abstract void resetRunningInstance(Long taskId); - public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) { JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); TriggerKey triggerKey = new TriggerKey(taskEntity.getTaskId().toString()); @@ -51,7 +63,6 @@ public abstract class TaskHandler implements InitializingBean { } - protected abstract Boolean taskIsRunning(Long taskId); @Override diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index d96be6a985..e0ce934228 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -92,13 +92,14 @@ public class EmailTaskHandler extends TaskHandler implements Job { return; JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); + Boolean isTempTask = (Boolean) jobDataMap.getOrDefault(IS_TEMP_TASK, false); GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity"); ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); - if (CronUtils.taskExpire(taskEntity.getEndTime())) { + if (!isTempTask && CronUtils.taskExpire(taskEntity.getEndTime())) { removeTask(scheduleManager, taskEntity); return; } - if (taskIsRunning(taskEntity.getTaskId())) { + if (!isTempTask && taskIsRunning(taskEntity.getTaskId())) { LogUtil.info("Skip synchronization task: {} ,due to task status is {}", taskEntity.getTaskId(), "running"); return; @@ -111,7 +112,10 @@ public class EmailTaskHandler extends TaskHandler implements Job { XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate"); SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator"); LogUtil.info("start execute send panel report task..."); - proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator); + proxy(taskEntity.getTaskType()).sendReport(taskInstance, emailTemplate, creator, isTempTask); + if (isTempTask) { + removeTask(scheduleManager, taskEntity); + } } @@ -156,7 +160,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { } @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); @@ -164,7 +168,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { List files = null; try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); - if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { + if (ObjectUtils.isEmpty(taskForm) || (!isTempTask && CronUtils.taskExpire(taskForm.getEndTime()))) { removeInstance(taskInstance); return; } diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java index dbb2cbe65f..5eff2cb4eb 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskViewHandler.java @@ -16,9 +16,8 @@ import javax.annotation.Resource; public class EmailTaskViewHandler extends EmailTaskHandler { - @Async("priorityExecutor") - public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { - super.sendReport(taskInstance, emailTemplateDTO, user); + public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) { + super.sendReport(taskInstance, emailTemplateDTO, user, isTempTask); } } diff --git a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java index 2378f8854a..1609e13d27 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -56,7 +56,7 @@ public class XEmailTaskServer { @RequiresPermissions("task-email:read") @PostMapping("/queryTasks/{goPage}/{pageSize}") public Pager> queryTask(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody XpackGridRequest request) { + @RequestBody XpackGridRequest request) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); Page page = PageHelper.startPage(goPage, pageSize, true); CurrentUserDto user = AuthUtils.getUser(); @@ -76,17 +76,17 @@ public class XEmailTaskServer { tasks.forEach(item -> { if (CronUtils.taskExpire(item.getEndTime())) { item.setNextExecTime(null); - }else { + } else { GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity(); globalTaskEntity.setRateType(item.getRateType()); globalTaskEntity.setRateVal(item.getRateVal()); - try{ + try { String cron = CronUtils.cron(globalTaskEntity); if (StringUtils.isNotBlank(cron)) { Long nextTime = CronUtils.getNextTriggerTime(cron).getTime(); item.setNextExecTime(nextTime); } - }catch (Exception e) { + } catch (Exception e) { item.setNextExecTime(null); } } @@ -98,6 +98,20 @@ public class XEmailTaskServer { return listPager; } + @RequiresPermissions("task-email:edit") + @PostMapping("/fireNow/{taskId}") + public void fireNow(@PathVariable("taskId") Long taskId) throws Exception { + EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); + XpackEmailTaskRequest request = emailXpackService.taskForm(taskId); + GlobalTaskEntity globalTaskEntity = BeanUtils.copyBean(new GlobalTaskEntity(), request); + if (CronUtils.taskExpire(globalTaskEntity.getEndTime())) { + globalTaskEntity.setEndTime(null); + scheduleService.addTempSchedule(globalTaskEntity); + return; + } + scheduleService.fireNow(globalTaskEntity); + } + @RequiresPermissions("task-email:add") @PostMapping("/save") public void save(@RequestBody XpackEmailCreate param) throws Exception { @@ -210,7 +224,7 @@ public class XEmailTaskServer { @PostMapping("/queryInstancies/{goPage}/{pageSize}") public Pager> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize, - @RequestBody XpackGridRequest request) { + @RequestBody XpackGridRequest request) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); Page page = PageHelper.startPage(goPage, pageSize, true); List instances = emailXpackService.taskInstanceGrid(request); @@ -227,7 +241,7 @@ public class XEmailTaskServer { @RequiresPermissions("task-email:read") @PostMapping("/export") - public void export(@RequestBody XpackGridRequest request) throws Exception{ + public void export(@RequestBody XpackGridRequest request) throws Exception { Pager> listPager = instancesGrid(0, 0, request); List instanceDTOS = listPager.getListObject(); ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS); @@ -257,7 +271,7 @@ public class XEmailTaskServer { inputStream.close(); } catch (IOException ex) { ex.printStackTrace(); - }finally { + } finally { if (file.exists()) FileUtil.del(file); } @@ -267,7 +281,7 @@ public class XEmailTaskServer { private ExcelSheetModel excelSheetModel(List instanceDTOS) { ExcelSheetModel excelSheetModel = new ExcelSheetModel(); excelSheetModel.setSheetName(Translator.get("I18N_XPACKTASK_FILE_NAME")); - String[] headArr = new String[] {Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")}; + String[] headArr = new String[]{Translator.get("I18N_XPACKTASK_NAME"), Translator.get("I18N_XPACKTASK_EXEC_TIME"), Translator.get("I18N_XPACKTASK_STATUS")}; List head = Arrays.asList(headArr); excelSheetModel.setHeads(head); List> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList()); diff --git a/backend/src/main/java/io/dataease/service/ScheduleService.java b/backend/src/main/java/io/dataease/service/ScheduleService.java index a579f63609..d3ad79ede5 100644 --- a/backend/src/main/java/io/dataease/service/ScheduleService.java +++ b/backend/src/main/java/io/dataease/service/ScheduleService.java @@ -68,6 +68,11 @@ public class ScheduleService { taskHandler.addTask(scheduleManager, task); } + public void addTempSchedule(GlobalTaskEntity task) throws Exception { + TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); + taskHandler.addTempTask(scheduleManager, task); + } + public void deleteSchedule(GlobalTaskEntity task) { TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType()); taskHandler.removeTask(scheduleManager, task); diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 11b56f3744..cd45b23326 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -2536,7 +2536,8 @@ export default { task_type: 'Task type', range_view: 'Displayed data', range_all: 'All data', - execute_now: 'Execute now' + execute_now: 'Execute now', + fire_now_success: 'Task executing' }, dynamic_time: { set_default: 'Set Default', diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index e819e82fe1..ed02b5a363 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -2537,7 +2537,8 @@ export default { task_type: '任務類型', range_view: '展示數據', range_all: '全部數據', - execute_now: '立即執行' + execute_now: '立即執行', + fire_now_success: '任務發起成功' }, dynamic_time: { set_default: '設置默認值', diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index 04efeda283..a6e2954fc0 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -2537,7 +2537,8 @@ export default { task_type: '任务类型', range_view: '展示数据', range_all: '全部数据', - execute_now: '立即执行' + execute_now: '立即执行', + fire_now_success: '任务发起成功' }, dynamic_time: { set_default: '设置默认值',