Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
DolphinScheduler
提交
a8c41bbc
DolphinScheduler
项目概览
apache
/
DolphinScheduler
上一次同步 1 年多
通知
707
Star
9572
Fork
3514
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
DolphinScheduler
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a8c41bbc
编写于
4月 22, 2019
作者:
B
baoliang
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'upstream/dev-20190415' into dev-20190415
上级
b304a9bf
28c370e3
变更
30
隐藏空白更改
内联
并排
Showing
30 changed file
with
984 addition
and
149 deletion
+984
-149
escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java
.../cn/escheduler/api/controller/DataAnalysisController.java
+51
-7
escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java
...ler-api/src/main/java/cn/escheduler/api/enums/Status.java
+5
-0
escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java
...n/escheduler/api/interceptor/LoginHandlerInterceptor.java
+12
-7
escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java
...n/java/cn/escheduler/api/service/DataAnalysisService.java
+168
-7
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java
...src/main/java/cn/escheduler/dao/mapper/CommandMapper.java
+16
-0
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java
.../java/cn/escheduler/dao/mapper/CommandMapperProvider.java
+29
-0
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java
...ain/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java
+14
-0
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java
.../cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java
+28
-0
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java
...ain/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java
+14
-0
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java
.../cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java
+39
-1
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapperProvider.java
...ain/java/cn/escheduler/dao/mapper/UserMapperProvider.java
+1
-1
escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java
...main/java/cn/escheduler/dao/model/ExecuteStatusCount.java
+8
-0
escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
+1
-1
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
.../home/pages/dag/_source/formModel/_source/selectInput.vue
+1
-1
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue
...home/pages/dag/_source/formModel/_source/timeoutAlarm.vue
+1
-1
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/workerGroups.vue
...home/pages/dag/_source/formModel/_source/workerGroups.vue
+46
-0
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.scss
...c/js/conf/home/pages/dag/_source/formModel/formModel.scss
+109
-0
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue
...rc/js/conf/home/pages/dag/_source/formModel/formModel.vue
+16
-118
escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue
...duler-ui/src/js/conf/home/pages/dag/definitionDetails.vue
+4
-1
escheduler-ui/src/js/conf/home/pages/dag/index.vue
escheduler-ui/src/js/conf/home/pages/dag/index.vue
+4
-1
escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue
escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue
+4
-1
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/createWorker.vue
...ages/security/pages/workerGroups/_source/createWorker.vue
+118
-0
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue
...f/home/pages/security/pages/workerGroups/_source/list.vue
+119
-0
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue
.../js/conf/home/pages/security/pages/workerGroups/index.vue
+114
-0
escheduler-ui/src/js/conf/home/router/index.js
escheduler-ui/src/js/conf/home/router/index.js
+8
-0
escheduler-ui/src/js/conf/home/store/security/actions.js
escheduler-ui/src/js/conf/home/store/security/actions.js
+43
-0
escheduler-ui/src/js/conf/home/store/security/state.js
escheduler-ui/src/js/conf/home/store/security/state.js
+1
-1
escheduler-ui/src/js/module/components/priority/priority.vue
escheduler-ui/src/js/module/components/priority/priority.vue
+1
-0
escheduler-ui/src/js/module/components/secondaryMenu/_source/menu.js
...ui/src/js/module/components/secondaryMenu/_source/menu.js
+9
-0
escheduler-ui/src/js/module/permissions/index.js
escheduler-ui/src/js/module/permissions/index.js
+0
-1
未找到文件。
escheduler-api/src/main/java/cn/escheduler/api/controller/DataAnalysisController.java
浏览文件 @
a8c41bbc
...
...
@@ -57,8 +57,7 @@ public class DataAnalysisController extends BaseController{
public
Result
countTaskState
(
@RequestAttribute
(
value
=
Constants
.
SESSION_USER
)
User
loginUser
,
@RequestParam
(
value
=
"startDate"
,
required
=
false
)
String
startDate
,
@RequestParam
(
value
=
"endDate"
,
required
=
false
)
String
endDate
,
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
try
{
logger
.
info
(
"count task state, user:{}, start date: {}, end date:{}, project id {}"
,
loginUser
.
getUserName
(),
startDate
,
endDate
,
projectId
);
...
...
@@ -82,12 +81,11 @@ public class DataAnalysisController extends BaseController{
public
Result
countProcessInstanceState
(
@RequestAttribute
(
value
=
Constants
.
SESSION_USER
)
User
loginUser
,
@RequestParam
(
value
=
"startDate"
,
required
=
false
)
String
startDate
,
@RequestParam
(
value
=
"endDate"
,
required
=
false
)
String
endDate
,
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
try
{
logger
.
info
(
"count process instance state, user:{}, start date: {}, end date:{}, project id"
,
loginUser
.
getUserName
(),
startDate
,
endDate
,
projectId
);
Map
<
String
,
Object
>
result
=
dataAnalysisService
.
countProcessInstanceStateByProject
(
loginUser
,
projectId
,
startDate
,
endDate
);
Map
<
String
,
Object
>
result
=
dataAnalysisService
.
countProcessInstanceStateByProject
(
loginUser
,
projectId
,
startDate
,
endDate
);
return
returnDataList
(
result
);
}
catch
(
Exception
e
){
logger
.
error
(
COUNT_PROCESS_INSTANCE_STATE_ERROR
.
getMsg
(),
e
);
...
...
@@ -105,8 +103,7 @@ public class DataAnalysisController extends BaseController{
@GetMapping
(
value
=
"/define-user-count"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
Result
countDefinitionByUser
(
@RequestAttribute
(
value
=
Constants
.
SESSION_USER
)
User
loginUser
,
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
try
{
logger
.
info
(
"count process definition , user:{}, project id"
,
loginUser
.
getUserName
(),
projectId
);
...
...
@@ -119,4 +116,51 @@ public class DataAnalysisController extends BaseController{
}
/**
* statistical command status data
*
* @param loginUser
* @param projectId
* @return
*/
@GetMapping
(
value
=
"/command-state-count"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
Result
countCommandState
(
@RequestAttribute
(
value
=
Constants
.
SESSION_USER
)
User
loginUser
,
@RequestParam
(
value
=
"startDate"
,
required
=
false
)
String
startDate
,
@RequestParam
(
value
=
"endDate"
,
required
=
false
)
String
endDate
,
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
try
{
logger
.
info
(
"count command state, user:{}, start date: {}, end date:{}, project id {}"
,
loginUser
.
getUserName
(),
startDate
,
endDate
,
projectId
);
Map
<
String
,
Object
>
result
=
dataAnalysisService
.
countCommandState
(
loginUser
,
projectId
,
startDate
,
endDate
);
return
returnDataList
(
result
);
}
catch
(
Exception
e
){
logger
.
error
(
COMMAND_STATE_COUNT_ERROR
.
getMsg
(),
e
);
return
error
(
COMMAND_STATE_COUNT_ERROR
.
getCode
(),
COMMAND_STATE_COUNT_ERROR
.
getMsg
());
}
}
/**
* queue count
*
* @param loginUser
* @param projectId
* @return
*/
@GetMapping
(
value
=
"/queue-count"
)
@ResponseStatus
(
HttpStatus
.
OK
)
public
Result
countQueueState
(
@RequestAttribute
(
value
=
Constants
.
SESSION_USER
)
User
loginUser
,
@RequestParam
(
value
=
"projectId"
,
required
=
false
,
defaultValue
=
"0"
)
int
projectId
){
try
{
logger
.
info
(
"count command state, user:{}, start date: {}, end date:{}, project id {}"
,
loginUser
.
getUserName
(),
projectId
);
Map
<
String
,
Object
>
result
=
dataAnalysisService
.
countQueueState
(
loginUser
,
projectId
);
return
returnDataList
(
result
);
}
catch
(
Exception
e
){
logger
.
error
(
QUEUE_COUNT_ERROR
.
getMsg
(),
e
);
return
error
(
QUEUE_COUNT_ERROR
.
getCode
(),
QUEUE_COUNT_ERROR
.
getMsg
());
}
}
}
escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java
浏览文件 @
a8c41bbc
...
...
@@ -209,6 +209,11 @@ public enum Status {
GENERATE_TOKEN_ERROR
(
70002
,
"generate token error"
),
QUERY_ACCESSTOKEN_LIST_PAGING_ERROR
(
70003
,
"query access token list paging error"
),
COMMAND_STATE_COUNT_ERROR
(
80001
,
"task instance state count error"
),
QUEUE_COUNT_ERROR
(
90001
,
"queue count error"
),
;
private
int
code
;
...
...
escheduler-api/src/main/java/cn/escheduler/api/interceptor/LoginHandlerInterceptor.java
浏览文件 @
a8c41bbc
...
...
@@ -79,15 +79,20 @@ public class LoginHandlerInterceptor implements HandlerInterceptor {
//get user object from session
user
=
userMapper
.
queryById
(
session
.
getUserId
());
// if user is null
if
(
user
==
null
)
{
response
.
setStatus
(
HttpStatus
.
SC_UNAUTHORIZED
);
logger
.
info
(
"user does not exist"
);
return
false
;
}
}
else
{
user
=
userMapper
.
queryUserByToken
(
token
);
}
// if user is null
if
(
user
==
null
)
{
response
.
setStatus
(
HttpStatus
.
SC_UNAUTHORIZED
);
logger
.
info
(
"user does not exist"
);
return
false
;
if
(
user
==
null
)
{
response
.
setStatus
(
HttpStatus
.
SC_UNAUTHORIZED
);
logger
.
info
(
"user token has expired"
);
return
false
;
}
}
request
.
setAttribute
(
Constants
.
SESSION_USER
,
user
);
return
true
;
...
...
escheduler-api/src/main/java/cn/escheduler/api/service/DataAnalysisService.java
浏览文件 @
a8c41bbc
...
...
@@ -21,15 +21,17 @@ import cn.escheduler.api.dto.DefineUserDto;
import
cn.escheduler.api.dto.TaskCountDto
;
import
cn.escheduler.api.enums.Status
;
import
cn.escheduler.api.utils.Constants
;
import
cn.escheduler.common.enums.ExecutionStatus
;
import
cn.escheduler.common.enums.UserType
;
import
cn.escheduler.common.queue.ITaskQueue
;
import
cn.escheduler.common.queue.TaskQueueFactory
;
import
cn.escheduler.common.utils.DateUtils
;
import
cn.escheduler.dao.mapper.ProcessDefinitionMapper
;
import
cn.escheduler.dao.mapper.ProcessInstanceMapper
;
import
cn.escheduler.dao.mapper.ProjectMapper
;
import
cn.escheduler.dao.mapper.TaskInstanceMapper
;
import
cn.escheduler.dao.mapper.*
;
import
cn.escheduler.dao.model.DefinitionGroupByUser
;
import
cn.escheduler.dao.model.ExecuteStatusCount
;
import
cn.escheduler.dao.model.Project
;
import
cn.escheduler.dao.model.User
;
import
org.apache.commons.lang.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
...
...
@@ -55,15 +57,21 @@ public class DataAnalysisService {
@Autowired
ProjectService
projectService
;
@Autowired
TaskInstanceMapper
taskInstanceMapper
;
@Autowired
ProcessInstanceMapper
processInstanceMapper
;
@Autowired
ProcessDefinitionMapper
processDefinitionMapper
;
@Autowired
CommandMapper
commandMapper
;
@Autowired
ErrorCommandMapper
errorCommandMapper
;
@Autowired
TaskInstanceMapper
taskInstanceMapper
;
/**
* statistical task instance status data
*
...
...
@@ -206,4 +214,157 @@ public class DataAnalysisService {
}
return
false
;
}
/**
* statistical command status data
*
* @param loginUser
* @param projectId
* @param startDate
* @param endDate
* @return
*/
public
Map
<
String
,
Object
>
countCommandState
(
User
loginUser
,
int
projectId
,
String
startDate
,
String
endDate
)
{
Map
<
String
,
Object
>
result
=
new
HashMap
<>(
5
);
if
(
projectId
!=
0
){
Project
project
=
projectMapper
.
queryById
(
projectId
);
result
=
projectService
.
checkProjectAndAuth
(
loginUser
,
project
,
String
.
valueOf
(
projectId
));
if
(
getResultStatus
(
result
)){
return
result
;
}
}
/**
* find all the task lists in the project under the user
* statistics based on task status execution, failure, completion, wait, total
*/
Date
start
=
null
;
Date
end
=
null
;
try
{
start
=
DateUtils
.
getScheduleDate
(
startDate
);
end
=
DateUtils
.
getScheduleDate
(
endDate
);
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
putErrorRequestParamsMsg
(
result
);
return
result
;
}
// count command state
List
<
ExecuteStatusCount
>
commandStateCounts
=
commandMapper
.
countCommandState
(
loginUser
.
getId
(),
loginUser
.
getUserType
(),
start
,
end
,
projectId
);
// count error command state
List
<
ExecuteStatusCount
>
errorCommandStateCounts
=
errorCommandMapper
.
countCommandState
(
loginUser
.
getId
(),
loginUser
.
getUserType
(),
start
,
end
,
projectId
);
//
Map
<
ExecutionStatus
,
Map
<
String
,
Integer
>>
dataMap
=
new
HashMap
<>();
Map
<
String
,
Integer
>
commonCommand
=
new
HashMap
<>();
commonCommand
.
put
(
"commandState"
,
0
);
commonCommand
.
put
(
"errorCommandState"
,
0
);
// init data map
dataMap
.
put
(
ExecutionStatus
.
SUBMITTED_SUCCESS
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
RUNNING_EXEUTION
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
READY_PAUSE
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
PAUSE
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
READY_STOP
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
STOP
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
FAILURE
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
SUCCESS
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
NEED_FAULT_TOLERANCE
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
KILL
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
WAITTING_THREAD
,
commonCommand
);
dataMap
.
put
(
ExecutionStatus
.
WAITTING_DEPEND
,
commonCommand
);
// put command state
for
(
ExecuteStatusCount
executeStatusCount
:
commandStateCounts
){
Map
<
String
,
Integer
>
commandStateCountsMap
=
new
HashMap
<>(
dataMap
.
get
(
executeStatusCount
.
getExecutionStatus
()));
commandStateCountsMap
.
put
(
"commandState"
,
executeStatusCount
.
getCount
());
dataMap
.
put
(
executeStatusCount
.
getExecutionStatus
(),
commandStateCountsMap
);
}
// put error command state
for
(
ExecuteStatusCount
errorExecutionStatus
:
errorCommandStateCounts
){
Map
<
String
,
Integer
>
errorCommandStateCountsMap
=
new
HashMap
<>(
dataMap
.
get
(
errorExecutionStatus
.
getExecutionStatus
()));
errorCommandStateCountsMap
.
put
(
"errorCommandState"
,
errorExecutionStatus
.
getCount
());
dataMap
.
put
(
errorExecutionStatus
.
getExecutionStatus
(),
errorCommandStateCountsMap
);
}
result
.
put
(
Constants
.
DATA_LIST
,
dataMap
);
putMsg
(
result
,
Status
.
SUCCESS
);
return
result
;
}
/**
* count queue state
* @param loginUser
* @param projectId
* @return
*/
public
Map
<
String
,
Object
>
countQueueState
(
User
loginUser
,
int
projectId
)
{
Map
<
String
,
Object
>
result
=
new
HashMap
<>(
5
);
if
(
projectId
!=
0
){
Project
project
=
projectMapper
.
queryById
(
projectId
);
result
=
projectService
.
checkProjectAndAuth
(
loginUser
,
project
,
String
.
valueOf
(
projectId
));
if
(
getResultStatus
(
result
)){
return
result
;
}
}
ITaskQueue
tasksQueue
=
TaskQueueFactory
.
getTaskQueueInstance
();
List
<
String
>
tasksQueueList
=
tasksQueue
.
getAllTasks
(
cn
.
escheduler
.
common
.
Constants
.
SCHEDULER_TASKS_QUEUE
);
List
<
String
>
tasksKillList
=
tasksQueue
.
getAllTasks
(
cn
.
escheduler
.
common
.
Constants
.
SCHEDULER_TASKS_KILL
);
Map
<
String
,
Integer
>
dataMap
=
new
HashMap
<>();
if
(
loginUser
.
getUserType
()
==
UserType
.
ADMIN_USER
){
dataMap
.
put
(
"taskQueue"
,
tasksQueueList
.
size
());
dataMap
.
put
(
"taskKill"
,
tasksKillList
.
size
());
result
.
put
(
Constants
.
DATA_LIST
,
dataMap
);
putMsg
(
result
,
Status
.
SUCCESS
);
return
result
;
}
int
[]
tasksQueueIds
=
new
int
[
tasksQueueList
.
size
()];
int
[]
tasksKillIds
=
new
int
[
tasksKillList
.
size
()];
int
i
=
0
;
for
(
String
taskQueueStr
:
tasksQueueList
){
if
(
StringUtils
.
isNotEmpty
(
taskQueueStr
)){
String
[]
splits
=
taskQueueStr
.
split
(
"_"
);
if
(
splits
.
length
==
4
){
tasksQueueIds
[
i
++]=
Integer
.
parseInt
(
splits
[
3
]);
}
}
}
i
=
0
;
for
(
String
taskKillStr
:
tasksKillList
){
if
(
StringUtils
.
isNotEmpty
(
taskKillStr
)){
String
[]
splits
=
taskKillStr
.
split
(
"_"
);
if
(
splits
.
length
==
2
){
tasksKillIds
[
i
++]=
Integer
.
parseInt
(
splits
[
1
]);
}
}
}
Integer
taskQueueCount
=
taskInstanceMapper
.
countTask
(
loginUser
.
getId
(),
loginUser
.
getUserType
(),
projectId
,
tasksQueueIds
);
Integer
taskKillCount
=
taskInstanceMapper
.
countTask
(
loginUser
.
getId
(),
loginUser
.
getUserType
(),
projectId
,
tasksQueueIds
);
dataMap
.
put
(
"taskQueue"
,
taskQueueCount
);
dataMap
.
put
(
"taskKill"
,
taskKillCount
);
result
.
put
(
Constants
.
DATA_LIST
,
dataMap
);
putMsg
(
result
,
Status
.
SUCCESS
);
return
result
;
}
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapper.java
浏览文件 @
a8c41bbc
...
...
@@ -18,12 +18,15 @@ package cn.escheduler.dao.mapper;
import
cn.escheduler.common.enums.*
;
import
cn.escheduler.dao.model.Command
;
import
cn.escheduler.dao.model.ExecuteStatusCount
;
import
org.apache.ibatis.annotations.*
;
import
org.apache.ibatis.type.EnumOrdinalTypeHandler
;
import
org.apache.ibatis.type.JdbcType
;
import
java.sql.Timestamp
;
import
java.util.Date
;
import
java.util.List
;
import
java.util.Map
;
/**
* command mapper
...
...
@@ -103,4 +106,17 @@ public interface CommandMapper {
@SelectProvider
(
type
=
CommandMapperProvider
.
class
,
method
=
"queryAllCommand"
)
List
<
Command
>
queryAllCommand
();
@Results
(
value
=
{
@Result
(
property
=
"state"
,
column
=
"state"
,
typeHandler
=
EnumOrdinalTypeHandler
.
class
,
javaType
=
ExecutionStatus
.
class
,
jdbcType
=
JdbcType
.
TINYINT
),
@Result
(
property
=
"count"
,
column
=
"count"
,
javaType
=
Integer
.
class
,
jdbcType
=
JdbcType
.
INTEGER
),
})
@SelectProvider
(
type
=
CommandMapperProvider
.
class
,
method
=
"countCommandState"
)
List
<
ExecuteStatusCount
>
countCommandState
(
@Param
(
"userId"
)
int
userId
,
@Param
(
"userType"
)
UserType
userType
,
@Param
(
"startTime"
)
Date
startTime
,
@Param
(
"endTime"
)
Date
endTime
,
@Param
(
"projectId"
)
int
projectId
);
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/CommandMapperProvider.java
浏览文件 @
a8c41bbc
...
...
@@ -139,6 +139,35 @@ public class CommandMapperProvider {
}.
toString
();
}
/**
*
* count command type
* @param parameter
* @return
*/
public
String
countCommandState
(
Map
<
String
,
Object
>
parameter
){
return
new
SQL
(){
{
SELECT
(
"command_type as state,COUNT(*) AS count"
);
FROM
(
TABLE_NAME
+
" cmd,t_escheduler_process_definition process"
);
WHERE
(
"cmd.process_definition_id = process.id"
);
if
(
parameter
.
get
(
"projectId"
)
!=
null
&&
(
int
)
parameter
.
get
(
"projectId"
)
!=
0
){
WHERE
(
"process.project_id = #{projectId} "
);
}
else
{
if
(
parameter
.
get
(
"userType"
)
!=
null
&&
String
.
valueOf
(
parameter
.
get
(
"userType"
))
==
"GENERAL_USER"
)
{
AND
();
WHERE
(
"process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} "
+
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )"
);
}
}
WHERE
(
"cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}"
);
GROUP_BY
(
"cmd.command_type"
);
}
}.
toString
();
}
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapper.java
浏览文件 @
a8c41bbc
...
...
@@ -19,11 +19,13 @@ package cn.escheduler.dao.mapper;
import
cn.escheduler.common.enums.*
;
import
cn.escheduler.dao.model.Command
;
import
cn.escheduler.dao.model.ErrorCommand
;
import
cn.escheduler.dao.model.ExecuteStatusCount
;
import
org.apache.ibatis.annotations.*
;
import
org.apache.ibatis.type.EnumOrdinalTypeHandler
;
import
org.apache.ibatis.type.JdbcType
;
import
java.sql.Timestamp
;
import
java.util.Date
;
import
java.util.List
;
/**
...
...
@@ -41,5 +43,17 @@ public interface ErrorCommandMapper {
@SelectKey
(
statement
=
"SELECT LAST_INSERT_ID()"
,
keyProperty
=
"errorCommand.id"
,
before
=
false
,
resultType
=
int
.
class
)
int
insert
(
@Param
(
"errorCommand"
)
ErrorCommand
errorCommand
);
@Results
(
value
=
{
@Result
(
property
=
"state"
,
column
=
"state"
,
typeHandler
=
EnumOrdinalTypeHandler
.
class
,
javaType
=
ExecutionStatus
.
class
,
jdbcType
=
JdbcType
.
TINYINT
),
@Result
(
property
=
"count"
,
column
=
"count"
,
javaType
=
Integer
.
class
,
jdbcType
=
JdbcType
.
INTEGER
),
})
@SelectProvider
(
type
=
ErrorCommandMapperProvider
.
class
,
method
=
"countCommandState"
)
List
<
ExecuteStatusCount
>
countCommandState
(
@Param
(
"userId"
)
int
userId
,
@Param
(
"userType"
)
UserType
userType
,
@Param
(
"startTime"
)
Date
startTime
,
@Param
(
"endTime"
)
Date
endTime
,
@Param
(
"projectId"
)
int
projectId
);
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/ErrorCommandMapperProvider.java
浏览文件 @
a8c41bbc
...
...
@@ -38,4 +38,32 @@ public class ErrorCommandMapperProvider {
}
}.
toString
();
}
/**
*
* count command type
* @param parameter
* @return
*/
public
String
countCommandState
(
Map
<
String
,
Object
>
parameter
){
return
new
SQL
(){
{
SELECT
(
"command_type as state,COUNT(*) AS count"
);
FROM
(
TABLE_NAME
+
" cmd,t_escheduler_process_definition process"
);
WHERE
(
"cmd.process_definition_id = process.id"
);
if
(
parameter
.
get
(
"projectId"
)
!=
null
&&
(
int
)
parameter
.
get
(
"projectId"
)
!=
0
){
WHERE
(
"process.project_id = #{projectId} "
);
}
else
{
if
(
parameter
.
get
(
"userType"
)
!=
null
&&
String
.
valueOf
(
parameter
.
get
(
"userType"
))
==
"GENERAL_USER"
)
{
AND
();
WHERE
(
"process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} "
+
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )"
);
}
}
WHERE
(
"cmd.start_time >= #{startTime} and cmd.update_time <= #{endTime}"
);
GROUP_BY
(
"cmd.command_type"
);
}
}.
toString
();
}
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapper.java
浏览文件 @
a8c41bbc
...
...
@@ -304,4 +304,18 @@ public interface TaskInstanceMapper {
@SelectProvider
(
type
=
TaskInstanceMapperProvider
.
class
,
method
=
"queryByInstanceIdAndName"
)
TaskInstance
queryByInstanceIdAndName
(
@Param
(
"processInstanceId"
)
int
processInstanceId
,
@Param
(
"name"
)
String
name
);
/**
* count task
* @param userId
* @param userType
* @param projectId
* @return
*/
@SelectProvider
(
type
=
TaskInstanceMapperProvider
.
class
,
method
=
"countTask"
)
Integer
countTask
(
@Param
(
"userId"
)
int
userId
,
@Param
(
"userType"
)
UserType
userType
,
@Param
(
"projectId"
)
int
projectId
,
@Param
(
"taskIds"
)
int
[]
taskIds
);
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/TaskInstanceMapperProvider.java
浏览文件 @
a8c41bbc
...
...
@@ -185,7 +185,7 @@ public class TaskInstanceMapperProvider {
{
SELECT
(
"state, count(0) as count"
);
FROM
(
TABLE_NAME
+
" t"
);
LEFT_OUTER_JOIN
(
DEFINE_TABLE_NAME
+
" d on d.id=t.process_definition_id"
);
LEFT_OUTER_JOIN
(
DEFINE_TABLE_NAME
+
" d on d.id=t.process_definition_id"
);
LEFT_OUTER_JOIN
(
"t_escheduler_project p on p.id=d.project_id"
);
if
(
parameter
.
get
(
"projectId"
)
!=
null
&&
(
int
)
parameter
.
get
(
"projectId"
)
!=
0
){
WHERE
(
"p.id = #{projectId} "
);
...
...
@@ -404,4 +404,42 @@ public class TaskInstanceMapperProvider {
}
/**
*
* count task
* @param parameter
* @return
*/
public
String
countTask
(
Map
<
String
,
Object
>
parameter
){
StringBuffer
taskIdsStr
=
new
StringBuffer
();
int
[]
stateArray
=
(
int
[])
parameter
.
get
(
"taskIds"
);
for
(
int
i
=
0
;
i
<
stateArray
.
length
;
i
++){
taskIdsStr
.
append
(
stateArray
[
i
]);
if
(
i
<
stateArray
.
length
-
1
){
taskIdsStr
.
append
(
","
);
}
}
return
new
SQL
(){
{
SELECT
(
"count(1) as count"
);
FROM
(
TABLE_NAME
+
" task,t_escheduler_process_definition process"
);
WHERE
(
"task.process_definition_id=process.id"
);
if
(
parameter
.
get
(
"projectId"
)
!=
null
&&
(
int
)
parameter
.
get
(
"projectId"
)
!=
0
){
WHERE
(
"process.project_id = #{projectId} "
);
}
else
{
if
(
parameter
.
get
(
"userType"
)
!=
null
&&
String
.
valueOf
(
parameter
.
get
(
"userType"
))
==
"GENERAL_USER"
)
{
AND
();
WHERE
(
"process.project_id in (select id as project_id from t_escheduler_project tp where tp.user_id= #{userId} "
+
"union select project_id from t_escheduler_relation_project_user tr where tr.user_id= #{userId} )"
);
}
}
WHERE
(
"task.id in ("
+
taskIdsStr
.
toString
()
+
")"
);
}
}.
toString
();
}
}
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/UserMapperProvider.java
浏览文件 @
a8c41bbc
...
...
@@ -276,7 +276,7 @@ public class UserMapperProvider {
{
SELECT
(
"u.*"
);
FROM
(
TABLE_NAME
+
" u ,t_escheduler_access_token t"
);
WHERE
(
" u.id = t.user_id and token=#{token}"
);
WHERE
(
" u.id = t.user_id and token=#{token}
and t.expire_time > NOW()
"
);
}
}.
toString
();
}
...
...
escheduler-dao/src/main/java/cn/escheduler/dao/model/ExecuteStatusCount.java
浏览文件 @
a8c41bbc
...
...
@@ -50,4 +50,12 @@ public class ExecuteStatusCount {
public
void
setCount
(
int
count
)
{
this
.
count
=
count
;
}
@Override
public
String
toString
()
{
return
"ExecuteStatusCount{"
+
"state="
+
state
+
", count="
+
count
+
'}'
;
}
}
escheduler-ui/src/js/conf/home/pages/dag/_source/dag.vue
浏览文件 @
a8c41bbc
...
...
@@ -474,5 +474,5 @@
</
script
>
<
style
lang=
"scss"
rel=
"stylesheet/scss"
>
@import
"dag"
;
@import
"
./
dag"
;
</
style
>
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/selectInput.vue
浏览文件 @
a8c41bbc
...
...
@@ -33,7 +33,7 @@
import
disabledState
from
'
@/module/mixin/disabledState
'
export
default
{
name
:
'
select-input
'
,
name
:
'
form-
select-input
'
,
data
()
{
return
{
isIconState
:
false
,
...
...
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/timeoutAlarm.vue
浏览文件 @
a8c41bbc
...
...
@@ -46,7 +46,7 @@
import
disabledState
from
'
@/module/mixin/disabledState
'
export
default
{
name
:
'
timeout-alarm
'
,
name
:
'
form-
timeout-alarm
'
,
data
()
{
return
{
// Timeout display hiding
...
...
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/_source/workerGroups.vue
0 → 100644
浏览文件 @
a8c41bbc
<
template
>
<x-select
@
on-change=
"_onChange"
v-model=
"value"
style=
"width: 180px"
>
<x-option
v-for=
"item in workerGroupsList"
:key=
"item.id"
:value=
"item.id"
:label=
"item.name"
>
</x-option>
</x-select>
</
template
>
<
script
>
import
disabledState
from
'
@/module/mixin/disabledState
'
export
default
{
name
:
'
form-worker-group
'
,
data
()
{
return
{
workerGroupsList
:
[]
}
},
mixins
:
[
disabledState
],
props
:
{
value
:
Number
},
model
:
{
prop
:
'
value
'
,
event
:
'
workerGroupsEvent
'
},
methods
:
{
_onChange
(
o
)
{
this
.
value
=
o
.
value
this
.
$emit
(
'
workerGroupsEvent
'
,
o
.
value
)
}
},
watch
:
{
},
created
()
{
this
.
workerGroupsList
=
this
.
store
.
state
.
security
.
workerGroupsListAll
||
[]
if
(
!
this
.
value
)
{
this
.
$emit
(
'
workerGroupsEvent
'
,
this
.
workerGroupsList
[
0
].
id
)
}
}
}
</
script
>
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.scss
0 → 100644
浏览文件 @
a8c41bbc
.form-model-model
{
width
:
720px
;
position
:
relative
;
.title-box
{
height
:
61px
;
border-bottom
:
1px
solid
#DCDEDC
;
position
:
relative
;
.name
{
position
:
absolute
;
left
:
24px
;
top
:
18px
;
font-size
:
16px
;
}
.go-subtask
{
position
:
absolute
;
right
:
30px
;
top
:
17px
;
a
{
font-size
:
14px
;
color
:
#0097e0
;
margin-left
:
10px
;
i
.iconfont
{
font-size
:
18px
;
vertical-align
:
middle
;
}
em
{
color
:
#333
;
vertical-align
:
middle
;
font-style
:
normal
;
vertical-align
:
middle
;
padding-left
:
2px
;
}
&
:hover
{
em
{
text-decoration
:
underline
;
}
}
}
}
}
.bottom-box
{
position
:
absolute
;
bottom
:
0
;
left
:
0
;
width
:
100%
;
text-align
:
right
;
height
:
60px
;
line-height
:
60px
;
border-top
:
1px
solid
#DCDEDC
;
background
:
#fff
;
.submit
{
padding-right
:
20px
;
position
:
relative
;
z-index
:
9
;
}
}
.content-box
{
overflow-y
:
scroll
;
height
:
calc
(
100vh
-
61px
);
padding-bottom
:
60px
;
}
}
.from-model
{
padding-top
:
26px
;
>
div
{
clear
:
both
;
}
.list
{
position
:
relative
;
margin-bottom
:
10px
;
.text-box
{
width
:
112px
;
float
:
left
;
text-align
:
right
;
margin-right
:
8px
;
>
span
{
font-size
:
14px
;
color
:
#777
;
display
:
inline-block
;
padding-top
:
6px
;
}
}
.cont-box
{
width
:
580px
;
float
:
left
;
.label-box
{
width
:
100%
;
}
.text-b
{
font-size
:
14px
;
color
:
#777
;
display
:
inline-block
;
padding
:
0
6px
0
20px
;
}
}
.add
{
line-height
:
32px
;
a
{
color
:
#0097e0
;
}
}
&
:hover
{
}
.list-t
{
width
:
50%
;
float
:
left
;
}
}
}
\ No newline at end of file
escheduler-ui/src/js/conf/home/pages/dag/_source/formModel/formModel.vue
浏览文件 @
a8c41bbc
...
...
@@ -13,7 +13,6 @@
</div>
<div
class=
"content-box"
v-if=
"isContentBox"
>
<div
class=
"from-model"
>
<!-- Node name -->
<div
class=
"clearfix list"
>
<div
class=
"text-box"
><span>
{{$t('Node name')}}
</span></div>
...
...
@@ -51,7 +50,6 @@
<span>
{{$t('Description')}}
</span>
</div>
<div
class=
"cont-box"
>
<label
class=
"label-box"
>
<x-input
resize
...
...
@@ -72,9 +70,11 @@
<span>
{{$t('Task priority')}}
</span>
</div>
<div
class=
"cont-box"
>
<label
class=
"label-box"
>
<m-priority
v-model=
"taskInstancePriority"
style=
"width: 180px;"
></m-priority>
</label>
<span
class=
"label-box"
style=
"width: 193px;display: inline-block;"
>
<m-priority
v-model=
"taskInstancePriority"
></m-priority>
</span>
<span
class=
"text-b"
>
Worker分组
</span>
<m-worker-groups
v-model=
"workerGroupId"
></m-worker-groups>
</div>
</div>
...
...
@@ -178,15 +178,16 @@
import
mShell
from
'
./tasks/shell
'
import
mSpark
from
'
./tasks/spark
'
import
mPython
from
'
./tasks/python
'
import
{
isNameExDag
,
rtBantpl
}
from
'
./../plugIn/util
'
import
JSP
from
'
./../plugIn/jsPlumbHandle
'
import
mProcedure
from
'
./tasks/procedure
'
import
mDependent
from
'
./tasks/dependent
'
import
mSubProcess
from
'
./tasks/sub_process
'
import
mSelectInput
from
'
./_source/selectInput
'
import
mTimeoutAlarm
from
'
./_source/timeoutAlarm
'
import
mWorkerGroups
from
'
./_source/workerGroups
'
import
clickoutside
from
'
@/module/util/clickoutside
'
import
disabledState
from
'
@/module/mixin/disabledState
'
import
{
isNameExDag
,
rtBantpl
}
from
'
./../plugIn/util
'
import
mPriority
from
'
@/module/components/priority/priority
'
export
default
{
...
...
@@ -218,7 +219,9 @@
// Task timeout alarm
timeout
:
{},
// Task priority
taskInstancePriority
:
'
MEDIUM
'
taskInstancePriority
:
'
MEDIUM
'
,
// worker group id
workerGroupId
:
null
}
},
/**
...
...
@@ -349,7 +352,8 @@
maxRetryTimes
:
this
.
maxRetryTimes
,
retryInterval
:
this
.
retryInterval
,
timeout
:
this
.
timeout
,
taskInstancePriority
:
this
.
taskInstancePriority
taskInstancePriority
:
this
.
taskInstancePriority
,
workerGroupId
:
this
.
workerGroupId
},
fromThis
:
this
})
...
...
@@ -420,6 +424,7 @@
this
.
desc
=
o
.
desc
this
.
maxRetryTimes
=
o
.
maxRetryTimes
this
.
retryInterval
=
o
.
retryInterval
this
.
workerGroupId
=
o
.
workerGroupId
}
}
this
.
isContentBox
=
true
...
...
@@ -451,119 +456,12 @@
mDependent
,
mSelectInput
,
mTimeoutAlarm
,
mPriority
mPriority
,
mWorkerGroups
}
}
</
script
>
<
style
lang=
"scss"
rel=
"stylesheet/scss"
>
.form-model-model
{
width
:
720px
;
position
:
relative
;
.title-box
{
height
:
61px
;
border-bottom
:
1px
solid
#DCDEDC
;
position
:
relative
;
.name
{
position
:
absolute
;
left
:
24px
;
top
:
18px
;
font-size
:
16px
;
}
.go-subtask
{
position
:
absolute
;
right
:
30px
;
top
:
17px
;
a
{
font-size
:
14px
;
color
:
#0097e0
;
margin-left
:
10px
;
i
.iconfont
{
font-size
:
18px
;
vertical-align
:
middle
;
}
em
{
color
:
#333
;
vertical-align
:
middle
;
font-style
:
normal
;
vertical-align
:
middle
;
padding-left
:
2px
;
}
&
:hover
{
em
{
text-decoration
:
underline
;
}
}
}
}
}
.bottom-box
{
position
:
absolute
;
bottom
:
0
;
left
:
0
;
width
:
100%
;
text-align
:
right
;
height
:
60px
;
line-height
:
60px
;
border-top
:
1px
solid
#DCDEDC
;
background
:
#fff
;
.submit
{
padding-right
:
20px
;
position
:
relative
;
z-index
:
9
;
}
}
.content-box
{
overflow-y
:
scroll
;
height
:
calc
(
100vh
-
61px
);
padding-bottom
:
60px
;
}
}
.from-model
{
padding-top
:
26px
;
>
div
{
clear
:
both
;
}
.list
{
position
:
relative
;
margin-bottom
:
10px
;
.text-box
{
width
:
112px
;
float
:
left
;
text-align
:
right
;
margin-right
:
8px
;
>
span
{
font-size
:
14px
;
color
:
#777
;
display
:
inline-block
;
padding-top
:
6px
;
}
}
.cont-box
{
width
:
580px
;
float
:
left
;
.label-box
{
width
:
100%
;
}
.text-b
{
font-size
:
14px
;
color
:
#777
;
display
:
inline-block
;
padding
:
0
6px
0
20px
;
}
}
.add
{
line-height
:
32px
;
a
{
color
:
#0097e0
;
}
}
&
:hover
{
}
.list-t
{
width
:
50%
;
float
:
left
;
}
}
}
@import
"./formModel"
;
</
style
>
escheduler-ui/src/js/conf/home/pages/dag/definitionDetails.vue
浏览文件 @
a8c41bbc
...
...
@@ -26,6 +26,7 @@
methods
:
{
...
mapMutations
(
'
dag
'
,
[
'
resetParams
'
,
'
setIsDetails
'
]),
...
mapActions
(
'
dag
'
,
[
'
getProcessList
'
,
'
getResourcesList
'
,
'
getProcessDetails
'
]),
...
mapActions
(
'
security
'
,
[
'
getWorkerGroupsAll
'
]),
/**
* init
*/
...
...
@@ -40,7 +41,9 @@
// get process definition
this
.
getProcessList
(),
// get resource
this
.
getResourcesList
()
this
.
getResourcesList
(),
// get worker group list
this
.
getWorkerGroupsAll
()
]).
then
((
data
)
=>
{
let
item
=
data
[
0
]
this
.
setIsDetails
(
item
.
releaseState
===
'
ONLINE
'
)
...
...
escheduler-ui/src/js/conf/home/pages/dag/index.vue
浏览文件 @
a8c41bbc
...
...
@@ -25,6 +25,7 @@
methods
:
{
...
mapMutations
(
'
dag
'
,
[
'
resetParams
'
]),
...
mapActions
(
'
dag
'
,
[
'
getProcessList
'
,
'
getResourcesList
'
]),
...
mapActions
(
'
security
'
,
[
'
getWorkerGroupsAll
'
]),
/**
* init
*/
...
...
@@ -37,7 +38,9 @@
// get process definition
this
.
getProcessList
(),
// get resource
this
.
getResourcesList
()
this
.
getResourcesList
(),
// get worker group list
this
.
getWorkerGroupsAll
()
]).
then
((
data
)
=>
{
this
.
isLoading
=
false
// Whether to pop up the box?
...
...
escheduler-ui/src/js/conf/home/pages/dag/instanceDetails.vue
浏览文件 @
a8c41bbc
...
...
@@ -26,6 +26,7 @@
methods
:
{
...
mapMutations
(
'
dag
'
,
[
'
setIsDetails
'
,
'
resetParams
'
]),
...
mapActions
(
'
dag
'
,
[
'
getProcessList
'
,
'
getResourcesList
'
,
'
getInstancedetail
'
]),
...
mapActions
(
'
security
'
,
[
'
getWorkerGroupsAll
'
]),
/**
* init
*/
...
...
@@ -40,7 +41,9 @@
// get process definition
this
.
getProcessList
(),
// get resources
this
.
getResourcesList
()
this
.
getResourcesList
(),
// get worker group list
this
.
getWorkerGroupsAll
()
]).
then
((
data
)
=>
{
let
item
=
data
[
0
]
let
flag
=
false
...
...
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/createWorker.vue
0 → 100644
浏览文件 @
a8c41bbc
<
template
>
<m-popup
ref=
"popup"
:ok-text=
"item ? $t('Edit') : $t('Submit')"
:nameText=
"item ? '编辑Worker分组' : '创建Worker分组'"
@
ok=
"_ok"
>
<template
slot=
"content"
>
<div
class=
"create-worker-model"
>
<m-list-box-f>
<template
slot=
"name"
><b>
*
</b>
{{
$t
(
'
Group Name
'
)
}}
</
template
>
<
template
slot=
"content"
>
<x-input
type=
"input"
v-model=
"name"
:placeholder=
"$t('Please enter group name')"
>
</x-input>
</
template
>
</m-list-box-f>
<m-list-box-f>
<
template
slot=
"name"
>
IP
</
template
>
<
template
slot=
"content"
>
<x-input
:autosize=
"
{ minRows: 4, maxRows: 6 }"
type="textarea"
v-model="ipList"
:placeholder="'请输入IP地址多个用逗号隔开'">
</x-input>
<div
class=
"ipt-tip"
>
<span>
注意:多个IP地址已逗号分割
</span>
</div>
</
template
>
</m-list-box-f>
</div>
</template>
</m-popup>
</template>
<
script
>
import
i18n
from
'
@/module/i18n
'
import
store
from
'
@/conf/home/store
'
import
mPopup
from
'
@/module/components/popup/popup
'
import
mListBoxF
from
'
@/module/components/listBoxF/listBoxF
'
export
default
{
name
:
'
create-warning
'
,
data
()
{
return
{
store
,
id
:
0
,
name
:
''
,
ipList
:
''
}
},
props
:
{
item
:
Object
},
methods
:
{
_ok
()
{
if
(
this
.
_verification
())
{
// Verify username
this
.
_submit
()
}
},
_verification
()
{
// group name
if
(
!
this
.
name
)
{
this
.
$message
.
warning
(
`
${
i18n
.
$t
(
'
Please enter group name
'
)}
`
)
return
false
}
if
(
!
this
.
ipList
)
{
this
.
$message
.
warning
(
`IP地址不能为空`
)
return
false
}
return
true
},
_submit
()
{
let
param
=
{
id
:
this
.
id
,
name
:
this
.
name
,
ipList
:
this
.
ipList
}
if
(
this
.
item
)
{
param
.
id
=
this
.
item
.
id
}
this
.
$refs
[
'
popup
'
].
spinnerLoading
=
true
this
.
store
.
dispatch
(
`security/saveWorkerGroups`
,
param
).
then
(
res
=>
{
this
.
$emit
(
'
onUpdate
'
)
this
.
$message
.
success
(
res
.
msg
)
setTimeout
(()
=>
{
this
.
$refs
[
'
popup
'
].
spinnerLoading
=
false
},
800
)
}).
catch
(
e
=>
{
this
.
$message
.
error
(
e
.
msg
||
''
)
this
.
$refs
[
'
popup
'
].
spinnerLoading
=
false
})
}
},
watch
:
{},
created
()
{
if
(
this
.
item
)
{
this
.
id
=
this
.
item
.
id
this
.
name
=
this
.
item
.
name
this
.
ipList
=
this
.
item
.
ipList
}
},
mounted
()
{
},
components
:
{
mPopup
,
mListBoxF
}
}
</
script
>
<
style
lang=
"scss"
rel=
"stylesheet/scss"
>
.create-worker-model
{
.ipt-tip
{
color
:
#999
;
padding-top
:
4px
;
display
:
block
;
}
}
</
style
>
\ No newline at end of file
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/_source/list.vue
0 → 100644
浏览文件 @
a8c41bbc
<
template
>
<div
class=
"list-model"
>
<div
class=
"table-box"
>
<table>
<tr>
<th>
<span>
{{
$t
(
'
#
'
)
}}
</span>
</th>
<th>
<span>
分组名称
</span>
</th>
<th>
<span>
IPList
</span>
</th>
<th>
<span>
{{
$t
(
'
Create Time
'
)
}}
</span>
</th>
<th>
<span>
{{
$t
(
'
Update Time
'
)
}}
</span>
</th>
<th
width=
"70"
>
<span>
{{
$t
(
'
Operation
'
)
}}
</span>
</th>
</tr>
<tr
v-for=
"(item, $index) in list"
:key=
"$index"
>
<td>
<span>
{{
parseInt
(
pageNo
===
1
?
(
$index
+
1
)
:
((
$index
+
1
)
+
(
pageSize
*
(
pageNo
-
1
))))
}}
</span>
</td>
<td>
<span>
<a
href=
"javascript:"
class=
"links"
>
{{
item
.
name
}}
</a>
</span>
</td>
<td>
<span>
{{
item
.
ipList
}}
</span>
</td>
<td>
<span>
{{
item
.
createTime
|
formatDate
}}
</span>
</td>
<td><span>
{{
item
.
updateTime
|
formatDate
}}
</span></td>
<td>
<x-button
type=
"info"
shape=
"circle"
size=
"xsmall"
data-toggle=
"tooltip"
icon=
"iconfont icon-bianjixiugai"
:title=
"$t('Edit')"
@
click=
"_edit(item)"
>
</x-button>
<x-poptip
:ref=
"'poptip-delete-' + $index"
placement=
"bottom-end"
width=
"90"
>
<p>
{{
$t
(
'
Delete?
'
)
}}
</p>
<div
style=
"text-align: right; margin: 0;padding-top: 4px;"
>
<x-button
type=
"text"
size=
"xsmall"
shape=
"circle"
@
click=
"_closeDelete($index)"
>
{{
$t
(
'
Cancel
'
)
}}
</x-button>
<x-button
type=
"primary"
size=
"xsmall"
shape=
"circle"
@
click=
"_delete(item,$index)"
>
{{
$t
(
'
Confirm
'
)
}}
</x-button>
</div>
<template
slot=
"reference"
>
<x-button
type=
"error"
shape=
"circle"
size=
"xsmall"
data-toggle=
"tooltip"
icon=
"iconfont icon-shanchu"
:title=
"$t('delete')"
>
</x-button>
</
template
>
</x-poptip>
</td>
</tr>
</table>
</div>
</div>
</template>
<
script
>
// import _ from 'lodash'
// import i18n from '@/module/i18n'
import
{
mapActions
}
from
'
vuex
'
import
'
@/module/filter/formatDate
'
import
{
findComponentDownward
}
from
'
@/module/util/
'
export
default
{
name
:
'
user-list
'
,
data
()
{
return
{
list
:
[]
}
},
props
:
{
workerGroupList
:
Array
,
pageNo
:
Number
,
pageSize
:
Number
},
methods
:
{
...
mapActions
(
'
security
'
,
[
'
deleteWorkerGroups
'
]),
_closeDelete
(
i
)
{
this
.
$refs
[
`poptip-delete-
${
i
}
`
][
0
].
doClose
()
},
_delete
(
item
,
i
)
{
this
.
deleteWorkerGroups
({
id
:
item
.
id
}).
then
(
res
=>
{
this
.
$refs
[
`poptip-delete-
${
i
}
`
][
0
].
doClose
()
this
.
list
.
splice
(
i
,
1
)
this
.
$message
.
success
(
res
.
msg
)
}).
catch
(
e
=>
{
this
.
$refs
[
`poptip-delete-
${
i
}
`
][
0
].
doClose
()
this
.
$message
.
error
(
e
.
msg
||
''
)
})
},
_edit
(
item
)
{
findComponentDownward
(
this
.
$root
,
'
worker-groups-index
'
).
_create
(
item
)
}
},
watch
:
{
workerGroupList
(
a
)
{
this
.
list
=
[]
setTimeout
(()
=>
{
this
.
list
=
a
})
}
},
created
()
{
this
.
list
=
this
.
workerGroupList
},
mounted
()
{
},
components
:
{
}
}
</
script
>
\ No newline at end of file
escheduler-ui/src/js/conf/home/pages/security/pages/workerGroups/index.vue
0 → 100644
浏览文件 @
a8c41bbc
<
template
>
<m-list-construction
:title=
"'worker分组管理'"
>
<template
slot=
"conditions"
>
<m-conditions
@
on-conditions=
"_onConditions"
>
<template
slot=
"button-group"
>
<x-button
type=
"ghost"
size=
"small"
@
click=
"_create('')"
>
创建worker分组
</x-button>
</
template
>
</m-conditions>
</template>
<
template
slot=
"content"
>
<template
v-if=
"workerGroupList.length"
>
<m-list
:worker-group-list=
"workerGroupList"
:page-no=
"searchParams.pageNo"
:page-size=
"searchParams.pageSize"
></m-list>
<div
class=
"page-box"
>
<x-page
:current=
"parseInt(searchParams.pageNo)"
:total=
"total"
:page-size=
"searchParams.pageSize"
show-elevator
@
on-change=
"_page"
></x-page>
</div>
</
template
>
<
template
v-if=
"!workerGroupList.length"
>
<m-no-data></m-no-data>
</
template
>
<m-spin
:is-spin=
"isLoading"
></m-spin>
</template>
</m-list-construction>
</template>
<
script
>
import
_
from
'
lodash
'
import
{
mapActions
}
from
'
vuex
'
import
mList
from
'
./_source/list
'
import
mSpin
from
'
@/module/components/spin/spin
'
import
mCreateWorker
from
'
./_source/createWorker
'
import
mNoData
from
'
@/module/components/noData/noData
'
import
listUrlParamHandle
from
'
@/module/mixin/listUrlParamHandle
'
import
mConditions
from
'
@/module/components/conditions/conditions
'
import
mListConstruction
from
'
@/module/components/listConstruction/listConstruction
'
export
default
{
name
:
'
worker-groups-index
'
,
data
()
{
return
{
total
:
null
,
isLoading
:
false
,
workerGroupList
:
[],
searchParams
:
{
pageSize
:
10
,
pageNo
:
1
,
searchVal
:
''
}
}
},
mixins
:
[
listUrlParamHandle
],
props
:
{},
methods
:
{
...
mapActions
(
'
security
'
,
[
'
getWorkerGroups
'
]),
/**
* Inquire
*/
_onConditions
(
o
)
{
this
.
searchParams
=
_
.
assign
(
this
.
searchParams
,
o
)
this
.
searchParams
.
pageNo
=
1
},
_page
(
val
)
{
this
.
searchParams
.
pageNo
=
val
},
_create
(
item
)
{
let
self
=
this
let
modal
=
this
.
$modal
.
dialog
({
closable
:
false
,
showMask
:
true
,
escClose
:
true
,
className
:
'
v-modal-custom
'
,
transitionName
:
'
opacityp
'
,
render
(
h
)
{
return
h
(
mCreateWorker
,
{
on
:
{
onUpdate
()
{
self
.
_debounceGET
(
'
false
'
)
modal
.
remove
()
},
close
()
{
modal
.
remove
()
}
},
props
:
{
item
:
item
}
})
}
})
},
_getList
(
flag
)
{
this
.
isLoading
=
!
flag
this
.
getWorkerGroups
(
this
.
searchParams
).
then
(
res
=>
{
this
.
workerGroupList
=
[]
this
.
workerGroupList
=
res
.
totalList
this
.
total
=
res
.
total
this
.
isLoading
=
false
}).
catch
(
e
=>
{
this
.
isLoading
=
false
})
}
},
watch
:
{
// router
'
$route
'
(
a
)
{
// url no params get instance list
this
.
searchParams
.
pageNo
=
_
.
isEmpty
(
a
.
query
)
?
1
:
a
.
query
.
pageNo
}
},
created
()
{
},
mounted
()
{
},
components
:
{
mList
,
mListConstruction
,
mConditions
,
mSpin
,
mNoData
}
}
</
script
>
escheduler-ui/src/js/conf/home/router/index.js
浏览文件 @
a8c41bbc
...
...
@@ -317,6 +317,14 @@ const router = new Router({
meta
:
{
title
:
`
${
i18n
.
$t
(
'
Queue manage
'
)}
`
}
},
{
path
:
'
/security/worker-groups
'
,
name
:
'
worker-groups-manage
'
,
component
:
resolve
=>
require
([
'
../pages/security/pages/workerGroups/index
'
],
resolve
),
meta
:
{
title
:
`workerGroups`
}
}
]
},
...
...
escheduler-ui/src/js/conf/home/store/security/actions.js
浏览文件 @
a8c41bbc
...
...
@@ -413,5 +413,48 @@ export default {
reject
(
e
)
})
})
},
/**
* get worker groups
*/
getWorkerGroups
({
state
},
payload
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
io
.
get
(
`worker-group/list-paging`
,
payload
,
res
=>
{
resolve
(
res
.
data
)
}).
catch
(
e
=>
{
reject
(
e
)
})
})
},
/**
* get worker groups all
*/
getWorkerGroupsAll
({
state
},
payload
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
io
.
get
(
`worker-group/all-groups`
,
payload
,
res
=>
{
state
.
workerGroupsListAll
=
res
.
data
resolve
(
res
.
data
)
}).
catch
(
e
=>
{
reject
(
e
)
})
})
},
saveWorkerGroups
({
state
},
payload
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
io
.
post
(
`worker-group/save`
,
payload
,
res
=>
{
resolve
(
res
)
}).
catch
(
e
=>
{
reject
(
e
)
})
})
},
deleteWorkerGroups
({
state
},
payload
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
io
.
get
(
`worker-group/delete-by-id`
,
payload
,
res
=>
{
resolve
(
res
)
}).
catch
(
e
=>
{
reject
(
e
)
})
})
}
}
escheduler-ui/src/js/conf/home/store/security/state.js
浏览文件 @
a8c41bbc
...
...
@@ -15,5 +15,5 @@
* limitations under the License.
*/
export
default
{
workerGroupsListAll
:
[]
}
escheduler-ui/src/js/module/components/priority/priority.vue
浏览文件 @
a8c41bbc
...
...
@@ -91,6 +91,7 @@
<
style
lang=
"scss"
rel=
"stylesheet/scss"
>
.priority-model
{
display
:
inline-block
;
.ans-option-listp
{
>
span
{
font-weight
:
normal
;
...
...
escheduler-ui/src/js/module/components/secondaryMenu/_source/menu.js
浏览文件 @
a8c41bbc
...
...
@@ -108,6 +108,15 @@ let menu = {
disabled
:
true
,
icon
:
'
fa-recycle
'
,
children
:
[]
},
{
name
:
`worker分组管理`
,
id
:
4
,
path
:
'
worker-groups-manage
'
,
isOpen
:
true
,
disabled
:
true
,
icon
:
'
fa-address-book
'
,
children
:
[]
}
],
resource
:
[
...
...
escheduler-ui/src/js/module/permissions/index.js
浏览文件 @
a8c41bbc
...
...
@@ -32,7 +32,6 @@ Permissions.prototype = {
this
.
isAuth
=
false
}
this
.
ps
(
res
)
resolve
()
})
})
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录