update 监听器添加远程服务代理选项

This commit is contained in:
ZETA 2024-05-31 10:43:04 +08:00
parent c2fdbc66b2
commit bd2d9ed1b6
5 changed files with 394 additions and 315 deletions

View File

@ -1020,6 +1020,11 @@ export default {
'isAttr': true,
'type': 'String'
},
{
'name': 'alias',
'isAttr': true,
'type': 'String'
},
{
'name': 'event',
'isAttr': true,
@ -1058,6 +1063,11 @@ export default {
'isAttr': true,
'type': 'String'
},
{
'name': 'alias',
'isAttr': true,
'type': 'String'
},
{
'name': 'event',
'isAttr': true,
@ -1247,4 +1257,4 @@ export default {
}
],
'emumerations': []
};
}

View File

@ -1,29 +1,29 @@
import showConfig from '../assets/showConfig';
import type { ModdleElement } from 'bpmn';
import useModelerStore from '@/store/modules/modeler';
import { MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums';
import showConfig from '../assets/showConfig'
import type { ModdleElement } from 'bpmn'
import useModelerStore from '@/store/modules/modeler'
import { MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums'
interface Options {
element: ModdleElement;
element: ModdleElement
}
export default (ops: Options) => {
const { element } = ops;
const { getModeling, getModdle } = useModelerStore();
const modeling = getModeling();
const moddle = getModdle();
const { element } = ops
const { getModeling, getModdle } = useModelerStore()
const modeling = getModeling()
const moddle = getModdle()
/**
*
*/
const elementType = computed(() => {
const bizObj = element.businessObject;
return bizObj.eventDefinitions ? bizObj.eventDefinitions[0].$type : bizObj.$type;
});
const bizObj = element.businessObject
return bizObj.eventDefinitions ? bizObj.eventDefinitions[0].$type : bizObj.$type
})
/**
*
*/
const config = computed(() => showConfig[elementType.value] || {});
const config = computed(() => showConfig[elementType.value] || {})
/**
*
@ -32,22 +32,22 @@ export default (ops: Options) => {
* @param parent
*/
const createModdleElement = (elementType: string, properties: any, parent: ModdleElement) => {
const element = moddle.create(elementType, properties);
parent && (element.$parent = parent);
return element;
};
const element = moddle.create(elementType, properties)
parent && (element.$parent = parent)
return element
}
/**
*
*/
const getExtensionElements = (create = true) => {
let extensionElements = element.businessObject.get<ModdleElement>('extensionElements');
let extensionElements = element.businessObject.get<ModdleElement>('extensionElements')
if (!extensionElements && create) {
extensionElements = createModdleElement('bpmn:ExtensionElements', { values: [] }, element.businessObject);
modeling.updateModdleProperties(element, element.businessObject, { extensionElements });
extensionElements = createModdleElement('bpmn:ExtensionElements', { values: [] }, element.businessObject)
modeling.updateModdleProperties(element, element.businessObject, { extensionElements })
}
return extensionElements;
};
return extensionElements
}
/**
* extensionElements下的properties
@ -55,25 +55,26 @@ export default (ops: Options) => {
*/
const getPropertiesElements = (extensionElements?: ModdleElement) => {
if (!extensionElements) {
extensionElements = getExtensionElements();
extensionElements = getExtensionElements()
}
let propertiesElements = extensionElements.values.find((item) => item.$type === 'flowable:properties');
let propertiesElements = extensionElements.values.find((item) => item.$type === 'flowable:properties')
if (!propertiesElements) {
propertiesElements = createModdleElement('flowable:properties', { values: [] }, extensionElements);
propertiesElements = createModdleElement('flowable:properties', { values: [] }, extensionElements)
modeling.updateModdleProperties(element, extensionElements, {
values: [...extensionElements.get<[]>('values'), propertiesElements]
});
})
}
return propertiesElements;
};
return propertiesElements
}
/**
*
* @param properties
*/
const updateProperties = (properties: any) => {
modeling.updateProperties(element, properties);
};
console.log(properties)
modeling.updateProperties(element, properties)
}
/**
*
@ -81,8 +82,8 @@ export default (ops: Options) => {
* @param properties
*/
const updateModdleProperties = (updateElement, properties: any) => {
modeling.updateModdleProperties(element, updateElement, properties);
};
modeling.updateModdleProperties(element, updateElement, properties)
}
/**
* Property属性
@ -90,41 +91,41 @@ export default (ops: Options) => {
* @param value
*/
const updateProperty = (name: string, value: string) => {
const propertiesElements = getPropertiesElements();
const propertiesElements = getPropertiesElements()
let propertyElements = propertiesElements.values.find((item) => item.name === name);
let propertyElements = propertiesElements.values.find((item) => item.name === name)
if (!propertyElements) {
propertyElements = createModdleElement('flowable:property', { name: name, value: value }, propertiesElements);
propertyElements = createModdleElement('flowable:property', { name: name, value: value }, propertiesElements)
modeling.updateModdleProperties(element, propertiesElements, {
values: [...propertiesElements.get('values'), propertyElements]
});
})
} else {
propertyElements.name = name;
propertyElements.value = value;
propertyElements.name = name
propertyElements.value = value
}
return propertyElements;
};
return propertyElements
}
const idChange = (newVal: string) => {
if (newVal) {
updateProperties({ id: newVal });
updateProperties({ id: newVal })
}
};
}
const nameChange = (newVal: string) => {
if (newVal) {
updateProperties({ name: newVal });
updateProperties({ name: newVal })
}
};
}
const formKeyChange = (newVal: string) => {
updateProperties({ formKey: newVal });
};
updateProperties({ formKey: newVal })
}
const constant = {
MultiInstanceType: [
{ id: '373d4b81-a0d1-4eb8-8685-0d2fb1b468e2', label: '无', value: MultiInstanceTypeEnum.NONE },
{ id: 'b5acea7c-b7e5-46b0-8778-390db091bdab', label: '串行', value: MultiInstanceTypeEnum.SERIAL },
{ id: 'b4f0c683-1ccc-43c4-8380-e1b998986caf', label: '并行', value: MultiInstanceTypeEnum.PARALLEL }
]
};
}
return {
elementType,
@ -141,5 +142,5 @@ export default (ops: Options) => {
formKeyChange,
getExtensionElements,
getPropertiesElements
};
};
}
}

