Activiti进阶篇

一、使用EL表达式进行指定流程处理人

在流程部署之后,启动流程的时候进行runtimeService.startProcessInstanceByKey(processDefinitionKey, map)指定map集合。

/**
 * 启动流程实例
 * act_hi_actinst  流程实例执行历史
 * act_hi_identitylink 流程参与用户信息历史
 * act_hi_taskins 任务实例历史信息
 * act_ru_execution 流程执行的信息
 * act_ru_identitylink 流程参与者信息
 * act_ru_task 任务信息
 *
 */
@Test
public void startProcess() {
    //1、创建流程ProcessEngine
    ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

    //2、获取流程RuntimeService服务
    RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();

    //定义处理人为EL表达式,需要对map集合中的【EL表达式】进行存储
    Map<String, Object> map = new HashMap<>();
    map.put("assign0", "Tom");
    map.put("assign1", "Jerry");
    map.put("assign2", "James");

    //3、根据流程定义的id启动流程
    ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);

    System.out.println("流程定义ID" + ins.getProcessDefinitionId());
    System.out.println("流程实例ID" + ins.getId());
    System.out.println("活动的ID" + ins.getActivityId());
}

指定assign的时候,使用定义的map的key即可。
在这里插入图片描述

二、使用监听器设置负责人

delegateTask.getName():表示用户任务节点
delegateTask.getEventName():表示用户在什么事件执行该监听器

/**
 * Activiti监听器
 */
public class MyTaskListener implements TaskListener {

    /**
     * 使用监听器指定负责人
     * @param delegateTask
     */
    @Override
    public void notify(DelegateTask delegateTask) {
        if ("经理审批".equals(delegateTask.getName()) &&
        "create".equals(delegateTask.getEventName())) {
            delegateTask.setAssignee("Tom");

        }
    }
}

需要在bpmn文件中定义taskListener标签, event表示:在创建用户任务的时候执行监听器【有create、assignment、complete、delete】。

<userTask id="sid-67d434c8-7cfe-45e3-a548-bc9cee04d4e1" name="经理审批">
  <documentation/>
  <extensionElements>
    <activiti:taskListener event="create" class="com.act.activiti.listener.MyTaskListener">
    </activiti:taskListener>
  </extensionElements>
</userTask>

三、设置流程变量

1、启动时设置流程变量
① 首先定义实体类用于封装变量信息

/**
 * 出差申请流程变量对象
 * 一定要实现Serializable序列化接口
 */
@Data
public class EvectionVo implements Serializable {

    /**
     * 主键
     */
    private String id;

    /**
     * 出差天数
     */
    private Integer num;

    /**
     * 出差单
     */
    private String evectionName;

    /**
     * 起始日期
     */
    private Date beginDate;

    /**
     * 结束日期
     */
    private Date endDate;

}

② 编写启动流程信息

public void startProcess() {
      //1、创建流程ProcessEngine
      ProcessEngine defaultProcessEngine = ProcessEngines.getDefaultProcessEngine();

      //2、获取流程RuntimeService服务
      RuntimeService runtimeService = defaultProcessEngine.getRuntimeService();

      //3、根据流程定义的id启动流程
      ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);*/

      Map<String, Object> map = new HashMap<>();
      EvectionVo evectionVo = new EvectionVo();
      evectionVo.setNum(1);
      map.put("evection", evectionVo);
      ProcessInstance ins = runtimeService.startProcessInstanceByKey("MyEvection", map);

      System.out.println("流程定义ID" + ins.getProcessDefinitionId());
      System.out.println("流程实例ID" + ins.getId());
      System.out.println("活动的ID" + ins.getActivityId());
  }

③ Condition expression填写:定义时定义的变量名
在这里插入图片描述

2、任务办理时设置流程变量

