2024-09-02 20:59:57 +08:00

569 lines
24 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<%@page
import="com.blueland.bpm.engine.core.model.ProcessDefinitionModel"%>
<%@page import="com.blueland.bpm.engine.config.model.ProcessInfoConfig"%>
<%@page import="com.blueland.bpm.common.page.*"%>
<%@page import="com.blueland.bpm.common.util.*"%>
<%@page import="java.util.*"%>
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib tagdir="/WEB-INF/tags/simpletable" prefix="simpletable"%>
<%@ include file="/commons/taglibs.jsp"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>流程监控图</title>
<%@ include file="/commons/meta.jsp"%>
<link rel="stylesheet" href="${ctx}/resource/js/plugins/bpmn/css/diagram-js.css" />
</head>
<body class="white-page">
<div class="main-container" id="main-container">
<input type="hidden" name="userId" id="userId" value='${bpm_login_session_user.userCode}'></input>
<input type="hidden" id="processInstanceId" name ="processInstanceId" value="${processInstanceId}"/>
<div class="hjjd-box">
<div class="jd-list"><span class="jd-wzx"></span><span class="text">未执行</span></div>
<div class="jd-list"><span class="jd-yzx"></span><span class="text">已执行</span></div>
<div class="jd-list"><span class="jd-dqjd"></span><span class="text">当前节点</span></div>
<div class="jd-list"><span class="jd-yzf"></span><span class="text">已作废</span></div>
</div><!--hjjd-box 流程节点-->
<div class="lct-box_act">
<div class="canvas">
<div id="js-canvas"></div>
</div>
<div class="lct-btn">
<a class="btn-ico" onclick="getCurrAct()">
<span class="link-icon"><img src="${ctx}/resource/css/images/ico-dqhj.png" /></span>
<span class="link-text">当前环节</span>
<span class="hover-link">当前<br>环节</span>
</a>
<a class="btn-ico" onclick="getMyDealed()">
<span class="link-icon"><img src="${ctx}/resource/css/images/ico-wdjb.png" /></span>
<span class="link-text">我的经办</span>
<span class="hover-link">我的<br>经办</span>
</a>
</div><!---lct-btn 悬浮按钮--->
</div><!---lct-box--->
</div>
<!-- viewer -->
<script type='text/javascript'src="${ctx}/resource/js/plugins/bpmn/bpmn-navigated-viewer.development.js"></script>
<script type="text/javascript">
var height1 = window.parent.document.documentElement.clientHeight;
var windowHeight = (parseInt(height1)-200)
var viewer = new BpmnJS({
container: document.querySelector('#js-canvas'),
height: windowHeight
});
var procDefId,
processTrace,//处理的环节
processDetailLogs;//流程处理的信息
var arrayActId=[];
$(function(){
getProcessInfo();
})
function filters(startdate){
var date = new Date(startdate);
return formatDate("yyyy-MM-dd hh:mm:ss",date);
}
function differByDay(startTime,endTime){
var start = new Date(startTime);
var end = new Date(endTime);
if(start==null||end==null){
return 0;
}
return Math.round(end.getTime() / 86400000 - start.getTime() / 86400000);
}
function formatDate(format, date) {
var o = {
"M+": date.getMonth() + 1, //month
"d+": date.getDate(), //day
"h+": date.getHours(), //hour
"m+": date.getMinutes(), //minute
"s+": date.getSeconds(), //second
"q+": Math.floor((date.getMonth() + 3) / 3), //quarter
"S": date.getMilliseconds() //millisecond
}
if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o)
if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length));
return format;
}
//获取流程处理信息
function getProcessInfo(){
var url="${ctx}/workflow/trace/traceNewByImage.do";
$.ajax({
url : url,
data:{"processInstanceId":$("#processInstanceId").val()},
cache : false,
async : false,
type : "POST",
success : function (data){
procDefId = data.processInstance.processDefinitionId;
processTrace = data.processTrace;
processDetailLogs = data.hisTaskLog.processDetailLogs;
try{
$("#headingSpan",window.parent.document).html("<b>流程标题:</b>"+data.processInstance.procTitle+"<b>流程状态:</b>"+(data.processInstance.procState==1?'运行中':(data.processInstance.procState==5?'已结束':'已作废'))+"<b>流程定义名称:</b>"+data.processInstance.processDefinitionName);
}catch(e){}
getXmlContent();
}
});
}
//获取xml数据
function getXmlContent(){
var url="${ctx}/procDefModelMgr/showProcessXml.do";
$.ajax({
url : url,
data:{"procDefId":procDefId},
cache : false,
async : false,
type : "POST",
success : function (data){
createNewDiagram(data.bpmnXml);
}
});
}
function createNewDiagram (bpmnXmlStr) {
viewer.importXML(bpmnXmlStr, function (err) {
if (err) {
console.error(err)
}else{
var canvas = viewer.get('canvas');
//canvas.zoom('fit-viewport');
setNodeColor(processTrace, canvas)
appendHtml();
addActNum();
dealLine(canvas);
}
})
}
// 给已经走过的流程添加颜色
function setNodeColor(nodeCodes, canvas) {
var colorClass = "";
for (var i = 0; i < nodeCodes.length; i++) {
console.log(i,nodeCodes[i])
if(nodeCodes[i].status=='1'){
colorClass = "highlight-run";
}else if(nodeCodes[i].status=='2'){
colorClass = "highlight";
}else{
colorClass = "highlight-cancle";
}
if(nodeCodes[i].type =='SEQ'){
colorClass = "highlight-line";
canvas.addMarker(nodeCodes[i].activityId, colorClass);
}else{
canvas.addMarker(nodeCodes[i].activityId, colorClass);
}
}
}
function hidenDiv(id){
document.getElementById(id).style="display:none";
document.querySelectorAll("[signDiv]").forEach(function(item) {
if(document.getElementById(item.id) !=null){//去掉所有的环节详细数据,防止页面延迟,没有消失显示的详情信息
document.getElementById(item.id).style="display:none";
}
});
}
function showLineDiv(id){
document.getElementById(id).style="display:block";
}
function hidenLineDiv(id){
document.getElementById(id).style="display:none";
document.querySelectorAll("[lineDiv]").forEach(function(item) {
if(document.getElementById(item.id) !=null){//去掉所有的环节详细数据,防止页面延迟,没有消失显示的详情信息
document.getElementById(item.id).style="display:none";
}
});
}
function showDiv(id){
document.getElementById(id).style="display:block";
}
//拼接环节详细信息
function appendHtml(){
var eventBus = viewer.get('eventBus');
var events = [
'element.hover',
'element.out',
];
var overlays = viewer.get('overlays');
events.forEach(function(event) {
eventBus.on(event, function(e) {
var thisNode=document.getElementById('div_'+e.element.id);
var id = e.element.id.split("_")[0];
var thisLinkNode=document.getElementById('line_'+id);
if(e.element.type =='bpmn:UserTask' || e.element.type=='multi'){
if(event=='element.hover'){
var temp= processTrace.filter(function(item){//是否已处理
return item.activityId == e.element.id;
})
if(temp.length>0){//历史记录环节详细数据
appendHistoryHtml(overlays,event,e);
}else{//流程环节信息
dealActHtml(overlays,event,e);
}
}
if(event=='element.out' && thisNode != null){
document.getElementById('div_'+e.element.id).style="display:none";
document.querySelectorAll("[signDiv]").forEach(function(item) {
if(document.getElementById(item.id) !=null){//去掉所有的环节详细数据,防止页面延迟,没有消失显示的详情信息
document.getElementById(item.id).style="display:none";
}
});
}
}else if(e.element.type =='label'){//处理输出线的名称
var listLine= viewer._getLineName.filter(function(item){//判断这个输出线是否是截取的输出线名称
return item.id == id;
})
if(listLine.length>0){
if(event=='element.hover'){
if(thisLinkNode!=null){
document.getElementById("line_"+id).style="display:block";
}else{
appendLineHtml(overlays,event,id);
}
}
}
if(event=='element.out'){
if(document.getElementById('line_'+id) !=null){//去掉输出线的显示
document.getElementById('line_'+id).style="display:none";
}
document.querySelectorAll("[lineDiv]").forEach(function(item) {
if(document.getElementById(item.id) !=null){//去掉所有的输出线显示
document.getElementById(item.id).style="display:none";
}
});
}
}
});
});
}
//拼接环节详细信息
function appendHistoryHtml(overlays,event,e){
var thisNode=document.getElementById('div_'+e.element.id);
var listAct= arrayActId.filter(function(item){//判断这个节点是否
return item == e.element.id;
})
if(listAct.length==0){
arrayActId.push('div_'+e.element.id);
}
if(thisNode!=null && listAct.length==0){
document.getElementById('div_'+e.element.id).style="display:block";
return;
}
var list= processDetailLogs.filter(function(item){//获取处理记录信息
return item.historicTaskInstance.taskDefinitionKey == e.element.id;
})
var html = new Array();
//onmouseout="javascript:document.getElementById(\'div_'+e.element.id+'\').style.display=\'none\';" <a class="link">流程梳理环节详情</a>
html.push('<div class="lchj-box" signDiv="flag" onmouseover="showDiv(\'div_'+e.element.id+'\')" onmouseleave="hidenDiv(\'div_'+e.element.id+'\')" id="div_'+e.element.id+'"><div class="box-head"><span class="title">任务执行情况</span></div><div class="box-body">');
list.forEach(function(item){
var limitTimeStr = "";
var endDate=new Date();
if (item.historicTaskInstance.endTime != null) {
endDate=item.historicTaskInstance.endTime;
}
var t = differByDay(item.historicTaskInstance.startTime,endDate);
limitTimeStr = "耗时" + t + "天";
html.push('<table cellpadding="0" cellspacing="0" class="lchj-table">');
html.push('<tbody><tr>');
html.push('<td class="clum" width="100">接收环节: </td>');
html.push('<td>'+item.historicTaskInstance.name+'</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">发送环节: </td>');
if(item.historicTaskInstance.preTaskDefName!=null){
html.push('<td>'+item.historicTaskInstance.preTaskDefName+'</td>');
}else{
html.push('<td></td>');
}
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">发送人: </td>');
html.push('<td>'+item.sendUserName+'</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum" title="'+item.assigneeInfo+'">接收人: </td>');
if(item.reiceiveUserName != null
|| item.receiveOrgName != null){
html.push('<td>'+item.reiceiveUserName +''+item.receiveOrgName+''+'</td>');
}else{
html.push('<td></td>');
}
html.push('</tr>');
if(item.ownerName != undefined ){
html.push('<tr>');
html.push('<td class="clum">委托人: </td>');
html.push('<td>'+item.ownerName+'</td>');
html.push('</tr>');
}
html.push('<tr>');
html.push('<td class="clum">审批意见: </td>');
var fullCommentMsg = item.comment!=null&&item.comment.message!=null? item.comment.message : "";
var shortCommentMsg="";
if(item.historicTaskInstance.deleteReason!=null&&"cancel_process"==item.historicTaskInstance.actionType){
var cancelCommentMsg="当前流程已作废,作废意见为:"+item.historicTaskInstance.deleteReason;
fullCommentMsg=fullCommentMsg==""?cancelCommentMsg:(cancelCommentMsg+",发送环节意见为:"+fullCommentMsg);
if(fullCommentMsg.length>7){
shortCommentMsg=fullCommentMsg.substring(0,7)+"...";
html.push('<td title="'+fullCommentMsg+'" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">');
html.push('<a href="#" style="text-decoration:none;">'+shortCommentMsg+'</a></td>');
}else{
html.push('<td>'+fullCommentMsg+'</td>');
}
}else{
if(fullCommentMsg.length>7){
shortCommentMsg= fullCommentMsg.substring(0,7)+"...";
html.push('<td title="'+fullCommentMsg+'" style="white-space:nowrap;overflow:hidden;text-overflow:ellipsis;">');
html.push('<a href="#" style="text-decoration:none;">'+shortCommentMsg+'</a></td>');
}else{
html.push('<td class="qTipmessage">'+fullCommentMsg+'</td>');
}
}
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">开始时间: </td>');
html.push('<td>'+filters(item.historicTaskInstance.startTime)+'</td>');
html.push('</tr>');
if(item.historicTaskInstance.endTime!=null){
html.push('<tr>');
html.push('<td class="clum">结束时间: </td>');
html.push('<td>'+filters(item.historicTaskInstance.endTime)+'</td>');
html.push('</tr>');
}
html.push('<tr>');
html.push('<td class="clum">持续时间: </td>');
html.push('<td>'+limitTimeStr+'</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">任务状态: </td>');
if(item.historicTaskInstance.actionType=='cancel_process'){
html.push('<td><font color="red">作废</font></td>');
}else{
if(item.historicTaskInstance.endTime != null){
html.push('<td>已完成</td>');
}else{
html.push('<td><font color="red">正在审批</font></td>');
}
}
html.push('</tr></tbody>');
html.push('</table> <br>');
})
html.push('</div>');
var content = html.join('');
if(event=='element.hover'){
overlays.add(e.element.id, 'note', {
position: {
bottom: 0,
right: 0
},
html: content
});
}
}
//环节信息
function dealActHtml(overlays,event,e){
var html = new Array();
var thisNode=document.getElementById('div_'+e.element.id);
var listAct= arrayActId.filter(function(item){//判断这个节点是否
return item == ('div_'+e.element.id);
})
if(listAct.length==0){
arrayActId.push('div_'+e.element.id);
}
if(listAct.length>0){
if(thisNode!=null){
document.getElementById('div_'+e.element.id).style="display:block";
}
return;
}
var url="${ctx}/procDefMgr/getActivityDefModel.do";
$.ajax({
url : url,
data:{"procDefId":procDefId,"actDefId":e.element.id},
cache : false,
async : false,
type : "POST",
success : function (data){
var actDefObject = eval(data);
html.push('<div class="lchj-box" signDiv="flag" onmouseover="showDiv(\'div_'+e.element.id+'\')" onmouseleave="hidenDiv(\'div_'+e.element.id+'\')" id="div_'+e.element.id+'"><div class="box-head"><span class="title">任务执行情况</span></div><div class="box-body">');
html.push('<table cellpadding="0" cellspacing="0" class="lchj-table">');
html.push('<tbody><tr>');
html.push('<td class="clum" width="100">任务名称: </td>');
html.push('<td>'+actDefObject.actDefName+'</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">任务资源: </td>');
html.push('<td>');
var roleStrs="";
var orgStrs="";
var userStrs="";
var activityResources = eval(actDefObject.activityResources);
activityResources.forEach(function(item){
// alert(activityResource.name);
if(item.type=="ROLE"){
roleStrs+=item.name+",";
}else if(item.type=="ORG"){
orgStrs+=item.name+",";
}else if(item.type=="USER"){
userStrs+=item.name+",";
}
})
roleStrs=roleStrs.substring(0,roleStrs.lastIndexOf(","));
orgStrs=orgStrs.substring(0,orgStrs.lastIndexOf(","));
userStrs=userStrs.substring(0,userStrs.lastIndexOf(","));
if(roleStrs.length>0){
html.push("角色:"+roleStrs+"<br/>");
}
if(orgStrs.length>0){
html.push("组织:"+orgStrs+"<br/>");
}
if(userStrs.length>0){
html.push("人员:"+userStrs+"<br/>");
}
html.push('</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">任务类型: </td>');
html.push('<td>单人处理</td>');
html.push('</tr>');
html.push('<tr>');
html.push('<td class="clum">任务状态: </td>');
html.push('<td>未执行</td>');
html.push('</tr></tbody>');
html.push('</table>');
html.push('</div>');
var content = html.join('');
if(event=='element.hover'){
overlays.add(e.element.id, 'note', {
position: {
bottom: 0,
right: 0
},
html: content
});
}
}
});
}
function appendLineHtml(overlays,event,id){//拼写输出线名称
var html = new Array();
var hash = {};//数组去重
var lineList = viewer._getLineName.reduce(function(item, next) {
hash[next.id] ? '' : hash[next.id] = true && item.push(next);
return item;
}, []);
var thisNode=document.getElementById('line_'+id);
var list= lineList.filter(function(item){//判断这个输出线是否是截取的输出线名称
return item.id == id;
})
var listAct= arrayActId.filter(function(item){//判断这个节点是否
return item == id;
})
if(listAct.length==0){
arrayActId.push('line_'+id);
}
if(thisNode!=null && listAct.length==0){
document.getElementById('line_'+id).style="display:block";
return;
}
html.push('<div class="lchj-box" lineDiv="flag" onmouseover="showLineDiv(\'line_'+id+'\')" onmouseleave="hidenLineDiv(\'line_'+id+'\')" id="line_'+list[0].id+'"><div class="box-body">'+list[0].name);
html.push('</div></div>');
var content = html.join('');
//alert(list[0].name)
if(event=='element.hover'){
overlays.add(id, {
position: {
bottom: 0,
right: 0
},
html: content
});
}
}
//处理线的名称样式
function dealLine(canvas){
var hash = {};//数组去重
var lineList = viewer._getLineId.reduce(function(item, next) {
hash[next] ? '' : hash[next] = true && item.push(next);
return item;
}, []);
var colorClass = "highlight-label";
lineList.forEach(function(item){
canvas.addMarker(item+"_label", colorClass)
})
}
//添加环节处理次数
function addActNum(){
var overlays = viewer.get('overlays');
processTrace.forEach(function(item){
if(item.type=='multi' || item.type=='call'){
var list= processDetailLogs.filter(function(it){//获取处理记录信息
return it.historicTaskInstance.taskDefinitionKey == item.activityId;
})
overlays.add(item.activityId, 'note', {
position: {
bottom: 10,
right: 10
},
html: "<span class='num-color'>"+list.length+"</span>"
});
}
})
}
//渲染当前节点
function getCurrAct(){
processTrace.forEach(function(item){
viewer.get('canvas').removeMarker(item.activityId, "highlight_deal");
if(item.status=="1"){ //是否是当前环节
viewer.get('canvas').addMarker(item.activityId, "highlight_curr");
getPosition(item.activityId);
}
})
}
//渲染已处理的节点
function getMyDealed(){
processDetailLogs.forEach(function(item){
viewer.get('canvas').removeMarker(item.historicTaskInstance.taskDefinitionKey, "highlight_curr");
if(item.reiceiveUserId==$("#userId").val()){//是否等于当前登录人
viewer.get('canvas').addMarker(item.historicTaskInstance.taskDefinitionKey, "highlight_deal");
}
})
}
//定位
function getPosition(id){
var containerWidth = $('.bjs-container').width();
var containerHeight = $('.bjs-container').height();
var element = null;
var element = viewer.get('elementRegistry')._elements[id].element;
var x, y;
x = element.x + element.width;
y = element.y + element.height;
viewer.get('canvas').viewbox({
x: x- containerWidth/2,
y: y- containerHeight/2,
width: containerWidth,
height: containerHeight
});
}
</script>
</body>
</html>