由于最近的需求需要用到activiti审批流,因此对审批流的相关内容进行了一些了解。
一、工作流生命周期
一个完整的工作流生命周期会经过5步,并且迭代循环。
定义:工作流生命周期总是从流程定义开始。这个过程包括收集需求,将其转化成流程定义,也就流程图、相关变量、角色定义。
发布:由开发人员打包各种资源,然后在系统管理中发布流程定义。包括:bpmn.xml、自定义表单、任务监听类等。
执行:具体的流程引擎按照事先定义的流程处理路线以任务驱动的方式执行业务流程。
监控:此阶段是依赖执行阶段。业务人员在办理任务的同时收集每个任务(Task)的结果,然后根据结果做出相应处理。
优化:在此阶段,一个完整的流程已经结束,或许能满足业务需求,或者需要优化。
二、引擎Service接口
Activiti引擎提供了七大Service接口,都可以通过ProcessEngine获取到,并且支持链式Api编程风格。
相关Service:
RepositoryService:用于管理流程仓库,如部署、删除、读取流程资源等。
RuntimeService:运行时service,可以处理所有正在运行状态的流程实列、任务等。
TaskService:任务Service,用于管理、查询任务,如:签收、办理、指派等。
ManagementService:引擎管理Service,和具体的业务无关,主要是可以查询引擎配置、数据库、作业等。
HistoryService:历史Service,可以查询所有历史数据,如:流程实列、任务、活动、变量、附件等。
FormService:表单Service,用于读取和流程、任务相关的表单数据
IdentifyService:身份Service,可以管理和查询用户、组之间的关系。
目前新版本,FormService和IdentifyService已经删除。
三、基于Spring Security实现权限控制
代码语言:javascript复制public interface UserDetailsService {
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
可以从Activiti的example中看到,需要基于Spring Security实现角色和用户的权限控制。
代码语言:javascript复制@Component
public class SecurityUtil {
private Logger logger = LoggerFactory.getLogger(SecurityUtil.class);
@Autowired
private UserDetailsService userDetailsService;
public void logInAs(String username) {
UserDetails user = userDetailsService.loadUserByUsername(username);
if (user == null) {
throw new IllegalStateException("User " username " doesn't exist, please provide a valid user");
}
logger.info("> Logged in as: " username);
SecurityContextHolder.setContext(new SecurityContextImpl(new Authentication() {
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return user.getAuthorities();
}
@Override
public Object getCredentials() {
return user.getPassword();
}
@Override
public Object getDetails() {
return user;
}
@Override
public Object getPrincipal() {
return user;
}
@Override
public boolean isAuthenticated() {
return true;
}
@Override
public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException {
}
@Override
public String getName() {
return user.getUsername();
}
}));
org.activiti.engine.impl.identity.Authentication.setAuthenticatedUserId(username);
}
}
可以看到这个工具类中,需要获取用户的信息和角色信息,getAuthorities则是获取角色信息。
代码语言:javascript复制 public String getAuthority() {
return this.role;
}
因此获取角色和用户信息,需要将这个进行修改,使用认证中心的用户信息和角色信息。
四、设计流程信息
需要在IDE中安装插件才可以进行流程可视化的设计,如果是idea,需要安装actiBPM插件。
看到这样的设计流程效果,可以将其后缀改成.xml文件,将其部署起来。
五、启动流程和完成流程
启动流程需要用到:
代码语言:javascript复制 ProcessInstance startProcessInstanceByKeyAndTenantId(String processDefinitionKey, String businessKey, Map<String, Object> variables, String tenantId);
启动流程后,需要处理流程:
代码语言:javascript复制void complete(String taskId, Map<String, Object> variables, boolean localScope);
处理任务的过程中会涉及到用户拾取任务
代码语言:javascript复制void claim(String taskId, String userId);