From f3d4db769ba9b51b799d981511a710fd443d0e08 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期一, 21 四月 2025 12:18:03 +0800
Subject: [PATCH] Merge branch 'master' into positec

---
 src/menu/tablenodes/index.jsx |  548 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 514 insertions(+), 34 deletions(-)

diff --git a/src/menu/tablenodes/index.jsx b/src/menu/tablenodes/index.jsx
index 10b38e2..4174e4d 100644
--- a/src/menu/tablenodes/index.jsx
+++ b/src/menu/tablenodes/index.jsx
@@ -1,14 +1,15 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import { is, fromJS } from 'immutable'
-import { Modal, Button, notification, Spin } from 'antd'
+import { Modal, Button, notification, Spin, Input, message } from 'antd'
 import { ForkOutlined } from '@ant-design/icons'
 
 import Api from '@/api'
 import G6 from "@antv/g6"
 import Utils from '@/utils/utils.js'
-import MKEmitter from '@/utils/events.js'
 import './index.scss'
+
+const { Search } = Input
 
 class TableNodes extends Component {
   static propTpyes = {
@@ -18,6 +19,7 @@
   state = {
     visible: false,
     loading: false,
+    nodes: null,
     empty: false
   }
 
@@ -53,13 +55,351 @@
       })
     }
 
-    traversal(config.components)
+    if (config.Template === 'BaseTable') {
+      config.components.forEach(item => {
+        if (item.type === 'tabs') {
+          item.subtabs.forEach(tab => {
+            if (tab.components[0].$tables) {
+              ptbs.push(...tab.components[0].$tables)
+              tab.components[0].$tables.forEach(tb => {
+                tbs.push({
+                  label: tab.label,
+                  table: tb,
+                  color: '#5AD8A6',
+                  id: Utils.getuuid(),
+                  direction: 'left'
+                })
+              })
+            }
+          })
+        } else if (item.$tables) {
+          ptbs.push(...item.$tables)
+          item.$tables.forEach(tb => {
+            tbs.push({
+              label: '涓昏〃',
+              table: tb,
+              color: '#5AD8A6',
+              id: Utils.getuuid(),
+              direction: 'left'
+            })
+          })
+        }
+      })
+    } else {
+      traversal(config.components)
+
+      if (config.interfaces) {
+        config.interfaces.forEach(item => {
+          if (item.$tables) {
+            ptbs.push(...item.$tables)
+            item.$tables.forEach(tb => {
+              tbs.push({
+                label: item.name,
+                table: tb,
+                color: '#5AD8A6',
+                id: Utils.getuuid(),
+                direction: 'left'
+              })
+            })
+          }
+        })
+      }
+    }
 
     return {tbs, ptbs}
   }
 
