Activiti7之流程变量

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     }        
测试请假天数为5天

结果:运行成功

查看数据库的,当前任务是总经理审批

 测试请假天数为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     }
测试请假天数为2天

结果:运行成功

查看数据库的当前任务是人事同意


注意问题:
1、如果UEL 表达式中流程变量名不存在则报错。
2、如果UEL 表达式中流程变量值为空NULL,流程不按UEL 表达式去执行,而流程结束 。
3、如果UEL 表达式都不符合条件,流程结束
4、如果连线不设置条件,会走flow 序号小的那条线

猜你喜欢

转载自www.cnblogs.com/wishsaber/p/12649687.html