processRunProcessImage.jsp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469
  1. <%@page pageEncoding="UTF-8"%>
  2. <%@include file="/commons/include/html_doctype.html"%>
  3. <html>
  4. <head>
  5. <%@include file="/commons/include/form.jsp" %>
  6. <title>${processRun.subject}-流程图</title>
  7. <link href="${ctx}/styles/default/css/jquery.qtip.css" rel="stylesheet" />
  8. <link href="${ctx}/js/jquery/plugins/powerFloat.css" rel="stylesheet" type="text/css" />
  9. <script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery-powerFloat.js"></script>
  10. <script type="text/javascript" src="${ctx}/js/jquery/plugins/jquery.qtip.js" ></script>
  11. <script type="text/javascript" src="${ctx}/js/hotent/platform/bpm/ViewSubFlowWindow.js" ></script>
  12. <script type="text/javascript" src="${ctx}/js/hotent/platform/bpm/ViewSuperExecutionFlowWindow.js" ></script>
  13. <script type="text/javascript" src="${ctx}/js/util/easyTemplate.js" ></script>
  14. <script type="text/javascript" src="${ctx}/js/util/form.js"></script>
  15. <script type="text/javascript" src="${ctx}/js/hotent/platform/bpm/ProcessUrgeDialog.js"></script>
  16. <script type="text/javascript" src="${ctx}/js/hotent/platform/bpm/FlowUtil.js"></script>
  17. <script type="text/javascript" src="${ctx}/js/hotent/platform/system/ShowExeInfo.js" ></script>
  18. <script type="text/javascript" src="${ctx}/js/hotent/platform/system/UserInfo.js"></script>
  19. <style type="text/css">
  20. div.header{
  21. background-image: url(${ctx}/styles/default/images/tool_bg.jpg);
  22. height:24px;
  23. line-height:24px;
  24. font-weight: bold;
  25. font-size: 14px;
  26. padding-left: 5px;
  27. margin: 0;
  28. width: 394px;
  29. }
  30. div .legend {
  31. width:14px;
  32. height:14px;
  33. border: 1px solid black;
  34. float: left;
  35. }
  36. .table-task {
  37. margin: 0 auto;
  38. width:210px;
  39. border-collapse: collapse;
  40. }
  41. .table-task th {
  42. text-align: right;
  43. padding-right: 6px;
  44. color: #000;
  45. height: 32px;
  46. border: solid 1px #A8CFEB;
  47. font-weight: bold;
  48. text-align: right;
  49. font-size: 13px;
  50. font-weight: bold;
  51. padding-right: 5px;
  52. background-color: #D7D7D7;
  53. padding-right: 5px;
  54. border: 1px solid #656565;
  55. }
  56. .table-task td {
  57. border: solid 1px #656565;
  58. padding-left: 6px;
  59. text-align: left;
  60. line-height: 20px;
  61. }
  62. .target{
  63. height:20px;
  64. float: left;
  65. margin:10px;
  66. }
  67. div.icon{
  68. border:1px solid #000;
  69. line-height: 10px;
  70. width: 15px;
  71. height:15px;
  72. float: left;
  73. overflow: hidden;
  74. }
  75. .target span{
  76. margin: 0 0 0 5px;
  77. font-size: 14px;
  78. font-weight: bold;
  79. float:left;
  80. vertical-align: middle;
  81. white-space: nowrap;
  82. }
  83. </style>
  84. <script type="text/javascript">
  85. var processInstanceId="${processInstanceId}";
  86. var isStatusLoaded=false;
  87. var _height=${shapeMeta.height};
  88. //状态数据
  89. //var aryResult=null;
  90. //hjx add ifram自适应高度
  91. $(window.parent.document).find("#flowchart").load(function(){
  92. var main = $(window.parent.document).find("#flowchart");
  93. var thisheight = $(document).height()+30;
  94. main.height(thisheight);
  95. });
  96. function setIframeHeight(){
  97. var mainIFrame = window.parent.document.getElementById("flowchart");
  98. if(!mainIFrame)return;
  99. mainIFrame.style.height=_height+200;
  100. };
  101. $(function(){
  102. $.each($("div.flowNode"),function(){
  103. var obj=$(this);
  104. var nodeId=$(this).attr('id');
  105. if(obj.attr('type')=='userTask' || obj.attr('type')=='multiUserTask'){
  106. obj.css('cursor','pointer');
  107. //var url="${ctx}/platform/bpm/processRun/taskUser.ht?processInstanceId="+processInstanceId+"&nodeId=" + nodeId;
  108. //obj.powerFloat({ eventType: "click", target:url, targetMode: "ajax"});
  109. //只有用户任务和会签任务显示节点。
  110. checkStatusInfo(nodeId);
  111. }
  112. if(obj.attr('type')=='callActivity'){
  113. obj.css('cursor','pointer');
  114. obj.click(function(){
  115. var nodeId=obj.attr('id');
  116. var conf = {nodeId:nodeId,processInstanceId:processInstanceId};
  117. viewSubFlow(conf);
  118. });
  119. }
  120. });
  121. if(self!=top){
  122. setIframeHeight();
  123. }
  124. });
  125. function showResult(){
  126. var targetUrl = $(this).attr("candidateUserUrl") ;
  127. var template=$("#txtReceiveTemplate").val();
  128. $(this).qtip({
  129. content:{
  130. text:'加载中...',
  131. ajax:{
  132. url:targetUrl,
  133. type:"GET",
  134. success:function(data,status){
  135. var html=easyTemplate(template,data).toString();
  136. this.set("content.text",html);
  137. }
  138. },
  139. title:{
  140. text:"执行人列表"
  141. }
  142. },
  143. position: {
  144. at:'top left',
  145. target:'event',
  146. viewport: $(window)
  147. },
  148. show:{
  149. event:"focus mouseenter",
  150. },
  151. hide: {
  152. event:'unfocus mouseleave',
  153. fixed:true
  154. },
  155. style: {
  156. classes:'ui-tooltip-light ui-tooltip-shadow'
  157. }
  158. });
  159. }
  160. function viewSubFlow(conf){
  161. if(!conf) conf={};
  162. var url="${ctx}/platform/bpm/processRun/subFlowImage.ht?processInstanceId="+conf.processInstanceId+"&nodeId=" + conf.nodeId+"&processDefinitionId="+conf.processDefinitionId;
  163. var winArgs="dialogWidth=800px;dialogHeight=600px;help=0;status=0;scroll=1;center=1;";
  164. var winArgs="height=600,width=800,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes";
  165. url=url.getNewUrl();
  166. var win=window.open(url,"subFlow",winArgs);
  167. win.focus();
  168. }
  169. //初始化qtip
  170. function checkStatusInfo(nodeId){
  171. var html = getTableHtml(nodeId);
  172. if(html)
  173. var obj = $("#"+nodeId);
  174. $("#"+nodeId).qtip({
  175. content:{
  176. text:function(){
  177. var html = getTableHtml(nodeId);
  178. if(html){
  179. return html;
  180. }
  181. else{
  182. return "<span style='color:red;line-height:24px;'>未执行</span>";
  183. }
  184. },
  185. title:{
  186. text: "任务执行情况"
  187. }
  188. },
  189. position: {
  190. at:'center',
  191. target:'event',
  192. adjust: {
  193. x:-15,
  194. y:-15
  195. },
  196. viewport: ($.isIE6() ? "" : $(window))
  197. },
  198. show:{
  199. effect: function(offset) {
  200. $(this).slideDown(200);
  201. $("a[candidateUserUrl]").each(showResult);
  202. }
  203. },
  204. hide: {
  205. event:'mouseleave',
  206. fixed:true,
  207. delay:300
  208. },
  209. style: {
  210. classes:'ui-tooltip-light ui-tooltip-shadow',
  211. width : ($.isIE6()? 279 : "" )
  212. }
  213. });
  214. };
  215. var taskNodeStatus={};
  216. //加载流程状态数据。
  217. function loadStatus(nodeId){
  218. var status = taskNodeStatus[nodeId];
  219. if(!status && status!=""){
  220. var url="${ctx}/platform/bpm/processRun/getFlowStatusByInstanceIdAndNodeId.ht";
  221. var params={
  222. instanceId:processInstanceId,
  223. nodeId:nodeId
  224. };
  225. $.ajax({
  226. url:url,
  227. async:false,
  228. data:params
  229. }).done(function(result){
  230. status=result;
  231. });
  232. taskNodeStatus[nodeId]=status;
  233. }
  234. return status;
  235. };
  236. //构建显示的html
  237. function getTableHtml(nodeId){
  238. var node = loadStatus(nodeId);
  239. if (!node)
  240. return false;
  241. var taskOpinionList = node.taskOpinionList;
  242. var taskExecutorList = node.taskExecutorList;
  243. var lastCheckStatus = node.lastCheckStatus;
  244. var html = [ '<div style="max-height:340px;width:260px;overflow:auto;">' ];
  245. if (lastCheckStatus != "-2") { //正在执行的节点
  246. if (!taskOpinionList||taskOpinionList.length == 0) {
  247. return false;
  248. } else {
  249. var tableHtml = $("#txtTaskStatus").val();
  250. var str = easyTemplate(tableHtml, node);
  251. html.push(str);
  252. html.push('</div>');
  253. }
  254. }else if(lastCheckStatus == "-2"){ //未执行的节点
  255. if (!taskExecutorList||taskExecutorList.length == 0) {
  256. return false;
  257. } else {
  258. var tableHtml = $("#txtTaskStatusExecutors").val();
  259. var str = easyTemplate(tableHtml, node);
  260. html.push(str);
  261. html.push('</div>');
  262. }
  263. }
  264. return html.join('');
  265. }
  266. </script>
  267. </head>
  268. <body>
  269. <div class="l-layout-header" style="width: 1200px;">流程实例-【<i>${processRun.subject}</i>】流程图。</div>
  270. <div class="panel">
  271. <c:if test="${param.tab eq 1 }">
  272. <c:choose>
  273. <c:when test="${processRun.status==2 || processRun.status==3}">
  274. <f:tab curTab="processImage" tabName="process" />
  275. </c:when>
  276. <c:otherwise>
  277. <f:tab curTab="processImage" tabName="process" hideTabs="copyUser"/>
  278. </c:otherwise>
  279. </c:choose>
  280. </c:if>
  281. <div class="panel-body">
  282. <div>
  283. <div class="target">
  284. <div class="icon" style="background:gray;"></div>
  285. <span>未执行</span>
  286. </div>
  287. <div class="target">
  288. <div class="icon" style="background:#F89800;"></div>
  289. <span>提交</span>
  290. </div>
  291. <div class="target">
  292. <div class="icon" style="background:#FFE76E;"></div>
  293. <span>重新提交</span>
  294. </div>
  295. <div class="target">
  296. <div class="icon" style="background:#00FF00;"></div>
  297. <span>同意</span>
  298. </div>
  299. <div class="target">
  300. <div class="icon" style="background:orange;"></div>
  301. <span>弃权</span>
  302. </div>
  303. <div class="target">
  304. <div class="icon" style="background:red;"></div>
  305. <span>当前节点</span>
  306. </div>
  307. <div class="target">
  308. <div class="icon" style="background:blue;"></div>
  309. <span>反对</span>
  310. </div>
  311. <div class="target">
  312. <div class="icon" style="background:#8A0902;"></div>
  313. <span>驳回</span>
  314. </div>
  315. <div class="target">
  316. <div class="icon" style="background:#023B62;"></div>
  317. <span>撤销</span>
  318. </div>
  319. <div class="target">
  320. <div class="icon" style="background:#338848;"></div>
  321. <span>会签通过</span>
  322. </div>
  323. <div class="target">
  324. <div class="icon" style="background:#82B7D7;"></div>
  325. <span>会签不通过</span>
  326. </div>
  327. <div class="target">
  328. <div class="icon" style="background:#EEAF97;"></div>
  329. <span>人工终止</span>
  330. </div>
  331. <div class="target">
  332. <div class="icon" style="background:#C33A1F;"></div>
  333. <span>完成</span>
  334. </div>
  335. </div>
  336. <div style="padding-top:20px;background-color: white;float:left;clear:both;">
  337. <div style="margin-bottom: 5px; "><b>说明:</b>点击任务节点可以查看节点的执行人员。
  338. <c:if test="${superInstanceId != null}">
  339. <a class="link setting" onclick="ViewSuperExecutionFlowWindow({'actInstanceId':'${superInstanceId}'})">查看主流程</a>
  340. </c:if>
  341. </div>
  342. <div id="divTaskContainer" 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;">
  343. ${shapeMeta.xml}
  344. </div>
  345. </div>
  346. <textarea id="txtTaskStatus" style="display:none">
  347. <#list data.taskOpinionList as obj>
  348. <table class="table-task" cellpadding="0" cellspacing="0" border="0">
  349. <tr><th>任务名称: </th>
  350. <td>\${obj.taskName}</td></tr>
  351. <#if (obj.checkStatus == -1)> <!-- 正在审批 -->
  352. <tr>
  353. <th>执行人: </th>
  354. <#if (obj.taskExeStatus==null)>
  355. <td></td>
  356. <#else>
  357. <td> <a href="javascript:userDetail('\${obj.taskExeStatus.executorId}');">\${obj.taskExeStatus.executor}</a>--\${obj.taskExeStatus.mainOrgName}\${obj.taskExeStatus.isRead==false?"(未读)":"(已读)"}</td>
  358. </#if>
  359. </tr>
  360. <tr>
  361. <th>候选人: </th>
  362. <#if (obj.candidateUserStatusList==null)>
  363. <td></td>
  364. <#else>
  365. <td>
  366. <#list obj.candidateUserStatusList as candidateUserStatus>
  367. <#if (candidateUserStatus.type=="user")>
  368. <a href="javascript:userDetail('\${candidateUserStatus.executorId}');">\${candidateUserStatus.candidateUser}</a>
  369. <span>--\${candidateUserStatus.mainOrgName}\${candidateUserStatus.isRead==false?"(<font color='red'>未读</font>)":"(<font color='green'>已读</font>)"} </span><br/>
  370. <#else>
  371. <#if (candidateUserStatus.type=="org")>
  372. <span><a href="javascript:;" candidateUserUrl="${ctx}/platform/system/sysUserOrg/getUserListByOrgId.ht?orgId=\${candidateUserStatus.executorId}">\${candidateUserStatus.candidateUser}</a>(组织)</span><br/>
  373. <#elseif (candidateUserStatus.type=="pos")>
  374. <span><a href="javascript:;" candidateUserUrl="${ctx}/platform/system/userPosition/getUserListByPosId.ht?posId=\${candidateUserStatus.executorId}">\${candidateUserStatus.candidateUser}</a>(岗位)</span><br/>
  375. <#elseif (candidateUserStatus.type=="role")>
  376. <span><a href="javascript:;" candidateUserUrl="${ctx}/platform/system/userRole/getUserListByRoleId.ht?roleId=\${candidateUserStatus.executorId}">\${candidateUserStatus.candidateUser}</a>(角色)</span><br/>
  377. <#elseif (candidateUserStatus.type=="group")>
  378. <span>\${candidateUserStatus.candidateUser}(用户分组)</span><br/>
  379. </#if>
  380. </#if>
  381. </#list>
  382. </td>
  383. </#if>
  384. </tr>
  385. <#else>
  386. <tr>
  387. <th>执行人: </th>
  388. <td><a href="javascript:userDetail('\${obj.exeUserId}');">\${obj.exeFullname}</a></td>
  389. </tr>
  390. </#if>
  391. <tr><th nowrap="nowrap">开始时间: </th>
  392. <td>\${obj.startTimeStr}</td></tr>
  393. <tr><th>结束时间: </th>
  394. <td>\${obj.endTimeStr}</td></tr>
  395. <tr><th >时长: </th>
  396. <td>\${obj.durTimeStr}</td></tr>
  397. <tr><th>状态: </th>
  398. <td>\${obj.status}</td></tr>
  399. <tr><th>意见: </th>
  400. <td>\${obj.opinion==null?"":obj.opinion}</td></tr>
  401. </table><br>
  402. </#list>
  403. </textarea>
  404. <textarea id="txtTaskStatusExecutors" style="display:none">
  405. <div>执行状态 : <span style='color:red;line-height: 24px;'>未执行</span> </div>
  406. <table class="table-task" cellpadding="0" cellspacing="0" border="0">
  407. <tr >
  408. <th width="50">执行人: </th>
  409. <td>
  410. <#list data.taskExecutorList as obj>
  411. <a href="javascript:userDetail('\${obj.executeId}');">\${obj.executor}</a>
  412. -- \${obj.mainOrgName}</br>
  413. </#list>
  414. </td>
  415. </tr>
  416. </table>
  417. </textarea>
  418. <textarea id="txtReceiveTemplate" style="display: none;">
  419. <div style="height:150px;width:150px;overflow:auto">
  420. <table class="table-detail" cellpadding="0" cellspacing="0" border="0">
  421. <#list data as obj>
  422. <tr>
  423. <th>\${obj_index+1}</th>
  424. <#if (obj.fullname==null)>
  425. <td>\${obj.userName}</td>
  426. <#else>
  427. <td>\${obj.fullname}</td>
  428. </#if>
  429. </tr>
  430. </#list>
  431. </table>
  432. </div>
  433. </textarea>
  434. </div>
  435. </div>
  436. </body>
  437. </html>