如果你还不了解工作流那么可以参考以下内容
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包含网关
排他网关和并行网关的结合体。