processRunSubFlowImage.jsp 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <%
  2. //显示流程示意图及显示每个任务节点上的执行人员
  3. %>
  4. <%@page pageEncoding="UTF-8"%>
  5. <%@include file="/commons/include/html_doctype.html"%>
  6. <html>
  7. <head>
  8. <title>流程执行示意图</title>
  9. <%@include file="/commons/include/form.jsp" %>
  10. <%-- <link href="${ctx}/styles/default/css/jquery.qtip.css" rel="stylesheet" /> --%>
  11. <f:link href="jquery.qtip.css"></f:link>
  12. <script type="text/javascript" src="${ctx}/js/dynamic.jsp"></script>
  13. <script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery-powerFloat.js"></script>
  14. <script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery.qtip.js" ></script>
  15. <script type="text/javascript" src="${ctx}/js/hotent/platform/bpm/ViewSubFlowWindow.js" ></script>
  16. <link href="${ctx}/js/jquery/plugins/powerFloat.css" rel="stylesheet" type="text/css" />
  17. <style type="text/css">
  18. div.header{
  19. background-image: url(${ctx}/styles/default/images/tool_bg.jpg);
  20. height:24px;
  21. line-height:24px;
  22. font-weight: bold;
  23. font-size: 14px;
  24. padding-left: 5px;
  25. margin: 0;
  26. width: 394px;
  27. }
  28. ul.legendContainer{
  29. position: relative;
  30. top:10px;
  31. left:10px;
  32. }
  33. ul.legendContainer li{
  34. list-style: none;
  35. font-size: 14px;
  36. display: inline-block;
  37. font-weight: bold;
  38. }
  39. ul.legendContainer li .legend{
  40. width:14px;
  41. height: 14px;
  42. border: 1px solid black;
  43. margin-right:5px;
  44. margin-top:2px;
  45. float: left;
  46. }
  47. .table-task {
  48. margin: 0 auto;
  49. width:260px;
  50. border-collapse: collapse;
  51. }
  52. .table-task th {
  53. text-align: right;
  54. padding-right: 6px;
  55. color: #000;
  56. height: 32px;
  57. border: solid 1px #A8CFEB;
  58. font-weight: bold;
  59. text-align: right;
  60. font-size: 13px;
  61. font-weight: bold;
  62. padding-right: 5px;
  63. background-color: #edf6fc;
  64. padding-right: 5px;
  65. border: 1px solid #8dc2e3;
  66. }
  67. .table-task td {
  68. border: solid 1px #A8CFEB;
  69. padding-left: 6px;
  70. text-align: left;
  71. }
  72. </style>
  73. <script type="text/javascript">
  74. var processDefinitionId = "${processDefinitionId}";
  75. // var processInstanceId="${processInstanceId}";
  76. var subProcessRun = "${subProcessRun}";
  77. var isStatusLoaded=false;
  78. var _height=${shapeMeta.height};
  79. //状态数据
  80. var aryResult=null;
  81. function setIframeHeight(){
  82. var mainIFrame = window.parent.document.getElementById("flowchart");
  83. if(!mainIFrame)return;
  84. mainIFrame.style.height=_height+200;
  85. };
  86. $(function(){
  87. if(subProcessRun==1){
  88. $.each($("div.flowNode"),function(){
  89. var processInstanceId = $(this).parent('[name="divTaskContainer"]').attr('procInstId');
  90. if($(this).attr('type')=='userTask' || $(this).attr('type')=='multiUserTask'){
  91. $(this).css('cursor','pointer');
  92. var nodeId=$(this).attr('id');
  93. var url="${ctx}/platform/bpm/processRun/taskUser.ht?processInstanceId="+processInstanceId+"&nodeId=" + nodeId;
  94. $(this).powerFloat({ eventType: "click", target:url, targetMode: "ajax"});
  95. }
  96. if($(this).attr('type')=='callActivity'){
  97. $(this).css('cursor','pointer');
  98. $(this).click(function(){
  99. var nodeId=$(this).attr('id');
  100. var conf = {nodeId:nodeId,processInstanceId:processInstanceId,processDefinitionId:processDefinitionId};
  101. viewSubFlow(conf);
  102. });
  103. }
  104. loadStatus(processInstanceId);
  105. });
  106. // loadStatus();
  107. if(self!=top){
  108. setIframeHeight();
  109. }
  110. }else{
  111. $.each($("div.flowNode"),function(){
  112. var processInstanceId = "";
  113. if($(this).attr('type')=='callActivity'){
  114. $(this).css('cursor','pointer');
  115. $(this).click(function(){
  116. var nodeId=$(this).attr('id');
  117. var conf = {nodeId:nodeId,processInstanceId:processInstanceId,processDefinitionId:processDefinitionId};
  118. viewSubFlow(conf);
  119. });
  120. }
  121. });
  122. }
  123. });
  124. function viewSubFlow(conf){
  125. if(!conf) conf={};
  126. var url="${ctx}/platform/bpm/processRun/subFlowImage.ht?processInstanceId="+conf.processInstanceId+"&nodeId=" + conf.nodeId+"&processDefinitionId="+conf.processDefinitionId;
  127. var winArgs="dialogWidth=800px;dialogHeight=600px;help=0;status=0;scroll=1;center=1;";
  128. url=url.getNewUrl();
  129. //window.showModalDialog(url,"",winArgs);
  130. /*KILLDIALOG*/
  131. DialogUtil.open({
  132. height:600,
  133. width: 800,
  134. title : '查看子流程',
  135. url: url,
  136. isResize: true,
  137. });
  138. }
  139. //初始化qtip
  140. function eventHandler(){
  141. $("div.flowNode").each(function(){
  142. if(!isStatusLoaded){
  143. loadStatus();
  144. return;
  145. }
  146. var obj=$(this);
  147. var taskId=obj.attr("id");
  148. if(obj.attr('type')!='userTask' && obj.attr('type')!='multiUserTask'){
  149. return;
  150. }
  151. var html=getTableHtml(taskId);
  152. if(!html){
  153. html="<span style='color:red;line-height:24px;'>未执行</span>";
  154. }
  155. $(this).qtip({
  156. content:{
  157. text:html,
  158. title:{
  159. text: '任务执行情况'
  160. }
  161. },
  162. position: {
  163. at:'center',
  164. target:'event',
  165. adjust: {
  166. x:-15,
  167. y:-15
  168. },
  169. viewport: $(window)
  170. },
  171. show:{
  172. effect: function(offset) {
  173. $(this).slideDown(200);
  174. }
  175. },
  176. hide: {
  177. event:'mouseleave',
  178. fixed:true
  179. },
  180. style: {
  181. classes:'ui-tooltip-light ui-tooltip-shadow'
  182. }
  183. });
  184. });
  185. }
  186. //加载流程状态数据。
  187. function loadStatus(processInstanceId){
  188. var url="${ctx}/platform/bpm/processRun/getFlowStatusByInstanceId.ht";
  189. var params={instanceId:processInstanceId};
  190. $.post(url,params,function(result){
  191. aryResult=result;
  192. isStatusLoaded=true;
  193. eventHandler();
  194. });
  195. }
  196. //构建显示的html
  197. function getTableHtml(taskId){
  198. var node=getNode(taskId);
  199. if(node==null) return false;
  200. var aryOptions=node.taskOpinionList;
  201. if(aryOptions.length==0)return false;
  202. var html=['<div>'];
  203. for(var i=0;i<aryOptions.length;i++){
  204. var p=aryOptions[i];
  205. var sb=new StringBuffer();
  206. var exeFullname=p.exeFullname;
  207. var taskName=p.taskName;
  208. var startTime=p.startTimeStr;
  209. var endTime=p.endTimeStr;
  210. var status=p.status;
  211. var opinion=p.opinion==null ?"无":p.opinion;
  212. var durTime=p.durTimeStr;
  213. sb.append('<table class="table-task" cellpadding="0" cellspacing="0" border="0">');
  214. sb.append('<tr><th width="30%">任务名: </th>');
  215. sb.append('<td>'+taskName+'</td></tr>');
  216. sb.append('<tr><th width="30%">执行人: </th>');
  217. sb.append('<td>'+exeFullname+'</td></tr>');
  218. sb.append('<tr><th width="30%">开始时间: </th>');
  219. sb.append('<td>'+startTime+'</td></tr>');
  220. sb.append('<tr><th width="30%">结束时间: </th>');
  221. sb.append('<td>'+endTime+'</td></tr>');
  222. sb.append('<tr><th width="30%">时长: </th>');
  223. sb.append('<td>'+durTime+'</td></tr>');
  224. sb.append('<tr><th width="30%">状态: </th>');
  225. sb.append('<td>'+status+'</td></tr>');
  226. sb.append('<tr><th width="30%">意见: </th>');
  227. sb.append('<td>'+opinion+'</td></tr>');
  228. sb.append("</table><br>");
  229. html.push(sb.toString());
  230. }
  231. html.push('</div>');
  232. return html.join('');
  233. }
  234. //从返回的结果中返回状态数据。
  235. function getNode(taskId){
  236. if(aryResult==null) return null;
  237. for(var i=0;i<aryResult.length;i++){
  238. var node=aryResult[i];
  239. var taskKey=node.taskKey;
  240. if(taskId==taskKey){
  241. return node;
  242. }
  243. }
  244. return null;
  245. }
  246. </script>
  247. </head>
  248. <body>
  249. <ul class="legendContainer">
  250. <li><div style="background-color:gray; " class="legend"></div>未执行</li>
  251. <li><div style="background-color:#00FF00;" class="legend"></div>同意</li>
  252. <li><div style="background-color:orange;" class="legend"></div>弃权</li>
  253. <li><div style="background-color:red;" class="legend"></div>当前节点</li>
  254. <li><div style="background-color:blue;" class="legend"></div>反对</li>
  255. <li><div style="background-color:#8A0902;" class="legend"></div>驳回</li>
  256. <li><div style="background-color:#023B62;" class="legend"></div>追回</li>
  257. <li><div style="background-color:#338848;" class="legend"></div>会签通过</li>
  258. <li><div style="background-color:#82B7D7;" class="legend"></div>会签不通过</li>
  259. </ul>
  260. <div style="padding-top:40px;background-color: white;">
  261. <div><b>说明:</b>点击任务节点可以查看节点的执行人员</div>
  262. <c:choose>
  263. <c:when test="${subProcessRun==1}">
  264. <c:forEach items="${processInstanceIds}" var="processInstanceId">
  265. <div name="divTaskContainer" procInstId="${processInstanceId }" style="margin:0 auto; position: relative;background:url('${ctx}/bpmImage?processInstanceId=${processInstanceId}&randId=<%=Math.random()%>') no-repeat;width:${shapeMeta.width}px;height:${shapeMeta.height}px;">
  266. ${shapeMeta.xml}
  267. </div>
  268. <hr/>
  269. </c:forEach>
  270. </c:when>
  271. <c:when test="${subProcessRun==0}">
  272. <div id="divTaskContainer" style="margin:0 auto; position: relative;background:url('${ctx}/bpmImage?definitionId=${processDefinitionId}&randId=<%=Math.random()%>') no-repeat;width:${shapeMeta.width}px;height:${shapeMeta.height}px;">
  273. ${shapeMeta.xml}
  274. </div>
  275. </c:when>
  276. </c:choose>
  277. </div>
  278. </body>
  279. </html>