actitivi自定义属性(二)

声明:此处activiti版本为6.0

此文章介绍后端自定义属性解析,前端添加自定义属性方法连接:activiti自定义属性(一)_ruoyi activiti自定义标题-CSDN博客

1、涉及到的类如下:

简介:DefaultXmlParser :xml自定义属性解析类 :实现解析指定节点下扩展字段xml节点

CustomBpmnJsonConverter:用于转换BPMN与JSON供activiti解析界面属性并应用,在ActivitiConfig中引入使用

CustomBpmnXmlConverter:用于xml与BPMN转换

CustomUserTaskJsonConverter:用户节点自定义扩展属性解析(xml与json互转)

CustomUserTaskXmlConverter:用户节点自定义扩展属性解析xml

ActivitiConfig:springboot整合activiti配置类

代码如下:

DefaultXmlParser :

import org.activiti.bpmn.converter.child.BaseChildElementParser;
import org.activiti.bpmn.model.*;import javax.xml.stream.XMLStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** xml自定义属性解析类 :实现解析指定节点下扩展字段xml节点**/
public class DefaultXmlParser extends BaseChildElementParser {//元素名称private String elementName;public DefaultXmlParser() {}public DefaultXmlParser(String elementName) {this.elementName = elementName;}public String getElementName() {return elementName;}/*** 解析指定节点下扩展字段xml节点* @param xtr               xml字节流读取器* @param parentElement     父节点对象* @param model             流程图模型对象* @throws Exception*/public void parseChildElement(XMLStreamReader xtr, BaseElement parentElement, BpmnModel model) throws Exception {Map<String, List<ExtensionElement>> map = parentElement.getExtensionElements();List<ExtensionElement> extensionElementList = new ArrayList<>();ExtensionElement extensionElement = new ExtensionElement();extensionElement.setName(getElementName());extensionElement.setElementText(xtr.getElementText());extensionElement.setNamespacePrefix("activiti");extensionElement.setNamespace("http://activiti.org/bpmn");extensionElementList.add(extensionElement);map.put(getElementName(), extensionElementList);}
}

CustomBpmnJsonConverter:

import org.activiti.bpmn.model.BaseElement;
import org.activiti.editor.language.json.converter.BaseBpmnJsonConverter;
import org.activiti.editor.language.json.converter.BpmnJsonConverter;import java.util.Map;/*** 自定义bpmn解析,用于转换BPMN与JSON供activiti解析界面属性并应用**/
public class CustomBpmnJsonConverter extends BpmnJsonConverter {/*** 获取bpmn组件解析map* @return*/public static Map<String,Class<? extends BaseBpmnJsonConverter>> getConvertersToBpmnMap(){return convertersToBpmnMap;}/*** 获取bpmn组件解析map* @return*/public static Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>>  getConvertersToJsonMap(){return convertersToJsonMap;}}

CustomBpmnXmlConverter:

