1
1
<!-- UserTask 自定义配置:
2
2
1. 审批人与提交人为同一人时
3
+ 2. 审批人拒绝时
3
4
-->
4
5
<template >
5
6
<div class =" panel-tab__content" >
7
+ <el-divider content-position =" left" >审批人拒绝时</el-divider >
8
+ <el-form-item prop =" rejectHandlerType" >
9
+ <el-radio-group
10
+ v-model =" rejectHandlerType"
11
+ :disabled =" returnTaskList.length === 0"
12
+ @change =" updateRejectHandlerType"
13
+ >
14
+ <div class =" flex-col" >
15
+ <div v-for =" (item, index) in REJECT_HANDLER_TYPES" :key =" index" >
16
+ <el-radio :key =" item.value" :value =" item.value" :label =" item.label" />
17
+ </div >
18
+ </div >
19
+ </el-radio-group >
20
+ </el-form-item >
21
+ <el-form-item
22
+ v-if =" rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
23
+ label =" 驳回节点"
24
+ prop =" returnNodeId"
25
+ >
26
+ <el-select v-model =" returnNodeId" clearable style =" width : 100% " @change =" updateReturnNodeId" >
27
+ <el-option
28
+ v-for =" item in returnTaskList"
29
+ :key =" item.id"
30
+ :label =" item.name"
31
+ :value =" item.id"
32
+ />
33
+ </el-select >
34
+ </el-form-item >
35
+
6
36
<el-divider content-position =" left" >审批人与提交人为同一人时</el-divider >
7
37
<el-radio-group v-model =" assignStartUserHandlerType" @change =" updateAssignStartUserHandlerType" >
8
38
<div class =" flex-col" >
15
45
</template >
16
46
17
47
<script lang="ts" setup>
18
- import { ASSIGN_START_USER_HANDLER_TYPES } from ' @/components/SimpleProcessDesignerV2/src/consts'
48
+ import {
49
+ ASSIGN_START_USER_HANDLER_TYPES ,
50
+ RejectHandlerType ,
51
+ REJECT_HANDLER_TYPES
52
+ } from ' @/components/SimpleProcessDesignerV2/src/consts'
19
53
20
54
defineOptions ({ name: ' ElementCustomConfig' })
21
55
const props = defineProps ({
@@ -24,31 +58,62 @@ const props = defineProps({
24
58
})
25
59
const prefix = inject (' prefix' )
26
60
27
- const elExtensionElements = ref ()
61
+ // 审批人与提交人为同一人时
28
62
const assignStartUserHandlerTypeEl = ref ()
29
63
const assignStartUserHandlerType = ref ()
64
+
65
+ // 审批人拒绝时
66
+ const rejectHandlerTypeEl = ref ()
67
+ const rejectHandlerType = ref ()
68
+ const returnNodeIdEl = ref ()
69
+ const returnNodeId = ref ()
70
+ const returnTaskList = ref ([])
71
+
72
+ const elExtensionElements = ref ()
30
73
const otherExtensions = ref ()
31
74
const bpmnElement = ref ()
32
75
const bpmnInstances = () => (window as any )?.bpmnInstances
33
76
34
- const resetAttributesList = () => {
77
+ const resetCustomConfigList = () => {
35
78
bpmnElement .value = bpmnInstances ().bpmnElement
36
79
80
+ // 获取可回退的列表
81
+ returnTaskList .value = findAllPredecessorsExcludingStart (
82
+ bpmnElement .value .id ,
83
+ bpmnInstances ().modeler
84
+ )
85
+
37
86
// 获取元素扩展属性 或者 创建扩展属性
38
87
elExtensionElements .value =
39
88
bpmnElement .value .businessObject ?.extensionElements ??
40
89
bpmnInstances ().moddle .create (' bpmn:ExtensionElements' , { values: [] })
41
90
91
+ // 审批人与提交人为同一人时
42
92
assignStartUserHandlerTypeEl .value =
43
93
elExtensionElements .value .values ?.filter (
44
94
(ex ) => ex .$type === ` ${prefix }:AssignStartUserHandlerType `
45
95
)?.[0 ] || bpmnInstances ().moddle .create (` ${prefix }:AssignStartUserHandlerType ` , { value: 1 })
46
96
assignStartUserHandlerType .value = assignStartUserHandlerTypeEl .value .value
47
97
98
+ // 审批人拒绝时
99
+ rejectHandlerTypeEl .value =
100
+ elExtensionElements .value .values ?.filter (
101
+ (ex ) => ex .$type === ` ${prefix }:RejectHandlerType `
102
+ )?.[0 ] || bpmnInstances ().moddle .create (` ${prefix }:RejectHandlerType ` , { value: 1 })
103
+ rejectHandlerType .value = rejectHandlerTypeEl .value .value
104
+ returnNodeIdEl .value =
105
+ elExtensionElements .value .values ?.filter (
106
+ (ex ) => ex .$type === ` ${prefix }:RejectReturnTaskId `
107
+ )?.[0 ] || bpmnInstances ().moddle .create (` ${prefix }:RejectReturnTaskId ` , { value: ' ' })
108
+ returnNodeId .value = returnNodeIdEl .value .value
109
+
48
110
// 保留剩余扩展元素,便于后面更新该元素对应属性
49
111
otherExtensions .value =
50
112
elExtensionElements .value .values ?.filter (
51
- (ex ) => ex .$type !== ` ${prefix }:AssignStartUserHandlerType `
113
+ (ex ) =>
114
+ ex .$type !== ` ${prefix }:AssignStartUserHandlerType ` &&
115
+ ex .$type !== ` ${prefix }:RejectHandlerType ` &&
116
+ ex .$type !== ` ${prefix }:RejectReturnTaskId `
52
117
) ?? []
53
118
54
119
// 更新元素扩展属性,避免后续报错
@@ -61,9 +126,29 @@ const updateAssignStartUserHandlerType = () => {
61
126
updateElementExtensions ()
62
127
}
63
128
129
+ const updateRejectHandlerType = () => {
130
+ rejectHandlerTypeEl .value .value = rejectHandlerType .value
131
+
132
+ returnNodeId .value = returnTaskList .value [0 ].id
133
+ returnNodeIdEl .value .value = returnNodeId .value
134
+
135
+ updateElementExtensions ()
136
+ }
137
+
138
+ const updateReturnNodeId = () => {
139
+ returnNodeIdEl .value .value = returnNodeId .value
140
+
141
+ updateElementExtensions ()
142
+ }
143
+
64
144
const updateElementExtensions = () => {
65
145
const extensions = bpmnInstances ().moddle .create (' bpmn:ExtensionElements' , {
66
- values: otherExtensions .value .concat ([assignStartUserHandlerTypeEl .value ])
146
+ values: [
147
+ ... otherExtensions .value ,
148
+ assignStartUserHandlerTypeEl .value ,
149
+ rejectHandlerTypeEl .value ,
150
+ returnNodeIdEl .value ,
151
+ ]
67
152
})
68
153
bpmnInstances ().modeling .updateProperties (toRaw (bpmnElement .value ), {
69
154
extensionElements: extensions
@@ -76,9 +161,43 @@ watch(
76
161
val &&
77
162
val .length &&
78
163
nextTick (() => {
79
- resetAttributesList ()
164
+ resetCustomConfigList ()
80
165
})
81
166
},
82
167
{ immediate: true }
83
168
)
169
+
170
+ function findAllPredecessorsExcludingStart(elementId , modeler ) {
171
+ const elementRegistry = modeler .get (' elementRegistry' )
172
+ const allConnections = elementRegistry .filter ((element ) => element .type === ' bpmn:SequenceFlow' )
173
+ const predecessors = new Set () // 使用 Set 来避免重复节点
174
+
175
+ // 检查是否是开始事件节点
176
+ function isStartEvent(element ) {
177
+ return element .type === ' bpmn:StartEvent'
178
+ }
179
+
180
+ function findPredecessorsRecursively(element ) {
181
+ // 获取与当前节点相连的所有连接
182
+ const incomingConnections = allConnections .filter ((connection ) => connection .target === element )
183
+
184
+ incomingConnections .forEach ((connection ) => {
185
+ const source = connection .source // 获取前置节点
186
+
187
+ // 只添加不是开始事件的前置节点
188
+ if (! isStartEvent (source )) {
189
+ predecessors .add (source .businessObject )
190
+ // 递归查找前置节点
191
+ findPredecessorsRecursively (source )
192
+ }
193
+ })
194
+ }
195
+
196
+ const targetElement = elementRegistry .get (elementId )
197
+ if (targetElement ) {
198
+ findPredecessorsRecursively (targetElement )
199
+ }
200
+
201
+ return Array .from (predecessors ) // 返回前置节点数组
202
+ }
84
203
</script >
0 commit comments