Commit aa25e164 by Java-曹文达

添加查看高亮流程图

parent 58127b81
package com.bbd.bpm.controller.taskOperate;
import com.alibaba.fastjson.JSON;
import com.bbd.bpm.dto.PageUtil;
import com.bbd.bpm.dto.SysCode;
import com.bbd.bpm.dto.request.CompleteTaskRequest;
import com.bbd.bpm.dto.request.PendingTaskListRequest;
import com.bbd.bpm.dto.request.QueryStartedPiByUserIdRequest;
import com.bbd.bpm.dto.request.SpecialRequest;
import com.bbd.bpm.dto.response.BpmResponse;
import com.bbd.bpm.dto.response.PendingTaskListBean;
import com.bbd.bpm.dto.response.QueryPiByUserIdBean;
import com.bbd.bpm.service.ActivitiService;
import com.bbd.bpm.util.validate.ValidateUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.activiti.engine.*;
import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
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.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -26,10 +27,13 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.*;
import static com.sun.mail.util.ASCIIUtility.getBytes;
/**
* Created by houkang on 2019/2/27.
......@@ -50,19 +54,22 @@ public class TaskOperateController {
private RuntimeService runtimeService;
@Autowired
private ActivitiService activitiService;
/**
* taskStatus 1 已完成 2 未完成 3 全部
* */
*/
@ApiOperation(value = "查询我发起的流程")
@PostMapping("/queryStartedPiByUserId")
@ResponseBody
public BpmResponse queryStartedPiByUserId(QueryStartedPiByUserIdRequest req,PageUtil pageUtil) {
public BpmResponse queryStartedPiByUserId(QueryStartedPiByUserIdRequest req, PageUtil pageUtil) {
BpmResponse resp = new BpmResponse();
try{
try {
//数据校验
String error = ValidateUtil.check_queryStartedPiByUserId(req);
if(error!=null){
Log.error("查询我发起的流程,数据校验失败"+error);
if (error != null) {
Log.error("查询我发起的流程,数据校验失败" + error);
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setMessage(error);
resp.setSuccess(false);
......@@ -70,15 +77,15 @@ public class TaskOperateController {
}
// QueryPiByUserIdBean
//任务办理人
PageHelper.startPage(pageUtil.getPageNumber(),pageUtil.getPageSize());
List<HistoricProcessInstance> listPi = historyService.createHistoricProcessInstanceQuery().involvedUser(req.getUserId()).listPage(pageUtil.getPageNumber(),pageUtil.getPageSize());
if(listPi!=null && !listPi.isEmpty()){
PageHelper.startPage(pageUtil.getPageNumber(), pageUtil.getPageSize());
List<HistoricProcessInstance> listPi = historyService.createHistoricProcessInstanceQuery().involvedUser(req.getUserId()).listPage(pageUtil.getPageNumber(), pageUtil.getPageSize());
if (listPi != null && !listPi.isEmpty()) {
List<QueryPiByUserIdBean> datalist = new ArrayList<>();
for(HistoricProcessInstance hpi:listPi){
for (HistoricProcessInstance hpi : listPi) {
List<Task> taskList = taskService.createTaskQuery().processInstanceId(hpi.getId()).list();
QueryPiByUserIdBean bean = new QueryPiByUserIdBean();
//业务密钥
//业务密钥
bean.setBusinessKey(hpi.getBusinessKey());
//流程名称
bean.setProcessDefinitionName(hpi.getProcessDefinitionName());
......@@ -88,79 +95,80 @@ public class TaskOperateController {
bean.setStartTime(hpi.getStartTime());
//结束时间
bean.setEndTime(hpi.getEndTime());
if(hpi.getEndTime()!=null){
if (hpi.getEndTime() != null) {
bean.setEnded(true);
}
if("1".equals(req.getTaskStatus())){
if(bean.isEnded()){
if ("1".equals(req.getTaskStatus())) {
if (bean.isEnded()) {
//当前操作人
bean.setName("已审批完成");
bean.setProcessNodeName("审批完成");
datalist.add(bean);
}
} else if("2".equals(req.getTaskStatus())){
if(!bean.isEnded()){
for(Task t:taskList){
} else if ("2".equals(req.getTaskStatus())) {
if (!bean.isEnded()) {
for (Task t : taskList) {
//当前操作人
bean.setName( t.getAssignee());
bean.setName(t.getAssignee());
bean.setTaskId(t.getId());
bean.setExecutionId(t.getExecutionId());
bean.setProcessNodeName(t.getName());
}
datalist.add(bean);
}
}else{
} else {
//当前操作人
bean.setName("已审批完成");
bean.setProcessNodeName("审批完成");
for(Task t:taskList){
for (Task t : taskList) {
//当前操作人
bean.setName( t.getAssignee());
bean.setName(t.getAssignee());
bean.setProcessNodeName(t.getName());
bean.setTaskId(t.getId());
bean.setExecutionId(t.getExecutionId());
}
datalist.add(bean);
}
}
PageInfo pageInfo=new PageInfo(datalist);
PageInfo pageInfo = new PageInfo(datalist);
resp.setData(pageInfo);
}
resp.setCode(SysCode.SUCCESS_CODE);
resp.setSuccess(true);
}catch (Exception e){
Log.error("查询我发起的流程失败",e);
} catch (Exception e) {
Log.error("查询我发起的流程失败", e);
resp.setSuccess(false);
resp.setCode(SysCode.SYS_ERROR);
resp.setMessage("查询我发起的流程失败"+e.getMessage());
resp.setMessage("查询我发起的流程失败" + e.getMessage());
}
return resp;
}
@ApiOperation(value = "查询待处理任务")
@PostMapping("/pendingTaskList")
@ResponseBody
public BpmResponse pendingTaskList(PendingTaskListRequest req,PageUtil pageUtil) {
public BpmResponse pendingTaskList(PendingTaskListRequest req, PageUtil pageUtil) {
BpmResponse resp = new BpmResponse();
try{
try {
//数据校验
String error = ValidateUtil.check_pendingTaskList(req);
if(error!=null){
Log.error("查询待处理任务,数据校验失败"+error);
if (error != null) {
Log.error("查询待处理任务,数据校验失败" + error);
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setMessage(error);
resp.setSuccess(false);
return resp;
}
//任务办理人
PageHelper.startPage(pageUtil.getPageNumber(),pageUtil.getPageSize());
List<Task> taskList = taskService.createTaskQuery().taskAssignee(req.getAssignee()).listPage(pageUtil.getPageNumber(),pageUtil.getPageSize());
if(taskList!=null && taskList.size()>0){
PageHelper.startPage(pageUtil.getPageNumber(), pageUtil.getPageSize());
List<Task> taskList = taskService.createTaskQuery().taskAssignee(req.getAssignee()).listPage(pageUtil.getPageNumber(), pageUtil.getPageSize());
if (taskList != null && taskList.size() > 0) {
List<PendingTaskListBean> dataList = new ArrayList<>();
for(Task task : taskList){
ProcessInstance pi =runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
PendingTaskListBean bean = new PendingTaskListBean();
for (Task task : taskList) {
ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(task.getProcessInstanceId()).singleResult();
PendingTaskListBean bean = new PendingTaskListBean();
//业务密钥
bean.setBusinessKey(pi.getBusinessKey());
//发起人
......@@ -175,17 +183,17 @@ public class TaskOperateController {
bean.setProcessInstanceId(task.getProcessInstanceId());
dataList.add(bean);
}
PageInfo pageInfo=new PageInfo(dataList);
PageInfo pageInfo = new PageInfo(dataList);
resp.setData(pageInfo);
}
resp.setSuccess(true);
resp.setCode(SysCode.SUCCESS_CODE);
resp.setMessage("查询待处理任务成功");
}catch (Exception e){
Log.error("查询待处理任务失败",e);
} catch (Exception e) {
Log.error("查询待处理任务失败", e);
resp.setSuccess(false);
resp.setCode(SysCode.SYS_ERROR);
resp.setMessage("查询待处理任务失败"+e.getMessage());
resp.setMessage("查询待处理任务失败" + e.getMessage());
}
return resp;
}
......@@ -193,20 +201,20 @@ public class TaskOperateController {
@ApiOperation(value = "改变任务处理人")
@GetMapping("/appointTaskTo")
@ResponseBody
public BpmResponse appointTaskTo(String taskId,String userId) {
public BpmResponse appointTaskTo(String taskId, String userId) {
BpmResponse resp = new BpmResponse();
try{
try {
//校验参数
if(StringUtils.isBlank(taskId)||StringUtils.isBlank(userId) ){
resp.setMessage("请求参数"+SysCode.NOT_ALLOW_NULL);
if (StringUtils.isBlank(taskId) || StringUtils.isBlank(userId)) {
resp.setMessage("请求参数" + SysCode.NOT_ALLOW_NULL);
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setSuccess(false);
return resp;
}
Task task=taskService.createTaskQuery().taskId(taskId).singleResult();
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
//校验参数
if(task==null || task.getId()==null){
if (task == null || task.getId() == null) {
resp.setMessage("任务不存在或已完成");
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setSuccess(false);
......@@ -217,10 +225,10 @@ public class TaskOperateController {
resp.setSuccess(true);
resp.setMessage("改变任务处理人成功");
resp.setCode(SysCode.SUCCESS_CODE);
}catch (Exception e){
Log.error("改变任务处理人失败",e);
} catch (Exception e) {
Log.error("改变任务处理人失败", e);
resp.setSuccess(false);
resp.setMessage("改变任务处理人失败"+e.getMessage());
resp.setMessage("改变任务处理人失败" + e.getMessage());
resp.setCode(SysCode.SYS_ERROR);
}
return resp;
......@@ -232,12 +240,12 @@ public class TaskOperateController {
public BpmResponse deleteTask(String taskId) {
BpmResponse resp = new BpmResponse();
//todo
try{
try {
taskService.deleteTask(taskId);
resp.setSuccess(true);
resp.setMessage("删除任务成功");
}catch (Exception e){
Log.error("删除任务失败",e);
} catch (Exception e) {
Log.error("删除任务失败", e);
resp.setSuccess(false);
}
return resp;
......@@ -246,48 +254,102 @@ public class TaskOperateController {
@ApiOperation(value = "任务办理")
@PostMapping("/completeTask")
@ResponseBody
public BpmResponse completeTask(CompleteTaskRequest req ) {
public BpmResponse completeTask(CompleteTaskRequest req) {
BpmResponse resp = new BpmResponse();
try{
//数据校验
String error = ValidateUtil.check_completeTask(req);
if(error!=null){
Log.error("任务办理,数据校验失败"+error);
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setMessage(error);
resp.setSuccess(false);
return resp;
}
try {
//数据校验
String error = ValidateUtil.check_completeTask(req);
if (error != null) {
Log.error("任务办理,数据校验失败" + error);
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setMessage(error);
resp.setSuccess(false);
return resp;
}
Task task=taskService.createTaskQuery().taskId(req.getTaskId()).singleResult();
//校验参数
if(task==null || task.getId()==null){
resp.setMessage("任务不存在或已完成");
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setSuccess(false);
return resp;
}
//增加批注
if(req.getComments()!=null){
taskService.addComment(req.getTaskId(), null, req.getComments());
}
Map<String, Object> variables = null;
if(req.getVariables()==null){
variables = new HashMap<String, Object>();
}else{
variables = req.getVariables();
}
variables.put("userId",task.getAssignee());
taskService.complete(req.getTaskId(),variables);
resp.setSuccess(true);
resp.setMessage("任务办理成功");
resp.setCode(SysCode.SUCCESS_CODE);
}catch(Exception e){
Log.error("任务办理失败",e);
resp.setSuccess(false);
resp.setMessage("任务办理失败"+e.getMessage());
resp.setCode(SysCode.SYS_ERROR);
}
Task task = taskService.createTaskQuery().taskId(req.getTaskId()).singleResult();
//校验参数
if (task == null || task.getId() == null) {
resp.setMessage("任务不存在或已完成");
resp.setCode(SysCode.VALIDATE_ERROR);
resp.setSuccess(false);
return resp;
}
//增加批注
if (req.getComments() != null) {
taskService.addComment(req.getTaskId(), null, req.getComments());
}
Map<String, Object> variables = null;
if (req.getVariables() == null) {
variables = new HashMap<String, Object>();
} else {
variables = req.getVariables();
}
variables.put("userId", task.getAssignee());
taskService.complete(req.getTaskId(), variables);
resp.setSuccess(true);
resp.setMessage("任务办理成功");
resp.setCode(SysCode.SUCCESS_CODE);
} catch (Exception e) {
Log.error("任务办理失败", e);
resp.setSuccess(false);
resp.setMessage("任务办理失败" + e.getMessage());
resp.setCode(SysCode.SYS_ERROR);
}
return resp;
}
/**
* 带当前节点的流程图
*
* @param request
* @return
*/
@RequestMapping("/process/trace/current")
@ApiOperation(value = "流程图获取接口", notes = "获取当前流程的流程图")
@ResponseBody
public void traceProcessImage(SpecialRequest request, HttpServletResponse response) {
try {
byte[] bytes = activitiService.traceProcessImage(request);
OutputStream toClient=response.getOutputStream();
toClient.write(bytes);
toClient.flush();
toClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*@RequestMapping("/process/trace/current")
@ApiOperation(value = "流程图获取接口", notes = "获取当前流程的流程图")
@ResponseBody
public void traceProcessImage(SpecialRequest request, HttpServletResponse response) {
FileInputStream fis = null;
OutputStream os = null;
try {
byte[] bytes = activitiService.traceProcessImage(request);
File file = new File("D:\\" + 1 + ".jpg");
OutputStream out = new FileOutputStream(file);
out.write(bytes);
out.flush();
System.out.println("download success");
out.close();
//得到文件大小
FileInputStream hFile = new FileInputStream("D:/1.jpg");
int i=hFile.available();
//读数据
byte data[]=new byte[i];
//得到向客户端输出二进制数据的对象
hFile.read(data);
//输出数据
OutputStream toClient=response.getOutputStream();
toClient.write(data);
toClient.flush();
toClient.close();
hFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}*/
}
......@@ -5,6 +5,7 @@ import com.bbd.bpm.result.Result;
import com.bbd.bpm.service.UserInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
/**
* 用户功能模块管理
......@@ -102,6 +103,18 @@ public class UserWebController {
return "deployment/importDeployment";
}
/**
* @Author:cwd
* @Description:进入组织管理
* @Date: 2019/03/04 22:53
* @Param:
* @return
**/
@GetMapping(value = "toSee")
public String toSee(String taskId,String executionId,ModelMap modelMap){
modelMap.addAttribute("taskId",taskId);
modelMap.addAttribute("executionId",executionId);
return "deployment/deplyment";
}
}
package com.bbd.bpm.dto.request;
import java.io.Serializable;
/**
* Created by yanlj on 2017/10/19.
*/
public class SpecialRequest implements Serializable {
private String userToken;
private String taskId;
private String executionId;
private String processInstanceId;
private String procdefId;
public String getUserToken() {
return userToken;
}
public void setUserToken(String userToken) {
this.userToken = userToken;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
public String getExecutionId() {
return executionId;
}
public void setExecutionId(String executionId) {
this.executionId = executionId;
}
public String getProcessInstanceId() {
return processInstanceId;
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getProcdefId() {
return procdefId;
}
public void setProcdefId(String procdefId) {
this.procdefId = procdefId;
}
}
......@@ -18,6 +18,12 @@ public class QueryPiByUserIdBean {
private String processNodeName;
private String taskId;
private String executionId;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date startTime;
......@@ -91,4 +97,21 @@ public class QueryPiByUserIdBean {
public void setProcessNodeName(String processNodeName) {
this.processNodeName = processNodeName;
}
public String getExecutionId() {
return executionId;
}
public void setExecutionId(String executionId) {
this.executionId = executionId;
}
public String getTaskId() {
return taskId;
}
public void setTaskId(String taskId) {
this.taskId = taskId;
}
}
package com.bbd.bpm.service;
import com.bbd.bpm.dto.request.SpecialRequest;
import java.io.IOException;
/**
* Created by yanlj on 2017/9/1.
*/
public interface ActivitiService {
/**
* 带跟踪的图片
*
* @param request
* @return
*/
byte[] traceProcessImage(SpecialRequest request) throws IOException;
}
package com.bbd.bpm.serviceImpl;
import com.bbd.bpm.dto.request.SpecialRequest;
import com.bbd.bpm.service.ActivitiService;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.engine.*;
import org.activiti.engine.impl.cfg.ProcessEngineConfigurationImpl;
import org.activiti.engine.impl.context.Context;
import org.activiti.engine.runtime.Execution;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.activiti.image.ProcessDiagramGenerator;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
/**
* Created by yanlj on 2017/9/1.
*/
@Component("activitiService")
public class ActivitiServiceImpl implements ActivitiService {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@Autowired
private ProcessEngineConfiguration processEngineConfiguration;
@Autowired
private ProcessEngine processEngine;
@Override
public byte[] traceProcessImage(SpecialRequest request) throws IOException {
Execution execution = null;
if (StringUtils.isNotBlank(request.getExecutionId())) {
execution = runtimeService.createExecutionQuery().executionId(request.getExecutionId()).singleResult();//执行实例
}
if (execution == null) {
if (StringUtils.isNotBlank(request.getTaskId())) {
Task task = taskService.createTaskQuery().taskId(request.getTaskId()).singleResult();
if (task != null) {
execution = runtimeService.createExecutionQuery().executionId(task.getExecutionId()).singleResult();//执行实例
}
}
}
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(execution.getProcessInstanceId()).singleResult();
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<String> activeActivityIds = runtimeService.getActiveActivityIds(execution.getId());
// 使用spring注入引擎请使用下面的这行代码
processEngineConfiguration = processEngine.getProcessEngineConfiguration();
Context.setProcessEngineConfiguration((ProcessEngineConfigurationImpl) processEngineConfiguration);
ProcessDiagramGenerator diagramGenerator = processEngineConfiguration.getProcessDiagramGenerator();
InputStream imageStream = diagramGenerator.generateDiagram(
bpmnModel,
"png",
activeActivityIds,
new ArrayList<String>(),
"宋体",
"宋体",
null,
null,1.0);
byte[] bytes = IOUtils.toByteArray(imageStream);
return bytes;
}
}
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" th:href="@{/css/common/base.css}" />
<link rel="stylesheet" th:href="@{/css/common/page_new.css}" />
<link rel="stylesheet" th:href="@{/js/plugins/bootstrapselect/css/product_list.css}" />
<link rel="stylesheet" th:href="@{/css/layui.css}" media="all">
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<style>
#goBack {
background: #fff no-repeat 5px center;
}
</style>
<body>
<div class="box">
<h2><span></span>流程查看<button id="goBack" onclick="javascript:history.go(-1)" style="margin-right: 100px">返回</button><button onclick="location.reload()">刷新</button></h2>
<img id="image">
</div>
<input type="hidden" id="taskId" th:value="${taskId}">
<input type="hidden" id="executionId" th:value="${executionId}">
</body>
</html>
<script src="/js/plugins/jquery.min.js"></script>
<script src="/js/plugins/layer/layer.js"></script>
<script src="/js/layui.js"></script>
<script type="text/javascript" src="/js/plugins/page_new.js"></script>
<script>
$(function () {
var taskId=$("#taskId").val()
var executionId=$("#executionId").val()
var url="http://localhost:8087/api/bpm/task/process/trace/current?executionId="+executionId+"&taskId="+taskId
$("#image").attr("src",url)
})
</script>
......@@ -144,7 +144,7 @@
var total = data.total;
data = data.list;
var content = '';
content += '<thead><tr><th>流程实例Id</th><th>流程名称</th><th style="width: 8%">业务密钥</th><th>当前审批人</th><th style="width: 8%">审批节点名称</th><th style="width: 8%">审批开始时间</th><th style="width: 8%">审批结束时间</th></tr></thead>';
content += '<thead><tr><th>流程实例Id</th><th>流程名称</th><th style="width: 8%">业务密钥</th><th>当前审批人</th><th style="width: 8%">审批节点名称</th><th style="width: 8%">审批开始时间</th><th style="width: 8%">审批结束时间</th><th style="width: 8%">操作</th></tr></thead>';
if(data!=null){
for (var i in data) {
if(data[i].endTime==null){
......@@ -158,6 +158,11 @@
content += '<td class="product_name" style="width: 5%;">'+data[i].processNodeName+'</td>';
content += '<td class="product_name" style="width: 5%;">'+data[i].startTime+'</td>';
content += '<td class="product_name" style="width: 5%;">'+data[i].endTime+'</td>';
if(data[i].name=='已审批完成'){
content += '<td class="cao_zuo" disabled><span style="width: 16%">完成</span>';
}else {
content += '<td class="cao_zuo"><span style="width: 16%" onclick="toActivityDetail('+data[i].taskId+',\''+data[i].executionId+'\')">查看</span>';
}
content += '</tr></tbody>';
}
$('#pages').text(pages);
......@@ -202,6 +207,13 @@
},'json')
flushHtml(null,taskStatus);
}
/*查看流程 */
function toActivityDetail(taskId,executionId) {
location.href="/web/bpm/user/toSee?taskId="+taskId+"&executionId="+executionId
}
</script>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment