From c14ad8237b10d9e24ad3101e706e90c4366636c0 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 05 十月 2022 23:28:09 +0800
Subject: [PATCH] 2022-10-05

---
 public/options.json                                      |   10 
 src/menu/tablenodes/index.jsx                            |   18 ++
 src/tabviews/debugtable/index.jsx                        |   94 +++++++++++++++
 src/views/appmanage/index.jsx                            |    3 
 src/menu/components/card/cardcellcomponent/index.jsx     |   13 --
 src/views/pcdesign/index.jsx                             |   68 +++++++++-
 src/menu/components/share/actioncomponent/formconfig.jsx |   14 ++
 src/tabviews/debugtable/index.scss                       |    4 
 src/views/imdesign/index.jsx                             |    3 
 src/views/mobdesign/index.jsx                            |   68 +++++++++-
 src/views/menudesign/index.jsx                           |    2 
 src/menu/components/share/actioncomponent/index.jsx      |   13 --
 12 files changed, 253 insertions(+), 57 deletions(-)

diff --git a/public/options.json b/public/options.json
index 32085f0..ea0061e 100644
--- a/public/options.json
+++ b/public/options.json
@@ -1,12 +1,12 @@
 {
-  "appId": "202108312122504607B107A83F55B40C98CCF",
-  "appkey": "20210831212235413F287EC3BF489424496C8",
+  "appId": "201912040924165801464FF1788654BC5AC73",
+  "appkey": "20191106103859640976D6E924E464D029CF0",
   "mainSystemApi": "http://sso.mk9h.cn/cloud/webapi/dostars",
   "systemType": "",
   "externalDatabase": "false",
   "lineColor": "",
   "filter": "false",
-  "defaultApp": "mkindustry",
+  "defaultApp": "mk",
   "defaultLang": "zh-CN",
   "WXAppID": "",
   "WXminiAppID": "",
@@ -17,6 +17,6 @@
   "transfer": "false",
   "keepPassword": "true",
   "platforms": ["H5", "wechat", "android", "ios", "wxMiniProgram"],
-  "host": "http://demo.mk9h.cn",
-  "service": "erp_new/"
+  "host": "http://qingqiumarket.cn",
+  "service": "MKWMS/"
 }
\ No newline at end of file
diff --git a/src/menu/components/card/cardcellcomponent/index.jsx b/src/menu/components/card/cardcellcomponent/index.jsx
index 4d67454..c00048b 100644
--- a/src/menu/components/card/cardcellcomponent/index.jsx
+++ b/src/menu/components/card/cardcellcomponent/index.jsx
@@ -297,17 +297,6 @@
       <p style={{marginBottom: '5px'}}>{this.state.dict['model.tooltip.func.innerface'].replace('@ableField', ableField)}</p>
     </div>
 
-    let menulist = sessionStorage.getItem('fstMenuList')
-    if (menulist) {
-      try {
-        menulist = JSON.parse(menulist)
-      } catch (e) {
-        menulist = []
-      }
-    } else {
-      menulist = []
-    }
-
     let supId = ''
     if (cards.setting && cards.setting.supModule) {
       let pid = cards.setting.supModule[cards.setting.supModule.length - 1]
@@ -324,7 +313,7 @@
     this.setState({
       actvisible: true,
       card: card,
-      formlist: getActionForm(card, functip, cards, usefulFields, menulist, modules, anchors)
+      formlist: getActionForm(card, functip, cards, usefulFields, modules, anchors)
     })
   }
 
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 970a91a..a8f146a 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -12,7 +12,7 @@
  * @param {*} usefulFields   瀛樺偍杩囩▼鍙敤鐨勫紑濮嬪瓧娈�
  * @param {*} type           鎸夐挳绫诲瀷锛岀敤浜庡尯鍒嗗彲閫夌殑鎵撳紑鏂瑰紡
  */
