vue项目的bpmnjs流程设计器已经做完了,过程中稍微难点的是创建扩展属性与多实例,当然,最难的要算是自定义右侧审批界面以及事件交互;后期会继续讲各部分的自定义方法,今天先来讲,flowable前缀的扩展属性与多实例的实现方法,直接上代码:

//例子:创建扩展属性用于存放表单权限数据
export default{
    data()
        return{
            prefix:'flowable',
            moddle:'',
            currentElement:'',//当前选中的节点element值(shape)
            modeling:'',
            propertiesForm:{
                signType:''//串行/并行的值
            }
        }
    },
    computed:{
        descriptorPrefix(){
            return this.prefix +':'
        }
    },
    methods:{
        async createFormRightExtensionElements(options){
            if(options &&  options.formRight){
                let formRightData = await this.moddle.create(this.descriptorPrefix+'Formright',{
                    name:'formright',
                    uri:'http://'+this.prefix+'.org/bpmn',
                    body:JSON.stringify(options.formRight)
                })
                this.createExtensionElements([formRightData], this.descriptorPrefix+'Formright')
            }
        },
        async createExtensionElements(propertiesValues, type, targetElement){
            let originExtensionItems = await this.deleteExtensionElement(type, targetElement)
            originExtensionItems = propertiesValues.length?originExtensionItems.concat(propertiesValues):originExtensionItems
            if(originExtensionItems.length){
                const extensionItems = await this.moddle.create(this.descriptorPrefix+"Properties",{
                    values:originExtensionItems,
                    uri:"http://"+this.prefix+".org/bpmn"
                })
                const extensions = await this.moddle.create('bpmn:ExtensionElements',{values:[extensionItems]})
                this.updateExtensionElements(extensions, targetElement)
            }
        },
        async deleteExtensionElement(type, targetElement){
            let allExtensions = await this.getAllExtensions(targetElement)
            allExtensions.forEach((item,index)=>{
                if(item.$type == type){
                    allExtensions.splice(index,1)
                }
            })
            return allExtensions
        },
        async getAllExtensions(targetElement){
            targetElement = targetElement?targetElement:this.currentElement
            let extensions = targetElement.businessObject.extensionElements
            return extensions?.values?.[0]?.values
        },
        updateExtensionElements(extensions,targetElement){
            targetElement = targetElement?targetElement:this.currentElement
            this.modeling.updateProperties(targetElement,{extensionElements:extensions});
        },
        //以上方法是创建扩展属性的过程,下面的方法是创建多实例的过程
        updateMultiInstanceLoopCharacteristics(bool){
            if(bool){
                let loopCharacteristics = this.moddle.create("bpmn:MultiInstanceLoopCharacteristics")
                loopCharacteristics.$attrs[this.descriptorPrefix+'collection'] = 'assigneeList'
                loopCharacteristics.$attrs[this.descriptorPrefix+'elementVariable'] = 'assignee'
                let isSequential = this.propertiesForm.signType == "1"? true : false //true为串行一个个完成才通过
                //串行和并行
                loopCharacteristics['isSequential'] = isSequential //设置是串行还是并行
                loopCharacteristics.$attrs['isSequential'] = isSequential //属性
                let taskCondition = isSequential?'${flowTaskMultiInstance.accessCondition(execution1)}' : '${flowTaskMultiInstance.accessCondition(execution2)}'
                let completionCondition = this.bpmnFactory.create("bpmn:FormalExpression",{body:taskCondition})
                //let completionCondition = this.bpmnFactory.create("bpmn:FormalExpression",{body:'${nrOfCompletedInstances == 1}'})//一个通过就行
                completionCondition.$parent = this.currentElement
                loopCharacteristics['completionCondition'] = completionCondition
                //loopCharacteristics['inputDataItem'] = inputDataItem
                //loopCharacteristics['loopCardinality'] = loopCardinality

                this.modeling.updateProperties(this.currentElement,{loopCharacteristics:loopCharacteristics});
            }else{
                this.currentElement && delete this.currentElement.businessObject.loopCharacteristics
            }
        },
    }
}

基本的代码都在上面了,扩展属性是可以自定义标签名的,多实例是任务节点固有的一个标签,设置的时候是给loopCharacteristics赋值,都是用到this.modeling.updateProperties方法实现,就先讲这么多,快去试试吧

GitHub 加速计划 / eleme / element
54.06 K
14.63 K
下载
A Vue.js 2.0 UI Toolkit for Web
最近提交(Master分支:3 个月前 )
c345bb45 7 个月前
a07f3a59 * Update transition.md * Update table.md * Update transition.md * Update table.md * Update transition.md * Update table.md * Update table.md * Update transition.md * Update popover.md 7 个月前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