View File

@ -42,7 +42,7 @@
:show-close="false"
append-to-body
>
<el-form ref="formRef" :model="formData" :rules="tableRules" label-width="100px">
<el-form ref="formRef" :model="formData" :rules="tableRules" label-width="120px">
<el-form-item label="事件" prop="event">
<el-select v-model="formData.event">
<el-option v-for="item in eventSelect" :key="item.id" :value="item.value" :label="item.label"></el-option>
@ -62,7 +62,7 @@
</el-tooltip>
</span>
</template>
<el-select v-model="formData.type">
<el-select v-model="formData.type" @change="handleChangeType">
<el-option v-for="item in typeSelect" :key="item.id" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
@ -70,7 +70,7 @@
:label="typeSelect.filter((e) => e.value === formData.type)[0] ? typeSelect.filter((e) => e.value === formData.type)[0]?.label : '表达式'"
prop="className"
>
<el-input v-model="formData.className" type="text"></el-input>
<el-input v-model="formData.className" type="text" :disabled="formData.alias? true : false"></el-input>
</el-form-item>
</el-form>
<el-tabs type="border-card">
@ -88,139 +88,164 @@
</div>
</template>
<script setup lang="ts">
import ListenerParam from './ListenerParam.vue';
import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table';
import type { ExecutionListenerVO } from 'bpmnDesign';
import type { Moddle, Modeler, ModdleElement } from 'bpmn';
import ListenerParam from './ListenerParam.vue'
import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table'
import type { ExecutionListenerVO } from 'bpmnDesign'
import type { Moddle, Modeler, ModdleElement } from 'bpmn'
import usePanel from '../../hooks/usePanel';
import useDialog from '@/hooks/useDialog';
import useModelerStore from '@/store/modules/modeler';
import usePanel from '../../hooks/usePanel'
import useDialog from '@/hooks/useDialog'
import useModelerStore from '@/store/modules/modeler'
const emit = defineEmits(['close']);
const emit = defineEmits(['close'])
interface PropType {
element: ModdleElement;
element: ModdleElement
}
const props = withDefaults(defineProps<PropType>(), {});
const props = withDefaults(defineProps<PropType>(), {})
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { proxy } = getCurrentInstance() as ComponentInternalInstance
const selectRow = ref<ExecutionListenerVO | null>();
const selectRow = ref<ExecutionListenerVO | null>()
const formDialog = useDialog({
title: selectRow.value ? '编辑&保存' : '新增&保存'
});
})
const { showConfig, elementType, updateProperties } = usePanel({
element: toRaw(props.element)
});
const { getModdle } = useModelerStore();
const moddle = getModdle();
})
const { getModdle } = useModelerStore()
const moddle = getModdle()
const listenerParamRef = ref<InstanceType<typeof ListenerParam>>();
const tableRef = ref<VxeTableInstance<ExecutionListenerVO>>();
const formRef = ref<ElFormInstance>();
const listenerParamRef = ref<InstanceType<typeof ListenerParam>>()
const tableRef = ref<VxeTableInstance<ExecutionListenerVO>>()
const formRef = ref<ElFormInstance>()
const initData: ExecutionListenerVO = {
event: '',
type: '',
className: '',
params: []
};
const formData = ref<ExecutionListenerVO>({ ...initData });
const tableData = ref<ExecutionListenerVO[]>([]);
}
const formData = ref<ExecutionListenerVO>({ ...initData })
const tableData = ref<ExecutionListenerVO[]>([])
const tableRules = ref<ElFormRules>({
event: [{ required: true, message: '请选择', trigger: 'blur' }],
type: [{ required: true, message: '请选择', trigger: 'blur' }],
className: [{ required: true, message: '请输入', trigger: 'blur' }]
});
})
const submitEvent = async () => {
const error = await listenerParamRef.value.validate();
const error = await listenerParamRef.value.validate()
await formRef.value.validate((validate) => {
if (validate && !error) {
const $table = tableRef.value;
const $table = tableRef.value
if ($table) {
formData.value.params = listenerParamRef.value.getTableData();
formData.value.params = listenerParamRef.value.getTableData()
if (selectRow.value) {
Object.assign(selectRow.value, formData.value);
Object.assign(selectRow.value, formData.value)
} else {
$table.insertAt({ ...formData.value }, -1);
$table.insertAt({ ...formData.value }, -1)
}
updateElement();
formDialog.closeDialog();
updateElement()
formDialog.closeDialog()
}
}
});
};
})
}
const handleChangeType = (v) => {
if (v === 'serviceClass') {
formData.value.className = '${delegatedExecutionListener}'
formData.value.alias = v
formData.value.params = listenerParamRef.value.getTableData()
const index = formData.value.params.findIndex((item) => item.name === 'clazz')
console.log(index, formData.value.params)
if (index === -1) {
formData.value.params.unshift({
name: 'interfaceName',
type: 'stringValue',
value: ''
})
}
} else {
formData.value.alias = ''
}
}
const removeSelectRowEvent = async () => {
const $table = tableRef.value;
const $table = tableRef.value
if ($table) {
const selectCount = $table.getCheckboxRecords().length;
const selectCount = $table.getCheckboxRecords().length
if (selectCount === 0) {
proxy?.$modal.msgWarning('请选择行');
proxy?.$modal.msgWarning('请选择行')
} else {
await $table.removeCheckboxRow();
updateElement();
await $table.removeCheckboxRow()
updateElement()
}
}
};
}
const insertEvent = async () => {
Object.assign(formData.value, initData);
selectRow.value = null;
formDialog.openDialog();
};
formData.value.alias = ''
Object.assign(formData.value, initData)
selectRow.value = null
formDialog.openDialog()
}
const editEvent = (row: ExecutionListenerVO) => {
Object.assign(formData.value, row);
selectRow.value = row;
formDialog.openDialog();
};
Object.assign(formData.value, row)
selectRow.value = row
formDialog.openDialog()
}
const removeEvent = async (row: ExecutionListenerVO) => {
await proxy?.$modal.confirm('您确定要删除该数据?');
const $table = tableRef.value;
await proxy?.$modal.confirm('您确定要删除该数据?')
const $table = tableRef.value
if ($table) {
await $table.remove(row);
updateElement();
await $table.remove(row)
updateElement()
}
};
}
const updateElement = () => {
const $table = tableRef.value;
const data = $table.getTableData().fullData;
const $table = tableRef.value
const data = $table.getTableData().fullData
if (data.length) {
let extensionElements = props.element.businessObject.get('extensionElements');
let extensionElements = props.element.businessObject.get('extensionElements')
if (!extensionElements) {
extensionElements = moddle.create('bpmn:ExtensionElements');
extensionElements = moddle.create('bpmn:ExtensionElements')
}
//
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? [];
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? []
data.forEach((item) => {
const executionListener = moddle.create('flowable:ExecutionListener');
executionListener['event'] = item.event;
executionListener[item.type] = item.className;
const executionListener = moddle.create('flowable:ExecutionListener')
executionListener['event'] = item.event
if (item.alias) {
executionListener.delegateExpression = item.className
executionListener.alias = item.alias
} else {
executionListener[item.type] = item.className
}
if (item.params && item.params.length) {
item.params.forEach((field) => {
const fieldElement = moddle.create('flowable:Field');
fieldElement['name'] = field.name;
fieldElement[field.type] = field.value;
executionListener.get('fields').push(fieldElement);
});
const fieldElement = moddle.create('flowable:Field')
fieldElement['name'] = field.name
fieldElement[field.type] = field.value
executionListener.get('fields').push(fieldElement)
})
}
extensionElements.get('values').push(executionListener);
});
updateProperties({ extensionElements: extensionElements });
extensionElements.get('values').push(executionListener)
})
updateProperties({ extensionElements: extensionElements })
} else {
const extensionElements = props.element.businessObject[`extensionElements`];
const extensionElements = props.element.businessObject[`extensionElements`]
if (extensionElements) {
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? [];
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:ExecutionListener') ?? []
}
}
};
}
const cellDBLClickEvent: VxeTableEvents.CellDblclick<ExecutionListenerVO> = ({ row }) => {
editEvent(row);
};
editEvent(row)
}
const menuConfig = reactive<VxeTablePropTypes.MenuConfig<ExecutionListenerVO>>({
body: {
@ -232,71 +257,73 @@ const menuConfig = reactive<VxeTablePropTypes.MenuConfig<ExecutionListenerVO>>({
]
},
visibleMethod({ options, column }) {
const isDisabled = !column;
const isDisabled = !column
options.forEach((list) => {
list.forEach((item) => {
item.disabled = isDisabled;
});
});
return true;
item.disabled = isDisabled
})
})
return true
}
});
})
const contextMenuClickEvent: VxeTableEvents.MenuClick<ExecutionListenerVO> = ({ menu, row, column }) => {
const $table = tableRef.value;
const $table = tableRef.value
if ($table) {
switch (menu.code) {
case 'edit':
editEvent(row);
break;
editEvent(row)
break
case 'remove':
removeEvent(row);
break;
removeEvent(row)
break
}
}
};
}
const initTableData = () => {
tableData.value =
props.element.businessObject.extensionElements?.values
.filter((item) => item.$type === 'flowable:ExecutionListener')
.map((item) => {
let type;
if ('class' in item) type = 'class';
if ('expression' in item) type = 'expression';
if ('delegateExpression' in item) type = 'delegateExpression';
let type
if ('class' in item) type = 'class'
if ('expression' in item) type = 'expression'
if ('delegateExpression' in item) type = 'delegateExpression'
return {
event: item.event,
type: type,
className: item[type],
alias: item.alias || undefined,
params:
item.fields?.map((field) => {
let fieldType;
if ('stringValue' in field) fieldType = 'stringValue';
if ('expression' in field) fieldType = 'expression';
let fieldType
if ('stringValue' in field) fieldType = 'stringValue'
if ('expression' in field) fieldType = 'expression'
return {
name: field.name,
type: fieldType,
value: field[fieldType]
};
}
}) ?? []
};
}) ?? [];
};
}
}) ?? []
}
onMounted(() => {
initTableData();
});
initTableData()
})
const typeSelect = [
{ id: '742fdeb7-23b4-416b-ac66-cd4ec8b901b7', label: '类', value: 'class' },
{ id: '660c9c46-8fae-4bae-91a0-0335420019dc', label: '表达式', value: 'expression' },
{ id: '4b8135ab-6bc3-4a0f-80be-22f58bc6c5fd', label: '委托表达式', value: 'delegateExpression' }
];
{ id: '4b8135ab-6bc3-4a0f-80be-22f58bc6c5fd', label: '委托表达式', value: 'delegateExpression' },
{ id: 'ssjksjksjkslkw', label: '远程服务代理', value: 'serviceClass' }
]
const eventSelect = [
{ id: 'e6e0a51a-2d5d-4dc4-b847-b5c14f43a6ab', label: '开始', value: 'start' },
{ id: '6da97c1e-15fc-4445-8943-75d09f49778e', label: '结束', value: 'end' },
{ id: '6a2cbcec-e026-4f11-bef7-fff0b5c871e2', label: '启用', value: 'take' }
];
]
</script>
<style scoped lang="scss">

