一、功能说明
示例及使用功能说明
起始节点:新增表单,在起始节点绑定需要控制是数据表单。
任务节点:可以选择关联表单(主数据表相同的表单都可以选择控制,在拖拽表单设置中,主表-数据表名一致的),可以设置任务节点审批表单隐藏和显示的字段,此处的字段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-option
v-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-select
multiple
placeholder="请选择"
v-model="writeFieldKey"
@change="updateElementwriteFieldKey"
>
<el-option-group
v-for="group in fieldList"
:key="group.id"
:label="group.table_comment+'('+group.flag+')'"
>
<el-option
v-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-select
multiple
placeholder="请选择"
v-model="hideFieldKey"
@change="updateElementHideFieldKey"
>
<el-option-group
v-for="group in fieldList"
:key="group.id"
:label="group.table_comment"
>
<el-option
v-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-select
multiple
placeholder="请选择"
v-model="writeFieldKey"
@change="updateElementwriteFieldKey"
>
<el-option-group
v-for="group in fieldList"
:key="group.id"
:label="group.table_comment+'('+group.flag+')'"
>
<el-option
v-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,
});
},