用处:审批流程的封装运用
多说无益,动手更加容易理解,下载官网activiti-app.war启动运行
从创建用户-编辑流程图-发布-最后测试的一条龙服务在下方连接中已展现的淋漓尽致
https://blog.csdn.net/lxxiang1/article/details/82284899
一顿操作之后现在已经基本有Activiti的概念了,那怎么运用到项目中呐?请继续往下撸
springboot+Activiti5.22
1.导入pom
<!--activiti end-->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-modeler</artifactId>
<version>${activiti.version}</version>
</dependency>
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-diagram-rest</artifactId>
<version>${activiti.version}</version>
</dependency>
<!--activiti end-->
2.配置数据库连接,及Activiti的Config类
@Configuration
public class Cfg_Activiti {
//流程配置,与spring整合采用SpringProcessEngineConfiguration这个实现
@Bean
public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager){
SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
processEngineConfiguration.setDataSource(dataSource);
//none省略数据库版本检查
processEngineConfiguration.setDatabaseTablePrefix("OYDGHR.");
processEngineConfiguration.setDatabaseSchemaUpdate("none");
processEngineConfiguration.setDatabaseType("postgres");
// dbIdentityUsed
processEngineConfiguration.setDbIdentityUsed(false);
processEngineConfiguration.setTransactionManager(transactionManager);
//流程图字体
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
return processEngineConfiguration;
}
//流程引擎,与spring整合使用factoryBean
@Bean
public ProcessEngineFactoryBean processEngine(ProcessEngineConfiguration processEngineConfiguration){
ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
processEngineFactoryBean.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
return processEngineFactoryBean;
}
//八大接口
@Bean
public RepositoryService repositoryService(ProcessEngine processEngine){
return processEngine.getRepositoryService();
}
@Bean
public RuntimeService runtimeService(ProcessEngine processEngine){
return processEngine.getRuntimeService();
}
@Bean
public TaskService taskService(ProcessEngine processEngine){
return processEngine.getTaskService();
}
@Bean
public HistoryService historyService(ProcessEngine processEngine){
return processEngine.getHistoryService();
}
@Bean
public FormService formService(ProcessEngine processEngine){
return processEngine.getFormService();
}
@Bean
public IdentityService identityService(ProcessEngine processEngine){
return processEngine.getIdentityService();
}
@Bean
public ManagementService managementService(ProcessEngine processEngine){
return processEngine.getManagementService();
}
@Bean
public DynamicBpmnService dynamicBpmnService(ProcessEngine processEngine){
return processEngine.getDynamicBpmnService();
}
//八大接口 end
}
配好之后运行自己的项目,此时Activiti框架源码activiti-engine-5.22.0.jar包中的db中create文件里面会
根据你ProcessEngineConfiguration.setDatabaseType()来根据你选择数据库类型执行对应的sql文件。
create table 。。。。ing
启动成功后去数据库浏览一下,25张表缺一不可
这些表都是干嘛的呐,结合以下链接学习
https://blog.csdn.net/hj7jay/article/details/51302829
3.数据库也准备好了可以开始编码了吗?
先解决流程图编辑发布的问题
找寻流程编辑工具或插件
(1)官网下载war,tomcat运行编辑流程图导出xml
(2)idea下载actiBPM插件,创建Bpmnfile文件编辑流程图,导出xml
话外音:可编辑流程直接保存数据库的demo已经准备好,https://github.com/DangerousPrayer/spring-boot-with-activiti.git
流程编辑发布后,可在ACT_GE_BYTEARRAY表中查看
4.此时外部工作已经就绪那就开始编码吧
先了解一下操作流程八大接口
(1)创建用户与用户组(这步操作其实该在编辑流程图前完成,因为编辑器的每个审批节点都需要配置审批人,
修改Assignment,选择id或者value,为了灵活一般都是配置候选人和候选人组),此时对应表的ACT_ID_USER、
ACT_ID_GROUP、ACT_ID_MEMBERSHIP已有数据
(2)启动实例流程(ACT_RU_TASK表会产生数据)
@Test
public void flowStart() throws Exception{
//启动流程实例,字符串"vacation"是BPMN模型文件里process元素的id
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacation");
System.out.println(processInstance.getId());
}
(3)启动流程之后,第一个流程节点审批人就可以获取自己的待审批列表
@Test
public void list(){
//查出当前登录用户所在的用户组
List<Group> groups = identityService.createGroupQuery()
.groupMember(String.valueOf("节点审批人ID")).list();
List<String> groupNames = groups.stream()
.map(group -> group.getName()).collect(Collectors.toList());
/**查询用户组的待审批流程列表
* SELECT DISTINCT *
* FROM
* ACT_RU_TASK RES
* INNER JOIN ACT_RU_IDENTITYLINK I
* ON I.TASK_ID_ = RES.ID_
* WHERE RES.ASSIGNEE_ IS NULL
* AND I.TYPE_ = 'candidate'
* AND I.GROUP_ID_ ='managerG';
* List<Task> tasks = taskService.createTaskQuery()
* .processDefinitionKey("vacation")
* .taskCandidateGroupIn(groupNames)
*/ .list();
//根据代理人或候选人获取待审批流程列表
// List<Task> assignedTasks = taskService.createTaskQuery()
// .processDefinitionKey("vacation")
// .taskCandidateOrAssigned("节点代理人或候选人ID")
// .list();
//根据流程实例ID查询申请表单数据
List<String> processInstanceIds = tasks.stream()
.map(task -> task.getProcessInstanceId())
.collect(Collectors.toList());
System.out.println(processInstanceIds);
}
(4)审批yesOrNo
@Test
public void yesOrNo(){
//查询当前审批节点
Task vacationAudit = taskService.createTaskQuery()
.taskId("12504").singleResult();
//前端接受的审批结果(同意,不同意)
Integer auditResult = 1;
if (auditResult == 1) {//审批通过
//设置流程参数:审批ID
Map<String, Object> args = new HashMap<>();
args.put("auditId", "4312");
//设置审批任务的执行人
taskService.claim(vacationAudit.getId(), "1");
//完成审批任务
taskService.complete(vacationAudit.getId(), args);
} else {
//审批不通过,结束流程
runtimeService.deleteProcessInstance(vacationAudit.getProcessInstanceId(), "4312");
}
}
ACT_RU_TASK更新下一个节点
特殊需求,为默认表添加前缀如OYDGHR.
1.需要定位到maven仓库org\activiti\activiti-engine\5.22.0
重写db下的sql,打jar替换原有的
2.在进行crud时操作的为db下的mapping,查看xml可知他支持添加前缀,设置processEngineConfiguration.setDatabaseTablePrefix("OYDGHR.")即可;