From 9d0acfb65c80c4948c305ca01338f894b87346a0 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期一, 08 四月 2024 09:44:37 +0800
Subject: [PATCH] Merge branch 'Four-Way-Rack' of http://47.97.1.152:5880/r/zy-asrs-master into Four-Way-Rack

---
 zy-asrs-flow/src/components/Flow/GraphTools.jsx |  569 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 565 insertions(+), 4 deletions(-)

diff --git a/zy-asrs-flow/src/components/Flow/GraphTools.jsx b/zy-asrs-flow/src/components/Flow/GraphTools.jsx
index 60d5d83..701fdec 100644
--- a/zy-asrs-flow/src/components/Flow/GraphTools.jsx
+++ b/zy-asrs-flow/src/components/Flow/GraphTools.jsx
@@ -1,7 +1,81 @@
 import React, { useRef, useEffect, useState } from "react";
-import { Button } from 'antd';
+import { Button, message, Modal, Divider, List, Typography, Input, Popconfirm } from 'antd';
+import { DeleteFilled, ApiOutlined } from '@ant-design/icons';
+import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
+import { solarizedlight } from 'react-syntax-highlighter/dist/esm/styles/prism';
+import { exportDataToServer, getFlowList, deleteFlowById, updateFlowStatus, mockRun } from "../../services/flow/api";
+import './css/GraphTools.less'
+import { flow, remove } from "lodash";
 
 export const GraphTools = ({ graphRef, isReady }) => {
+
+    const [isModalOpen, setIsModalOpen] = useState(false);
+    const [saveIsModalOpen, setSaveIsModalOpen] = useState(false);
+    const [preCode, setPreCode] = useState(null);
+    const [flowListData, setFlowListData] = useState([]);
+    const [currentFlow, setCurrentFlow] = useState(null);
+    const [flowName, setFlowName] = useState(null);
+    const [flowMemo, setFlowMemo] = useState(null);
+
+    let flowId = -1;
+
+    const handleOk = () => {
+        setIsModalOpen(false);
+    };
+
+    const handleCancel = () => {
+        setIsModalOpen(false);
+        setSaveIsModalOpen(false);
+    };
+
+    const flowNameInputChange = (e) => {
+        setFlowName(e.target.value)
+    }
+
+    const memoInputChange = (e) => {
+        setFlowMemo(e.target.value)
+    }
+
+    const saveData = () => {
+        if (currentFlow == null) {
+            flowId = -1;
+        }
+
+        setSaveIsModalOpen(true);
+    }
+
+    //棰勮浠g爜
+    const prewCode = () => {
+        const graph = graphRef.current;
+        if (isReady) {
+            const data = graph.toJSON();
+
+            const edges = [];
+            const nodes = [];
+            let rootNode = null;
+            data.cells.forEach((item) => {
+                if (item.shape == "edge") {
+                    edges.push(item)
+                } else {
+                    nodes.push(item)
+                    if (item.data.root) {
+                        rootNode = item;
+                    }
+                }
+            })
+
+            if (rootNode == null) {
+                message.warning('璇疯缃▼搴忓叆鍙g粍浠�');
+                return;
+            }
+
+            const codeContent = transCode(rootNode, nodes, graph)
+            console.log(codeContent);
+
+            setPreCode(codeContent);
+            setIsModalOpen(true);
+        }
+    }
 
     const exportData = () => {
         const graph = graphRef.current;
@@ -9,14 +83,501 @@
             const data = graph.toJSON();
             console.log(data);
             // 杩欓噷浣犲彲浠ュ皢鏁版嵁鍙戦�佸埌鏈嶅姟鍣ㄦ垨淇濆瓨鍒版湰鍦�
+
+            const edges = [];
+            const nodes = [];
+            let rootNode = null;
+            data.cells.forEach((item) => {
+                if (item.shape == "edge") {
+                    edges.push(item)
+                } else {
+                    nodes.push(item)
+                    if (item.data.root) {
+                        rootNode = item;
+                    }
+                }
+            })
+
+            if (rootNode == null) {
+                message.warning('璇疯缃▼搴忓叆鍙g粍浠�');
+                return;
+            }
+
+            let id = null;
+            if (currentFlow != null) {
+                id = currentFlow.id;
+            }
+
+            let result = sortNodes(rootNode, nodes, graph);
+            exportDataToServer({
+                originData: JSON.stringify(data),
+                data: result,
+                name: flowName,
+                memo: flowMemo,
+                id: id
+            }).then((res) => {
+                if (res.code == 200) {
+                    message.success('淇濆瓨鎴愬姛');
+                    updateFlowList();
+                } else {
+                    message.warning(res.msg);
+                }
+                setSaveIsModalOpen(false);
+            })
         }
     }
 
