目录
一、环境搭建(Spring Boot 2.x)
1.1 依赖配置
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring-boot-starter-basic</artifactId>
<version>5.22.0</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
1.2 配置文件
spring:
activiti:
database-schema-update: true
history-level: full
check-process-definitions: false
datasource:
url: jdbc:h2:mem:testdb
driverClassName: org.h2.Driver
username: sa
password:
二、流程定义与部署
2.1 创建BPMN文件(leave.bpmn)
<process id="leaveProcess" name="请假流程">
<startEvent id="start"/>
<userTask id="apply" name="提交申请" activiti:assignee="${applicant}"/>
<userTask id="managerApprove" name="经理审批" activiti:assignee="${approver}"/>
<exclusiveGateway id="exclusiveGw"/>
<sequenceFlow sourceRef="start" targetRef="apply"/>
<sequenceFlow sourceRef="apply" targetRef="managerApprove"/>
<sequenceFlow sourceRef="managerApprove" targetRef="exclusiveGw"/>
<endEvent id="end"/>
</process>
2.2 流程部署服务
@Service
public class ProcessService {
@Autowired
private RepositoryService repositoryService;
public void deployProcess(String bpmnPath) {
repositoryService.createDeployment()
.addClasspathResource(bpmnPath)
.deploy();
}
}
三、流程操作核心实现
3.1 启动流程实例
@Service
public class RuntimeService {
@Autowired
private org.activiti.engine.RuntimeService activitiRuntimeService;
public String startProcess(String processKey, String businessKey,
Map<String, Object> variables) {
return activitiRuntimeService.startProcessInstanceByKey(processKey,
businessKey, variables).getId();
}
}
3.2 查询待办任务
@Service
public class TaskService {
@Autowired
private org.activiti.engine.TaskService activitiTaskService;
public List<Task> getTasksByUser(String userId) {
return activitiTaskService.createTaskQuery()
.taskAssignee(userId)
.list();
}
}
四、审批流程处理
4.1 通过审批
public void completeTask(String taskId, Map<String, Object> variables) {
activitiTaskService.complete(taskId, variables);
}
4.2 驳回流程
public void rejectTask(String taskId, String targetTaskKey) {
Task currentTask = activitiTaskService.createTaskQuery()
.taskId(taskId).singleResult();
activitiRuntimeService.createProcessInstanceModification(currentTask.getProcessInstanceId())
.cancelActivityInstance(currentTask.getExecutionId())
.startBeforeActivity(targetTaskKey)
.execute();
}
4.3 撤回流程
public void withdrawProcess(String processInstanceId) {
activitiRuntimeService.deleteProcessInstance(processInstanceId, "用户撤回");
}
五、流程状态管理
5.1 流程历史查询
public List<HistoricActivityInstance> getHistory(String processInstanceId) {
return historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstanceId)
.orderByHistoricActivityInstanceStartTime().asc()
.list();
}
5.2 流程图生成
public InputStream generateDiagram(String processInstanceId) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(
processInstance.getProcessDefinitionId());
return processDiagramGenerator.generateDiagram(bpmnModel, "png",
runtimeService.getActiveActivityIds(processInstanceId));
}
六、完整流程示例
6.1 请假流程时序图
七、常见问题解决方案
7.1 流程版本控制
public List<ProcessDefinition> getProcessVersions(String processKey) {
return repositoryService.createProcessDefinitionQuery()
.processDefinitionKey(processKey)
.orderByProcessDefinitionVersion().desc()
.list();
}
7.2 流程变量管理
// 设置变量
taskService.setVariable(taskId, "approveComment", "同意申请");
// 获取变量
String comment = (String) taskService.getVariable(taskId, "approveComment");
结语
最佳实践建议:
- 使用
@Transactional
注解保证流程操作与业务数据