activiti工作流探索-学习笔记
经过了长时间的学习和探索,对activiti的工作流有了初步的认识,也积累下了些许经验分享给大家
不足之处以及建议欢迎指正~
开发环境:activiti5.22.0 springboot1.5.4
流程设计使用的是集成的activiti流程设计器
部署流程
/*** 发布模型为流程实例*/@ApiOperation(value = "发布模型为流程定义")@PostMapping("{id}/deployment")public R deploy(@PathVariable("id") String id) throws Exception {//获取模型RepositoryService repositoryService = processEngine.getRepositoryService();Model modelData = repositoryService.getModel(id);byte[] bytes = repositoryService.getModelEditorSource(modelData.getId());if (bytes == null) {return R.error("模型数据为空,请先设计流程并成功保存,再进行发布。");}JsonNode modelNode = new ObjectMapper().readTree(bytes);BpmnModel model = new BpmnJsonConverter().convertToBpmnModel(modelNode);if (model.getProcesses().size() == 0) {return R.error("数据模型不符要求,请至少设计一条主线流程。");}byte[] bpmnBytes = new BpmnXMLConverter().convertToXML(model);//发布流程String processName = modelData.getName() + ".bpmn20.xml";DeploymentBuilder deploymentBuilder = repositoryService.createDeployment().name(modelData.getName()).addString(processName, new String(bpmnBytes, "UTF-8"));Deployment deployment = deploymentBuilder.deploy();modelData.setDeploymentId(deployment.getId());repositoryService.saveModel(modelData);return R.ok();}
获取工作流流程模型列表(带分页):
/*** 获取流程model列表(分页)*/@RequestMapping(value = "/list", method = RequestMethod.POST)public TableResultResponse<Model> list(@RequestParam Map<String, Object> params) {int page = Integer.parseInt((String) params.get("page"));int limit = Integer.parseInt((String) params.get("limit"));Page<Object> result = PageHelper.startPage(page, limit);List<Model> list = repositoryService.createModelQuery().orderByCreateTime().desc().list();return new TableResultResponse<Model>(result.getTotal(), list);}
删除流程模型:
/*** 删除模型*/@DeleteMapping("{id}")@ApiOperation(value = "删除模型")public Object deleteModel(@PathVariable("id") String id) {RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.deleteModel(id);//删除模型repositoryService.deleteDeployment(id, true);//如果存在运行中的流程,级联删除设置为truereturn R.ok();}
工作流运行
public R startProcess() {String processDefinitionKey = "获取流程设计的key";ProcessInstance instance = null;//判断是否存在流程部署List<ProcessDefinition> list = processEngine.getRepositoryService().createProcessDefinitionQuery().processDefinitionKey(processDefinitionKey)//根据流程定义的key查询.list();if(list != null && list.size() > 0) {//启动流程实例(指定下级经办人)Map<String, Object> variables = new HashMap<String, Object>();variables.put("user", "获取下级经办人");instance = processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey, variables);} else {//流程未部署,或其他情况return R.ok("流程未部署,请检查流程定义").put("code", 500);}if(instance != null) {//流程启动成功System.out.println("流程实例id=" + instance.getProcessInstanceId());System.out.println("流程实例name=" + instance.getName());return R.ok().put("data", "流程启动成功");} else {return R.ok("未获取到流程实例,请检查是否发布!").put("code", 500);}}
流程启动的时候,可以动态指定下级经办人,或者不指定下级经办人而在流程设计中设置好,直接启动流程即可:
processEngine.getRuntimeService().startProcessInstanceByKey(processDefinitionKey);
流程删除
/*** 删除流程实例* @param processInstanceId*/@RequestMapping(value = "/deleteWf/{processInstanceId}", method = RequestMethod.DELETE)public void delete(@PathVariable("processInstanceId") String processInstanceId){runtimeService.deleteProcessInstance(processInstanceId, "删除流程实例原因");}
根据用户获取待办任务列表,或任务个数(接口中的userID为实际业务中assignee设置的为人员id)
/*** 根据用户ID获取用户待办任务个数*/public int taskCountByUserID(String userID) {int count = count = count + taskService.createTaskQuery().taskAssignee(userID).list().size();return count;}/*** 根据用户ID获取用户待办任务列表*/public List<Task> taskList(String userID) {//查询个人任务列表List<Task> taskList = taskService.createTaskQuery().taskAssignee(userID).list();return taskList;}
审批
@RequestMapping(value = "/complete/{taskID}", method = RequestMethod.GET)@ApiOperation("审批通过,添加信息")public R copmlete(@PathVariable("taskID") String taskID) {//查询是否有正在审批任务Task task = taskService.createTaskQuery().taskId(taskID).singleResult();if(task != null) {//完成审批任务taskService.complete(taskID);//如果需要传递参数的话 task.getProcessInstanceId()获取processInstanceId//runtimeService.setVariable(processInstanceId, "变量名", 参数);全局变量//taskService.setVariableLocal(taskID, "变量名", 参数);局部变量,该task下//添加批注的方法//taskService.addComment(taskID, processInstanceId, "批注信息"); }return R.ok("审批成功");}
驳回的流程设计需要节点的流转,设置好条件进行判断流转方向
会签(多实例)的设计,在该业务中设计的是多实例并行任务
将多实例任务设置为Parallel并行,设置参数变量,可以通过监听器将会签人员集合传递进来,也可以在上级节点指定参数传递
public class CompleteListener implements TaskListener {/*** */private static final long serialVersionUID = 1L;@Overridepublic void notify(DelegateTask delegateTask) {List<String> assigneeList = new ArrayList<String>();assigneeList.add("部门一");assigneeList.add("部门二");delegateTask.setVariable("assigneeList", assigneeList);}}
添加监听器设置会签人员集合
历史记录表的应用:
act_hi_actinst:历史节点信息表,审批节点的历史记录,可以获取历史活动节点的信息
act_hi_comment:历史审批记录表,可以获取审批批注信息
act_hi_procinst:历史流程实例表,可以获取历史流程实例的运行记录如是否结束,开始时间,结束时间等
act_hi_taskinst:历史任务信息表,可以获取历史任务的审批记录信息,审批人,审批时间
act_hi_varinst:历史流程变量表,可以获取历史流程实例下的流程变量信息,如存放的审批信息等
问题汇总
1. 获取审批批注信息问题
开发过程中,添加审批批注成功,但是部署生成环境是CentOS,发现存在获取乱码的情况
//获取批注信息
List<Comment> comments = processEngine.getTaskService().getTaskComments(historicActivityInstance.getTaskId());
Comment对象提供的api获取的是FULL_MSG_字段的blob类型文件信息,存在乱码现象,其中一种解决方式:
定义新的MyCommentEntity接收对象获取message信息
List<MyCommentEntity> myCommentEntities = new ArrayList<MyCommentEntity>();if(comments != null && comments.size() > 0) {//创建我们自己的list集合//为每一个查询到接口实现类复制属性到我们自己的类中,解析为前端JSON数据for(Comment comment :comments){//创建我们自己的类MyCommentEntity myCommentEntity = new MyCommentEntity();//属性复制,源属性为commentEntity, 目标属性为myCommentEntityBeanUtils.copyProperties(comment, myCommentEntity);//添加我们自己的类myCommentEntities.add(myCommentEntity);}//get批注信息即可//list.get(0).getMessage();}
MyCommentEntity实体类:
@Getter
@Setter
public class MyCommentEntity {private String id;private String userId;//用户名,对应的是act_hi_comment表的USER_ID_字段private Date date;private String taskId;//任务idprivate String processInstanceId;//流程定义idprivate String message;//审批信息private String fullMessage;}
activiti工作流探索-学习笔记相关推荐
- 【笔记整理】Activiti工作流的学习笔记
Activiti基础篇 1.什么是工作流 1.1 工作流简介 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是"使在多个参与者之间按照某种预定义的规则自动进 ...
- Activiti工作流框架学习笔记(一)
工作流的概念 先看下面两张图: 对以上两张图进行说明: 假设这两张图就是华谊兄弟的请假流程图 图的组成部分: 人物:范冰冰.冯小刚.王中军 事件(动作):请假.批准.不批准 通过以上分析我们就可以抽象 ...
- Android开发艺术探索学习笔记 第二章IPC
最近将之前工作做本地的学习笔记上传一下 这里是Android艺术开发探索的前三章内容 文章目录 1. android的多进程模式 2. IPC基础概念介绍 2.1 Serializable 2.2Pa ...
- html调用js函数_Java Web初学者探索学习笔记10—网络API的js数据接口调用解决方案...
声明:本学习笔记内容均为小蔡蜀黍亲自整理和原创,如需借引,请注明出处! 1. 时间戳转化为时间 1.1 时间转换函数准备 1.2 时间函数的具体使用 2. 远程js函数调用 调用的js为天天基金网的实 ...
- Activiti工作流框架学习(一)环境的搭建和数据表的了解
一.什么是工作流 工作流(Workflow),就是"业务过程的部分或整体在计算机应用环境下的自动化",它主要解决的是"使在多个参与者之间按照某种预定义的规则传递文档.信息 ...
- 达摩院视觉AI训练营-视觉AI技术应用探索-学习笔记
视觉生产技术目录 一.视觉生产定义 定义: 分类: 通用基础框架 五个关键维度 二.精细理解-寻微入里 分割抠图-难点: 分割抠图-解题思路: 分割抠图-模型框架: 分割抠图-人像抠图拓展: 分割抠图 ...
- Python数据分析与挖掘第三章数据探索学习笔记
一.数据质量分析: **意义:**数据质量分析是数据准备过程中重要的一环,是数据预处理的前提,也是数据挖掘分析结论有效性和准确性的基础. **主要任务:**检查原始数据中是否存在脏数据. **脏数据: ...
- ajax如何提交多表单的值_Java Web初学者探索学习笔记7—矛盾解决方案:表单标签验证与ajax提交...
这段时间前端开发过程中,关于<form>表单下的输入框信息验证和数据提交问题出现矛盾. 问题描述: 表单下利用<input type="text" pattern ...
- 学习笔记之-Activiti7工作流引擎,概述,环境搭建,类关系图,使用Activiti BPMN visualizer,流程变量,组任务 网关,Activiti整合Spring SpringBoot
本篇学习笔记是观看黑马程序员Activiti7视频而得 Activiti7 一.工作流介绍 1.1 概念 工作流(Workflow),就是通过计算机对业务流程自动化执行管理.它主要解决的是" ...
最新文章
- IOS开发基础知识--碎片45
- 机器学习中防止过拟合的处理方法
- Linux基本命令之ls
- LINQ系列:LINQ to SQL Exists/In/Any/All/Contains
- java的character用法_Java中Character类的使用方法
- 如何加大jvm的内存和tomcat的内存
- wince6-Error: failed PB timebomb check
- Intellij IDEA 14.x 菜单项中Compile、Make和Build的区别
- Linux运维六:用户管理及用户权限设置
- android 编程输入系统时间,基于android和PC的时间事件记录实践
- pix4d操作流程_Pix4d_mapper中文版操作手册.pdf
- 如何在Linux中安装/挂载CD-ROM
- Spring实战——FileSystemResource
- Uniswap进化之路
- Nature:阐明肿瘤代谢的脆弱性
- 在github上建立自己的网站
- win7系统计算机找不到u盘启动,联想f12后没有u盘启动怎么办_联想f12没有usb启动项如何解决-win7之家...
- cpu空载50度_单线程性能提升超50%!Arm新款服务器CPU要靠单核打天下?
- HDU 4513 吉哥系列故事――完美队形II(Manacher)
- hdu1512 Monkey King
热门文章
- 胡莱三国2服务器维护,《胡莱三国2》扫图挖宝独门秘籍
- 2022第8届广州民宿文化产业博览会
- android 百叶窗动画,Android 百叶窗折叠效果
- 华为EulerOS release 2.0(SP8)aarch64(arm架构)更新yum源操作
- Java微信支付——公众号支付JSAPI
- 初级程序员闲暇之余,应该如何提升自我?
- 习题5.2 从键盘输入n个数,求这n个数中的最大数与最小数并输出。
- 硬核卡牌链游Era7,必看全新评测与攻略
- 基于java网上童装销售系统计算机毕业设计源码+系统+lw文档+mysql数据库+调试部署
- collision domain - 冲突域