forked from github/dataease
Merge pull request #3762 from dataease/pr@dev@feat_report_task_fire_now
feat(定时报告): 立即执行后台
This commit is contained in:
commit
32ab0b7f76
@ -21,6 +21,7 @@ public class CronUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 解析表达式,获取CronTrigger
|
* 解析表达式,获取CronTrigger
|
||||||
|
*
|
||||||
* @param cron
|
* @param cron
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -33,6 +34,7 @@ public class CronUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取以指定时间为开始时间的下一次执行时间
|
* 获取以指定时间为开始时间的下一次执行时间
|
||||||
|
*
|
||||||
* @param cron
|
* @param cron
|
||||||
* @param start
|
* @param start
|
||||||
* @return
|
* @return
|
||||||
@ -40,7 +42,7 @@ public class CronUtils {
|
|||||||
public static Date getNextTriggerTime(String cron, Date start) {
|
public static Date getNextTriggerTime(String cron, Date start) {
|
||||||
if (start == null) {
|
if (start == null) {
|
||||||
return getNextTriggerTime(cron);
|
return getNextTriggerTime(cron);
|
||||||
}else{
|
} else {
|
||||||
CronTrigger trigger = getCronTrigger(cron);
|
CronTrigger trigger = getCronTrigger(cron);
|
||||||
return trigger.getFireTimeAfter(start);
|
return trigger.getFireTimeAfter(start);
|
||||||
}
|
}
|
||||||
@ -48,19 +50,20 @@ public class CronUtils {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取以当前日期为准的下一次执行时间
|
* 获取以当前日期为准的下一次执行时间
|
||||||
|
*
|
||||||
* @param cron
|
* @param cron
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static Date getNextTriggerTime(String cron) {
|
public static Date getNextTriggerTime(String cron) {
|
||||||
Date date = null;
|
Date date = null;
|
||||||
try{
|
try {
|
||||||
CronTrigger trigger = getCronTrigger(cron);
|
CronTrigger trigger = getCronTrigger(cron);
|
||||||
Date startDate = trigger.getStartTime();
|
Date startDate = trigger.getStartTime();
|
||||||
date = trigger.getFireTimeAfter(startDate);
|
date = trigger.getFireTimeAfter(startDate);
|
||||||
}catch (Exception e){
|
} catch (Exception e) {
|
||||||
|
|
||||||
}
|
}
|
||||||
return date;
|
return date;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String cron(GlobalTaskEntity taskEntity) {
|
public static String cron(GlobalTaskEntity taskEntity) {
|
||||||
@ -98,6 +101,15 @@ public class CronUtils {
|
|||||||
|
|
||||||
return null;
|
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) {
|
private static String getDayOfWeek(Calendar instance) {
|
||||||
int index = instance.get(Calendar.DAY_OF_WEEK);
|
int index = instance.get(Calendar.DAY_OF_WEEK);
|
||||||
index = (index % 7) + 1;
|
index = (index % 7) + 1;
|
||||||
|
@ -12,6 +12,8 @@ import java.util.Date;
|
|||||||
|
|
||||||
public abstract class TaskHandler implements InitializingBean {
|
public abstract class TaskHandler implements InitializingBean {
|
||||||
|
|
||||||
|
protected static final String IS_TEMP_TASK = "isTempTask";
|
||||||
|
|
||||||
public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception {
|
public void addTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) throws Exception {
|
||||||
// 1。首先看看是否过期
|
// 1。首先看看是否过期
|
||||||
Long endTime = taskEntity.getEndTime();
|
Long endTime = taskEntity.getEndTime();
|
||||||
@ -24,21 +26,31 @@ public abstract class TaskHandler implements InitializingBean {
|
|||||||
Date start = new Date(taskEntity.getStartTime());
|
Date start = new Date(taskEntity.getStartTime());
|
||||||
Date end = null;
|
Date end = null;
|
||||||
if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) {
|
if (ObjectUtils.isNotEmpty(taskEntity.getEndTime())) {
|
||||||
new Date(taskEntity.getEndTime());
|
end = new Date(taskEntity.getEndTime());
|
||||||
}
|
}
|
||||||
Class<? extends TaskHandler> executor = this.getClass();
|
Class<? extends TaskHandler> executor = this.getClass();
|
||||||
String cron = CronUtils.cron(taskEntity);
|
String cron = CronUtils.cron(taskEntity);
|
||||||
scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(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<? extends TaskHandler> 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);
|
protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public abstract void resetRunningInstance(Long taskId);
|
public abstract void resetRunningInstance(Long taskId);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) {
|
public void removeTask(ScheduleManager scheduleManager, GlobalTaskEntity taskEntity) {
|
||||||
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
|
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
|
||||||
TriggerKey triggerKey = new TriggerKey(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);
|
protected abstract Boolean taskIsRunning(Long taskId);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -92,13 +92,14 @@ public class EmailTaskHandler extends TaskHandler implements Job {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
|
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
|
||||||
|
Boolean isTempTask = (Boolean) jobDataMap.getOrDefault(IS_TEMP_TASK, false);
|
||||||
GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity");
|
GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity");
|
||||||
ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
|
ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class);
|
||||||
if (CronUtils.taskExpire(taskEntity.getEndTime())) {
|
if (!isTempTask && CronUtils.taskExpire(taskEntity.getEndTime())) {
|
||||||
removeTask(scheduleManager, taskEntity);
|
removeTask(scheduleManager, taskEntity);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (taskIsRunning(taskEntity.getTaskId())) {
|
if (!isTempTask && taskIsRunning(taskEntity.getTaskId())) {
|
||||||
LogUtil.info("Skip synchronization task: {} ,due to task status is {}",
|
LogUtil.info("Skip synchronization task: {} ,due to task status is {}",
|
||||||
taskEntity.getTaskId(), "running");
|
taskEntity.getTaskId(), "running");
|
||||||
return;
|
return;
|
||||||
@ -111,7 +112,10 @@ public class EmailTaskHandler extends TaskHandler implements Job {
|
|||||||
XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate");
|
XpackEmailTemplateDTO emailTemplate = (XpackEmailTemplateDTO) jobDataMap.get("emailTemplate");
|
||||||
SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator");
|
SysUserEntity creator = (SysUserEntity) jobDataMap.get("creator");
|
||||||
LogUtil.info("start execute send panel report task...");
|
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")
|
@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);
|
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
|
||||||
AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class);
|
AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class);
|
||||||
@ -164,7 +168,7 @@ public class EmailTaskHandler extends TaskHandler implements Job {
|
|||||||
List<File> files = null;
|
List<File> files = null;
|
||||||
try {
|
try {
|
||||||
XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId());
|
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);
|
removeInstance(taskInstance);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -16,9 +16,8 @@ import javax.annotation.Resource;
|
|||||||
public class EmailTaskViewHandler extends EmailTaskHandler {
|
public class EmailTaskViewHandler extends EmailTaskHandler {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Async("priorityExecutor")
|
@Async("priorityExecutor")
|
||||||
public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) {
|
public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user, Boolean isTempTask) {
|
||||||
super.sendReport(taskInstance, emailTemplateDTO, user);
|
super.sendReport(taskInstance, emailTemplateDTO, user, isTempTask);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -56,7 +56,7 @@ public class XEmailTaskServer {
|
|||||||
@RequiresPermissions("task-email:read")
|
@RequiresPermissions("task-email:read")
|
||||||
@PostMapping("/queryTasks/{goPage}/{pageSize}")
|
@PostMapping("/queryTasks/{goPage}/{pageSize}")
|
||||||
public Pager<List<XpackTaskGridDTO>> queryTask(@PathVariable int goPage, @PathVariable int pageSize,
|
public Pager<List<XpackTaskGridDTO>> queryTask(@PathVariable int goPage, @PathVariable int pageSize,
|
||||||
@RequestBody XpackGridRequest request) {
|
@RequestBody XpackGridRequest request) {
|
||||||
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
|
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
|
||||||
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
||||||
CurrentUserDto user = AuthUtils.getUser();
|
CurrentUserDto user = AuthUtils.getUser();
|
||||||
@ -76,17 +76,17 @@ public class XEmailTaskServer {
|
|||||||
tasks.forEach(item -> {
|
tasks.forEach(item -> {
|
||||||
if (CronUtils.taskExpire(item.getEndTime())) {
|
if (CronUtils.taskExpire(item.getEndTime())) {
|
||||||
item.setNextExecTime(null);
|
item.setNextExecTime(null);
|
||||||
}else {
|
} else {
|
||||||
GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity();
|
GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity();
|
||||||
globalTaskEntity.setRateType(item.getRateType());
|
globalTaskEntity.setRateType(item.getRateType());
|
||||||
globalTaskEntity.setRateVal(item.getRateVal());
|
globalTaskEntity.setRateVal(item.getRateVal());
|
||||||
try{
|
try {
|
||||||
String cron = CronUtils.cron(globalTaskEntity);
|
String cron = CronUtils.cron(globalTaskEntity);
|
||||||
if (StringUtils.isNotBlank(cron)) {
|
if (StringUtils.isNotBlank(cron)) {
|
||||||
Long nextTime = CronUtils.getNextTriggerTime(cron).getTime();
|
Long nextTime = CronUtils.getNextTriggerTime(cron).getTime();
|
||||||
item.setNextExecTime(nextTime);
|
item.setNextExecTime(nextTime);
|
||||||
}
|
}
|
||||||
}catch (Exception e) {
|
} catch (Exception e) {
|
||||||
item.setNextExecTime(null);
|
item.setNextExecTime(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -98,6 +98,20 @@ public class XEmailTaskServer {
|
|||||||
return listPager;
|
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")
|
@RequiresPermissions("task-email:add")
|
||||||
@PostMapping("/save")
|
@PostMapping("/save")
|
||||||
public void save(@RequestBody XpackEmailCreate param) throws Exception {
|
public void save(@RequestBody XpackEmailCreate param) throws Exception {
|
||||||
@ -210,7 +224,7 @@ public class XEmailTaskServer {
|
|||||||
|
|
||||||
@PostMapping("/queryInstancies/{goPage}/{pageSize}")
|
@PostMapping("/queryInstancies/{goPage}/{pageSize}")
|
||||||
public Pager<List<XpackTaskInstanceDTO>> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize,
|
public Pager<List<XpackTaskInstanceDTO>> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize,
|
||||||
@RequestBody XpackGridRequest request) {
|
@RequestBody XpackGridRequest request) {
|
||||||
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
|
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
|
||||||
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
Page<Object> page = PageHelper.startPage(goPage, pageSize, true);
|
||||||
List<XpackTaskInstanceDTO> instances = emailXpackService.taskInstanceGrid(request);
|
List<XpackTaskInstanceDTO> instances = emailXpackService.taskInstanceGrid(request);
|
||||||
@ -227,7 +241,7 @@ public class XEmailTaskServer {
|
|||||||
|
|
||||||
@RequiresPermissions("task-email:read")
|
@RequiresPermissions("task-email:read")
|
||||||
@PostMapping("/export")
|
@PostMapping("/export")
|
||||||
public void export(@RequestBody XpackGridRequest request) throws Exception{
|
public void export(@RequestBody XpackGridRequest request) throws Exception {
|
||||||
Pager<List<XpackTaskInstanceDTO>> listPager = instancesGrid(0, 0, request);
|
Pager<List<XpackTaskInstanceDTO>> listPager = instancesGrid(0, 0, request);
|
||||||
List<XpackTaskInstanceDTO> instanceDTOS = listPager.getListObject();
|
List<XpackTaskInstanceDTO> instanceDTOS = listPager.getListObject();
|
||||||
ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS);
|
ExcelSheetModel excelSheetModel = excelSheetModel(instanceDTOS);
|
||||||
@ -257,7 +271,7 @@ public class XEmailTaskServer {
|
|||||||
inputStream.close();
|
inputStream.close();
|
||||||
} catch (IOException ex) {
|
} catch (IOException ex) {
|
||||||
ex.printStackTrace();
|
ex.printStackTrace();
|
||||||
}finally {
|
} finally {
|
||||||
if (file.exists())
|
if (file.exists())
|
||||||
FileUtil.del(file);
|
FileUtil.del(file);
|
||||||
}
|
}
|
||||||
@ -267,7 +281,7 @@ public class XEmailTaskServer {
|
|||||||
private ExcelSheetModel excelSheetModel(List<XpackTaskInstanceDTO> instanceDTOS) {
|
private ExcelSheetModel excelSheetModel(List<XpackTaskInstanceDTO> instanceDTOS) {
|
||||||
ExcelSheetModel excelSheetModel = new ExcelSheetModel();
|
ExcelSheetModel excelSheetModel = new ExcelSheetModel();
|
||||||
excelSheetModel.setSheetName(Translator.get("I18N_XPACKTASK_FILE_NAME"));
|
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<String> head = Arrays.asList(headArr);
|
List<String> head = Arrays.asList(headArr);
|
||||||
excelSheetModel.setHeads(head);
|
excelSheetModel.setHeads(head);
|
||||||
List<List<String>> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList());
|
List<List<String>> data = instanceDTOS.stream().map(this::formatExcelData).collect(Collectors.toList());
|
||||||
|
@ -68,6 +68,11 @@ public class ScheduleService {
|
|||||||
taskHandler.addTask(scheduleManager, task);
|
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) {
|
public void deleteSchedule(GlobalTaskEntity task) {
|
||||||
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
|
TaskHandler taskHandler = TaskStrategyFactory.getInvokeStrategy(task.getTaskType());
|
||||||
taskHandler.removeTask(scheduleManager, task);
|
taskHandler.removeTask(scheduleManager, task);
|
||||||
|
@ -2536,7 +2536,8 @@ export default {
|
|||||||
task_type: 'Task type',
|
task_type: 'Task type',
|
||||||
range_view: 'Displayed data',
|
range_view: 'Displayed data',
|
||||||
range_all: 'All data',
|
range_all: 'All data',
|
||||||
execute_now: 'Execute now'
|
execute_now: 'Execute now',
|
||||||
|
fire_now_success: 'Task executing'
|
||||||
},
|
},
|
||||||
dynamic_time: {
|
dynamic_time: {
|
||||||
set_default: 'Set Default',
|
set_default: 'Set Default',
|
||||||
|
@ -2537,7 +2537,8 @@ export default {
|
|||||||
task_type: '任務類型',
|
task_type: '任務類型',
|
||||||
range_view: '展示數據',
|
range_view: '展示數據',
|
||||||
range_all: '全部數據',
|
range_all: '全部數據',
|
||||||
execute_now: '立即執行'
|
execute_now: '立即執行',
|
||||||
|
fire_now_success: '任務發起成功'
|
||||||
},
|
},
|
||||||
dynamic_time: {
|
dynamic_time: {
|
||||||
set_default: '設置默認值',
|
set_default: '設置默認值',
|
||||||
|
@ -2537,7 +2537,8 @@ export default {
|
|||||||
task_type: '任务类型',
|
task_type: '任务类型',
|
||||||
range_view: '展示数据',
|
range_view: '展示数据',
|
||||||
range_all: '全部数据',
|
range_all: '全部数据',
|
||||||
execute_now: '立即执行'
|
execute_now: '立即执行',
|
||||||
|
fire_now_success: '任务发起成功'
|
||||||
},
|
},
|
||||||
dynamic_time: {
|
dynamic_time: {
|
||||||
set_default: '设置默认值',
|
set_default: '设置默认值',
|
||||||
|
Loading…
Reference in New Issue
Block a user