play.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. var xmlData = '';
  2. var nodeInfo;
  3. var logNode = new Array();
  4. var interval;//定时器
  5. var time = 0;
  6. var model = null;//流程实例
  7. var lineHandle = ';';
  8. var showLog;
  9. $(document).ready(function(){
  10. showPlay();
  11. });
  12. function showPlay(){
  13. logNode={};
  14. var nodeId = new Array();
  15. var nodeName = new Array();
  16. nodeInfo ={};
  17. time = 0;
  18. xmlData = '<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd"><process id="Process_18p4xqa" /><bpmndi:BPMNDiagram id="sid-74620812-92c4-44e5-949c-aa47393d3830"><bpmndi:BPMNPlane id="sid-cdcae759-2af7-4a6d-bd02-53f3352a731d" bpmnElement="Process_18p4xqa" /><bpmndi:BPMNLabelStyle id="sid-e0502d32-f8d1-41cf-9c4a-cbb49fecf581"><omgdc:Font name="Arial" size="11" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" /></bpmndi:BPMNLabelStyle><bpmndi:BPMNLabelStyle id="sid-84cb49fd-2f7c-44fb-8950-83c3fa153d3b"><omgdc:Font name="Arial" size="12" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" /></bpmndi:BPMNLabelStyle></bpmndi:BPMNDiagram></definitions>';
  19. if(interval!=null)
  20. window.clearInterval(interval);
  21. $.ajax({
  22. url : basePath + 'WFP?module=instance&action=getPlayData&id='+id,
  23. type : 'POST',
  24. data : {
  25. },
  26. success : function(json) {
  27. var obj = JSON.parse(json);
  28. if(obj.template != null && obj.template != ''){
  29. model = obj.template;
  30. xmlData = obj.template.xmlData;
  31. nodeInfo = obj.template.nodeToId;
  32. $.each(obj.template.nodeToId, function(index) {
  33. nodeName[index] = obj.template.nodeToId[index].nodeName;
  34. nodeId[index] = obj.template.nodeToId[index].id;
  35. });
  36. $.each(obj.transacitons,function(index){
  37. logNode[index] = obj.transacitons[index];
  38. });
  39. var canHeight = isNaN(obj.template.height)?0:obj.template.height+30;
  40. var canWidth = isNaN(obj.template.width)?0:obj.template.width+20;
  41. if(type==1){
  42. //创建时间轴
  43. createtimeAxis(obj.transacitons);
  44. //设置宽高
  45. $('.mainBody').css('height',canHeight+115);
  46. $('.mainBody').css('width',canWidth+10);
  47. }else if(type==2){
  48. //创建日志列表
  49. createLogTable(obj.transacitons);
  50. //设置宽高
  51. $('.mainBody').css('height',canHeight+10);
  52. $('.mainBody').css('width',canWidth+300);
  53. }
  54. }else{
  55. var url = basePath + 'player/page/sl404.jsp';
  56. $("#bpmnPlay", parent.document).attr('src',url);
  57. $("#bubble").attr('style','display:none');
  58. // xmlData = '<?xml version="1.0" encoding="UTF-8"?><definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" targetNamespace="" xsi:schemaLocation="http://www.omg.org/spec/BPMN/20100524/MODEL http://www.omg.org/spec/BPMN/2.0/20100501/BPMN20.xsd"><process id="Process_18p4xqa" /><bpmndi:BPMNDiagram id="sid-74620812-92c4-44e5-949c-aa47393d3830"><bpmndi:BPMNPlane id="sid-cdcae759-2af7-4a6d-bd02-53f3352a731d" bpmnElement="Process_18p4xqa" /><bpmndi:BPMNLabelStyle id="sid-e0502d32-f8d1-41cf-9c4a-cbb49fecf581"><omgdc:Font name="Arial" size="11" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" /></bpmndi:BPMNLabelStyle><bpmndi:BPMNLabelStyle id="sid-84cb49fd-2f7c-44fb-8950-83c3fa153d3b"><omgdc:Font name="Arial" size="12" isBold="false" isItalic="false" isUnderline="false" isStrikeThrough="false" /></bpmndi:BPMNLabelStyle></bpmndi:BPMNDiagram></definitions>';
  59. }
  60. $("#show-button").trigger("click");
  61. }
  62. });
  63. }
  64. //创建日志列表
  65. function createLogTable(transacitons){
  66. $('#tableContent').empty();
  67. var html = '';
  68. $.each(transacitons,function(index){
  69. var background ='url(../js/jQuery-log/images/icon07.gif) no-repeat 83px 0;';
  70. if(transacitons[index].state ==='2'){
  71. background = 'url(../js/jQuery-log/images/icon07_yellow2.jpg) no-repeat 83px 0';
  72. }
  73. html = html + '<li style="width:292px;padding-bottom:30px;zoom:1;background:'+background+'">'
  74. + '<h3 style="display: block;">'+$(this).attr('startTime').substring(0,10)+'<span>'+ $(this).attr('startTime').substring(10)+'</span></h3>'
  75. + '<dl style="display: block;width:180px;"><dt><a class="nodeName">'+ $(this).attr('nodeName') +'</a>&nbsp;&nbsp;'
  76. + '操作人:<span>'+$(this).attr('author')+'</span><br>'
  77. + '<div style="margin-top:10px;height:20px;width:175px;font-size:10px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;" data-toggle="tooltip" title="'+$(this).attr('memo')+'">'+$(this).attr('memo')+'</div><br>'
  78. + '</dt></dl></li>';
  79. });
  80. $.getScript(basePath+"player/js/jQuery-log/js/jq22.js", function() {
  81. setTimeout("$('.contactusdiyou .history.scroll-y').show();",500)
  82. });
  83. $('.contactusdiyou .history-date ul').html(html);
  84. }
  85. //创建时间轴
  86. function createtimeAxis(transacitons){
  87. $('.cd-horizontal-timeline .timeline ol').empty();
  88. var liHtml = '';
  89. $('.cd-horizontal-timeline .events-content ol').empty();
  90. var descHtml = '';
  91. $.each(transacitons,function(index){
  92. liHtml +='<li><a onclick="showLog(this)" data-date="'+$(this).attr('id')+'" class="'+(index==0?'selected ':' ')+($(this).attr('state')==2?'yellow':'')+'">'+$(this).attr('nodeName')+'</a></li>'
  93. descHtml = descHtml +'<li '+(index==0?'class="selected"':'')+' data-date="'+$(this).attr('id')+'">'
  94. +'<em>操作人:<a>'+$(this).attr('author')+'</a>;&nbsp;操作时间:<a>'+$(this).attr('startTime')+'</a></em>'
  95. +(($(this).attr('memo')==''||$(this).attr('memo')=='null')?'':'<em>处理信息:<a>'+$(this).attr('memo')+'</a></em></li>');
  96. });
  97. $('.cd-horizontal-timeline .timeline ol').html(liHtml);
  98. $('.cd-horizontal-timeline .events-content ol').html(descHtml);
  99. $.getScript(basePath+"player/js/jQuery-sjz/js/main.js");
  100. }
  101. //创建时间轴日志
  102. function createtimeAxisLog(){
  103. var log = '';
  104. $('#event_box .parBd .slideBox').each(function(){
  105. if($(this).css('display')!='none'){
  106. log = $(this).html();
  107. return false;
  108. }
  109. });
  110. $('#log_box .parBd').html(log);
  111. }
  112. (function(BpmnViewer, $) {
  113. var bpmnViewer = new BpmnViewer({
  114. container: '#canvas'
  115. });
  116. var canvas = bpmnViewer.get('canvas'),
  117. overlays = bpmnViewer.get('overlays');
  118. function importXML(xml) {
  119. bpmnViewer.importXML(xml, function(err) {
  120. canvas.zoom('fit-viewport');
  121. var id = getOrder();
  122. addMark(id[0]);
  123. var i = time;
  124. $("#playButton").unbind('click').on('click',function(){
  125. $('#stopButton').attr('style','display:block');
  126. $('#playButton').attr('style','display:none');
  127. var id = getOrder();
  128. var lastId = id[id.length - 1];
  129. canvas.addMarker(lastId, 'currentNode');
  130. setTheme();
  131. runInterval();
  132. interval = self.setInterval(function(){
  133. runInterval();
  134. },3000);
  135. })
  136. function runInterval(){
  137. if(type==1){
  138. //时间轴轮播效果
  139. var selectId = $('.events-content li.selected').index();
  140. if(selectId!=i){
  141. $('.cd-horizontal-timeline .timeline ol li:eq('+i+') a').trigger('click');
  142. }
  143. }else if(type==2){
  144. //日志轮播效果
  145. removeMark();
  146. addMark(id[i]);
  147. var aid = '#log'+i;
  148. $('#tableContent').children().removeClass('active');
  149. $(aid).addClass('active');
  150. $('.history-date li').removeClass('red');
  151. $('.history-date li:eq('+i+')').addClass('red');
  152. $('.contactusdiyou').scrollTop($('.bounceInDown.red').position().top);
  153. }
  154. i++;
  155. if(i>id.length-1){
  156. i = 0;
  157. }
  158. time = i;
  159. }
  160. $("#stopButton").unbind('click').on('click',function(){
  161. $('#stopButton').attr('style','display:none');
  162. $('#playButton').attr('style','display:block');
  163. if(interval){
  164. interval = clearInterval(interval);
  165. }else{
  166. return;
  167. }
  168. });
  169. $("#playButton").trigger("click");
  170. $('#canvas g .djs-visual').unbind('click').on('click',function(){
  171. var taskId = $(this).parent().attr('data-element-id');
  172. var id = getOrder();
  173. for(var i=0;i<id.length;i++){
  174. if(id[i]==taskId){
  175. $('.cd-horizontal-timeline .timeline ol li:eq('+i+') a').trigger('click');
  176. return;
  177. }
  178. }
  179. });
  180. });
  181. }
  182. var showButton = document.querySelector('#show-button');
  183. showButton.addEventListener('click', function() {
  184. importXML(xmlData);
  185. })
  186. //获取流程图播放顺序表(节点id顺序)
  187. function getOrder(){
  188. var id = new Array();
  189. $.each(logNode,function(index){
  190. for(var i = 0;i<nodeInfo.length;i++){
  191. if(nodeInfo[i].nodeName === logNode[index].nodeName){
  192. id[index] = nodeInfo[i].id;
  193. }
  194. }
  195. });
  196. return id;
  197. }
  198. function addMark(id){
  199. overlays.add(id, 'note1', {
  200. position: {
  201. top: -5,
  202. left: -5
  203. },
  204. html: '<div class="showTop1"></div>'
  205. });
  206. overlays.add(id, 'note2', {
  207. position: {
  208. top: -5,
  209. right: 10
  210. },
  211. html: '<div class="showTop2"></div>'
  212. });
  213. overlays.add(id, 'note3', {
  214. position: {
  215. bottom: 10,
  216. left: -5
  217. },
  218. html: '<div class="showBottom1"></div>'
  219. });
  220. overlays.add(id, 'note4', {
  221. position: {
  222. bottom: 10,
  223. right: 10
  224. },
  225. html: '<div class="showBottom2"></div>'
  226. });
  227. }
  228. function removeMark(){
  229. overlays.clear();
  230. }
  231. //时间轴-展示节点日志
  232. showLog = function(obj){
  233. var id = getOrder();
  234. var i = $(obj).parent().index();
  235. removeMark();
  236. addMark(id[i]);
  237. }
  238. function setTheme(){
  239. //隐藏判断节点的X
  240. $('.djs-visual polygon').each(function(){
  241. $(this).parent().find('path').hide();
  242. });
  243. //节点加上已处理状态
  244. $.each(logNode,function(index){
  245. for(var i = 0;i<nodeInfo.length;i++){
  246. if(nodeInfo[i].nodeName === logNode[index].nodeName){
  247. nodeHandle(nodeInfo[i].id);
  248. }
  249. }
  250. });
  251. //创建已处理连线的marker
  252. $('defs').attr('id','defs');
  253. var marker=document.getElementById("markerUnhandle").cloneNode(true);
  254. marker.id="markerHandle";
  255. document.getElementById("defs").appendChild(marker);
  256. //遍历已处理的连线,看是否有已处理的节点未加class
  257. decideNodeHandle();
  258. }
  259. //给节点和连线加上状态
  260. function nodeHandle(nodeId){
  261. canvas.addMarker(nodeId, 'handled');
  262. //连线加上已处理状态
  263. $(xmlData).find("#"+nodeId+' incoming').each(function(){
  264. var lineId = $(xmlData).find("#"+nodeId+' incoming')[0].innerText;
  265. if(lineHandle.indexOf(';'+lineId+';')<0){
  266. lineHandle += lineId+';';
  267. canvas.addMarker(lineId, 'handled');
  268. return false;
  269. }
  270. });
  271. }
  272. //遍历已处理的连线,看是否有已处理的节点未加class
  273. function decideNodeHandle(){
  274. $('#canvas g[data-element-id^="SequenceFlow"].handled').each(function(){
  275. var lineId = $(this).attr('data-element-id');
  276. if($(xmlData).find("outgoing:contains('"+lineId+"')").length>0){
  277. var inNodeId = $(xmlData).find("outgoing:contains('"+lineId+"')").parent().attr('id');//出线节点id
  278. if(inNodeId.indexOf('StartEvent')<0&&$('#canvas g[data-element-id^="'+inNodeId+'"].handled').length==0){
  279. nodeHandle(inNodeId);
  280. decideNodeHandle();
  281. return false;
  282. }
  283. }
  284. });
  285. }
  286. })(window.BpmnJS, window.jQuery);