| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237 |
- const NODE_TYPE_MAP = { 0: 'start', 1: 'between', 2: 'end', 3: 'serial', 4: 'parallel' };
- /**
- * 将warm-flow的定义json数据转成LogicFlow支持的数据格式
- * @param {*} json
- * @returns LogicFlow的数据
- */
- export const json2LogicFlowJson = (definition) => {
- const graphData = {
- nodes: [],
- edges: []
- };
- // 解析definition属性
- graphData.flowCode = definition.flowCode;
- graphData.flowName = definition.flowName;
- graphData.version = definition.version;
- graphData.fromCustom = definition.fromCustom;
- graphData.fromPath = definition.fromPath;
- // 解析节点
- const allSkips = definition.nodeList.reduce((acc, node) => {
- if (node.skipList && Array.isArray(node.skipList)) {
- acc.push(...node.skipList);
- }
- return acc;
- }, []);
- const allNodes = definition.nodeList;
- // 解析节点
- if (allNodes.length) {
- for (var i = 0, len = allNodes.length; i < len; i++) {
- let node = allNodes[i];
- let lfNode = {
- text: {},
- properties: {}
- };
- // 处理节点
- lfNode.type = NODE_TYPE_MAP[node.nodeType];
- lfNode.id = node.nodeCode;
- let coordinate = node.coordinate;
- if (coordinate) {
- const attr = coordinate.split('|');
- const nodeXy = attr[0].split(',');
- lfNode.x = parseInt(nodeXy[0]);
- lfNode.y = parseInt(nodeXy[1]);
- if (attr.length === 2) {
- const textXy = attr[1].split(',');
- lfNode.text.x = parseInt(textXy[0]);
- lfNode.text.y = parseInt(textXy[1]);
- }
- }
- lfNode.text.value = node.nodeName;
- lfNode.properties.nodeRatio = node.nodeRatio.toString();
- lfNode.properties.permissionFlag = node.permissionFlag;
- lfNode.properties.anyNodeSkip = node.anyNodeSkip;
- lfNode.properties.listenerType = node.listenerType;
- lfNode.properties.listenerPath = node.listenerPath;
- lfNode.properties.formCustom = node.formCustom;
- lfNode.properties.formPath = node.formPath;
- lfNode.properties.ext = {};
- if (node.ext && typeof node.ext === 'string') {
- try {
- node.ext = JSON.parse(node.ext);
- node.ext.forEach((e) => {
- lfNode.properties.ext[e.code] = String(e.value).includes(',') ? e.value.split(',') : String(e.value);
- });
- } catch (error) {
- console.error('Error parsing JSON:', error);
- }
- }
- lfNode.properties.style = {};
- if (node.status === 2) {
- lfNode.properties.style.fill = '#F0FFD9';
- lfNode.properties.style.stroke = '#9DFF00';
- }
- if (node.status === 1) {
- lfNode.properties.style.fill = '#FFF8DC';
- lfNode.properties.style.stroke = '#FFCD17';
- }
- graphData.nodes.push(lfNode);
- }
- }
- if (allSkips.length) {
- // 处理边
- let skipEle = null;
- let edge = {};
- for (var j = 0, lenn = allSkips.length; j < lenn; j++) {
- skipEle = allSkips[j];
- edge = {
- text: {},
- properties: {}
- };
- edge.id = skipEle.id;
- edge.type = 'skip';
- edge.sourceNodeId = skipEle.nowNodeCode;
- edge.targetNodeId = skipEle.nextNodeCode;
- edge.text = { value: skipEle.skipName };
- edge.properties.skipCondition = skipEle.skipCondition;
- edge.properties.skipName = skipEle.skipName;
- edge.properties.skipType = skipEle.skipType;
- const expr = skipEle.expr;
- if (expr) {
- edge.properties.expr = skipEle.expr;
- }
- const coordinate = skipEle.coordinate;
- if (coordinate) {
- const coordinateXy = coordinate.split('|');
- edge.pointsList = [];
- coordinateXy[0].split(';').forEach((item) => {
- const pointArr = item.split(',');
- edge.pointsList.push({
- x: parseInt(pointArr[0]),
- y: parseInt(pointArr[1])
- });
- });
- edge.startPoint = edge.pointsList[0];
- edge.endPoint = edge.pointsList[edge.pointsList.length - 1];
- if (coordinateXy.length > 1) {
- let textXy = coordinateXy[1].split(',');
- edge.text.x = parseInt(textXy[0]);
- edge.text.y = parseInt(textXy[1]);
- }
- }
- graphData.edges.push(edge);
- }
- }
- console.log(graphData);
- return graphData;
- };
- /**
- * 将LogicFlow的数据转成warm-flow的json定义文件
- * @param {*} data(...definitionInfo,nodes,edges)
- * @returns
- */
- export const logicFlowJsonToWarmFlow = (data) => {
- // 先构建成流程对象
- const definition = {
- nodeList: []
- };
- /**
- * 根据节点的类型值,获取key
- * @param {*} mapValue 节点类型映射
- * @returns
- */
- const getNodeTypeValue = (mapValue) => {
- for (const key in NODE_TYPE_MAP) {
- if (NODE_TYPE_MAP[key] === mapValue) {
- return key;
- }
- }
- };
- /**
- * 根据节点的编码,获取节点的类型
- * @param {*} nodeCode 当前节点名称
- * @returns
- */
- const getNodeType = (nodeCode) => {
- for (const node of definition.nodeList) {
- if (nodeCode === node.nodeCode) {
- return node.nodeType;
- }
- }
- };
- /**
- * 拼接skip坐标
- * @param {*} edge logicFlow的edge
- * @returns
- */
- const getCoordinate = (edge) => {
- let coordinate = '';
- for (let i = 0; i < edge.pointsList.length; i++) {
- coordinate = coordinate + parseInt(edge.pointsList[i].x) + ',' + parseInt(edge.pointsList[i].y);
- if (i !== edge.pointsList.length - 1) {
- coordinate = coordinate + ';';
- }
- }
- if (edge.text) {
- coordinate = coordinate + '|' + parseInt(edge.text.x) + ',' + parseInt(edge.text.y);
- }
- return coordinate;
- };
- // 流程定义
- definition.id = data.id;
- definition.flowCode = data.flowCode;
- definition.flowName = data.flowName;
- definition.version = data.version;
- definition.fromCustom = data.fromCustom;
- definition.fromPath = data.fromPath;
- // 流程节点
- data.nodes.forEach((anyNode) => {
- let node = {};
- node.nodeType = getNodeTypeValue(anyNode.type);
- node.nodeCode = anyNode.id;
- if (anyNode.text) {
- node.nodeName = anyNode.text.value;
- }
- node.permissionFlag = anyNode.properties.permissionFlag;
- node.nodeRatio = anyNode.properties.nodeRatio;
- node.anyNodeSkip = anyNode.properties.anyNodeSkip;
- node.listenerType = anyNode.properties.listenerType;
- node.listenerPath = anyNode.properties.listenerPath;
- node.formCustom = anyNode.properties.formCustom;
- node.formPath = anyNode.properties.formPath;
- node.ext = [];
- for (const key in anyNode.properties.ext) {
- if (Object.prototype.hasOwnProperty.call(anyNode.properties.ext, key)) {
- let e = anyNode.properties.ext[key];
- node.ext.push({ code: key, value: Array.isArray(e) ? e.join(',') : e });
- }
- }
- node.ext = JSON.stringify(node.ext);
- node.coordinate = anyNode.x + ',' + anyNode.y;
- if (anyNode.text && anyNode.text.x && anyNode.text.y) {
- node.coordinate = node.coordinate + '|' + anyNode.text.x + ',' + anyNode.text.y;
- }
- node.handlerType = anyNode.properties.handlerType;
- node.handlerPath = anyNode.properties.handlerPath;
- node.version = definition.version;
- node.skipList = [];
- data.edges.forEach((anyEdge) => {
- if (anyEdge.sourceNodeId === anyNode.id) {
- let skip = {};
- skip.skipType = anyEdge.properties.skipType;
- skip.skipCondition = anyEdge.properties.skipCondition;
- skip.skipName = anyEdge?.text?.value || anyEdge.properties.skipName;
- skip.nowNodeCode = anyEdge.sourceNodeId;
- skip.nowNodeType = getNodeType(skip.nowNodeCode);
- skip.nextNodeCode = anyEdge.targetNodeId;
- skip.nextNodeType = getNodeType(skip.nextNodeCode);
- skip.coordinate = getCoordinate(anyEdge);
- node.skipList.push(skip);
- }
- });
- definition.nodeList.push(node);
- });
- return JSON.stringify(definition);
- };
|