flowable 自定义属性实现和属性获取小记
- flowable 自定义属性
- 编辑stencilset_bpmn.json文件
- 在下载的BPMN.xml中添加属性
- flowable 获取自定义属性的值
flowable 自定义属性
最近在项目中,需要使用工作流,使用的flowable 开源框架进行开发。项目中有个需求在流程节点上添加一个自定义的属性。在上面花费了一些时间,以防忘记,便做小记。
编辑stencilset_bpmn.json文件
找到stencilset_bpmn.json文件,打开会发现有propertyPackages的属性,如图:
我们只需要根据流程之前创建的形式一样就行了,我这里定义为如下:
{
"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放到指定属性引入的后面即可
...
],
...
},
流程设计图点击用户节点将会多如下的属性:
在下载的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属性,这个属性就是该属性的值。