本想在个人博客添加一个模拟审批流程,后台代码已写完,奈何本人不是专业前端,前台页面进度太过缓慢,为了节省时间,决定不写前台页面,这里将后台代码上传,供大家参考
整个代码包含流程部署、启动、流程详情查看、审批、驳回、审批历史查看、审批流程图查看、动态指定下一审批人(根据指定approver变量来指定审批人)、流程删除
1.bpmn流程图(执行流程不规范,纯属个人yy)
2.Controller
package com.chat.api.web.restctrl;
import com.chat.api.utils.ResultUtil;
import com.chat.api.utils.util.DateUtil;
import com.chat.api.utils.util.ParamUtil;
import com.chat.api.web.service.ApprovalService;
import com.chat.api.web.vo.ApprovalEntity;
import com.chat.api.web.vo.MessageEntity;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.server.PathParam;
import java.util.Date;
@Controller
@RequestMapping("/approval")
public class ApprovalCtrl {
@Autowired
private ApprovalService approvalService;
@RequestMapping(value = "deploy",produces = "application/json",method = RequestMethod.GET)
@ApiOperation("部署审批流程")
public void deploy(HttpServletRequest request) {
String flowName = "面试审批流程";
Boolean result = approvalService.deployProcess(flowName);
}
@RequestMapping(value = "startApproval",produces = "application/json",method = RequestMethod.POST)
@ApiOperation("启动审批流程")
public MessageEntity startApproval(HttpServletRequest request,
@RequestParam("name") String name,
@RequestParam("iphone") String iphone,
@RequestParam("email") String email,
@RequestParam("job") String job,
@RequestParam("score") Integer score,
@RequestParam("startTime") String startTimeS,
@RequestParam("endTime") String endTimeS) {
ApprovalEntity approvalEntity = new ApprovalEntity();
Date startTime = new Date();
Date endTime = new Date();
if (startTimeS!=null){
startTime = DateUtil.strToDate(startTimeS, 6);
}
if (endTimeS!=null){
endTime = DateUtil.strToDate(endTimeS, 6);
}
approvalEntity.setName(name);
approvalEntity.setIphone(iphone);
approvalEntity.setEmail(email);
approvalEntity.setJob(job);
approvalEntity.setScore(score);
approvalEntity.setStartTime(startTime);
approvalEntity.setEndTime(endTime);
approvalService.startApproval(approvalEntity,request);
return ResultUtil.success(request);
}
@RequestMapping(value = "findFlowImage",produces = "application/json",method = RequestMethod.POST)
@ApiOperation("查看审批流程图")
public MessageEntity findFlowImage(HttpServletRequest request, HttpServletResponse response,
@RequestParam(value = "id") String id) {
Long idL = ParamUtil.getLongParameter(id, -1L);
return approvalService.getApprovalRate(idL,response);
}
@RequestMapping(value = "findFlowDetail",produces = "application/json",method = RequestMethod.POST)
@ApiOperation("查看审批流程节点详情")
public String findFlowDetail(HttpServletRequest request, ModelMap mm,
@RequestParam("id") String ids) {
Long id = com.cbim.common.util.ParamUtil.getLongParameter(request, "ids", -1);
return approvalService.findFlowDetail(id,mm);
}
@RequestMapping(value = "approval",produces = "application/json",method = RequestMethod.POST)
@ApiOperation("流程节点审批")
public MessageEntity approval(HttpServletRequest request, HttpServletResponse response,
@RequestParam("name") String name,
@RequestParam("iphone") String iphone,
@RequestParam("email") String email,
@RequestParam("job") String job,
@RequestParam("result") String result,
@RequestParam("score") Integer score,
@RequestParam("startTime") String startTimeS,
@RequestParam("endTime") String endTimeS) {
ApprovalEntity approvalEntity = new ApprovalEntity();
Date startTime = new Date();
Date endTime = new Date();
if (startTimeS!=null){
startTime = DateUtil.strToDate(startTimeS, 6);
}
if (endTimeS!=null){
endTime = DateUtil.strToDate(endTimeS, 6);
}
approvalEntity.setName(name);
approvalEntity.setIphone(iphone);
approvalEntity.setEmail(email);
approvalEntity.setJob(job);
approvalEntity.setResult(Integer.parseInt(result));
approvalEntity.setScore(score);
approvalEntity.setStartTime(startTime);
approvalEntity.setEndTime(endTime);
return approvalService.approval(request,approvalEntity);
}
@RequestMapping(value = "findWithDown",produces = "application/json",method = RequestMethod.GET)
@ApiOperation("获取待办流程列表")
public String findWithDown(HttpServletRequest request, ModelMap mm) {
return approvalService.findWithDown(request,mm);
}
@RequestMapping(value = "findFlowHistory",produces = "application/json",method = RequestMethod.POST)
@ApiOperation("查看审批历史")
public MessageEntity findFlowHistory(HttpServletRequest request,
@RequestParam(value = "id") String id) {
return approvalService.findFlowHistory(id);
}
}
3.Service
package com.chat.api.web.service;
import cn.hutool.core.collection.CollUtil;
import com.chat.api.common.exception.ApiException;
import com.chat.api.utils.ResultUtil;
import com.chat.api.utils.util.IdWorkerUtil;
import com.chat.api.utils.util.ParamUtil;
import com.chat.api.web.dao.ApprovalRepo;
import com.chat.api.web.po.ApprovalBean;
import com.chat.api.web.po.BlogBean;
import com.chat.api.web.po.UserBean;
import com.chat.api.web.vo.ApprovalEntity;
import com.chat.api.web.vo.MessageEntity;
import com.google.common.collect.Lists;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.identity.User;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.engine.task.TaskQuery;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.ui.ModelMap;
import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.*;
@Service
public class ApprovalService {
@Autowired
private ApprovalRepo approvalRepo;
@Autowired
private TaskService taskService;
@Autowired
private ProcessEngine processEngine;
@Autowired
private HistoryService historyService;
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private UserService userService;
@Autowired
private ChatService chatService;
public Boolean deployProcess(String flowName) {
Deployment deployment = repositoryService.createDeployment()
.name(flowName)
.addClasspathResource("processes/apply1.bpmn")
.addClasspathResource("processes/apply1.png")
.deploy();
System.out.println("部署ID:"+deployment.getId());
System.out.println("部署时间:"+deployment.getDeploymentTime());
return true;
}
@Transactional(readOnly = false)
public void startApproval(ApprovalEntity approvalEntity,HttpServletRequest request) {
UserBean userInfo = userService.findByUserInfo(request);
approvalEntity.setId(IdWorkerUtil.getInstance().toString());
Deployment de = repositoryService.createDeploymentQuery()
.deploymentName("面试审批")
.singleResult();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
.deploymentId(de.getId()).singleResult();
ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefinition.getId());
String processInstanceId = processInstance.getProcessInstanceId();
Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult();
Map<String, Object> map = new HashMap<>();
map.put("inner_introduce",approvalEntity.getApprover());
taskService.complete(task.getId(),map);
ApprovalBean approvalBean = new ApprovalBean();
approvalEntity.setBean(approvalBean);
approvalBean.setApproverId(approvalEntity.getApprover());
approvalBean.setInitiatorId(userInfo.getId());
approvalBean.setProcInstId(processInstanceId);
approvalBean.setCreateBy(userInfo.getId());
approvalBean.setCreateDate(new Date());
approvalRepo.save(approvalBean);
}
public String findWithDown(HttpServletRequest request, ModelMap mm){
List<ApprovalEntity> list = Lists.newArrayList();
UserBean userInfo = userService.findByUserInfo(request);
List<ApprovalBean> approvalBeans = approvalRepo.findByApproverId(userInfo.getId());
for (ApprovalBean approvalBean : approvalBeans) {
Task task = taskService.createTaskQuery().taskAssignee(approvalBean.getProcInstId()).singleResult();
if (!approvalBean.getProcInstId().equals(task.getProcessInstanceId()))
continue;
ApprovalEntity entity = new ApprovalEntity();
entity.setValue(approvalBean);
UserBean initiator = userService.findById(approvalBean.getInitiatorId());
entity.setInitiator(initiator.getName());
entity.setFlowNodeName(task.getName());
list.add(entity);
}
mm.addAttribute("user",userInfo);
mm.addAttribute("list",list);
return "/approval/approvalList.html";
}
public String findFlowDetail(Long approvalId, ModelMap mm){
ApprovalBean bean = approvalRepo.getOne(approvalId);
ApprovalEntity entity = new ApprovalEntity();
entity.setValue(bean);
mm.addAttribute("entity",entity);
return "/approval/form.html";
}
@Transactional(readOnly = false)
public MessageEntity approval(HttpServletRequest request,ApprovalEntity approvalEntity){
UserBean userInfo = userService.findByUserInfo(request);
List<Task> list = taskService.createTaskQuery().taskAssignee(userInfo.getUsername()).list();
for (Task task : list) {
if (!task.getProcessInstanceId().equals(approvalEntity.getProcInstId())){
continue;
}
Map<String, Object> map = CollUtil.newHashMap();
map.put("result",approvalEntity.getResult());
map.put("score",approvalEntity.getScore());
map.put("user",approvalEntity.getApprover());
taskService.complete(task.getId(),map);
ApprovalBean approvalBean = new ApprovalBean();
approvalEntity.setBean(approvalBean);
approvalBean.setApproverId(approvalEntity.getApprover());
approvalBean.setUpdateBy(userInfo.getId());
approvalBean.setUpdateDate(new Date());
approvalRepo.save(approvalBean);
}
return ResultUtil.success("审批完成");
}
@Transactional(readOnly = false)
public MessageEntity deleteByBlogId(ApprovalEntity approvalEntity) {
try {
String message = "很抱歉,您的面试申请已被驳回,。。。";
Task task = taskService.createTaskQuery().taskId(approvalEntity.getProcInstId()).singleResult();
if (task == null) return ResultUtil.success("未找到相对应流程");
runtimeService.deleteProcessInstance(task.getProcessInstanceId(),"终止流程");
chatService.sendMsg(Long.parseLong(approvalEntity.getInitiator()),message);
return ResultUtil.success("审批流程删除成功");
}catch (Exception e){
e.printStackTrace();
throw new ApiException("删除审批流程异常");
}
}
public MessageEntity getApprovalRate(Long approvalId, HttpServletResponse response) {
try {
ApprovalBean bean = approvalRepo.getOne(approvalId);
if (bean == null){
return ResultUtil.success("没有流程图可供查看");
}
Task task = taskService.createTaskQuery().processInstanceId(bean.getProcInstId()).singleResult();
InputStream is =getDiagram(task.getProcessInstanceId());
if (is == null) ResultUtil.success("没有流程图可供查看");
response.setContentType("image/png");
BufferedImage image = ImageIO.read(is);
OutputStream out = response.getOutputStream();
ImageIO.write(image, "png", out);
is.close();
out.close();
return ResultUtil.success("成功");
}catch (Exception e){
e.printStackTrace();
throw new ApiException("系统繁忙,请稍后再试!!!");
}
}
public InputStream getDiagram(String processInstanceId) {
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
String processDefinitionId = StringUtils.EMPTY;
if (processInstance == null) {
HistoricProcessInstance processInstanceHistory =
historyService.createHistoricProcessInstanceQuery()
.processInstanceId(processInstanceId).singleResult();
if (processInstanceHistory == null)
return null;
else
processDefinitionId = processInstanceHistory.getProcessDefinitionId();
} else {
processDefinitionId = processInstance.getProcessDefinitionId();
}
String fontName = "宋体";
BpmnModel model = repositoryService.getBpmnModel(processDefinitionId);
List<String> currentActs = Collections.EMPTY_LIST;
if (processInstance != null)
currentActs = runtimeService.getActiveActivityIds(processInstance.getId());
return processEngine.getProcessEngineConfiguration()
.getProcessDiagramGenerator()
.generateDiagram(model, "png", currentActs, new ArrayList<String>(),
fontName, fontName, fontName, null, 1.0);
}
public MessageEntity findFlowHistory(String proinstId) {
List<HistoricActivityInstance> list = historyService.createHistoricActivityInstanceQuery().processInstanceId(proinstId).list();
return ResultUtil.success(list);
}
}