+    const sortNodes = (rootNode, nodes, graph) => {
+        let values = nodeDFS(rootNode, nodes, graph);
+        const searchNode = {
+            id: 1,
+            parent: null,
+            logicBool: true
+        };
+
+        let cpValues = JSON.parse(JSON.stringify(values))
+
+        let searchIndex = 0;
+        cpValues.forEach((value) => {
+            if (value.data.isLogic) {
+                value.data.searchLogicId = searchNode.id;
+                value.data.searchLogicBool = searchNode.logicBool;
+                value.data.searchIndex = searchIndex++;
+
+                let tmpSearchNode = JSON.parse(JSON.stringify(searchNode))
+                searchNode.parent = tmpSearchNode;
+                searchNode.id = value.id;
+                searchNode.logicBool = null;
+                searchIndex = 0;
+            } else {
+                let id = searchNode.id;
+                let logicBool = searchNode.logicBool;
+
+                const connectedEdges = graph.getConnectedEdges(value);//鍙栬竟
+                connectedEdges.forEach((edge) => {
+                    let tmpSearchNode = JSON.parse(JSON.stringify(searchNode));
+                    while (tmpSearchNode.parent != null) {
+                        if (edge.source.cell == tmpSearchNode.id) {
+                            logicBool = edge.data.logicBool;//鏇存柊鏂瑰悜
+                            searchNode.logicBool = edge.data.logicBool;
+                            id = tmpSearchNode.id;
+                            break;
+                        }
+                        tmpSearchNode = tmpSearchNode.parent;
+                    }
+                })
+
+                value.data.searchLogicId = id;
+                value.data.searchLogicBool = logicBool;
+                value.data.searchIndex = searchIndex++;
+            }
+        })
+
+        return cpValues;
+    }
+
+    const transCode = (rootNode, nodes, graph) => {
+        let codeContent = "";
+
+        let values = nodeDFS(rootNode, nodes, graph);
+        const searchNode = {
+            id: 1,
+            parent: null,
+            logicBool: true
+        };
+
+        let cpValues = JSON.parse(JSON.stringify(values))
+
+        let searchIndex = 0;
+        cpValues.forEach((value) => {
+            if (value.data.isLogic) {
+                value.data.searchLogicId = searchNode.id;
+                value.data.searchLogicBool = searchNode.logicBool;
+                value.data.searchIndex = searchIndex++;
+
+                let tmpSearchNode = JSON.parse(JSON.stringify(searchNode))
+                searchNode.parent = tmpSearchNode;
+                searchNode.id = value.id;
+                searchNode.logicBool = null;
+                searchIndex = 0;
+            } else {
+                let id = searchNode.id;
+                let logicBool = searchNode.logicBool;
+
+                const connectedEdges = graph.getConnectedEdges(value);//鍙栬竟
+                connectedEdges.forEach((edge) => {
+                    let tmpSearchNode = JSON.parse(JSON.stringify(searchNode));
+                    while (tmpSearchNode.parent != null) {
+                        if (edge.source.cell == tmpSearchNode.id) {
+                            logicBool = edge.data.logicBool;//鏇存柊鏂瑰悜
+                            searchNode.logicBool = edge.data.logicBool;
+                            id = tmpSearchNode.id;
+                            break;
+                        }
+                        tmpSearchNode = tmpSearchNode.parent;
+                    }
+                })
+
+                value.data.searchLogicId = id;
+                value.data.searchLogicBool = logicBool;
+                value.data.searchIndex = searchIndex++;
+            }
+        })
+        console.log(cpValues);
+        console.log(searchNode);
+
+        let tmp = {}
+        let tmpList = []
+        let tmpIndex = 0;
+        for (let i = cpValues.length - 1; i >= 0; i--) {
+            let item = cpValues[i];
+            if (tmp[item.data.searchLogicId] == null) {
+                tmpList[tmpIndex] = [item];
+                tmp[item.data.searchLogicId] = {
+                    index: tmpIndex,
+                    code: "",
+                    codeTrue: "",
+                    codeFalse: "",
+                    condition: ""
+                };
+                tmpIndex++;
+            } else {
+                tmpList[tmp[item.data.searchLogicId].index].push(item);
+            }
+        }
+
+        console.log(tmp, tmpList);
+
+        tmpList.forEach((item) => {
+            item.forEach((val) => {
+                let originCode = tmp[val.data.searchLogicId].codeTrue;
+                if (!val.data.searchLogicBool) {
+                    originCode = tmp[val.data.searchLogicId].codeFalse;
+                }
+
+                let codeContent = val.data.codeContent;
+
+                if (val.data.isLogic) {
+                    codeContent = val.id + "_logic_tag";
+                    console.log(val.data);
+                    tmp[val.id].condition = val.data.codeContent;
+                } else {
+                    codeContent = `
+                    //**********${val.attrs.text.text}-start**********//
+                    ${codeContent}
+                    //**********${val.attrs.text.text}-start**********//
+                    `;
+                }
+                let newCode = `
+                    ${codeContent}
+
+                    ${originCode}
+                `;
+
+                console.log(newCode);
+                if (val.data.searchLogicBool) {
+                    tmp[val.data.searchLogicId].codeTrue = newCode;
+                } else {
+                    tmp[val.data.searchLogicId].codeFalse = newCode;
+                }
+            })
+        })
+
+        let sortTmp = [];
+        for (var key in tmp) {
+            let obj = tmp[key];
+            obj.id = key;
+            sortTmp[tmp[key].index] = obj;
+        }
+
+        console.log(sortTmp);
+
+        // 鍚堝苟True鍜孎alse
+        sortTmp.forEach((item) => {
+            let nestedIfCode = "";
+            if (item.condition == "") {
+                nestedIfCode = `
+                ${item.codeTrue}
+                ${item.codeFalse}
+                `;
+            } else {
+                nestedIfCode = `
+                if(${item.condition}){
+                    // 閫昏緫TRUE
+                    ${item.codeTrue}
+                }else {
+                    // 閫昏緫FALSE
+                    ${item.codeFalse}
+                }
+            `;
+            }
+
+            item.code = nestedIfCode;
+        })
+
+        console.log(sortTmp);
+
+        let finalTmp = {};
+        let sortTmpCopy = JSON.parse(JSON.stringify(sortTmp));
+        sortTmpCopy.forEach((item) => {
+            if (item.id != "1") {
+                let codeContent = item.code;
+                sortTmp.forEach((val) => {
+                    codeContent = codeContent.replace(val.id + "_logic_tag", val.code);
+                    console.log(item, val.id, codeContent);
+                })
+                finalTmp[item.id] = {
+                    code: codeContent
+                }
+            }
+        })
+
+        console.log(sortTmpCopy);
+        console.log(finalTmp);
+
+        sortTmpCopy.forEach((item) => {
+            if (item.id == "1") {
+                let finalCode = item.code;
+                for (var key in finalTmp) {
+                    let obj = finalTmp[key];
+                    finalCode = finalCode.replace(key + "_logic_tag", obj.code);
+                }
+
+                codeContent = finalCode;
+            }
+        })
+
+        codeContent = formatJavaCode(codeContent)
+        return codeContent;
+    }
+
+    const formatJavaCode = (codeString) => {
+        let baseIndentation = "    ";  //鐢ㄥ洓涓┖鏍艰〃绀轰竴涓缉杩�
+        let indentationLevel = 0;  //澧炲姞杩欒浠g爜鏉ュ垵濮嬪寲indentationLevel
+
+        let formattedCode = codeString
+            .replace(/^\s+/mg, '') // 绉婚櫎姣忚鍓嶉潰鐨勭┖鐧�
+            .replace(/(\{|\})/g, ' $& ') // 璁╁ぇ鎷彿鍛ㄥ洿閮芥湁绌烘牸
+            // 涓婇潰鐨�.replace(/^\s+/mg, '')鍙兘浼氬湪鎷彿鍛ㄥ洿鎻掑叆澶氫綑鐨勭┖鏍硷紝鎵�浠ヤ笅闈㈣繖琛屼唬鐮佷細绉婚櫎寮�澶存垨鏈熬鐨勭┖鏍�
+            .replace(/^\s+|\s+$/mg, '')
+            // 鐢ㄤ簡.split('\n')鍚庯紝姣忎竴琛岄兘鏄暟缁勪腑鐨勪竴涓厓绱狅紝鎵�浠ュ彲浠ラ�氳繃鍑忓皯鎴栧鍔犺寮�澶寸殑绌烘牸鏁版潵娣诲姞鎴栧垹闄ょ缉杩�
+            .split('\n').reduce((formattedCode, currentLine) => {
+                if (currentLine.includes('}')) {
+                    // 濡傛灉涓�琛屼腑鍖呭惈鍙冲ぇ鎷彿锛屾垜浠鍑忓皯涓�涓缉杩�
+                    indentationLevel--;
+                }
+
+                let indentation = baseIndentation.repeat(indentationLevel);
+                let indentedLine = indentation + currentLine;
+
+                if (currentLine.includes('{')) {
+                    // 濡傛灉涓�琛屼腑鍖呭惈宸﹀ぇ鎷彿锛岄偅涓ぇ鎷彿鍚庨潰鐨勪唬鐮侀渶瑕侀澶栫殑涓�涓缉杩�
+                    indentationLevel++;
+                }
+
+                return formattedCode + '\n' + indentedLine;
+            }, '');
+
+        return formattedCode;
+    }
+
+    const nodeDFS = (node, nodes, graph) => {
+        let values = [];
+        if (graph) {
+            const connectedEdges = graph.getConnectedEdges(node);
+            const children = [];
+
+            // console.log(node);
+            connectedEdges.forEach((edge) => {
+                nodes.forEach((item) => {
+                    if (item.id === edge.target.cell && item.id != node.id) {
+                        children.push(item);
+                    }
+                })
+            });
+
+            // console.log(connectedEdges);
+            if (children.length != 0) {
+                // console.log(children);
+                children.forEach((node) => {
+                    // console.log(node);
+                    values.push(node);
+                    values = values.concat(nodeDFS(node, nodes, graph))
+                })
+            }
+        }
+
+        return values;
+    }
+
+    const setFlowActive = () => {
+        if (currentFlow == null) {
+            message.warning("璇烽�夋嫨瑕佹縺娲讳娇鐢ㄧ殑娴佺▼鍥撅紒");
+            return;
+        }
+
+        const status = currentFlow.status == 1 ? 0 : 1;
+        updateFlowStatus(currentFlow.id, status).then((res) => {
+            if (res.code == 200) {
+                message.success(status == 1 ? "婵�娲绘垚鍔�" : "宸插彇娑堟縺娲�");
+                currentFlow.status = status;
+            } else {
+                message.warning(res.msg);
+            }
+            updateFlowList();
+        })
+    }
+
+    const removeFlow = () => {
+        if (currentFlow == null) {
+            message.warning("璇烽�夋嫨瑕佸垹闄ょ殑娴佺▼鍥撅紒");
+            return;
+        }
+
+        deleteFlowById(currentFlow.id).then((res) => {
+            if (res.code == 200) {
+                message.success("鍒犻櫎鎴愬姛");
+            } else {
+                message.warning(res.msg);
+            }
+            updateFlowList();
+        })
+    }
+
+    const updateFlowList = () => {
+        getFlowList().then((res) => {
+            setFlowListData(res.data);
+        })
+    }
+
+    const createNewBlank = () => {
+        const graph = graphRef.current;
+        if (graph) {
+            graph.clearCells();
+            setCurrentFlow(null);
+            setFlowName(null);
+            setFlowMemo(null);
+        }
+    }
+
+    const switchFlowBlank = (flow) => {
+        const graph = graphRef.current;
+        if (graph) {
+            graph.fromJSON(JSON.parse(flow.originData));
+            setCurrentFlow(flow)
+            setFlowName(flow.name);
+            setFlowMemo(flow.memo);
+        }
+    }
+
+    const testRun = () => {//妯℃嫙杩愯
+        if (currentFlow == null) {
+            message.warning("璇烽�夋嫨娴佺▼鍥�");
+            return;
+        }
+
+        mockRun(currentFlow.id).then((res) => {
+            if (res.code == 200) {
+                message.success("杩愯鎴愬姛");
+            } else {
+                message.warning(res.msg);
+            }
+        })
+    }
+
+    useEffect(() => {
+        updateFlowList();
+    }, [])
+
     return (
         <>
-            <Button type="primary" onClick={exportData}>
-                瀵煎嚭鏁版嵁
-            </Button>
+            <div>
+                <div className="container">
+                    <div className="containerButton">
+                        <Button type="primary" onClick={createNewBlank}>
+                            鏂板缓
+                        </Button>
+                    </div>
+
+                    <div className="containerButton">
+                        <Button type="primary" onClick={saveData}>
+                            淇濆瓨
+                        </Button>
+                    </div>
+
+                    <div className="containerButton">
+                        <Button type="primary" onClick={setFlowActive}>
+                            婵�娲讳娇鐢�
+                        </Button>
+                    </div>
+
+                    <div className="containerButton">
+                        <Button type="primary" onClick={prewCode}>
+                            棰勮浠g爜
+                        </Button>
+                    </div>
+
+                    <div className="containerButton">
+                        <Button type="primary" onClick={testRun}>
+                            妯℃嫙杩愯
+                        </Button>
+                    </div>
+                </div>
+
+                <div className="flowList">
+                    <List
+                        header={
+                            <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center' }}>
+                                <div><Typography.Text mark>[鏁版嵁]</Typography.Text> 娴佺▼鍥惧垪琛�</div>
+                                <div>
+                                    <Button type="primary" size="small" onClick={updateFlowList}>
+                                        鍒锋柊
+                                    </Button>
+
+                                    <Popconfirm
+                                        title="鍒犻櫎娴佺▼鍥�"
+                                        description="纭鍒犻櫎锛�"
+                                        okText="鍒犻櫎"
+                                        cancelText="鍙栨秷"
+                                        onConfirm={removeFlow}
+                                    >
+                                        <Button style={{ marginLeft: '5px' }} type="primary" danger size="small">
+                                            <DeleteFilled />
+                                        </Button>
+                                    </Popconfirm>
+
+                                </div>
+                            </div>
+                        }
+                        dataSource={flowListData}
+                        renderItem={(item) => (
+                            <List.Item>
+                                <Button type={currentFlow != null && item.id == currentFlow.id ? 'primary' : 'dashed'} style={{ width: '100%' }} onClick={() => switchFlowBlank(item)}>
+                                    <div style={{ display: 'flex', justifyContent: 'space-between' }}>
+                                        <div>{item.name}</div>
+                                        {item.status == 1 ? <div><ApiOutlined /></div> : ''}
+                                    </div>
+                                </Button>
+                            </List.Item>
+                        )}
+                    />
+                </div>
+            </div>
+
+            <Modal title="棰勮浠g爜" open={isModalOpen} onOk={handleOk} onCancel={handleCancel}>
+                <SyntaxHighlighter language="java" style={solarizedlight}>
+                    {preCode}
+                </SyntaxHighlighter>
+            </Modal>
+
+            <Modal title="淇濆瓨娴佺▼鍥�" open={saveIsModalOpen} onOk={exportData} onCancel={handleCancel}>
+                <div style={{ marginTop: '10px' }}>
+                    <Input placeholder="娴佺▼鍥惧悕绉�" value={flowName} onChange={flowNameInputChange} />
+                </div>
+                <div style={{ marginTop: '10px' }}>
+                    <Input placeholder="澶囨敞" value={flowMemo} onChange={memoInputChange} />
+                </div>
+            </Modal>
         </>
     );
 }
\ No newline at end of file

--
Gitblit v1.9.1