From 46773828b8c46e450a67eb1fc5e6124d87d97ab6 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期六, 23 九月 2023 19:51:11 +0800
Subject: [PATCH] 2023-09-23

---
 src/tabviews/custom/components/chart/antv-X6/index.jsx |  448 +++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 393 insertions(+), 55 deletions(-)

diff --git a/src/tabviews/custom/components/chart/antv-X6/index.jsx b/src/tabviews/custom/components/chart/antv-X6/index.jsx
index 71aed16..97525bc 100644
--- a/src/tabviews/custom/components/chart/antv-X6/index.jsx
+++ b/src/tabviews/custom/components/chart/antv-X6/index.jsx
@@ -1,7 +1,7 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Spin, Tooltip, message, Modal, notification } from 'antd'
+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 { Graph, Shape } from '@antv/x6'
 import { Stencil } from '@antv/x6-plugin-stencil'
@@ -139,7 +139,7 @@
   {
     inherit: 'rect',
     width: 66,
-    height: 36,
+    height: 40,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -169,7 +169,7 @@
   {
     inherit: 'polygon',
     width: 66,
-    height: 36,
+    height: 40,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -199,7 +199,7 @@
   {
     inherit: 'polygon',
     width: 66,
-    height: 36,
+    height: 40,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -226,8 +226,8 @@
   'mk-circle',
   {
     inherit: 'circle',
-    width: 36,
-    height: 36,
+    width: 40,
+    height: 40,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -257,7 +257,7 @@
   {
     inherit: 'ellipse',
     width: 66,
-    height: 36,
+    height: 40,
     attrs: {
       body: {
         strokeWidth: 1,
@@ -286,8 +286,8 @@
   'mk-star',
   {
     inherit: 'polygon',
-    width: 36,
-    height: 36,
+    width: 40,
+    height: 40,
     points: '100,10 40,198 190,78 10,78 160,198',
     attrs: {
       body: {
@@ -319,7 +319,7 @@
   {
     inherit: 'text-block',
     width: 66,
-    height: 36,
+    height: 40,
     text: '鏂囨湰鍩�',
     attrs: {
       body: {
@@ -385,7 +385,10 @@
     editing: false,
     node: null,
     loading: false,
-    rolelist: []
+    status: 0,
+    flowname: '',
+    flowcode: '',
+    orgs: []
   }
 
   selectNode = null
@@ -423,7 +426,7 @@
       this.loadData()
 
       if (_config.plot.function === 'edit') {
-        this.getrolelist()
+        this.getorganizations()
       }
     })
   }
@@ -468,8 +471,8 @@
     }
   }
 
-  getrolelist = () => {
-    Api.getSystemConfig({func: 's_get_rolelist', OrderCol: 'RoleID desc', PageIndex: 1, PageSize: 1000}).then(res => {
+  getorganizations = () => {
+    Api.genericInterface({func: 's_get_organizations_v1'}).then(res => {
       if (!res.status) {
         notification.error({
           top: 92,
@@ -479,7 +482,107 @@
         return
       }
 
-      this.setState({rolelist: res.data || []})
+      let orgs = []
+      res.organizations && res.organizations.forEach(com => {
+        let _com = {
+          key: com.OrgCode,
+          title: com.OrgName,
+          shortName: com.ShortName,
+          checkable: false,
+          selectable: false,
+          children: []
+        }
+        let _works = []
+
+        com.departments.forEach(dep => {
+          let _dep = {
+            key: dep.co_pro_code,
+            title: dep.co_pro_name,
+            checkable: false,
+            selectable: false,
+            children: []
+          }
+
+          dep.jobs.forEach(job => {
+            let _job = {
+              key: job.jobcode,
+              title: job.jobname,
+              checkable: false,
+              selectable: false,
+              children: []
+            }
+  
+            job.work_group.forEach(group => {
+              if (group.work_group === 'normal') {
+                group.workers.forEach(work => {
+                  let _work = {
+                    key: work.worker_id,
+                    title: work.workername,
+                    email: work.email || '',
+                    images: work.images || '',
+                    mob: work.mob || '',
+                    sex: work.sex || '',
+                    work_grade: work.work_grade || '',
+                    worker_id: work.worker_id || '',
+                    workercode: work.workercode || '',
+                    workername: work.workername || '',
+                    parentIds: [com.OrgCode, dep.co_pro_code, job.jobcode],
+                    parentNames: [com.OrgName, dep.co_pro_name, job.jobname]
+                  }
+  
+                  _job.children.push(_work)
+                })
+              } else {
+                let _group = {
+                  key: group.work_group,
+                  title: group.work_group,
+                  checkable: false,
+                  selectable: false,
+                  children: []
+                }
+
+                group.workers.forEach(work => {
+                  let _work = {
+                    key: work.worker_id,
+                    title: work.workername,
+                    email: work.email || '',
+                    images: work.images || '',
+                    mob: work.mob || '',
+                    sex: work.sex || '',
+                    work_grade: work.work_grade || '',
+                    worker_id: work.worker_id || '',
+                    workercode: work.workercode || '',
+                    workername: work.workername || '',
+                    parentIds: [com.OrgCode, dep.co_pro_code, job.jobcode, group.work_group],
+                    parentNames: [com.OrgName, dep.co_pro_name, job.jobname, group.work_group]
+                  }
+  
+                  _group.children.push(_work)
+                })
+
+                if (_group.children.length > 0) {
+                  _job.children.push(_group)
+                }
+              }
+            })
+
+            if (_job.children.length > 0) {
+              _dep.children.push(_job)
+            }
+          })
+
+          if (_dep.children.length > 0) {
+            _com.children.push(_dep)
+          }
+        })
+
+        if (_com.children.length > 0) {
+          _com.works = _works
+          orgs.push(_com)
+        }
+      })
+
+      this.setState({orgs: orgs})
     })
   }
 
@@ -518,6 +621,9 @@
       this.handleData()
 
       this.setState({
+        status: item.status || 0,
+        flowname: item.works_flow_name || '',
+        flowcode: item.works_flow_code || '',
         loading: false
       })
 
@@ -795,7 +901,8 @@
       groups: [
         {
           title: '閫氱敤鑺傜偣',
-          name: 'group1'
+          name: 'group1',
+          graphHeight: 240
         },
         {
           title: '鑷畾涔�',
@@ -892,55 +999,142 @@
       
       this.setState({node: null})
     })
+    graph.on('edge:connected', ({ isNew, edge }) => {
+      if (!isNew) return
+
+      let target = edge.getTargetCell()
+
+      if (!target) return
+
+      let mkdata = target.prop('mkdata')
+
+      if (target.prop('mknode') === 'end') {
+        edge.prop('mknode', 'endEdge')
+      } else if (target.prop('mknode') === 'start') {
+        edge.prop('mknode', 'startEdge')
+      }
+      if (mkdata) {
+        edge.prop('mkdata', {status: mkdata.status, statusName: mkdata.statusName})
+      }
+    })
     
     const r1 = graph.createNode({
       shape: 'mk-rect',
-      label: '寮�濮�',
+      mknode: 'start',
+      mkdata: {status: 0, statusName: '鏈彁浜�'},
       attrs: {
         body: {
           rx: 20,
-          ry: 26
+          ry: 26,
+          fill: '#52c41a',
+          stroke: '#52c41a'
+        },
+        text: {
+          fill: '#ffffff',
+          text: '寮�濮�'
         }
       }
     })
     const r2 = graph.createNode({
       shape: 'mk-rect',
-      label: '杩囩▼'
+      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
+          ry: 6,
+          fill: '#fff7e6',
+          stroke: '#fa8c16'
+        },
+        text: {
+          text: '鍙�夎繃绋�'
         }
-      },
-      label: '鍙�夎繃绋�'
+      }
     })
     const r4 = graph.createNode({
+      shape: 'mk-rect',
+      attrs: {
+        body: {
+          rx: 0,
+          ry: 0,
+          fill: '#fff7e6',
+          stroke: '#fa8c16'
+        },
+        text: {
+          text: '鑺傜偣'
+        }
+      }
+    })
+    const r5 = graph.createNode({
       shape: 'mk-polygon',
       attrs: {
         body: {
-          refPoints: '0,10 10,0 20,10 10,20'
+          refPoints: '0,10 10,0 20,10 10,20',
+          fill: '#f9f0ff',
+          stroke: '#722ed1'
+        },
+        text: {
+          text: '鍐崇瓥'
         }
-      },
-      label: '鍐崇瓥'
+      }
     })
-    const r5 = graph.createNode({
+    const r6 = graph.createNode({
       shape: 'mk-paral',
       attrs: {
         body: {
-          refPoints: '10,0 40,0 30,20 0,20'
+          refPoints: '10,0 40,0 30,20 0,20',
+          fill: '#e6fffb',
+          stroke: '#13c2c2'
+        },
+        text: {
+          text: '鏁版嵁'
         }
-      },
-      label: '鏁版嵁'
+      }
     })
-    const r6 = graph.createNode({
+    const r7 = graph.createNode({
       shape: 'mk-circle',
-      label: '杩炴帴'
+      attrs: {
+        body: {
+          fill: '#e6f4ff',
+          stroke: '#1890ff'
+        },
+        text: {
+          text: '杩炴帴'
+        }
+      }
+    })
+
+    const r8 = graph.createNode({
+      shape: 'mk-rect',
+      mknode: 'end',
+      mkdata: {status: 888, statusName: '宸插畬鎴�'},
+      attrs: {
+        body: {
+          rx: 20,
+          ry: 26,
+          fill: '#fa8c16',
+          stroke: '#fa8c16'
+        },
+        text: {
+          fill: '#ffffff',
+          text: '缁撴潫'
+        }
+      }
     })
     
-    stencil.load([r1, r2, r3, r4, r5, r6], 'group1')
+    stencil.load([r1, r2, r3, r4, r5, r6, r7, r8], 'group1')
     
     const p1 = graph.createNode({
       shape: 'mk-ellipse',
@@ -1351,7 +1545,7 @@
   }
 
   save = () => {
-    const { BID } = this.state
+    const { BID, plot, status, flowname, flowcode } = this.state
 
     if (!BID) {
       Modal.error({
@@ -1360,38 +1554,100 @@
       return
     }
 
+    let nodes = this.mkGraph.toJSON()
+    let _status = status
+
+    if (plot.subtype === 'xflow' && status === 10) {
+      let start_num = 0
+      let end_num = 0
+      let unvalid = false
+      
+      nodes.cells.forEach(item => {
+        if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
+          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+            unvalid = true
+          }
+        }
+
+      })
+      if (start_num !== 1 || end_num !== 1 || unvalid) {
+        _status = 0
+      }
+    }
+
     this.setState({
       loading: true
     })
 
-    let nodes = this.mkGraph.toJSON()
     this.mkGraph.toPNG((dataUri) => {
       let param = {
         func: 's_works_flow_param_upt_v6',
         long_param: window.btoa(window.encodeURIComponent(JSON.stringify(nodes))),
         flow_image: dataUri,
+        status: status,
         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
-          })
+          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
+                })
+              } 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
+            })
+          }
         } else {
           notification.error({
             top: 92,
             message: res.message,
             duration: 10
           })
+          this.setState({
+            loading: false
+          })
         }
-      
-        this.setState({
-          loading: false
-        })
       })
     }, {padding: 20})
   }
@@ -1590,6 +1846,8 @@
         } else {
           this.selectNode.attr('line/strokeDasharray', 0)
         }
+      } else if (key === 'mkdata') {
+        this.selectNode.prop('mkdata', value)
       }
     } else if (node.shape === 'lane') {
       if (key === 'title') {
@@ -1638,8 +1896,8 @@
         this.selectNode.attr('text/fontSize', value)
       } else if (key === 'fontFill') {
         this.selectNode.attr('text/fill', value)
-      } else if (key === 'mksign') {
-        this.selectNode.prop('mksign', value)
+      } else if (key === 'mkdata') {
+        this.selectNode.prop('mkdata', value)
       }
     }
   }
