功能简介
Spring Boot 使用Activiti 工作流,其实只需要配置下bpmn文件的路径即可,让Spring Boot扫描到后将流程节点信息入库,这次为大家介绍的是Spring Boot 2.0 + Activiti 5.2.1,因为Activiti低版本的需要手动部署BPMN资源文件,5.2.X之后的版本不需要手动部署。
现有Springboot项目搭建
maven的引用
在配置文件中加入Activiti的配置,并且新建processes文件夹。
接下来我们就要用Eclipse工具安装Activiti的插件,进行流程图的绘制。
可以参考这位博主的博客:
https://blog.csdn.net/ka_ka314/article/details/79431197
安装完成后我们就可以进行绘制流程图了,这个是我画的一个Demo,如下:
流程图绘制好了,接下来就是流程的属性配置了,我们先看第一个环节,
项目经理审批:
我们都知道流程图只是展示当前流程的环节,以及当前流程的进度情况。我们看到Main Config这个是主要配置,
员工填写完了请假信息后,然后提交到项目经理审批时,是不是得知道提交给谁,所以就要根据员工的部门ID查找当前部门的项目经理,所以就需要调用我们自己写的方法,然后将项目经理信息返回。
我们看下网关的属性配置,属性audit是我们代码中定义的属性,代码中将audit赋予不同的值,当然值必须是图中的,它才会根据值的不同,进行流程的推进。
通过:
拒绝:
人事经理审批:
通过:
这里我没有写拒绝,通过后就结束了。
图中的用到的方法都在下面的代码中:
工作处理类
package com.jeesite.modules.activiti.common;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.HistoryService;
import org.activiti.engine.ManagementService;
import org.activiti.engine.ProcessEngineConfiguration;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.impl.persistence.entity.ProcessDefinitionEntity;
import org.activiti.engine.impl.pvm.PvmTransition;
import org.activiti.engine.impl.pvm.process.ActivityImpl;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.activiti.image.ProcessDiagramGenerator;
import org.activiti.spring.ProcessEngineFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSONObject;
import com.jeesite.modules.activiti.dao.ActivitiMapper;
import com.jeesite.modules.utils.StrUtils;
/**
* @Desc 工作流程公共类
* @author pgqing
* @Version 5.2.1
*/
@Service
public class activitiCommonService {
@Resource
private RuntimeService runtimeService;
@Resource
private TaskService taskService;
@Resource
private HistoryService historyService;
@Resource
private RepositoryService repositoryService;
@Resource
private ManagementService managementService;
@Autowired
private ProcessEngineFactoryBean processEngine;
@Resource
private ProcessEngineConfiguration processEngineConfiguration;
@Resource
private ActivitiMapper mapper;
/**
* 启动流程
*
* @param processDefinitionKey
*/
public void startProcess(String processDefinitionKey, String bizKey) {
runtimeService.startProcessInstanceByKey(processDefinitionKey, bizKey);
}
/**
* 审批
*
* @param taskId 流程ID
* @param userId 审批人
* @param audit 审批意见(通过:pass,拒绝:refund)
*/
public String completeTaskByUser(String taskId, String userId, String audit, String comment) {
// 根据taskId查询流程ID
String processInstanceId = mapper.queryProcessIdByTaskId(taskId);
if (null != processInstanceId && !"".equals(processInstanceId)) {
// 1.认领任务
taskService.claim(taskId, userId);
// 2.添加备注(保存建议)
taskService.addComment(taskId, processInstanceId, comment);
// 3.完成任务
Map<String, Object> map = new HashMap<String, Object>();
map.put("audit", audit);
taskService.complete(taskId, map);
}
return "审批完成";
}
/**
* @DESC 根据用户ID查询待办事项
* @param userId
* @return
*/
public List<Task> findTaskByUserId(String userId) {
return taskService.createTaskQuery().taskCandidateOrAssigned(userId).list();
}
/**
* @Desc 根据用户和流程名称获取任务列表(待办、已办)
* @param us