Skip to content

Commit 7b4b5eb

Browse files
YunaiVgitee-org
authored andcommitted
!594 bpm设计器适配Simple设计器
Merge pull request !594 from Lesan/feature/bpm
2 parents 4423c5f + 00a19cf commit 7b4b5eb

File tree

3 files changed

+262
-7
lines changed

3 files changed

+262
-7
lines changed

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

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,62 @@
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+
]
1256+
},
1257+
{
1258+
"name": "AssignEmptyHandlerType",
1259+
"superClass": ["Element"],
1260+
"meta": {
1261+
"allowedIn": ["bpmn:UserTask"]
1262+
},
1263+
"properties": [
1264+
{
1265+
"name": "value",
1266+
"type": "Integer",
1267+
"isBody": true
1268+
}
1269+
]
1270+
},
1271+
{
1272+
"name": "AssignEmptyUserIds",
1273+
"superClass": ["Element"],
1274+
"meta": {
1275+
"allowedIn": ["bpmn:UserTask"]
1276+
},
1277+
"properties": [
1278+
{
1279+
"name": "value",
1280+
"type": "String",
1281+
"isBody": true
1282+
}
1283+
]
12281284
}
12291285
],
12301286
"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: 205 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,71 @@
11
<!-- UserTask 自定义配置:
22
1. 审批人与提交人为同一人时
3+
2. 审批人拒绝时
4+
3. 审批人为空时
35
-->
46
<template>
57
<div class="panel-tab__content">
8+
<el-divider content-position="left">审批人拒绝时</el-divider>
9+
<el-form-item prop="rejectHandlerType">
10+
<el-radio-group
11+
v-model="rejectHandlerType"
12+
:disabled="returnTaskList.length === 0"
13+
@change="updateRejectHandlerType"
14+
>
15+
<div class="flex-col">
16+
<div v-for="(item, index) in REJECT_HANDLER_TYPES" :key="index">
17+
<el-radio :key="item.value" :value="item.value" :label="item.label" />
18+
</div>
19+
</div>
20+
</el-radio-group>
21+
</el-form-item>
22+
<el-form-item
23+
v-if="rejectHandlerType == RejectHandlerType.RETURN_USER_TASK"
24+
label="驳回节点"
25+
prop="returnNodeId"
26+
>
27+
<el-select v-model="returnNodeId" clearable style="width: 100%" @change="updateReturnNodeId">
28+
<el-option
29+
v-for="item in returnTaskList"
30+
:key="item.id"
31+
:label="item.name"
32+
:value="item.id"
33+
/>
34+
</el-select>
35+
</el-form-item>
36+
37+
<el-divider content-position="left">审批人为空时</el-divider>
38+
<el-form-item prop="assignEmptyHandlerType">
39+
<el-radio-group v-model="assignEmptyHandlerType" @change="updateAssignEmptyHandlerType">
40+
<div class="flex-col">
41+
<div v-for="(item, index) in ASSIGN_EMPTY_HANDLER_TYPES" :key="index">
42+
<el-radio :key="item.value" :value="item.value" :label="item.label" />
43+
</div>
44+
</div>
45+
</el-radio-group>
46+
</el-form-item>
47+
<el-form-item
48+
v-if="assignEmptyHandlerType == AssignEmptyHandlerType.ASSIGN_USER"
49+
label="指定用户"
50+
prop="assignEmptyHandlerUserIds"
51+
span="24"
52+
>
53+
<el-select
54+
v-model="assignEmptyUserIds"
55+
clearable
56+
multiple
57+
style="width: 100%"
58+
@change="updateAssignEmptyUserIds"
59+
>
60+
<el-option
61+
v-for="item in userOptions"
62+
:key="item.id"
63+
:label="item.nickname"
64+
:value="item.id"
65+
/>
66+
</el-select>
67+
</el-form-item>
68+
669
<el-divider content-position="left">审批人与提交人为同一人时</el-divider>
770
<el-radio-group v-model="assignStartUserHandlerType" @change="updateAssignStartUserHandlerType">
871
<div class="flex-col">
@@ -15,7 +78,14 @@
1578
</template>
1679