public void completTask() {
    //任务id
    String key = "myEvection2";
    // 任务负责人
    String assingee = "张三";
    // 获取processEngine
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    // 创建TaskService
    TaskService taskService = processEngine.getTaskService();
    // 创建变量集合
    Map<String, Object> map = new HashMap<>();
    // 创建出差pojo对象
    Evection evection = new Evection();
    // 设置出差天数
    evection.setNum(2d);
    // 定义流程变量
    map.put("evection", evection);
    // 完成任务前,需要校验该负责人可以完成当前任务
    // 校验方法:
    // 根据任务id和任务负责人查询当前任务,如果查到该用户有权限,就完成
    Task task = taskService.createTaskQuery()
            .processDefinitionKey(key)
            .taskAssignee(assingee)
            .singleResult();
    if (task != null) {
        //完成任务是,设置流程变量的值
        taskService.complete(task.getId(), map);
        System.out.println("任务执行完成");
    }
}

3、设置global变量参数【办理时设置】

public void setGlobalVariableByExecutionId(){
	// 当前流程实例执行 id,通常设置为当前执行的流程实例
	String executionId="2601";
	// 获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	// 获取RuntimeService
	RuntimeService runtimeService = processEngine.getRuntimeService();
	// 创建出差pojo对象
	Evection evection = new Evection();
	// 设置天数
	evection.setNum(3d);
	// 通过流程实例 id设置流程变量
	runtimeService.setVariable(executionId, "evection", evection);
	// 一次设置多个值
	// runtimeService.setVariables(executionId, variables)
}

4、设置global变量参数【通过当前任务设置】

public void setGlobalVariableByTaskId(){
	//当前待办任务id
	String taskId="1404";
	// 获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = processEngine.getTaskService();
	Evection evection = new Evection();
	evection.setNum(3);
	//通过任务设置流程变量
	taskService.setVariable(taskId, "evection", evection);
	//一次设置多个值
	//taskService.setVariables(taskId, variables)
}

5、设置local变量参数【办理时设置】

public void completTask() {
	//任务id
	String taskId = "1404";
	// 获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = processEngine.getTaskService();
	// 定义流程变量
	Map<String, Object> variables = new HashMap<String, Object>();
	Evection evection = new Evection ();
	evection.setNum(3d);
	// 定义流程变量
	Map<String, Object> variables = new HashMap<String, Object>();
	// 变量名是holiday,变量值是holiday对象
	variables.put("evection", evection);
	// 设置local变量,作用域为该任务
	taskService.setVariablesLocal(taskId, variables);
	// 完成任务
	taskService.complete(taskId);
}

6、设置local变量参数【通过当前任务设置】

public void setLocalVariableByTaskId(){
	// 当前待办任务id
	String taskId="1404";
	// 获取processEngine
	ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
	TaskService taskService = processEngine.getTaskService();
	Evection evection = new Evection ();
	evection.setNum(3d);
	// 通过任务设置流程变量
	taskService.setVariableLocal(taskId, "evection", evection);
	// 一次设置多个值
	//taskService.setVariablesLocal(taskId, variables)
}

四、组任务设置

1、查询组任务
在流程定义的时候指定 Assign 为多人
在这里插入图片描述
主要代码:taskCandidateUser(“Tom”);
到act_ru_identitylink中查询候选人数据

/**
 * 查询组任务
 */
@Test
public void getGroupTask() {
    ProcessEngineConfiguration processEngineConfigurationFromResource = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
    ProcessEngine processEngine = processEngineConfigurationFromResource.buildProcessEngine();
    TaskService taskService = processEngine.getTaskService();
    List<Task> taskList = taskService.createTaskQuery()
            .processDefinitionKey("MyEvection-groupTask")
            .taskCandidateUser("Tom")  //根据候选人查询任务
            .list();

    for (Task task : taskList) {
        System.out.println("任务负责人ID" + task.getAssignee());
        System.out.println("任务ID" + task.getId());
        System.out.println("流程实例ID" + task.getProcessInstanceId());
        System.out.println("===============================");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值