-export function getActionForm (card, functip, config, usefulFields, menulist = [], modules = [], anchors = []) {
+export function getActionForm (card, functip, config, usefulFields, modules = [], anchors = []) {
   let appType = sessionStorage.getItem('appType')
   let viewType = sessionStorage.getItem('editMenuType') // 寮圭獥 popview
   let printTemps = sessionStorage.getItem('printTemps')
@@ -20,6 +20,7 @@
   let setting = config.setting || {}
   let columns = config.columns || []
   let appMenus = []
+  let menulist = []
   let type = ''
 
   if (card.eleType === 'button') {
@@ -115,6 +116,17 @@
     } else {
       appMenus = []
     }
+  } else {
+    menulist = sessionStorage.getItem('fstMenuList')
+    if (menulist) {
+      try {
+        menulist = JSON.parse(menulist)
+      } catch (e) {
+        menulist = []
+      }
+    } else {
+      menulist = []
+    }
   }
   if (appType === 'mob') {
     opentypes = opentypes.filter(item => ['pop', 'prompt', 'exec', 'innerpage', 'funcbutton'].includes(item.value))
diff --git a/src/menu/components/share/actioncomponent/index.jsx b/src/menu/components/share/actioncomponent/index.jsx
index 82785e7..d7b3e7d 100644
--- a/src/menu/components/share/actioncomponent/index.jsx
+++ b/src/menu/components/share/actioncomponent/index.jsx
@@ -171,17 +171,6 @@
       functip = ''
     }
 
-    let menulist = sessionStorage.getItem('fstMenuList')
-    if (menulist) {
-      try {
-        menulist = JSON.parse(menulist)
-      } catch (e) {
-        menulist = []
-      }
-    } else {
-      menulist = []
-    }
-
     let supId = ''
     if (config.setting && config.setting.supModule) {
       let pid = config.setting.supModule[config.setting.supModule.length - 1]
@@ -198,7 +187,7 @@
     this.setState({
       visible: true,
       card: card,
-      formlist: getActionForm(card, functip, config, usefulFields, menulist, modules, anchors)
+      formlist: getActionForm(card, functip, config, usefulFields, modules, anchors)
     })
   }
 
diff --git a/src/menu/tablenodes/index.jsx b/src/menu/tablenodes/index.jsx
index 0610c01..8f31c88 100644
--- a/src/menu/tablenodes/index.jsx
+++ b/src/menu/tablenodes/index.jsx
@@ -138,8 +138,14 @@
               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
+
+                  if (_param && _param.type === 'app') {
+                    label += ` (${_param.kei_no} | ${_param.typename}${param.lang !== 'zh-CN' ? ' | ' + param.lang : ''})`
+                  }
+
                   cell.children.push({
-                    label: _param.MenuName,
+                    label: label,
                     id: item.tbname + 'menu' + i,
                     direction: 'right',
                     color: '#1890ff',
@@ -176,6 +182,16 @@
           _param = window.btoa(window.encodeURIComponent(JSON.stringify(_param)))
           window.open(`#/menudesign/${_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}`)
+        }
       }
     }
   }
