Kaynağa Gözat

页面更新

sr 4 yıl önce
ebeveyn
işleme
9b4821d10e

+ 7 - 0
ruoyi-ui/src/utils/dispatchEvent.js

@@ -0,0 +1,7 @@
+
+export const DispatchEvent = (event, config) => {
+  const ev = new CustomEvent(event, config);
+  window.dispatchEvent(ev);
+};
+
+export default DispatchEvent;

+ 1036 - 0
ruoyi-ui/src/utils/flow-desinger.js

@@ -0,0 +1,1036 @@
+import icons from './icon.js'
+
+function FlowDesigner(diagramDiv,event) {
+    var G = go.GraphObject.make;
+    var _this = {};
+    var _designer = {};
+    var myPalette = null
+    var _jsonNewStep = { key: guid(), text: "审批节点", remark: '', type: 0 };
+
+    /** 处理传入事件 */
+    if(event.showEditNode){  //编辑节点
+        _this.showEditNode = event.showEditNode
+    }
+    if(event.SelectionDeleted){  //删除事件
+        _this.SelectionDeleted = event.SelectionDeleted
+    }
+    if(event.LinkDrawn){  //线的生成事件
+        _this.LinkDrawn = event.LinkDrawn
+    }
+    if(event.externalobjectsdropped){  //节点的生成事件
+        _this.externalobjectsdropped = event.externalobjectsdropped
+    }
+
+    if(event.LinkRelinked){  //连线修改
+        _this.LinkRelinked = event.LinkRelinked
+    }
+
+    /** --------public method----------------------------------------**/
+    /**
+     * 初始化图例面板
+     * 0审批节点 1开始节点 2结束节点 3操作节点 4服务节点
+     * @returns {*}
+     */
+    this.initToolbar = function(div,moduleType){
+        
+        let modelArr = [
+            // { key: guid(), text: "开始", figure: "Terminator", fill: "#4fba4f", type: 1 },
+            { key: guid(), text: "审批节点", remark: '', type: 0, category:'Approval' },
+            { key: guid(), text: "操作节点", remark: '', type: 4, category:'Operation' },
+            { key: guid(), text: "服务节点", remark: '', type: 3, category:'Service' },
+            { key: guid(), text: "子流程节点", remark: '', type: 6, category:'Subprocesses' }
+            // { key: guid(), text: "结束", figure: "Terminator", fill: "#CE0620", type: 2 }
+        ]
+        if(!moduleType){
+            modelArr = [{ key: guid(), text: "审批节点", remark: '', type: 0, category:'Approval' }]
+        }
+        if(!myPalette){
+            var Palette =
+            G(go.Palette, div, // 必须是DIV元素
+                {
+                    maxSelectionCount: 3,
+                    nodeTemplateMap: _designer.nodeTemplateMap, // 跟设计图共同一套样式模板
+                    model: new go.GraphLinksModel(modelArr)
+                });
+            myPalette = Palette
+        }else{
+            myPalette.model.nodeDataArray = modelArr
+        }
+
+        return myPalette;
+    };
+
+    /**
+     * 在设计面板中显示流程图
+     * @param flowData  流程图json数据
+     */
+    this.displayFlow = function (flowData) {
+
+        if(!flowData) return;
+
+        _designer.model = go.Model.fromJson(flowData);
+
+        var pos = _designer.model.modelData.position;
+        
+        // if (pos) _designer.initialPosition = go.Point.parse(pos);
+        this.diagram = _designer
+        // 更改所有连线中间的文本背景色
+        setLinkTextBg();
+    };
+
+    /**
+     * 创建新步骤
+     */
+    this.createStep = function() {
+        var jsonNewStep = {key:_jsonNewStep.key, text:_jsonNewStep.text};
+        jsonNewStep.loc = "270 140";// “新步骤”显示的位置
+        _designer.model.addNodeData(jsonNewStep);
+    };
+
+    /**
+     * 获取流程图数据
+     * @returns {*}
+     */
+    this.getFlowData = function () {
+        _designer.model.modelData.position = go.Point.stringify(_designer.position);
+        return _designer.model.toJson();
+    };
+
+    /**
+     * 检验流程图是否规范
+     */
+    this.checkData = function() {
+        var errMsg = "";
+
+        // 检查:每个步骤必须包含角色
+        if (!_designer.model.nodeDataArray) return '请绘制流程图';
+
+        // $.each(_designer.model.nodeDataArray, function(i, item) {
+        //     if (!item.hasOwnProperty("remark") || item.remark === "") {
+        //         errMsg = "请为步骤【" + item.text + "】设置备注~";
+        //         return false;
+        //     }
+        // });
+
+        _designer.model.nodeDataArray.map(item => {
+            if (!item.hasOwnProperty("remark") || item.remark === "") {
+                errMsg = "请为步骤【" + item.text + "】设置备注~";
+                return false;
+            }
+        })
+
+
+        return errMsg;
+    };
+
+
+
+    /** --------public method-------------end---------------------------**/
+
+    this.diagram = init(diagramDiv);
+
+    /** --------private method----------------------------------------**/
+
+    /**
+     * 初始化流程设计器
+     * @param divId 设计器Div
+     * 
+     * node type 
+     */
+    function init(divId) {
+        _designer = G(go.Diagram, divId, // must name or refer to the DIV HTML element
+                {  
+                    // grid: G(go.Panel, "Grid",  背景格
+                    //     G(go.Shape, "LineH", { stroke: "lightgray", strokeWidth: 0.5 }),
+                    //     G(go.Shape, "LineH", { stroke: "gray", strokeWidth: 0.5, interval: 10 }),
+                    //     G(go.Shape, "LineV", { stroke: "lightgray", strokeWidth: 0.5 }),
+                    //     G(go.Shape, "LineV", { stroke: "gray", strokeWidth: 0.5, interval: 10 })
+                    // ),
+                    allowDrop: true, // must be true to accept drops from the Palette
+                    allowTextEdit: false,
+                    allowHorizontalScroll: true,
+                    allowVerticalScroll: true,
+                    // "clickCreatingTool.isDoubleClick":false,
+                    // "clickCreatingTool.archetypeNodeData": {}, // 双击创建新步骤
+                    // "draggingTool.dragsLink": true,
+                    "draggingTool.isGridSnapEnabled": true,
+                    // "linkingTool.isUnconnectedLinkValid": true,
+                    "linkingTool.portGravity": 20,
+                    // "relinkingTool.isUnconnectedLinkValid": true,
+                    "relinkingTool.portGravity": 20,
+                    "relinkingTool.fromHandleArchetype":
+                        G(go.Shape, "Diamond", { segmentIndex: 0, cursor: "pointer", desiredSize: new go.Size(8, 8), fill: "tomato", stroke: "darkred" }),
+                    "relinkingTool.toHandleArchetype":
+                        G(go.Shape, "Diamond", { segmentIndex: -1, cursor: "pointer", desiredSize: new go.Size(8, 8), fill: "darkred", stroke: "tomato" }),
+                    "linkReshapingTool.handleArchetype":
+                        G(go.Shape, "Diamond", { desiredSize: new go.Size(7, 7), fill: "lightblue", stroke: "deepskyblue" }),
+                    "undoManager.isEnabled": false
+                });
+
+        // 流程图如果有变动,则提示用户保存
+        _designer.addDiagramListener("Modified", onDiagramModified);
+
+        // 双击事件
+        _designer.addDiagramListener("ObjectDoubleClicked", onObjectDoubleClicked);
+
+        // 移除事件
+        _designer.addDiagramListener("SelectionDeleted", function(e) {
+            e.subject.each(function(n){
+                _this.SelectionDeleted(n.data)
+            });
+        })
+
+        //线的生成
+        _designer.addDiagramListener("LinkDrawn", function(e) {
+            e.subject.data.key = guid()
+            _this.LinkDrawn(e.subject.data)
+        })
+
+
+        //线的重绘
+        _designer.addDiagramListener("LinkRelinked", function(e) {
+            _this.LinkRelinked(e.subject.data)
+        })
+
+        //添加监听节点生成事件
+        _designer.addDiagramListener("externalobjectsdropped", function(e) {
+            // var jsonNewStep = {key:_jsonNewStep.key, text:_jsonNewStep.text};
+            e.subject.each(function(n){
+                //得到从Palette拖过来的节点
+                _this.externalobjectsdropped(n.data)
+            });
+            // jsonNewStep.loc = "-100 0";// “新步骤”显示的位置
+            // jsonNewStep.type = 0 
+            // jsonNewStep.key = guid()
+            // // _designer.model.addNodeData(jsonNewStep);
+            // _this.externalobjectsdropped(jsonNewStep)
+        })
+
+
+        //监听节点或线的删除前事件
+        _designer.commandHandler.canDeleteSelection = function(e) { 
+			//用例获取选中的节点或线 
+			return _designer.selection.all(function(nodeOrLink) { 
+				//判断是否是开始或者结束节点
+				if(nodeOrLink.data.type === 1 || nodeOrLink.data.type === 2){ 
+					return false; 
+				}else{ 
+					return true; 
+				} 
+			}); 
+        }
+        
+        // var tool = _designer.toolManager.clickCreatingTool;
+        // tool.insertPart = (loc) => {
+        //     var jsonNewStep = {key:_jsonNewStep.key, text:_jsonNewStep.text};
+        //     jsonNewStep.type = 0 
+        //     jsonNewStep.loc = `${loc.x} ${loc.y}`;
+        //     _designer.model.addNodeData(jsonNewStep);
+        //     _this.externalobjectsdropped(jsonNewStep)
+        // }
+        
+
+        // 流程步骤的样式模板
+        // _designer.nodeTemplate = approvalNodeTemplate();
+        // _designer.nodeTemplate = operationNodeTemplate();
+        // _designer.nodeTemplateMap.add('Approval',approvalNodeTemplate)
+
+        // 服务节点
+        _designer.nodeTemplateMap.add('Subprocesses',
+            G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+            new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+            new go.Binding("angle").makeTwoWay(),
+            // the main object is a Panel that surrounds a TextBlock with a Shape
+            G(go.Panel, "Auto",
+                { name: "PANEL" },
+                new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "RoundedRectangle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "PIPE",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "white", // default color
+                            strokeWidth: 1,
+                            stroke: "#DCDEE2"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.Shape,
+                    { 
+                        margin: 5, 
+                        fill: 'black', 
+                        strokeWidth: 0, 
+                        width: 28, 
+                        height: 20,
+                        alignment: go.Spot.TopRight,
+                        geometry: go.Geometry.parse(geoFunc('subprocesses'))
+                    }),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin: 8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "#343434",
+                            textAlign: "center",
+                            alignment: go.Spot.Center,
+                            verticalAlignment: go.Spot.Center,
+                            wrap: go.TextBlock.WrapFit,
+                            minSize: new go.Size(126, 27),
+                            maxSize: new go.Size(126, NaN)
+                        },
+                        new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // 绑定上下文菜单
+                    // contextMenu: makePartContextMenu()
+                }
+            ),
+            // 4个连接点
+            makeNodePort("T", go.Spot.Top, false, true),
+            makeNodePort("L", go.Spot.Left, true, true),
+            makeNodePort("R", go.Spot.Right, true, true),
+            makeNodePort("B", go.Spot.Bottom, true, false),
+            {
+                mouseEnter: function (e, node) { showNodePort(node, true); },
+                mouseLeave: function (e, node) { showNodePort(node, false); }
+            }
+        )
+        )
+
+        // 服务节点
+        _designer.nodeTemplateMap.add('Service',
+            G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+            new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+            new go.Binding("angle").makeTwoWay(),
+            // the main object is a Panel that surrounds a TextBlock with a Shape
+            G(go.Panel, "Auto",
+                { name: "PANEL" },
+                new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "RoundedRectangle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "PIPE",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "white", // default color
+                            strokeWidth: 1,
+                            stroke: "#DCDEE2"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.Shape,
+                    { 
+                        margin: 5, 
+                        fill: 'black', 
+                        strokeWidth: 0, 
+                        width: 28, 
+                        height: 20,
+                        alignment: go.Spot.TopRight,
+                        geometry: go.Geometry.parse(geoFunc('service'))
+                    }),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin: 8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "#343434",
+                            textAlign: "center",
+                            alignment: go.Spot.Center,
+                            verticalAlignment: go.Spot.Center,
+                            wrap: go.TextBlock.WrapFit,
+                            minSize: new go.Size(126, 27),
+                            maxSize: new go.Size(126, NaN)
+                        },
+                        new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // 绑定上下文菜单
+                    // contextMenu: makePartContextMenu()
+                }
+            ),
+            // 4个连接点
+            makeNodePort("T", go.Spot.Top, false, true),
+            makeNodePort("L", go.Spot.Left, true, true),
+            makeNodePort("R", go.Spot.Right, true, true),
+            makeNodePort("B", go.Spot.Bottom, true, false),
+            {
+                mouseEnter: function (e, node) { showNodePort(node, true); },
+                mouseLeave: function (e, node) { showNodePort(node, false); }
+            }
+        )
+        )
+
+        // 审批节点
+        _designer.nodeTemplateMap.add('Approval',
+            G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+            new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+            new go.Binding("angle").makeTwoWay(),
+            // the main object is a Panel that surrounds a TextBlock with a Shape
+            G(go.Panel, "Auto",
+                { name: "PANEL" },
+                new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "RoundedRectangle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "PIPE",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "white", // default color
+                            strokeWidth: 1,
+                            stroke: "#DCDEE2"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.Shape,
+                    { 
+                        margin: 5, 
+                        fill: 'black', 
+                        strokeWidth: 0, 
+                        width: 28, 
+                        height: 20,
+                        alignment: go.Spot.TopRight,
+                        geometry: go.Geometry.parse(geoFunc('approval'))
+                    }),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin: 8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "#343434",
+                            textAlign: "center",
+                            alignment: go.Spot.Center,
+                            verticalAlignment: go.Spot.Center,
+                            wrap: go.TextBlock.WrapFit,
+                            minSize: new go.Size(126, 27),
+                            maxSize: new go.Size(126, NaN)
+                        },
+                        new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // 绑定上下文菜单
+                    // contextMenu: makePartContextMenu()
+                }
+            ),
+            // 4个连接点
+            makeNodePort("T", go.Spot.Top, false, true),
+            makeNodePort("L", go.Spot.Left, true, true),
+            makeNodePort("R", go.Spot.Right, true, true),
+            makeNodePort("B", go.Spot.Bottom, true, false),
+            {
+                mouseEnter: function (e, node) { showNodePort(node, true); },
+                mouseLeave: function (e, node) { showNodePort(node, false); }
+            }
+        )
+        )
+
+        // 操作节点
+        _designer.nodeTemplateMap.add('Operation',
+        G(go.Node, "Spot",
+        { locationSpot: go.Spot.Center },
+        new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+        { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+        new go.Binding("angle").makeTwoWay(),
+        // the main object is a Panel that surrounds a TextBlock with a Shape
+        G(go.Panel, "Auto",
+            { name: "PANEL" },
+            new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+            G(go.Shape, "RoundedRectangle", // default figure
+                    {
+                        portId: "", // the default port: if no spot on link data, use closest side
+                        name: "PIPE",
+                        fromLinkable: true,
+                        toLinkable: true,
+                        cursor: "pointer",
+                        fill: "white", // default color
+                        strokeWidth: 1,
+                        stroke: "#DCDEE2"
+                    },
+                    new go.Binding("figure"),
+                    new go.Binding("stroke"),
+                    new go.Binding("strokeDashArray"),
+                    new go.Binding("strokeWidth"),
+                    new go.Binding("fill")),
+            G(go.Shape,
+                { 
+                    margin: 5, 
+                    fill: 'black', 
+                    strokeWidth: 0, 
+                    width: 28, 
+                    height: 20,
+                    alignment: go.Spot.TopRight,
+                    geometry: go.Geometry.parse(geoFunc('operation'))
+                }),
+            G(go.TextBlock,
+                    {
+                        font: "bold 11pt Helvetica, Arial, sans-serif",
+                        margin: 8,
+                        wrap: go.TextBlock.WrapFit,
+                        stroke: "#343434",
+                        textAlign: "center",
+                        alignment: go.Spot.Center,
+                        verticalAlignment: go.Spot.Center,
+                        wrap: go.TextBlock.WrapFit,
+                        minSize: new go.Size(126, 27),
+                        maxSize: new go.Size(126, NaN)
+                    },
+                    new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+            {
+                toolTip:// this tooltip Adornment is shared by all nodes
+                    G(go.Adornment, "Auto",
+                        G(go.Shape, { fill: "#FFFFCC" }),
+                        G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                            new go.Binding("text", "", nodeInfo))
+                    ),
+                // 绑定上下文菜单
+                // contextMenu: makePartContextMenu()
+            }
+        ),
+        // 4个连接点
+        makeNodePort("T", go.Spot.Top, false, true),
+        makeNodePort("L", go.Spot.Left, true, true),
+        makeNodePort("R", go.Spot.Right, true, true),
+        makeNodePort("B", go.Spot.Bottom, true, false),
+        {
+            mouseEnter: function (e, node) { showNodePort(node, true); },
+            mouseLeave: function (e, node) { showNodePort(node, false); }
+        }
+    )    
+        )
+        // 添加开始节点
+        _designer.nodeTemplateMap.add("Start",
+            G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+                new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+                new go.Binding("angle").makeTwoWay(),
+            G(go.Panel, "Auto",
+                    { name: "Start" },
+                    new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "Circle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "Start",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "#5F7790", // default color
+                            strokeWidth: 1,
+                            stroke: "#5F7790",
+                            // geometryString: "F M0 0 L100 0 B-90 180 100 25 25 25 L0 50 B90 180 0 25 25 25"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin:8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "white",
+                            overflow:go.TextBlock.OverflowEllipsis
+                        },
+                        new go.Binding("text").makeTwoWay()),
+                    {
+                        toolTip: G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 },
+                                new go.Binding("text", "", nodeInfo))
+                        )
+                    }
+                ),
+                // 4个连接点
+                makeNodePort("B", go.Spot.Bottom, true, false),
+                {
+                    mouseEnter: function (e, node) { showNodePort(node, true); },
+                    mouseLeave: function (e, node) { showNodePort(node, false); }
+                }
+        ));
+        
+        // 添加结束节点
+        _designer.nodeTemplateMap.add("End",
+            G(go.Node, "Spot",
+                { locationSpot: go.Spot.Center },
+                    new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+                { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+                    new go.Binding("angle").makeTwoWay(),
+                G(go.Panel, "Auto",
+                        { name: "End" },
+                        new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                    G(go.Shape, "Circle", // default figure
+                            {
+                                portId: "", // the default port: if no spot on link data, use closest side
+                                name: "End",
+                                fromLinkable: true,
+                                toLinkable: true,
+                                cursor: "pointer",
+                                fill: "#5F7790", // default color
+                                strokeWidth: 1,
+                                stroke: "#5F7790",
+                                // geometryString: "F M0 0 L100 0 Q175 25 100 50 L0 50 Q-75 25 0 0"
+                            },
+                            new go.Binding("figure"),
+                            new go.Binding("stroke"),
+                            new go.Binding("strokeDashArray"),
+                            new go.Binding("strokeWidth"),
+                            new go.Binding("fill")),
+                    G(go.TextBlock,
+                            {
+                                font: "bold 11pt Helvetica, Arial, sans-serif",
+                                margin: 8,
+                                wrap: go.TextBlock.WrapFit,
+                                stroke: "white"
+                            },
+                            new go.Binding("text").makeTwoWay()),
+                        {
+                            toolTip: G(go.Adornment, "Auto",
+                                G(go.Shape, { fill: "#FFFFCC" }),
+                                G(go.TextBlock, { margin: 4 },
+                                    new go.Binding("text", "", nodeInfo))
+                            )
+                        }
+                    ),
+                    // 4个连接点
+                    makeNodePort("T", go.Spot.Top, false, true),
+                    {
+                        mouseEnter: function (e, node) { showNodePort(node, true); },
+                        mouseLeave: function (e, node) { showNodePort(node, false); }
+                    }
+        ));
+
+        // 流程连接线的样式模板
+        _designer.linkTemplate = makeLinkTemplate();
+        
+        return _designer
+    }
+
+    /**
+     * 生成GUID
+     * @returns {string}
+     */
+    function guid() {
+        var r = Math.floor(Math.random() * (30000 - 1 + 1) + 1);
+        return Number(r);
+    }
+
+    function geoFunc(geoname) {
+        if (icons[geoname]) return icons[geoname];
+        else return icons["approval"]; // default icon
+    }
+
+    /**
+     * 操作节点样式模板
+     * @returns {*}
+     */
+    function operationNodeTemplate(){
+        return G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+            new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+            new go.Binding("angle").makeTwoWay(),
+            // the main object is a Panel that surrounds a TextBlock with a Shape
+            G(go.Panel, "Auto",
+                { name: "PANEL" },
+                new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "RoundedRectangle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "PIPE",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "white", // default color
+                            strokeWidth: 1,
+                            stroke: "#DCDEE2"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.Shape,
+                    { 
+                        margin: 5, 
+                        fill: 'black', 
+                        strokeWidth: 0, 
+                        width: 20, 
+                        height: 20,
+                        alignment: go.Spot.TopRight,
+                        geometry: go.Geometry.parse(geoFunc('operation'))
+                    }),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin: 8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "#343434",
+                            textAlign: "center",
+                            alignment: go.Spot.Center,
+                            verticalAlignment: go.Spot.Center,
+                            wrap: go.TextBlock.WrapFit,
+                            minSize: new go.Size(126, 27),
+                            maxSize: new go.Size(126, NaN)
+                        },
+                        new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // 绑定上下文菜单
+                    // contextMenu: makePartContextMenu()
+                }
+            ),
+            // 4个连接点
+            makeNodePort("T", go.Spot.Top, false, true),
+            makeNodePort("L", go.Spot.Left, true, true),
+            makeNodePort("R", go.Spot.Right, true, true),
+            makeNodePort("B", go.Spot.Bottom, true, false),
+            {
+                mouseEnter: function (e, node) { showNodePort(node, true); },
+                mouseLeave: function (e, node) { showNodePort(node, false); }
+            }
+        );
+    }
+
+    /**
+     * 操作节点样式模板
+     * @returns {*}
+     */
+    function approvalNodeTemplate(){
+        return G(go.Node, "Spot",
+            { locationSpot: go.Spot.Center },
+            new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
+            { selectable: true, selectionAdornmentTemplate: makeNodeSelectionAdornmentTemplate() },
+            new go.Binding("angle").makeTwoWay(),
+            // the main object is a Panel that surrounds a TextBlock with a Shape
+            G(go.Panel, "Auto",
+                { name: "PANEL" },
+                new go.Binding("desiredSize", "size", go.Size.parse).makeTwoWay(go.Size.stringify),
+                G(go.Shape, "RoundedRectangle", // default figure
+                        {
+                            portId: "", // the default port: if no spot on link data, use closest side
+                            name: "PIPE",
+                            fromLinkable: true,
+                            toLinkable: true,
+                            cursor: "pointer",
+                            fill: "white", // default color
+                            strokeWidth: 1,
+                            stroke: "#DCDEE2"
+                        },
+                        new go.Binding("figure"),
+                        new go.Binding("stroke"),
+                        new go.Binding("strokeDashArray"),
+                        new go.Binding("strokeWidth"),
+                        new go.Binding("fill")),
+                G(go.Shape,
+                    { 
+                        margin: 5, 
+                        fill: 'black', 
+                        strokeWidth: 0, 
+                        width: 20, 
+                        height: 20,
+                        alignment: go.Spot.TopRight,
+                        geometry: go.Geometry.parse(geoFunc('approval'))
+                    }),
+                G(go.TextBlock,
+                        {
+                            font: "bold 11pt Helvetica, Arial, sans-serif",
+                            margin: 8,
+                            wrap: go.TextBlock.WrapFit,
+                            stroke: "#343434",
+                            textAlign: "center",
+                            alignment: go.Spot.Center,
+                            verticalAlignment: go.Spot.Center,
+                            wrap: go.TextBlock.WrapFit,
+                            minSize: new go.Size(126, 27),
+                            maxSize: new go.Size(126, NaN)
+                        },
+                        new go.Binding("text").makeTwoWay()),// the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // 绑定上下文菜单
+                    // contextMenu: makePartContextMenu()
+                }
+            ),
+            // 4个连接点
+            makeNodePort("T", go.Spot.Top, false, true),
+            makeNodePort("L", go.Spot.Left, true, true),
+            makeNodePort("R", go.Spot.Right, true, true),
+            makeNodePort("B", go.Spot.Bottom, true, false),
+            {
+                mouseEnter: function (e, node) { showNodePort(node, true); },
+                mouseLeave: function (e, node) { showNodePort(node, false); }
+            }
+        );
+    }
+
+    /**
+     * 选中节点的样式
+     * @returns {*}
+     */
+    function makeNodeSelectionAdornmentTemplate(){
+        return G(go.Adornment, "Auto",
+            G(go.Shape, { fill: null, stroke: "deepskyblue", strokeWidth: 1.5, strokeDashArray: [4, 2] }),
+            G(go.Placeholder)
+        );
+    }
+
+    /**
+     * 创建连接点
+     * @param name
+     * @param spot
+     * @param output
+     * @param input
+     * @returns {*}
+     */
+    function makeNodePort(name, spot, output, input) {
+        // the port is basically just a small transparent square
+        return G(go.Shape, "Circle",
+            {
+                fill: null, // not seen, by default; set to a translucent gray by showSmallPorts, defined below
+                stroke: null,
+                desiredSize: new go.Size(7, 7),
+                alignment: spot, // align the port on the main Shape
+                alignmentFocus: spot, // just inside the Shape
+                portId: name, // declare this object to be a "port"
+                fromSpot: spot,
+                toSpot: spot, // declare where links may connect at this port
+                fromLinkable: output,
+                toLinkable: input, // declare whether the user may draw links to/from here
+                cursor: "pointer" // show a different cursor to indicate potential link point
+            });
+    }
+
+    /**
+     * tooltip上显示的信息
+     * @param d
+     * @returns {string}
+     */
+    function nodeInfo(d) {
+        return '双击可编辑';
+    }
+
+    /**
+     * 右键菜单
+     * @returns {*}
+     */
+    function makePartContextMenu(){
+        return G(go.Adornment, "Vertical",
+            makeMenuItem("编辑",
+                function(e, obj) { // OBJ is this Button
+                    var contextmenu = obj.part; // the Button is in the context menu Adornment
+                    var part = contextmenu.adornedPart; // the adornedPart is the Part that the context menu adorns
+                    // now can do something with PART, or with its data, or with the Adornment (the context menu)
+                    showEditNode(part);
+                }),
+            makeMenuItem("剪切",
+                function(e, obj) { e.diagram.commandHandler.cutSelection(); },
+                function(o) { return o.diagram.commandHandler.canCutSelection(); }),
+            makeMenuItem("复制",
+                function(e, obj) { e.diagram.commandHandler.copySelection(); },
+                function(o) { return o.diagram.commandHandler.canCopySelection(); }),
+            makeMenuItem("删除",
+                function(e, obj) { e.diagram.commandHandler.deleteSelection(); },
+                function(o) { return o.diagram.commandHandler.canDeleteSelection(); })
+        );
+    }
+
+    /**
+     * 生成右键菜单项
+     * @param text
+     * @param action
+     * @param visiblePredicate
+     * @returns {*}
+     */
+    function makeMenuItem(text, action, visiblePredicate) {
+        return G("ContextMenuButton",
+            G(go.TextBlock, text, {
+                margin: 5,
+                textAlign: "left",
+                stroke: "#555555"
+            }),
+            { click: action },
+            // don't bother with binding GraphObject.visible if there's no predicate
+            visiblePredicate ? new go.Binding("visible", "", visiblePredicate).ofObject() : {});
+    }
+
+    /**
+     * 是否显示步骤的连接点
+     * @param node
+     * @param show
+     */
+    function showNodePort(node, show) {
+        node.ports.each(function (port) {
+            if (port.portId !== "") { // don't change the default port, which is the big shape
+                port.fill = show ? "rgba(255,0,0,.5)" : null;
+            }
+        });
+    }
+
+    /**
+     * 连接线的选中样式
+     * @returns {*}
+     */
+    function makeLinkSelectionAdornmentTemplate(){
+        return G(go.Adornment, "Link",
+            G(go.Shape,
+                // isPanelMain declares that this Shape shares the Link.geometry
+                { isPanelMain: true, fill: null, stroke: "deepskyblue", strokeWidth: 0 }) // use selection object's strokeWidth
+        );
+    }
+
+    
+    /**
+     * 定义连接线的样式模板
+     * @returns {*}
+     */
+    function makeLinkTemplate(){
+        return G(go.Link, // the whole link panel
+            { selectable: true, selectionAdornmentTemplate: makeLinkSelectionAdornmentTemplate() },
+            { relinkableFrom: true, relinkableTo: true, reshapable: true },
+            {
+                routing: go.Link.AvoidsNodes,
+                curve: go.Link.JumpOver,
+                corner: 5,
+                toShortLength: 4
+            },
+            G(go.Shape, // 线条
+                { isPanelMain: true, stroke: "#D5D5D5", strokeWidth: 3 }),
+            G(go.Shape, // 箭头
+                { toArrow: "standard", stroke: null, fill: '#D5D5D5' }, new go.Binding("stroke"), new go.Binding("fill"), new go.Binding("zOrder")),
+            G(go.Panel, "Auto",
+                G(go.Shape, {
+                    fill: null,
+                    stroke: null
+                }, new go.Binding("fill", "pFill"), new go.Binding("zOrder")),
+                G(go.TextBlock,
+                    {
+                        textAlign: "center",
+                        font: "10pt helvetica, arial, sans-serif",
+                        stroke: "#555555",
+                        margin: 4
+                    },
+                    new go.Binding("text", "text"), new go.Binding("zOrder")), // the label shows the node data's text
+                {
+                    toolTip:// this tooltip Adornment is shared by all nodes
+                        G(go.Adornment, "Auto",
+                            G(go.Shape, { fill: "#FFFFCC" }),
+                            G(go.TextBlock, { margin: 4 }, // the tooltip shows the result of calling nodeInfo(data)
+                                new go.Binding("text", "", nodeInfo))
+                        ),
+                    // this context menu Adornment is shared by all nodes
+                    // contextMenu: makePartContextMenu()
+                }
+            )
+        );
+    }
+
+    /**
+     * 流程图元素的双击事件
+     * @param ev
+     */
+    function onObjectDoubleClicked(ev) {
+        var part = ev.subject.part;
+        showEditNode(part);
+    }
+
+    /**
+     * 流程图如果有变动,则提示用户保存
+     * @param e
+     */
+    function onDiagramModified(e){
+        var button = document.getElementById("btnSaveFlow");
+        if (button) button.disabled = !_designer.isModified;
+        var idx = document.title.indexOf("*");
+        if (_designer.isModified) {
+            if (idx < 0) document.title += "*";
+        } else {
+            if (idx >= 0) document.title = document.title.substr(0, idx);
+        }
+    }
+
+    /**
+     * 编辑节点信息
+     */
+    function showEditNode(node) {
+        _this.showEditNode(node)
+        return node
+    }
+
+    /**
+     * 更新节点信息
+     * @param oldData
+     * @param newData
+     */
+    function updateNodeData(node, text) {
+        _designer.startTransaction("vacate");
+        _designer.model.setDataProperty(node.data, "text", text);
+        _designer.commitTransaction("vacate");
+    }
+
+    /**
+     * 更改所有连线中间的文本背景色
+     */
+    function setLinkTextBg() {
+        _designer.links.each(function (link) {
+            _designer.startTransaction("vacate");
+            if (link.data.text) {
+                _designer.model.setDataProperty(link.data, "pFill", window.go.GraphObject.make(go.Brush, "Radial", {
+                    0: "rgb(240, 240, 240)",
+                    0.3: "rgb(240, 240, 240)",
+                    1: "rgba(240, 240, 240, 0)"
+                }));
+            }
+            _designer.commitTransaction("vacate");
+        });
+    }
+
+    /** --------private method------------------end----------------------**/
+
+    return this;
+}
+
+export default FlowDesigner

Dosya farkı çok büyük olduğundan ihmal edildi
+ 53 - 0
ruoyi-ui/src/utils/icon.js


Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor