ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
RepositoryService repositoryService = processEngine.getRepositoryService();
TaskService taskService = processEngine.getTaskService();
ManagementService managementService = processEngine.getManagementService();
IdentityService identityService = processEngine.getIdentityService();
HistoryService historyService = processEngine.getHistoryService();
FormService formService = processEngine.getFormService();
1.将Activiti提供的流程设计器应用activiti-app.war部署到Tomcat的webapps目录。
2.创建新的MySql数据库。修改activiti-app\WEB-INF\classes\META-INF\activiti-app目录下的db.properties配置文件改成使用MySql数据库(默认使用H2内存数据库,创建的模型重启后会丢失)。
3.开浏览器输入http://localhost:8080/activiti-explorer,使用用户kermit,密码kermit登录
流程创建,并部署
流程信息如下:
发起申请,分别 是1天 和4天
把系统用户转换成activiti用户
User user=identityService.newUser(*sysUser.getLoginName()*);
user.setLastName(*sysUser.getUserName()*);
user.setFirstName*(sysUser.getUserName()*);
user.setEmail(*sysUser.getEmail()*);
identityService.saveUser(user);
Group group = identityService.newGroup(*idGroup.getId()*);
group.setName(*idGroup.getName()*);
group.setType(*idGroup.getType()*);
identityService.saveGroup(group);
//查出当前登录用户所在的用户组
List groups = identityService.createGroupQuery()
.groupMember(String.valueOf(getLoginName())).list();
List groupNames = groups.stream()
.map(group -> group.getId()).collect(Collectors.toList());
if (groups == null){
return null;
}
//查询用户组的待审批请假流程列表
List tasks = taskService.createTaskQuery()
//指定任务
//.processDefinitionKey(ActConstant.ProcessInstance_QingJia)
.taskCandidateGroupIn(groupNames)
.listPage(pageDomain.getPageNum() - 1, pageDomain.getPageSize());
//获取下个节点 信息
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(newOaTask.getProcessInstanceId()).singleResult();
if(pi==null){
log.info("insertLeaveApply 流程 {} 结束" ,id);
}else{
Task nextTask = taskService.createTaskQuery().processInstanceId(pi.getId()).singleResult();
log.info("insertLeaveApply 流程 {} 进行中 ,下个任务 {}",id,nextTask.getId());
}
(经理审核)-经理角色用户登录【这个任务ID是第一条审批时候的,和上面的不一样,请忽略】
//查询当前审批节点
Task task = taskService.createTaskQuery().taskId(id).singleResult();
if (ActConstant.ProcessResult_PASS.equals(auditResult)){
//通过
//设置流程参数
Map args = new HashMap<>();
args.put("auditId", task.getId());
//设置审批任务的执行人
taskService.claim(task.getId(), getLoginName());
//完成审批任务
taskService.complete(task.getId(), args);
}else{
// 不通过
runtimeService.deleteProcessInstance(task.getProcessInstanceId(), task.getId());
}
之后可以看到 流程流转…
(总监审核)-总监角色用户登录
流程都流转到hr
hr登录查看任务
审核一个
package com.platform.config;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.history.HistoryLevel;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.activiti.spring.SpringProcessEngineConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import javax.sql.DataSource;
/**
* 工作流相关配置 @author liuli
* 7大接口
* RepositoryService:提供一系列管理流程部署和流程定义的API。
* RuntimeService:在流程运行时对流程实例进行管理与控制。
* TaskService:对流程任务进行管理,例如任务提醒、任务完成和创建任务等。
* IdentityService:提供对流程角色数据进行管理的API,这些角色数据包括用户组、用户及它们之间的关系。
* ManagementService:提供对流程引擎进行管理和维护的服务。
* HistoryService:对流程的历史数据进行操作,包括查询、删除这些历史数据。
* FormService:表单服务。
*
* 1、act_ge_ 通用数据表,ge是general的缩写
* 2、act_hi_ 历史数据表,hi是history的缩写,对应HistoryService接口
* 3、act_id_ 身份数据表,id是identity的缩写,对应IdentityService接口
* 4、act_re_ 流程存储表,re是repository的缩写,对应RepositoryService接口,存储流程部署和流程定义等静态数据
* 5、act_ru_ 运行时数据表,ru是runtime的缩写,对应RuntimeService接口和TaskService接口,存储流程实例和用户任务等动态数据
*/
@Configuration
public class ActivitiConfig
{
@Bean
public ProcessEngineConfiguration processEngineConfiguration(DataSource dataSource, PlatformTransactionManager transactionManager)
{
SpringProcessEngineConfiguration processEngineConfiguration = new SpringProcessEngineConfiguration();
processEngineConfiguration.setDataSource(dataSource);
/**
* false:false为默认值,设置为该值后,Activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配时,将在启动时抛出异常。
* true:设置为该值后,Activiti会对数据库中所有的表进行更新,如果表不存在,则Activiti会自动创建。
* create-drop:Activiti启动时,会执行数据库表的创建操作,在Activiti关闭时,执行数据库表的删除操作。
* drop-create:Activiti启动时,执行数据库表的删除操作在Activiti关闭时,会执行数据库表的创建操作。
*/
processEngineConfiguration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
processEngineConfiguration.setDatabaseType("mysql");
processEngineConfiguration.setTransactionManager(transactionManager);
// 流程图字体
processEngineConfiguration.setActivityFontName("宋体");
processEngineConfiguration.setAnnotationFontName("宋体");
processEngineConfiguration.setLabelFontName("宋体");
/**
* 保存历史数据级别设置为full最高级别,便于历史数据的追溯
* none:不保存任何的历史数据,因此,在流程执行过程中,这是最高效的。
* activity:级别高于none,保存流程实例与流程行为,其他数据不保存。
* audit:除activity级别会保存的数据外,还会保存全部的流程任务及其属性。audit为history的默认值。
* full:保存历史数据的最高级别,除了会保存audit级别的数据外,还会保存其他全部流程相关的细节数据,包括一些流程参数等。
*/
//使用系统业务自定义的
processEngineConfiguration.setHistoryLevel(HistoryLevel.NONE);
// 用户验证表改成使用视图
processEngineConfiguration.setDbIdentityUsed(false);
return processEngineConfiguration;
}
@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();
}
}
时间和篇幅问题这里值提供了一个大致的思路和关键的业务代码,如有不懂可联系我 一起探讨
参考资料:
http://www.mossle.com/docs/activiti/index.html#activitiExplorer
https://juejin.im/post/5a4064365188252b145b4560
https://www.jianshu.com/p/701056e672a4