View File

@ -1,3 +1,11 @@
<!--
* @Description:
* @Author: Panda
* @Date: 2024-05-28 15:05:21
* @LastEditors: Panda
* @LastEditTime: 2024-05-30 18:13:12
* @FilePath: \platform-frontend\src\bpmn\panel\property\TaskListener.vue
-->
<template>
<div>
<vxe-toolbar>
@ -42,7 +50,7 @@
:show-close="false"
append-to-body
>
<el-form ref="formRef" :model="formData" :rules="tableRules" label-width="100px">
<el-form ref="formRef" :model="formData" :rules="tableRules" label-width="120px">
<el-form-item label="事件" prop="event">
<template #label>
<span>
@ -63,7 +71,7 @@
</el-select>
</el-form-item>
<el-form-item label="类型" prop="type">
<el-select v-model="formData.type">
<el-select v-model="formData.type" @change="handleChangeType">
<el-option v-for="item in typeSelect" :key="item.id" :value="item.value" :label="item.label"></el-option>
</el-select>
</el-form-item>
@ -71,7 +79,7 @@
:label="typeSelect.filter((e) => e.value === formData.type)[0] ? typeSelect.filter((e) => e.value === formData.type)[0]?.label : '表达式'"
prop="className"
>
<el-input v-model="formData.className" type="text"></el-input>
<el-input v-model="formData.className" :disabled="formData.alias ? true : false" type="text"></el-input>
</el-form-item>
</el-form>
<el-tabs type="border-card">
@ -89,35 +97,35 @@
</div>
</template>
<script setup lang="ts">
import ListenerParam from './ListenerParam.vue';
import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table';
import type { TaskListenerVO } from 'bpmnDesign';
import type { ModdleElement } from 'bpmn';
import ListenerParam from './ListenerParam.vue'
import { VxeTableEvents, VxeTableInstance, VxeTablePropTypes } from 'vxe-table'
import type { TaskListenerVO } from 'bpmnDesign'
import type { ModdleElement } from 'bpmn'
import usePanel from '../../hooks/usePanel';
import useDialog from '@/hooks/useDialog';
import useModelerStore from '@/store/modules/modeler';
import usePanel from '../../hooks/usePanel'
import useDialog from '@/hooks/useDialog'
import useModelerStore from '@/store/modules/modeler'
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const { proxy } = getCurrentInstance() as ComponentInternalInstance
interface PropType {
element: ModdleElement;
element: ModdleElement
}
const props = withDefaults(defineProps<PropType>(), {});
const props = withDefaults(defineProps<PropType>(), {})
const selectRow = ref<TaskListenerVO | null>();
const selectRow = ref<TaskListenerVO | null>()
const formDialog = useDialog({
title: selectRow.value ? '编辑&保存' : '新增&保存'
});
})
const { showConfig, elementType, updateProperties } = usePanel({
element: toRaw(props.element)
});
const { getModdle } = useModelerStore();
const moddle = getModdle();
})
const { getModdle } = useModelerStore()
const moddle = getModdle()
const listenerParamRef = ref<InstanceType<typeof ListenerParam>>();
const tableRef = ref<VxeTableInstance<TaskListenerVO>>();
const formRef = ref<ElFormInstance>();
const listenerParamRef = ref<InstanceType<typeof ListenerParam>>()
const tableRef = ref<VxeTableInstance<TaskListenerVO>>()
const formRef = ref<ElFormInstance>()
const initData: TaskListenerVO = {
event: '',
@ -125,104 +133,133 @@ const initData: TaskListenerVO = {
className: '',
name: '',
params: []
};
const formData = ref<TaskListenerVO>({ ...initData });
const currentIndex = ref(0);
const tableData = ref<TaskListenerVO[]>([]);
}
const formData = ref<TaskListenerVO>({ ...initData })
const currentIndex = ref(0)
const tableData = ref<TaskListenerVO[]>([])
const tableRules = ref<VxeTablePropTypes.EditRules>({
event: [{ required: true, message: '请选择', trigger: 'blur' }],
type: [{ required: true, message: '请选择', trigger: 'blur' }],
name: [{ required: true, message: '请输入', trigger: 'blur' }],
className: [{ required: true, message: '请输入', trigger: 'blur' }]
});
})
const submitEvent = async () => {
const error = await listenerParamRef.value.validate();
const error = await listenerParamRef.value.validate()
await formRef.value.validate((validate) => {
if (validate && !error) {
const $table = tableRef.value;
const $table = tableRef.value
console.log($table)
if ($table) {
formData.value.params = listenerParamRef.value.getTableData();
formData.value.params = listenerParamRef.value.getTableData()
if (selectRow.value) {
Object.assign(selectRow.value, formData.value);
Object.assign(selectRow.value, formData.value)
} else {
$table.insertAt({ ...formData.value }, -1);
$table.insertAt({ ...formData.value }, -1)
}
updateElement();
formDialog.closeDialog();
updateElement()
formDialog.closeDialog()
}
}
});
};
})
}
const handleChangeType = (v) => {
if (v === 'serviceClass') {
formData.value.className = '${delegatedTaskListener}'
formData.value.alias = v
formData.value.params = listenerParamRef.value.getTableData()
const index = formData.value.params.findIndex((item) => item.name === 'clazz')
console.log(index, formData.value.params)
if (index === -1) {
formData.value.params.unshift({
name: 'interfaceName',
type: 'stringValue',
value: ''
})
}
} else {
formData.value.alias = ''
}
}
const insertEvent = async () => {
Object.assign(formData.value, initData);
selectRow.value = null;
formDialog.openDialog();
};
formData.value.alias = ''
Object.assign(formData.value, initData)
selectRow.value = null
formDialog.openDialog()
}
const editEvent = (row: TaskListenerVO) => {
Object.assign(formData.value, row);
selectRow.value = row;
formDialog.openDialog();
};
Object.assign(formData.value, row)
selectRow.value = row
formDialog.openDialog()
}
const removeEvent = async (row: TaskListenerVO) => {
await proxy?.$modal.confirm('您确定要删除该数据?');
const $table = tableRef.value;
await proxy?.$modal.confirm('您确定要删除该数据?')
const $table = tableRef.value
if ($table) {
await $table.remove(row);
updateElement();
await $table.remove(row)
updateElement()
}
};
}
const removeSelectRowEvent = async () => {
const $table = tableRef.value;
const $table = tableRef.value
if ($table) {
const selectCount = $table.getCheckboxRecords().length;
const selectCount = $table.getCheckboxRecords().length
if (selectCount === 0) {
proxy?.$modal.msgWarning('请选择行');
proxy?.$modal.msgWarning('请选择行')
} else {
await $table.removeCheckboxRow();
updateElement();
await $table.removeCheckboxRow()
updateElement()
}
}
};
}
const updateElement = () => {
const $table = tableRef.value;
const data = $table.getTableData().fullData;
const $table = tableRef.value
const data = $table.getTableData().fullData
if (data.length) {
let extensionElements = props.element.businessObject.get('extensionElements');
let extensionElements = props.element.businessObject.get('extensionElements')
if (!extensionElements) {
extensionElements = moddle.create('bpmn:ExtensionElements');
extensionElements = moddle.create('bpmn:ExtensionElements')
}
//
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:TaskListener') ?? [];
extensionElements.values = extensionElements?.values.filter((item) => item.$type !== 'flowable:TaskListener') ?? []
data.forEach((item) => {
const taskListener = moddle.create('flowable:TaskListener');
taskListener['event'] = item.event;
taskListener[item.type] = item.className;
const taskListener = moddle.create('flowable:TaskListener')
taskListener['event'] = item.event
if (item.alias) {
taskListener.delegateExpression = item.className
taskListener.alias = item.alias
} else {
taskListener[item.type] = item.className
}
if (item.params && item.params.length) {
item.params.forEach((field) => {
const fieldElement = moddle.create('flowable:Field');
fieldElement['name'] = field.name;
fieldElement[field.type] = field.value;
taskListener.get('fields').push(fieldElement);
});
const fieldElement = moddle.create('flowable:Field')
fieldElement['name'] = field.name
fieldElement[field.type] = field.value
taskListener.get('fields').push(fieldElement)
})
}
extensionElements.get('values').push(taskListener);
});
updateProperties({ extensionElements: extensionElements });
extensionElements.get('values').push(taskListener)
})
updateProperties({ extensionElements: extensionElements })
data.forEach((item) => {
if (item.alias) item.type = item.alias
})
} else {
const extensionElements = props.element.businessObject[`extensionElements`];
const extensionElements = props.element.businessObject[`extensionElements`]
if (extensionElements) {
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:TaskListener') ?? [];
extensionElements.values = extensionElements.values?.filter((item) => item.$type !== 'flowable:TaskListener') ?? []
}
}
};
}
const cellDBLClickEvent: VxeTableEvents.CellDblclick<TaskListenerVO> = ({ row }) => {
editEvent(row);
};
editEvent(row)
}
const menuConfig = reactive<VxeTablePropTypes.MenuConfig<TaskListenerVO>>({
body: {
@ -234,71 +271,73 @@ const menuConfig = reactive<VxeTablePropTypes.MenuConfig<TaskListenerVO>>({
]
},
visibleMethod({ options, column }) {
const isDisabled = !column;
const isDisabled = !column
options.forEach((list) => {
list.forEach((item) => {
item.disabled = isDisabled;
});
});
return true;
item.disabled = isDisabled
})
})
return true
}
});
})
const contextMenuClickEvent: VxeTableEvents.MenuClick<TaskListenerVO> = ({ menu, row, column }) => {
const $table = tableRef.value;
const $table = tableRef.value
if ($table) {
switch (menu.code) {
case 'edit':
editEvent(row);
break;
editEvent(row)
break
case 'remove':
removeEvent(row);
break;
removeEvent(row)
break
}
}
};
}
const initTableData = () => {
tableData.value =
props.element.businessObject.extensionElements?.values
.filter((item) => item.$type === 'flowable:TaskListener')
.map((item) => {
let type;
if ('class' in item) type = 'class';
if ('expression' in item) type = 'expression';
if ('delegateExpression' in item) type = 'delegateExpression';
let type
if ('class' in item) type = 'class'
if ('expression' in item) type = 'expression'
if ('delegateExpression' in item) type = 'delegateExpression'
return {
event: item.event,
type: type,
type: item.alias || type,
className: item[type],
alias: item.alias || undefined,
params:
item.fields?.map((field) => {
let fieldType;
if ('stringValue' in field) fieldType = 'stringValue';
if ('expression' in field) fieldType = 'expression';
let fieldType
if ('stringValue' in field) fieldType = 'stringValue'
if ('expression' in field) fieldType = 'expression'
return {
name: field.name,
type: fieldType,
value: field[fieldType]
};
}
}) ?? []
};
}) ?? [];
};
}
}) ?? []
}
onMounted(() => {
initTableData();
});
initTableData()
})
const typeSelect = [
{ id: '742fdeb7-23b4-416b-ac66-cd4ec8b901b7', label: '类', value: 'class' },
{ id: '660c9c46-8fae-4bae-91a0-0335420019dc', label: '表达式', value: 'expression' },
{ id: '4b8135ab-6bc3-4a0f-80be-22f58bc6c5fd', label: '委托表达式', value: 'delegateExpression' }
];
{ id: '4b8135ab-6bc3-4a0f-80be-22f58bc6c5fd', label: '委托表达式', value: 'delegateExpression' },
{ id: 'ssjksjksjkslkw', label: '远程服务代理', value: 'serviceClass' }
]
const eventSelect = [
{ id: 'e6e0a51a-2d5d-4dc4-b847-b5c14f43a6ab', label: '创建', value: 'create' },
{ id: '6da97c1e-15fc-4445-8943-75d09f49778e', label: '指派', value: 'assignment' },
{ id: '6a2cbcec-e026-4f11-bef7-fff0b5c871e2', label: '完成', value: 'complete' },
{ id: '68801972-85f1-482f-bd86-1fad015c26ed', label: '删除', value: 'delete' }
];
]
</script>
<style scoped lang="scss">

