From 68cc99d57840f8d4f31a4cb451da9fdffc8e78b7 Mon Sep 17 00:00:00 2001 From: Eric_Lee Date: Thu, 20 Jan 2022 12:28:00 +0800 Subject: [PATCH 1/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E8=8B=B1=E6=96=87?= =?UTF-8?q?=E7=BF=BB=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mobile/src/locale/en.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/mobile/src/locale/en.json b/mobile/src/locale/en.json index 626104e0b9..37b77ab53f 100644 --- a/mobile/src/locale/en.json +++ b/mobile/src/locale/en.json @@ -9,7 +9,7 @@ "navigate.language": "Language", "navigate.about": "About", "navigate.login": "Login", - "searchPlaceholder": "Please Code Panel Name", + "searchPlaceholder": "Please Input Panel Name", "commons": { "cancel": "Cancel", @@ -24,11 +24,11 @@ "login": { "title": "User Login", "account": "Account:", - "accountPlaceholder": "Please Code Account", + "accountPlaceholder": "Please Input Account", "password": "Password:", - "passwordPlaceholder": "Please Code Password:", + "passwordPlaceholder": "Please Input Password:", "loginbtn": "Login", - "pwdFmtError": "Password Must More Than 6 Character", + "pwdFmtError": "Password Must More Than 6 Characters", "uOrpwdError": "Invalid Account Or Password" }, "home": { @@ -61,4 +61,4 @@ } -} \ No newline at end of file +} From 32e666dc551d47a7de8cf528b11e73eb20f8c80e Mon Sep 17 00:00:00 2001 From: "Jiangjie.Bai" <32935519+BaiJiangJie@users.noreply.github.com> Date: Thu, 20 Jan 2022 12:36:29 +0800 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E8=8B=B1=E6=96=87=E7=BF=BB=E8=AF=91=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mobile/src/locale/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mobile/src/locale/en.json b/mobile/src/locale/en.json index 37b77ab53f..97dd8882f9 100644 --- a/mobile/src/locale/en.json +++ b/mobile/src/locale/en.json @@ -1,7 +1,7 @@ { "app.name": "DataEase", "navigate.menuHome": "Home", - "navigate.menuDir": "Dir", + "navigate.menuDir": "Folder", "navigate.menuMe": "Me", "navigate.search": "Search", @@ -38,9 +38,9 @@ }, "dir": { "searchHistory": "Search History", - "clearConfirm": "Sure Clean All History ?", + "clearConfirm": "Are You Sure To Clean All 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" }, "me": { From c801e22b24f5d45dcb905ae6051864c7c02d9b3b Mon Sep 17 00:00:00 2001 From: xinwen Date: Thu, 20 Jan 2022 12:46:21 +0800 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=BB=E5=8A=A8?= =?UTF-8?q?=E7=AB=AF=E8=8B=B1=E6=96=87=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mobile/src/locale/en.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mobile/src/locale/en.json b/mobile/src/locale/en.json index 97dd8882f9..36f663af86 100644 --- a/mobile/src/locale/en.json +++ b/mobile/src/locale/en.json @@ -5,7 +5,7 @@ "navigate.menuMe": "Me", "navigate.search": "Search", - "navigate.personInfo": "Person Info", + "navigate.personInfo": "My Profile", "navigate.language": "Language", "navigate.about": "About", "navigate.login": "Login", @@ -44,7 +44,7 @@ "contentSuffix": "Will Be Marked As History When You Confirm" }, "me": { - "moreInfo": "More Info", + "moreInfo": "More", "logout": "Logout", "systemInfo": "System Info", From 97adaf752667ca235554200f99d5e9116668340c Mon Sep 17 00:00:00 2001 From: avanb Date: Thu, 20 Jan 2022 12:54:46 +0800 Subject: [PATCH 4/6] =?UTF-8?q?refactor:=20=E5=88=A0=E9=99=A4=E6=97=A0?= =?UTF-8?q?=E7=94=A8=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/io/dataease/mobile/service/DirService.java | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/backend/src/main/java/io/dataease/mobile/service/DirService.java b/backend/src/main/java/io/dataease/mobile/service/DirService.java index 8e69473f2a..79abaa2c7b 100644 --- a/backend/src/main/java/io/dataease/mobile/service/DirService.java +++ b/backend/src/main/java/io/dataease/mobile/service/DirService.java @@ -40,7 +40,6 @@ public class DirService { } public List query(DirRequest request) { -// CurrentUserDto user = AuthUtils.getUser(); String userId = String.valueOf(AuthUtils.getUser().getUserId()); List panelEntities = new ArrayList<>(); if (StringUtils.isNotBlank(request.getName())) { @@ -58,17 +57,6 @@ public class DirService { return dirItemDTO; }).collect(Collectors.toList()); return dtos; - -// if (user.getUserId() == 1 && StringUtils.equals("admin", user.getUsername())) { -// return dtos; -// } -// List permissions = proxy().permissions(); -// return dtos.stream().filter( -// dto -> permissions.stream().anyMatch( -// permission -> StringUtils.equals(permission, dto.getId()) -// ) -// ).collect(Collectors.toList()); - } public DirService proxy() { From 3989c343b10ad77986193cad1caf6b7f19c4d404 Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 20 Jan 2022 13:59:47 +0800 Subject: [PATCH 5/6] =?UTF-8?q?fix:=20=E6=88=91=E5=88=86=E4=BA=AB=E7=9A=84?= =?UTF-8?q?=E4=BB=AA=E8=A1=A8=E6=9D=BF=E5=B1=95=E7=A4=BA=E7=A9=BAtags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/io/dataease/service/panel/ShareService.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/backend/src/main/java/io/dataease/service/panel/ShareService.java b/backend/src/main/java/io/dataease/service/panel/ShareService.java index ddc466d4ea..01c7150ff6 100644 --- a/backend/src/main/java/io/dataease/service/panel/ShareService.java +++ b/backend/src/main/java/io/dataease/service/panel/ShareService.java @@ -315,7 +315,9 @@ public class ShareService { } public List queryTargets(String panelId) { - return extPanelShareMapper.queryTargets(panelId); + List 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) { From d02d10c48cf6b1bc7b40994a873a5841a53b16be Mon Sep 17 00:00:00 2001 From: fit2cloud-chenyw Date: Thu, 20 Jan 2022 16:38:11 +0800 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=E4=BC=98=E5=8C=96=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E7=BC=BA=E9=99=B7,=E5=A2=9E=E5=8A=A0=E5=B1=95?= =?UTF-8?q?=E7=A4=BA=E5=AD=97=E6=AE=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../io/dataease/commons/utils/CronUtils.java | 54 ++++++++++++++++++ .../job/sechedule/strategy/TaskHandler.java | 57 ++----------------- .../strategy/impl/EmailTaskHandler.java | 3 +- .../plugins/server/XEmailTaskServer.java | 32 ++++++++++- frontend/src/lang/en.js | 6 +- frontend/src/lang/tw.js | 6 +- frontend/src/lang/zh.js | 6 +- 7 files changed, 107 insertions(+), 57 deletions(-) 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 e6a92861eb..c7a6d57327 100644 --- a/backend/src/main/java/io/dataease/commons/utils/CronUtils.java +++ b/backend/src/main/java/io/dataease/commons/utils/CronUtils.java @@ -1,10 +1,15 @@ 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.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.TriggerBuilder; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; import java.util.Date; /** @@ -58,5 +63,54 @@ public class CronUtils { 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; + } + } 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 87dff10bdf..bb5da23d0a 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 @@ -1,14 +1,13 @@ package io.dataease.job.sechedule.strategy; +import io.dataease.commons.utils.CronUtils; import io.dataease.job.sechedule.ScheduleManager; import io.dataease.plugins.common.entity.GlobalTaskEntity; import org.apache.commons.lang3.ObjectUtils; import org.quartz.*; import org.springframework.beans.factory.InitializingBean; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Calendar; + import java.util.Date; public abstract class TaskHandler implements InitializingBean { @@ -17,7 +16,7 @@ public abstract class TaskHandler implements InitializingBean { // 1。首先看看是否过期 Long endTime = taskEntity.getEndTime(); removeTask(scheduleManager, taskEntity); - if (taskExpire(endTime)) { // 过期了就删除任务 + if (CronUtils.taskExpire(endTime)) { // 过期了就删除任务 return; } JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); @@ -28,55 +27,17 @@ public abstract class TaskHandler implements InitializingBean { new Date(taskEntity.getEndTime()); } Class executor = this.getClass(); - String cron = cron(taskEntity); + String cron = CronUtils.cron(taskEntity); scheduleManager.addOrUpdateCronJob(jobKey, triggerKey, executor, cron, start, end, jobDataMap(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); - 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) { JobKey jobKey = new JobKey(taskEntity.getTaskId().toString()); @@ -89,13 +50,7 @@ public abstract class TaskHandler implements InitializingBean { 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); 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 12ba9352a2..f7d14699c4 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 @@ -7,6 +7,7 @@ import io.dataease.auth.service.impl.AuthUserServiceImpl; import io.dataease.auth.util.JWTUtils; import io.dataease.base.mapper.ext.ExtTaskMapper; import io.dataease.commons.utils.CommonBeanFactory; +import io.dataease.commons.utils.CronUtils; import io.dataease.commons.utils.LogUtil; import io.dataease.commons.utils.ServletUtils; import io.dataease.job.sechedule.ScheduleManager; @@ -67,7 +68,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); GlobalTaskEntity taskEntity = (GlobalTaskEntity) jobDataMap.get("taskEntity"); ScheduleManager scheduleManager = SpringContextUtil.getBean(ScheduleManager.class); - if (taskExpire(taskEntity.getEndTime())) { + if (CronUtils.taskExpire(taskEntity.getEndTime())) { removeTask(scheduleManager, taskEntity); return; } 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 fd8eb56a74..31595ae413 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XEmailTaskServer.java @@ -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.service.EmailXpackService; 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.StringUtils; import org.springframework.beans.factory.annotation.Autowired; @@ -28,7 +28,7 @@ import java.util.concurrent.Future; import javax.annotation.Resource; -@Api(tags = "xpack:定时报告") + @RequestMapping("/plugin/task") @RestController public class XEmailTaskServer { @@ -45,6 +45,28 @@ public class XEmailTaskServer { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); Page page = PageHelper.startPage(goPage, pageSize, true); List 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> listPager = PageUtils.setPageInfo(page, tasks); 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}") public Pager> instancesGrid(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody XpackGridRequest request) { diff --git a/frontend/src/lang/en.js b/frontend/src/lang/en.js index 1ba5dd21a0..4673500421 100644 --- a/frontend/src/lang/en.js +++ b/frontend/src/lang/en.js @@ -131,6 +131,7 @@ export default { default_login: 'Normal' }, commons: { + stop: 'Stop', first_login_tips: 'Please change the initial password', roger_that: 'Roger That', apply: 'Apply', @@ -347,6 +348,8 @@ export default { ukey_title: 'API Keys', thumbnail: 'thumbnail', confirm_delete: 'Confirm delete', + confirm_stop: 'Confirm stop', + stop_success: 'Stop success', treeselect: { no_children_text: 'No sub-options.', no_options_text: 'No options available.', @@ -1739,7 +1742,8 @@ export default { search_by_name: 'Search by name', exec_time: 'Execute time', 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: { diff --git a/frontend/src/lang/tw.js b/frontend/src/lang/tw.js index b1c8aeb34c..c6785d2af0 100644 --- a/frontend/src/lang/tw.js +++ b/frontend/src/lang/tw.js @@ -131,6 +131,7 @@ export default { default_login: '普通登錄' }, commons: { + stop: '停止', first_login_tips: '您使用的是初始密碼,記得修改密碼哦', roger_that: '知道了', apply: '應用', @@ -347,6 +348,8 @@ export default { ukey_title: 'API Keys', thumbnail: '縮略圖', confirm_delete: '確認刪除', + confirm_stop: '確認停止', + stop_success: '停止成功', treeselect: { no_children_text: '沒有子節點', no_options_text: '沒有可用選項', @@ -1749,7 +1752,8 @@ export default { search_by_name: '根據名稱搜索', exec_time: '執行時間', status: '執行狀態', - pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}' + pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}', + next_exec_time: '下次執行時間' }, emailtask: { diff --git a/frontend/src/lang/zh.js b/frontend/src/lang/zh.js index a308bf4f92..f8922ed15b 100644 --- a/frontend/src/lang/zh.js +++ b/frontend/src/lang/zh.js @@ -131,6 +131,7 @@ export default { default_login: '普通登录' }, commons: { + stop: '停止', first_login_tips: '您使用的是初始密码,记得修改密码哦', roger_that: '知道了', apply: '应用', @@ -348,6 +349,8 @@ export default { ukey_title: 'API Keys', thumbnail: '缩略图', confirm_delete: '确认删除', + confirm_stop: '确认停止', + stop_success: '停止成功', treeselect: { no_children_text: '没有子节点', no_options_text: '没有可用选项', @@ -1759,7 +1762,8 @@ export default { search_by_name: '根据名称搜索', exec_time: '执行时间', status: '执行状态', - pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}' + pixel_error: '分辨率支持{800 - 10000} * {500 - 6250}', + next_exec_time: '下次执行时间' }, emailtask: {