From e8ef7263819e847d55cd35e006aa02635fd7b82e Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 14 五月 2025 17:54:21 +0800
Subject: [PATCH] 2025-05-14

---
 src/tabviews/custom/components/chart/antv-X6/index.jsx |  583 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 457 insertions(+), 126 deletions(-)

diff --git a/src/tabviews/custom/components/chart/antv-X6/index.jsx b/src/tabviews/custom/components/chart/antv-X6/index.jsx
index bfed13f..ed4283f 100644
--- a/src/tabviews/custom/components/chart/antv-X6/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/index.jsx
@@ -1,8 +1,8 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Spin, Tooltip, message, Modal, notification, Switch } from 'antd'
-import { UndoOutlined, RedoOutlined, VerticalAlignTopOutlined, VerticalAlignBottomOutlined, SaveOutlined, ZoomInOutlined, ZoomOutOutlined, OneToOneOutlined, QuestionCircleOutlined, ClearOutlined } from '@ant-design/icons'
+import { Spin, Tooltip, message, Modal, notification, Switch, Button } from 'antd'
+import { UndoOutlined, RedoOutlined, VerticalAlignTopOutlined, VerticalAlignBottomOutlined, ZoomInOutlined, ZoomOutOutlined, OneToOneOutlined, QuestionCircleOutlined, ClearOutlined } from '@ant-design/icons'
 import { Graph, Shape } from '@antv/x6'
 import { Stencil } from '@antv/x6-plugin-stencil'
 import { Transform } from '@antv/x6-plugin-transform'