1780
<script lang="ts" setup>
18-
import { ASSIGN_START_USER_HANDLER_TYPES } from '@/components/SimpleProcessDesignerV2/src/consts'
81+
import {
82+
ASSIGN_START_USER_HANDLER_TYPES,
83+
RejectHandlerType,
84+
REJECT_HANDLER_TYPES,
85+
ASSIGN_EMPTY_HANDLER_TYPES,
86+
AssignEmptyHandlerType
87+
} from '@/components/SimpleProcessDesignerV2/src/consts'
88+
import * as UserApi from '@/api/system/user'
1989
2090
defineOptions({ name: 'ElementCustomConfig' })
2191
const props = defineProps({
@@ -24,31 +94,86 @@ const props = defineProps({
2494
})
2595
const prefix = inject('prefix')
2696
27-
const elExtensionElements = ref()
97+
// 审批人与提交人为同一人时
2898
const assignStartUserHandlerTypeEl = ref()
2999
const assignStartUserHandlerType = ref()
100+
101+
// 审批人拒绝时
102+
const rejectHandlerTypeEl = ref()
103+
const rejectHandlerType = ref()
104+
const returnNodeIdEl = ref()
105+
const returnNodeId = ref()
106+
const returnTaskList = ref([])
107+
108+
// 审批人为空时
109+
const assignEmptyHandlerTypeEl = ref()
110+
const assignEmptyHandlerType = ref()
111+
const assignEmptyUserIdsEl = ref()
112+
const assignEmptyUserIds = ref()
113+
114+
const elExtensionElements = ref()
30115
const otherExtensions = ref()
31116
const bpmnElement = ref()
32117
const bpmnInstances = () => (window as any)?.bpmnInstances
33118
34-
const resetAttributesList = () => {
119+
const resetCustomConfigList = () => {
35120
bpmnElement.value = bpmnInstances().bpmnElement
36121
122+
// 获取可回退的列表
123+
returnTaskList.value = findAllPredecessorsExcludingStart(
124+
bpmnElement.value.id,
125+
bpmnInstances().modeler
126+
)
127+
37128
// 获取元素扩展属性 或者 创建扩展属性
38129
elExtensionElements.value =
39130
bpmnElement.value.businessObject?.extensionElements ??
40131
bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [] })
41132
133+
// 审批人与提交人为同一人时
42134
assignStartUserHandlerTypeEl.value =
43135
elExtensionElements.value.values?.filter(
44136
(ex) => ex.$type === `${prefix}:AssignStartUserHandlerType`
45137
)?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignStartUserHandlerType`, { value: 1 })
46138
assignStartUserHandlerType.value = assignStartUserHandlerTypeEl.value.value
47139
140+
// 审批人拒绝时
141+
rejectHandlerTypeEl.value =
142+
elExtensionElements.value.values?.filter(
143+
(ex) => ex.$type === `${prefix}:RejectHandlerType`
144+
)?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectHandlerType`, { value: 1 })
145+
rejectHandlerType.value = rejectHandlerTypeEl.value.value
146+
returnNodeIdEl.value =
147+
elExtensionElements.value.values?.filter(
148+
(ex) => ex.$type === `${prefix}:RejectReturnTaskId`
149+
)?.[0] || bpmnInstances().moddle.create(`${prefix}:RejectReturnTaskId`, { value: '' })
150+
returnNodeId.value = returnNodeIdEl.value.value
151+
152+
// 审批人为空时
153+
assignEmptyHandlerTypeEl.value =
154+
elExtensionElements.value.values?.filter(
155+
(ex) => ex.$type === `${prefix}:AssignEmptyHandlerType`
156+
)?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyHandlerType`, { value: 1 })
157+
assignEmptyHandlerType.value = assignEmptyHandlerTypeEl.value.value
158+
assignEmptyUserIdsEl.value =
159+
elExtensionElements.value.values?.filter(
160+
(ex) => ex.$type === `${prefix}:AssignEmptyUserIds`
161+
)?.[0] || bpmnInstances().moddle.create(`${prefix}:AssignEmptyUserIds`, { value: '' })
162+
assignEmptyUserIds.value = assignEmptyUserIdsEl.value.value.split(',').map((item) => {
163+
// 如果数字超出了最大安全整数范围,则将其作为字符串处理
164+
let num = Number(item)
165+
return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER ? item : num
166+
})
167+
48168
// 保留剩余扩展元素,便于后面更新该元素对应属性
49169
otherExtensions.value =
50170
elExtensionElements.value.values?.filter(
51-
(ex) => ex.$type !== `${prefix}:AssignStartUserHandlerType`
171+
(ex) =>
172+
ex.$type !== `${prefix}:AssignStartUserHandlerType` &&
173+
ex.$type !== `${prefix}:RejectHandlerType` &&
174+
ex.$type !== `${prefix}:RejectReturnTaskId` &&
175+
ex.$type !== `${prefix}:AssignEmptyHandlerType` &&
176+
ex.$type !== `${prefix}:AssignEmptyUserIds`
52177
) ?? []
53178
54179
// 更新元素扩展属性,避免后续报错
@@ -61,9 +186,43 @@ const updateAssignStartUserHandlerType = () => {
61186
updateElementExtensions()
62187
}
63188
189+
const updateRejectHandlerType = () => {
190+
rejectHandlerTypeEl.value.value = rejectHandlerType.value
191+
192+
returnNodeId.value = returnTaskList.value[0].id
193+
returnNodeIdEl.value.value = returnNodeId.value
194+
195+
updateElementExtensions()
196+
}
197+
198+
const updateReturnNodeId = () => {
199+
returnNodeIdEl.value.value = returnNodeId.value
200+
201+
updateElementExtensions()
202+
}
203+
204+
const updateAssignEmptyHandlerType = () => {
205+
assignEmptyHandlerTypeEl.value.value = assignEmptyHandlerType.value
206+
207+
updateElementExtensions()
208+
}
209+
210+
const updateAssignEmptyUserIds = () => {
211+
assignEmptyUserIdsEl.value.value = assignEmptyUserIds.value.toString()
212+
213+
updateElementExtensions()
214+
}
215+
64216
const updateElementExtensions = () => {
65217
const extensions = bpmnInstances().moddle.create('bpmn:ExtensionElements', {
66-
values: otherExtensions.value.concat([assignStartUserHandlerTypeEl.value])
218+
values: [
219+
...otherExtensions.value,
220+
assignStartUserHandlerTypeEl.value,
221+
rejectHandlerTypeEl.value,
222+
returnNodeIdEl.value,
223+
assignEmptyHandlerTypeEl.value,
224+
assignEmptyUserIdsEl.value
225+
]
67226
})
68227
bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), {
69228
extensionElements: extensions
@@ -76,9 +235,49 @@ watch(
76235
val &&
77236
val.length &&
78237
nextTick(() => {
79-
resetAttributesList()
238+
resetCustomConfigList()
80239
})
81240
},
82241
{ immediate: true }
83242
)
243+
244+
function findAllPredecessorsExcludingStart(elementId, modeler) {
245+
const elementRegistry = modeler.get('elementRegistry')
246+
const allConnections = elementRegistry.filter((element) => element.type === 'bpmn:SequenceFlow')
247+
const predecessors = new Set() // 使用 Set 来避免重复节点
248+
249+
// 检查是否是开始事件节点
250+
function isStartEvent(element) {
251+
return element.type === 'bpmn:StartEvent'
252+
}
253+
254+
function findPredecessorsRecursively(element) {
255+
// 获取与当前节点相连的所有连接
256+
const incomingConnections = allConnections.filter((connection) => connection.target === element)
257+
258+
incomingConnections.forEach((connection) => {
259+
const source = connection.source // 获取前置节点
260+
261+
// 只添加不是开始事件的前置节点
262+
if (!isStartEvent(source)) {
263+
predecessors.add(source.businessObject)
264+
// 递归查找前置节点
265+
findPredecessorsRecursively(source)
266+
}
267+
})
268+
}
269+
270+
const targetElement = elementRegistry.get(elementId)
271+
if (targetElement) {
272+
findPredecessorsRecursively(targetElement)
273+
}
274+
275+
return Array.from(predecessors) // 返回前置节点数组
276+
}
277+
278+
const userOptions = ref<UserApi.UserVO[]>([]) // 用户列表
279+
onMounted(async () => {
280+
// 获得用户列表
281+
userOptions.value = await UserApi.getSimpleUserList()
282+
})
84283
</script>

0 commit comments

Comments
 (0)