更多ruoyi-nbcio功能请看演示系统
gitee源代码地址
前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio
演示地址:RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/
更多nbcio-boot功能请看演示系统
gitee源代码地址
后端代码: https://gitee.com/nbacheng/nbcio-boot
前端代码:https://gitee.com/nbacheng/nbcio-vue.git
在线演示(包括H5) : http://218.75.87.38:9888
1、ElementMultiInstance.vue原先vue2代码如下:
<template> <div class="panel-tab__content"> <el-form size="small" label-width="90px" @submit.prevent> <el-form-item label="回路特性"> <el-select v-model="loopCharacteristics" @change="changeLoopCharacteristicsType"> <!--bpmn:MultiInstanceLoopCharacteristics--> <el-option label="并行多重事件" value="ParallelMultiInstance" /> <el-option label="时序多重事件" value="SequentialMultiInstance" /> <!--bpmn:StandardLoopCharacteristics--> <el-option label="循环事件" value="StandardLoop" /> <el-option label="无" value="Null" /> </el-select> </el-form-item> <template v-if="loopCharacteristics === 'ParallelMultiInstance' || loopCharacteristics === 'SequentialMultiInstance'"> <el-form-item label="循环基数" key="loopCardinality"> <el-input v-model="loopInstanceForm.loopCardinality" clearable @change="updateLoopCardinality" /> </el-form-item> <el-form-item label="集合" key="collection"> <el-input v-model="loopInstanceForm.collection" clearable @change="updateLoopBase" /> </el-form-item> <el-form-item label="元素变量" key="elementVariable"> <el-input v-model="loopInstanceForm.elementVariable" clearable @change="updateLoopBase" /> </el-form-item> <el-form-item label="完成条件" key="completionCondition"> <el-input v-model="loopInstanceForm.completionCondition" clearable @change="updateLoopCondition" /> </el-form-item> <el-form-item label="异步状态" key="async"> <el-checkbox v-model="loopInstanceForm.asyncBefore" label="异步前" @change="updateLoopAsync('asyncBefore')" /> <el-checkbox v-model="loopInstanceForm.asyncAfter" label="异步后" @change="updateLoopAsync('asyncAfter')" /> <el-checkbox v-model="loopInstanceForm.exclusive" v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore" label="排除" @change="updateLoopAsync('exclusive')" /> </el-form-item> <el-form-item label="重试周期" prop="timeCycle" v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore" key="timeCycle"> <el-input v-model="loopInstanceForm.timeCycle" clearable @change="updateLoopTimeCycle" /> </el-form-item> </template> </el-form> </div> </template> <script> export default { name: "ElementMultiInstance", props: { businessObject: Object, type: String }, inject: { prefix: "prefix" }, data() { return { loopCharacteristics: "", //默认配置,用来覆盖原始不存在的选项,避免报错 defaultLoopInstanceForm: { completionCondition: "", loopCardinality: "", extensionElements: [], asyncAfter: false, asyncBefore: false, exclusive: false }, loopInstanceForm: {} }; }, watch: { businessObject: { immediate: true, handler(val) { this.bpmnElement = window.bpmnInstances.bpmnElement; this.getElementLoop(val); } } }, methods: { getElementLoop(businessObject) { if (!businessObject.loopCharacteristics) { this.loopCharacteristics = "Null"; this.loopInstanceForm = {}; return; } if (businessObject.loopCharacteristics.$type === "bpmn:StandardLoopCharacteristics") { this.loopCharacteristics = "StandardLoop"; this.loopInstanceForm = {}; return; } if (businessObject.loopCharacteristics.isSequential) { this.loopCharacteristics = "SequentialMultiInstance"; } else { this.loopCharacteristics = "ParallelMultiInstance"; } // 合并配置 this.loopInstanceForm = { ...this.defaultLoopInstanceForm, ...businessObject.loopCharacteristics, completionCondition: businessObject.loopCharacteristics?.completionCondition?.body ?? "", loopCardinality: businessObject.loopCharacteristics?.loopCardinality?.body ?? "" }; // 保留当前元素 businessObject 上的 loopCharacteristics 实例 this.multiLoopInstance = window.bpmnInstances.bpmnElement.businessObject.loopCharacteristics; // 更新表单 if ( businessObject.loopCharacteristics.extensionElements && businessObject.loopCharacteristics.extensionElements.values && businessObject.loopCharacteristics.extensionElements.values.length ) { this.loopInstanceForm["timeCycle"] = businessObject.loopCharacteristics.extensionElements.values[0].body } }, changeLoopCharacteristicsType(type) { // this.loopInstanceForm = { ...this.defaultLoopInstanceForm }; // 切换类型取消原表单配置 // 取消多实例配置 if (type === "Null") { window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { loopCharacteristics: null }); return; } // 配置循环 if (type === "StandardLoop") { const loopCharacteristicsObject = window.bpmnInstances.moddle.create("bpmn:StandardLoopCharacteristics"); window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { loopCharacteristics: loopCharacteristicsObject }); this.multiLoopInstance = null; return; } // 时序 if (type === "SequentialMultiInstance") { this.multiLoopInstance = window.bpmnInstances.moddle.create("bpmn:MultiInstanceLoopCharacteristics", { isSequential: true }); } else { this.multiLoopInstance = window.bpmnInstances.moddle.create("bpmn:MultiInstanceLoopCharacteristics"); } window.bpmnInstances.modeling.updateProperties(this.bpmnElement, { loopCharacteristics: this.multiLoopInstance }); }, // 循环基数 updateLoopCardinality(cardinality) { let loopCardinality = null; if (cardinality && cardinality.length) { loopCardinality = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body: cardinality }); } window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, { loopCardinality }); }, // 完成条件 updateLoopCondition(condition) { let completionCondition = null; if (condition && condition.length) { completionCondition = window.bpmnInstances.moddle.create("bpmn:FormalExpression", { body: condition }); } window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, { completionCondition }); }, // 重试周期 updateLoopTimeCycle(timeCycle) { const extensionElements = window.bpmnInstances.moddle.create("bpmn:ExtensionElements", { values: [ window.bpmnInstances.moddle.create(`${this.prefix}:FailedJobRetryTimeCycle`, { body: timeCycle }) ] }); window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, { extensionElements }); }, // 直接更新的基础信息 updateLoopBase() { window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, { collection: this.loopInstanceForm.collection || null, elementVariable: this.loopInstanceForm.elementVariable || null }); }, // 各异步状态 updateLoopAsync(key) { const { asyncBefore, asyncAfter } = this.loopInstanceForm; let asyncAttr = Object.create(null); if (!asyncBefore && !asyncAfter) { this.loopInstanceForm["exclusive"] = false asyncAttr = { asyncBefore: false, asyncAfter: false, exclusive: false, extensionElements: null }; } else { asyncAttr[key] = this.loopInstanceForm[key]; } window.bpmnInstances.modeling.updateModdleProperties(this.bpmnElement, this.multiLoopInstance, asyncAttr); } }, beforeUnmount() { this.multiLoopInstance = null; this.bpmnElement = null; } }; </script>
2、修改成vue3的代码如下:
<template> <div class="panel-tab__content"> <el-form size="small" label-width="90px" > <el-form-item label="回路特性"> <el-select v-model="loopCharacteristics" @change="changeLoopCharacteristicsType"> <!--bpmn:MultiInstanceLoopCharacteristics--> <el-option label="并行多重事件" value="ParallelMultiInstance" /> <el-option label="时序多重事件" value="SequentialMultiInstance" /> <!--bpmn:StandardLoopCharacteristics--> <el-option label="循环事件" value="StandardLoop" /> <el-option label="无" value="Null" /> </el-select> </el-form-item> <template v-if="loopCharacteristics === 'ParallelMultiInstance' || loopCharacteristics === 'SequentialMultiInstance'"> <el-form-item label="循环基数" key="loopCardinality"> <el-input v-model="loopInstanceForm.loopCardinality" clearable @change="updateLoopCardinality" /> </el-form-item> <el-form-item label="集合" key="collection"> <el-input v-model="loopInstanceForm.collection" clearable @change="updateLoopBase" /> </el-form-item> <el-form-item label="元素变量" key="elementVariable"> <el-input v-model="loopInstanceForm.elementVariable" clearable @change="updateLoopBase" /> </el-form-item> <el-form-item label="完成条件" key="completionCondition"> <el-input v-model="loopInstanceForm.completionCondition" clearable @change="updateLoopCondition" /> </el-form-item> <el-form-item label="异步状态" key="async"> <el-checkbox v-model="loopInstanceForm.asyncBefore" label="异步前" @change="updateLoopAsync('asyncBefore')" /> <el-checkbox v-model="loopInstanceForm.asyncAfter" label="异步后" @change="updateLoopAsync('asyncAfter')" /> <el-checkbox v-model="loopInstanceForm.exclusive" v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore" label="排除" @change="updateLoopAsync('exclusive')" /> </el-form-item> <el-form-item label="重试周期" prop="timeCycle" v-if="loopInstanceForm.asyncAfter || loopInstanceForm.asyncBefore" key="timeCycle"> <el-input v-model="loopInstanceForm.timeCycle" clearable @change="updateLoopTimeCycle" /> </el-form-item> </template> </el-form> </div> </template> <script lang="ts" setup> defineOptions({ name: 'ElementMultiInstance' }) const props = defineProps({ businessObject: Object, type: String }) const prefix = inject('prefix') const loopCharacteristics = ref('') //默认配置,用来覆盖原始不存在的选项,避免报错 const defaultLoopInstanceForm = ref({ completionCondition: '', loopCardinality: '', extensionElements: [], asyncAfter: false, asyncBefore: false, exclusive: false }) const loopInstanceForm = ref<any>({}) const bpmnElement = ref(null) const multiLoopInstance = ref(null) const bpmnInstances = () => (window as any)?.bpmnInstances watch( () => props.businessObject, (val) => { bpmnElement.value = bpmnInstances().bpmnElement getElementLoop(val) }, { immediate: true } ) const getElementLoop = (businessObject) => { if (!businessObject.loopCharacteristics) { loopCharacteristics.value = 'Null' loopInstanceForm.value = {} return } if (businessObject.loopCharacteristics.$type === 'bpmn:StandardLoopCharacteristics') { loopCharacteristics.value = 'StandardLoop' loopInstanceForm.value = {} return } if (businessObject.loopCharacteristics.isSequential) { loopCharacteristics.value = 'SequentialMultiInstance' } else { loopCharacteristics.value = 'ParallelMultiInstance' } // 合并配置 loopInstanceForm.value = { ...defaultLoopInstanceForm.value, ...businessObject.loopCharacteristics, completionCondition: businessObject.loopCharacteristics?.completionCondition?.body ?? '', loopCardinality: businessObject.loopCharacteristics?.loopCardinality?.body ?? '' } // 保留当前元素 businessObject 上的 loopCharacteristics 实例 multiLoopInstance.value = bpmnInstances().bpmnElement.businessObject.loopCharacteristics // 更新表单 if ( businessObject.loopCharacteristics.extensionElements && businessObject.loopCharacteristics.extensionElements.values && businessObject.loopCharacteristics.extensionElements.values.length ) { loopInstanceForm.value['timeCycle'] = businessObject.loopCharacteristics.extensionElements.values[0].body } } const changeLoopCharacteristicsType = (type) => { // this.loopInstanceForm = { ...this.defaultLoopInstanceForm }; // 切换类型取消原表单配置 // 取消多实例配置 if (type === 'Null') { bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { loopCharacteristics: null }) return } // 配置循环 if (type === 'StandardLoop') { const loopCharacteristicsObject = bpmnInstances().moddle.create( 'bpmn:StandardLoopCharacteristics' ) bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { loopCharacteristics: loopCharacteristicsObject }) multiLoopInstance.value = null return } // 时序 if (type === 'SequentialMultiInstance') { multiLoopInstance.value = bpmnInstances().moddle.create( 'bpmn:MultiInstanceLoopCharacteristics', { isSequential: true } ) } else { multiLoopInstance.value = bpmnInstances().moddle.create( 'bpmn:MultiInstanceLoopCharacteristics') } bpmnInstances().modeling.updateProperties(toRaw(bpmnElement.value), { loopCharacteristics: toRaw(multiLoopInstance.value) }) } // 循环基数 const updateLoopCardinality = (cardinality) => { let loopCardinality = null if (cardinality && cardinality.length) { loopCardinality = bpmnInstances().moddle.create('bpmn:FormalExpression', { body: cardinality }) } bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), multiLoopInstance.value, { loopCardinality } ) } // 完成条件 const updateLoopCondition = (condition) => { let completionCondition = null if (condition && condition.length) { completionCondition = bpmnInstances().moddle.create('bpmn:FormalExpression', { body: condition }) } bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), multiLoopInstance.value, { completionCondition } ) } // 重试周期 const updateLoopTimeCycle = (timeCycle) => { const extensionElements = bpmnInstances().moddle.create('bpmn:ExtensionElements', { values: [ bpmnInstances().moddle.create(`${prefix}:FailedJobRetryTimeCycle`, { body: timeCycle }) ] }) bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), multiLoopInstance.value, { extensionElements } ) } // 直接更新的基础信息 const updateLoopBase = () => { bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), multiLoopInstance.value, { collection: loopInstanceForm.value.collection || null, elementVariable: loopInstanceForm.value.elementVariable || null } ) } // 各异步状态 const updateLoopAsync = (key) => { const { asyncBefore, asyncAfter } = loopInstanceForm.value let asyncAttr = Object.create(null) if (!asyncBefore && !asyncAfter) { // this.$set(this.loopInstanceForm, "exclusive", false); loopInstanceForm.value['exclusive'] = false asyncAttr = { asyncBefore: false, asyncAfter: false, exclusive: false, extensionElements: null } } else { asyncAttr[key] = loopInstanceForm.value[key] } bpmnInstances().modeling.updateModdleProperties( toRaw(bpmnElement.value), multiLoopInstance.value, asyncAttr ) } onBeforeUnmount(() => { multiLoopInstance.value = null bpmnElement.value = null }) </script>
3、目前虽然改造了,但实际上面目前没有用到它