@@ -1702,22 +1960,98 @@
       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, {})
+    }
+  }
+
+  changeStatus = () => {
+    const { plot, status } = this.state
+
+    let _status = status === 10 ? 0 : 10
+    
+    if (plot.subtype === 'xflow' && _status === 10) {
+      let nodes = this.mkGraph.toJSON()
+
+      let start_num = 0
+      let end_num = 0
+      let unvalidId = ''
+      
+      nodes.cells.forEach(item => {
+        if (item.mknode === 'start') {
+          start_num++
+        } else if (item.mknode === 'end') {
+          end_num++
+        } else if (item.shape === 'edge' && item.mknode !== 'endEdge' && item.mknode !== 'startEdge') {
+          if (!item.mkdata.members || item.mkdata.members.length === 0) {
+            unvalidId = item.id
+          }
+        }
+      })
+
+      if (start_num === 0) {
+        notification.warning({
+          top: 92,
+          message: '璇锋坊鍔犲紑濮嬭妭鐐癸紒',
+          duration: 2
+        })
+      } else if (start_num > 1) {
+        notification.warning({
+          top: 92,
+          message: '寮�濮嬭妭鐐逛笉鍙坊鍔犲涓紒',
+          duration: 2
+        })
+      } else if (end_num === 0) {
+        notification.warning({
+          top: 92,
+          message: '璇锋坊鍔犵粨鏉熻妭鐐癸紒',
+          duration: 2
+        })
+      } else if (end_num > 1) {
+        notification.warning({
+          top: 92,
+          message: '缁撴潫鑺傜偣涓嶅彲娣诲姞澶氫釜锛�',
+          duration: 2
+        })
+      } else if (unvalidId) {
+        let edge = this.mkGraph.getCellById(unvalidId)
+
+        let node = edge.getTargetCell()
+
+        let title = ''
+        if (node.attrs && node.attrs.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 {
+        this.setState({status: _status})
+      }
+    } else {
+      this.setState({status: _status})
     }
   }
 
@@ -1736,7 +2070,7 @@
   }
 
   render() {
-    const { loading, config, node, rolelist } = this.state
+    const { loading, config, node, orgs, status, flowname } = this.state
 
     let style = {...config.style}
 
@@ -1802,9 +2136,13 @@
               <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 onClick={this.save}/>
+              <SaveOutlined style={{marginRight: '10px'}} onClick={this.save}/>
             </Tooltip>
           </div>
         </div>
@@ -1813,7 +2151,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} rolelist={rolelist} onChange={this.changeProps}/>}
+            {!node ? <div className="empty">鏈�変腑</div> : <NodeUpdate node={node} orgs={orgs} onChange={this.changeProps}/>}
           </div>
         </div>
       </div>

--
Gitblit v1.8.0