View File

@ -1,92 +1,94 @@
declare module 'bpmnDesign' {
import { AllocationTypeEnum, SpecifyDescEnum, MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums';
import { AllocationTypeEnum, SpecifyDescEnum, MultiInstanceTypeEnum } from '@/enums/bpmn/IndexEnums'
export interface ParamVO {
type: string;
name: string;
value: string;
type: string
name: string
value: string
alias?: string
}
export interface TaskListenerVO {
event: string;
type: string;
name: string;
className: string;
params: ParamVO[];
event: string
type: string
name: string
className: string
alias?: string
params: ParamVO[]
}
export interface ExecutionListenerVO {
event: string;
type: string;
className: string;
params: ParamVO[];
event: string
type: string
className: string
params: ParamVO[]
}
interface BasePanel {
id: string;
name: string;
id: string
name: string
}
export interface ProcessPanel extends BasePanel {}
export interface TaskPanel extends BasePanel {
allocationType: AllocationTypeEnum;
specifyDesc: SpecifyDescEnum;
multiInstanceType: MultiInstanceTypeEnum;
async?: boolean;
priority?: number;
formKey?: string;
skipExpression?: string;
isForCompensation?: boolean;
triggerServiceTask?: boolean;
autoStoreVariables?: boolean;
ruleVariablesInput?: string;
excludeTaskListener?: boolean;
exclude?: boolean;
class?: string;
dueDate?: string;
fixedAssignee?: string;
allocationType: AllocationTypeEnum
specifyDesc: SpecifyDescEnum
multiInstanceType: MultiInstanceTypeEnum
async?: boolean
priority?: number
formKey?: string
skipExpression?: string
isForCompensation?: boolean
triggerServiceTask?: boolean
autoStoreVariables?: boolean
ruleVariablesInput?: string
excludeTaskListener?: boolean
exclude?: boolean
class?: string
dueDate?: string
fixedAssignee?: string
candidateUsers?: string;
assignee?: string;
candidateGroups?: string;
collection?: string;
elementVariable?: string;
completionCondition?: string;
isSequential?: boolean;
candidateUsers?: string
assignee?: string
candidateGroups?: string
collection?: string
elementVariable?: string
completionCondition?: string
isSequential?: boolean
loopCharacteristics?: {
collection: string;
elementVariable: string;
isSequential: boolean;
collection: string
elementVariable: string
isSequential: boolean
completionCondition: {
body: string;
};
};
body: string
}
}
}
export interface StartEndPanel extends BasePanel {}
export interface GatewayPanel extends BasePanel {}
export interface SequenceFlowPanel extends BasePanel {
conditionExpression: {
body: string;
};
conditionExpressionValue: string;
skipExpression: string;
body: string
}
conditionExpressionValue: string
skipExpression: string
}
export interface ParticipantPanel extends BasePanel {}
export interface SubProcessPanel extends BasePanel {
multiInstanceType: MultiInstanceTypeEnum;
collection?: string;
elementVariable?: string;
completionCondition?: string;
multiInstanceType: MultiInstanceTypeEnum
collection?: string
elementVariable?: string
completionCondition?: string
loopCharacteristics?: {
collection: string;
elementVariable: string;
isSequential: boolean;
collection: string
elementVariable: string
isSequential: boolean
completionCondition: {
body: string;
};
};
body: string
}
}
}
}