type ModelContentConfig = { nodeKey: string nodeName: string type: number local_status?: string // 填充自定义状态 p_nodeNames?: string[] // 填充自定义状态 p_nodeKeys?: string[] // 填充自定义状态 childNode: ModelContentConfig | null lastNode_local_status?: string // 结束标记状态标记 conditionNodes?: { nodeName: string local_status?: string // 填充自定义状态 conditionList: any[] childNode: ModelContentConfig }[] } type RenderNodes = { [key: string]: 0 | 1 // 0已执行 1执行中 } export const package_modelContentConfig = (data: ModelContentConfig, renderNodes: RenderNodes) => { /**local_status: 0: 已执行(success) 1:执行中(error) // 默认未执行(info)*/ // 通过nodeName 作为唯一值 记录 每个key(nodeName) 对应的childNode 信息 const nodeKeyObj: { [nodeKey: string]: ModelContentConfig } = {} const fn = (data: ModelContentConfig, p_nodeKeys = []) => { if (!data) return data.p_nodeKeys = p_nodeKeys console.log(p_nodeKeys, 'p_nodeKeys') console.log(data, 'data') // 记录 nodeKeyObj[data.nodeKey] = data const _p_nodeKeys = [...p_nodeKeys, data.nodeKey] if (data.conditionNodes && Array.isArray(data.conditionNodes)) { // 条件分支节点 data.conditionNodes.forEach(v => { fn(v.childNode, _p_nodeKeys) // fn(v.childNode, [...p_nodeNames]) }) } if (data.childNode) { // 正常子节点 fn(data.childNode, _p_nodeKeys) } } fn(data) // 给需要修改状态的*/ console.log(nodeKeyObj, 'nodeKeyObj') const local_status_obj = { 0: 'success', // 已执行 1: 'error' // 执行中 } let cur_nodeKey = '' /**local_status: 0: 已执行(success) 1:执行中(error) // 默认未执行(info)*/ Object.keys(renderNodes).forEach(nodeKey => { const local_status = local_status_obj[renderNodes[nodeKey]] || '' const node = nodeKeyObj[nodeKey] if (node) { node.local_status = local_status // 执行中的key 提取出来 if (node.local_status === 'error') { cur_nodeKey = nodeKey } } if (nodeKey === 'flk_end') { // 给顶级加结束标签状态 data.lastNode_local_status = local_status_obj[renderNodes[nodeKey]] } }) const curNode = nodeKeyObj[cur_nodeKey] as ModelContentConfig // 如果有执行中的 node 给父级做状态渲染 if (curNode) { const p_nodeKeys = curNode.p_nodeKeys || [] if (p_nodeKeys.length) { p_nodeKeys.forEach(nodeKeys => { const p_node = nodeKeyObj[nodeKeys] // 父级node 设置为 已执行 // if (!p_node.local_status) { if (p_node) { // 如果是条件节点 if (p_node.conditionNodes && Array.isArray(p_node.conditionNodes)) { const idx = p_node.conditionNodes.findIndex(v => v.childNode?.nodeKey === curNode.nodeKey) p_node.conditionNodes.forEach((v, i) => { if (i === idx) { v.local_status = 'success' } else { v.local_status = 'info' } }) } else { // 普通节点 p_node.local_status = 'success' } } }) } } // 给没有标记 local_status 的 默认填充 未处理 Object.keys(nodeKeyObj).forEach(nodeKey => { const node = nodeKeyObj[nodeKey] if (!node.local_status) { node.local_status = 'info' } }) }