activiti实例,要求每段代码都有解释,包含完整的流程,提交,同意,驳回,完成
时间: 2023-07-16 09:15:59 浏览: 166
Activiti是一个开源的BPMN(Business Process Model and Notation)工作流引擎,可以帮助我们轻松地设计、实现和执行复杂的业务流程。下面我们来介绍一下Activiti实例中的完整流程,包括提交、同意、驳回和完成。
1. 提交
首先,我们需要在Activiti中定义一个流程。流程定义是一个XML文件,它描述了流程中的各个环节、任务、决策等信息。下面是一个简单的流程定义示例:
```
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL BPMN20.xsd"
id="definitions">
<process id="myProcess" name="My Process">
<startEvent id="start" name="Start"></startEvent>
<userTask id="task1" name="Task 1"></userTask>
<endEvent id="end" name="End"></endEvent>
<sequenceFlow id="flow1" sourceRef="start" targetRef="task1"></sequenceFlow>
<sequenceFlow id="flow2" sourceRef="task1" targetRef="end"></sequenceFlow>
</process>
</definitions>
```
上面的流程定义中包含了一个开始事件、一个用户任务和一个结束事件。当一个流程实例启动时,它会从开始事件开始执行,然后进入用户任务,最后完成结束事件。在用户任务中,我们可以指定任务的处理人或处理组。
为了启动一个流程实例,我们需要通过Activiti的API提交一个流程申请。下面是一个Java代码示例:
```
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
Map<String, Object> variables = new HashMap<>();
variables.put("applicant", "John Doe");
variables.put("reason", "Vacation");
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess", variables);
```
在上面的代码中,我们首先获取了Activiti的流程引擎实例,然后获取了运行时服务对象。接着,我们创建了一个Map对象,用于存储流程变量。这里我们指定了申请人和请假原因两个变量。最后,我们通过流程引擎的API启动了一个流程实例,并传递了流程变量。
2. 同意
当一个用户任务被分配给某个处理人或处理组时,处理人可以通过Activiti的任务服务对象来处理任务。下面是一个Java代码示例:
```
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().taskAssignee("kermit").singleResult();
if (task != null) {
Map<String, Object> taskVariables = new HashMap<>();
taskVariables.put("approved", true);
taskService.complete(task.getId(), taskVariables);
}
```
在上面的代码中,我们首先获取了Activiti的任务服务对象。接着,我们通过任务查询API获取了待处理的任务。这里我们假设任务被分配给了名为“kermit”的用户。如果找到了待处理的任务,我们就可以通过任务服务对象来完成该任务。在完成任务时,我们可以传递任务变量,这里我们指定了一个名为“approved”的变量,表示任务已经被同意了。
3. 驳回
当一个用户任务被处理人驳回时,处理人可以通过Activiti的任务服务对象来撤销自己的处理结果。下面是一个Java代码示例:
```
TaskService taskService = processEngine.getTaskService();
Task task = taskService.createTaskQuery().taskAssignee("kermit").singleResult();
if (task != null) {
Map<String, Object> taskVariables = new HashMap<>();
taskVariables.put("approved", false);
taskVariables.put("reason", "Not enough information");
taskService.complete(task.getId(), taskVariables);
}
```
在上面的代码中,我们首先获取了Activiti的任务服务对象。接着,我们通过任务查询API获取了待处理的任务。这里我们假设任务被分配给了名为“kermit”的用户。如果找到了待处理的任务,我们就可以通过任务服务对象来撤销任务的处理结果。在撤销任务时,我们可以传递任务变量,这里我们指定了一个名为“approved”的变量,表示任务已经被驳回了,以及一个名为“reason”的变量,表示驳回的原因。
4. 完成
当一个流程实例经过一系列用户任务的处理后,最终会结束。在流程结束时,我们可以通过Activiti的历史服务对象来查询流程实例的详细信息。下面是一个Java代码示例:
```
HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstance.getId())
.singleResult();
if (historicProcessInstance != null) {
System.out.println("Process instance completed: " + historicProcessInstance.getEndTime());
}
```
在上面的代码中,我们首先获取了Activiti的历史服务对象。接着,我们通过历史查询API查询了指定ID的流程实例。最后,我们输出了该流程实例的结束时间。注意,当一个流程实例结束时,它的所有任务和变量都会被保存到Activiti的历史数据库中,可以通过历史服务对象来查询。
阅读全文