RoadFlow2.1 临时演示

workflow-show.js 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404
  1. var wf_r = null;
  2. var wf_steps = [];
  3. var wf_texts = [];
  4. var wf_conns = [];
  5. var wf_option = "";
  6. var wf_focusObj = null;
  7. var wf_width = 108;
  8. var wf_height = 50;
  9. var wf_rect = 8;
  10. var wf_designer = false;
  11. var wf_connColor = isshowDesign ? "#898a89" : "#898a89";
  12. var wf_connColor1 = "green";
  13. var wf_nodeBorderColor = isshowDesign ? "#23508e" : "#7a7a7a";
  14. var wf_noteColor = "#efeff0";
  15. var wf_nodeBorderColor1 = "green";
  16. var wf_noteColor1 = "#e7f0c7";
  17. var wf_stepDefaultName = "";
  18. var tempArrPath = [];
  19. var mouseX = 0;
  20. var mouseY = 0;
  21. var wf_json = {};
  22. var wf_id = "";
  23. var links_tables_fields = [];
  24. var wf_r_width = 0;
  25. var wf_r_height = 0;
  26. $(function ()
  27. {
  28. wf_r_width = $(window).width() - 20;
  29. wf_r_height = $(window).height() - 80;
  30. wf_r = Raphael(0, 30, wf_r_width, wf_r_height);
  31. wf_r.customAttributes.type1 = function () { };
  32. wf_r.customAttributes.fromid = function () { };
  33. wf_r.customAttributes.toid = function () { };
  34. });
  35. function addStep(x, y, text, id, isIn)
  36. {
  37. var guid = getGuid();
  38. var xy = getNewXY();
  39. x = x || xy.x;
  40. y = y || xy.y;
  41. text = text || wf_stepDefaultName;
  42. id = id || guid;
  43. if (x > wf_r_width)
  44. {
  45. wf_r_width = wf_r_width + wf_width + 50;
  46. //wf_r.setSize(wf_r_width, wf_r_height);
  47. wf_r.setViewBox(0, 10, wf_r_width, wf_r_height);
  48. }
  49. if (y > wf_r_height)
  50. {
  51. wf_r_height = wf_r_height + wf_height + 100;
  52. //wf_r.setSize(wf_r_width, wf_r_height);
  53. wf_r.setViewBox(0, 10, wf_r_width, wf_r_height);
  54. }
  55. var rect = wf_r.rect(x, y, wf_width, wf_height, wf_rect);
  56. var fillcolor = wf_noteColor;
  57. var strokecolor = wf_nodeBorderColor;
  58. if (isIn)
  59. {
  60. fillcolor = wf_noteColor1;
  61. strokecolor = wf_nodeBorderColor1;
  62. }
  63. rect.attr({
  64. "fill": fillcolor, "stroke": strokecolor, "stroke-width": 1.4, "cursor": "default"
  65. });
  66. rect.id = id;
  67. rect.type1 = "step";
  68. wf_steps.push(rect);
  69. var text2 = text.length > 8 ? text.substr(0, 7) + "..." : text;
  70. var text1 = wf_r.text(x + 52, y + 25, text2);
  71. text1.attr({ "font-size": "12px" });
  72. if (text.length > 8) text1.attr({ "title": text });
  73. text1.id = "text_" + id;
  74. text1.type1 = "text";
  75. wf_texts.push(text1);
  76. }
  77. function setStepText(id, txt)
  78. {
  79. var stepText = wf_r.getById("text_" + id);
  80. if (stepText != null)
  81. {
  82. if (txt.length > 8)
  83. {
  84. stepText.attr({ "title": txt });
  85. txt = txt.substr(0, 7) + "...";
  86. }
  87. stepText.attr({ "text": txt });
  88. }
  89. }
  90. function setLineText(id, txt)
  91. {
  92. var line;
  93. for (var i = 0; i < wf_conns.length; i++)
  94. {
  95. if (wf_conns[i].id == id)
  96. {
  97. line = wf_conns[i];
  98. break;
  99. }
  100. }
  101. if (!line)
  102. {
  103. return;
  104. }
  105. var bbox = line.arrPath.getBBox();
  106. var txt_x = (bbox.x + bbox.x2) / 2;
  107. var txt_y = (bbox.y + bbox.y2) / 2;
  108. var lineText = wf_r.getById("line_" + id);
  109. if (lineText != null)
  110. {
  111. if (!txt)
  112. {
  113. lineText.remove();
  114. }
  115. else
  116. {
  117. lineText.attr("x", txt_x);
  118. lineText.attr("y", txt_y);
  119. lineText.attr("text", txt || "");
  120. }
  121. return;
  122. }
  123. if (txt)
  124. {
  125. var textObj = wf_r.text(txt_x, txt_y, txt);
  126. textObj.type1 = "line";
  127. textObj.id = "line_" + id;
  128. }
  129. }
  130. function connObj(obj, isIn, text)
  131. {
  132. if (isLine(obj))
  133. {
  134. wf_conns.push(wf_r.drawArr(obj, isIn));
  135. setLineText(obj.id, text);
  136. }
  137. }
  138. function isLine(obj)
  139. {
  140. if (!obj || !obj.obj1 || !obj.obj2)
  141. {
  142. return false;
  143. }
  144. if (obj.obj1 === obj.obj2)
  145. {
  146. return false;
  147. }
  148. if (!isStepObj(obj.obj1) || !isStepObj(obj.obj2))
  149. {
  150. return false;
  151. }
  152. for (var i = 0; i < wf_conns.length; i++)
  153. {
  154. if (obj.obj1 === obj.obj2 || (wf_conns[i].obj1 === obj.obj1 && wf_conns[i].obj2 === obj.obj2))
  155. {
  156. return false;
  157. }
  158. }
  159. return true;
  160. }
  161. function isStepObj(obj)
  162. {
  163. return obj && obj.type1 && obj.type1.toString() == "step";
  164. }
  165. function dragger()
  166. {
  167. this.ox = this.attr("x");
  168. this.oy = this.attr("y");
  169. changeStyle(this);
  170. };
  171. Raphael.fn.drawArr = function (obj, isIn)
  172. {
  173. if (!obj || !obj.obj1)
  174. {
  175. return;
  176. }
  177. if (!obj.obj2)
  178. {
  179. var point1 = getStartEnd(obj.obj1, obj.obj2);
  180. var path2 = getArr(point1.start.x, point1.start.y, mouseX, mouseY, 7);
  181. for (var i = 0; i < tempArrPath.length; i++)
  182. {
  183. tempArrPath[i].arrPath.remove();
  184. }
  185. tempArrPath = [];
  186. obj.arrPath = this.path(path2);
  187. obj.arrPath.attr({ "stroke-width": 1.7, "stroke": isIn ? wf_connColor1 : wf_connColor, "fill": wf_connColor });
  188. tempArrPath.push(obj);
  189. return;
  190. }
  191. var point = getStartEnd(obj.obj1, obj.obj2);
  192. var path1 = getArr(point.start.x, point.start.y, point.end.x, point.end.y, 7);
  193. try
  194. {
  195. if (obj.arrPath)
  196. {
  197. obj.arrPath.attr({ path: path1 });
  198. }
  199. else
  200. {
  201. obj.arrPath = this.path(path1);
  202. obj.arrPath.attr({ "stroke-width": 1.7, "stroke": isIn ? wf_connColor1 : wf_connColor, "fill": wf_connColor });
  203. if (wf_designer)
  204. {
  205. obj.arrPath.click(connClick);
  206. obj.arrPath.dblclick(connSetting);
  207. obj.arrPath.id = obj.id;
  208. obj.arrPath.fromid = obj.obj1.id;
  209. obj.arrPath.toid = obj.obj2.id;
  210. }
  211. }
  212. } catch (e) { }
  213. return obj;
  214. };
  215. function getStartEnd(obj1, obj2)
  216. {
  217. var bb1 = obj1 ? obj1.getBBox() : null;
  218. var bb2 = obj2 ? obj2.getBBox() : null;
  219. var p = [
  220. { x: bb1.x + bb1.width / 2, y: bb1.y - 1 },
  221. { x: bb1.x + bb1.width / 2, y: bb1.y + bb1.height + 1 },
  222. { x: bb1.x - 1, y: bb1.y + bb1.height / 2 },
  223. { x: bb1.x + bb1.width + 1, y: bb1.y + bb1.height / 2 },
  224. bb2 ? { x: bb2.x + bb2.width / 2, y: bb2.y - 1 } : {},
  225. bb2 ? { x: bb2.x + bb2.width / 2, y: bb2.y + bb2.height + 1 } : {},
  226. bb2 ? { x: bb2.x - 1, y: bb2.y + bb2.height / 2 } : {},
  227. bb2 ? { x: bb2.x + bb2.width + 1, y: bb2.y + bb2.height / 2 } : {}
  228. ];
  229. var d = {}, dis = [];
  230. for (var i = 0; i < 4; i++)
  231. {
  232. for (var j = 4; j < 8; j++)
  233. {
  234. var dx = Math.abs(p[i].x - p[j].x),
  235. dy = Math.abs(p[i].y - p[j].y);
  236. if (
  237. (i == j - 4) ||
  238. (((i != 3 && j != 6) || p[i].x < p[j].x) &&
  239. ((i != 2 && j != 7) || p[i].x > p[j].x) &&
  240. ((i != 0 && j != 5) || p[i].y > p[j].y) &&
  241. ((i != 1 && j != 4) || p[i].y < p[j].y))
  242. )
  243. {
  244. dis.push(dx + dy);
  245. d[dis[dis.length - 1]] = [i, j];
  246. }
  247. }
  248. }
  249. if (dis.length == 0)
  250. {
  251. var res = [0, 4];
  252. } else
  253. {
  254. res = d[Math.min.apply(Math, dis)];
  255. }
  256. var result = {};
  257. result.start = {};
  258. result.end = {};
  259. result.start.x = p[res[0]].x;
  260. result.start.y = p[res[0]].y;
  261. result.end.x = p[res[1]].x;
  262. result.end.y = p[res[1]].y;
  263. return result;
  264. }
  265. function getArr(x1, y1, x2, y2, size)
  266. {
  267. var angle = Raphael.angle(x1, y1, x2, y2);
  268. var a45 = Raphael.rad(angle - 28);
  269. var a45m = Raphael.rad(angle + 28);
  270. var x2a = x2 + Math.cos(a45) * size;
  271. var y2a = y2 + Math.sin(a45) * size;
  272. var x2b = x2 + Math.cos(a45m) * size;
  273. var y2b = y2 + Math.sin(a45m) * size;
  274. return ["M", x1, y1, "L", x2, y2, "M", x2, y2, "L", x2b, y2b, "L", x2a, y2a, "z"].join(",");
  275. }
  276. function getNewXY()
  277. {
  278. var x = 10, y = 50;
  279. if (wf_steps.length > 0)
  280. {
  281. var step = wf_steps[wf_steps.length - 1];
  282. x = parseInt(step.attr("x")) + 170;
  283. y = parseInt(step.attr("y"));
  284. if (x > wf_r.width - wf_width)
  285. {
  286. x = 10;
  287. y = y + 100;
  288. }
  289. if (y > wf_r.height - wf_height)
  290. {
  291. y = wf_r.height - wf_height;
  292. }
  293. }
  294. return { x: x, y: y };
  295. }
  296. function getGuid()
  297. {
  298. return Raphael.createUUID().toLowerCase();
  299. }
  300. function initwf()
  301. {
  302. wf_json = {};
  303. wf_steps = new Array();
  304. wf_texts = new Array();
  305. wf_conns = new Array();
  306. wf_r.clear();
  307. }
  308. Array.prototype.remove = function (n)
  309. {
  310. if (isNaN(n) || n > this.length) { return false; }
  311. this.splice(n, 1);
  312. }
  313. function removeArray(array, n)
  314. {
  315. if (isNaN(n) || n > array.length) { return false; }
  316. array.splice(n, 1);
  317. }
  318. function reloadFlow(json)
  319. {
  320. if (!json || !json.id || $.trim(json.id) == "") return false;
  321. wf_json = json;
  322. wf_id = wf_json.id;
  323. wf_r.clear();
  324. wf_steps = [];
  325. wf_conns = [];
  326. wf_texts = [];
  327. var steps = wf_json.steps;
  328. if (steps && steps.length > 0)
  329. {
  330. for (var i = 0; i < steps.length; i++)
  331. {
  332. var isIn = false;//该步骤是否走过
  333. for (var j = 0; j < taskJSON.length; j++)
  334. {
  335. if (taskJSON[j].stepid.toLowerCase() == steps[i].id.toLowerCase())
  336. {
  337. isIn = true;
  338. break;
  339. }
  340. }
  341. addStep(steps[i].position.x, steps[i].position.y, steps[i].name, steps[i].id, isIn);
  342. }
  343. for (var x = 0; x < taskJSON.length; x++)
  344. {
  345. if (taskJSON[x].status == "0" || taskJSON[x].status == "1")
  346. {
  347. var id = taskJSON[x].stepid;
  348. var step = wf_r.getById(id);
  349. if (step)
  350. {
  351. step.attr({ "fill": "#fdddb3", "stroke": "#fd6703" });
  352. }
  353. }
  354. }
  355. }
  356. var lines = wf_json.lines;
  357. if (lines && lines.length > 0)
  358. {
  359. for (var i = 0; i < lines.length; i++)
  360. {
  361. var isIn = false; //该线是否走过
  362. for (var j = 0; j < taskJSON.length; j++)
  363. {
  364. if (taskJSON[j].prevstepid.toLowerCase() == lines[i].from.toLowerCase() && taskJSON[j].stepid.toLowerCase() == lines[i].to.toLowerCase())
  365. {
  366. isIn = true;
  367. break;
  368. }
  369. }
  370. connObj({ id: lines[i].id, obj1: wf_r.getById(lines[i].from), obj2: wf_r.getById(lines[i].to) }, isIn, lines[i].text);
  371. }
  372. }
  373. }
  374. function openFlow1(id)
  375. {
  376. var json = $.ajax({
  377. url: top.rootdir + "/Platform/WorkFlowDesigner/GetJSON.ashx?type=0&appid=&flowid=" + id, async: false, cache: false, dataType: "json", success: function (json)
  378. {
  379. reloadFlow(json);
  380. }
  381. });
  382. }