|
|
<!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>
|
|
|
<script src="../../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
|
|
|
<script src="../../Scripts/designer.utility.js" type="text/javascript"></script>
|
|
|
<script src="../../Scripts/QueryString.js" type="text/javascript"></script>
|
|
|
<script src="../../Scripts/config.js" type="text/javascript"></script>
|
|
|
<script src="../../Comm/Gener.js" type="text/javascript"></script>
|
|
|
<script src="../../Admin/CCFlowEnum.js"></script>
|
|
|
|
|
|
<!--JL.plus-->
|
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
|
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no" />
|
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
|
|
|
<meta name="author" content="leipi.org" />
|
|
|
<link href="../../Admin/CCBPMDesigner/Public/css/bootstrap/css/bootstrap.css?2025" rel="stylesheet" type="text/css" />
|
|
|
<link href="../../Admin/CCBPMDesigner/Public/css/jquery-ui.min.css" rel="stylesheet" type="text/css" />
|
|
|
|
|
|
<!--[if lte IE 6]>
|
|
|
<link rel="stylesheet" type="text/css" href="Public/css/bootstrap/css/bootstrap-ie6.css?2025">
|
|
|
<![endif]-->
|
|
|
<!--[if lte IE 7]>
|
|
|
<link rel="stylesheet" type="text/css" href="Public/css/bootstrap/css/ie.css?2025">
|
|
|
<![endif]-->
|
|
|
<link href="../../Admin/CCBPMDesigner/Public/css/site.css?2025" rel="stylesheet" type="text/css" />
|
|
|
<link rel="stylesheet" type="text/css" href="../../Admin/CCBPMDesigner/Public/js/flowdesign/flowdesign.css" />
|
|
|
<!--select 2-->
|
|
|
<link rel="stylesheet" type="text/css" href="../../Admin/CCBPMDesigner/Public/js/jquery.multiselect2side/css/jquery.multiselect2side.css" />
|
|
|
|
|
|
<!--JL.plus-->
|
|
|
<script src="../../Scripts/EasyUIUtility.js" type="text/javascript"></script>
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/jquery-1.7.2.min.js?2025"></script>
|
|
|
<!--<script src="../../Scripts/jquery-1.11.0.min.js" type="text/javascript"></script>-->
|
|
|
<script src="../../Scripts/easyUI145/jquery.easyui.min.js" type="text/javascript"></script>
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/css/bootstrap/js/bootstrap.min.js?2025"></script>
|
|
|
<script type="text/javascript" src="../../Scripts/bootstrap/BootstrapUIDialog.js"></script>
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/jquery-ui/jquery-ui-1.9.2-min.js?2025"></script>
|
|
|
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/jsPlumb/bak/jquery.jsPlumb-1.4.0-all.js?2025"></script>
|
|
|
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/jquery.contextmenu.r2.js?2025"></script>
|
|
|
<!--select 2-->
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/jquery.multiselect2side/js/jquery.multiselect2side.js?2025"></script>
|
|
|
<!--flowdesign-->
|
|
|
<script type="text/javascript" src="../../Admin/CCBPMDesigner/Public/js/flowdesign/leipi.flowdesign.v3.js?2025"></script>
|
|
|
<script src="../../Admin/CCBPMDesigner/Designer2018.js" type="text/javascript"></script>
|
|
|
<!--layer-->
|
|
|
<script src="../../Scripts/layui/layui/layui.js"></script>
|
|
|
<link href="../../Scripts/layui/layui/css/layui.css" rel="stylesheet" />
|
|
|
<script src="../../../DataUser/JSLibData/CommonShowConfig.js"></script>
|
|
|
<script src="../../Scripts/layui/LayuiDialog.js"></script>
|
|
|
<style>
|
|
|
body {
|
|
|
background-color: #f7f6f9;
|
|
|
}
|
|
|
|
|
|
.navbar-fixed-top .navbar-inner {
|
|
|
background-color: #f7f6f9;
|
|
|
background-image: none;
|
|
|
border: 0 none;
|
|
|
font-size: 14px;
|
|
|
box-shadow: none;
|
|
|
}
|
|
|
|
|
|
.navbar-fixed-top .container {
|
|
|
width: auto;
|
|
|
padding: 7px 6px 0 0;
|
|
|
background-color: #f7f6f9;
|
|
|
}
|
|
|
|
|
|
.navbar .btn, .navbar .btn-group {
|
|
|
margin-top: 0;
|
|
|
}
|
|
|
|
|
|
.navbar .btn {
|
|
|
margin-right: 6px;
|
|
|
padding: 0 12px;
|
|
|
height: 26px;
|
|
|
color: #fff;
|
|
|
font-size: 12px;
|
|
|
line-height: 14px;
|
|
|
border: 0 none;
|
|
|
border-radius: 3px;
|
|
|
background-image: none;
|
|
|
box-shadow: none;
|
|
|
text-shadow: none;
|
|
|
box-sizing: border-box;
|
|
|
}
|
|
|
|
|
|
.btn-light-green {
|
|
|
background-color: #50b6ac;
|
|
|
}
|
|
|
|
|
|
.btn-light-green:hover, .btn-light-green:active, .btn-light-green:focus {
|
|
|
background-color: #50b6ac;
|
|
|
}
|
|
|
|
|
|
.btn-light-blue {
|
|
|
background-color: #62cae3;
|
|
|
}
|
|
|
|
|
|
.btn-light-blue:hover, .btn-light-blue:active, .btn-light-blue:focus {
|
|
|
background-color: #62cae3;
|
|
|
}
|
|
|
|
|
|
.btn-light-yellow {
|
|
|
background-color: #f3ba20;
|
|
|
}
|
|
|
|
|
|
.btn-light-yellow:hover, .btn-light-yellow:active, .btn-light-yellow:focus {
|
|
|
background-color: #f3ba20;
|
|
|
}
|
|
|
|
|
|
.btn-light-red {
|
|
|
background-color: #f74f52;
|
|
|
}
|
|
|
|
|
|
.btn-light-red:hover, .btn-light-red:active, .btn-light-red:focus {
|
|
|
background-color: #f74f52;
|
|
|
}
|
|
|
|
|
|
.navbar .btn-white {
|
|
|
border: 1px solid #031f5d;
|
|
|
background-color: #fff;
|
|
|
color: #031f5d;
|
|
|
}
|
|
|
|
|
|
.btn-white:hover, .btn-white:active, .btn-white:focus {
|
|
|
background-color: white;
|
|
|
}
|
|
|
|
|
|
.cs-main-box {
|
|
|
position: absolute;
|
|
|
/*top: 0px;
|
|
|
left: 12px;
|
|
|
right: 12px;
|
|
|
bottom: 60px;*/
|
|
|
height: auto;
|
|
|
width: calc(100% - 24px);
|
|
|
background-color: #fff;
|
|
|
box-shadow: 0 0 14px rgba(0,0,0,.1);
|
|
|
height: calc(100% - 50px);
|
|
|
overflow: scroll;
|
|
|
}
|
|
|
|
|
|
.modal {
|
|
|
position: absolute;
|
|
|
}
|
|
|
|
|
|
.cs-main-box .mini-layout {
|
|
|
height: auto;
|
|
|
}
|
|
|
|
|
|
.btn .badge {
|
|
|
margin-right: 3px;
|
|
|
width: 20px;
|
|
|
height: 20px;
|
|
|
line-height: 20px;
|
|
|
top: -3px;
|
|
|
padding: 0;
|
|
|
background-color: #031f5d;
|
|
|
border-radius: 10px;
|
|
|
}
|
|
|
|
|
|
.btn .badge i {
|
|
|
transform: scale(0.8);
|
|
|
}
|
|
|
|
|
|
btn-small [class^="icon-"], .btn-small [class*=" icon-"] {
|
|
|
margin: 2px 0 0 0;
|
|
|
}
|
|
|
|
|
|
.process-step {
|
|
|
background: #fff none;
|
|
|
border-color: #031f5d;
|
|
|
}
|
|
|
|
|
|
.process-step span, .process-lab span {
|
|
|
color: #031f5d;
|
|
|
}
|
|
|
|
|
|
/* .container.mini-layout path {
|
|
|
stroke: #839ace;
|
|
|
fill: #839ace;
|
|
|
}*/
|
|
|
|
|
|
.ui-dialog-titlebar {
|
|
|
background-color: #E6E6E6;
|
|
|
}
|
|
|
|
|
|
#mainul2 li {
|
|
|
margin-bottom: 7px;
|
|
|
}
|
|
|
</style>
|
|
|
|
|
|
</head>
|
|
|
<body>
|
|
|
<div class="container mini-layout cs-main-box" id="flowdesign_canvas">
|
|
|
</div>
|
|
|
<div id="trackinfo" style="display: none; position: absolute; width: 260px; height: auto;background-color: #fff">
|
|
|
<table id="tracktable" class="Table" cellpadding="0" cellspacing="0" border="1" style="width: 100%">
|
|
|
</table>
|
|
|
</div>
|
|
|
<style>
|
|
|
li {
|
|
|
list-style: none;
|
|
|
}
|
|
|
|
|
|
#nodeMenu li {
|
|
|
padding: 0px 0px 1px 5px;
|
|
|
}
|
|
|
|
|
|
#nodeMenu li:hover {
|
|
|
background-color: #2980b9;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
/****给弹出框URL写的样式*/
|
|
|
.ui-icon-closethick {
|
|
|
background-position: 0;
|
|
|
}
|
|
|
|
|
|
#fwcMenu li:hover {
|
|
|
background-color: #2980b9;
|
|
|
cursor: pointer;
|
|
|
}
|
|
|
|
|
|
.ui-widget-header .ui-icon {
|
|
|
top: 30% !important;
|
|
|
}
|
|
|
|
|
|
.ui-dialog .ui-dialog-titlebar-close {
|
|
|
background-image: url(Public/css/images/ui-icons_444444_256x240.png);
|
|
|
background-repeat: no-repeat;
|
|
|
background-position: 1px;
|
|
|
}
|
|
|
</style>
|
|
|
<script type="text/javascript">
|
|
|
|
|
|
var jdata;
|
|
|
var rFlow;
|
|
|
var r;
|
|
|
var arrs = [];
|
|
|
var linedots = [];
|
|
|
var dragNode;
|
|
|
var dragBorderPointStart;
|
|
|
var dragTextPointStart;
|
|
|
var dragTrackTextPointStart;
|
|
|
var dragPossibleTextPointStart;
|
|
|
var isSubFlowNode;
|
|
|
|
|
|
|
|
|
//定义样式变量,可在此统一修改流程样式 used
|
|
|
var STYLE_CURRENT_NODE_COLOR_FORE = 'Red'; //当前节点字体名称颜色
|
|
|
var STYLE_CURRENT_NODE_BORDER_COLOR = 'red'; //当前节点边框
|
|
|
|
|
|
var STYLE_CANVAS_COLOR = '#FFFFFF'; //画布背景颜色,E7F1F9
|
|
|
var STYLE_FONT_SIZE_NODE = 12; //节点名称字体大小
|
|
|
var STYLE_FONT_SIZE_LABEL = 12; //标签字体大小
|
|
|
|
|
|
var STYLE_NODE_WIDTH = 50; //节点宽度
|
|
|
var STYLE_NODE_HEIGHT = 50; //节点高度
|
|
|
var STYLE_NODE_COLOR_FORE = 'Gray'; //节点名称颜色
|
|
|
|
|
|
var STYLE_NODE_COLOR_FORE_HOVER = 'blue'; //节点名称鼠标悬停时颜色
|
|
|
var STYLE_NODE_COLOR_FORE_TRACK = 'green'; //走过的节点名称颜色
|
|
|
var STYLE_NODE_DEFAULT_ICON_PATH = '../../../DataUser/NodeIcon/'; //默认节点图标所在相对路径
|
|
|
var STYLE_NODE_DEFAULT_ICON = 'Default.jpg'; //默认节点图标文件名称
|
|
|
var STYLE_NODE_BORDER_RADIUS = 5; //节点边框圆角大小
|
|
|
var STYLE_NODE_BORDER_COLOR_FIRST = 'green'; //开始节点边框颜色
|
|
|
var STYLE_NODE_BORDER_COLOR_END = 'green'; //结束节点边框颜色
|
|
|
|
|
|
var STYLE_NODE_BORDER_COLOR_TRACK = 'green'; //走过的节点边框颜色
|
|
|
var STYLE_NODE_BORDER_COLOR = 'black'; //节点边框颜色
|
|
|
var STYLE_NODE_BORDER_COLOR_HOVER = 'blue'; //节点边框鼠标悬停时颜色
|
|
|
|
|
|
var STYLE_NODE_BORDER_WIDTH_NORMAL = 1; //节点边框宽度
|
|
|
var STYLE_NODE_BORDER_WIDTH_HOVER = 3; //节点边框鼠标悬停时的宽度
|
|
|
|
|
|
var STYLE_LABEL_COLOR_FORE = 'none'; //标签字体颜色
|
|
|
|
|
|
var STYLE_LINE_COLOR = 'Gray'; //连线颜色
|
|
|
var STYLE_LINE_HOVER_COLOR = 'blue'; //连线鼠标悬停时的颜色
|
|
|
var STYLE_LINE_WIDTH = 1; //连线宽度
|
|
|
var STYLE_LINE_TRACK_WIDTH = 2; //走过的连线宽度
|
|
|
var STYLE_LINE_TRACK_COLOR = 'green'; //走过的连线颜色
|
|
|
var STYLE_NODE_TRACK_FONT_SIZE = 14; //走过的节点轨迹信息字体大小
|
|
|
var STYLE_NODE_TRACK_FORE_COLOR = 'green'; //走过的节点轨迹信息字体颜色
|
|
|
//var DATA_USER_ICON_PATH = '/ccflow5/DataUser/UserIcon/';
|
|
|
var DATA_USER_ICON_PATH = '../../../DataUser/UserIcon/'; //用户头像文件相对目录
|
|
|
var DATA_USER_ICON_DEFAULT = 'Default.png'; //默认用户头像文件名称
|
|
|
var DATA_MULTI_USER_ICON_DEFAULT = '../../Img/Multiplayer.png'; //多用户头像文件相对路径
|
|
|
|
|
|
var fk_Flow;
|
|
|
var workID;
|
|
|
var fid;
|
|
|
var gwf;
|
|
|
var Hide_IsRead = getConfigByKey("Hide_IsRead", true);//是否隐藏该条信息,CommonShowConfig.js中定义
|
|
|
$(function () {
|
|
|
|
|
|
//解除节点双击事件
|
|
|
$(".process-step").die();//("dblclick");
|
|
|
|
|
|
fk_Flow = GetQueryString("FK_Flow");// uh["FK_Flow"];
|
|
|
workID = GetQueryString("WorkID");// uh["FK_Flow"];
|
|
|
fid = GetQueryString("FID");// uh["FK_Flow"];
|
|
|
|
|
|
if (!workID || workID == "null") {
|
|
|
workID = "0";
|
|
|
}
|
|
|
|
|
|
if (!fid || fid == "null") {
|
|
|
fid = "0";
|
|
|
}
|
|
|
|
|
|
gwf = new Entity("BP.WF.GenerWorkFlow", workID);
|
|
|
|
|
|
var Token = GetQueryString("Token");// uh["FK_Flow"];
|
|
|
var handler = new HttpHandler("BP.WF.HttpHandler.WF_WorkOpt_OneWork");
|
|
|
handler.AddPara("FK_Flow", fk_Flow);
|
|
|
handler.AddPara("WorkID", workID);
|
|
|
handler.AddPara("FID", fid);
|
|
|
|
|
|
if (Token != null && Token != undefined && Token != "") {
|
|
|
handler.AddPara("Token", Token);
|
|
|
}
|
|
|
var data = handler.DoMethodReturnString("Chart_Init");
|
|
|
if (typeof (data) === "string") {
|
|
|
if (data.indexOf('err@') == 0) {
|
|
|
alert(data);
|
|
|
return;
|
|
|
}
|
|
|
jdata = JSON.parse(data);
|
|
|
}
|
|
|
|
|
|
DrawStart(jdata); //执行绘制信息.
|
|
|
});
|
|
|
|
|
|
|
|
|
var nodeIsPass = {};
|
|
|
|
|
|
///开始绘制.
|
|
|
function DrawStart(datas) {
|
|
|
$('#holder').css('background-color', STYLE_CANVAS_COLOR);
|
|
|
|
|
|
var width = $(document).width();
|
|
|
var height = $(document).height();
|
|
|
var max = getMaxSize(datas.WF_Node, datas.WF_Direction);
|
|
|
|
|
|
if (height < 600) {
|
|
|
height = 600;
|
|
|
}
|
|
|
|
|
|
//r = Raphael('holder', Math.max(width, max.X) + 100, Math.max(height, max.Y) + 50);
|
|
|
var rNode, rDir, rBorder, rImage, rText, rLabel, rPath;
|
|
|
|
|
|
rFlow = new RFlow(fk_Flow);
|
|
|
|
|
|
//绘制节点
|
|
|
var nodeBorderColor = STYLE_NODE_BORDER_COLOR;
|
|
|
var startNodePosType = 0;
|
|
|
var endNodePosType = getMaxInArray(datas.WF_Node, 'NodePosType');
|
|
|
var nodeTracks;
|
|
|
var nodeTrack;
|
|
|
var isExist;
|
|
|
var currNode = parseInt(GetQueryString("FK_Node"));
|
|
|
var flowInfo = datas.FlowInfo[0];
|
|
|
var gwls = jdata.WF_GenerWorkerlist;
|
|
|
var subFlows = datas.WF_NodeSubFlow ||[];
|
|
|
var gwfs = datas.WF_GenerWorkFlow || [];
|
|
|
|
|
|
$('#tracktable').hover(function () { }, function () {
|
|
|
$('#trackinfo').offset({ top: 0, left: 0 });
|
|
|
$('#trackinfo').hide();
|
|
|
});
|
|
|
//1.移除所有默认的图标
|
|
|
$(".process-step .process-flag").remove();
|
|
|
|
|
|
$.each(datas.WF_Node, function () {
|
|
|
//确定边框颜色
|
|
|
switch (this.NODEPOSTYPE) {
|
|
|
case startNodePosType:
|
|
|
nodeBorderColor = STYLE_NODE_BORDER_COLOR_FIRST;
|
|
|
break;
|
|
|
case endNodePosType:
|
|
|
nodeBorderColor = STYLE_NODE_BORDER_COLOR_END;
|
|
|
break;
|
|
|
default:
|
|
|
nodeBorderColor = STYLE_NODE_BORDER_COLOR;
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
//检测轨迹数据,如果有,则将该节点图标换成处理人头像,人名绘制于节点图标的右侧.
|
|
|
nodeTracks = getTracksByFromNode(datas.Track, this.ID);
|
|
|
if (nodeTracks.length > 0) {
|
|
|
nodeTrack = getTrackForCurrNode(nodeTracks);
|
|
|
}
|
|
|
else {
|
|
|
nodeTrack = null;
|
|
|
}
|
|
|
|
|
|
//确定节点图标
|
|
|
if (nodeTrack != null) {
|
|
|
this.ICON = DATA_USER_ICON_PATH + (nodeTrack.type == "FROM" ? nodeTrack.track.EmpFrom : nodeTrack.track.EmpTo) + '.png';
|
|
|
|
|
|
isExist = checkUrl(encodeURI(this.ICON));
|
|
|
if (isExist == false) {
|
|
|
this.ICON = DATA_USER_ICON_PATH + DATA_USER_ICON_DEFAULT;
|
|
|
}
|
|
|
}
|
|
|
else {
|
|
|
if (this.ICON == null || this.ICON.length == 0) {
|
|
|
this.ICON = STYLE_NODE_DEFAULT_ICON_PATH + STYLE_NODE_DEFAULT_ICON;
|
|
|
}
|
|
|
else {
|
|
|
if (this.ICON.indexOf('.') == -1) {
|
|
|
this.ICON = STYLE_NODE_DEFAULT_ICON_PATH + this.ICON + '.png';
|
|
|
}
|
|
|
else {
|
|
|
this.ICON = STYLE_NODE_DEFAULT_ICON_PATH + this.ICON.substr(this.ICON.lastIndexOf('/') + 1);
|
|
|
}
|
|
|
|
|
|
isExist = checkUrl(encodeURI(this.ICON));
|
|
|
if (isExist == false) {
|
|
|
this.ICON = STYLE_NODE_DEFAULT_ICON_PATH + STYLE_NODE_DEFAULT_ICON;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var s = $("#window" + this.ID).prepend('<img width="30" height="30" preserveaspectratio="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); " src="' + this.ICON + '">');
|
|
|
//开始绘制
|
|
|
rNode = new RNode(this.ID, this.Name, this.X - STYLE_NODE_WIDTH / 2, this.Y - STYLE_NODE_HEIGHT / 2);
|
|
|
//rNode.rBorder = r.rect(rNode.x, rNode.y, STYLE_NODE_WIDTH, STYLE_NODE_HEIGHT, STYLE_NODE_BORDER_RADIUS);
|
|
|
// rNode.rIcon = r.image(this.ICON, rNode.x + 1, rNode.y + 1, STYLE_NODE_WIDTH - 2, STYLE_NODE_HEIGHT - 2);
|
|
|
|
|
|
//$($("#window" + this.ID).children("div").get(0)).remove();
|
|
|
//<img width="30" height="30" preserveaspectratio="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);" src="../../../DataUser/UserIcon/zhoupeng.png">
|
|
|
//rNode.rText = r.text(rNode.x + STYLE_NODE_WIDTH / 2, rNode.y + STYLE_NODE_HEIGHT + Math.ceil(this.Name.length / 7.00) * 7 + 10, breakstr(this.Name, 7)); //edited by liuxc,2016-3-31,增加节点名称换行处理
|
|
|
|
|
|
rNode.isTrackNode = nodeTrack != null;
|
|
|
rNode.tracks = nodeTracks;
|
|
|
rNode.currTrack = nodeTrack;
|
|
|
if (flowInfo.WFState == 3 && this.ID == currNode)
|
|
|
rNode.IsEndNode = true;
|
|
|
else
|
|
|
rNode.IsEndNode = false;
|
|
|
|
|
|
var borderColor = nodeBorderColor;
|
|
|
var TextColor = STYLE_NODE_COLOR_FORE;
|
|
|
//根据当前节点获取上一节点信息
|
|
|
var beforTrack = null;
|
|
|
var lastTwoBit = currNode.toString().substring(currNode.toString().length - 2);
|
|
|
//流程未结束
|
|
|
if (gwf.WFState == 3) {
|
|
|
TextColor = STYLE_NODE_COLOR_FORE_TRACK;
|
|
|
borderColor = STYLE_NODE_BORDER_COLOR_TRACK;
|
|
|
} else {
|
|
|
//显示当前节点的状态
|
|
|
var isPass = getGenerWorkerListByNodeID(this.ID, gwls);
|
|
|
if (isPass == 0) {
|
|
|
borderColor = STYLE_CURRENT_NODE_BORDER_COLOR;
|
|
|
TextColor = STYLE_CURRENT_NODE_COLOR_FORE;
|
|
|
}
|
|
|
if (isPass == 1) {
|
|
|
borderColor = STYLE_NODE_COLOR_FORE_TRACK;
|
|
|
TextColor = STYLE_NODE_BORDER_COLOR_TRACK;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
//在节点右侧绘制流程轨迹中当前节点的处理人/处理时间
|
|
|
if (rNode.isTrackNode) {
|
|
|
//判断此节点是否是多人处理 //是根据他上一节点的track来决定的
|
|
|
if (beforTrack != null && beforTrack.EmpToT.indexOf('多人接受') > -1) {
|
|
|
this.ICON = DATA_MULTI_USER_ICON_DEFAULT;
|
|
|
rNode.rIcon.attr("src", this.ICON);
|
|
|
}
|
|
|
//
|
|
|
var $node = $("#window" + this.ID);
|
|
|
var nodePos = $node.position();
|
|
|
var nodeTop = nodePos.top;
|
|
|
var nodeLeft = nodePos.left;
|
|
|
var nodeWidth = $("#window" + this.ID).width();
|
|
|
var nodeHeight = $("#window" + this.ID).height();
|
|
|
|
|
|
var trackLabLeft = nodeLeft + nodeWidth + 22;
|
|
|
var trackLabTop = nodeTop + nodeHeight / 2 - 20;
|
|
|
var trackLabHtml = rNode.currTrack.type == "FROM" ? (rNode.currTrack.track.EmpFromT + '</br>' + getChineseDateTime(rNode.currTrack.track.RDT)) : rNode.currTrack.track.EmpToT;
|
|
|
|
|
|
$("#window" + this.ID).after('<text text-anchor="start" font="10px "Arial"" stroke="#008000" fill="#008000" style="color:' + getFillTextColor(TextColor) + ';left:' + trackLabLeft + 'px;top:' + trackLabTop + 'px; ' +
|
|
|
'position: absolute;-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: start; font: 14px Arial;" font-size="14px">' + trackLabHtml + '</text>');
|
|
|
|
|
|
} else if (datas.Possible) {
|
|
|
|
|
|
}
|
|
|
var sId = "#window" + this.ID;
|
|
|
$(sId).css({ "border": "1px solid " + borderColor });
|
|
|
$(sId + " span").css({ "color": getFillTextColor(TextColor), "font-size": STYLE_FONT_SIZE_NODE });
|
|
|
|
|
|
//禁止节点拖动
|
|
|
$(sId).draggable('disable').removeClass("ui-state-disabled");
|
|
|
|
|
|
//增加节点图片的鼠标滑过/移开效果
|
|
|
$(sId).hover(function () {
|
|
|
$('#tracktable').empty();
|
|
|
var node = rFlow.getNode(this.id.replace("window", ""));
|
|
|
var Tracks = jdata.Track;
|
|
|
//审核组件信息.
|
|
|
var fwc = jdata.FrmWorkCheck;
|
|
|
|
|
|
if (node != null) {
|
|
|
//node.rBorder.attr({ "stroke": STYLE_NODE_BORDER_COLOR_HOVER, "stroke-width": STYLE_NODE_BORDER_WIDTH_HOVER });
|
|
|
//node.rText.attr({ "stroke": STYLE_NODE_COLOR_FORE_HOVER, "fill": getFillTextColor(STYLE_NODE_COLOR_FORE_HOVER) });
|
|
|
var trackType = 0;
|
|
|
if (node.currTrack != undefined)
|
|
|
trackType = node.currTrack.track.ActionType;
|
|
|
|
|
|
var tablehtml = "";
|
|
|
|
|
|
//增加到达时间,应完成时间.
|
|
|
var generWorkerLists = jdata.WF_GenerWorkerlist;
|
|
|
|
|
|
if (generWorkerLists != null) {
|
|
|
|
|
|
for (var i = 0; i < generWorkerLists.length; i++) {
|
|
|
|
|
|
var gwl = generWorkerLists[i];
|
|
|
if (gwl.FK_Node != node.id)
|
|
|
continue;
|
|
|
if (gwl.IsPass == -2)
|
|
|
continue;
|
|
|
|
|
|
var rdt = gwl.RDT;
|
|
|
if (rdt != "" && rdt != "无")
|
|
|
|
|
|
rdt = new Date(Date.parse(gwl.RDT.replace(/-/g, "/"))).format('yyyy-MM-dd hh:mm:ss');
|
|
|
|
|
|
var sdt = gwl.SDT;
|
|
|
if (sdt != "" && sdt != "无")
|
|
|
sdt = new Date(Date.parse(gwl.SDT.replace(/-/g, "/"))).format('yyyy-MM-dd hh:mm:ss');
|
|
|
|
|
|
var cdt = gwl.CDT;
|
|
|
if (cdt != "" && cdt != "无")
|
|
|
cdt = new Date(Date.parse(gwl.CDT.replace(/-/g, "/"))).format('yyyy-MM-dd hh:mm:ss')
|
|
|
|
|
|
tablehtml += "<table style='width:300px;'>";
|
|
|
tablehtml += "<caption>" + gwl.FK_EmpText + "</capiton>";
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
tablehtml += "<td>任务下达日期</td>";
|
|
|
tablehtml += "<td>" + rdt + "</td>";
|
|
|
tablehtml += "</tr>";
|
|
|
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
tablehtml += "<td>应完成日期</td>";
|
|
|
tablehtml += "<td>" + sdt + "</td>";
|
|
|
tablehtml += "</tr>";
|
|
|
|
|
|
|
|
|
rdt = rdt.replace(/\-/g, "/");
|
|
|
rdt = new Date(Date.parse(rdt.replace(/-/g, "/")));
|
|
|
if (sdt != "无") {
|
|
|
sdt = sdt.replace(/\-/g, "/");
|
|
|
sdt = new Date(Date.parse(sdt.replace(/-/g, "/")));
|
|
|
}
|
|
|
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
if (gwl.IsPass == 0) {
|
|
|
tablehtml += "<td>还剩余</td>";
|
|
|
if (sdt == "无")
|
|
|
tablehtml += "<td> ------</td>";
|
|
|
else
|
|
|
tablehtml += "<td> " + GetOverSpanTime(rdt, sdt) + "</td>";
|
|
|
} else if (gwl.IsPass == 1) {
|
|
|
tablehtml += "<td>实际完成</td>";
|
|
|
tablehtml += "<td> " + cdt + "</td>";
|
|
|
} else {
|
|
|
//队列模式
|
|
|
if (trackType == 27 && gwl.IsPass > 1) {
|
|
|
tablehtml += "<td>是否有待办</td>";
|
|
|
tablehtml += "<td> 无</td>";
|
|
|
}
|
|
|
}
|
|
|
tablehtml += "</tr>";
|
|
|
|
|
|
|
|
|
var cdt = cdt.replace(/\-/g, "/");
|
|
|
cdt = new Date(Date.parse(cdt.replace(/-/g, "/")));
|
|
|
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
if (gwl.IsPass == 1) {
|
|
|
tablehtml += "<td>用时</td>";
|
|
|
tablehtml += "<td> " + GetSpanTime(rdt, cdt) + "</td>";
|
|
|
}
|
|
|
tablehtml += "</tr>";
|
|
|
|
|
|
if (gwl.IsPass == 0 && Hide_IsRead == true) {
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
tablehtml += "<td>是否打开?</td>";
|
|
|
|
|
|
if (gwl.IsRead == 1)
|
|
|
tablehtml += "<td>是</td>";
|
|
|
else
|
|
|
tablehtml += "<td><font color=red>否</font></td>";
|
|
|
tablehtml += "</tr>";
|
|
|
}
|
|
|
|
|
|
tablehtml += "<tr style='background-color:InfoBackground' >";
|
|
|
tablehtml += "<td>发送人</td>";
|
|
|
var sender = gwl.Sender;
|
|
|
if (sender == "" || sender == undefined)
|
|
|
sender = "无";
|
|
|
|
|
|
tablehtml += "<td>" + sender + "</td>";
|
|
|
tablehtml += "</tr>";
|
|
|
}
|
|
|
|
|
|
tablehtml += "</table>";
|
|
|
|
|
|
//组织节点的轨迹信息
|
|
|
var p = $("#" + this.id).offset();
|
|
|
$('#tracktable').append(tablehtml);
|
|
|
$('#trackinfo').offset({ top: p.top + 20 - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//重track里面获取数据.
|
|
|
|
|
|
//获得上一个节点发送的日志.
|
|
|
|
|
|
var Tracks = jdata.Track;
|
|
|
var nextTracks = Tracks;
|
|
|
var NDTo = "";
|
|
|
var IsExist = false;
|
|
|
|
|
|
for (var i = 0; i < Tracks.length; i++) {
|
|
|
var track = Tracks[i];
|
|
|
if (track.ActionType == ActionType.FlowBBS)
|
|
|
continue;
|
|
|
if (track.ActionType == ActionType.WorkCheck)
|
|
|
continue;
|
|
|
if (track.ActionType == ActionType.FlowOver)
|
|
|
continue;
|
|
|
|
|
|
if (track.ActionType == ActionType.ForwardFL && track.EmpToT.indexOf("多人接受") == -1)
|
|
|
continue;
|
|
|
|
|
|
var nodeId = node.id;
|
|
|
|
|
|
if (track.NDTo == nodeId && track.FID != 0)
|
|
|
continue;
|
|
|
if (track.NDTo == nodeId && track.EmpToT.indexOf("多人接受") != -1)
|
|
|
continue;
|
|
|
|
|
|
//不是多人接受,并且EmpTo不相同。
|
|
|
if (track.EmpToT.indexOf("多人接受") == -1) {
|
|
|
if (track.EmpTo != node.currTrack.track.EmpTo)
|
|
|
continue;
|
|
|
else if (IsExist == true)
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
if (track.NDFrom == nodeId || track.NDTo == nodeId) {
|
|
|
|
|
|
NDTo = track.NDTo;
|
|
|
//node的最后两位判断是否为开始节点
|
|
|
var lastTwoBit = nodeId.toString().substring(nodeId.toString().length - 2);
|
|
|
|
|
|
var trackhtml = "<table style='width:300px;'>";
|
|
|
if (track.NDFrom == nodeId)
|
|
|
trackhtml += "<caption> " + track.EmpFromT + " </capiton>";
|
|
|
if (track.NDTo == nodeId && track.NDFrom != nodeId)
|
|
|
trackhtml += "<caption> " + track.EmpToT + " </capiton>";
|
|
|
trackhtml += "<tr style='background-color:InfoBackground' >";
|
|
|
if (lastTwoBit == "01")
|
|
|
trackhtml += "<td>任务启动日期</td>";
|
|
|
else
|
|
|
trackhtml += "<td>任务下达日期</td>";
|
|
|
var dtto = "";
|
|
|
//最后流程
|
|
|
if (lastTwoBit == "01") {
|
|
|
dtto = track.RDT;
|
|
|
} else {
|
|
|
|
|
|
for (var k = 0; k < Tracks.length; k++) {
|
|
|
var track1 = Tracks[k];
|
|
|
if (track1.NDTo == node.id && track1.RDT <= track.RDT) {
|
|
|
dtto = track1.RDT;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
trackhtml += "<td>" + dtto + "</td>";
|
|
|
trackhtml += "</tr>";
|
|
|
|
|
|
dtto = dtto.replace(/\-/g, "/");
|
|
|
dtto = new Date(Date.parse(dtto.replace(/-/g, "/")));
|
|
|
|
|
|
//判断是否有考核时间
|
|
|
var mypk = node.id + "_" + uh["WorkID"] + "_" + track.FID + "_" + track.EmpFrom;
|
|
|
var chext = new Entity("BP.WF.Data.CH");
|
|
|
chext.SetPKVal(mypk);
|
|
|
var count = chext.RetrieveFromDBSources();
|
|
|
var SDT = "无";
|
|
|
if (count == 1 && lastTwoBit != "01")
|
|
|
SDT = chext.SDT;
|
|
|
trackhtml += "<tr style='background-color:InfoBackground' >";
|
|
|
trackhtml += "<td>应完成日期</td>";
|
|
|
trackhtml += "<td>" + SDT + "</td>";
|
|
|
|
|
|
trackhtml += "</tr>";
|
|
|
|
|
|
|
|
|
var rdt = track.RDT.replace(/\-/g, "/");
|
|
|
rdt = new Date(Date.parse(rdt.replace(/-/g, "/")));
|
|
|
|
|
|
|
|
|
|
|
|
trackhtml += "<tr style='background-color:InfoBackground' >";
|
|
|
trackhtml += "<td>实际完成</td>";
|
|
|
|
|
|
if (track.NDFrom == node.id)
|
|
|
trackhtml += "<td id='cdt'> " + track.RDT + "</td>";
|
|
|
else if (track.NDTo == node.id && node.IsEndNode == true) {
|
|
|
//获取节点的track
|
|
|
var endTrack = Tracks[i - 1];
|
|
|
trackhtml += "<td id='cdt'> " + endTrack.RDT + "</td>";
|
|
|
rdt = new Date(Date.parse(endTrack.RDT.replace(/-/g, "/")));
|
|
|
}
|
|
|
else
|
|
|
continue;
|
|
|
|
|
|
trackhtml += "</tr>";
|
|
|
|
|
|
|
|
|
|
|
|
trackhtml += "<tr style='background-color:InfoBackground' >";
|
|
|
trackhtml += "<td>用时</td>";
|
|
|
trackhtml += "<td> " + GetSpanTime(dtto, rdt) + "</td>";
|
|
|
|
|
|
trackhtml += "</tr>";
|
|
|
trackhtml += "<tr style='background-color:InfoBackground' >";
|
|
|
trackhtml += "<td>发送人</td>";
|
|
|
if (lastTwoBit == "01")
|
|
|
trackhtml += "<td></td>"
|
|
|
else {
|
|
|
for (var k = 0; k < Tracks.length; k++) {
|
|
|
var track1 = Tracks[k];
|
|
|
if (track1.ActionType == ActionType.FlowBBS)
|
|
|
continue;
|
|
|
if (track1.ActionType == ActionType.WorkCheck)
|
|
|
continue;
|
|
|
if (track1.ActionType == ActionType.FlowOver)
|
|
|
continue;
|
|
|
if (track1.NDTo == node.id) {
|
|
|
trackhtml += "<td>" + track1.EmpFrom + "," + track1.EmpFromT + "</td>";
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
IsExist = true;
|
|
|
trackhtml += "</tr></table>";
|
|
|
tablehtml += trackhtml;
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
tablehtml += "</table>";
|
|
|
|
|
|
|
|
|
//组织节点的轨迹信息
|
|
|
var p = $(this.node).offset();
|
|
|
$('#tracktable').append(tablehtml);
|
|
|
$('#trackinfo').offset({ top: p.top + this.attr('height') - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
if (node.isTrackNode && node.currTrack.type == "FROM") {
|
|
|
|
|
|
node.rTrackText.attr({ "stroke": STYLE_NODE_COLOR_FORE_HOVER, "fill": getFillTextColor(STYLE_NODE_COLOR_FORE_HOVER) });
|
|
|
|
|
|
tablehtml +=
|
|
|
'<tr>' +
|
|
|
' <td colspan="4" class="GroupTitle">轨迹信息</td>' +
|
|
|
'</tr>';
|
|
|
|
|
|
var operID = ",";
|
|
|
|
|
|
$.each(node.tracks, function () {
|
|
|
|
|
|
var at = this.track.ACTIONTYPE;
|
|
|
if (at == 1 || at == 28 || at == 30) {
|
|
|
operID = this.track.EmpFrom + "_" + this.track.NDTo + ",";
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
$.each(node.tracks, function () {
|
|
|
|
|
|
if (this.type == "TO") {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
var val = this.track.ACTIONTYPETEXT;
|
|
|
|
|
|
var at = this.track.ACTIONTYPE;
|
|
|
|
|
|
if (val == "协作") {
|
|
|
operID = this.track.EmpFrom + "_" + this.track.NDTo;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (val == "前进" && node.isTrackNode.length != 1) {
|
|
|
operID = this.track.EmpFrom + "_" + this.track.NDTo;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
//仅仅显示已经审批过的人员记录, 对于打开过,但是没有审批的,不显示.
|
|
|
var myoperID = this.track.EmpFrom + "_" + this.track.NDTo;
|
|
|
|
|
|
if (at == 22 || val == "审核") {
|
|
|
if (operID.indexOf(myoperID) == 0) {
|
|
|
return true;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var emp = this.track.EmpToT;
|
|
|
if (emp.indexOf('(') >= 0) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
tablehtml +=
|
|
|
'<tr>' +
|
|
|
' <td style="width:120px">' + this.track.RDT + '</td>' +
|
|
|
' <td style="width:200px">' + this.track.ActionType + '</td>' +
|
|
|
' <td style="width:50px">' + this.track.EmpToT + '</td>' +
|
|
|
' <td><font color=green>' + this.track.Msg.replace(/~/g, "'") + '</font></td>' +
|
|
|
'</tr>';
|
|
|
});
|
|
|
}
|
|
|
else if (node.rTrackText) { //added by liuxc,2016-03-16
|
|
|
node.rTrackText.attr({ "stroke": STYLE_NODE_COLOR_FORE_HOVER, "fill": getFillTextColor(STYLE_NODE_COLOR_FORE_HOVER) });
|
|
|
}
|
|
|
else if (node.rPossibleText) { //added by liuxc,2016-04-15
|
|
|
node.rPossibleText.attr({ "stroke": STYLE_NODE_COLOR_FORE_HOVER, "fill": getFillTextColor(STYLE_NODE_COLOR_FORE_HOVER) });
|
|
|
}
|
|
|
|
|
|
if (workID == "0") {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var subcount = 0;
|
|
|
|
|
|
isSubFlowNode = false;
|
|
|
var subflows = getSubFlows(node.id);
|
|
|
for (var sf in subflows) {
|
|
|
isSubFlowNode = true;
|
|
|
tablehtml +=
|
|
|
'<tr>' +
|
|
|
' <td colspan="4" class="GroupTitle">' + subflows[sf].Name + '</td>' +
|
|
|
'</tr>';
|
|
|
|
|
|
$.each(subflows[sf].Flows, function () {
|
|
|
tablehtml +=
|
|
|
'<tr>' +
|
|
|
' <td style="width:120px;">' + this.RDT + '</td>' +
|
|
|
' <td style="width:200px"><a href="' + this.Url + '" target="_blank" style="color:' + STYLE_NODE_COLOR_FORE_HOVER + '">' + this.Title + '</a></td>' +
|
|
|
' <td style="width:50px;">' + this.WFStaText + '</td>' +
|
|
|
' <td>' + this.NodeName + '</td>' +
|
|
|
'</tr>';
|
|
|
});
|
|
|
}
|
|
|
|
|
|
|
|
|
if (tablehtml.length > 0) {
|
|
|
|
|
|
tablehtml = "<table>" + tablehtml;
|
|
|
tablehtml += "</table>";
|
|
|
|
|
|
//组织节点的轨迹信息
|
|
|
var p = $(this.node).offset();
|
|
|
$('#tracktable').append(tablehtml);
|
|
|
$('#trackinfo').offset({ top: p.top + this.attr('height') - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
}
|
|
|
}
|
|
|
}, function () {
|
|
|
var node = rFlow.getNodeByRIconId(this.id);
|
|
|
var lastTwoBit = currNode.toString().substring(currNode.toString().length - 2);
|
|
|
|
|
|
if (node != null) {
|
|
|
var borderColor = nodeBorderColor;
|
|
|
var TextColor = STYLE_NODE_COLOR_FORE;
|
|
|
//流程未结束
|
|
|
if (gwf.WFState == 3) {
|
|
|
TextColor = STYLE_NODE_COLOR_FORE_TRACK;
|
|
|
borderColor = STYLE_NODE_BORDER_COLOR_TRACK;
|
|
|
} else {
|
|
|
//显示当前节点的状态
|
|
|
var isPass = nodeIsPass[node.id][0];
|
|
|
if (isPass == 0) {
|
|
|
borderColor = STYLE_CURRENT_NODE_BORDER_COLOR;
|
|
|
TextColor = STYLE_CURRENT_NODE_COLOR_FORE;
|
|
|
}
|
|
|
if (isPass == 1) {
|
|
|
borderColor = STYLE_NODE_COLOR_FORE_TRACK;
|
|
|
TextColor = STYLE_NODE_BORDER_COLOR_TRACK;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
node.rBorder.attr({ "stroke": borderColor, "stroke-width": STYLE_NODE_BORDER_WIDTH_NORMAL });
|
|
|
node.rText.attr({ "stroke": TextColor, "fill": getFillTextColor(TextColor) });
|
|
|
if (node.rTrackText != null) {
|
|
|
|
|
|
node.rTrackText.attr({ "stroke": TextColor, "fill": getFillTextColor(STYLE_NODE_TRACK_FORE_COLOR) });
|
|
|
node.rTrackText.attr({ "stroke": TextColor, "fill": getFillTextColor(TextColor) });
|
|
|
}
|
|
|
|
|
|
|
|
|
if (isSubFlowNode == false) {
|
|
|
$('#trackinfo').offset({ top: 0, left: 0 });
|
|
|
$('#trackinfo').hide();
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
//加入到流程节点.
|
|
|
rFlow.nodes.push(rNode);
|
|
|
});
|
|
|
|
|
|
//线
|
|
|
$.each(jsPlumb.getConnections(), function (idx, connection) {
|
|
|
var ndFrom = this.sourceId.replace("window", "");
|
|
|
var ndTo = this.targetId.replace("window", "") || "";
|
|
|
var lineColor = datas.Track.findBy2Field("NDFrom", ndFrom, "NDTo", ndTo) != null ? STYLE_LINE_TRACK_COLOR : STYLE_LINE_COLOR;
|
|
|
if (ndTo.indexOf("S_") == 0) {
|
|
|
//禁止节点拖动
|
|
|
$("#"+this.targetId).draggable('disable').removeClass("ui-state-disabled");
|
|
|
if (ndTo == "S_" + ndFrom) { //合并模式显示
|
|
|
//说明是子流程,判断当前的子流程是否运行完成
|
|
|
var curAllgwfs = gwfs.filter(gwf => gwf.PNodeID == ndFrom);
|
|
|
if (curAllgwfs.length != 0) {
|
|
|
var curgwfs = curAllgwfs.filter(gwf => gwf.WFState == 3);
|
|
|
if (curgwfs.length == curAllgwfs.length) {
|
|
|
lineColor = STYLE_LINE_TRACK_COLOR;
|
|
|
$("#" + this.targetId).css({ "border": "1px solid " + STYLE_NODE_BORDER_COLOR_TRACK, "color": STYLE_NODE_COLOR_FORE_TRACK});
|
|
|
} else {
|
|
|
$("#" + this.targetId).css({ "border": "1px solid " + STYLE_CURRENT_NODE_BORDER_COLOR, "color": STYLE_CURRENT_NODE_COLOR_FORE });
|
|
|
}
|
|
|
}
|
|
|
$("#" + this.targetId).hover(function () {
|
|
|
var id = this.id.replace("windowS_", "");
|
|
|
if (id.length <= 5) {
|
|
|
//获取子流程
|
|
|
var curAllgwfs = gwfs.filter(gwf => gwf.PNodeID == id);
|
|
|
var sub = subFlows.filter(item => item.FK_Node == id);
|
|
|
//未发起子流程的时候
|
|
|
if (curAllgwfs == 0) {
|
|
|
if (sub.length == 1) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node=" + parseInt(sub[0].SubFlowNo) + "01&WorkID=0&FK_Flow=" + sub[0].SubFlowNo + "&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
OpenLayuiDialog(url, sub[0].SubFlowName, window.innerWidth * 0.8, 80, "auto");
|
|
|
} else {
|
|
|
//显示所有的子流程
|
|
|
var _html = "<ul class='layui-menu layui-menu-lg'>";
|
|
|
sub.forEach(function (item) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node=" + parseInt(item.SubFlowNo) + "01&WorkID=0&FK_Flow=" + item.SubFlowNo + "&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
_html += '<li class="layui-menu-item-group"><div class="layui-menu-body-title" style="color:black" onclick="OpenLayuiDialog(\'' + url + '\',\'' + item.SubFlowName + '\',' + window.innerWidth * 0.8 + ',80,\'auto\')"><span>' + item.SubFlowName + '</span></div></li><hr>';
|
|
|
})
|
|
|
_html += "</ul>";
|
|
|
$('#tracktable').empty();
|
|
|
var p = $(this).offset();
|
|
|
$('#tracktable').append(_html);
|
|
|
$('#trackinfo').offset({ top: p.top + $(this).height() - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
}
|
|
|
|
|
|
} else {
|
|
|
var _html = "<ul class='layui-menu layui-menu-lg'>";
|
|
|
sub.forEach(function (item) {
|
|
|
//判断是否有发起的流程
|
|
|
var subgwfs = curAllgwfs.filter(gwf => gwf.FK_Flow == item.SubFlowNo);
|
|
|
_html += "<li class='layui-menu-item-group'>";
|
|
|
if (subgwfs.length == 0) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node=" + parseInt(item.SubFlowNo) + "01&WorkID=0&FK_Flow=" + item.SubFlowNo + "&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
_html += '<div class="layui-menu-body-title" style="color:black" onclick="OpenLayuiDialog(\'' + url + '\',\'' + item.SubFlowName + '\',' + window.innerWidth * 0.8 + ',80,\'auto\')">';
|
|
|
}
|
|
|
else
|
|
|
_html += ' <div class="layui-menu-body-title" style="color:black">';
|
|
|
_html += item.SubFlowName;
|
|
|
_html += '<div>';
|
|
|
_html += '<hr>';
|
|
|
if (subgwfs.length != 0) {
|
|
|
_html += '<ul>';
|
|
|
subgwfs.forEach(function (gwf) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node="+gwf.FK_Node+"&WorkID="+gwf.WorkID+"&FK_Flow="+gwf.FK_Flow+"&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
_html += '<li><div class="layui-menu-body-title"><a href="javascript:void(0)" onclick="OpenLayuiDialog(\'' + url + '\',\'' + item.SubFlowName + '\',' + window.innerWidth * 0.8 + ',80,\'auto\')"><span>' + gwf.Title + '</span></li>';
|
|
|
})
|
|
|
_html +="</ul>"
|
|
|
}
|
|
|
_html += '</li>';
|
|
|
})
|
|
|
_html += '</ul>';
|
|
|
$('#tracktable').empty();
|
|
|
var p = $(this).offset();
|
|
|
$('#tracktable').append(_html);
|
|
|
$('#trackinfo').offset({ top: p.top + $(this).height() - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
}
|
|
|
}
|
|
|
}, function () {
|
|
|
//$('#tracktable').empty();
|
|
|
//$('#trackinfo').offset({ top: 0, left: 0 });
|
|
|
//$('#trackinfo').hide();
|
|
|
})
|
|
|
} else {
|
|
|
//平铺模式展示
|
|
|
var myPK = ndTo.replace("S_", "");
|
|
|
var sub = subFlows.filter(item => item.MyPK == myPK);
|
|
|
if (sub.length != 0) {
|
|
|
var curAllgwfs = gwfs.filter(gwf => gwf.PNodeID == ndFrom && gwf.FK_Flow == sub[0].SubFlowNo);
|
|
|
if (curAllgwfs.length != 0) {
|
|
|
var curgwfs = curAllgwfs.filter(gwf => gwf.WFState == 3);
|
|
|
if (curgwfs.length == curAllgwfs.length) {
|
|
|
lineColor = STYLE_LINE_TRACK_COLOR;
|
|
|
$("#" + this.targetId).css({ "border": "1px solid " + STYLE_NODE_BORDER_COLOR_TRACK, "color": STYLE_NODE_COLOR_FORE_TRACK });
|
|
|
} else {
|
|
|
$("#" + this.targetId).css({ "border": "1px solid " + STYLE_CURRENT_NODE_BORDER_COLOR, "color": STYLE_CURRENT_NODE_COLOR_FORE });
|
|
|
}
|
|
|
}
|
|
|
$("#" + this.targetId).hover(function () {
|
|
|
var id = this.id.replace("windowS_", "");
|
|
|
var _html = "";
|
|
|
if (id.length > 5) {
|
|
|
var sub = subFlows.filter(item => item.MyPK == id)[0];
|
|
|
var curAllgwfs = gwfs.filter(gwf => gwf.FK_Flow == sub.SubFlowNo);
|
|
|
if (curAllgwfs.length == 0) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node=" + parseInt(sub.SubFlowNo) + "01&WorkID=0&FK_Flow=" + sub.SubFlowNo + "&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
OpenLayuiDialog(url, sub.SubFlowName, window.innerWidth * 0.8, 80, "auto");
|
|
|
} else {
|
|
|
_html += '<ul>';
|
|
|
curAllgwfs.forEach(function (gwf) {
|
|
|
var url = basePath +"/WF/WorkOpt/OneWork/Chart.htm?FK_Node=" + gwf.FK_Node + "&WorkID=" + gwf.WorkID + "&FK_Flow=" + gwf.FK_Flow + "&FID=0&FromWorkOpt=1&CCSta=0"
|
|
|
_html += '<li><div class="layui-menu-body-title"><a href="javascript:void(0)" onclick="OpenLayuiDialog(\'' + url + '\',\'' + sub.SubFlowName + '\',' + window.innerWidth * 0.8 + ',80,\'auto\')"><span>' + gwf.Title + '</span></li>';
|
|
|
})
|
|
|
_html += "</ul>"
|
|
|
}
|
|
|
$('#tracktable').empty();
|
|
|
var p = $(this).offset();
|
|
|
$('#tracktable').append(_html);
|
|
|
$('#trackinfo').offset({ top: p.top + $(this).height() - 2, left: p.left });
|
|
|
$('#trackinfo').show();
|
|
|
}
|
|
|
}, function () {
|
|
|
//$('#tracktable').empty();
|
|
|
//$('#trackinfo').offset({ top: 0, left: 0 });
|
|
|
//$('#trackinfo').hide();
|
|
|
})
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
//设置有轨迹数据的线的颜色
|
|
|
var style = { "lineWidth": 3, "strokeStyle": lineColor, "fillStyle": lineColor };
|
|
|
connection.setPaintStyle(style, false);
|
|
|
//加上鼠标hover线上的颜色
|
|
|
style = { "lineWidth": 3, "strokeStyle": "blue", "fillStyle": "blue" };
|
|
|
this.setHoverPaintStyle(style, false);
|
|
|
});
|
|
|
|
|
|
//标签
|
|
|
$.each(datas.WF_LabNote, function () {
|
|
|
var labId = "#lab" + this.MyPK;
|
|
|
$(labId).draggable('disable').removeClass("ui-state-disabled");
|
|
|
});
|
|
|
}
|
|
|
|
|
|
function getMaxSize(nodes, dirs) {
|
|
|
|
|
|
/// <summary>获取所有节点坐标最大值</summary>
|
|
|
/// <param name="nodes" Type="Array">节点数组</param>
|
|
|
/// <param name="dirs" Type="Array">连线数组</param>
|
|
|
var xmax = 0;
|
|
|
var ymax = 0;
|
|
|
var ps, pss;
|
|
|
|
|
|
$.each(nodes, function () {
|
|
|
xmax = Math.max(xmax, this.X);
|
|
|
ymax = Math.max(ymax, this.Y);
|
|
|
});
|
|
|
|
|
|
$.each(dirs, function () {
|
|
|
if (this.DOTS && this.DOTS.length > 0) {
|
|
|
ps = this.DOTS.split('@');
|
|
|
|
|
|
for (var i = 0; i < ps.length; i++) {
|
|
|
if (ps[i].length == 0) {
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
pss = ps[i].split(',');
|
|
|
xmax = Math.max(xmax, parseFloat(pss[0]));
|
|
|
ymax = Math.max(ymax, parseFloat(pss[1]));
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return { X: xmax, Y: ymax };
|
|
|
}
|
|
|
|
|
|
function getSubFlows(nodeId) {
|
|
|
|
|
|
var subflows = {};
|
|
|
var flows = "";
|
|
|
var subflow;
|
|
|
|
|
|
$.each(jdata.FLOWINFO, function () {
|
|
|
if (this.PNodeID == 0 || this.PNodeID != nodeId) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
if (flows.indexOf(this.FK_Flow + ",") == -1) {
|
|
|
flows += this.FK_Flow + ",";
|
|
|
subflow = { No: this.FK_Flow, Name: this.FlowName, Flows: [] };
|
|
|
subflows["F" + this.FK_Flow] = subflow;
|
|
|
}
|
|
|
else {
|
|
|
subflow = subflows["F" + this.FK_Flow];
|
|
|
}
|
|
|
|
|
|
subflow.Flows.push({ Title: this.Title, NodeName: this.NodeName, WFStaText: this.WFStaText, RDT: this.RDT, Url: "./OneWork.htm?CurrTab=Truck&FK_Flow=" + this.FK_Flow + "&FK_Node=" + this.FK_Node + "&WorkID=" + this.WorkID + "&FID=0" });
|
|
|
});
|
|
|
|
|
|
return subflows;
|
|
|
}
|
|
|
|
|
|
function getDots(dotStr) {
|
|
|
if (!dotStr || dotStr.length == 0) {
|
|
|
return [];
|
|
|
}
|
|
|
|
|
|
var dots = [];
|
|
|
var strs = dotStr.split('@');
|
|
|
var sub;
|
|
|
|
|
|
$.each(strs, function () {
|
|
|
if (this.length == 0) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
sub = this.split(',');
|
|
|
|
|
|
if (sub.length != 2) {
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
dots.push({ x: parseFloat(sub[0]), y: parseFloat(sub[1]) });
|
|
|
});
|
|
|
|
|
|
return dots;
|
|
|
}
|
|
|
|
|
|
function breakstr(str, rowWordsCount) {
|
|
|
|
|
|
/// <summary>获取指定Raphael Text字符串换行显示字符串</summary>
|
|
|
/// <param name="str" Type="String">要换行的字符串</param>
|
|
|
/// <param name="rowWordsCount" Type="Number">每行字符数</param>
|
|
|
var newstr = '';
|
|
|
for (var i = 0; i < str.length; i++) {
|
|
|
newstr += (i + 1) % rowWordsCount == 0 ? (str.charAt(i) + '\n') : str.charAt(i);
|
|
|
}
|
|
|
|
|
|
return newstr;
|
|
|
}
|
|
|
|
|
|
function getFillTextColor(strokeColor) {
|
|
|
/// <summary>获取指定字体绘制颜色的填充颜色</summary>
|
|
|
/// <param name="time" Type="String">字体绘制颜色</param>
|
|
|
return strokeColor == "none" ? "black" : strokeColor;
|
|
|
}
|
|
|
|
|
|
function getChineseDateTime(time) {
|
|
|
|
|
|
if (!time || time.length < 10) {
|
|
|
return '';
|
|
|
}
|
|
|
|
|
|
var myDate = new Date(Date.parse(time.replace(/-/g, "/")));
|
|
|
return myDate.toLocaleString();
|
|
|
|
|
|
//alert(myDate);
|
|
|
//alert(myDate.getMonth());
|
|
|
//return myDate.getMonth() + "月" + myDate.getDate() + "日 " + myDate.getHours() + ":" + myDate.getMinutes() + ":" + myDate.getSeconds() ;
|
|
|
}
|
|
|
|
|
|
|
|
|
function iconDrag() {
|
|
|
this.ox = this.attr("x");
|
|
|
this.oy = this.attr("y");
|
|
|
this.animate({ "fill-opacity": 0.5 }, 500);
|
|
|
|
|
|
//记录与ICON绑定的其他对象的原始坐标
|
|
|
dragNode = rFlow.getNodeByRIconId(this.id);
|
|
|
dragBorderPointStart = { x: dragNode.rBorder.attr("x"), y: dragNode.rBorder.attr("y") };
|
|
|
dragTextPointStart = { x: dragNode.rText.attr("x"), y: dragNode.rText.attr("y") };
|
|
|
|
|
|
if (dragNode.isTrackNode) {
|
|
|
dragTrackTextPointStart = { x: dragNode.rTrackText.attr("x"), y: dragNode.rTrackText.attr("y") };
|
|
|
}
|
|
|
else if (dragNode.rTrackText) { //added by liuxc,2016-03-16
|
|
|
dragTrackTextPointStart = { x: dragNode.rTrackText.attr("x"), y: dragNode.rTrackText.attr("y") };
|
|
|
}
|
|
|
else if (dragNode.rPossibleText) { //added by liuxc,2016-04-15
|
|
|
dragPossibleTextPointStart = { x: dragNode.rPossibleText.attr("x"), y: dragNode.rPossibleText.attr("y") };
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function iconMove(dx, dy) {
|
|
|
var att = { x: this.ox + dx, y: this.oy + dy };
|
|
|
this.attr(att);
|
|
|
|
|
|
//动态修改与ICON绑定的其他对象的坐标
|
|
|
dragNode.rBorder.attr({ x: dragBorderPointStart.x + dx, y: dragBorderPointStart.y + dy });
|
|
|
dragNode.rText.attr({ x: dragTextPointStart.x + dx, y: dragTextPointStart.y + dy });
|
|
|
|
|
|
if (dragNode.isTrackNode) {
|
|
|
dragNode.rTrackText.attr({ x: dragTrackTextPointStart.x + dx, y: dragTrackTextPointStart.y + dy });
|
|
|
}
|
|
|
else if (dragNode.rTrackText) { //added by liuxc,2016-03-16
|
|
|
dragNode.rTrackText.attr({ x: dragTrackTextPointStart.x + dx, y: dragTrackTextPointStart.y + dy });
|
|
|
}
|
|
|
else if (dragNode.rPossibleText) { //added by liuxc,2016-04-15
|
|
|
dragNode.rPossibleText.attr({ x: dragPossibleTextPointStart.x + dx, y: dragPossibleTextPointStart.y + dy });
|
|
|
}
|
|
|
|
|
|
//重绘与该节点相连的连接线
|
|
|
for (var i = arrs.length; i--;) {
|
|
|
if (arrs[i].rStart.id == dragNode.rBorder.id || arrs[i].rEnd.id == dragNode.rBorder.id) {
|
|
|
r.drawArr(arrs[i]);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function iconUp() {
|
|
|
this.animate({ "fill-opacity": 1 }, 500);
|
|
|
|
|
|
if (dragNode.isTrackNode) {
|
|
|
var p = $(dragNode.rIcon.node).offset();
|
|
|
$('#trackinfo').offset({ top: p.top + dragNode.rIcon.attr('height') + 2, left: p.left });
|
|
|
dragNode = null;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
function RFlow(sFlowNo) {
|
|
|
/// <summary>流程</summary>
|
|
|
/// <param name="sFlowNo" Type="String">流程编号</param>
|
|
|
this.no = sFlowNo;
|
|
|
this.nodes = new Array();
|
|
|
this.labels = new Array();
|
|
|
this.dirs = new Array();
|
|
|
|
|
|
if (typeof RFlow._initialized == "undefined") {
|
|
|
RFlow.prototype.getNode = function (nodeid) {
|
|
|
/// <summary>根据指定节点ID获取该结点使用Raphael绘制的对象</summary>
|
|
|
/// <param name="nodeid" Type="Int">流程编号</param>
|
|
|
for (i in this.nodes) {
|
|
|
if (this.nodes[i].id == nodeid) {
|
|
|
return this.nodes[i];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
RFlow.prototype.getNodeByRIconId = function (raphaelid) {
|
|
|
/// <summary>根据绘制的节点中的ICON对象的id获取该结点使用Raphael绘制的对象</summary>
|
|
|
/// <param name="raphaelid" Type="Int">流程编号</param>
|
|
|
for (i in this.nodes) {
|
|
|
if (this.nodes[i] && this.nodes[i].rIcon && this.nodes[i].rIcon.id == raphaelid) {
|
|
|
return this.nodes[i];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return null;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>节点</summary>
|
|
|
/// <param name="iNodeID" Type="Int">节点ID</param>
|
|
|
/// <param name="sNodeName" Type="String">节点名称</param>
|
|
|
/// <param name="iX" Type="Int">节点中心点X坐标</param>
|
|
|
/// <param name="iY" Type="Int">节点中心点Y坐标</param>
|
|
|
function RNode(iNodeID, sNodeName, iX, iY) {
|
|
|
|
|
|
this.id = iNodeID;
|
|
|
this.name = sNodeName;
|
|
|
this.x = iX;
|
|
|
this.y = iY;
|
|
|
this.icon = '';
|
|
|
this.nodePosType = 0;
|
|
|
this.hisToNDs = '';
|
|
|
this.rBorder = null;
|
|
|
this.rIcon = null;
|
|
|
this.rText = null;
|
|
|
this.rTrackText = null;
|
|
|
this.rBorderColor = 'black';
|
|
|
this.isTrackNode = false;
|
|
|
this.tracks = null;
|
|
|
this.currTrack = null;
|
|
|
this.rPossibleText = null;
|
|
|
this.rPossible = null;
|
|
|
this.IsEndNode = false;
|
|
|
}
|
|
|
|
|
|
function RLabel(sPk, sLabelName, iX, iY) {
|
|
|
/// <summary>标签</summary>
|
|
|
/// <param name="sPk" Type="String">MyPk</param>
|
|
|
/// <param name="sLabelName" Type="String">标签文本</param>
|
|
|
/// <param name="iX" Type="Int">标签左上角X坐标</param>
|
|
|
/// <param name="iY" Type="Int">标签左上角Y坐标</param>
|
|
|
this.mypk = sPk;
|
|
|
this.name = sLabelName;
|
|
|
this.x = iX;
|
|
|
this.y = iY;
|
|
|
this.rText = null;
|
|
|
}
|
|
|
|
|
|
function RDirection(iFromNodeID, iToNodeID, iDirType, iIsCanBack) {
|
|
|
/// <summary>结点连接线</summary>
|
|
|
/// <param name="iFromNodeID" Type="Int">开始节点ID</param>
|
|
|
/// <param name="iToNodeID" Type="Int">结束节点ID</param>
|
|
|
/// <param name="iDirType" Type="Int">节点类型 0-前进 1-返回</param>
|
|
|
/// <param name="iIsCanBack" Type="Int">是否可以原路返回</param>
|
|
|
this.fromNodeID = iFromNodeID;
|
|
|
this.toNodeID = iToNodeID;
|
|
|
this.dirType = iDirType;
|
|
|
this.isCanBack = iIsCanBack;
|
|
|
this.rPath = null;
|
|
|
this.rPathColor = STYLE_LINE_COLOR;
|
|
|
this.FromNode = null;
|
|
|
this.ToNode = null;
|
|
|
this.LinkText = null;
|
|
|
}
|
|
|
|
|
|
function getMaxInArray(arr, propName) {
|
|
|
/// <summary>获取指定对象数组中指定属性的最大值</summary>
|
|
|
/// <param name="arr" Type="Array">对象数组</param>
|
|
|
/// <param name="propName" Type="String">属性名称</param>
|
|
|
var max = 0;
|
|
|
|
|
|
$.each(arr, function () {
|
|
|
for (prop in this) {
|
|
|
if (prop == propName && !isNaN(this[prop])) {
|
|
|
max = Math.max(max, this[prop]);
|
|
|
}
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return max;
|
|
|
}
|
|
|
|
|
|
function getTracksByFromNode(tracks, nodeId) {
|
|
|
/// <summary>从轨迹集合中获取指定节点的轨迹集合</summary>
|
|
|
/// <param name="tracks" Type="Array">所有轨迹数组</param>
|
|
|
/// <param name="nodeId" Type="Int">指定结点的ID</param>
|
|
|
var ts = new Array();
|
|
|
|
|
|
$.each(tracks, function () {
|
|
|
if (this.NDFrom == nodeId) {
|
|
|
ts.push({ track: this, type: "FROM" });
|
|
|
}
|
|
|
else if (this.NDTo == nodeId) {
|
|
|
ts.push({ track: this, type: "TO" });
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return ts;
|
|
|
}
|
|
|
|
|
|
|
|
|
//已知节点获取发送给他的节点
|
|
|
function getBeforeNodeTrack(tracks, nodeId, currentTrack) {
|
|
|
var ts = null;
|
|
|
for (var k = 0; k < tracks.length; k++) {
|
|
|
var track = tracks[k];
|
|
|
if (track.NDTo == nodeId && track.RDT <= currentTrack.RDT) {
|
|
|
ts = track;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
return ts;
|
|
|
}
|
|
|
|
|
|
function getTrackForCurrNode(tracks) {
|
|
|
/// <summary>获取此节点轨迹集合中的用于绘制到此节点的轨迹</summary>
|
|
|
/// <param name="tracks" Type="Array">轨迹数组</param>
|
|
|
for (var i = 0; i < tracks.length; i++) {
|
|
|
if (tracks[i].track.ActionType == 1 || //前进
|
|
|
tracks[i].track.ActionType == 2 || //退回
|
|
|
tracks[i].track.ActionType == 6 || //分流前进
|
|
|
tracks[i].track.ActionType == 7 || //合流前进
|
|
|
tracks[i].track.ActionType == 8 || //流程正常结束
|
|
|
tracks[i].track.ActionType == 11 || //子线程前进
|
|
|
tracks[i].track.ActionType == 26 || //自动条转的方式向下发送
|
|
|
tracks[i].track.ActionType == 27 || //队列发送
|
|
|
tracks[i].track.ActionType == 28) { //协作发送
|
|
|
return tracks[i];
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return tracks[tracks.length - 1];
|
|
|
}
|
|
|
|
|
|
function getGenerWorkerListByNodeID(nodeID, gwls) {
|
|
|
//返回的结果 -1 未办 0 待办 1 已办
|
|
|
var isPass = true;
|
|
|
var gwl = null;
|
|
|
for (var i = 0; i < gwls.length; i++) {
|
|
|
if (gwls[i].FK_Node == nodeID) {
|
|
|
gwl = gwls[i];
|
|
|
if (gwl.IsPass != 1)
|
|
|
isPass = 0;
|
|
|
//当前的流程处于分流状态
|
|
|
if (gwl.IsPass == -2)
|
|
|
isPass = 1;
|
|
|
}
|
|
|
}
|
|
|
if (gwl == null)
|
|
|
isPass = -1;
|
|
|
if (!$.isArray(nodeIsPass[nodeID])) {
|
|
|
nodeIsPass[nodeID] = [];
|
|
|
}
|
|
|
nodeIsPass[nodeID].push(isPass);
|
|
|
return isPass;
|
|
|
}
|
|
|
|
|
|
//获取组成箭头的三条线段的路径
|
|
|
/**function getArr(x1, y1, x2, y2, size, dots) {
|
|
|
var angle;
|
|
|
|
|
|
if (dots.length > 0) {
|
|
|
angle = Raphael.angle(dots[dots.length - 1].x, dots[dots.length - 1].y, x2, y2); //得到两点之间的角度
|
|
|
}
|
|
|
else {
|
|
|
angle = Raphael.angle(x1, y1, x2, y2);
|
|
|
}
|
|
|
|
|
|
var a45 = Raphael.rad(angle - 45); //角度转换成弧度
|
|
|
var a45m = Raphael.rad(angle + 45);
|
|
|
var x2a = x2 + Math.cos(a45) * size;
|
|
|
var y2a = y2 + Math.sin(a45) * size;
|
|
|
var x2b = x2 + Math.cos(a45m) * size;
|
|
|
var y2b = y2 + Math.sin(a45m) * size;
|
|
|
|
|
|
var result = [];
|
|
|
result.push("M"); result.push(x1); result.push(y1);
|
|
|
|
|
|
$.each(dots, function () {
|
|
|
result.push("L"); result.push(this.x); result.push(this.y);
|
|
|
});
|
|
|
|
|
|
result.push("L"); result.push(x2); result.push(y2);
|
|
|
result.push("L"); result.push(x2a); result.push(y2a);
|
|
|
result.push("M"); result.push(x2); result.push(y2);
|
|
|
result.push("L"); result.push(x2b); result.push(y2b);
|
|
|
|
|
|
//var result = ["M", x1, y1, "L", x2, y2, "L", x2a, y2a, "M", x2, y2, "L", x2b, y2b];
|
|
|
return result;
|
|
|
}*/
|
|
|
|
|
|
//function getStartEnd(obj1, obj2) {
|
|
|
// var bb1 = obj1.getBBox(),
|
|
|
// bb2 = obj2.getBBox();
|
|
|
// var p = [
|
|
|
// { x: bb1.x + bb1.width / 2, y: bb1.y - 1 },
|
|
|
// { x: bb1.x + bb1.width / 2, y: bb1.y + bb1.height + 1 },
|
|
|
// { x: bb1.x - 1, y: bb1.y + bb1.height / 2 },
|
|
|
// { x: bb1.x + bb1.width + 1, y: bb1.y + bb1.height / 2 },
|
|
|
// { x: bb2.x + bb2.width / 2, y: bb2.y - 1 },
|
|
|
// { x: bb2.x + bb2.width / 2, y: bb2.y + bb2.height + 1 },
|
|
|
// { x: bb2.x - 1, y: bb2.y + bb2.height / 2 },
|
|
|
// { x: bb2.x + bb2.width + 1, y: bb2.y + bb2.height / 2 }
|
|
|
// ];
|
|
|
// var d = {}, dis = [];
|
|
|
// for (var i = 0; i < 4; i++) {
|
|
|
// for (var j = 4; j < 8; j++) {
|
|
|
// var dx = Math.abs(p[i].x - p[j].x),
|
|
|
// dy = Math.abs(p[i].y - p[j].y);
|
|
|
// if (
|
|
|
// (i == j - 4) ||
|
|
|
// (((i != 3 && j != 6) || p[i].x < p[j].x) &&
|
|
|
// ((i != 2 && j != 7) || p[i].x > p[j].x) &&
|
|
|
// ((i != 0 && j != 5) || p[i].y > p[j].y) &&
|
|
|
// ((i != 1 && j != 4) || p[i].y < p[j].y))
|
|
|
// ) {
|
|
|
// dis.push(dx + dy);
|
|
|
// d[dis[dis.length - 1]] = [i, j];
|
|
|
// }
|
|
|
// }
|
|
|
// }
|
|
|
// if (dis.length == 0) {
|
|
|
// var res = [0, 4];
|
|
|
// } else {
|
|
|
// res = d[Math.min.apply(Math, dis)];
|
|
|
// }
|
|
|
// var result = {};
|
|
|
// result.start = {};
|
|
|
// result.end = {};
|
|
|
// result.start.x = p[res[0]].x;
|
|
|
// result.start.y = p[res[0]].y;
|
|
|
// result.end.x = p[res[1]].x;
|
|
|
// result.end.y = p[res[1]].y;
|
|
|
// return result;
|
|
|
//}
|
|
|
|
|
|
//Raphael.fn.drawArr = function (raphaelObj) {
|
|
|
// /// <summary>绘制带箭头的连接线</summary>
|
|
|
// /// <param name="raphaelObj" Type="Raphael Element">要绘制的连接的信息对象,包括rStart[开始对象]/rEnd[结束对象]/pathColor[连接线颜色]</param>
|
|
|
// //如果有折线点,则先将点画出,再计算开始结束点
|
|
|
// var point = { start: { x: 0, y: 0 }, end: { x: 0, y: 0 } };
|
|
|
// var dots = [];
|
|
|
// var lps = getLinePots(raphaelObj.node, raphaelObj.tonode);
|
|
|
// var d;
|
|
|
|
|
|
// if (raphaelObj.rDots.length > 0) {
|
|
|
// if (lps.length == 0) {
|
|
|
// dots = [];
|
|
|
|
|
|
// $.each(raphaelObj.rDots, function () {
|
|
|
// d = { rCircle: r.circle(this.x, this.y, 2), node: raphaelObj.node, tonode: raphaelObj.tonode };
|
|
|
// linedots.push(d);
|
|
|
// dots.push(d);
|
|
|
// });
|
|
|
// }
|
|
|
// else {
|
|
|
// dots = lps;
|
|
|
// }
|
|
|
|
|
|
// var p1 = getStartEnd(raphaelObj.rStart, dots[0].rCircle);
|
|
|
// var p2 = getStartEnd(dots[dots.length - 1].rCircle, raphaelObj.rEnd);
|
|
|
|
|
|
// point.start.x = p1.start.x;
|
|
|
// point.start.y = p1.start.y;
|
|
|
// point.end.x = p2.end.x;
|
|
|
// point.end.y = p2.end.y;
|
|
|
// }
|
|
|
// else {
|
|
|
// point = getStartEnd(raphaelObj.rStart, raphaelObj.rEnd);
|
|
|
// }
|
|
|
|
|
|
// var path1 = getArr(point.start.x, point.start.y, point.end.x, point.end.y, 8, raphaelObj.rDots);
|
|
|
// var pathColor;
|
|
|
|
|
|
// if (raphaelObj.arrPath) {
|
|
|
// raphaelObj.arrPath.attr({ path: path1 });
|
|
|
// }
|
|
|
// else {
|
|
|
// if (raphaelObj.pathColor) {
|
|
|
// pathColor = raphaelObj.pathColor;
|
|
|
// }
|
|
|
// else {
|
|
|
// pathColor = STYLE_LINE_COLOR;
|
|
|
// }
|
|
|
|
|
|
// raphaelObj.arrPath = this.path(path1);
|
|
|
// if (pathColor == STYLE_NODE_COLOR_FORE_TRACK) {
|
|
|
// raphaelObj.arrPath.attr({ "stroke": pathColor, "stroke-width": STYLE_LINE_TRACK_WIDTH });
|
|
|
// } else {
|
|
|
// raphaelObj.arrPath.attr({ "stroke": pathColor, "stroke-width": STYLE_LINE_WIDTH }); //设置"arrow-end": "classic-wide-long"有问题
|
|
|
// }
|
|
|
|
|
|
// raphaelObj.arrPath.hover(function () {
|
|
|
// this.attr("stroke", STYLE_LINE_HOVER_COLOR);
|
|
|
// }, function () {
|
|
|
// this.attr("stroke", pathColor);
|
|
|
// });
|
|
|
// }
|
|
|
|
|
|
// return raphaelObj;
|
|
|
//};
|
|
|
|
|
|
function getLinePots(node, tonode) {
|
|
|
if (!linedots) {
|
|
|
return [];
|
|
|
}
|
|
|
|
|
|
var ps = [];
|
|
|
|
|
|
for (var i = 0; i < linedots.length; i++) {
|
|
|
if (linedots[i].node == node && linedots[i].tonode == tonode) {
|
|
|
ps.push(linedots[i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return ps;
|
|
|
}
|
|
|
|
|
|
function checkUrl(url) {
|
|
|
|
|
|
url = DealText(url);
|
|
|
|
|
|
/// <summary>判断远程路径是否可以连接成功</summary>
|
|
|
/// <param name="url" Type="String">远程路径url</param>
|
|
|
|
|
|
var isSuccess;
|
|
|
|
|
|
$.ajax({
|
|
|
type: 'GET',
|
|
|
cache: false, //不下载远程url
|
|
|
async: false, //同步
|
|
|
url: url,
|
|
|
data: '',
|
|
|
xhrFields: {
|
|
|
withCredentials: true
|
|
|
},
|
|
|
crossDomain: true,
|
|
|
success: function () {
|
|
|
isSuccess = true;
|
|
|
},
|
|
|
error: function () {
|
|
|
isSuccess = false;
|
|
|
}
|
|
|
});
|
|
|
|
|
|
return isSuccess;
|
|
|
}
|
|
|
|
|
|
//剩余多少天
|
|
|
function GetOverSpanTime(date1, date2) {
|
|
|
//获取当前日期
|
|
|
var currDate = new Date();
|
|
|
if (currDate > date2)
|
|
|
return "0天";
|
|
|
return GetSpanTime(currDate, date2);
|
|
|
|
|
|
}
|
|
|
function GetSpanTime(date1, date2) {
|
|
|
///<summary>计算date2-date1的时间差,返回使用“x天x小时x分x秒”形式的字符串表示</summary>
|
|
|
var date3 = date2.getTime() - date1.getTime(); //时间差秒
|
|
|
var str = '';
|
|
|
//计算出相差天数
|
|
|
var days = Math.floor(date3 / (24 * 3600 * 1000));
|
|
|
if (days > 0) {
|
|
|
str += days + '天';
|
|
|
}
|
|
|
|
|
|
//计算出小时数
|
|
|
var leave1 = date3 % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
|
|
|
var hours = Math.floor(leave1 / (3600 * 1000));
|
|
|
if (hours > 0) {
|
|
|
str += hours + '小时';
|
|
|
}
|
|
|
|
|
|
//计算相差分钟数
|
|
|
var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
|
|
|
var minutes = Math.floor(leave2 / (60 * 1000));
|
|
|
if (minutes > 0) {
|
|
|
str += minutes + '分';
|
|
|
}
|
|
|
|
|
|
if (str.length == 0) {
|
|
|
var leave3 = leave2 % (60 * 1000);
|
|
|
var seconds = Math.floor(leave3 / 1000);
|
|
|
|
|
|
str += seconds + '秒';
|
|
|
|
|
|
if (seconds == NaN)
|
|
|
return date1 + "," + date2;
|
|
|
return str;
|
|
|
}
|
|
|
|
|
|
return str;
|
|
|
}
|
|
|
|
|
|
//时间格式
|
|
|
Date.prototype.format = function (format) {
|
|
|
var date = {
|
|
|
"M+": this.getMonth() + 1,
|
|
|
"d+": this.getDate(),
|
|
|
"h+": this.getHours(),
|
|
|
"m+": this.getMinutes(),
|
|
|
"s+": this.getSeconds(),
|
|
|
"q+": Math.floor((this.getMonth() + 3) / 3),
|
|
|
"S+": this.getMilliseconds()
|
|
|
};
|
|
|
if (/(y+)/i.test(format)) {
|
|
|
format = format.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));
|
|
|
}
|
|
|
for (var k in date) {
|
|
|
if (new RegExp("(" + k + ")").test(format)) {
|
|
|
format = format.replace(RegExp.$1, RegExp.$1.length == 1
|
|
|
? date[k] : ("00" + date[k]).substr(("" + date[k]).length));
|
|
|
}
|
|
|
}
|
|
|
return format;
|
|
|
}
|
|
|
</script>
|
|
|
</body>
|
|
|
</html>
|