activiti7使用总结
前言
Activiti作为工作流(workflow)多种实现方案中较为常用的一种,常用的还有Alred和ASPNET,因为这次项目选取activiti7作为技术栈,另外的几种实现方案倒是没有去过多的研究。
这次项目开发阶段已基本结束,现在这里总结记录一下使用经验和一些业务实现方案,供大家参考以及自己回头回顾。写到这里我就不得不要吐槽一下activiti官方了,我项目从调研期到开发期结束,一直都没有找到一个正儿八经的Activiti7文档,我一般都是参考这activiti6的文档进行开发的。
关键词
- 工作流 : 一个具有表单数据并可根据此表单进行由电脑自动化或半自动化推进的业务流程,可以被称之为工作流。
- Activiti: java的工作流引擎,具备了对具体工作流程业务的从定义到部署和使用的一些列操作,基本上我们只需要提供好对应的表单和bpmn流程图,就可以运行此业务。
常用Service一览
这里引用了一下Activiti6官网的架构图,Activiti7中删去
IdentityService
和FormService
两个旧service新增了ProcessRuntie
和TaskRuntime
两个RuntimeService的分支操作。关于这两个新增Service,官网倒是有几个简单的例子,官网事例。有兴趣的可以去看一下,我在开发中倒是遇到了让人头大的问题,这两个新的service无法使用。
关于注入的方式这里不想写那么多,拉依赖,做Security配置等相关的设置这里写也没多大意义,大家可以去官网或者其他博客或者视频中看一下。
篇幅有点大,不想在我这里搬砖了,给大家一点连接
基本入门:黑马的入门视频(预计时间一天左右)
Activiti7表结构:前辈们总结的表结构注释(学习过程中方便查看)
TaskService
主要是一些关于 任务(task) 的查询以及管理
主要功能:
- “同意”一个任务特别核心的一个应用
- 删除一个任务,没什么用,我基本上没用过。但有考虑到,在或签的拒绝流程中可以测试一下,有可能优化或签流程中的拒绝。
- 获取task查询条件构造器,比较常用
可以根据一些限制条件查询一些task,比如非常核心的一个,查询我的待办,// 创建Query TaskQuery taskQuery = taskService.createTaskQuery(); // 添加筛选条件--- 获取某人 ,在某公司,的某项请假流程列表 List<Task> list = taskQuery.taskAssignee("审批人:注意是字符串") .processDefinitionKey("流程key:比如 ”请假“ , ”审批“ 之类的") .processInstanceBusinessKey("业务id :我项目中这个键是用来表示流程所属的企业ID") .list(); // ------- 获取某项实例自己改审批的task Task task = taskQuery.processInstanceId("流程的实例Id") .taskAssignee("审批人") .processInstanceBusinessKey("企业Id") .singleResult();
RuntimeService
特别要注意,这个service能做到的非常的多,但注意是运行时,其所能查询到的都是正在运行的各种信息。
-
变量操作(运行时变量)
// 设置和删除 全局变量 Map<String, Object> processInstanceVarMap = runtimeService.getVariables("processInstanceId"); runtimeService.setVariable("processInstanceId","key","value"); runtimeService.removeVariable("processInstanceId", "key"); // 设置和删除 task本地变量 HashMap<String, Object> variableMap= new HashMap<>(); Map<String, Object> taskVarMap = runtimeService.getVariablesLocal("taskId"); runtimeService.setVariablesLocal("taskId", variableMap); runtimeService.removeVariableLocal("taskId","key");
-
流程创建
// 设置发起人 ,因为Security,这样可以让流程的start——by变为自己想要的设置的。 Authentication.setAuthenticatedUserId(SecurityUtils.getCurrentUserId().toString()); ProcessInstance start = runtimeService.createProcessInstanceBuilder() .variables(variableMap) .name("某某某 提交的 某某流程") //流程的title // .processDefinitionId("processDefinitionId") .businessKey("根据项目特性,进行相关的设置") .processDefinitionKey("请假") .start();
-
(正在运行的)流程查询
runtimeService.createProcessInstanceQuery() .processInstanceId("") // 可以限定获取莫一条流程 .variableValueEquals("key","value") .processInstanceBusinessKey("请假") .singleResult();
待续2021年4月3日15:57:05