Skip to content

Commit 1d4339f

Browse files
committed
feat: bpm设计器适配Simple设计器,审批人拒绝时
1 parent 47f1f13 commit 1d4339f

File tree

3 files changed

+154
-7
lines changed

3 files changed

+154
-7
lines changed

src/components/bpmnProcessDesigner/package/designer/plugins/descriptor/flowableDescriptor.json

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,34 @@
12251225
"isBody": true
12261226
}
12271227
]
1228+
},
1229+
{
1230+
"name": "RejectHandlerType",
1231+
"superClass": ["Element"],
1232+
"meta": {
1233+
"allowedIn": ["bpmn:UserTask"]
1234+
},
1235+
"properties": [
1236+
{
1237+
"name": "value",
1238+
"type": "Integer",
1239+
"isBody": true
1240+
}
1241+
]
1242+
},
1243+
{
1244+
"name": "RejectReturnTaskId",
1245+
"superClass": ["Element"],
1246+
"meta": {
1247+
"allowedIn": ["bpmn:UserTask"]
1248+
},
1249+
"properties": [
1250+
{
1251+
"name": "value",
1252+
"type": "String",
1253+
"isBody": true
1254+
}
1255+
]
12281256
}
12291257
],
12301258
"emumerations": []

src/components/bpmnProcessDesigner/package/penal/PropertiesPanel.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div class="process-panel__container" :style="{ width: `${width}px` }">
2+
<div class="process-panel__container" :style="{ width: `${width}px`,maxHeight: '700px' }">
33
<el-collapse v-model="activeTab">
44
<el-collapse-item name="base">
55
<!-- class="panel-tab__title" -->

src/components/bpmnProcessDesigner/package/penal/custom-config/ElementCustomConfig.vue

Lines changed: 125 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,38 @@
11
<!-- UserTask 自定义配置:
22
1. 审批人与提交人为同一人时
3+
2. 审批人拒绝时
34
-->
45
<template>
56
<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+
636
<el-divider content-position="left">审批人与提交人为同一人时</el-divider>
737
<el-radio-group v-model="assignStartUserHandlerType" @change="updateAssignStartUserHandlerType">
838
<div class="flex-col">
@@ -15,7 +45,11 @@
1545
</template>
1646

1747
<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'
1953
2054
defineOptions({ name: 'ElementCustomConfig' })
2155
const props = defineProps({
@@ -24,31 +58,62 @@ const props = defineProps({
2458
})
2559
const prefix = inject('prefix')
2660
27-
const elExtensionElements = ref()
61+
// 审批人与提交人为同一人时
2862
const assignStartUserHandlerTypeEl = ref()
2963
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()
3073
const otherExtensions = ref()
3174
const bpmnElement = ref()
3275
const bpmnInstances = () => (window as any)?.bpmnInstances
3376
34-
const resetAttributesList = () => {
77+
const resetCustomConfigList = () => {
3578
bpmnElement.value = bpmnInstances().bpmnElement
3679
80+
// 获取可回退的列表
81+
returnTaskList.value = findAllPredecessorsExcludingStart(
82+
bpmnElement.value.id,
83+
bpmnInstances().modeler
84+
)
85+
3786
// 获取元素扩展属性 或者 创建扩展属性
3887
elExtensionElements.value =
3988
bpmnElement.value.businessObject?.extensionElements ??
4089
bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
4190
91+
// 审批人与提交人为同一人时
4292
assignStartUserHandlerTypeEl.value =
4393
elExtensionElements.value.values?.filter(
4494
(ex) => ex.$type === `${prefix}:AssignStartUserHandlerType`
4595
)?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, { value: 1 })
4696
assignStartUserHandlerType.value = assignStartUserHandlerTypeEl.value.value
4797
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+
48110
// 保留剩余扩展元素,便于后面更新该元素对应属性
49111
otherExtensions.value =
50112
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`
52117
) ?? []
53118
54119
// 更新元素扩展属性,避免后续报错
@@ -61,9 +126,29 @@ const updateAssignStartUserHandlerType = () => {
61126
updateElementExtensions()
62127
}
63128
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+
64144
const updateElementExtensions = () => {
65145
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+
]
67152
})
68153
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
69154
extensionElements: extensions
@@ -76,9 +161,43 @@ watch(
76161
val &&
77162
val.length &&
78163
nextTick(() => {
79-
resetAttributesList()
164+
resetCustomConfigList()
80165
})
81166
},
82167
{ immediate: true }
83168
)
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+
}
84203
</script>

0 commit comments

Comments
 (0)