import { getFlowById } from '@/api/device/register' const filterNodeRedData = async (id) => { let nodeRedData = [] const data = await getFlowById(id) if (data.nodes) { nodeRedData = data.nodes } else { console.error('请求失败') } return nodeRedData } const mapNodeType = (nodeRedType) => { const typeMap = { 'group': 'customGroup', // Node-RED的inject节点转为圆形 // 'inject': 'circle', // Node-RED的inject节点转为圆形 // 'debug': 'diamond', // debug节点转为菱形 // 'function': 'rect' // 函数节点转为矩形 }; return typeMap[nodeRedType] || 'CustomNode'; // 默认矩形 } export const convertNodeRedToLogicFlow = async (id) => { const nodeRedData = await filterNodeRedData(id) // 节点数据 const nodes = nodeRedData.map((node) => { return { id: node.id, // 或生成新ID:`node-${index}` type: mapNodeType(node.type), // 映射节点类型 x: node.x * 2, y: node.y * 2, text: node.name || node.type, // 使用节点名称或类型作为文本 children: node.type === 'group' ? node.nodes : null, properties: { ...node, state: 'unexecuted', } }; }); const edges = [] // 连线数据 nodeRedData.forEach((item) => { if (item.wires && item.wires.length > 0) { item.wires.forEach((w, index) => { w.forEach((id) => { const obj = { id: `edge-${item.id}-${id}`, // 或使用唯一标识生成方式 type: 'bezier', sourceNodeId: item.id, targetNodeId: id, sourceAnchorId: item.id + '_1', targetAnchorId: id + '_3' } edges.push(obj) }) }) } }) return { nodes, edges } } export const recursiveFilter = (data, id, result = [], type = 'customGroup') => { data.forEach((item) => { if (item.type === type && item.properties.nodes && item.properties.nodes.includes(id)) { result.push(item) recursiveFilter(data, item.id, result) } }); return result } export const changeOtherNodeState = (nodes, lf) => { const filterArr = ['inject', 'cmvrLoop', 'startCamera', 'getImage', 'stopCamera', 'startVideo', 'stopVideo', 'end'] const loopNodes = nodes.filter(item => { return !filterArr.includes(item.properties.type) }) loopNodes.forEach(l => { nodes.forEach(n => { if (l.properties.wires[0].includes(n.id)) { const { state } = lf.getProperties(n.id) if (state !== 'unexecuted') { lf.setProperties(l.id, { state: 'success' }) } } if (l.properties?.wires[1]?.includes(n.id)) { const { state } = lf.getProperties(n.id) if (state !== 'failed') { lf.setProperties(l.id, { state: 'running' }) } else { lf.setProperties(l.id, { state: 'failed' }) } } }) }) }