Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
phsl
/
admin
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
ea1e51a6
authored
Jun 19, 2024
by
jason
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
仿钉钉设计器- 审批节点配置结构调整
parent
58fc91b8
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
123 additions
and
81 deletions
+123
-81
src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
+44
-27
src/components/SimpleProcessDesignerV2/src/consts.ts
+79
-54
src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
+0
-0
No files found.
src/components/SimpleProcessDesignerV2/src/NodeHandler.vue
View file @
ea1e51a6
...
@@ -42,7 +42,14 @@
...
@@ -42,7 +42,14 @@
</template>
</template>
<
script
setup
lang=
"ts"
>
<
script
setup
lang=
"ts"
>
import
{
SimpleFlowNode
,
NodeType
,
NODE_DEFAULT_NAME
,
ApproveMethodType
,
RejectHandlerType
,
CandidateStrategy
}
from
'./consts'
import
{
SimpleFlowNode
,
NodeType
,
NODE_DEFAULT_NAME
,
ApproveMethodType
,
RejectHandlerType
,
CandidateStrategy
}
from
'./consts'
import
{
generateUUID
}
from
'@/utils'
import
{
generateUUID
}
from
'@/utils'
defineOptions
({
defineOptions
({
name
:
'NodeHandler'
name
:
'NodeHandler'
...
@@ -63,37 +70,47 @@ const props = defineProps({
...
@@ -63,37 +70,47 @@ const props = defineProps({
const
emits
=
defineEmits
([
'update:childNode'
])
const
emits
=
defineEmits
([
'update:childNode'
])
const
addNode
=
(
type
:
number
)
=>
{
const
addNode
=
(
type
:
number
)
=>
{
popoverShow
.
value
=
false
popoverShow
.
value
=
false
if
(
type
===
NodeType
.
USER_TASK_NODE
)
{
if
(
type
===
NodeType
.
USER_TASK_NODE
)
{
const
id
=
'Activity_'
+
generateUUID
();
const
id
=
'Activity_'
+
generateUUID
()
const
data
:
SimpleFlowNode
=
{
const
data
:
SimpleFlowNode
=
{
id
:
id
,
id
:
id
,
name
:
NODE_DEFAULT_NAME
.
get
(
NodeType
.
USER_TASK_NODE
)
as
string
,
name
:
NODE_DEFAULT_NAME
.
get
(
NodeType
.
USER_TASK_NODE
)
as
string
,
showText
:
''
,
showText
:
''
,
type
:
NodeType
.
USER_TASK_NODE
,
type
:
NodeType
.
USER_TASK_NODE
,
// 审批节点配置
approveMethod
:
ApproveMethodType
.
RRANDOM_SELECT_ONE_APPROVE
,
attributes
:
{
candidateStrategy
:
CandidateStrategy
.
USER
,
approveMethod
:
ApproveMethodType
.
RRANDOM_SELECT_ONE_APPROVE
,
candidateParam
:
undefined
,
candidateStrategy
:
CandidateStrategy
.
USER
,
fieldsPermission
:
undefined
,
candidateParam
:
undefined
,
// 超时处理
fieldsPermission
:
undefined
,
timeoutHandler
:
{
// 超时处理
enable
:
false
timeoutHandler
:
{
},
enable
:
false
rejectHandler
:
{
},
type
:
RejectHandlerType
.
FINISH_PROCESS
rejectHandler
:
{
type
:
RejectHandlerType
.
FINISH_PROCESS
}
},
},
childNode
:
props
.
childNode
childNode
:
props
.
childNode
// 审批节点配置
// attributes: {
// approveMethod: ApproveMethodType.RRANDOM_SELECT_ONE_APPROVE,
// candidateStrategy: CandidateStrategy.USER,
// candidateParam: undefined,
// fieldsPermission: undefined,
// // 超时处理
// timeoutHandler: {
// enable: false
// },
// rejectHandler: {
// type: RejectHandlerType.FINISH_PROCESS
// }
// },
}
}
emits
(
'update:childNode'
,
data
)
;
emits
(
'update:childNode'
,
data
)
}
}
if
(
type
===
NodeType
.
COPY_TASK_NODE
)
{
if
(
type
===
NodeType
.
COPY_TASK_NODE
)
{
const
data
:
SimpleFlowNode
=
{
const
data
:
SimpleFlowNode
=
{
id
:
'Activity_'
+
generateUUID
(),
id
:
'Activity_'
+
generateUUID
(),
name
:
NODE_DEFAULT_NAME
.
get
(
NodeType
.
COPY_TASK_NODE
)
as
string
,
name
:
NODE_DEFAULT_NAME
.
get
(
NodeType
.
COPY_TASK_NODE
)
as
string
,
showText
:
''
,
showText
:
''
,
type
:
NodeType
.
COPY_TASK_NODE
,
type
:
NodeType
.
COPY_TASK_NODE
,
...
@@ -108,14 +125,14 @@ const addNode = (type: number) => {
...
@@ -108,14 +125,14 @@ const addNode = (type: number) => {
emits
(
'update:childNode'
,
data
)
emits
(
'update:childNode'
,
data
)
}
}
if
(
type
===
NodeType
.
EXCLUSIVE_NODE
)
{
if
(
type
===
NodeType
.
EXCLUSIVE_NODE
)
{
const
data
:
SimpleFlowNode
=
{
const
data
:
SimpleFlowNode
=
{
name
:
'条件分支'
,
name
:
'条件分支'
,
type
:
NodeType
.
EXCLUSIVE_NODE
,
type
:
NodeType
.
EXCLUSIVE_NODE
,
id
:
'GateWay_'
+
generateUUID
(),
id
:
'GateWay_'
+
generateUUID
(),
childNode
:
props
.
childNode
,
childNode
:
props
.
childNode
,
conditionNodes
:
[
conditionNodes
:
[
{
{
id
:
'Flow_'
+
generateUUID
(),
id
:
'Flow_'
+
generateUUID
(),
name
:
'条件1'
,
name
:
'条件1'
,
showText
:
''
,
showText
:
''
,
type
:
NodeType
.
CONDITION_NODE
,
type
:
NodeType
.
CONDITION_NODE
,
...
@@ -126,7 +143,7 @@ const addNode = (type: number) => {
...
@@ -126,7 +143,7 @@ const addNode = (type: number) => {
}
}
},
},
{
{
id
:
'Flow_'
+
generateUUID
(),
id
:
'Flow_'
+
generateUUID
(),
name
:
'其它情况'
,
name
:
'其它情况'
,
showText
:
'其它情况进入此流程'
,
showText
:
'其它情况进入此流程'
,
type
:
NodeType
.
CONDITION_NODE
,
type
:
NodeType
.
CONDITION_NODE
,
...
@@ -141,25 +158,25 @@ const addNode = (type: number) => {
...
@@ -141,25 +158,25 @@ const addNode = (type: number) => {
emits
(
'update:childNode'
,
data
)
emits
(
'update:childNode'
,
data
)
}
}
if
(
type
===
NodeType
.
PARALLEL_NODE_FORK
)
{
if
(
type
===
NodeType
.
PARALLEL_NODE_FORK
)
{
const
data
:
SimpleFlowNode
=
{
const
data
:
SimpleFlowNode
=
{
name
:
'并行分支'
,
name
:
'并行分支'
,
type
:
NodeType
.
PARALLEL_NODE_FORK
,
type
:
NodeType
.
PARALLEL_NODE_FORK
,
id
:
'GateWay_'
+
generateUUID
(),
id
:
'GateWay_'
+
generateUUID
(),
childNode
:
props
.
childNode
,
childNode
:
props
.
childNode
,
conditionNodes
:
[
conditionNodes
:
[
{
{
id
:
'Flow_'
+
generateUUID
(),
id
:
'Flow_'
+
generateUUID
(),
name
:
'并行1'
,
name
:
'并行1'
,
showText
:
'无需配置条件同时执行'
,
showText
:
'无需配置条件同时执行'
,
type
:
NodeType
.
CONDITION_NODE
,
type
:
NodeType
.
CONDITION_NODE
,
childNode
:
undefined
,
childNode
:
undefined
},
},
{
{
id
:
'Flow_'
+
generateUUID
(),
id
:
'Flow_'
+
generateUUID
(),
name
:
'并行2'
,
name
:
'并行2'
,
showText
:
'无需配置条件同时执行'
,
showText
:
'无需配置条件同时执行'
,
type
:
NodeType
.
CONDITION_NODE
,
type
:
NodeType
.
CONDITION_NODE
,
childNode
:
undefined
,
childNode
:
undefined
}
}
]
]
}
}
...
...
src/components/SimpleProcessDesignerV2/src/consts.ts
View file @
ea1e51a6
...
@@ -20,7 +20,7 @@ export enum NodeType {
...
@@ -20,7 +20,7 @@ export enum NodeType {
* 抄送人节点
* 抄送人节点
*/
*/
COPY_TASK_NODE
=
2
,
COPY_TASK_NODE
=
2
,
/**
/**
* 条件节点
* 条件节点
*/
*/
...
@@ -71,44 +71,40 @@ export enum RejectHandlerType {
...
@@ -71,44 +71,40 @@ export enum RejectHandlerType {
* 驳回到指定节点
* 驳回到指定节点
*/
*/
RETURN_USER_TASK
=
2
RETURN_USER_TASK
=
2
}
}
// 条件配置类型 ( 用于条件节点配置 )
// 条件配置类型 ( 用于条件节点配置 )
export
enum
ConditionConfigType
{
export
enum
ConditionConfigType
{
/**
/**
* 条件表达式
* 条件表达式
*/
*/
EXPRESSION
=
1
,
EXPRESSION
=
1
,
/**
/**
* 条件规则
* 条件规则
*/
*/
RULE
=
2
RULE
=
2
}
}
// 多人审批方式类型 ( 用于审批节点 )
// 多人审批方式类型 ( 用于审批节点 )
export
enum
ApproveMethodType
{
export
enum
ApproveMethodType
{
/**
/**
* 随机挑选一人审批
* 随机挑选一人审批
*/
*/
RRANDOM_SELECT_ONE_APPROVE
=
1
,
RRANDOM_SELECT_ONE_APPROVE
=
1
,
/**
/**
* 多人会签(按通过比例)
* 多人会签(按通过比例)
*/
*/
APPROVE_BY_RATIO
=
2
,
APPROVE_BY_RATIO
=
2
,
/**
/**
* 多人或签(通过只需一人,拒绝只需一人)
* 多人或签(通过只需一人,拒绝只需一人)
*/
*/
ANY_APPROVE
=
3
,
ANY_APPROVE
=
3
,
/**
/**
* 多人依次审批
* 多人依次审批
*/
*/
SEQUENTIAL_APPROVE
=
4
SEQUENTIAL_APPROVE
=
4
}
}
// 候选人策略 ( 用于审批节点。抄送节点 )
// 候选人策略 ( 用于审批节点。抄送节点 )
...
@@ -137,37 +133,67 @@ export enum CandidateStrategy {
...
@@ -137,37 +133,67 @@ export enum CandidateStrategy {
* 发起人自选
* 发起人自选
*/
*/
START_USER_SELECT
=
35
,
START_USER_SELECT
=
35
,
/**
/**
* 发起人自己
* 发起人自己
*/
*/
START_USER
=
36
,
START_USER
=
36
,
/**
/**
* 指定用户组
* 指定用户组
*/
*/
USER_GROUP
=
40
,
USER_GROUP
=
40
,
/**
/**
* 流程表达式
* 流程表达式
*/
*/
EXPRESSION
=
60
EXPRESSION
=
60
}
}
export
type
RejectHandler
=
{
type
:
RejectHandlerType
returnNodeId
?:
string
}
export
type
TimeoutHandler
=
{
//是否开启超时处理
enable
:
boolean
// 超时执行的动作
action
?:
number
// 超时时间设置
timeDuration
?:
string
// 执行动作是自动提醒, 最大提醒次数
maxRemindCount
?:
number
}
export
type
SimpleFlowNode
=
{
export
type
SimpleFlowNode
=
{
id
:
string
,
id
:
string
type
:
NodeType
,
type
:
NodeType
name
:
string
,
name
:
string
showText
?:
string
,
showText
?:
string
attributes
?:
any
,
attributes
?:
any
// 孩子节点
// 孩子节点
childNode
?:
SimpleFlowNode
,
childNode
?:
SimpleFlowNode
// 条件节点
// 条件节点
conditionNodes
?:
SimpleFlowNode
[]
conditionNodes
?:
SimpleFlowNode
[]
// 候选人策略
candidateStrategy
?:
number
// 候选人参数
candidateParam
?:
string
// 多人审批方式
approveMethod
?:
ApproveMethodType
//通过比例
approveRatio
:
number
// 表单权限
fieldsPermission
?:
any
[]
// 审批任务超时处理
timeoutHandler
?:
TimeoutHandler
// 审批任务拒绝处理
rejectHandler
?:
RejectHandler
}
}
// 条件组
// 条件组
export
type
ConditionGroup
=
{
export
type
ConditionGroup
=
{
// 条件组的逻辑关系是否为且
// 条件组的逻辑关系是否为且
and
:
boolean
,
and
:
boolean
// 条件数组
// 条件数组
conditions
:
Condition
[]
conditions
:
Condition
[]
}
}
...
@@ -175,84 +201,83 @@ export type ConditionGroup = {
...
@@ -175,84 +201,83 @@ export type ConditionGroup = {
// 条件
// 条件
export
type
Condition
=
{
export
type
Condition
=
{
// 条件规则的逻辑关系是否为且
// 条件规则的逻辑关系是否为且
and
:
boolean
,
and
:
boolean
rules
:
ConditionRule
[]
rules
:
ConditionRule
[]
}
}
// 条件规则
// 条件规则
export
type
ConditionRule
=
{
export
type
ConditionRule
=
{
type
:
number
,
type
:
number
opName
:
string
,
opName
:
string
opCode
:
string
,
opCode
:
string
leftSide
:
string
,
leftSide
:
string
rightSide
:
string
rightSide
:
string
}
}
export
const
NODE_DEFAULT_TEXT
=
new
Map
<
number
,
string
>
()
export
const
NODE_DEFAULT_TEXT
=
new
Map
<
number
,
string
>
()
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
USER_TASK_NODE
,
'请配置审批人'
)
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
USER_TASK_NODE
,
'请配置审批人'
)
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
COPY_TASK_NODE
,
'请配置抄送人'
)
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
COPY_TASK_NODE
,
'请配置抄送人'
)
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
CONDITION_NODE
,
'请设置条件'
)
NODE_DEFAULT_TEXT
.
set
(
NodeType
.
CONDITION_NODE
,
'请设置条件'
)
export
const
NODE_DEFAULT_NAME
=
new
Map
<
number
,
string
>
()
export
const
NODE_DEFAULT_NAME
=
new
Map
<
number
,
string
>
()
NODE_DEFAULT_NAME
.
set
(
NodeType
.
USER_TASK_NODE
,
'审批人'
)
NODE_DEFAULT_NAME
.
set
(
NodeType
.
USER_TASK_NODE
,
'审批人'
)
NODE_DEFAULT_NAME
.
set
(
NodeType
.
COPY_TASK_NODE
,
'抄送人'
)
NODE_DEFAULT_NAME
.
set
(
NodeType
.
COPY_TASK_NODE
,
'抄送人'
)
NODE_DEFAULT_NAME
.
set
(
NodeType
.
CONDITION_NODE
,
'条件'
)
NODE_DEFAULT_NAME
.
set
(
NodeType
.
CONDITION_NODE
,
'条件'
)
export
const
APPROVE_METHODS
:
DictDataVO
[]
=
[
export
const
APPROVE_METHODS
:
DictDataVO
[]
=
[
{
label
:
'随机挑选一人审批'
,
value
:
ApproveMethodType
.
RRANDOM_SELECT_ONE_APPROVE
},
{
label
:
'随机挑选一人审批'
,
value
:
ApproveMethodType
.
RRANDOM_SELECT_ONE_APPROVE
},
{
label
:
'多人会签(按通过比例%)'
,
value
:
ApproveMethodType
.
APPROVE_BY_RATIO
},
{
label
:
'多人会签(按通过比例%)'
,
value
:
ApproveMethodType
.
APPROVE_BY_RATIO
},
{
label
:
'多人或签(一人通过或拒绝)'
,
value
:
ApproveMethodType
.
ANY_APPROVE
},
{
label
:
'多人或签(一人通过或拒绝)'
,
value
:
ApproveMethodType
.
ANY_APPROVE
},
{
label
:
'依次审批(按顺序依次审批)'
,
value
:
ApproveMethodType
.
SEQUENTIAL_APPROVE
}
{
label
:
'依次审批(按顺序依次审批)'
,
value
:
ApproveMethodType
.
SEQUENTIAL_APPROVE
}
]
]
export
const
CONDITION_CONFIG_TYPES
:
DictDataVO
[]
=
[
export
const
CONDITION_CONFIG_TYPES
:
DictDataVO
[]
=
[
{
label
:
'条件表达式'
,
value
:
1
},
{
label
:
'条件表达式'
,
value
:
1
},
{
label
:
'条件规则'
,
value
:
2
}
{
label
:
'条件规则'
,
value
:
2
}
]
]
// 时间单位类型
// 时间单位类型
export
const
TIME_UNIT_TYPES
:
DictDataVO
[]
=
[
export
const
TIME_UNIT_TYPES
:
DictDataVO
[]
=
[
{
label
:
'分钟'
,
value
:
TimeUnitType
.
MINUTE
},
{
label
:
'分钟'
,
value
:
TimeUnitType
.
MINUTE
},
{
label
:
'小时'
,
value
:
TimeUnitType
.
HOUR
},
{
label
:
'小时'
,
value
:
TimeUnitType
.
HOUR
},
{
label
:
'天'
,
value
:
TimeUnitType
.
DAY
}
,
{
label
:
'天'
,
value
:
TimeUnitType
.
DAY
}
]
]
// 超时处理执行动作类型
// 超时处理执行动作类型
export
const
TIMEOUT_HANDLER_ACTION_TYPES
:
DictDataVO
[]
=
[
export
const
TIMEOUT_HANDLER_ACTION_TYPES
:
DictDataVO
[]
=
[
{
label
:
'自动提醒'
,
value
:
1
},
{
label
:
'自动提醒'
,
value
:
1
},
{
label
:
'自动同意'
,
value
:
2
},
{
label
:
'自动同意'
,
value
:
2
},
{
label
:
'自动拒绝'
,
value
:
3
}
,
{
label
:
'自动拒绝'
,
value
:
3
}
]
]
export
const
REJECT_HANDLER_TYPES
:
DictDataVO
[]
=
[
export
const
REJECT_HANDLER_TYPES
:
DictDataVO
[]
=
[
{
label
:
'终止流程'
,
value
:
RejectHandlerType
.
FINISH_PROCESS
},
{
label
:
'终止流程'
,
value
:
RejectHandlerType
.
FINISH_PROCESS
},
{
label
:
'驳回到指定节点'
,
value
:
RejectHandlerType
.
RETURN_USER_TASK
}
{
label
:
'驳回到指定节点'
,
value
:
RejectHandlerType
.
RETURN_USER_TASK
}
// { label: '结束任务', value: RejectHandlerType.FINISH_TASK }
// { label: '结束任务', value: RejectHandlerType.FINISH_TASK }
]
]
// 比较运算符
// 比较运算符
export
const
COMPARISON_OPERATORS
:
DictDataVO
=
[
export
const
COMPARISON_OPERATORS
:
DictDataVO
=
[
{
{
value
:
'=='
,
value
:
'=='
,
label
:
'等于'
,
label
:
'等于'
},
},
{
{
value
:
'!='
,
value
:
'!='
,
label
:
'不等于'
,
label
:
'不等于'
},
},
{
{
value
:
'>'
,
value
:
'>'
,
label
:
'大于'
,
label
:
'大于'
},
},
{
{
value
:
'>='
,
value
:
'>='
,
label
:
'大于等于'
,
label
:
'大于等于'
},
},
{
{
value
:
'<'
,
value
:
'<'
,
label
:
'小于'
,
label
:
'小于'
},
},
{
{
value
:
'<='
,
value
:
'<='
,
label
:
'小于等于'
,
label
:
'小于等于'
}
}
]
]
src/components/SimpleProcessDesignerV2/src/nodes-config/UserTaskNodeConfig.vue
View file @
ea1e51a6
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment