Activiti中个人任务分配
分配任务负责人:
固定分配,每一个任务都是固定的人进行执行
表达式分配:
UEL表达式,统一表达式语言,在activiti当中支持两种形式,一种是value,另外一种是method形式
- 创建流程图,给每一个环节制定assignee值,通过UEL表达式分配任务负责人
- 流程部署
- 创建流程实例,制定任务执行人
value表达式分配
代码:
首先,先部署一个流程
1 /** 2 * 流程部署 3 * `act_ge_bytearray` 流程定义的资源信息,包含bpmn和png流程文件信息 4 * `act_re_deployment` 流程部署信息,包含流程名称,ID,Key等 5 * `act_re_procdef` 流程定义信息 6 */ 7 @Test 8 public void deployment(){ 9 //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration 10 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 11 //获取RepositoryService对象进行流程部署 12 RepositoryService repositoryService = processEngine.getRepositoryService(); 13 //进行部署,将对应的流程定义文件生成到数据库当中,作为记录进行保存 14 Deployment deployment = repositoryService.createDeployment() 15 .addClasspathResource("flowchart/process.bpmn") //加载流程文件 16 .addClasspathResource("flowchart/process.png") 17 .name("请假流程") //设置流程名称 18 .key("processKey") 19 .deploy(); //部署 20 21 //输出部署信息 22 System.out.println("流程名称:"+deployment.getName()); 23 System.out.println("流程ID:"+deployment.getId()); 24 System.out.println("流程Key:"+deployment.getKey()); 25 }
接下来,就可以在创建流程实例的把每个任务的执行人传过去了
1 /** 2 * 启动一个流程实例 3 */ 4 @Test 5 public void getInstance(){ 6 //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取RuntimeService 9 RuntimeService runtimeService = processEngine.getRuntimeService(); 10 //定义一个Map集合,存放assignee的值 11 Map<String,Object> assMap=new HashMap<>(); 12 assMap.put("assignee01","zhangsan"); 13 assMap.put("assignee02","lisi"); 14 assMap.put("assignee03","wangwu"); 15 assMap.put("assignee04","zhaoliu"); 16 //启动一个流程实例 17 ProcessInstance myProcess = runtimeService.startProcessInstanceByKey("myProcess", assMap); 18 System.out.println("流程实例Name:"+myProcess.getName()); 19 }
处理任务,进行查看,传入的值是否存在
1 /** 2 * 任务处理:当所有任务处理完毕,对应当前流程实例信息删除,但是可以在历史中查看到该信息 3 */ 4 @Test 5 public void completeTask(){ 6 //获取processEngine对象 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 RuntimeService runtimeService = processEngine.getRuntimeService(); 9 //获取一个TaskService对象 10 TaskService taskService = processEngine.getTaskService(); 11 //获取张三的任务 12 Task task = taskService.createTaskQuery().taskAssignee("zhangsan").processDefinitionKey("myProcess").singleResult(); 13 //任务审批 14 taskService.complete(task.getId()); 15 }
没有报错在数据库查看一下当前任务,到部门经理审批了,而且部门经理审批的负责人是lisi,证明使用表达式分配成功
流程变量
流程变量的含义:我们可以在业务系统和流程系统当中,通过流程变量来制定对应的分支,如:员工请假
请假天数<3那么部门经理审批后交给人事,如果=>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
流程变量的数据类型:
string,duble,boolean,short,long,Integer,binary,date日期
serializable,如果流程变量需要用到pojo当中的属性字段,则该pojo需要实现序列化接口
流程变量的作用域
1.默认情况下,流程变量存在整个流程实例当中,每一个环节都可以获取到该变量,称之为global,类似于Java全局变量
2.任务和执行实例仅仅是针对一个任务和一个执行实例范围,范围没有流程实例大,称为local 变量。类似于Java局部变量
流程变量案例:
请假天数<=3那么部门经理审批后交给人事,如果>3那么部门经理审批结束后交给总经理审批,总经理结束后交给任务
- 定义流程图,在流程线上设置流程变量的条件
- 流程部署
流程图
启动流程实例
测试请假天数为5天
1 /** 2 * 根据任务ID,设置流程变量 3 */ 4 @Test 5 public void runTask() { 6 //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取一个TaskService对象 9 TaskService taskService = processEngine.getTaskService(); 10 //查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程 11 /** 12 * taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值 13 * taskAssignee匹配规则:1.Assigned 14 */ 15 16 List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("myProcess").list(); 17 for (Task task : list) { 18 System.out.println("任务名称:" + task.getName()); 19 System.out.println("任务执行人:" + task.getAssignee()); 20 System.out.println("任务ID:" + task.getId()); 21 //设置流程变量 22 //天数 23 Integer day=5; 24 taskService.setVariable(task.getId(),"num",day); 25 //处理任务 26 taskService.complete(task.getId()); 27 System.out.println("流程实例ID:" + task.getProcessInstanceId()); 28 } 29 }
结果:运行成功
查看数据库的,当前任务是总经理审批
测试请假天数为2天
1 /** 2 * 根据任务ID,设置流程变量 3 */ 4 @Test 5 public void runTask() { 6 //获取ProcessEngine对象 默认配置文件名称:activiti.cfg.xml 并且configuration的Bean实例ID为processEngineConfiguration 7 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); 8 //获取一个TaskService对象 9 TaskService taskService = processEngine.getTaskService(); 10 //查询代办业务 createTaskQuery查询任务 taskCandidateOrAssigned查询任务执行者 processDefinitionKey:查询流程 11 /** 12 * taskCandidateOrAssigned匹配规则:1.Assigned 2.配置bpmn文件中定义的值 13 * taskAssignee匹配规则:1.Assigned 14 */ 15 16 List<Task> list = taskService.createTaskQuery().taskAssignee("lisi").processDefinitionKey("myProcess").list(); 17 for (Task task : list) { 18 System.out.println("任务名称:" + task.getName()); 19 System.out.println("任务执行人:" + task.getAssignee()); 20 System.out.println("任务ID:" + task.getId()); 21 //设置流程变量 22 //请假天数 23 Integer day=2; 24 taskService.setVariable(task.getId(),"num",day); 25 //处理任务 26 taskService.complete(task.getId()); 27 System.out.println("流程实例ID:" + task.getProcessInstanceId()); 28 } 29 }
结果:运行成功
查看数据库的当前任务是人事同意
注意问题:
1、如果UEL 表达式中流程变量名不存在则报错。
2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
3、如果UEL 表达式都不符合条件,流程结束
4、如果连线不设置条件,会走flow 序号小的那条线