+  getFuncAndInterface = (config) => {
+    let ptbs = []
+
+    let filterBtn = (cell, tbs) => {
+      if (cell.intertype === 'inner') {
+        tbs.push({
+          label: cell.innerFunc + ' (' + cell.label + ')',
+          color: 'orange',
+          id: Utils.getuuid(),
+          direction: 'left'
+        })
+      } else if (cell.intertype === 'outer' || cell.intertype === 'custom') {
+        if (cell.innerFunc) {
+          tbs.push({
+            label: cell.innerFunc + ' (' + cell.label + ')',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (cell.outerFunc) {
+          tbs.push({
+            label: cell.outerFunc + ' (' + cell.label + ')',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (cell.interface && cell.sysInterface !== 'true') {
+          tbs.push({
+            label: cell.interface + ' (' + cell.label + ')',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (cell.proInterface) {
+          tbs.push({
+            label: cell.proInterface + ' (' + cell.label + ')',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (cell.exInterface) {
+          let url = ''
+
+          try {
+            url = JSON.parse(cell.exInterface).url
+          } catch(e) {
+            url = ''
+          }
+
+          if (url) {
+            tbs.push({
+              label: url + ' (' + cell.label + ')',
+              color: 'orange',
+              id: Utils.getuuid(),
+              direction: 'left'
+            })
+          }
+        }
+        if (cell.exProInterface) {
+          let url = ''
+
+          try {
+            url = JSON.parse(cell.exProInterface).url
+          } catch(e) {
+            url = ''
+          }
+
+          if (url) {
+            tbs.push({
+              label: url + ' (' + cell.label + ')',
+              color: 'orange',
+              id: Utils.getuuid(),
+              direction: 'left'
+            })
+          }
+        }
+        if (cell.callbackFunc) {
+          tbs.push({
+            label: cell.callbackFunc + ' (' + cell.label + ')',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+      }
+    }
+
+    let filterSetting = (item, tbs) => {
+      if (!item.setting) return
+      if (item.setting.interType === 'inner') {
+        tbs.push({
+          label: item.setting.innerFunc + ' (鏁版嵁婧�)',
+          color: 'orange',
+          id: Utils.getuuid(),
+          direction: 'left'
+        })
+      } else if (item.setting.interType === 'outer') {
+        if (item.setting.outerFunc) {
+          tbs.push({
+            label: item.setting.outerFunc + ' (鏁版嵁婧�)',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (item.setting.interface && item.setting.sysInterface !== 'true') {
+          tbs.push({
+            label: item.setting.interface + ' (鏁版嵁婧�)',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (item.setting.proInterface) {
+          tbs.push({
+            label: item.setting.proInterface + ' (鏁版嵁婧�)',
+            color: 'orange',
+            id: Utils.getuuid(),
+            direction: 'left'
+          })
+        }
+        if (item.setting.exInterface) {
+          let url = ''
+
+          try {
+            url = JSON.parse(item.setting.exInterface).url
+          } catch(e) {
+            url = ''
+          }
+
+          if (url) {
+            tbs.push({
+              label: url + ' (鏁版嵁婧�)',
+              color: 'orange',
+              id: Utils.getuuid(),
+              direction: 'left'
+            })
+          }
+        }
+        if (item.setting.exProInterface) {
+          let url = ''
+
+          try {
+            url = JSON.parse(item.setting.exProInterface).url
+          } catch(e) {
+            url = ''
+          }
+
+          if (url) {
+            tbs.push({
+              label: url + ' (鏁版嵁婧�)',
+              color: 'orange',
+              id: Utils.getuuid(),
+              direction: 'left'
+            })
+          }
+        }
+      }
+    }
+
+    let traversal = (components, extra) => {
+      components.forEach(item => {
+        if (item.type === 'tabs') {
+          item.subtabs.forEach(tab => {
+            traversal(tab.components, extra)
+          })
+        } else if (item.type === 'group') {
+          traversal(item.components, extra)
+        } else {
+          let tbs = []
+
+          filterSetting(item, tbs)
+
+          if (item.action) {
+            item.action.forEach(cell => {
+              if (cell.OpenType === 'popview') {
+                if (cell.config.components) {
+                  traversal(cell.config.components, `-${cell.label}(寮圭獥)`)
+                }
+              } else {
+                filterBtn(cell, tbs)
+              }
+            })
+          }
+
+          if (item.type === 'card' || item.type === 'carousel' || item.type === 'timeline') {
+            item.subcards.forEach(card => {
+              card.elements && card.elements.forEach(cell => {
+                if (cell.eleType !== 'button') return
+                
+                if (cell.OpenType === 'popview') {
+                  if (cell.config.components) {
+                    traversal(cell.config.components, `-${cell.label}(寮圭獥)`)
+                  }
+                } else {
+                  filterBtn(cell, tbs)
+                }
+              })
+              card.backElements && card.backElements.forEach(cell => {
+                if (cell.eleType !== 'button') return
+                
+                if (cell.OpenType === 'popview') {
+                  if (cell.config.components) {
+                    traversal(cell.config.components, `-${cell.label}(寮圭獥)`)
+                  }
+                } else {
+                  filterBtn(cell, tbs)
+                }
+              })
+            })
+          } else if (item.type === 'balcony') {
+            item.elements && item.elements.forEach(cell => {
+              if (cell.eleType !== 'button') return
+              
+              if (cell.OpenType === 'popview') {
+                if (cell.config.components) {
+                  traversal(cell.config.components, `-${cell.label}(寮圭獥)`)
+                }
+              } else {
+                filterBtn(cell, tbs)
+              }
+            })
+          } else if (item.type === 'table') {
+            let loopCol = (cols) => {
+              cols.forEach(col => {
+                if (col.type === 'colspan') {
+                  loopCol(col.subcols)
+                } else if (col.type === 'custom') {
+                  col.elements.forEach(cell => {
+                    if (cell.eleType !== 'button') return
+                    
+                    if (cell.OpenType === 'popview') {
+                      if (cell.config.components) {
+                        traversal(cell.config.components, `-${cell.label}(寮圭獥)`)
+                      }
+                    } else {
+                      filterBtn(cell, tbs)
+                    }
+                  })
+                }
+              })
+            }
+            loopCol(item.cols)
+          } else if (item.type === 'form') {
+            item.subcards.forEach(group => {
+              filterBtn(group.subButton, tbs)
+            })
+          }
+          
+          if (tbs.length) {
+            ptbs.push({
+              label: item.name + extra,
+              id: Utils.getuuid(),
+              direction: 'left',
+              color: 'orange',
+              children: tbs
+            })
+          }
+        }
+      })
+    }
+
+    if (config.interfaces) {
+      config.interfaces.forEach(item => {
+        let tbs = []
+        filterSetting(item, tbs)
+        if (tbs.length) {
+          ptbs.push({
+            label: item.name,
+            id: Utils.getuuid(),
+            direction: 'left',
+            color: 'orange',
+            children: tbs
+          })
+        }
+      })
+    }
+
+    traversal(config.components, '')
+
+    return ptbs
+  }
+
   trigger = () => {
     const { config } = this.props
+
+    if (!config) return
 
     this.setState({visible: true, loading: true, empty: false}, () => {
       let param = {
@@ -69,7 +409,7 @@
         MenuID: config.uuid
       }
 
-      Api.getSystemConfig(param).then(result => {
+      Api.getCloudConfig(param).then(result => {
         if (!result.status) {
           notification.warning({
             top: 92,
@@ -105,6 +445,7 @@
               id: 'par' + i,
               direction: 'left',
               color: '#5AD8A6',
+              node: 'table',
               children: []
             }
 
@@ -118,14 +459,56 @@
           })
         }
 
-        if (ptbs.length) {
-          ptbs.forEach((item, i) => {
+        let funcs = this.getFuncAndInterface(config)
+
+        if (funcs.length) {
+          data.children.push(...funcs)
+        }
+
+        if (result.tb_list) {
+          result.tb_list.sort((a, b) => a.tbname > b.tbname ? 1 : -1)
+          let length = result.tb_list.length
+          result.tb_list.forEach((item, i) => {
             let cell = {
-              label: item,
-              id: 'menu' + i,
+              label: item.tbname,
+              name: item.tbname.toLowerCase(),
+              id: 'table' + i,
               direction: 'right',
               color: '#1890ff',
-              // children: []
+              collapsed: false,
+              collable: true,
+              children: []
+            }
+
+            if (item[item.tbname]) {
+              item[item.tbname].forEach((m, i) => {
+                if (m.debug_url) {
+                  let _param = JSON.parse(window.decodeURIComponent(window.atob(m.debug_url)))
+                  let label = _param.MenuName
+                  _param.lang = _param.lang || 'zh-CN'
+
+                  if (_param && _param.type === 'app') {
+                    label += ` (${_param.kei_no} | ${_param.typename}${_param.lang !== 'zh-CN' ? ' | ' + _param.lang : ''})`
+                  } else if (_param && _param.lang && _param.lang !== 'zh-CN') {
+                    label += ` (${_param.lang})`
+                  }
+
+                  cell.children.push({
+                    label: label,
+                    id: item.tbname + 'menu' + i,
+                    direction: 'right',
+                    color: '#1890ff',
+                    type: 'dice-mind-map-leaf',
+                    param: _param
+                  })
+                }
+              })
+            }
+
+            if (cell.children.length > 5 && length > 1) {
+              cell.collapsed = true
+            } else if (cell.children.length === 0) {
+              cell.collable = false
             }
 
             data.children.push(cell)
@@ -135,7 +518,7 @@
         if (data.children.length === 0) {
           this.setState({empty: true, loading: false})
         } else {
-          this.setState({loading: false})
+          this.setState({loading: false, nodes: data})
           this.getForks(data)
         }
       })
@@ -143,9 +526,63 @@
   }
 
   changeMenu = (menu) => {
-    if (menu.depth === 0) return
+    if (menu.direction !== 'right') return
 
-    MKEmitter.emit('changeEditMenu', menu)
+    if (menu.depth === 1) {
+      sessionStorage.setItem('mk-table-node', menu.label)
+      window.open('#/hs')
+
+      setTimeout(() => {
+        sessionStorage.removeItem('mk-table-node')
+      }, 50)
+    } else if (menu.param) {
+      if (menu.param.type === 'admin') {
+        if (['custom', 'home', 'billPrint'].includes(menu.param.MenuType)) {
+          let _param = {...menu.param}
+          delete _param.type
+          _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
+          window.open(`#/menudesign/${_param}`)
+        } else if (menu.param.MenuType === 'BaseTable') {
+          let _param = {...menu.param}
+          delete _param.type
+          delete _param.MenuType
+          _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
+          window.open(`#/tabledesign/${_param}`)
+        }
+      } else if (menu.param.type === 'app') {
+        if (menu.param.typename !== 'pc') {
+          let _param = {...menu.param}
+          _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
+          window.open(`#/mobdesign/${_param}`)
+        } else {
+          let _param = {...menu.param}
+          _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
+          window.open(`#/pcdesign/${_param}`)
+        }
+      }
+    }
+  }
+
+  resetNodes = (key) => {
+    let data = fromJS(this.state.nodes).toJS()
+    key = key ? key.toLowerCase() : ''
+
+    data.children.forEach(cell => {
+      if (cell.direction === 'right') {
+        cell.fontcolor = ''
+        if (key && cell.name.indexOf(key) > -1) {
+          cell.fontcolor = 'orange'
+        }
+      }
+    })
+    let _element = document.getElementById('mkTableNode')
+    if (_element) {
+      _element.innerHTML = ''
+    }
+
+    this.setState({}, () => {
+      this.getForks(data)
+    })
   }
 
   getForks = (data) => {
@@ -159,12 +596,12 @@
           const stroke = cfg.style.stroke || '#096dd9';
     
           return `
-          <group>
-            <rect draggable="true" style={{width: ${width}, height: 30, stroke: ${stroke}, radius: 4}} keyshape>
-              <text style={{ fontSize: 14, marginLeft: 6, marginTop: 6 }}>${cfg.label}</text>
-            </rect>
-          </group>
-        `;
+            <group>
+              <rect draggable="true" style={{width: ${width}, height: 30, stroke: ${stroke}, radius: 4}} keyshape>
+                <text style={{ fontSize: 14, marginLeft: 6, marginTop: 6 }}>${cfg.label}</text>
+              </rect>
+            </group>
+          `;
         },
         getAnchorPoints() {
           return [
@@ -183,13 +620,13 @@
           const color = cfg.color;
     
           return `
-          <group>
-            <rect draggable="true" style={{width: ${width}, height: 26, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, fill: 'transparent' }}>
-              <text style={{ fontSize: 12, fill: black, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, marginLeft: 12, marginTop: 6 }}>${cfg.label}</text>
-            </rect>
-            <rect style={{ fill: ${color}, width: ${width}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, height: 2, x: 0, y: 32 }} />
-          </group>
-        `;
+            <group>
+              <rect draggable="true" style={{width: ${width}, height: 26, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, fill: 'transparent' }}>
+                <text style={{ fontSize: 12, fill: ${cfg.fontcolor ? cfg.fontcolor : 'black'}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, marginLeft: 12, marginTop: 6 }}>${cfg.label} ${cfg.collable ? '+' : ''}</text>
+              </rect>
+              <rect style={{ fill: ${color}, width: ${width}, cursor: ${cfg.direction !== 'left' ? 'pointer' : 'default'}, height: 2, x: 0, y: 32 }} />
+            </group>
+          `;
         },
         getAnchorPoints() {
           return [
@@ -209,6 +646,35 @@
       editNode(evt) {
         const item = evt.item;
         const model = item.get('model');
+
+        // 閫変腑鑺傜偣
+        this.graph.getNodes().forEach(node => {
+          let _model = node.get('model')
+          if (_model.fontcolor === '#1890ff') {
+            _model.fontcolor = ''
+            this.graph.updateItem(node, _model, false)
+          }
+        })
+
+        if (model.direction === 'left') {
+          if (model.node === 'table') {
+            model.fontcolor = '#1890ff'
+            this.graph.updateItem(item, model, false)
+
+            let oInput = document.createElement('input')
+            oInput.value = model.label
+            document.body.appendChild(oInput)
+            oInput.select()
+            document.execCommand('Copy')
+            document.body.removeChild(oInput)
+            
+            message.success('琛ㄥ悕澶嶅埗鎴愬姛銆�')
+          }
+          return
+        }
+
+        model.fontcolor = '#1890ff'
+        this.graph.updateItem(item, model, false)
         
         that.changeMenu(model)
       }
@@ -269,7 +735,7 @@
           data.color = color;
         }
     
-        if (d.children) {
+        if (d.children && !d.collapsed) {
           data.children = d.children.map((child) => changeData(child, level + 1, data.color));
         }
         return data;
@@ -278,7 +744,7 @@
     };
 
     const tree = new G6.TreeGraph({
-      container: 'mountNode',
+      container: 'mkTableNode',
       width: this.wrap.offsetWidth,
       height: this.wrap.offsetHeight,
       fitView: true,
@@ -310,9 +776,21 @@
           lineWidth: 2,
         },
       },
-      minZoom: 0.5,
+      minZoom: 0.3,
       modes: {
-        default: ['drag-canvas', 'zoom-canvas', 'dice-mindmap'],
+        default: [
+          {
+            type: 'collapse-expand',
+            trigger: 'click',
+            shouldBegin: (e, self) => {
+              if (e.item && e.item.getModel().collable) return true;
+              return false;
+            },
+          },
+          'drag-canvas',
+          'zoom-canvas',
+          'dice-mindmap'
+        ],
       },
     });
     
@@ -325,7 +803,7 @@
     const { visible, loading, empty } = this.state
 
     return (
-      <div style={{display: 'inline-block'}}>
+      <>
         <Button style={{borderColor: '#8E44AD', color: '#8E44AD'}} onClick={this.trigger}><ForkOutlined /> 琛ㄥ叧绯诲浘</Button>
         <Modal
           title=""
@@ -337,17 +815,19 @@
           footer={[]}
           destroyOnClose
         >
-          <div className="header">椤甸潰鍏崇郴鍥�</div>
+          <div className="header">琛ㄥ叧绯诲浘</div>
+          <Search className="tb-search" placeholder="璇疯緭鍏ヨ〃鍚�" onSearch={value => this.resetNodes(value)} enterButton />
           <div className="wrap">
             {loading ? <Spin size="large" /> : null}
-            {empty ? <div className="empty">鏈煡璇㈠埌椤甸潰鍏宠仈鑿滃崟銆�</div> : null}
-            <div className="mountNode" id="mountNode" ref={ref => this.wrap = ref}></div>
+            {empty ? <div className="empty">鏈煡璇㈠埌琛ㄥ悕淇℃伅銆�</div> : null}
+            <div className="mountNode" id="mkTableNode" ref={ref => this.wrap = ref}></div>
           </div>
           <div className="footer">
             <Button key="cancel" onClick={() => { this.setState({ visible: false })}}>鍏抽棴</Button>
+            <span className="tip">娉細鐐瑰嚮琛ㄥ悕锛堝彸渚э級鍙睍寮�/鏀惰捣鑿滃崟锛屽乏渚ф鑹叉爣娉ㄤ负鎺ュ彛鎴栧嚱鏁板悕銆�</span>
           </div>
         </Modal>
-      </div>
+      </>
     )
   }
 }

--
Gitblit v1.8.0