flowable 自定义属性实现和属性获取小记

  • flowable 自定义属性
  • 编辑stencilset_bpmn.json文件
  • 在下载的BPMN.xml中添加属性
  • flowable 获取自定义属性的值


flowable 自定义属性

最近在项目中,需要使用工作流,使用的flowable 开源框架进行开发。项目中有个需求在流程节点上添加一个自定义的属性。在上面花费了一些时间,以防忘记,便做小记。

编辑stencilset_bpmn.json文件

找到stencilset_bpmn.json文件,打开会发现有propertyPackages的属性,如图:

将flowable做成单独微服务 flowable 自定义表单_自定义属性


我们只需要根据流程之前创建的形式一样就行了,我这里定义为如下:

{
      "name": "isbatchapproval_package",
      "properties": [
        {
          "id": "isbatchapproval",
          "type": "Boolean",  //设置为boolean类型
          "title": "是否允许批量审批",
          "value": "",
          "description": "对相关节点设置是否允许批量审批",
          "popular": true
        }
      ]
    }

写好之后,要在相关节点上显示相关的属性,就需要在节点上进行引用上面的属性id值为isbatchapproval的,因为批量审批只针对用户任务节点,所以在UserTask中引入,如下:

{
      "type": "node",
      "id": "UserTask",
      "title": "\u7528\u6237\u4efb\u52a1",
      ...
      "propertyPackages": [
        ...
        "isbatchapproval_package",  //此处对应了相应上面定义的isbatchapproval_package,如果你要添加到指定属性后面,只需要将isbatchapproval_package放到指定属性引入的后面即可
        ...
      ],
      ...
    },

流程设计图点击用户节点将会多如下的属性:

将flowable做成单独微服务 flowable 自定义表单_自定义属性_02

在下载的BPMN.xml中添加属性

通过上面的操作,只能在流程设计上显示,但是保存的时候,发布之后在下载的bpmn.xml文件中不会有这个属性,我们现在就需要做如下处理
1.创建一个IsBatchApprovalJsonConver.java集成UserTaskJsonConverter,主要代码如下:

@Override
    protected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode,
                                               Map<String, JsonNode> shapeMap) {
        UserTask flowElement = (UserTask) super.convertJsonToElement(elementNode, modelNode, shapeMap);
        List<CustomProperty> customProperties = new ArrayList<>();
        // 扩展批量审批属性,塞入流程设计器属性值中,这个地方可以添加多个
        Boolean isBatchApproval = getPropertyValueAsBoolean("isbatchapproval", elementNode);
        if (Objects.nonNull(isBatchApproval)) {
            CustomProperty nodeType = this.createProperty("isbatchapproval", isBatchApproval.toString());
            customProperties.add(nodeType);
        }
        
        if (CollUtil.isNotEmpty(customProperties)) {
            //添加属性到流程设计器中
            flowElement.setCustomProperties(customProperties);
        }
        return flowElement;
    }

    @Override
    protected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {
        super.convertElementToJson(propertiesNode, baseElement);
    }

    /**
     * 创建自定义属性
     *
     * @param propertyName  属性名称
     * @param propertyValue 属性值
     */
    private CustomProperty createProperty(String propertyName, String propertyValue) {
        CustomProperty customProperty = new CustomProperty();
        customProperty.setId(propertyName);
        customProperty.setName(propertyName);
        customProperty.setSimpleValue(propertyValue);
        return customProperty;
    }

2.创建CustomPropertyInit.java,并在流程设计配置中加入即可,代码如下:

public CustomPropertyInit() {
        Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap = BpmnJsonConverter.convertersToJsonMap;
        Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap = BpmnJsonConverter.convertersToBpmnMap;
        // 添加自定义的任务json转化器
        IsBatchApprovalJsonConver.setCustomTypes(convertersToBpmnMap, convertersToJsonMap);
    }

/***
* 流程设计配置类中添加的
*/
@Bean
public CustomPropertyInit createCustomPropertyInit() {
    return new CustomPropertyInit();
}

这样重新部署流程,下载bpmn就可以看到相关如下,我的是这样的:

<flowable:isbatchapproval>true</flowable:isbatchapproval>

说明自定义属性是成功的。

flowable 获取自定义属性的值

我们在前端流程那边设置了相关的自定义属性,我们怎么获取isbatchapproval这个属性呢?只需要使用如下代码即可:

public FlowElement getFlowElementByActivityIdAndProcessDefinitionId(String taskDefinedKey, String processDefinitionId) {
        BpmnModel bpmnModel = repositoryService.getBpmnModel(processDefinitionId);
        List<Process> processes = bpmnModel.getProcesses();
        if (CollectionUtils.isNotEmpty(processes)) {
            for (Process process : processes) {
                FlowElement flowElement = process.getFlowElement(activityId, true);
                if (Objects.nonNull(flowElement)) {
                    return flowElement;
                }
            }
        }
        return null;
    }

    public List<ExtensionElement> getCustomProperty(String taskDefinedKey, String processDefinitionId, String customPropertyName) {
        FlowElement flowElement = this.getFlowElementByActivityIdAndProcessDefinitionId(activityId, processDefinitionId);
        if (flowElement != null && flowElement instanceof UserTask) {
            UserTask userTask = (UserTask) flowElement;
            Map<String, List<ExtensionElement>> extensionElements = userTask.getExtensionElements();
            if (MapUtils.isNotEmpty(extensionElements)) {
                List<ExtensionElement> values = extensionElements.get(customPropertyName);
                if (CollectionUtils.isNotEmpty(values)) {
                    return values;
                }
            }
        }
        return null;
    }

这个上面需要流程定义的ID和任务的定义key,getCustomProperty方法需要传入属性名称进行查询。
我的调用如下:

Task task = taskQueryUtils.queryTaskToById(taskId);
//获取自定义批量属性值
List<ExtensionElement> = taskQueryUtils.getCustomProperty(task.getTaskDefinitionKey(), task.getProcessDefinitionId(), "isbatchapproval");

ExtensionElement对象中有一个ElementText属性,这个属性就是该属性的值。