diff --git a/src/tabviews/debugtable/index.jsx b/src/tabviews/debugtable/index.jsx
new file mode 100644
index 0000000..8e6d5c1
--- /dev/null
+++ b/src/tabviews/debugtable/index.jsx
@@ -0,0 +1,94 @@
+import React, {Component} from 'react'
+import { is, fromJS } from 'immutable'
+import { notification, Table} from 'antd'
+
+import Api from '@/api'
+import UtilsDM from '@/utils/utils-datamanage.js'
+
+import './index.scss'
+
+class DebugTable extends Component {
+  state = {
+    columns: null,        // 鏄剧ず鍒�
+    data: [],             // 鍒楄〃鏁版嵁闆�
+    loading: false,       // 鍒楄〃鏁版嵁鍔犺浇涓�
+    setting: {
+      interType: 'system',
+      execute: true,
+      dataresource: 'select * from s_debug_value_log where createuserid=@userid@'
+    },
+    arr_field: 'ID,Sort,CDefine1,CDefine2,CDefine3,CDefine4,CDefine5,CDefine6,CDefine7,'
+  }
+
+  /**
+   * @description 瀛愯〃鏁版嵁鍔犺浇
+   */
+  async loadmaindata () {
+    const { setting, arr_field } = this.state
+
+    this.setState({
+      loading: true
+    })
+
+    let _orderBy = 'sort'
+    let param = UtilsDM.getQueryDataParams(setting, arr_field, [], _orderBy, 1, 9999, '')
+
+    let result = await Api.genericInterface(param)
+
+    if (result.status) {
+      let start = 1
+
+      this.setState({
+        data: result.data.map((item, index) => {
+          item.key = index
+          item.$$uuid = item.ID || ''
+          item.$$key = '' + item.key + item.$$uuid
+          item.$Index = start + index + ''
+
+          return item
+        }),
+        loading: false
+      })
+    } else {
+      this.setState({
+        loading: false
+      })
+
+      notification.error({
+        top: 92,
+        message: result.message,
+        duration: 10
+      })
+    }
+  }
+
+  UNSAFE_componentWillMount() {
+    // 缁勪欢鍔犺浇鏃讹紝鑾峰彇鑿滃崟鏁版嵁
+    this.loadmaindata()
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return !is(fromJS(this.state), fromJS(nextState))
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+  }
+
+  render() {
+    const { data, loading, columns } = this.state
+
+    return (
+      <div className="debugtable">
+        <Table size="middle" columns={columns} dataSource={data} loading={loading} scroll={{ x: '100%', y: false }}/>
+      </div>
+    )
+  }
+}
+
+export default DebugTable
\ No newline at end of file
diff --git a/src/tabviews/debugtable/index.scss b/src/tabviews/debugtable/index.scss
new file mode 100644
index 0000000..7608d90
--- /dev/null
+++ b/src/tabviews/debugtable/index.scss
@@ -0,0 +1,4 @@
+.debugtable {
+  position: relative;
+  min-height: 200px;
+}
diff --git a/src/views/appmanage/index.jsx b/src/views/appmanage/index.jsx
index 931230a..a3512bd 100644
--- a/src/views/appmanage/index.jsx
+++ b/src/views/appmanage/index.jsx
@@ -709,8 +709,9 @@
     if (item.typename === 'pc') {
       route = 'pcdesign'
     }
+    let param = {...item, kei_no: selectApp.kei_no, remark: selectApp.remark, type: 'app'}
 