@@ -138,8 +138,8 @@
   'mk-rect',
   {
     inherit: 'rect',
-    width: 66,
-    height: 40,
+    width: 100,
+    height: 32,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -168,8 +168,8 @@
   'mk-polygon',
   {
     inherit: 'polygon',
-    width: 66,
-    height: 40,
+    width: 100,
+    height: 32,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -198,8 +198,8 @@
   'mk-paral',
   {
     inherit: 'polygon',
-    width: 66,
-    height: 40,
+    width: 100,
+    height: 32,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -256,8 +256,8 @@
   'mk-ellipse',
   {
     inherit: 'ellipse',
-    width: 66,
-    height: 40,
+    width: 100,
+    height: 32,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -318,8 +318,8 @@
   'mk-text',
   {
     inherit: 'text-block',
-    width: 66,
-    height: 40,
+    width: 100,
+    height: 50,
     text: '鏂囨湰鍩�',
     attrs: {
       body: {
@@ -344,7 +344,7 @@
   yellow_green: '#a0d911',
   green: '#52c41a',
   cyan: '#13c2c2',
-  blue_purple: '#2f54eb',
+  blue_purple: '#3860f4',
   purple: '#722ed1',
   magenta: '#eb2f96',
   grass_green: '#aeb303',
@@ -387,7 +387,9 @@
     loading: false,
     status: 0,
     flowname: '',
-    orgs: []
+    flowcode: '',
+    orgs: [],
+    empty: true
   }
 
   selectNode = null
@@ -525,6 +527,7 @@
                     worker_id: work.worker_id || '',
                     workercode: work.workercode || '',
                     workername: work.workername || '',
+                    job_type: job.job_type || '',
                     parentIds: [com.OrgCode, dep.co_pro_code, job.jobcode],
                     parentNames: [com.OrgName, dep.co_pro_name, job.jobname]
                   }
@@ -552,6 +555,7 @@
                     worker_id: work.worker_id || '',
                     workercode: work.workercode || '',
                     workername: work.workername || '',
+                    job_type: job.job_type || '',
                     parentIds: [com.OrgCode, dep.co_pro_code, job.jobcode, group.work_group],
                     parentNames: [com.OrgName, dep.co_pro_name, job.jobname, group.work_group]
                   }
@@ -589,8 +593,8 @@
     const { BID } = this.state
 
     if (!BID) {
+      this.cells = []
       if (!is(fromJS(this.data), fromJS([]))) {
-        this.cells = []
         this.handleData()
       }
       this.setState({empty: true})
@@ -621,8 +625,10 @@
 
       this.setState({
         status: item.status || 0,
-        flowname: item.works_flow_name,
-        loading: false
+        flowname: item.works_flow_name || '',
+        flowcode: item.works_flow_code || '',
+        loading: false,
+        empty: cells.length === 0
       })
 
       if (result.message) {
@@ -894,18 +900,18 @@
     const stencil = new Stencil({
       title: '娴佺▼鍥�',
       target: graph,
-      stencilGraphWidth: 180,
+      stencilGraphWidth: 230,
       stencilGraphHeight: 180,
       groups: [
         {
           title: '閫氱敤鑺傜偣',
           name: 'group1',
-          graphHeight: 240
+          graphHeight: 150
         },
         {
           title: '鑷畾涔�',
           name: 'group2',
-          graphHeight: 150,
+          graphHeight: 300,
           layoutOptions: {
             rowHeight: 70
           }
@@ -913,7 +919,7 @@
       ],
       layoutOptions: {
         columns: 2,
-        columnWidth: 80,
+        columnWidth: 110,
         rowHeight: 55
       }
     })
@@ -987,15 +993,60 @@
     })
     graph.on('edge:click', ({ edge }) => {
       this.selectNode = edge
-      
+
       this.setState({node: edge.store.data})
 
       graph.clearTransformWidgets()
     })
+
+    graph.on('node:dblclick', () => {
+      setTimeout(() => {
+        MKEmitter.emit('mk-x6-dbclick')
+      }, 100)
+    })
+    graph.on('edge:dblclick', () => {
+      setTimeout(() => {
+        MKEmitter.emit('mk-x6-dbclick')
+      }, 100)
+    })
+
     graph.on('blank:click', () => {
       this.selectNode = null
       
       this.setState({node: null})
+    })
+    graph.on('edge:connected', ({ isNew, edge }) => {
+      if (!isNew) return
+
+      let target = edge.getTargetCell()
+      let source = edge.getSourceCell()
+
+      if (!target || !source) return
+
+      if (source.prop('mknode') === 'end') {
+        notification.warning({
+          top: 92,
+          message: '缁撴潫鑺傜偣涓嶅彲娣诲姞鍒嗘敮锛�',
+          duration: 2
+        })
+        graph.removeCells([edge])
+        return
+      }
+
+      let mkdata = target.prop('mkdata')
+
+      if (source.prop('mknode') === 'start' && target.prop('mknode') === 'end') {
+        edge.prop('mknode', 'throughEdge')
+      } else if (target.prop('mknode') === 'end') {
+        edge.prop('mknode', 'endEdge')
+      } else if (target.prop('mknode') === 'start') {
+        edge.prop('mknode', 'startEdge')
+      } else if (source.prop('mknode') === 'start') {
+        edge.prop('mknode', 'firstEdge')
+      }
+      if (mkdata) {
+        edge.prop('mkdata', {status: mkdata.status, statusName: mkdata.statusName})
+      }
     })
     
     const r1 = graph.createNode({
@@ -1004,10 +1055,10 @@
       mkdata: {status: 0, statusName: '鏈彁浜�'},
       attrs: {
         body: {
-          rx: 20,
-          ry: 26,
-          fill: '#52c41a',
-          stroke: '#52c41a'
+          rx: 0,
+          ry: 0,
+          fill: '#000000',
+          stroke: '#000000'
         },
         text: {
           fill: '#ffffff',
@@ -1015,83 +1066,34 @@
         }
       }
     })
-    const r2 = graph.createNode({
-      shape: 'mk-rect',
-      attrs: {
-        body: {
-          rx: 20,
-          ry: 26,
-          fill: '#e6f4ff',
-          stroke: '#1890ff'
-        },
-        text: {
-          text: '杩囩▼'
-        }
-      }
-    })
-    const r3 = graph.createNode({
-      shape: 'mk-rect',
-      attrs: {
-        body: {
-          rx: 6,
-          ry: 6,
-          fill: '#fff7e6',
-          stroke: '#fa8c16'
-        },
-        text: {
-          text: '鍙�夎繃绋�'
-        }
-      }
-    })
+    
     const r4 = graph.createNode({
       shape: 'mk-rect',
       attrs: {
         body: {
           rx: 0,
           ry: 0,
-          fill: '#fff7e6',
-          stroke: '#fa8c16'
+          fill: '#ffffff',
+          stroke: '#757575'
         },
         text: {
+          fill: '#000000',
           text: '鑺傜偣'
         }
       }
     })
+
     const r5 = graph.createNode({
       shape: 'mk-polygon',
       attrs: {
         body: {
           refPoints: '0,10 10,0 20,10 10,20',
-          fill: '#f9f0ff',
-          stroke: '#722ed1'
+          fill: '#ffffff',
+          stroke: '#757575'
         },
         text: {
+          fill: '#000000',
           text: '鍐崇瓥'
-        }
-      }
-    })
-    const r6 = graph.createNode({
-      shape: 'mk-paral',
-      attrs: {
-        body: {
-          refPoints: '10,0 40,0 30,20 0,20',
-          fill: '#e6fffb',
-          stroke: '#13c2c2'
-        },
-        text: {
-          text: '鏁版嵁'
-        }
-      }
-    })
-    const r7 = graph.createNode({
-      shape: 'mk-circle',
-      attrs: {
-        body: {
-          fill: '#e6f4ff',
-          stroke: '#1890ff'
-        },
-        text: {
-          text: '杩炴帴'
         }
       }
     })
@@ -1102,10 +1104,10 @@
       mkdata: {status: 888, statusName: '宸插畬鎴�'},
       attrs: {
         body: {
-          rx: 20,
-          ry: 26,
-          fill: '#fa8c16',
-          stroke: '#fa8c16'
+          rx: 0,
+          ry: 0,
+          fill: '#000000',
+          stroke: '#000000'
         },
         text: {
           fill: '#ffffff',
@@ -1114,7 +1116,65 @@
       }
     })
     
-    stencil.load([r1, r2, r3, r4, r5, r6, r7, r8], 'group1')
+    stencil.load([r1, r4, r5, r8], 'group1')
+    
+    const r2 = graph.createNode({
+      shape: 'mk-rect',
+      attrs: {
+        body: {
+          rx: 20,
+          ry: 26,
+          fill: '#ffffff',
+          stroke: '#757575'
+        },
+        text: {
+          fill: '#000000',
+          text: '杩囩▼'
+        }
+      }
+    })
+    const r3 = graph.createNode({
+      shape: 'mk-rect',
+      attrs: {
+        body: {
+          rx: 6,
+          ry: 6,
+          fill: '#ffffff',
+          stroke: '#757575'
+        },
+        text: {
+          fill: '#000000',
+          text: '鍙�夎繃绋�'
+        }
+      }
+    })
+    const r6 = graph.createNode({
+      shape: 'mk-paral',
+      attrs: {
+        body: {
+          refPoints: '10,0 40,0 30,20 0,20',
+          fill: '#ffffff',
+          stroke: '#757575'
+        },
+        text: {
+          fill: '#000000',
+          text: '鏁版嵁'
+        }
+      }
+    })
+    const r7 = graph.createNode({
+      shape: 'mk-circle',
+      attrs: {
+        body: {
+          fill: '#ffffff',
+          stroke: '#757575'
+        },
+        text: {
+          fill: '#000000',
+          text: '杩炴帴'
+        }
+      }
+    })
     
     const p1 = graph.createNode({
       shape: 'mk-ellipse',
@@ -1129,7 +1189,7 @@
       shape: 'mk-text'
     })
     
-    stencil.load([p1, p2, p3], 'group2')
+    stencil.load([r2, r3, r6, r7, p1, p2, p3], 'group2')
 
     if (this.cells.length > 0) {
       let cells = []
@@ -1248,7 +1308,7 @@
     const stencil = new Stencil({
       title: '娴佺▼鍥�',
       target: graph,
-      stencilGraphWidth: 180,
+      stencilGraphWidth: 230,
       stencilGraphHeight: 180,
       groups: [
         {
@@ -1274,7 +1334,7 @@
       ],
       layoutOptions: {
         columns: 2,
-        columnWidth: 80,
+        columnWidth: 110,
         rowHeight: 55
       }
     })
@@ -1503,12 +1563,16 @@
   setback = () => {
     if (this.mkGraph.canUndo()) {
       this.mkGraph.undo()
+    } else {
+      message.warning('鏃犲彲鎾ら攢璁板綍锛�')
     }
   }
 
   setprev = () => {
     if (this.mkGraph.canRedo()) {
       this.mkGraph.redo()
+    } else {
+      message.warning('鏃犲彲鍓嶈繘璁板綍锛�')
     }
   }
 
@@ -1524,8 +1588,28 @@
     this.mkGraph.zoomTo(1)
   }
 
+  close = () => {
+    const { config } = this.state
+
+    let nodes = this.mkGraph.toJSON()
+
+    if (!is(fromJS(nodes.cells), fromJS(this.cells))) {
+      confirm({
+        title: '娴佺▼鍥惧凡淇敼锛岀‘瀹氬叧闂悧?',
+        okText: '纭畾',
+        cancelText: '鍙栨秷',
+        onOk() {
+          MKEmitter.emit('closeTabView', config.$pageId)
+        },
+        onCancel() {}
+      })
+    } else {
+      MKEmitter.emit('closeTabView', config.$pageId)
+    }
+  }
+
   save = () => {
-    const { BID, plot, status } = this.state
+    const { BID, plot, status, flowname, flowcode } = this.state
 
     if (!BID) {
       Modal.error({
@@ -1538,10 +1622,51 @@
     let _status = status
 
     if (plot.subtype === 'xflow' && status === 10) {
-      let start_num = nodes.cells.filter(cell => cell.mknode === 'start').length
-      let end_num = nodes.cells.filter(cell => cell.mknode === 'end').length
+      let start_num = 0
+      let end_num = 0
+      let unvalid = false
+      let map = new Map()
+      let appMap = new Map()
       
-      if (start_num !== 1 || end_num !== 1) {
+      nodes.cells.forEach(item => {
+        if (item.shape === 'mk-text' || item.shape === 'lane') return
+
+        if (!item.mkdata) {
+          unvalid = true
+        } else if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge') {
+          if (item.mknode === 'throughEdge') {
+            if (!item.mkdata.seniorbers || item.mkdata.seniorbers.length === 0) {
+              unvalid = true
+            }
+          } else if (item.mkdata.seniorCondition === 'open') {
+
+          } else if (item.mknode !== 'endEdge' && item.mknode !== 'startEdge' && (!item.mkdata.members || item.mkdata.members.length === 0)) {
+            unvalid = true
+          } else if (item.mknode === 'startEdge' || item.mkdata.flowType === 'reject') {
+            if (map.has(item.source.cell)) {
+              unvalid = true
+            } else {
+              map.set(item.source.cell, true)
+            }
+          } else if (item.mkdata.flowType === 'approval' || item.mknode === 'endEdge') {
+            let val = ''
+            if (item.mkdata.execCondition === 'open') {
+              val = item.mkdata.match + item.mkdata.matchVal
+            }
+            if (appMap.has(item.source.cell + val)) {
+              unvalid = true
+            } else {
+              appMap.set(item.source.cell + val, true)
+            }
+          }
+        }
+      })
+
+      if (start_num !== 1 || end_num === 0 || unvalid) {
         _status = 0
       }
     }
@@ -1559,18 +1684,54 @@
         ID: BID,
         BID: ''
       }
+
+      let ssoParam = {
+        func: 's_works_flow_param_sso_upt_v6',
+        status: status,
+        ID: BID,
+        works_flow_code: flowcode,
+        works_flow_name: flowname,
+        long_param: window.btoa(window.encodeURIComponent(JSON.stringify(nodes)))
+      }
   
       Api.genericInterface(param).then(res => {
         if (res.status) {
-          notification.success({
-            top: 92,
-            message: '淇濆瓨鎴愬姛锛�',
-            duration: 2
-          })
-          this.setState({
-            loading: false,
-            status: _status
-          })
+          if (plot.subtype === 'xflow') {
+            Api.getSystemConfig(ssoParam).then(result => {
+              if (result.status) {
+                notification.success({
+                  top: 92,
+                  message: '淇濆瓨鎴愬姛锛�',
+                  duration: 2
+                })
+                this.setState({
+                  loading: false,
+                  status: _status
+                })
+                this.cells = nodes.cells
+              } else {
+                notification.error({
+                  top: 92,
+                  message: result.message,
+                  duration: 10
+                })
+                this.setState({
+                  loading: false
+                })
+              }
+            })
+          } else {
+            notification.success({
+              top: 92,
+              message: '淇濆瓨鎴愬姛锛�',
+              duration: 2
+            })
+            this.setState({
+              loading: false,
+              status: _status
+            })
+            this.cells = nodes.cells
+          }
         } else {
           notification.error({
             top: 92,
@@ -1589,7 +1750,10 @@
     let cells = this.mkGraph.getCells()
     const that = this
 
-    if (cells.length === 0) return
+    if (cells.length === 0) {
+      message.warning('灏氭湭娣诲姞鍏冪礌锛�')
+      return
+    }
 
     confirm({
       title: '纭畾娓呯┖鍏冪礌鍚�?',
@@ -1746,6 +1910,16 @@
     }
   }
 
+  delCell = () => {
+    const { node } = this.state
+
+    let cell = this.mkGraph.getCellById(node.id)
+
+    this.mkGraph.removeCells([cell])
+
+    this.setState({node: null})
+  }
+
   changeProps = (value, key) => {
     const { node } = this.state
 
@@ -1780,6 +1954,16 @@
           this.selectNode.attr('line/strokeDasharray', 0)
         }
       } else if (key === 'mkdata') {
+        if (!node.mkdata) {
+          if (node.target && node.target.cell) {
+            let cell = this.mkGraph.getCellById(node.target.cell)
+
+            if (cell) {
+              cell.prop('mkdata', {status: value.status, statusName: value.statusName || ''})
+            }
+          }
+        }
+
         this.selectNode.prop('mkdata', value)
       }
     } else if (node.shape === 'lane') {
@@ -1893,20 +2077,23 @@
       MKEmitter.emit('modifyTabs', newtab, true)
     } else if (plot.click === 'menu') {
       let menuId = plot.menu.slice(-1)[0]
-      let newtab = window.GLOB.mkThdMenus.filter(m => m.MenuID === menuId)[0]
+      let menu = null
 
-      if (!newtab && plot.MenuID) {
-        newtab = {
+      if (window.GLOB.mkThdMenus.has(menuId)) {
+        menu = {...window.GLOB.mkThdMenus.get(menuId)}
+      } else if (plot.MenuID) {
+        menu = {
           MenuID: plot.MenuID,
           MenuName: plot.MenuName,
-          MenuNo: plot.MenuNo,
           type: plot.tabType
         }
-      } else if (!newtab) {
-        return
       }
 
-      MKEmitter.emit('modifyTabs', {...newtab, param: {$BID: sign}}, true)
+      if (!menu) return
+
+      menu.param = {$BID: sign}
+
+      MKEmitter.emit('modifyTabs', menu, true)
     } else {
       MKEmitter.emit('resetSelectLine', config.uuid, sign, {})
     }
@@ -1919,8 +2106,62 @@
     
     if (plot.subtype === 'xflow' && _status === 10) {
       let nodes = this.mkGraph.toJSON()
-      let start_num = nodes.cells.filter(cell => cell.mknode === 'start').length
-      let end_num = nodes.cells.filter(cell => cell.mknode === 'end').length
+
+      let start_num = 0
+      let end_num = 0
+      let unvalidId = ''
+      let emptyNode = null
+      let emptyEdge = null
+      let map = new Map()
+      let appMap = new Map()
+      let rejectId = ''
+      let approvalId = ''
+
+      nodes.cells.forEach(item => {
+        if (item.shape === 'mk-text' || item.shape === 'lane') return
+
+        if (!item.mkdata) {
+          if (item.shape !== 'edge') {
+            if (!emptyNode) {
+              emptyNode = item
+            }
+          } else {
+            if (!emptyEdge) {
+              emptyEdge = item
+            }
+          }
+        } else if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge' && !unvalidId && !rejectId && !approvalId) {
+          if (item.mknode === 'throughEdge') {
+            if (!item.mkdata.seniorbers || item.mkdata.seniorbers.length === 0) {
+              unvalidId = item.id
+            }
+          } else if (item.mkdata.seniorCondition === 'open') {
+
+          } else if (item.mknode !== 'endEdge' && item.mknode !== 'startEdge' && (!item.mkdata.members || item.mkdata.members.length === 0)) {
+            unvalidId = item.id
+          } else if (item.mknode === 'startEdge' || item.mkdata.flowType === 'reject') {
+            if (map.has(item.source.cell)) {
+              rejectId = item.source.cell
+            } else {
+              map.set(item.source.cell, true)
+            }
+          } else if (item.mkdata.flowType === 'approval' || item.mknode === 'endEdge') {
+            let val = ''
+            if (item.mkdata.execCondition === 'open') {
+              val = item.mkdata.match + item.mkdata.matchVal
+            }
+            if (appMap.has(item.source.cell + val)) {
+              approvalId = item.source.cell
+            } else {
+              appMap.set(item.source.cell + val, item)
+            }
+          }
+        }
+      })
 
       if (start_num === 0) {
         notification.warning({
@@ -1940,10 +2181,103 @@
           message: '璇锋坊鍔犵粨鏉熻妭鐐癸紒',
           duration: 2
         })
-      } else if (end_num > 1) {
+      // } else if (end_num > 1) {
+      //   notification.warning({
+      //     top: 92,
+      //     message: '缁撴潫鑺傜偣涓嶅彲娣诲姞澶氫釜锛�',
+      //     duration: 2
+      //   })
+      } else if (emptyNode) {
+        let errmsg = '閮ㄥ垎鑺傜偣鏈缃熀鏈俊鎭��'
+        if (emptyNode.attrs && emptyNode.attrs.text && emptyNode.attrs.text.text) {
+          errmsg = '鑺傜偣銆�' + emptyNode.attrs.text.text + '銆嬫湭璁剧疆鍩烘湰淇℃伅銆�'
+        }
         notification.warning({
           top: 92,
-          message: '缁撴潫鑺傜偣涓嶅彲娣诲姞澶氫釜锛�',
+          message: errmsg,
+          duration: 2
+        })
+      } else if (emptyEdge) {
+        let errmsg = '閮ㄥ垎杩炵嚎鏈缃熀鏈俊鎭��'
+
+        let edge = this.mkGraph.getCellById(emptyEdge.id)
+        let target = edge.getTargetCell()
+
+        let t_label = ''
+        if (target.attrs && target.attrs.text && target.attrs.text.text) {
+          t_label = target.attrs.text.text
+        }
+
+        let source = edge.getSourceCell()
+
+        let s_label = ''
+        if (source.attrs && source.attrs.text && source.attrs.text.text) {
+          s_label = source.attrs.text.text
+        }
+
+        if (t_label && s_label) {
+          errmsg = '鑺傜偣銆�' + s_label + '銆嬩笌鑺傜偣銆�' + t_label + '銆嬮棿杩炵嚎鏈缃熀鏈俊鎭��'
+        }
+
+        notification.warning({
+          top: 92,
+          message: errmsg,
+          duration: 2
+        })
+      } else if (rejectId) {
+        let node = this.mkGraph.getCellById(rejectId)
+
+        let title = ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = '鑺傜偣銆�' + node.attrs.text.text + '銆�'
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: title + ' 涓嶅彲璁剧疆涓ゆ潯椹冲洖杩炵嚎锛�',
+          duration: 2
+        })
+      } else if (approvalId) {
+        let node = this.mkGraph.getCellById(approvalId)
+
+        let title = ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = '鑺傜偣銆�' + node.attrs.text.text + '銆�'
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: title + ' 鍚庣殑瀹℃壒鍒嗘敮鎵ц鏉′欢閲嶅锛�',
+          duration: 2
+        })
+      } else if (unvalidId) {
+        let edge = this.mkGraph.getCellById(unvalidId)
+
+        let node = edge.getTargetCell()
+
+        let title = ''
+        if (node.attrs && node.attrs.text && node.attrs.text.text) {
+          title = node.attrs.text.text
+        } else if (node.mkdata) {
+          title = '鐘舵�侊細' + node.mkdata.status + ' - ' + node.mkdata.statusName
+        }
+
+        let source = edge.getSourceCell()
+
+        let s_label = ''
+        if (source.attrs && source.attrs.text && source.attrs.text.text) {
+          s_label = source.attrs.text.text
+        } else if (source.mkdata) {
+          s_label = '鐘舵�侊細' + source.mkdata.status + ' - ' + source.mkdata.statusName
+        }
+
+        notification.warning({
+          top: 92,
+          message: '鑺傜偣銆�' + s_label + '銆嬩笌銆�' + title + '銆嬮棿杩炵嚎鏈缃鎵逛汉锛�',
           duration: 2
         })
       } else {
@@ -1969,12 +2303,12 @@
   }
 
   render() {
-    const { loading, config, node, orgs, status, flowname } = this.state
+    const { loading, config, node, orgs, status, flowname, empty } = this.state
 
     let style = {...config.style}
 
     if (config.plot.function === 'show') {
-      if (config.plot.empty === 'hidden' && this.cells.length === 0) {
+      if (config.plot.empty === 'hidden' && empty) {
         style.position = 'absolute'
         style.width = '100%'
         style.zIndex = -1
@@ -2031,18 +2365,15 @@
             <Tooltip title="娓呯┖">
               <ClearOutlined onClick={this.clearNode}/>
             </Tooltip>
-            <Tooltip overlayStyle={{maxWidth: 260}} title="蹇嵎閿細澶嶅埗锛坈trl+c锛夈�佸壀鍒囷紙ctrl+x锛夈�佺矘璐达紙ctrl+v锛夈�佸悗閫�锛坈trl+z锛夈�佸墠杩涳紙ctrl+shift+z锛夈�佸垹闄わ紙backspace 鎴� delete锛�">
+            <Tooltip overlayStyle={{maxWidth: 310}} title="蹇嵎閿細澶嶅埗锛坈trl+c锛夈�佸壀鍒囷紙ctrl+x锛夈�佺矘璐达紙ctrl+v锛夈�佸悗閫�锛坈trl+z锛夈�佸墠杩涳紙ctrl+shift+z锛夈�佸垹闄わ紙backspace 鎴� delete锛夛紱鍙屽嚮鑺傜偣鎴栬繛绾垮彲缂栬緫鑷畾涔変俊鎭��">
               <QuestionCircleOutlined />
             </Tooltip>
           </div>
           <div className="flow-name">{flowname}</div>
           <div className="right-tool">
-            <Tooltip title="鍚敤/鍋滅敤">
-              <Switch size="small" style={{marginRight: '10px'}} checked={status === 10} onChange={this.changeStatus} />
-            </Tooltip>
-            <Tooltip title="淇濆瓨">
-              <SaveOutlined style={{marginRight: '10px'}} onClick={this.save}/>
-            </Tooltip>
+            <Switch size="large" checked={status === 10} checkedChildren="鍚�" unCheckedChildren="鍋�" onChange={this.changeStatus} />
+            <Button className="save" onClick={this.save}>淇濆瓨</Button>
+            <Button className="close" onClick={this.close}>鍏抽棴</Button>
           </div>
         </div>
         <div className="canvas" style={{width: '100%', minHeight: config.plot.height, height: config.plot.height}} id={config.uuid + 'canvas'}>
@@ -2050,7 +2381,7 @@
           <div id={config.uuid + 'container'} className="mk-container"></div>
           <div className="mk-node-edit">
             <div className="header">璁剧疆</div>
-            {!node ? <div className="empty">鏈�変腑</div> : <NodeUpdate node={node} orgs={orgs} onChange={this.changeProps}/>}
+            {!node ? <div className="empty">鏈�変腑</div> : <NodeUpdate node={node} orgs={orgs} onChange={this.changeProps} onDel={this.delCell}/>}
           </div>
         </div>
       </div>

--
Gitblit v1.8.0