Activiti7--进阶学习

如果你还不了解工作流那么可以参考以下内容
https://blog.csdn.net/weixin_68693132/article/details/140456307

一、理解性概念

1.流程定义(ProcessDefinition):对一张图部署的一次,类似于一个类

2.流程实例(ProcessInstance):对流程定义的实现,类似对象

3.任务(Task):一个流程实例中的任务节点,根据流程图中的步骤,每一个节点都是一个任务,同一个流程实例中,不加入网关的情况下,只会存在一个任务

二、流程定义

2.1查询

  //创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取仓库服务
    RepositoryService repositoryService = processEngine.getRepositoryService();


    //获取流程定义集合
    List<ProcessDefinition> processDefinitionList = repositoryService
            .createProcessDefinitionQuery()
            .processDefinitionKey("leaveProcess")//根据名查
            .list();
//由于可能出现多次部署同一个key的流程图,所以查到的可能不是一个流程定义

2.2删除

//流程部署Id
    String deploymentId = "10001";
    //创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取仓库服务
    RepositoryService repositoryService = processEngine.getRepositoryService();


    //删除流程定义,如果该流程定义已有流程实例启动则删除时出错
    repositoryService.deleteDeployment(deploymentId);
    //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设置为false非级别删除方式,如果流程
    //repositoryService.deleteDeployment(deploymentId,true);

2.3流程资源下载

//下载前提:部署时添加了图片或者bpmn文件--
				Deployment deployment = repositoryService.createDeployment().
                addClasspathResource("bpmn/leaveProcessclaim.bpmn20.xml").
                addClasspathResource("bpmn/leaveDown.png").
                deploy();

//下载
//获取流程定义,也可以获取list,然后get(0)获取最新的definition
	//获取部署ID--getDeploymentId()
    String deploymentId = definition.getDeploymentId();
	//获取bpmn的输入流--获取文件路径--getResourceName()
    InputStream bpmnInput = repositoryService.getResourceAsStream(
                                        deploymentId,
                                        definition.getResourceName());
    //获取png的输入流--获取png路径--getDiagramResourceName()
    InputStream pngInput = repositoryService.getResourceAsStream(
                                        deploymentId,
                                        definition.getDiagramResourceName());


    //设置bpmn输入
    FileOutputStream bpmnOutPut = new FileOutputStream("D:/leave.bpmn");
    //设置png输入
    FileOutputStream pngOutPut = new FileOutputStream("D:/leave.png");
    IOUtils.copy(bpmnInput,bpmnOutPut);
    IOUtils.copy(pngInput,pngOutPut);

三、流程实例

3.1businessKey

3.1.1解释:每个流程实例独有的标识

​ 例如:存在一个请假流程定义,张三想请假,申请了一个流程实例,为其添加了唯一性标识bussinessKey为张三,同时李四也想请假,根据流程定义,也申请了一个流程实例,为其添加bussinessKey为李四,这样两个流程实例就可以根据businessKey来分辨

3.1.2使用–在启动流程实例的时候startProcessInstanceByKey(“流程定义key”,“bussinessKey”)
	String businessKey = "唯一性标识";
	//创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取RuntimeService对象
    RuntimeService runtimeService = processEngine.getRuntimeService();
    //根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
    //在启动流程的时候将业务key加入进去
    ProcessInstance instance = runtimeService
            .startProcessInstanceByKey("leaveProcess",businessKey);
3.1.3获取–先获取任务id,根据任务id获取流程实例对象,然后通过实例对象获取businessKey
	//创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取TaskService
    TaskService taskService = processEngine.getTaskService();
    //获取RuntimeService
    RuntimeService runtimeService = processEngine.getRuntimeService();
 	//获取任务集合
    List<Task> taskList = taskService.createTaskQuery()
            .processDefinitionKey("leaveProcess")
            .taskAssignee(assignee)
            .list();
 	//遍历任务列表
    for(Task task:taskList){
        //根据任务上的流程实例Id查询出对应的流程实例对象,从流程实例对象中获取BusinessKey
    	ProcessInstance instance = runtimeService
                .createProcessInstanceQuery()
                .processInstanceId(task.getProcessInstanceId())
                .singleResult();
        System.out.println("业务key:"+instance.getBusinessKey());
    }

3.2分配负责人

3.2.1 固定分配

在流程图中指定负责人

3.2.2 uel表达式分配

将原本固定分配负责人的name通过表达式 **${负责人}**来代替固定负责人

然后在流程启动时指定负责人名称

流程图xml文件

  <userTask id="sid-8cf6d0bf-4553-45d1-906b-7d40e41fdadd" name="部长审批" activiti:assignee="${assignee0}"/>
    <userTask id="sid-1bc4f96a-c010-42dd-949c-70086561fc67" activiti:assignee="${assignee1}" name="人事审批"/>

Java代码

 //创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取RuntimeService对象
    RuntimeService runtimeService = processEngine.getRuntimeService();


    Map<String,Object> variables  = new HashMap<String, Object>();
    variables.put("assignee0","zhangsan");
    variables.put("assignee1","lisi");
    //根据流程定义的key启动流程实例,这个key是在定义bpmn的时候设置的
    ProcessInstance instance = runtimeService
            .startProcessInstanceByKey("leaveProcess",variables);

3.3任务候选人CandidateUsers

3.3.1设置任务候选人

流程图中不填写负责人,设置CandidateUsers,多个候选人用逗号隔开

3.3.2部署+启动
3.3.3查询
//假设某任务有候选人为--张三,李四
	//创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取TaskService
    TaskService taskService = processEngine.getTaskService();

 	//获取任务集合
 	List<Task> taskList = taskService.createTaskQuery()
            .processDefinitionKey("leaveCandidateProcess")
            .taskCandidateUser("张三")
            .list();
//此时通过张三或者李四都可以拿到这个任务,从而进一步对任务进行操作
3.3.4 候选人领取任务
//通过上面的方式拿到一个具体的任务,一个!!!然后通过任务获取任务的id

	//创建ProcessEngine对象
    ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
    //获取TaskService
    TaskService taskService = processEngine.getTaskService();
	//领取任务
    taskService.claim("任务id","任意候选人name");

3.4 流程变量–类似于分配负责人中的UEL表达式

一般用于分支语句,例如 请假事件小于三天需要部门经历审核,若大于三天则需要总经理审核,在流程图中添加变量

${day},然后在启动流程的时候添加数据

3.5网关

3.5.1排他网关–分支

排他网关只会选择一个为true的分支执行(即使有两个分支条件都为true,排他网关也只会选择一条分支去执行,选择序号小的路径执行)。

3.5.2并行网关

允许将流程分成多条分支,也可以把多条分支汇聚到一起–执行任务有分支会产生两个任务,都通过之后才会继续执行

并行网关不会解析条件。即使顺序流中定义了条件,也会被忽略

3.5.3包含网关

排他网关和并行网关的结合体。

  • 23
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值