-    window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify({...item, kei_no: selectApp.kei_no, remark: selectApp.remark, type: 'app'})))}`))
+    window.open(window.location.href.replace(/#.+/ig, `#/${route}/${window.btoa(window.encodeURIComponent(JSON.stringify(param)))}`))
   }
 
   jumpMenu = (item) => {
diff --git a/src/views/imdesign/index.jsx b/src/views/imdesign/index.jsx
index 15ee914..3092a93 100644
--- a/src/views/imdesign/index.jsx
+++ b/src/views/imdesign/index.jsx
@@ -55,10 +55,9 @@
 
       if (param.type === 'app') {
         sessionStorage.setItem('appId', param.ID || '')
+        sessionStorage.setItem('appName', param.remark || '')
         sessionStorage.setItem('lang', param.lang || 'zh-CN')
         sessionStorage.setItem('kei_no', param.kei_no || '')
-        sessionStorage.setItem('role_type', param.role_type || 'true')
-        sessionStorage.setItem('login_types', param.login_types || 'false')
         sessionStorage.setItem('typename', param.typename || 'mob')
         sessionStorage.setItem('adapter', param.adapter || '')
         sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
diff --git a/src/views/menudesign/index.jsx b/src/views/menudesign/index.jsx
index 536a66e..357f02f 100644
--- a/src/views/menudesign/index.jsx
+++ b/src/views/menudesign/index.jsx
@@ -639,7 +639,7 @@
       }
       tbs = tbs.map(tb => `'${tb}'`).join(';')
 
-      let key = md5(config.uuid + window.GLOB.appkey + tbs.toLowerCase())
+      let key = md5(config.uuid + tbs.toLowerCase())
       let url = ''
 
       if (config.tbkey === key) {
diff --git a/src/views/mobdesign/index.jsx b/src/views/mobdesign/index.jsx
index 4402d28..7d19e54 100644
--- a/src/views/mobdesign/index.jsx
+++ b/src/views/mobdesign/index.jsx
@@ -2,16 +2,16 @@
 import { DndProvider } from 'react-dnd'
 import { withRouter } from 'react-router'
 import { is, fromJS } from 'immutable'
-import moment from 'moment'
 import HTML5Backend from 'react-dnd-html5-backend'
 import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
 import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, RedoOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
+import moment from 'moment'
+import md5 from 'md5'
 
 import Api from '@/api'
 import Utils, { setGLOBFuncs } from '@/utils/utils.js'
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
-import antdEnUS from 'antd/es/locale/en_US'
 import antdZhCN from 'antd/es/locale/zh_CN'
 import MKEmitter from '@/utils/events.js'
 import MenuUtils from '@/utils/utils-custom.js'
@@ -33,6 +33,7 @@
 const ViewNodes = asyncComponent(() => import('@/menu/viewnodes'))
 const SourceWrap = asyncComponent(() => import('@/mob/modulesource'))
 const Modulecell = asyncComponent(() => import('@/menu/modulecell'))
+const TableNodes = asyncComponent(() => import('@/menu/tablenodes'))
 const BgController = asyncComponent(() => import('@/pc/bgcontroller'))
 const ReplaceField = asyncComponent(() => import('@/menu/replaceField'))
 const SysInterface = asyncComponent(() => import('@/menu/sysinterface'))
@@ -61,7 +62,6 @@
 
 class MobDesign extends Component {
   state = {
-    localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
     dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
     loading: true,
     MenuId: '',
@@ -89,10 +89,9 @@
 
       if (param.type === 'app') {
         sessionStorage.setItem('appId', param.ID || '')
+        sessionStorage.setItem('appName', param.remark || '')
         sessionStorage.setItem('lang', param.lang || 'zh-CN')
         sessionStorage.setItem('kei_no', param.kei_no || '')
-        sessionStorage.setItem('role_type', param.role_type || 'true')
-        sessionStorage.setItem('login_types', param.login_types || 'false')
         sessionStorage.setItem('typename', param.typename || 'mob')
         sessionStorage.setItem('adapter', param.adapter || '')
         sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
@@ -100,7 +99,6 @@
         sessionStorage.setItem('instantMessage', param.instantMessage || '')
 
         this.setState({
-          localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
           dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
         })
         this.getAppMessage(param.MenuID)
@@ -919,12 +917,16 @@
     })
   }
 
-  getMenuMessage = () => {
+  getMenuMessage = (tbs) => {
     const { config } = this.state
     
     let traversal = (components) => {
       let list = []
       components.forEach(item => {
+        if (item.$tables) {
+          tbs.push(...item.$tables)
+        }
+
         let m = {
           key: item.uuid,
           title: item.name,
@@ -1320,10 +1322,50 @@
         config.enabled = false
       }
 
+      let tbs = []
       let roleParam = {type: 'view', version: '1.0', key: config.uuid, title: config.MenuName, children: []}
-      roleParam.children = this.getMenuMessage()
+      roleParam.children = this.getMenuMessage(tbs)
       config.loginview = false
       config.tabview = false
+
+      let arr = []
+      tbs = tbs.filter(tb => {
+        let _tb = tb.toLowerCase()
+
+        if (arr.includes(_tb)) return false
+        arr.push(_tb)
+
+        return true
+      })
+      tbs.sort()
+      if (tbs.length && sessionStorage.getItem('mk_tb_names')) {
+        let names = sessionStorage.getItem('mk_tb_names')
+        tbs = tbs.filter(tb => names.indexOf(',' + tb.toLowerCase() + ',') > -1)
+      }
+      tbs = tbs.map(tb => `'${tb}'`).join(';')
+
+      let key = md5(config.uuid + sessionStorage.getItem('kei_no') + sessionStorage.getItem('typename') + sessionStorage.getItem('lang') + tbs.toLowerCase())
+      let url = ''
+
+      if (config.tbkey === key) {
+        key = ''
+      } else {
+        let urlparam = {
+          type: 'app',
+          MenuID: config.uuid,
+          ID: sessionStorage.getItem('appId') || '',
+          remark: sessionStorage.getItem('appName') || '',
+          lang: sessionStorage.getItem('lang') || '',
+          kei_no: sessionStorage.getItem('kei_no') || '',
+          typename: sessionStorage.getItem('typename') || '',
+          adapter: sessionStorage.getItem('adapter') || '',
+          sysBgColor: sessionStorage.getItem('sysBgColor') || '',
+          MenuName: config.MenuName || '',
+        }
+
+        url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
+        config.tbkey = key
+      }
 
       if (roleParam.children.length === 0) {
         roleParam.pass = true
@@ -1377,7 +1419,10 @@
         menus_rolelist: window.btoa(window.encodeURIComponent(JSON.stringify(roleParam))),
         LText: '',
         LTexttb: '',
-        menus_used_list
+        menus_used_list,
+        debug_md5: key,
+        debug_url: url,
+        debug_list: window.btoa(tbs)
       }
 
       param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
@@ -1921,10 +1966,10 @@
 
 
   render () {
-    const { viewType, localedict, comloading, loading, settingshow, controlshow, activeKey, dict, MenuId, config, menuloading, customComponents, adapters, eyeopen } = this.state
+    const { viewType, comloading, loading, settingshow, controlshow, activeKey, dict, MenuId, config, menuloading, customComponents, adapters, eyeopen } = this.state
 
     return (
-      <ConfigProvider locale={localedict}>
+      <ConfigProvider locale={antdZhCN}>
         <div className={'mk-mob-view ' + viewType} id="mk-mob-design-view">
           <Header changeView={this.changeView}/>
           {loading ? <Spin className="view-spin" size="large" /> : null}
@@ -1979,6 +2024,7 @@
                 <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
                 <CreateView resetmenu={this.getAppMenus} />
                 <PasteController insert={this.insert} />
+                <TableNodes config={config} />
                 <ViewNodes config={config} MenuId={MenuId}/>
                 <SysInterface config={config} updateConfig={this.updateConfig}/>
                 <PictureController/>
diff --git a/src/views/pcdesign/index.jsx b/src/views/pcdesign/index.jsx
index 26c4531..17f63bf 100644
--- a/src/views/pcdesign/index.jsx
+++ b/src/views/pcdesign/index.jsx
@@ -2,16 +2,17 @@
 import { DndProvider } from 'react-dnd'
 import { withRouter } from 'react-router'
 import { is, fromJS } from 'immutable'
-import moment from 'moment'
 import HTML5Backend from 'react-dnd-html5-backend'
 import { ConfigProvider, notification, Modal, Collapse, Switch, Button, message, Spin, Typography } from 'antd'
 import { DoubleLeftOutlined, DoubleRightOutlined, HomeOutlined, LoginOutlined, RedoOutlined, ArrowLeftOutlined, EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'
+import moment from 'moment'
+import md5 from 'md5'
 
 import Api from '@/api'
 import Utils, { setGLOBFuncs } from '@/utils/utils.js'
 import zhCN from '@/locales/zh-CN/mob.js'
 import enUS from '@/locales/en-US/mob.js'
-import antdEnUS from 'antd/es/locale/en_US'
+// import antdEnUS from 'antd/es/locale/en_US'
 import antdZhCN from 'antd/es/locale/zh_CN'
 import MKEmitter from '@/utils/events.js'
 import MenuUtils from '@/utils/utils-custom.js'
@@ -31,6 +32,7 @@
 const ViewNodes = asyncComponent(() => import('@/menu/viewnodes'))
 const SourceWrap = asyncComponent(() => import('@/pc/modulesource'))
 const Modulecell = asyncComponent(() => import('@/menu/modulecell'))
+const TableNodes = asyncComponent(() => import('@/menu/tablenodes'))
 const CreateView = asyncComponent(() => import('@/pc/createview'))
 const BgController = asyncComponent(() => import('@/pc/bgcontroller'))
 const Quotecomponent = asyncComponent(() => import('@/pc/quotecomponent'))
@@ -55,7 +57,6 @@
 
 class MenuDesign extends Component {
   state = {
-    localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
     dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
     loading: true,
     MenuId: '',
@@ -91,14 +92,12 @@
 
       if (param.type === 'app') {
         sessionStorage.setItem('appId', param.ID || '')
+        sessionStorage.setItem('appName', param.remark || '')
         sessionStorage.setItem('lang', param.lang || 'zh-CN')
         sessionStorage.setItem('kei_no', param.kei_no || '')
-        sessionStorage.setItem('role_type', param.role_type || 'true')
-        sessionStorage.setItem('login_types', param.login_types || 'false')
         sessionStorage.setItem('sysBgColor', param.sysBgColor || '#ffffff')
 
         this.setState({
-          localedict: sessionStorage.getItem('lang') !== 'en-US' ? antdZhCN : antdEnUS,
           dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
         })
         this.getAppMessage(param.MenuID)
@@ -869,7 +868,7 @@
     })
   }
 
-  getMenuMessage = () => {
+  getMenuMessage = (tbs) => {
     const { config } = this.state
     let nodes = {type: 'view', version: '1.0', key: config.uuid, title: config.MenuName, children: []}
     let popviews = []
@@ -877,6 +876,10 @@
     let traversal = (components) => {
       let list = []
       components.forEach(item => {
+        if (item.$tables) {
+          tbs.push(...item.$tables)
+        }
+
         let m = {
           key: item.uuid,
           title: item.name,
@@ -1204,11 +1207,50 @@
         config.enabled = false
       }
 
-      let roleParam = this.getMenuMessage()
+      let tbs = []
+      let roleParam = this.getMenuMessage(tbs)
 
       let subMenus = this.getSubMenus()
       let menus_used_list = subMenus.map(m => `'${config.uuid}','${config.MenuName || ''}','${config.MenuNo || ''}','${m.MenuID}','${m.MenuName}'`).join(';')
       menus_used_list = window.btoa(window.encodeURIComponent(menus_used_list || 'del'))
+
+      let arr = []
+      tbs = tbs.filter(tb => {
+        let _tb = tb.toLowerCase()
+
+        if (arr.includes(_tb)) return false
+        arr.push(_tb)
+
+        return true
+      })
+      tbs.sort()
+      if (tbs.length && sessionStorage.getItem('mk_tb_names')) {
+        let names = sessionStorage.getItem('mk_tb_names')
+        tbs = tbs.filter(tb => names.indexOf(',' + tb.toLowerCase() + ',') > -1)
+      }
+      tbs = tbs.map(tb => `'${tb}'`).join(';')
+
+      let key = md5(config.uuid + sessionStorage.getItem('kei_no') + 'pc' + sessionStorage.getItem('lang') + tbs.toLowerCase())
+      let url = ''
+
+      if (config.tbkey === key) {
+        key = ''
+      } else {
+        let urlparam = {
+          type: 'app',
+          MenuID: config.uuid,
+          ID: sessionStorage.getItem('appId') || '',
+          remark: sessionStorage.getItem('appName') || '',
+          lang: sessionStorage.getItem('lang') || '',
+          kei_no: sessionStorage.getItem('kei_no') || '',
+          typename: 'pc',
+          sysBgColor: sessionStorage.getItem('sysBgColor') || '',
+          MenuName: config.MenuName || '',
+        }
+
+        url = window.btoa(window.encodeURIComponent(JSON.stringify(urlparam)))
+        config.tbkey = key
+      }
 
       let param = {
         func: 'sPC_TrdMenu_AddUpt',
@@ -1227,7 +1269,10 @@
         open_edition: config.open_edition,
         LText: '',
         LTexttb: '',
-        menus_used_list
+        menus_used_list,
+        debug_md5: key,
+        debug_url: url,
+        debug_list: window.btoa(tbs)
       }
 
       param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
@@ -1830,10 +1875,10 @@
   }
 
   render () {
-    const { localedict, loading, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state
+    const { loading, comloading, activeKey, settingshow, controlshow, dict, MenuId, config, menuloading, customComponents, eyeopen } = this.state
 
     return (
-      <ConfigProvider locale={localedict}>
+      <ConfigProvider locale={antdZhCN}>
         <div className={'mk-pc-view '} id="mk-pc-design-view">
           {loading ? <Spin className="view-spin" size="large" /> : null}
           <DndProvider backend={HTML5Backend}>
@@ -1886,6 +1931,7 @@
                 <Button className="mk-border-purple" onClick={() => this.setState({eyeopen: !eyeopen})}>{!eyeopen ? <EyeOutlined /> : <EyeInvisibleOutlined />} 缁勪欢鍚�</Button>
                 <CreateView resetmenu={this.getAppMenus} />
                 <PasteController insert={this.insert} />
+                <TableNodes config={config} />
                 <ViewNodes config={config} MenuId={MenuId}/>
                 <SysInterface config={config} updateConfig={this.updateConfig}/>
                 <PictureController/>

--
Gitblit v1.8.0