import org.activiti.bpmn.converter.BpmnXMLConverter;/*** 自定义bpmn解析,用于xml转换成BPMN**/
public class CustomBpmnXmlConverter extends BpmnXMLConverter {static {// 添加自定义用户节点xml解析器addConverter(new CustomUserTaskXmlConverter());}
}

CustomUserTaskJsonConverter:用户节点自定义扩展属性解析(xml与json互转)

用到的常量为自定义属性名

import com.self.common.constant.activiti.ActivitiNodeConstant;
import com.self.common.utils.StringUtils;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import org.activiti.bpmn.model.*;
import org.activiti.editor.language.json.converter.BaseBpmnJsonConverter;
import org.activiti.editor.language.json.converter.UserTaskJsonConverter;import java.util.ArrayList;
import java.util.List;
import java.util.Map;/*** 用户节点自定义扩展属性解析(xml与json互转)*/
public class CustomUserTaskJsonConverter extends UserTaskJsonConverter {/*** xml => json* 将 xml格式的模型数据解析出来放入到节点的json自定义扩展属性中** @param propertiesNode* @param baseElement*/@Overrideprotected void convertElementToJson(ObjectNode propertiesNode, BaseElement baseElement) {super.convertElementToJson(propertiesNode, baseElement);//获取扩展属性并进行设置UserTask userTask = (UserTask) baseElement;Map<String, List<ExtensionElement>> map = userTask.getExtensionElements();for(String key : map.keySet()){List<ExtensionElement> extensionElementList = map.get(key);if (extensionElementList != null && extensionElementList.size() > 0) {propertiesNode.put(extensionElementList.get(0).getName(), extensionElementList.get(0).getElementText());}}}/*** json => xml* 将 json格式的模型数据解析出来放入到节点的自定义扩展属性中** @param elementNode* @param modelNode* @param shapeMap* @return*/@Overrideprotected FlowElement convertJsonToElement(JsonNode elementNode, JsonNode modelNode, Map<String, JsonNode> shapeMap) {FlowElement flowElement = super.convertJsonToElement(elementNode, modelNode, shapeMap);//解析UserTask userTask = (UserTask) flowElement;List<CustomProperty> cpList = new ArrayList<>();//是否为并行节点,常量为自定义属性名handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_PARALLEL);//是否可以AA跳handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK);//节点审批人为空是否跳过handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_APPROVAL_NULL_SKIP_TASK);//跳过节点时意见handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK_OPINION);//是否可以修改表单handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_ACTMODIFY_FROM);//附件是否必填handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_FILE_REQUIRED);//是否可以查看流转记录handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_RECORD);//是否可配置审批记录查看权限handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_RECORD_PERMISSIONS);//抄送用户handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_CC_USERS);//是否显示流程图handleCustomProperties(cpList, elementNode, ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_PNG);userTask.setCustomProperties(cpList);return userTask;}public static void fillTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap,Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {fillJsonTypes(convertersToBpmnMap);fillBpmnTypes(convertersToJsonMap);}public static void fillJsonTypes(Map<String, Class<? extends BaseBpmnJsonConverter>> convertersToBpmnMap) {convertersToBpmnMap.put(STENCIL_TASK_USER, CustomUserTaskJsonConverter.class);}public static void fillBpmnTypes(Map<Class<? extends BaseElement>, Class<? extends BaseBpmnJsonConverter>> convertersToJsonMap) {convertersToJsonMap.put(UserTask.class, CustomUserTaskJsonConverter.class);}/*** 处理自定义属性** @param cpList      自定义属性列表* @param elementNode 任务节点* @param key         自定义属性key*/private void handleCustomProperties(List<CustomProperty> cpList, JsonNode elementNode, String key) {String value = getPropertyValueAsString(key, elementNode);if (StringUtils.isNotBlank(value)) {CustomProperty cp = new CustomProperty();cp.setName(key);cp.setSimpleValue(value);cpList.add(cp);}}}

CustomUserTaskXmlConverter:用户节点自定义扩展属性解析xml

用到的常量为自定义属性名

import com.self.activiti.config.extension.DefaultXmlParser;
import com.self.common.constant.activiti.ActivitiNodeConstant;
import org.activiti.bpmn.converter.UserTaskXMLConverter;/*** 用户节点自定义扩展属性解析xml*/
public class CustomUserTaskXmlConverter extends UserTaskXMLConverter {public CustomUserTaskXmlConverter() {super();//是否为并行节点childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_PARALLEL, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_PARALLEL));//是否可以AA跳childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK));//节点审批人为空是否跳过childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_APPROVAL_NULL_SKIP_TASK, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_APPROVAL_NULL_SKIP_TASK));//跳过节点时意见childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK_OPINION, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_SKIP_TASK_OPINION));//是否可以修改表单childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACTMODIFY_FROM, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACTMODIFY_FROM));//附件是否必填childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_FILE_REQUIRED, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_FILE_REQUIRED));//是否可以查看流转记录childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_RECORD, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_RECORD));//是否可配置审批记录查看权限childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_RECORD_PERMISSIONS, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_RECORD_PERMISSIONS));//抄送用户childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_CC_USERS, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_CC_USERS));//是否显示流程图childParserMap.put(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_PNG, new DefaultXmlParser(ActivitiNodeConstant.CUSTOM_PROPERTIES_ACT_APPROVAL_PNG));}
}

ActivitiConfig:

重点在于下面这句:

import com.self.activiti.id.MyIdGenerator;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;import javax.sql.DataSource;/*** acitiviti配置类*/
@Configuration
public class ActivitiConfig  {@Autowiredprivate DataSource dataSource;@Autowiredprivate PlatformTransactionManager transactionManager;//流程配置,与spring整合采用SpringProcessEngineConfiguration这个实现@Beanpublic SpringProcessEngineConfiguration processEngineConfiguration(){SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();processEngineConfiguration.setDataSource(dataSource);processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfigurationImpl.DB_SCHEMA_UPDATE_TRUE);processEngineConfiguration.setDatabaseType(ProcessEngineConfigurationImpl.DATABASE_TYPE_MYSQL);processEngineConfiguration.setIdGenerator(new MyIdGenerator());processEngineConfiguration.setTransactionManager(transactionManager);processEngineConfiguration.setJobManager(new MyJobManager());//自定义任务管理// 将自定义用户任务组件bpmn解析替换activiti中用户任务组件默认解析CustomUserTaskJsonConverter.fillTypes(CustomBpmnJsonConverter.getConvertersToBpmnMap(), CustomBpmnJsonConverter.getConvertersToJsonMap());//        processEngineConfiguration.setJobExecutorActivate(true);//JobExecutor是管理几个线程计时器的组成部分,JobExecutor对多线程的处理较为笨重缓慢
//        processEngineConfiguration.setAsyncExecutorEnabled(true);//定义为true,使用AsyncExecutor代替默认的JobExecutor;processEngineConfiguration.setAsyncExecutorActivate(true);//定义为true,工作流引擎在启动时就建立启动AsyncExecutor线程//流程图字体processEngineConfiguration.setActivityFontName("宋体");processEngineConfiguration.setAnnotationFontName("宋体");processEngineConfiguration.setLabelFontName("宋体");return processEngineConfiguration;}//流程引擎,与spring整合使用factoryBean@Beanpublic ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration){ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);((ProcessEngineConfigurationImpl) processEngineConfiguration).setIdGenerator(new MyIdGenerator());return processEngineFactoryBean;}//八大接口@Beanpublic RepositoryService repositoryService(ProcessEngine processEngine){return processEngine.getRepositoryService();}@Beanpublic RuntimeService runtimeService(ProcessEngine processEngine){return processEngine.getRuntimeService();}@Beanpublic TaskService taskService(ProcessEngine processEngine){return processEngine.getTaskService();}@Beanpublic HistoryService historyService(ProcessEngine processEngine){return processEngine.getHistoryService();}@Beanpublic FormService formService(ProcessEngine processEngine){return processEngine.getFormService();}@Beanpublic IdentityService identityService(ProcessEngine processEngine){return processEngine.getIdentityService();}@Beanpublic ManagementService managementService(ProcessEngine processEngine){return processEngine.getManagementService();}@Beanpublic DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine){return processEngine.getDynamicBpmnService();}}

ActivitiNodeConstant:常量表

/*** activiti节点类型常量表**/
public class ActivitiNodeConstant {//会签节点名称后缀public static final String NODE_NAME_COUNTERSIGN_SUFFIX = "-会签";//流程节点类型 -- 互斥网关public static final String NODE_NAME_EXCLUSIVE_GATEWAY = "exclusiveGateway";//流程节点类型 -- 并行网关public static final String NODE_NAME_PARALLEL_GATEWAY = "parallelGateway";//流程节点类型 -- 包容网关public static final String NODE_NAME_INCLUSIVE_GATEWAY = "inclusiveGateway";//流程节点类型 -- 开始事件public static final String NODE_NAME_START_EVENT = "startEvent";//流程节点类型 -- 结束事件public static final String NODE_NAME_END_EVENT = "endEvent";//流程节点类型 -- 边界事件public static final String NODE_NAME_BOUNDARY_EVENT = "boundaryEvent";//流程节点类型 -- 用户任务public static final String NODE_NAME_USER_TASK = "userTask";//流程节点类型 -- 服务任务public static final String NODE_NAME_SERVICE_TASK = "serviceTask";//节点自定义属性 -- 是否为并行节点public static final String CUSTOM_PROPERTIES_PARALLEL = "isparallel";//节点自定义属性 -- 是否可以AA跳public static final String CUSTOM_PROPERTIES_SKIP_TASK = "skiptask";//节点自定义属性 -- 节点审批人为空是否跳过public static final String CUSTOM_PROPERTIES_APPROVAL_NULL_SKIP_TASK = "approvalnullskiptask";//节点自定义属性 -- 跳过节点时意见public static final String CUSTOM_PROPERTIES_SKIP_TASK_OPINION = "skiptaskopinion";//节点自定义属性 -- 是否可以修改表单public static final String CUSTOM_PROPERTIES_ACTMODIFY_FROM = "actmodifyfrom";//节点自定义属性 -- 附件是否必填public static final String CUSTOM_PROPERTIES_FILE_REQUIRED = "filerequired";//节点自定义属性 -- 是否可以查看流转记录public static final String CUSTOM_PROPERTIES_ACT_APPROVAL_RECORD = "actapprovalrecord";//节点自定义属性 -- 是否可配置审批记录查看权限public static final String CUSTOM_PROPERTIES_ACT_RECORD_PERMISSIONS = "actrecordpermissions";//节点自定义属性 -- 抄送用户public static final String CUSTOM_PROPERTIES_CC_USERS = "ccusers";//节点自定义属性 -- 是否显示流程图public static final String CUSTOM_PROPERTIES_ACT_APPROVAL_PNG = "actapprovalpng";}

使用方法:

1、读取xml文件,转为bpmnModel

private BpmnModel inputStream2Xml(InputStream inputStream) throws Exception {//读取xml文件XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader reader = factory.createXMLStreamReader(new InputStreamReader(inputStream, "UTF-8"));BpmnModel bpmnModel = new CustomBpmnXmlConverter().convertToBpmnModel(reader);// bpmnModel转jsonBpmnJsonConverter converter = new BpmnJsonConverter();converter.convertToJson(bpmnModel);return bpmnModel;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/258105.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中

LomBok的getset 与 直接代码里什么生成的区别 隐患 备注

kubernetes安装kubesphere

前置默认都安装了k8s&#xff0c;且k8s都正常 1、nfs文件系统 1.1、安装nfs-server # 在每个机器。 yum install -y nfs-utils# 在master 执行以下命令 echo "/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 执行以下命令&#xff0c;启动 …

java设计模式学习之【适配器模式】

文章目录 引言适配器模式简介定义与用途&#xff1a;实现方式&#xff1a;类型 使用场景优势与劣势适配器模式在Spring中的应用多媒体播放器示例代码地址 引言 在我们的日常生活中&#xff0c;适配器无处不在&#xff1a;无论是将不同国家的插头转换成本地标准&#xff0c;还是…

数学建模回归分析part2

回归系数的解释 思考: y b b1*Inx;此时b1怎么解释&#xff1f; 什么时候取对数 经验法则: &#xff08;1&#xff09;与市场价值相关的&#xff0c;例如&#xff0c;价格、销售额、工资等都可以取对数&#xff1b;&#xff08;2&#xff09;以年度量的变量&#xff0c;如受…

相控阵天线(十五):进阶稀疏阵列天线(边缘稀疏阵列、稀疏子阵天线、旋转稀疏子阵天线)

目录 简介圆形边缘稀疏阵列矩形边缘稀疏阵列稀疏子阵天线旋转稀疏子阵天线 简介 前面的博客已经介绍过常见的平面阵有一些基本类型&#xff0c;本篇博客介绍一些实际工程中可能出现的阵列&#xff0c;包括椭圆阵列、子阵通过矩形拼接形成的矩形大阵列和圆形大阵列、子阵通过三…

开源项目CuteSqlite开发笔记(二):SQLite的架构

在开发CuteSqlite图形客户端的时候&#xff0c;需要用到SQL的语法解释&#xff0c;来对SQL语句进行优化。找了很多的SQL语法解释器&#xff0c;都不是十分满意&#xff0c;只有翻开Sqlite的源码&#xff0c;看看SQLite对SQL语句的解释过程&#xff0c;本文是翻译的官方文档。 官…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》

这个标题涉及到一个涉及气体&#xff08;天然气&#xff09;和电力的综合能源配网系统&#xff0c;并且强调了考虑气电联合需求响应的协调优化运行。让我们逐步解读&#xff1a; 气电综合能源配网系统&#xff1a; 这指的是一个结合了气体&#xff08;通常是天然气&#xff09;…

柔性数组详解

目录 一、柔性数组的特点&#xff1a;​ 二、使用sizeof计算包含柔性数组的结构体的大小 三、柔性数组的使用 代码1: 四、用结构体指针代替柔性数组 代码2&#xff1a; 五、柔性数组与结构体指针对比 • 在结构体中 • 最后一个成员 • 未知大小的数组 这就是柔性…

吴恩达《机器学习》12-1:优化目标

在机器学习的旅程中&#xff0c;我们已经接触了多种学习算法。在监督学习中&#xff0c;选择使用算法 A 还是算法 B 的重要性逐渐减弱&#xff0c;而更关键的是如何在应用这些算法时优化目标。这包括设计特征、选择正则化参数等因素&#xff0c;这些在不同水平的实践者之间可能…

代码随想录算法训练营第三十八天|完全背包,518. 零钱兑换 II ,377. 组合总和 Ⅳ

完全背包 例题&#xff1a;有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 区别&#x…

机器学习硬件十年:性能变迁与趋势

本文分析了机器学习硬件性能的最新趋势&#xff0c;重点关注不同GPU和加速器的计算性能、内存、互连带宽、性价比和能效等指标。这篇分析旨在提供关于ML硬件能力及其瓶颈的全面视图。本文作者来自调研机构Epoch&#xff0c;致力于研究AI发展轨迹与治理的关键问题和趋势。 &…

小红书蒲公英平台开通后,有哪些注意的地方,以及如何进行报价?

今天来给大家聊聊当小红书账号过1000粉后&#xff0c;开通蒲公英需要注意的事项。 蒲公英平台是小红书APP中的一个专为内容创作者设计的平台。它为品牌和创作者提供了一个完整的服务流程&#xff0c;包括内容的创作、推广、互动以及转换等多个方面。 2.蒲公英平台的主要功能 &…