tool.js 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. const NODE_TYPE_MAP = { 0: 'start', 1: 'between', 2: 'end', 3: 'serial', 4: 'parallel' };
  2. /**
  3. * 将warm-flow的定义json数据转成LogicFlow支持的数据格式
  4. * @param {*} json
  5. * @returns LogicFlow的数据
  6. */
  7. export const json2LogicFlowJson = (definition) => {
  8. const graphData = {
  9. nodes: [],
  10. edges: []
  11. };
  12. // 解析definition属性
  13. graphData.flowCode = definition.flowCode;
  14. graphData.flowName = definition.flowName;
  15. graphData.version = definition.version;
  16. graphData.fromCustom = definition.fromCustom;
  17. graphData.fromPath = definition.fromPath;
  18. // 解析节点
  19. const allSkips = definition.nodeList.reduce((acc, node) => {
  20. if (node.skipList && Array.isArray(node.skipList)) {
  21. acc.push(...node.skipList);
  22. }
  23. return acc;
  24. }, []);
  25. const allNodes = definition.nodeList;
  26. // 解析节点
  27. if (allNodes.length) {
  28. for (var i = 0, len = allNodes.length; i < len; i++) {
  29. let node = allNodes[i];
  30. let lfNode = {
  31. text: {},
  32. properties: {}
  33. };
  34. // 处理节点
  35. lfNode.type = NODE_TYPE_MAP[node.nodeType];
  36. lfNode.id = node.nodeCode;
  37. let coordinate = node.coordinate;
  38. if (coordinate) {
  39. const attr = coordinate.split('|');
  40. const nodeXy = attr[0].split(',');
  41. lfNode.x = parseInt(nodeXy[0]);
  42. lfNode.y = parseInt(nodeXy[1]);
  43. if (attr.length === 2) {
  44. const textXy = attr[1].split(',');
  45. lfNode.text.x = parseInt(textXy[0]);
  46. lfNode.text.y = parseInt(textXy[1]);
  47. }
  48. }
  49. lfNode.text.value = node.nodeName;
  50. lfNode.properties.nodeRatio = node.nodeRatio.toString();
  51. lfNode.properties.permissionFlag = node.permissionFlag;
  52. lfNode.properties.anyNodeSkip = node.anyNodeSkip;
  53. lfNode.properties.listenerType = node.listenerType;
  54. lfNode.properties.listenerPath = node.listenerPath;
  55. lfNode.properties.formCustom = node.formCustom;
  56. lfNode.properties.formPath = node.formPath;
  57. lfNode.properties.ext = {};
  58. if (node.ext && typeof node.ext === 'string') {
  59. try {
  60. node.ext = JSON.parse(node.ext);
  61. node.ext.forEach((e) => {
  62. lfNode.properties.ext[e.code] = String(e.value).includes(',') ? e.value.split(',') : String(e.value);
  63. });
  64. } catch (error) {
  65. console.error('Error parsing JSON:', error);
  66. }
  67. }
  68. lfNode.properties.style = {};
  69. if (node.status === 2) {
  70. lfNode.properties.style.fill = '#F0FFD9';
  71. lfNode.properties.style.stroke = '#9DFF00';
  72. }
  73. if (node.status === 1) {
  74. lfNode.properties.style.fill = '#FFF8DC';
  75. lfNode.properties.style.stroke = '#FFCD17';
  76. }
  77. graphData.nodes.push(lfNode);
  78. }
  79. }
  80. if (allSkips.length) {
  81. // 处理边
  82. let skipEle = null;
  83. let edge = {};
  84. for (var j = 0, lenn = allSkips.length; j < lenn; j++) {
  85. skipEle = allSkips[j];
  86. edge = {
  87. text: {},
  88. properties: {}
  89. };
  90. edge.id = skipEle.id;
  91. edge.type = 'skip';
  92. edge.sourceNodeId = skipEle.nowNodeCode;
  93. edge.targetNodeId = skipEle.nextNodeCode;
  94. edge.text = { value: skipEle.skipName };
  95. edge.properties.skipCondition = skipEle.skipCondition;
  96. edge.properties.skipName = skipEle.skipName;
  97. edge.properties.skipType = skipEle.skipType;
  98. const expr = skipEle.expr;
  99. if (expr) {
  100. edge.properties.expr = skipEle.expr;
  101. }
  102. const coordinate = skipEle.coordinate;
  103. if (coordinate) {
  104. const coordinateXy = coordinate.split('|');
  105. edge.pointsList = [];
  106. coordinateXy[0].split(';').forEach((item) => {
  107. const pointArr = item.split(',');
  108. edge.pointsList.push({
  109. x: parseInt(pointArr[0]),
  110. y: parseInt(pointArr[1])
  111. });
  112. });
  113. edge.startPoint = edge.pointsList[0];
  114. edge.endPoint = edge.pointsList[edge.pointsList.length - 1];
  115. if (coordinateXy.length > 1) {
  116. let textXy = coordinateXy[1].split(',');
  117. edge.text.x = parseInt(textXy[0]);
  118. edge.text.y = parseInt(textXy[1]);
  119. }
  120. }
  121. graphData.edges.push(edge);
  122. }
  123. }
  124. console.log(graphData);
  125. return graphData;
  126. };
  127. /**
  128. * 将LogicFlow的数据转成warm-flow的json定义文件
  129. * @param {*} data(...definitionInfo,nodes,edges)
  130. * @returns
  131. */
  132. export const logicFlowJsonToWarmFlow = (data) => {
  133. // 先构建成流程对象
  134. const definition = {
  135. nodeList: []
  136. };
  137. /**
  138. * 根据节点的类型值,获取key
  139. * @param {*} mapValue 节点类型映射
  140. * @returns
  141. */
  142. const getNodeTypeValue = (mapValue) => {
  143. for (const key in NODE_TYPE_MAP) {
  144. if (NODE_TYPE_MAP[key] === mapValue) {
  145. return key;
  146. }
  147. }
  148. };
  149. /**
  150. * 根据节点的编码,获取节点的类型
  151. * @param {*} nodeCode 当前节点名称
  152. * @returns
  153. */
  154. const getNodeType = (nodeCode) => {
  155. for (const node of definition.nodeList) {
  156. if (nodeCode === node.nodeCode) {
  157. return node.nodeType;
  158. }
  159. }
  160. };
  161. /**
  162. * 拼接skip坐标
  163. * @param {*} edge logicFlow的edge
  164. * @returns
  165. */
  166. const getCoordinate = (edge) => {
  167. let coordinate = '';
  168. for (let i = 0; i < edge.pointsList.length; i++) {
  169. coordinate = coordinate + parseInt(edge.pointsList[i].x) + ',' + parseInt(edge.pointsList[i].y);
  170. if (i !== edge.pointsList.length - 1) {
  171. coordinate = coordinate + ';';
  172. }
  173. }
  174. if (edge.text) {
  175. coordinate = coordinate + '|' + parseInt(edge.text.x) + ',' + parseInt(edge.text.y);
  176. }
  177. return coordinate;
  178. };
  179. // 流程定义
  180. definition.id = data.id;
  181. definition.flowCode = data.flowCode;
  182. definition.flowName = data.flowName;
  183. definition.version = data.version;
  184. definition.fromCustom = data.fromCustom;
  185. definition.fromPath = data.fromPath;
  186. // 流程节点
  187. data.nodes.forEach((anyNode) => {
  188. let node = {};
  189. node.nodeType = getNodeTypeValue(anyNode.type);
  190. node.nodeCode = anyNode.id;
  191. if (anyNode.text) {
  192. node.nodeName = anyNode.text.value;
  193. }
  194. node.permissionFlag = anyNode.properties.permissionFlag;
  195. node.nodeRatio = anyNode.properties.nodeRatio;
  196. node.anyNodeSkip = anyNode.properties.anyNodeSkip;
  197. node.listenerType = anyNode.properties.listenerType;
  198. node.listenerPath = anyNode.properties.listenerPath;
  199. node.formCustom = anyNode.properties.formCustom;
  200. node.formPath = anyNode.properties.formPath;
  201. node.ext = [];
  202. for (const key in anyNode.properties.ext) {
  203. if (Object.prototype.hasOwnProperty.call(anyNode.properties.ext, key)) {
  204. let e = anyNode.properties.ext[key];
  205. node.ext.push({ code: key, value: Array.isArray(e) ? e.join(',') : e });
  206. }
  207. }
  208. node.ext = JSON.stringify(node.ext);
  209. node.coordinate = anyNode.x + ',' + anyNode.y;
  210. if (anyNode.text && anyNode.text.x && anyNode.text.y) {
  211. node.coordinate = node.coordinate + '|' + anyNode.text.x + ',' + anyNode.text.y;
  212. }
  213. node.handlerType = anyNode.properties.handlerType;
  214. node.handlerPath = anyNode.properties.handlerPath;
  215. node.version = definition.version;
  216. node.skipList = [];
  217. data.edges.forEach((anyEdge) => {
  218. if (anyEdge.sourceNodeId === anyNode.id) {
  219. let skip = {};
  220. skip.skipType = anyEdge.properties.skipType;
  221. skip.skipCondition = anyEdge.properties.skipCondition;
  222. skip.skipName = anyEdge?.text?.value || anyEdge.properties.skipName;
  223. skip.nowNodeCode = anyEdge.sourceNodeId;
  224. skip.nowNodeType = getNodeType(skip.nowNodeCode);
  225. skip.nextNodeCode = anyEdge.targetNodeId;
  226. skip.nextNodeType = getNodeType(skip.nextNodeCode);
  227. skip.coordinate = getCoordinate(anyEdge);
  228. node.skipList.push(skip);
  229. }
  230. });
  231. definition.nodeList.push(node);
  232. });
  233. return JSON.stringify(definition);
  234. };