一、功能说明
示例及使用功能说明
起始节点:新增表单,在起始节点绑定需要控制是数据表单。
任务节点:可以选择关联表单(主数据表相同的表单都可以选择控制,在拖拽表单设置中,主表-数据表名一致的),可以设置任务节点审批表单隐藏和显示的字段,此处的字段key多选。
分析修改后的Bpmn.xml
1、绑定activit:formkey-即帮的节点数据表id。
2、新增拓展节点参数,activiti:extensionElements->activti:field
writeFieldKey:可写可编辑的字段集合,此处存储的为数据字段。
hideFieldKey:隐藏的字段集合,此处存储的为数据字段。
二、bpmnjs表单属性改造
修改PropertiesPanel
页面属性改造
新增关联表单选择,编辑字段和隐藏字段。
<div class="panel-tab__content"><el-form size="mini" label-width="80px" @submit.native.prevent><el-form-item label="关联表单"><el-select v-model="formKey" @change="updateElementFormKey"><el-optionv-for="item in formList":key="item.id":value="item.id":label="item.table_comment"/><!-- <el-option label="无" value="" /> --></el-select></el-form-item><el-form-item label="编辑字段" v-if="elementType == 'UserTask'"><el-selectmultipleplaceholder="请选择"v-model="writeFieldKey"@change="updateElementwriteFieldKey"><el-option-groupv-for="group in fieldList":key="group.id":label="group.table_comment+'('+group.flag+')'"><el-optionv-for="item in group.vfields":key="item.id":label="item.field_comment":value="item.field_name"></el-option></el-option-group></el-select></el-form-item><el-form-item label="隐藏字段" v-if="elementType == 'UserTask'"><el-selectmultipleplaceholder="请选择"v-model="hideFieldKey"@change="updateElementHideFieldKey"><el-option-groupv-for="group in fieldList":key="group.id":label="group.table_comment"><el-optionv-for="item in group.vfields":key="item.id":label="item.field_comment":value="item.field_name"></el-option></el-option-group></el-select></el-form-item></el-form></div>
点击节点-执行方法
通过获取当前节点的信息查询已经设置的内容进行初始化。
resetFormList() {this.bpmnELement = window.bpmnInstances.bpmnElement;this.elementType = this.bpmnELement.type.split(":")[1];if (this.elementType == "UserTask") {let formKey =this.bpmnELement.parent.businessObject.flowElements[0].formKey;if (formKey == undefined || formKey == null) {this.formList = [];this.fieldList = [];} else {this.initData({ table_id: formKey });}} else if (this.elementType == "StartEvent") {this.initData({});}this.formKey = this.bpmnELement.businessObject.formKey;if (this.formKey != undefined) {this.getFieldList({ table_id: this.formKey });}// 获取元素扩展属性 或者 创建扩展属性this.elExtensionElements =this.bpmnELement.businessObject.get("extensionElements");this.writeFieldKey = [];this.hideFieldKey = [];if (this.elExtensionElements.values.length > 0) {let writeFieldKey =this.elExtensionElements.values[0].$attrs.writeFieldKey;let hideFieldKey =this.elExtensionElements.values[0].$attrs.hideFieldKey;if (writeFieldKey != undefined && writeFieldKey != "") {this.writeFieldKey = writeFieldKey.toString().split(",");}if (hideFieldKey != undefined && hideFieldKey != "") {this.hideFieldKey = hideFieldKey.toString().split(",");}}// 复制原始值,填充表格this.fieldList = JSON.parse(JSON.stringify(this.formData.fields || []));// 更新元素扩展属性,避免后续报错this.updateElementExtensions();},
解析:bpmnElement
通过window.bpmnInstances.bpmnElement查看当前节点信息,分享如下:
属性节点都存在businessObject下面,详细内容如下:
// 获取元素扩展属性 或者 创建扩展属性this.elExtensionElements =this.bpmnELement.businessObject.get("extensionElements");let writeFieldKey =this.elExtensionElements.values[0].$attrs.writeFieldKey;let hideFieldKey =this.elExtensionElements.values[0].$attrs.hideFieldKey;
看到此处-大家可能会有个疑问?
当前的任务节点,怎么获取开始节点绑定的formkey呢?因为此处需要根据起始节点绑定的formkey进行获取当前节点的内容信息。
咱们继续往下看:
在最下面发现有个parent节点,找到父级节点就好办了,根据父级节点,我们可以找到下面的第一个节点-就是其实节点,然后获取绑定的formkey。
let formKey =this.bpmnELement.parent.businessObject.flowElements[0].formKey;
查询数据表字段
此处我们使用了分组下拉多选,因为除了有主表之外还要从表。
getFieldList(params) {findFieldList(params).then((response) => {this.fieldList = [];let object = response.data.object;object.flag = "主表";let data = response.data.data;this.fieldList.push(object);data.forEach((element) => {element.flag = "从表";this.fieldList.push(element);});});},
<el-selectmultipleplaceholder="请选择"v-model="writeFieldKey"@change="updateElementwriteFieldKey"><el-option-groupv-for="group in fieldList":key="group.id":label="group.table_comment+'('+group.flag+')'"><el-optionv-for="item in group.vfields":key="item.id":label="item.field_comment":value="item.field_name"></el-option></el-option-group></el-select>
更新formkey属性
window.bpmnInstances.modeling.updateProperties(this.bpmnELement, { formKey: this.formKey, });
updateElementFormKey() {window.bpmnInstances.modeling.updateProperties(this.bpmnELement, {formKey: this.formKey,});//查询字段信息this.getFieldList({ table_id: this.formKey });},
更新写/隐藏字段属性
updateElementwriteFieldKey() {// window.bpmnInstances.modeling.updateProperties(this.bpmnELement, {// writeFieldKey: this.writeFieldKey,// });this.otherExtensions = [];const Field = window.bpmnInstances.moddle.create(`${this.prefix}:Field`,{ writeFieldKey: this.writeFieldKey, hideFieldKey: this.hideFieldKey });this.otherExtensions.push(Field);this.updateElementExtensions();},updateElementHideFieldKey() {// window.bpmnInstances.modeling.updateProperties(this.bpmnELement, {// hideFieldKey: this.hideFieldKey,// });this.otherExtensions = [];const Field = window.bpmnInstances.moddle.create(`${this.prefix}:Field`,{ writeFieldKey: this.writeFieldKey, hideFieldKey: this.hideFieldKey });this.otherExtensions.push(Field);this.updateElementExtensions();},updateElementBusinessKey() {window.bpmnInstances.modeling.updateModdleProperties(this.bpmnELement,this.formData,{ businessKey: this.businessKey });},updateElementExtensions() {// 更新回扩展元素,生成ExtensionElements的代码const newElExtensionElements = window.bpmnInstances.moddle.create(`bpmn:ExtensionElements`,{values: this.otherExtensions,});// 更新到元素上//此处直接放到扩展节点的根节点是,配合后台查询,可以自定义,但后台代码需要自己编写window.bpmnInstances.modeling.updateProperties(this.bpmnELement, {extensionElements: newElExtensionElements,});},

