Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
wangjiahao 2022-01-20 17:03:53 +08:00
commit 57d948b613
10 changed files with 120 additions and 80 deletions

View File

@ -1,10 +1,15 @@
package io.dataease.commons.utils; package io.dataease.commons.utils;
import io.dataease.plugins.common.entity.GlobalTaskEntity;
import org.apache.commons.lang3.ObjectUtils;
import org.quartz.CronExpression; import org.quartz.CronExpression;
import org.quartz.CronScheduleBuilder; import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger; import org.quartz.CronTrigger;
import org.quartz.TriggerBuilder; import org.quartz.TriggerBuilder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
/** /**
@ -58,5 +63,54 @@ public class CronUtils {
return date; return date;
} }
public static String cron(GlobalTaskEntity taskEntity) {
if (taskEntity.getRateType() == -1) {
return taskEntity.getRateVal();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(taskEntity.getRateVal());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar instance = Calendar.getInstance();
instance.setTime(date);
if (taskEntity.getRateType() == 0) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
}
if (taskEntity.getRateType() == 1) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " ? * " +
getDayOfWeek(instance);
}
if (taskEntity.getRateType() == 2) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " " +
instance.get(Calendar.DATE) + " * ?";
}
return null;
}
private static String getDayOfWeek(Calendar instance) {
int index = instance.get(Calendar.DAY_OF_WEEK);
index = (index + 1) % 7;
return String.valueOf(index);
}
// 判断任务是否过期
public static Boolean taskExpire(Long endTime) {
if (ObjectUtils.isEmpty(endTime))
return false;
Long now = System.currentTimeMillis();
return now > endTime;
}
} }

View File

@ -1,14 +1,13 @@
package io.dataease.job.sechedule.strategy; package io.dataease.job.sechedule.strategy;
import io.dataease.commons.utils.CronUtils;
import io.dataease.job.sechedule.ScheduleManager; import io.dataease.job.sechedule.ScheduleManager;
import io.dataease.plugins.common.entity.GlobalTaskEntity; import io.dataease.plugins.common.entity.GlobalTaskEntity;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.quartz.*; import org.quartz.*;
import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.InitializingBean;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import java.util.Date;
public abstract class TaskHandler implements InitializingBean { public abstract class TaskHandler implements InitializingBean {
@ -17,7 +16,7 @@ public abstract class TaskHandler implements InitializingBean {
// 1首先看看是否过期 // 1首先看看是否过期
Long endTime = taskEntity.getEndTime(); Long endTime = taskEntity.getEndTime();
removeTask(scheduleManager, taskEntity); removeTask(scheduleManager, taskEntity);
if (taskExpire(endTime)) { // 过期了就删除任务 if (CronUtils.taskExpire(endTime)) { // 过期了就删除任务
return; return;
} }
JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); JobKey jobKey = new JobKey(taskEntity.getTaskId().toString());
@ -28,55 +27,17 @@ public abstract class TaskHandler implements InitializingBean {
new Date(taskEntity.getEndTime()); new Date(taskEntity.getEndTime());
} }
Class<? extends TaskHandler> executor = this.getClass(); Class<? extends TaskHandler> executor = this.getClass();
String cron = 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));
} }
protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity); protected abstract JobDataMap jobDataMap(GlobalTaskEntity taskEntity);
private String cron(GlobalTaskEntity taskEntity) {
if (taskEntity.getRateType() == -1) {
return taskEntity.getRateVal();
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = sdf.parse(taskEntity.getRateVal());
} catch (ParseException e) {
e.printStackTrace();
}
Calendar instance = Calendar.getInstance();
instance.setTime(date);
if (taskEntity.getRateType() == 0) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " * * ?";
}
if (taskEntity.getRateType() == 1) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " ? * " +
getDayOfWeek(instance);
}
if (taskEntity.getRateType() == 2) {
return instance.get(Calendar.SECOND) + " " +
instance.get(Calendar.MINUTE) + " " +
instance.get(Calendar.HOUR_OF_DAY) + " " +
instance.get(Calendar.DATE) + " * ?";
}
return null;
}
public abstract void resetRunningInstance(Long taskId); public abstract void resetRunningInstance(Long taskId);
private String getDayOfWeek(Calendar instance) {
int index = instance.get(Calendar.DAY_OF_WEEK);
index = (index + 1) % 7;
return String.valueOf(index);
}
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());
@ -89,13 +50,7 @@ public abstract class TaskHandler implements InitializingBean {
scheduleManager.fireNow(jobKey); scheduleManager.fireNow(jobKey);
} }
// 判断任务是否过期
public Boolean taskExpire(Long endTime) {
if (ObjectUtils.isEmpty(endTime))
return false;
Long now = System.currentTimeMillis();
return now > endTime;
}
protected abstract Boolean taskIsRunning(Long taskId); protected abstract Boolean taskIsRunning(Long taskId);

View File

@ -7,6 +7,7 @@ import io.dataease.auth.service.impl.AuthUserServiceImpl;
import io.dataease.auth.util.JWTUtils; import io.dataease.auth.util.JWTUtils;
import io.dataease.base.mapper.ext.ExtTaskMapper; import io.dataease.base.mapper.ext.ExtTaskMapper;
import io.dataease.commons.utils.CommonBeanFactory; import io.dataease.commons.utils.CommonBeanFactory;
import io.dataease.commons.utils.CronUtils;
import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.LogUtil;
import io.dataease.commons.utils.ServletUtils; import io.dataease.commons.utils.ServletUtils;
import io.dataease.job.sechedule.ScheduleManager; import io.dataease.job.sechedule.ScheduleManager;
@ -67,7 +68,7 @@ public class EmailTaskHandler extends TaskHandler implements Job {
JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); JobDataMap jobDataMap = context.getJobDetail().getJobDataMap();
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 (taskExpire(taskEntity.getEndTime())) { if (CronUtils.taskExpire(taskEntity.getEndTime())) {
removeTask(scheduleManager, taskEntity); removeTask(scheduleManager, taskEntity);
return; return;
} }

View File

@ -40,7 +40,6 @@ public class DirService {
} }
public List<DirItemDTO> query(DirRequest request) { public List<DirItemDTO> query(DirRequest request) {
// CurrentUserDto user = AuthUtils.getUser();
String userId = String.valueOf(AuthUtils.getUser().getUserId()); String userId = String.valueOf(AuthUtils.getUser().getUserId());
List<PanelEntity> panelEntities = new ArrayList<>(); List<PanelEntity> panelEntities = new ArrayList<>();
if (StringUtils.isNotBlank(request.getName())) { if (StringUtils.isNotBlank(request.getName())) {
@ -58,17 +57,6 @@ public class DirService {
return dirItemDTO; return dirItemDTO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
return dtos; return dtos;
// if (user.getUserId() == 1 && StringUtils.equals("admin", user.getUsername())) {
// return dtos;
// }
// List<String> permissions = proxy().permissions();
// return dtos.stream().filter(
// dto -> permissions.stream().anyMatch(
// permission -> StringUtils.equals(permission, dto.getId())
// )
// ).collect(Collectors.toList());
} }
public DirService proxy() { public DirService proxy() {

View File

@ -17,7 +17,7 @@ import io.dataease.plugins.xpack.email.dto.response.XpackTaskGridDTO;
import io.dataease.plugins.xpack.email.dto.response.XpackTaskInstanceDTO; import io.dataease.plugins.xpack.email.dto.response.XpackTaskInstanceDTO;
import io.dataease.plugins.xpack.email.service.EmailXpackService; import io.dataease.plugins.xpack.email.service.EmailXpackService;
import io.dataease.service.ScheduleService; import io.dataease.service.ScheduleService;
import io.swagger.annotations.Api; import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -28,7 +28,7 @@ import java.util.concurrent.Future;
import javax.annotation.Resource; import javax.annotation.Resource;
@Api(tags = "xpack定时报告")
@RequestMapping("/plugin/task") @RequestMapping("/plugin/task")
@RestController @RestController
public class XEmailTaskServer { public class XEmailTaskServer {
@ -45,6 +45,28 @@ public class XEmailTaskServer {
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<XpackTaskGridDTO> tasks = emailXpackService.taskGrid(request); List<XpackTaskGridDTO> tasks = emailXpackService.taskGrid(request);
if (CollectionUtils.isNotEmpty(tasks)) {
tasks.forEach(item -> {
if (CronUtils.taskExpire(item.getEndTime())) {
item.setNextExecTime(null);
}else {
GlobalTaskEntity globalTaskEntity = new GlobalTaskEntity();
globalTaskEntity.setRateType(item.getRateType());
globalTaskEntity.setRateVal(item.getRateVal());
try{
String cron = CronUtils.cron(globalTaskEntity);
if (StringUtils.isNotBlank(cron)) {
Long nextTime = CronUtils.getNextTriggerTime(cron).getTime();
item.setNextExecTime(nextTime);
}
}catch (Exception e) {
item.setNextExecTime(null);
}
}
});
}
Pager<List<XpackTaskGridDTO>> listPager = PageUtils.setPageInfo(page, tasks); Pager<List<XpackTaskGridDTO>> listPager = PageUtils.setPageInfo(page, tasks);
return listPager; return listPager;
} }
@ -133,6 +155,12 @@ public class XEmailTaskServer {
} }
} }
@PostMapping("/stop/{taskId}")
public void stop(@PathVariable Long taskId) throws Exception {
EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class);
emailXpackService.stop(taskId);
}
@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) {

View File

@ -315,7 +315,9 @@ public class ShareService {
} }
public List<PanelShareOutDTO> queryTargets(String panelId) { public List<PanelShareOutDTO> queryTargets(String panelId) {
return extPanelShareMapper.queryTargets(panelId); List<PanelShareOutDTO> targets = extPanelShareMapper.queryTargets(panelId);
if (CollectionUtils.isEmpty(targets)) return new ArrayList<>();
return targets.stream().filter(item -> StringUtils.isNotEmpty(item.getTargetName())).collect(Collectors.toList());
} }
public void removeShares(PanelShareRemoveRequest removeRequest) { public void removeShares(PanelShareRemoveRequest removeRequest) {

View File

@ -131,6 +131,7 @@ export default {
default_login: 'Normal' default_login: 'Normal'
}, },
commons: { commons: {
stop: 'Stop',
first_login_tips: 'Please change the initial password', first_login_tips: 'Please change the initial password',
roger_that: 'Roger That', roger_that: 'Roger That',
apply: 'Apply', apply: 'Apply',
@ -347,6 +348,8 @@ export default {
ukey_title: 'API Keys', ukey_title: 'API Keys',
thumbnail: 'thumbnail', thumbnail: 'thumbnail',
confirm_delete: 'Confirm delete', confirm_delete: 'Confirm delete',
confirm_stop: 'Confirm stop',
stop_success: 'Stop success',
treeselect: { treeselect: {
no_children_text: 'No sub-options.', no_children_text: 'No sub-options.',
no_options_text: 'No options available.', no_options_text: 'No options available.',
@ -1739,7 +1742,8 @@ export default {
search_by_name: 'Search by name', search_by_name: 'Search by name',
exec_time: 'Execute time', exec_time: 'Execute time',
status: 'Execute status', status: 'Execute status',
pixel_error: 'Pixel only support {800 - 10000} * {500 - 6250}' pixel_error: 'Pixel only support {800 - 10000} * {500 - 6250}',
next_exec_time: 'Next execute time'
}, },
emailtask: { emailtask: {

View File

@ -131,6 +131,7 @@ export default {
default_login: '普通登錄' default_login: '普通登錄'
}, },
commons: { commons: {
stop: '停止',
first_login_tips: '您使用的是初始密碼,記得修改密碼哦', first_login_tips: '您使用的是初始密碼,記得修改密碼哦',
roger_that: '知道了', roger_that: '知道了',
apply: '應用', apply: '應用',
@ -347,6 +348,8 @@ export default {
ukey_title: 'API Keys', ukey_title: 'API Keys',
thumbnail: '縮略圖', thumbnail: '縮略圖',
confirm_delete: '確認刪除', confirm_delete: '確認刪除',
confirm_stop: '確認停止',
stop_success: '停止成功',
treeselect: { treeselect: {
no_children_text: '沒有子節點', no_children_text: '沒有子節點',
no_options_text: '沒有可用選項', no_options_text: '沒有可用選項',
@ -1749,7 +1752,8 @@ export default {
search_by_name: '根據名稱搜索', search_by_name: '根據名稱搜索',
exec_time: '執行時間', exec_time: '執行時間',
status: '執行狀態', status: '執行狀態',
pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}' pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}',
next_exec_time: '下次執行時間'
}, },
emailtask: { emailtask: {

View File

@ -131,6 +131,7 @@ export default {
default_login: '普通登录' default_login: '普通登录'
}, },
commons: { commons: {
stop: '停止',
first_login_tips: '您使用的是初始密码,记得修改密码哦', first_login_tips: '您使用的是初始密码,记得修改密码哦',
roger_that: '知道了', roger_that: '知道了',
apply: '应用', apply: '应用',
@ -348,6 +349,8 @@ export default {
ukey_title: 'API Keys', ukey_title: 'API Keys',
thumbnail: '缩略图', thumbnail: '缩略图',
confirm_delete: '确认删除', confirm_delete: '确认删除',
confirm_stop: '确认停止',
stop_success: '停止成功',
treeselect: { treeselect: {
no_children_text: '没有子节点', no_children_text: '没有子节点',
no_options_text: '没有可用选项', no_options_text: '没有可用选项',
@ -1759,7 +1762,8 @@ export default {
search_by_name: '根据名称搜索', search_by_name: '根据名称搜索',
exec_time: '执行时间', exec_time: '执行时间',
status: '执行状态', status: '执行状态',
pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}' pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}',
next_exec_time: '下次执行时间'
}, },
emailtask: { emailtask: {

View File

@ -1,15 +1,15 @@
{ {
"app.name": "DataEase", "app.name": "DataEase",
"navigate.menuHome": "Home", "navigate.menuHome": "Home",
"navigate.menuDir": "Dir", "navigate.menuDir": "Folder",
"navigate.menuMe": "Me", "navigate.menuMe": "Me",
"navigate.search": "Search", "navigate.search": "Search",
"navigate.personInfo": "Person Info", "navigate.personInfo": "My Profile",
"navigate.language": "Language", "navigate.language": "Language",
"navigate.about": "About", "navigate.about": "About",
"navigate.login": "Login", "navigate.login": "Login",
"searchPlaceholder": "Please Code Panel Name", "searchPlaceholder": "Please Input Panel Name",
"commons": { "commons": {
"cancel": "Cancel", "cancel": "Cancel",
@ -24,11 +24,11 @@
"login": { "login": {
"title": "User Login", "title": "User Login",
"account": "Account:", "account": "Account:",
"accountPlaceholder": "Please Code Account", "accountPlaceholder": "Please Input Account",
"password": "Password:", "password": "Password:",
"passwordPlaceholder": "Please Code Password:", "passwordPlaceholder": "Please Input Password:",
"loginbtn": "Login", "loginbtn": "Login",
"pwdFmtError": "Password Must More Than 6 Character", "pwdFmtError": "Password Must More Than 6 Characters",
"uOrpwdError": "Invalid Account Or Password" "uOrpwdError": "Invalid Account Or Password"
}, },
"home": { "home": {
@ -38,13 +38,13 @@
}, },
"dir": { "dir": {
"searchHistory": "Search History", "searchHistory": "Search History",
"clearConfirm": "Sure Clean All History ?", "clearConfirm": "Are You Sure To Clean All History ?",
"noHistory": "There Are No Any History", "noHistory": "There Are No Any History",
"contentPrefix": "The Content You Code Are ", "contentPrefix": "The Content Is ",
"contentSuffix": "Will Be Marked As History When You Confirm" "contentSuffix": "Will Be Marked As History When You Confirm"
}, },
"me": { "me": {
"moreInfo": "More Info", "moreInfo": "More",
"logout": "Logout", "logout": "Logout",
"systemInfo": "System Info", "systemInfo": "System Info",
@ -61,4 +61,4 @@
} }
} }