Skip to content

Commit 7218e71

Browse files
committed
BPM:增加任务监听器、执行监听器的管理
1 parent faf4557 commit 7218e71

File tree

6 files changed

+214
-21
lines changed

6 files changed

+214
-21
lines changed

src/components/bpmnProcessDesigner/package/penal/base/ElementBaseInfo.vue

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -139,25 +139,17 @@ const updateBaseInfo = (key) => {
139139
}
140140
}
141141
142-
onMounted(() => {
143-
// 针对上传的 bpmn 流程图时,需要延迟 1 毫秒的时间,保证 key 和 name 的更新
144-
setTimeout(() => {
145-
handleKeyUpdate(props.model.key)
146-
handleNameUpdate(props.model.name)
147-
}, 1)
148-
})
149-
150-
// watch(
151-
// () => props.businessObject,
152-
// (val) => {
153-
// // console.log(val, 'val11111111111111111111')
154-
// if (val) {
155-
// // nextTick(() => {
156-
// resetBaseInfo()
157-
// // })
158-
// }
159-
// }
160-
// )
142+
watch(
143+
() => props.businessObject,
144+
(val) => {
145+
// console.log(val, 'val11111111111111111111')
146+
if (val) {
147+
// nextTick(() => {
148+
resetBaseInfo()
149+
// })
150+
}
151+
}
152+
)
161153
162154
watch(
163155
() => props.model?.key,

src/components/bpmnProcessDesigner/package/penal/listeners/ElementListeners.vue

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,16 @@
2626
type="primary"
2727
preIcon="ep:plus"
2828
title="添加监听器"
29+
size="small"
2930
@click="openListenerForm(null)"
3031
/>
32+
<XButton
33+
type="success"
34+
preIcon="ep:select"
35+
title="选择监听器"
36+
size="small"
37+
@click="openProcessListenerDialog"
38+
/>
3139
</div>
3240

3341
<!-- 监听器 编辑/创建 部分 -->
@@ -240,11 +248,21 @@
240248
</template>
241249
</el-dialog>
242250
</div>
251+
252+
<!-- 选择弹窗 -->
253+
<ProcessListenerDialog ref="processListenerDialogRef" @select="selectListener" />
243254
</template>
244255
<script lang="ts" setup>
245256
import { ElMessageBox } from 'element-plus'
246257
import { createListenerObject, updateElementExtensions } from '../../utils'
247-
import { initListenerType, initListenerForm, listenerType, fieldType } from './utilSelf'
258+
import {
259+
initListenerType,
260+
initListenerForm,
261+
listenerType,
262+
fieldType,
263+
initListenerForm2
264+
} from './utilSelf'
265+
import ProcessListenerDialog from './ProcessListenerDialog.vue'
248266
249267
defineOptions({ name: 'ElementListeners' })
250268
@@ -284,6 +302,7 @@ const resetListenersList = () => {
284302
}
285303
// 打开 监听器详情 侧边栏
286304
const openListenerForm = (listener, index?) => {
305+
// debugger
287306
if (listener) {
288307
listenerForm.value = initListenerForm(listener)
289308
editingListenerIndex.value = index
@@ -321,6 +340,7 @@ const openListenerFieldForm = (field, index?) => {
321340
}
322341
// 保存监听器注入字段
323342
const saveListenerFiled = async () => {
343+
// debugger
324344
let validateStatus = await listenerFieldFormRef.value.validate()
325345
if (!validateStatus) return // 验证不通过直接返回
326346
if (editingListenerFieldIndex.value === -1) {
@@ -337,6 +357,7 @@ const saveListenerFiled = async () => {
337357
}
338358
// 移除监听器字段
339359
const removeListenerField = (index) => {
360+
// debugger
340361
ElMessageBox.confirm('确认移除该字段吗?', '提示', {
341362
confirmButtonText: '确 认',
342363
cancelButtonText: '取 消'
@@ -349,6 +370,7 @@ const removeListenerField = (index) => {
349370
}
350371
// 移除监听器
351372
const removeListener = (index) => {
373+
debugger
352374
ElMessageBox.confirm('确认移除该监听器吗?', '提示', {
353375
confirmButtonText: '确 认',
354376
cancelButtonText: '取 消'
@@ -365,6 +387,7 @@ const removeListener = (index) => {
365387
}
366388
// 保存监听器配置
367389
const saveListenerConfig = async () => {
390+
// debugger
368391
let validateStatus = await listenerFormRef.value.validate()
369392
if (!validateStatus) return // 验证不通过直接返回
370393
const listenerObject = createListenerObject(listenerForm.value, false, prefix)
@@ -389,6 +412,28 @@ const saveListenerConfig = async () => {
389412
listenerForm.value = {}
390413
}
391414
415+
// 打开监听器弹窗
416+
const processListenerDialogRef = ref()
417+
const openProcessListenerDialog = async () => {
418+
processListenerDialogRef.value.open('execution')
419+
}
420+
const selectListener = (listener) => {
421+
const listenerForm = initListenerForm2(listener)
422+
const listenerObject = createListenerObject(listenerForm, false, prefix)
423+
bpmnElementListeners.value.push(listenerObject)
424+
elementListenersList.value.push(listenerForm)
425+
426+
// 保存其他配置
427+
otherExtensionList.value =
428+
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
429+
(ex) => ex.$type !== `${prefix}:ExecutionListener`
430+
) ?? []
431+
updateElementExtensions(
432+
bpmnElement.value,
433+
otherExtensionList.value.concat(bpmnElementListeners.value)
434+
)
435+
}
436+
392437
watch(
393438
() => props.id,
394439
(val) => {
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
<!-- 执行器选择 -->
2+
<template>
3+
<Dialog title="请选择监听器" v-model="dialogVisible" width="1024px">
4+
<ContentWrap>
5+
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
6+
<el-table-column label="名字" align="center" prop="name" />
7+
<el-table-column label="类型" align="center" prop="type">
8+
<template #default="scope">
9+
<dict-tag :type="DICT_TYPE.BPM_PROCESS_LISTENER_TYPE" :value="scope.row.type" />
10+
</template>
11+
</el-table-column>
12+
<el-table-column label="状态" align="center" prop="status">
13+
<template #default="scope">
14+
<dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" />
15+
</template>
16+
</el-table-column>
17+
<el-table-column label="事件" align="center" prop="event" />
18+
<el-table-column label="值类型" align="center" prop="valueType">
19+
<template #default="scope">
20+
<dict-tag
21+
:type="DICT_TYPE.BPM_PROCESS_LISTENER_VALUE_TYPE"
22+
:value="scope.row.valueType"
23+
/>
24+
</template>
25+
</el-table-column>
26+
<el-table-column label="" align="center" prop="value" />
27+
<el-table-column label="操作" align="center">
28+
<template #default="scope">
29+
<el-button link type="primary" @click="select(scope.row)"> 选择 </el-button>
30+
</template>
31+
</el-table-column>
32+
</el-table>
33+
<!-- 分页 -->
34+
<Pagination
35+
:total="total"
36+
v-model:page="queryParams.pageNo"
37+
v-model:limit="queryParams.pageSize"
38+
@pagination="getList"
39+
/>
40+
</ContentWrap>
41+
</Dialog>
42+
</template>
43+
<script setup lang="ts">
44+
import { ProcessListenerApi, ProcessListenerVO } from '@/api/bpm/processListener'
45+
import { DICT_TYPE } from '@/utils/dict'
46+
import { CommonStatusEnum } from '@/utils/constants'
47+
48+
/** BPM 流程 表单 */
49+
defineOptions({ name: 'ProcessListenerDialog' })
50+
51+
const { t } = useI18n() // 国际化
52+
const message = useMessage() // 消息弹窗
53+
54+
const dialogVisible = ref(false) // 弹窗的是否展示
55+
const loading = ref(true) // 列表的加载中
56+
const list = ref<ProcessListenerVO[]>([]) // 列表的数据
57+
const total = ref(0) // 列表的总页数
58+
const queryParams = reactive({
59+
pageNo: 1,
60+
pageSize: 10,
61+
type: undefined,
62+
status: CommonStatusEnum.ENABLE
63+
})
64+
65+
/** 打开弹窗 */
66+
const open = async (type: string) => {
67+
dialogVisible.value = true
68+
loading.value = true
69+
try {
70+
queryParams.pageNo = 1
71+
queryParams.type = type
72+
const data = await ProcessListenerApi.getProcessListenerPage(queryParams)
73+
list.value = data.list
74+
total.value = data.total
75+
} finally {
76+
loading.value = false
77+
}
78+
}
79+
defineExpose({ open }) // 提供 open 方法,用于打开弹窗
80+
81+
/** 提交表单 */
82+
const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
83+
const select = async (row) => {
84+
dialogVisible.value = false
85+
// 发送操作成功的事件
86+
emit('select', row)
87+
}
88+
</script>

src/components/bpmnProcessDesigner/package/penal/listeners/UserTaskListeners.vue

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,13 @@
3939
title="添加监听器"
4040
@click="openListenerForm(null)"
4141
/>
42+
<XButton
43+
type="success"
44+
preIcon="ep:select"
45+
title="选择监听器"
46+
size="small"
47+
@click="openProcessListenerDialog"
48+
/>
4249
</div>
4350

4451
<!-- 监听器 编辑/创建 部分 -->
@@ -286,11 +293,22 @@
286293
</template>
287294
</el-dialog>
288295
</div>
296+
297+
<!-- 选择弹窗 -->
298+
<ProcessListenerDialog ref="processListenerDialogRef" @select="selectListener" />
289299
</template>
290300
<script lang="ts" setup>
291301
import { ElMessageBox } from 'element-plus'
292302
import { createListenerObject, updateElementExtensions } from '../../utils'
293-
import { initListenerForm, initListenerType, eventType, listenerType, fieldType } from './utilSelf'
303+
import {
304+
initListenerForm,
305+
initListenerType,
306+
eventType,
307+
listenerType,
308+
fieldType,
309+
initListenerForm2
310+
} from './utilSelf'
311+
import ProcessListenerDialog from '@/components/bpmnProcessDesigner/package/penal/listeners/ProcessListenerDialog.vue'
294312
295313
defineOptions({ name: 'UserTaskListeners' })
296314
@@ -437,6 +455,28 @@ const removeListenerField = (field, index) => {
437455
.catch(() => console.info('操作取消'))
438456
}
439457
458+
// 打开监听器弹窗
459+
const processListenerDialogRef = ref()
460+
const openProcessListenerDialog = async () => {
461+
processListenerDialogRef.value.open('task')
462+
}
463+
const selectListener = (listener) => {
464+
const listenerForm = initListenerForm2(listener)
465+
const listenerObject = createListenerObject(listenerForm, true, prefix)
466+
bpmnElementListeners.value.push(listenerObject)
467+
elementListenersList.value.push(listenerForm)
468+
469+
// 保存其他配置
470+
otherExtensionList.value =
471+
bpmnElement.value.businessObject?.extensionElements?.values?.filter(
472+
(ex) => ex.$type !== `${prefix}:TaskListener`
473+
) ?? []
474+
updateElementExtensions(
475+
bpmnElement.value,
476+
otherExtensionList.value.concat(bpmnElementListeners.value)
477+
)
478+
}
479+
440480
watch(
441481
() => props.id,
442482
(val) => {

src/components/bpmnProcessDesigner/package/penal/listeners/utilSelf.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,33 @@ export function initListenerType(listener) {
4040
}
4141
}
4242

43+
/** 将 ProcessListenerDO 转换成 initListenerForm 想同的 Form 对象 */
44+
export function initListenerForm2(processListener) {
45+
if (processListener.valueType === 'class') {
46+
return {
47+
listenerType: 'classListener',
48+
class: processListener.value,
49+
event: processListener.event,
50+
fields: []
51+
}
52+
} else if (processListener.valueType === 'expression') {
53+
return {
54+
listenerType: 'expressionListener',
55+
expression: processListener.value,
56+
event: processListener.event,
57+
fields: []
58+
}
59+
} else if (processListener.valueType === 'delegateExpression') {
60+
return {
61+
listenerType: 'delegateExpressionListener',
62+
delegateExpression: processListener.value,
63+
event: processListener.event,
64+
fields: []
65+
}
66+
}
67+
throw new Error('未知的监听器类型')
68+
}
69+
4370
export const listenerType = {
4471
classListener: 'Java 类',
4572
expressionListener: '表达式',

src/components/bpmnProcessDesigner/package/utils.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { toRaw } from 'vue'
22
const bpmnInstances = () => (window as any)?.bpmnInstances
33
// 创建监听器实例
44
export function createListenerObject(options, isTask, prefix) {
5+
debugger
56
const listenerObj = Object.create(null)
67
listenerObj.event = options.event
78
isTask && (listenerObj.id = options.id) // 任务监听器特有的 id 字段

0 commit comments

Comments
 (0)