总体想法:
0:初始化用户和用户组
1 )上传并部署流程,启动流程
2 :创建流程实例
3 :获得我的任务
4、执行审批操作
5、获取审批详情
问题Activiti6版本与activiti7版本的最大区别:
activiti7集成spring security用户和用户组不提供与用户相关的表,如act_id_group、act_id_info和act_id_user
无法自动创建Activiti6问题2解决方案表。 url: jdbc:mysql://在末尾添加nullCatalogMeansCurrent=true
false:false是默认值,如果设置为此值,Activiti将在启动时与存储在数据库表中的版本进行比较,如果没有表或版本不匹配,则在启动时抛出异常。 true :如果设置为此值,Activiti将更新数据库中的所有表,如果表不存在,Activiti将自动创建。 create-drop:Activiti启动后,执行数据库表创建操作,Activiti关闭后,执行数据库表删除操作。 drop-create:Activiti启动时,执行数据库表删除操作。 Activiti关闭后,将执行数据库表创建操作。 spring.activiti.history-level=full
none :因为不存储任何历史数据,所以在流程运行时这是效率最高的。 活动:级别高于none,保存流程实例和流程行为,不保存其他数据。 audit--除了存储在activity级别的数据外,还存储所有流程任务及其属性。 审计是历史的默认值。 full :保存历史数据的最高级别。 它不仅存储audit级别的数据,还存储所有其他进程的详细数据。 包括几个工艺参数等,下面以整体的思路开始分析。
0 :初始化用户和用户组IdentityService:提供用户和用户组管理功能。 与典型的用户中心操作一样,IdentityService允许您初始化用户之间的关系。 建议与部门关联,并与部门关联
1 )上传和部署流程,RepositoryService)主要用于管理流程部署的数据
部署方法:
按路径部署: repository service.create deployment (.addclasspathresource ).deploy );
部署inputStream :存储库服务. create deployment (.add inputstream (filename,fileInputStream ).deploy );
按字符串部署: repository service.create deployment ().addString (名称)、xml内容
部署压缩包方法: repository service.create deployment (.addzipinputstream (newzipinputstream ) ).deploy );
. deploy (; //执行部署
确认启动是否成功。 存储库服务. createprocessdefinitionquery (.processdefinitionkey " key " ).count )。
装入进程资源:
存储库服务. createprocessdefinitionquery (
存储库服务. createprocessdefinitionquery ().listpage () 0,10 ) )。
删除部署:
存储库服务. delete deployment (部署id,true ); //deleteDeployment方法有两个参数。 第一个是部署ID,第二个参数true表示删除时,也会同时删除与流程相关的流程数据,包括正在运行和已退出的流程实例
激活过程: repository service.activateprocessdefinitionbyid (processdefinitionid,true,null );
挂起过程: repository service.suspendprocessdefinitionbyid (processdefinitionid,true,null );
2 )创建流程实例RuntimeService。 主要用于管理进程在运行时生成的数据(进程参数、事件、进程实例和运行流)和操作正在运行的进程的API
如何启动流程实例:
进程定义的密钥值: ru
ntimeService.startProcessInstanceByKey(”processDefinitionKey“,vars); 流程实例挂起:runtimeService.suspendProcessInstanceById(processInstanceId);
流程实例激活:runtimeService.activateProcessInstanceById(processInstanceId);
流程实例 验证:
验证流程实例是否启动成功:Assert.assertNotNull(processInstance);
验证是否挂起: 反之激活Assert.assertTrue(runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult().isSuspended());
流程实例查询:
RuntimeService中有createExecutionQuery方法可以得到一个ExecutionQuery对象,该对象就可以根据执行流的相关数据查询执行流
RuntimeService提供了一个createProcessInstanceQuery的对象,可以查询对应的流程实例信息
执行流的查询: runtimeService.createExecutionQuery().processDefinitionKey(processDefinitionKey).list();
根据流程定义Key值查询正在运行的流程实例: runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).list();
查询激活的流程实例:runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).active().list();
查询挂起的流程:runtimeService.createProcessInstanceQuery().processDefinitionKey(processDefinitionKey).suspended().list();
删除流程实例:runtimeService.deleteProcessInstance(processInstanceId,“删除测试”);
创建流程实例的时候建议自己新建一张表,以方便记录获取查询,比如记录关联部门,方便后期查询自己创建历史
3:获取我的任务 TaskService: 提供了运行时任务的查询、领取、完成、删除以及变量设置等功能
此处才是重中之重,我在此浪费了很多时间。那我就简单描述一哈,一般流程设置执行人分为几种,有直接指定,有指定变量,有指定用户组等多种方式,
如果直接指定执行人,setAssignee(“user”)这种模式是没有问题,相对于很多演示demo也是这种,但是变量形式指定或者用户组指定时会出现assignee字段为null,比如以下方式执行执行人时,map.put(“users”,“a,b,c”);“users”对应流程图中的candidate #{users},多人用“,”分割,Act_ru_task表中:assignee字段是空的
通过
taskService.createTaskQuery() .taskAssignee(String.valueOf(SecurityUtils.getUserId()))这种方式是获取不到数据,所以根据具体情况可以使用taskCandidateUser进行参与者,组任务查询,但是通过这种方式要注意一点,groupid,需要跟画流程图的时候指定的groupAssignee匹配的上,此处我也浪费了一些时间才整通
4,执行审批操作 if (task.getAssignee() == null) { taskService.claim(taskID,String.valueOf(String.valueOf(SecurityUtils.getUserId())));}if (hasVariables) { //带参数完成任务 taskService.complete(taskID,variables);} else { taskService.complete(taskID);}审批操作一般分为带参数完成,不带参数完成,如果是用户组任务,需要进行任务拾取,这里如果有兴趣的同学可以自行百度何为任务拾取。此处也建议新建一张表,存储审批意见,方便进行后期展示查询导出操作
5,获取审批详情HistoryService:获取正在运行或者已经运行结束的流程实例信息
获取审批详情分为两种:一种就是HistoryService查询历史
另一种就是上面所说的创建自己表记录的操作记录
下面两种不常用,有兴趣的同学可以自行了解,这里就不做阐述了
FormService:流程和状态Task均可关联相关的业务数据
ManagementService:提供对流程引擎的管理和维护的功能
知识扩展:有助于扩展ExecutionListener与TaskListener的区别:
public interface BaseExecutionListener extends Serializable { String EVENTNAME_START = "start"; String EVENTNAME_END = "end"; String EVENTNAME_TAKE = "take";}public interface BaseTaskListener extends Serializable { String EVENTNAME_CREATE = "create"; String EVENTNAME_ASSIGNMENT = "assignment"; String EVENTNAME_COMPLETE = "complete"; String EVENTNAME_DELETE = "delete"; String EVENTNAME_ALL_EVENTS = "all";}针对事件不同:根据代码块即可看出来
通知的代理不同:ExecutionListener:DelegateExecution 与TaskListener: DelegateTask
所遇问题org.activiti.engine.ActivitiException: Unknown property used in expression: ${FormProperty_3qipis2==0}
解决办法:taskService.complete(task.getId(),variables); 删除第三个参数true
taskService.complete(task.getId(),variables,true)
说明:taskId(对应act_ru_task中的id_),variables(下一次任务所需要的参数),localScope(存储范围:本任务)