From 113ff1aa0d62549730f1413fe5ffcadcf3a14f11 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 23 八月 2022 11:37:24 +0800
Subject: [PATCH] 2022-08-23

---
 src/utils/utils-datamanage.js                                                      |    2 
 src/menu/sysinterface/settingform/simplescript/index.jsx                           |    2 
 src/mob/searchconfig/index.jsx                                                     |    2 
 src/tabviews/formtab/index.jsx                                                     |    2 
 src/tabviews/formtab/actionList/index.jsx                                          |    2 
 src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx   |    2 
 src/tabviews/verupmanage/actionList/index.jsx                                      |    6 
 src/menu/components/share/searchcomponent/index.jsx                                |    2 
 src/templates/zshare/verifycard/customscript/index.jsx                             |    2 
 src/tabviews/zshare/actionList/excelInbutton/index.jsx                             |    2 
 src/templates/treepageconfig/index.jsx                                             |    4 
 src/templates/modalconfig/index.jsx                                                |    2 
 src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx  |    2 
 src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx              |    2 
 src/views/billprint/index.jsx                                                      |    4 
 src/templates/sharecomponent/settingcomponent/settingform/index.jsx                |    4 
 src/mob/modalconfig/index.jsx                                                      |    2 
 src/templates/sharecomponent/settingcalcomponent/verifycard/settingform/index.jsx  |    2 
 src/views/tabledesign/tableconfig/index.jsx                                        | 1046 ++++++++++++++++++++++++++++++
 src/tabviews/zshare/actionList/normalbutton/index.jsx                              |    4 
 src/menu/datasource/verifycard/index.jsx                                           |    4 
 src/menu/components/form/tab-form/index.jsx                                        |    2 
 src/menu/components/share/actioncomponent/formconfig.jsx                           |    2 
 src/tabviews/custom/components/group/normal-group/index.jsx                        |    2 
 src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx     |    2 
 src/templates/sharecomponent/treesettingcomponent/settingform/datasource/index.jsx |    2 
 src/templates/calendarconfig/index.jsx                                             |    2 
 src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx            |    2 
 src/views/pay/index.jsx                                                            |    4 
 src/tabviews/custom/index.jsx                                                      |    3 
 src/templates/zshare/createinterface/index.jsx                                     |    4 
 src/views/design/header/versions/index.jsx                                         |   10 
 src/tabviews/verupmanage/index.jsx                                                 |    2 
 src/views/design/sidemenu/thdmenuplus/index.jsx                                    |   31 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx |    2 
 src/views/login/loginform.jsx                                                      |    2 
 src/views/appcheck/index.jsx                                                       |    6 
 src/tabviews/verupmanage/subtabtable/index.jsx                                     |    2 
 src/templates/formtabconfig/index.jsx                                              |    8 
 src/templates/zshare/verifycard/callbackcustomscript/index.jsx                     |    2 
 src/views/tabledesign/tableconfig/index.scss                                       |  203 +++++
 src/templates/comtableconfig/index.jsx                                             |    2 
 src/tabviews/calendar/index.jsx                                                    |    2 
 src/templates/sharecomponent/searchcomponent/index.jsx                             |    2 
 src/tabviews/zshare/actionList/exceloutbutton/index.jsx                            |    8 
 src/menu/components/form/simple-form/index.jsx                                     |    2 
 src/templates/zshare/verifycard/customform/index.jsx                               |    2 
 src/api/index.js                                                                   |  130 +--
 src/views/tabledesign/tableconfig/menuform/index.scss                              |    0 
 src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx              |    4 
 src/views/tabledesign/tableconfig/source.jsx                                       |  339 +++++++++
 src/templates/zshare/createfunc/index.jsx                                          |    6 
 src/tabviews/scriptmanage/actionList/index.jsx                                     |    2 
 src/menu/components/form/step-form/index.jsx                                       |    2 
 src/tabviews/custom/components/share/tabtransfer/index.jsx                         |    2 
 src/tabviews/rolemanage/index.jsx                                                  |    4 
 src/templates/zshare/formconfig.jsx                                                |    6 
 src/views/tabledesign/tableconfig/menuform/index.jsx                               |  116 +++
 src/tabviews/zshare/actionList/printbutton/index.jsx                               |    4 
 src/menu/components/search/main-search/index.jsx                                   |    2 
 src/menu/modalconfig/index.jsx                                                     |    2 
 src/tabviews/scriptmanage/index.jsx                                                |    2 
 src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx        |    2 
 src/views/login/index.jsx                                                          |    4 
 64 files changed, 1,875 insertions(+), 163 deletions(-)

diff --git a/src/api/index.js b/src/api/index.js
index e5b2885..7f1d3c0 100644
--- a/src/api/index.js
+++ b/src/api/index.js
@@ -571,33 +571,7 @@
   }
 
   /**
-   * @description 鑾峰彇鎴栦慨鏀规湰鍦伴厤缃紝澧炲姞appkey
-   */
-  getLocalConfig (param) {
-    param.userid = param.userid || sessionStorage.getItem('UserID') || ''
-    param.lang = param.lang || sessionStorage.getItem('lang') || ''
-    param.SessionUid = localStorage.getItem('SessionUid') || ''
-    param.LoginUID = param.LoginUID || sessionStorage.getItem('LoginUID') || ''
-    param.appkey = window.GLOB.appkey || ''
-
-    let url = '/webapi/dostars'
-    if (param.rduri) {
-      url = param.rduri
-      delete param.rduri
-    }
-
-    param = this.encryptParam(param)
-
-    return axios({
-      url: `${url}${param.func ? '/' + param.func : ''}`,
-      method: 'post',
-      data: param
-    })
-  }
-
-  /**
    * @description 鑾峰彇绯荤粺閰嶇疆锛屽彇鍊间紭鍏堢瓑绾ebsql銆佺紦瀛樸�佹湇鍔″櫒
-   * @param {Object}  param   璇锋眰鍙傛暟
    */
   getCacheConfig (param) {
     param.userid = sessionStorage.getItem('UserID') || ''
@@ -797,18 +771,14 @@
 
   /**
    * @description 鑾峰彇涓氬姟閫氱敤鎺ュ彛
+   * 璁块棶 'https://sso.mk9h.cn/webapi/dostars'鎴栦簯绔椂锛屼紶鍏serid銆丩oginUID
    */
   genericInterface (param) {
-    param.userid = sessionStorage.getItem('UserID') || ''
-    param.lang = sessionStorage.getItem('lang') || ''
+    param.userid = param.userid || sessionStorage.getItem('UserID') || ''
+    param.lang = param.lang || sessionStorage.getItem('lang') || ''
     param.SessionUid = localStorage.getItem('SessionUid') || ''
-    param.LoginUID = sessionStorage.getItem('LoginUID') || ''
+    param.LoginUID = param.LoginUID || sessionStorage.getItem('LoginUID') || ''
     param.appkey = window.GLOB.appkey || ''
-
-    if (options.cloudServiceApi && param.rduri === options.cloudServiceApi) { // HS涓嬭彍鍗�
-      param.userid = sessionStorage.getItem('CloudUserID') || param.userid || ''
-      param.LoginUID = sessionStorage.getItem('CloudLoginUID') || param.LoginUID || ''
-    }
 
     let url = '/webapi/dostars'
     if (param.rduri && /\/dostars/.test(param.rduri) && param.func !== 'webapi_ChangeUser') { // 鍒囨崲鐢ㄦ埛闇�瑕侀�氳繃鏈湴
@@ -826,55 +796,55 @@
   }
 
   /**
-   * @description 瀵煎嚭Excel
+   * @description 瀵煎嚭Excel锛屽悗鍙扮敓鎴愭枃浠�
    */
-  getExcelOut (param, name) {
-    param.userid = sessionStorage.getItem('UserID')
-    param.lang = sessionStorage.getItem('lang') || ''
-    param.SessionUid = localStorage.getItem('SessionUid') || ''
-    param.LoginUID = sessionStorage.getItem('LoginUID') || ''
-    param.appkey = window.GLOB.appkey || ''
+  // getExcelOut (param, name) {
+  //   param.userid = sessionStorage.getItem('UserID')
+  //   param.lang = sessionStorage.getItem('lang') || ''
+  //   param.SessionUid = localStorage.getItem('SessionUid') || ''
+  //   param.LoginUID = sessionStorage.getItem('LoginUID') || ''
+  //   param.appkey = window.GLOB.appkey || ''
     
-    return new Promise(resolve => {
-      axios({
-        url: '/webapi/doexcel',
-        responseType: 'blob',
-        method: 'post',
-        data: param
-      }).then(res => {
-        try {
-          const blob = new Blob([res])
+  //   return new Promise(resolve => {
+  //     axios({
+  //       url: '/webapi/doexcel',
+  //       responseType: 'blob',
+  //       method: 'post',
+  //       data: param
+  //     }).then(res => {
+  //       try {
+  //         const blob = new Blob([res])
           
-          if (res.type === 'application/json') {
-            const reader = new FileReader()
-            reader.onload = e => resolve(JSON.parse(e.target.result))
-            reader.readAsText(blob)
-          } else {
-            if ('download' in document.createElement('a')) { // 闈濱E涓嬭浇
-              const elink = document.createElement('a')
-              elink.download = name
-              elink.style.display = 'none'
-              elink.href = URL.createObjectURL(blob)
-              document.body.appendChild(elink)
-              elink.click()
-              URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
-              document.body.removeChild(elink)
-            } else { // IE10+涓嬭浇
-              navigator.msSaveBlob(blob, name)
-            }
-            resolve()
-          }
-        } catch (e) {
-          resolve({
-            ErrCode: 'E',
-            ErrMesg: '鏂囦欢瑙f瀽閿欒',
-            message: '',
-            status: false
-          })
-        }
-      })
-    })
-  }
+  //         if (res.type === 'application/json') {
+  //           const reader = new FileReader()
+  //           reader.onload = e => resolve(JSON.parse(e.target.result))
+  //           reader.readAsText(blob)
+  //         } else {
+  //           if ('download' in document.createElement('a')) { // 闈濱E涓嬭浇
+  //             const elink = document.createElement('a')
+  //             elink.download = name
+  //             elink.style.display = 'none'
+  //             elink.href = URL.createObjectURL(blob)
+  //             document.body.appendChild(elink)
+  //             elink.click()
+  //             URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+  //             document.body.removeChild(elink)
+  //           } else { // IE10+涓嬭浇
+  //             navigator.msSaveBlob(blob, name)
+  //           }
+  //           resolve()
+  //         }
+  //       } catch (e) {
+  //         resolve({
+  //           ErrCode: 'E',
+  //           ErrMesg: '鏂囦欢瑙f瀽閿欒',
+  //           message: '',
+  //           status: false
+  //         })
+  //       }
+  //     })
+  //   })
+  // }
 
   /**
    * @description 涓婁紶base64
diff --git a/src/menu/components/form/simple-form/index.jsx b/src/menu/components/form/simple-form/index.jsx
index e1c5299..7aa4c24 100644
--- a/src/menu/components/form/simple-form/index.jsx
+++ b/src/menu/components/form/simple-form/index.jsx
@@ -514,7 +514,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/menu/components/form/step-form/index.jsx b/src/menu/components/form/step-form/index.jsx
index 230b51d..4ccf43c 100644
--- a/src/menu/components/form/step-form/index.jsx
+++ b/src/menu/components/form/step-form/index.jsx
@@ -615,7 +615,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/menu/components/form/tab-form/index.jsx b/src/menu/components/form/tab-form/index.jsx
index ff6e32b..711552c 100644
--- a/src/menu/components/form/tab-form/index.jsx
+++ b/src/menu/components/form/tab-form/index.jsx
@@ -621,7 +621,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/menu/components/search/main-search/index.jsx b/src/menu/components/search/main-search/index.jsx
index 8f67966..379f56b 100644
--- a/src/menu/components/search/main-search/index.jsx
+++ b/src/menu/components/search/main-search/index.jsx
@@ -286,7 +286,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               card: card,
diff --git a/src/menu/components/share/actioncomponent/formconfig.jsx b/src/menu/components/share/actioncomponent/formconfig.jsx
index 25baad2..46fd198 100644
--- a/src/menu/components/share/actioncomponent/formconfig.jsx
+++ b/src/menu/components/share/actioncomponent/formconfig.jsx
@@ -97,8 +97,8 @@
   const isApp = ['pc', 'mob'].includes(appType)
 
   let funTypes = [
-    { value: 'changeuser', text: '鍒囨崲鐢ㄦ埛' },
     { value: 'print', text: '鏍囩鎵撳嵃' },
+    { value: 'changeuser', text: '鍒囨崲鐢ㄦ埛' },
     { value: 'closetab', text: '鏍囩鍏抽棴' },
     { value: 'megvii', text: '鏃疯闈㈡澘鏈�' },
     { value: 'filezip', text: '鏂囦欢鍘嬬缉鍖�' },
diff --git a/src/menu/components/share/searchcomponent/index.jsx b/src/menu/components/share/searchcomponent/index.jsx
index dc49dc5..e03d2e9 100644
--- a/src/menu/components/share/searchcomponent/index.jsx
+++ b/src/menu/components/share/searchcomponent/index.jsx
@@ -233,7 +233,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx b/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
index cbd84c7..0d6e3ec 100644
--- a/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
+++ b/src/menu/components/table/edit-table/columns/tableIn/customscript/index.jsx
@@ -172,7 +172,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/menu/datasource/verifycard/index.jsx b/src/menu/datasource/verifycard/index.jsx
index e692605..b34a013 100644
--- a/src/menu/datasource/verifycard/index.jsx
+++ b/src/menu/datasource/verifycard/index.jsx
@@ -619,10 +619,10 @@
         sumParam.secretkey = Utils.encrypt('', sumParam.timestamp)
       }
       
-      Api.getLocalConfig(param).then(result => {
+      Api.genericInterface(param).then(result => {
         if (result.status) {
           if (sumParam) {
-            Api.getLocalConfig(sumParam).then(res => {
+            Api.genericInterface(sumParam).then(res => {
               if (res.status) {
                 resolve()
               } else {
diff --git a/src/menu/modalconfig/index.jsx b/src/menu/modalconfig/index.jsx
index 89d315a..abc8389 100644
--- a/src/menu/modalconfig/index.jsx
+++ b/src/menu/modalconfig/index.jsx
@@ -288,7 +288,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/menu/sysinterface/settingform/simplescript/index.jsx b/src/menu/sysinterface/settingform/simplescript/index.jsx
index 5392bbd..9f13e66 100644
--- a/src/menu/sysinterface/settingform/simplescript/index.jsx
+++ b/src/menu/sysinterface/settingform/simplescript/index.jsx
@@ -259,7 +259,7 @@
     param.secretkey = Utils.encrypt('', param.timestamp)
     
     this.setState({loading: true})
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         this.setState({
           loading: false,
diff --git a/src/mob/modalconfig/index.jsx b/src/mob/modalconfig/index.jsx
index 2bc3d6c..2476590 100644
--- a/src/mob/modalconfig/index.jsx
+++ b/src/mob/modalconfig/index.jsx
@@ -287,7 +287,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/mob/searchconfig/index.jsx b/src/mob/searchconfig/index.jsx
index a240a6c..ff9ea70 100644
--- a/src/mob/searchconfig/index.jsx
+++ b/src/mob/searchconfig/index.jsx
@@ -248,7 +248,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/tabviews/calendar/index.jsx b/src/tabviews/calendar/index.jsx
index a769ee8..c7485e1 100644
--- a/src/tabviews/calendar/index.jsx
+++ b/src/tabviews/calendar/index.jsx
@@ -301,6 +301,8 @@
       if (window.GLOB.mkHS) {
         if (setting.sysInterface === 'true' && options.cloudServiceApi) {
           param.rduri = options.cloudServiceApi
+          param.userid = sessionStorage.getItem('CloudUserID') || ''
+          param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
         } else if (setting.sysInterface !== 'true') {
           param.rduri = setting.interface
         }
diff --git a/src/tabviews/custom/components/group/normal-group/index.jsx b/src/tabviews/custom/components/group/normal-group/index.jsx
index 3a2fc09..699fd28 100644
--- a/src/tabviews/custom/components/group/normal-group/index.jsx
+++ b/src/tabviews/custom/components/group/normal-group/index.jsx
@@ -111,7 +111,7 @@
 
     let param = getStructuredParams(params, this.props.config, BID)
 
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         delete result.status
         delete result.message
diff --git a/src/tabviews/custom/components/share/tabtransfer/index.jsx b/src/tabviews/custom/components/share/tabtransfer/index.jsx
index a4b2f94..1ce33c9 100644
--- a/src/tabviews/custom/components/share/tabtransfer/index.jsx
+++ b/src/tabviews/custom/components/share/tabtransfer/index.jsx
@@ -131,7 +131,7 @@
 
     let param = getStructuredParams(params, this.props.config, BID)
 
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         delete result.status
         delete result.message
diff --git a/src/tabviews/custom/index.jsx b/src/tabviews/custom/index.jsx
index 8391658..c468159 100644
--- a/src/tabviews/custom/index.jsx
+++ b/src/tabviews/custom/index.jsx
@@ -899,6 +899,7 @@
           // group.subButton.$forbid = true // 涓嶅0鏄庢暟鎹簮鍙橀噺
           group.subButton.OpenType = 'formSubmit'
           group.subButton.execError = 'never'
+          group.subButton.logLabel = item.$menuname + '-' + group.subButton.label
 
           if (!group.subButton.Ot) {
             group.subButton.Ot = item.wrap.datatype === 'static' ? 'notRequired' : 'requiredSgl'
@@ -1112,7 +1113,7 @@
 
     this.setState({loading: true, loadingview: false})
 
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         delete result.status
         delete result.message
diff --git a/src/tabviews/formtab/actionList/index.jsx b/src/tabviews/formtab/actionList/index.jsx
index a9f47c9..87e516a 100644
--- a/src/tabviews/formtab/actionList/index.jsx
+++ b/src/tabviews/formtab/actionList/index.jsx
@@ -210,6 +210,8 @@
         if (window.GLOB.mkHS) {
           if (btn.sysInterface === 'true' && options.cloudServiceApi) {
             res.rduri = options.cloudServiceApi
+            res.userid = sessionStorage.getItem('CloudUserID') || ''
+            res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
           } else if (btn.sysInterface !== 'true') {
             res.rduri = btn.interface
           }
diff --git a/src/tabviews/formtab/index.jsx b/src/tabviews/formtab/index.jsx
index f4b1eea..3ff7443 100644
--- a/src/tabviews/formtab/index.jsx
+++ b/src/tabviews/formtab/index.jsx
@@ -459,6 +459,8 @@
       if (window.GLOB.mkHS) {
         if (setting.sysInterface === 'true' && options.cloudServiceApi) {
           param.rduri = options.cloudServiceApi
+          param.userid = sessionStorage.getItem('CloudUserID') || ''
+          param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
         } else if (setting.sysInterface !== 'true') {
           param.rduri = setting.interface
         }
diff --git a/src/tabviews/rolemanage/index.jsx b/src/tabviews/rolemanage/index.jsx
index 6292715..cbcbbf7 100644
--- a/src/tabviews/rolemanage/index.jsx
+++ b/src/tabviews/rolemanage/index.jsx
@@ -558,7 +558,7 @@
           this.getSelectMenuList()
         })
         if (window.GLOB.mainSystemApi) {
-          Api.getLocalConfig(localParam).then(res => {
+          Api.genericInterface(localParam).then(res => {
             if (!res.status) {
               notification.warning({
                 top: 92,
@@ -627,7 +627,7 @@
         })
         
         if (window.GLOB.mainSystemApi) {
-          Api.getLocalConfig(localParam).then(res => {
+          Api.genericInterface(localParam).then(res => {
             if (!res.status) {
               notification.warning({
                 top: 92,
diff --git a/src/tabviews/scriptmanage/actionList/index.jsx b/src/tabviews/scriptmanage/actionList/index.jsx
index 6ddf524..500aa55 100644
--- a/src/tabviews/scriptmanage/actionList/index.jsx
+++ b/src/tabviews/scriptmanage/actionList/index.jsx
@@ -134,6 +134,8 @@
 
     if (options.cloudServiceApi) {
       param.rduri = options.cloudServiceApi
+      param.userid = sessionStorage.getItem('CloudUserID') || ''
+      param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
     }
 
     Api.genericInterface(param).then((res) => {
diff --git a/src/tabviews/scriptmanage/index.jsx b/src/tabviews/scriptmanage/index.jsx
index df5e94b..15c1be5 100644
--- a/src/tabviews/scriptmanage/index.jsx
+++ b/src/tabviews/scriptmanage/index.jsx
@@ -129,6 +129,8 @@
 
     if (options.cloudServiceApi) {
       param.rduri = options.cloudServiceApi
+      param.userid = sessionStorage.getItem('CloudUserID') || ''
+      param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
     }
 
     let result = await Api.genericInterface(param)
diff --git a/src/tabviews/verupmanage/actionList/index.jsx b/src/tabviews/verupmanage/actionList/index.jsx
index 41c9e8b..b9d18d3 100644
--- a/src/tabviews/verupmanage/actionList/index.jsx
+++ b/src/tabviews/verupmanage/actionList/index.jsx
@@ -496,6 +496,8 @@
         }
       } else if (btn.sysInterface === 'true' && options.cloudServiceApi) {
         res.rduri = options.cloudServiceApi
+        res.userid = sessionStorage.getItem('CloudUserID') || ''
+        res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
       } else if (btn.sysInterface !== 'true') {
         res.rduri = btn.interface
       }
@@ -535,7 +537,7 @@
           _callbackparam.open_key = Utils.encryptOpenKey(_callbackparam.secretkey, _callbackparam.timestamp)
         }
 
-        return Api.getLocalConfig(_callbackparam)
+        return Api.genericInterface(_callbackparam)
       } else {
         if (response.status) {
           // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
@@ -558,7 +560,7 @@
         if (!res.status) {
           errRes = res
         }
-        return Api.getLocalConfig(_localParam)
+        return Api.genericInterface(_localParam)
       } else if (res.status) {
         if (params.length === 0) {
           this.execSuccess(btn, res)
diff --git a/src/tabviews/verupmanage/index.jsx b/src/tabviews/verupmanage/index.jsx
index d982822..23908ba 100644
--- a/src/tabviews/verupmanage/index.jsx
+++ b/src/tabviews/verupmanage/index.jsx
@@ -193,6 +193,8 @@
     } else {
       if (setting.sysInterface === 'true' && options.cloudServiceApi) {
         param.rduri = options.cloudServiceApi
+        param.userid = sessionStorage.getItem('CloudUserID') || ''
+        param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
       } else if (setting.sysInterface !== 'true') {
         param.rduri = setting.interface
       }
diff --git a/src/tabviews/verupmanage/subtabtable/index.jsx b/src/tabviews/verupmanage/subtabtable/index.jsx
index fd00229..f7cb699 100644
--- a/src/tabviews/verupmanage/subtabtable/index.jsx
+++ b/src/tabviews/verupmanage/subtabtable/index.jsx
@@ -215,6 +215,8 @@
     } else {
       if (setting.sysInterface === 'true' && options.cloudServiceApi) {
         param.rduri = options.cloudServiceApi
+        param.userid = sessionStorage.getItem('CloudUserID') || ''
+        param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
       } else if (setting.sysInterface !== 'true') {
         param.rduri = setting.interface
       }
diff --git a/src/tabviews/zshare/actionList/excelInbutton/index.jsx b/src/tabviews/zshare/actionList/excelInbutton/index.jsx
index 81148eb..01747a5 100644
--- a/src/tabviews/zshare/actionList/excelInbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/excelInbutton/index.jsx
@@ -412,6 +412,8 @@
         if (window.GLOB.mkHS) {
           if (btn.sysInterface === 'true' && options.cloudServiceApi) {
             param.rduri = options.cloudServiceApi
+            param.userid = sessionStorage.getItem('CloudUserID') || ''
+            param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
           } else if (btn.sysInterface !== 'true') {
             if (window.GLOB.systemType === 'production' && btn.proInterface) {
               param.rduri = btn.proInterface
diff --git a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
index 72c81d2..31c7d41 100644
--- a/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -242,6 +242,8 @@
         if (window.GLOB.mkHS) {
           if (btn.sysInterface === 'true' && options.cloudServiceApi) {
             param.rduri = options.cloudServiceApi
+            param.userid = sessionStorage.getItem('CloudUserID') || ''
+            param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
           } else if (btn.sysInterface !== 'true') {
             if (window.GLOB.systemType === 'production' && btn.proInterface) {
               param.rduri = btn.proInterface
@@ -288,6 +290,8 @@
             if (window.GLOB.mkHS) {
               if (btn.sysInterface === 'true' && options.cloudServiceApi) {
                 res.rduri = options.cloudServiceApi
+                res.userid = sessionStorage.getItem('CloudUserID') || ''
+                res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
               } else if (btn.sysInterface !== 'true') {
                 if (window.GLOB.systemType === 'production' && btn.proInterface) {
                   res.rduri = btn.proInterface
@@ -357,6 +361,8 @@
         if (window.GLOB.mkHS) {
           if (btn.sysInterface === 'true' && options.cloudServiceApi) {
             res.rduri = options.cloudServiceApi
+            res.userid = sessionStorage.getItem('CloudUserID') || ''
+            res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
           } else if (btn.sysInterface !== 'true') {
             if (window.GLOB.systemType === 'production' && btn.proInterface) {
               res.rduri = btn.proInterface
@@ -429,6 +435,8 @@
       if (window.GLOB.mkHS) {
         if (btn.sysInterface === 'true' && options.cloudServiceApi) {
           param.rduri = options.cloudServiceApi
+          param.userid = sessionStorage.getItem('CloudUserID') || ''
+          param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
         } else if (btn.sysInterface !== 'true') {
           if (window.GLOB.systemType === 'production' && btn.proInterface) {
             param.rduri = btn.proInterface
diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 106be56..4f27208 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -1584,6 +1584,8 @@
     if (window.GLOB.mkHS) {
       if (btn.sysInterface === 'true' && options.cloudServiceApi) {
         result.rduri = options.cloudServiceApi
+        result.userid = sessionStorage.getItem('CloudUserID') || ''
+        result.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
       } else if (btn.sysInterface !== 'true') {
         if (window.GLOB.systemType === 'production' && btn.proInterface) {
           result.rduri = btn.proInterface
@@ -2009,7 +2011,7 @@
       _param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
       _param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
 
-      Api.getLocalConfig(_param).then(result => {
+      Api.genericInterface(_param).then(result => {
         if (!result.status) {
           notification.warning({
             top: 92,
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
index 8eeb0c5..55468e2 100644
--- a/src/tabviews/zshare/actionList/printbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -379,7 +379,7 @@
             param.rduri = window.GLOB.mainSystemApi
           }
     
-          Api.getLocalConfig(param).then(result => {
+          Api.genericInterface(param).then(result => {
             result.tempId = tempId
             resolve(result)
           })
@@ -825,6 +825,8 @@
       if (window.GLOB.mkHS) {
         if (btn.sysInterface === 'true' && options.cloudServiceApi) {
           res.rduri = options.cloudServiceApi
+          res.userid = sessionStorage.getItem('CloudUserID') || ''
+          res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
         } else if (btn.sysInterface !== 'true') {
           if (window.GLOB.systemType === 'production' && btn.proInterface) {
             res.rduri = btn.proInterface
diff --git a/src/templates/calendarconfig/index.jsx b/src/templates/calendarconfig/index.jsx
index fdceaff..272e505 100644
--- a/src/templates/calendarconfig/index.jsx
+++ b/src/templates/calendarconfig/index.jsx
@@ -519,7 +519,7 @@
           delete localParam.EasyCode
           delete localParam.open_edition
 
-          Api.getLocalConfig(localParam)
+          Api.genericInterface(localParam)
         } else {
           this.setState({
             menuloading: false,
diff --git a/src/templates/comtableconfig/index.jsx b/src/templates/comtableconfig/index.jsx
index 7ec73f5..f536dba 100644
--- a/src/templates/comtableconfig/index.jsx
+++ b/src/templates/comtableconfig/index.jsx
@@ -732,7 +732,7 @@
           })
         }
         this.props.reloadmenu()
-        Api.getLocalConfig(localParam)
+        Api.genericInterface(localParam)
       } else {
         this.setState({
           menuloading: false,
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index 1ca9259..fd2e37b 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/src/templates/formtabconfig/index.jsx
@@ -608,7 +608,7 @@
             param.rduri = window.GLOB.mainSystemApi
           }
           
-          Api.getLocalConfig(param).then(result => {
+          Api.genericInterface(param).then(result => {
             if (result.status) {
               this.setState({
                 sqlVerifing: false,
@@ -749,7 +749,7 @@
         param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
         param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
-        Api.getLocalConfig(param)
+        Api.genericInterface(param)
       }
 
       let _config = {...config, setting: setting}
@@ -1434,7 +1434,7 @@
         param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
         param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
-        Api.getLocalConfig(param)
+        Api.genericInterface(param)
       }
 
       if (res.interType === 'inner' && !res.innerFunc && res.dataresource && /\s/.test(res.dataresource)) {
@@ -1454,7 +1454,7 @@
         param.LText = Utils.formatOptions(param.LText)
         param.secretkey = Utils.encrypt('', param.timestamp)
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/templates/modalconfig/index.jsx b/src/templates/modalconfig/index.jsx
index e6212f8..9f35ed0 100644
--- a/src/templates/modalconfig/index.jsx
+++ b/src/templates/modalconfig/index.jsx
@@ -430,7 +430,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
index 4b8738a..ad293e5 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelin/customscript/index.jsx
@@ -185,7 +185,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
index 320eaca..9d3d7e7 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/customscript/index.jsx
@@ -173,7 +173,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
index 489a1b5..b66add0 100644
--- a/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/verifyexcelout/index.jsx
@@ -657,7 +657,7 @@
         this.setState({
           loading: true
         })
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           this.setState({
             loading: false
           })
@@ -888,7 +888,7 @@
     param.timestamp = timestamp
     param.secretkey = Utils.encrypt('', timestamp)
 
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         _resolve()
       } else {
diff --git a/src/templates/sharecomponent/searchcomponent/index.jsx b/src/templates/sharecomponent/searchcomponent/index.jsx
index 2f848fc..5f5132c 100644
--- a/src/templates/sharecomponent/searchcomponent/index.jsx
+++ b/src/templates/sharecomponent/searchcomponent/index.jsx
@@ -240,7 +240,7 @@
           param.rduri = window.GLOB.mainSystemApi
         }
         
-        Api.getLocalConfig(param).then(result => {
+        Api.genericInterface(param).then(result => {
           if (result.status) {
             this.setState({
               sqlVerifing: false,
diff --git a/src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx b/src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx
index a478d38..58a558c 100644
--- a/src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx
+++ b/src/templates/sharecomponent/settingcalcomponent/verifycard/index.jsx
@@ -301,7 +301,7 @@
       param.timestamp = timestamp
       param.secretkey = Utils.encrypt('', timestamp)
       
-      Api.getLocalConfig(param).then(result => {
+      Api.genericInterface(param).then(result => {
         if (result.status) {
           resolve()
         } else {
diff --git a/src/templates/sharecomponent/settingcalcomponent/verifycard/settingform/index.jsx b/src/templates/sharecomponent/settingcalcomponent/verifycard/settingform/index.jsx
index c07d5f6..b61e619 100644
--- a/src/templates/sharecomponent/settingcalcomponent/verifycard/settingform/index.jsx
+++ b/src/templates/sharecomponent/settingcalcomponent/verifycard/settingform/index.jsx
@@ -119,7 +119,7 @@
             param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
             param.secretkey = Utils.encrypt(param.LText, param.timestamp)
     
-            Api.getLocalConfig(param)
+            Api.genericInterface(param)
           }
 
           resolve(values)
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
index 7a60231..c00c44f 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/datasource/index.jsx
@@ -152,7 +152,7 @@
             param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
             param.secretkey = Utils.encrypt(param.LText, param.timestamp)
     
-            Api.getLocalConfig(param)
+            Api.genericInterface(param)
           }
 
           resolve(values)
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
index 2fec3e1..26f8ae0 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/index.jsx
@@ -346,10 +346,10 @@
         sumParam.secretkey = Utils.encrypt('', sumParam.timestamp)
       }
       
-      Api.getLocalConfig(param).then(result => {
+      Api.genericInterface(param).then(result => {
         if (result.status) {
           if (sumParam) {
-            Api.getLocalConfig(sumParam).then(res => {
+            Api.genericInterface(sumParam).then(res => {
               if (res.status) {
                 _resolve()
               } else {
diff --git a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
index 0f40714..144b09e 100644
--- a/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/settingform/simplescript/index.jsx
@@ -296,7 +296,7 @@
     param.secretkey = Utils.encrypt('', param.timestamp)
     
     this.setState({loading: true})
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         this.setState({
           loading: false,
diff --git a/src/templates/sharecomponent/treesettingcomponent/settingform/datasource/index.jsx b/src/templates/sharecomponent/treesettingcomponent/settingform/datasource/index.jsx
index 0bf23eb..4562d28 100644
--- a/src/templates/sharecomponent/treesettingcomponent/settingform/datasource/index.jsx
+++ b/src/templates/sharecomponent/treesettingcomponent/settingform/datasource/index.jsx
@@ -137,7 +137,7 @@
             param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
             param.secretkey = Utils.encrypt(param.LText, param.timestamp)
     
-            Api.getLocalConfig(param)
+            Api.genericInterface(param)
           }
 
           resolve(values)
diff --git a/src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx b/src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx
index b3958a5..0abd359 100644
--- a/src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx
+++ b/src/templates/sharecomponent/treesettingcomponent/settingform/index.jsx
@@ -145,7 +145,7 @@
       param.timestamp = timestamp
       param.secretkey = Utils.encrypt('', timestamp)
       
-      Api.getLocalConfig(param).then(result => {
+      Api.genericInterface(param).then(result => {
         if (result.status) {
           _resolve()
         } else {
diff --git a/src/templates/treepageconfig/index.jsx b/src/templates/treepageconfig/index.jsx
index 0d4a1ab..c5da906 100644
--- a/src/templates/treepageconfig/index.jsx
+++ b/src/templates/treepageconfig/index.jsx
@@ -426,7 +426,7 @@
                 })
 
                 this.props.reloadmenu()
-                Api.getLocalConfig(localParam)
+                Api.genericInterface(localParam)
 
                 if (this.state.closeVisible) {
                   this.props.handleView()
@@ -456,7 +456,7 @@
             })
 
             this.props.reloadmenu()
-            Api.getLocalConfig(localParam)
+            Api.genericInterface(localParam)
 
             if (this.state.closeVisible) {
               this.props.handleView()
diff --git a/src/templates/zshare/createfunc/index.jsx b/src/templates/zshare/createfunc/index.jsx
index 92e31e1..b37c619 100644
--- a/src/templates/zshare/createfunc/index.jsx
+++ b/src/templates/zshare/createfunc/index.jsx
@@ -59,7 +59,7 @@
       _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
       _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
       
-      return Api.getLocalConfig(_param)
+      return Api.genericInterface(_param)
     }).then(res => {
       if (!res) return res
 
@@ -143,7 +143,7 @@
       _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
       _param.open_key = Utils.encryptOpenKey(_param.secretkey, _param.timestamp)
 
-      return Api.getLocalConfig(_param)
+      return Api.genericInterface(_param)
     }).then(res => {
       if (!res || res === 'create') return res
       
@@ -171,7 +171,7 @@
       _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
       _param.open_key = Utils.encryptOpenKey(_param.secretkey, _param.timestamp)
 
-      return Api.getLocalConfig(_param)
+      return Api.genericInterface(_param)
     }).then(res => {
       this.setState({
         loading: false
diff --git a/src/templates/zshare/createinterface/index.jsx b/src/templates/zshare/createinterface/index.jsx
index 4156e22..e9f01cf 100644
--- a/src/templates/zshare/createinterface/index.jsx
+++ b/src/templates/zshare/createinterface/index.jsx
@@ -262,7 +262,7 @@
 
     new Promise(resolve => {
       // 鑾峰彇浜戠瀛樺偍杩囩▼淇℃伅
-      Api.getLocalConfig(param).then(result => {
+      Api.genericInterface(param).then(result => {
         if (!result.status) {
           notification.warning({
             top: 92,
@@ -558,7 +558,7 @@
 
       _mainParam = fromJS(param).toJS()
 
-      return Api.getLocalConfig(param)
+      return Api.genericInterface(param)
     }).then(res => {
       if (res === false) return res
 
diff --git a/src/templates/zshare/formconfig.jsx b/src/templates/zshare/formconfig.jsx
index 8bd43e2..d573604 100644
--- a/src/templates/zshare/formconfig.jsx
+++ b/src/templates/zshare/formconfig.jsx
@@ -977,12 +977,12 @@
       initVal: card.funcType || '',
       required: true,
       options: [{
-        value: 'changeuser',
-        text: '鍒囨崲鐢ㄦ埛'
-      }, {
         value: 'print',
         text: '鏍囩鎵撳嵃'
       }, {
+        value: 'changeuser',
+        text: '鍒囨崲鐢ㄦ埛'
+      }, {
         value: 'closetab',
         text: '鏍囩鍏抽棴'
       }, {
diff --git a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
index f14e1be..ce8b2f5 100644
--- a/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
+++ b/src/templates/zshare/verifycard/callbackcustomscript/index.jsx
@@ -155,7 +155,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/templates/zshare/verifycard/customform/index.jsx b/src/templates/zshare/verifycard/customform/index.jsx
index 6ae1a37..1b96426 100644
--- a/src/templates/zshare/verifycard/customform/index.jsx
+++ b/src/templates/zshare/verifycard/customform/index.jsx
@@ -123,7 +123,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/templates/zshare/verifycard/customscript/index.jsx b/src/templates/zshare/verifycard/customscript/index.jsx
index 2211b58..7b42a66 100644
--- a/src/templates/zshare/verifycard/customscript/index.jsx
+++ b/src/templates/zshare/verifycard/customscript/index.jsx
@@ -185,7 +185,7 @@
         param.secretkey = Utils.encrypt('', param.timestamp)
         
         this.setState({loading: true})
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.status) {
             this.setState({
               loading: false,
diff --git a/src/utils/utils-datamanage.js b/src/utils/utils-datamanage.js
index 8e02550..06fc8f6 100644
--- a/src/utils/utils-datamanage.js
+++ b/src/utils/utils-datamanage.js
@@ -58,6 +58,8 @@
       if (window.GLOB.mkHS) {
         if (setting.sysInterface === 'true' && options.cloudServiceApi) {
           param.rduri = options.cloudServiceApi
+          param.userid = sessionStorage.getItem('CloudUserID') || ''
+          param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
         } else if (setting.sysInterface !== 'true') {
           param.rduri = setting.interface
         }
diff --git a/src/views/appcheck/index.jsx b/src/views/appcheck/index.jsx
index 7317ebb..1023652 100644
--- a/src/views/appcheck/index.jsx
+++ b/src/views/appcheck/index.jsx
@@ -67,13 +67,15 @@
       func: 's_get_kei'
     }
 
-    param.rduri = window.GLOB.mainSystemApi
+    if (window.GLOB.mainSystemApi) {
+      param.rduri = window.GLOB.mainSystemApi
+    }
 
     this.setState({
       loading: true
     })
 
-    Api.getLocalConfig(param).then(result => {
+    Api.genericInterface(param).then(result => {
       if (result.status) {
         let selectApp = null
         let applist = result.data.map(item => {
diff --git a/src/views/billprint/index.jsx b/src/views/billprint/index.jsx
index 650c02f..3b63525 100644
--- a/src/views/billprint/index.jsx
+++ b/src/views/billprint/index.jsx
@@ -150,7 +150,7 @@
       _param.rduri = window.GLOB.mainSystemApi
     }
 
-    Api.getLocalConfig(_param).then(result => {
+    Api.genericInterface(_param).then(result => {
       if (result.status) {
         let config = ''
 
@@ -501,7 +501,7 @@
       let componentId = item.componentId
       delete item.componentId
       return new Promise(resolve => {
-        Api.getLocalConfig(item).then(res => {
+        Api.genericInterface(item).then(res => {
           if (!res.status) {
             notification.warning({
               top: 92,
diff --git a/src/views/design/header/versions/index.jsx b/src/views/design/header/versions/index.jsx
index b2883da..806b3ac 100644
--- a/src/views/design/header/versions/index.jsx
+++ b/src/views/design/header/versions/index.jsx
@@ -116,7 +116,7 @@
       res.func = 's_sVersion_Local_add'
       res.VersionName = version.id
 
-      Api.getLocalConfig(res).then(result => {
+      Api.genericInterface(res).then(result => {
         if (!result.status) {
           notification.warning({
             top: 92,
@@ -151,7 +151,7 @@
         param.secretkey = Utils.encrypt(param.LText, param.timestamp)
         param.DateCount = ''
 
-        Api.getLocalConfig(param).then(response => {
+        Api.genericInterface(param).then(response => {
           if (!response.status) {
             notification.warning({
               top: 92,
@@ -232,7 +232,7 @@
   }
 
   execSso = (ssoParam, scripts) => {
-    Api.getLocalConfig(ssoParam).then(res => {
+    Api.genericInterface(ssoParam).then(res => {
       if (!res.status) {
         notification.warning({
           top: 92,
@@ -260,7 +260,7 @@
   }
 
   execLocal = (localParam, ssoParam, scripts) => {
-    Api.getLocalConfig(localParam).then(res => {
+    Api.genericInterface(localParam).then(res => {
       if (!res.status) {
         notification.warning({
           top: 92,
@@ -327,7 +327,7 @@
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
     param.secretkey = Utils.encrypt('', param.timestamp)
 
-    Api.getLocalConfig(param).then(response => {
+    Api.genericInterface(param).then(response => {
       if (!response.status) {
         notification.warning({
           top: 92,
diff --git a/src/views/design/sidemenu/thdmenuplus/index.jsx b/src/views/design/sidemenu/thdmenuplus/index.jsx
index bbf051e..8d3ab63 100644
--- a/src/views/design/sidemenu/thdmenuplus/index.jsx
+++ b/src/views/design/sidemenu/thdmenuplus/index.jsx
@@ -70,6 +70,7 @@
         _templates.push({
           uuid: temp.MenuID,
           title: temp.MenuName,
+          MenuNo: temp.MenuNo,
           type: temp.Template,
           url: illust[temp.Template],
           disabled: temp.disabled || false,
@@ -311,21 +312,23 @@
               </Row>
               <Row>
                 {this.state.usedTemplates.map((template, index) => {
-                  if (!tempSearchKey || template.title.toLowerCase().indexOf(tempSearchKey.toLowerCase()) >= 0) {
-                    return (
-                      <Col key={template.type + index} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={6}>
-                        <Card
-                          title={template.title}>
-                          <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
-                          <div className="card-operation">
-                            <Button type="primary" onClick={() => {this.useTemplate(template, 'user')}}>浣跨敤妯℃澘</Button>
-                          </div>
-                        </Card>
-                      </Col>
-                    )
-                  } else {
-                    return null
+                  if (tempSearchKey) {
+                    if ((template.title + template.MenuNo).toLowerCase().indexOf(tempSearchKey.toLowerCase()) === -1) {
+                      return null
+                    }
                   }
+
+                  return (
+                    <Col key={template.type + index} className={template.disabled ? 'disabled' : ''} title={template.disTitle || ''} span={6}>
+                      <Card
+                        title={template.title}>
+                        <img onClick={() => {this.previewPicture(template)}} src={template.url} alt=""/>
+                        <div className="card-operation">
+                          <Button type="primary" onClick={() => {this.useTemplate(template, 'user')}}>浣跨敤妯℃澘</Button>
+                        </div>
+                      </Card>
+                    </Col>
+                  )
                 })}
               </Row>
             </TabPane>
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index ef494ff..7d5d094 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -643,7 +643,7 @@
 
             // positecgroup
             // if (res.users_upt === 'true' && window.GLOB.systemType === 'production') {
-            //   Api.getLocalConfig ({
+            //   Api.genericInterface ({
             //     func: 's_Get_local_u_deleted',
             //     users_upt_date: res.users_upt_date,
             //     userid: result.UserID,
@@ -659,7 +659,7 @@
             //       LoginUID: result.LoginUID
             //     }).then(ssores => {
             //       if (!ssores.status) return
-            //       Api.getLocalConfig ({
+            //       Api.genericInterface ({
             //         func: 's_get_local_u_create',
             //         user_ids_local: ssores.user_ids_local,
             //         userid: result.UserID,
diff --git a/src/views/login/loginform.jsx b/src/views/login/loginform.jsx
index 899f6d0..c3ccfd1 100644
--- a/src/views/login/loginform.jsx
+++ b/src/views/login/loginform.jsx
@@ -309,7 +309,7 @@
       })
       LoginVerCodeTimer = setTimeout(this.resetVerCodeDelay, 1000)
   
-      Api.getLocalConfig(param).then(res => {
+      Api.genericInterface(param).then(res => {
         if (res.status) {
   
         } else {
diff --git a/src/views/pay/index.jsx b/src/views/pay/index.jsx
index d4afd08..788a5c5 100644
--- a/src/views/pay/index.jsx
+++ b/src/views/pay/index.jsx
@@ -74,7 +74,7 @@
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
     param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
 
-    Api.getLocalConfig(param).then(res => {
+    Api.genericInterface(param).then(res => {
       if (res.status) {
         let _total = res.amount ? parseFloat(res.amount.total) : ''
 
@@ -174,7 +174,7 @@
         param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
         param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
 
-        Api.getLocalConfig(param).then(res => {
+        Api.genericInterface(param).then(res => {
           if (res.pay_status) {
             this.setState({
               overdone: true
diff --git a/src/views/tabledesign/tableconfig/index.jsx b/src/views/tabledesign/tableconfig/index.jsx
new file mode 100644
index 0000000..a233a6a
--- /dev/null
+++ b/src/views/tabledesign/tableconfig/index.jsx
@@ -0,0 +1,1046 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { DndProvider } from 'react-dnd'
+import HTML5Backend from 'react-dnd-html5-backend'
+import { Modal, notification } from 'antd'
+import moment from 'moment'
+
+import Api from '@/api'
+import zhCN from '@/locales/zh-CN/model.js'
+import enUS from '@/locales/en-US/model.js'
+import Utils from '@/utils/utils.js'
+import MKEmitter from '@/utils/events.js'
+import { updateSubTable } from '@/utils/utils-update.js'
+
+import asyncComponent from '@/utils/asyncComponent'
+import SearchComponent from '@/templates/sharecomponent/searchcomponent'
+import ActionComponent from '@/templates/sharecomponent/actioncomponent'
+import ColumnComponent from '@/templates/sharecomponent/columncomponent'
+
+import Source from './source'
+import './index.scss'
+
+const { confirm } = Modal
+
+const SettingComponent = asyncComponent(() => import('@/templates/sharecomponent/settingcomponent'))
+
+class TableConfig extends Component {
+  static propTpyes = {
+    menu: PropTypes.any,
+    editTab: PropTypes.any,
+    tabConfig: PropTypes.any,
+    editSubTab: PropTypes.any,
+    btnTab: PropTypes.any,
+    btnTabConfig: PropTypes.any,
+    config: PropTypes.any,
+    handleView: PropTypes.func
+  }
+
+  state = {
+    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,        // 瀛楀吀
+    config: null,            // 椤甸潰閰嶇疆
+    visible: false,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪锛屾ā鎬佹鏄剧ず鎺у埗
+    menuloading: false,      // 鑿滃崟淇濆瓨涓�
+    menucloseloading: false, // 鑿滃崟鍏抽棴鏃讹紝閫夋嫨淇濆瓨
+    loading: false,          // 鍔犺浇涓紝椤甸潰spin
+    closeVisible: false,     // 鍏抽棴妯℃�佹
+    originConfig: null,      // 鍘熼厤缃�
+    originActions: null,     // 鍘熷鎸夐挳淇℃伅锛屼娇鐢ㄥ凡鏈夌敤鎴锋ā鏉�
+    delActions: [],          // 鍒犻櫎鎸夐挳鍒楄〃
+    copyActions: [],         // 澶嶅埗鎸夐挳缁�
+    tabviews: [],            // 鎵�鏈夋爣绛鹃〉
+    thawButtons: [],         // 宸查�夋嫨瑕佽В鍐荤殑鎸夐挳
+    activeKey: '0',          // 榛樿灞曞紑鍩烘湰淇℃伅
+    chartview: null,         // 褰撳墠瑙嗗浘
+    openEdition: '',         // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
+    modalStatus: false       // 寮圭獥鏄惁寮�鍚紝鍒ゆ柇ctrl+s鏄惁鍙敤
+  }
+
+  /**
+   * @description 鏁版嵁棰勫鐞�
+   * 1銆佽缃〉闈㈤厤缃俊鎭紝鏂板缓鎴栨棤閰嶇疆淇℃伅鏃讹紙鍒囨崲妯℃澘鍚庢棤閰嶇疆淇℃伅锛夛紝浣跨敤妯℃澘榛樿閰嶇疆
+   * 2銆佽缃搷浣滅被鍨嬨�佸師濮嬭彍鍗曚俊鎭紙姣忔淇濆瓨鍚庨噸缃級銆佸凡浣跨敤琛ㄥ強鍩烘湰淇℃伅琛ㄥ崟
+   */
+  UNSAFE_componentWillMount () {
+    const { config, editTab, editSubTab } = this.props
+
+    let _config = null
+
+    if (!config) {
+      _config = fromJS(Source.baseConfig).toJS()
+      _config.uuid = editSubTab ? editSubTab.linkTab : editTab.linkTab
+      _config.tabName = editSubTab ? editSubTab.label : editTab.label
+      _config.isAdd = true
+    } else {
+      _config = fromJS(config).toJS()
+    }
+    
+    let _oriActions = []
+
+    if (_config.type === 'user') {
+      _config.action = _config.action.map(item => {
+        let uuid = Utils.getuuid()
+
+        if (item.linkTab) {
+          item.linkTab = ''
+        }
+
+        if (item.OpenType === 'pop') { // 鍚湁瀛愰厤缃」鐨勬寜閽�
+          _oriActions.push({
+            prebtn: fromJS(item).toJS(),
+            curuuid: uuid,
+            Template: 'Modal'
+          })
+        }
+
+        item.uuid = uuid
+        return item
+      })
+    }
+
+    let _activeKey =  editSubTab ? editSubTab.activeKey : editTab.activeKey
+
+    // 鐗堟湰鍏煎
+    _config = updateSubTable(_config)
+
+    this.setState({
+      openEdition: editSubTab ? (editSubTab.open_edition || '') : (editTab.open_edition || ''),
+      chartview: _config.charts ? _config.charts[0].uuid : '',
+      originActions: _oriActions,
+      config: _config,
+      activeKey: _activeKey || '0',
+      originConfig: fromJS(_config).toJS(),
+    })
+  }
+
+  /**
+   * @description 鍔犺浇瀹屾垚鍚�
+   * 1銆佽幏鍙栫郴缁熷彲浣跨敤琛�
+   * 2銆佹牴鎹厤缃俊鎭腑宸蹭娇鐢ㄨ〃鑾峰彇鐩稿叧瀛楁淇℃伅
+   */
+  componentDidMount () {
+    this.reloadTab(false)
+    document.onkeydown = (event) => {
+      let e = event || window.event
+      let keyCode = e.keyCode || e.which || e.charCode
+      let preKey = ''
+
+      if (e.ctrlKey) {
+        preKey = 'ctrl'
+      }
+      if (e.shiftKey) {
+        preKey = 'shift'
+      } else if (e.altKey) {
+        preKey = 'alt'
+      }
+      
+      if (!preKey || !keyCode) return
+      
+      let _shortcut = `${preKey}+${keyCode}`
+
+      if (_shortcut === 'ctrl+83') {
+        if (this.state.modalStatus) {
+          notification.warning({
+            top: 92,
+            message: '璇蜂繚瀛�' + this.state.modalStatus,
+            duration: 5
+          })
+          return false
+        }
+
+        let node = document.getElementById('save-config')
+        if (node && node.click) {
+          node.click()
+        }
+        return false
+      }
+    }
+    MKEmitter.addListener('modalStatus', this.modalStatus)
+  }
+
+  /**
+   * @description 鍔犺浇鎴栧埛鏂版爣绛句俊鎭�
+   */
+  reloadTab = (type) => {
+    this.setState({
+      loading: type,
+      tabviews: []
+    })
+    Api.getSystemConfig({func: 'sPC_Get_UserTemp', TypeCharTwo: 'tab'}).then(res => {
+      if (res.status) {
+        let _tabviews = []
+        res.UserTemp.forEach(temp => {
+          let item = {
+            uuid: temp.MenuID,
+            value: temp.MenuID,
+            text: temp.MenuName,
+            type: temp.Template,
+            MenuNo: temp.MenuNo
+          }
+
+          if (this.props.config && temp.MenuID === this.props.config.uuid) return
+
+          _tabviews.push(item)
+        })
+
+        this.setState({
+          loading: false,
+          tabviews: _tabviews
+        })
+
+        if (type) {
+          notification.success({
+            top: 92,
+            message: '鍒锋柊鎴愬姛銆�',
+            duration: 2
+          })
+        }
+      } else {
+        this.setState({
+          loading: false
+        })
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+      }
+    })
+  }
+
+  /**
+   * @description 缁勪欢閿�姣侊紝娓呴櫎state鏇存柊
+   */
+  componentWillUnmount () {
+    this.setState = () => {
+      return
+    }
+    document.onkeydown = () => {}
+    MKEmitter.removeListener('modalStatus', this.modalStatus)
+  }
+
+  modalStatus = (val) => {
+    this.setState({modalStatus: val})
+  }
+
+  // 椤甸潰杩斿洖
+  handleViewBack = () => {
+    const {menu, editTab, tabConfig, editSubTab, btnTab, btnTabConfig} = this.props
+    let _tabview = menu ? menu.LongParam.Template : ''
+    let _subconfig = null
+
+    if (editSubTab) {
+      _subconfig = tabConfig
+      if (editTab.hasOwnProperty('OpenType')) {
+        _tabview = editTab.tabType || 'SubTable'
+      } else {
+        _tabview = editTab.type
+      }
+    } else if (!editSubTab && btnTab) {
+      _tabview = btnTab.tabTemplate
+      _subconfig = btnTabConfig
+    }
+
+    let param = {
+      editMenu: menu,
+      editTab: editSubTab ? editTab : null,
+      tabConfig: null,
+      editSubTab: null,
+      subTabConfig: null,
+      btnTab: btnTab,
+      btnTabConfig: btnTabConfig,
+      editAction: null,
+      subConfig: _subconfig,
+      tabview: _tabview
+    }
+
+    this.state.copyActions.forEach(item => {
+      let _param = {
+        func: 'sPC_MainMenu_Del',
+        MenuID: item
+      }
+      Api.getSystemConfig(_param)
+    })
+
+    this.props.handleView(param)
+  }
+
+  /**
+   * @description 鏍囩椤典繚瀛�
+   */
+  submitConfig = () => {
+    const { delActions, thawButtons, openEdition } = this.state
+    let _config = fromJS(this.state.config).toJS()
+    let copyreg = /\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}$/ig
+
+    // 鍩烘湰淇℃伅楠岃瘉
+    if (!_config.tabName || !_config.tabNo) {
+      notification.warning({
+        top: 92,
+        message: this.state.dict['model.menu.basemsg'],
+        duration: 5
+      })
+      this.setState({activeKey: '0'})
+      return
+    }
+
+    if (copyreg.test(_config.tabNo) || copyreg.test(_config.tabName)) {
+      notification.warning({
+        top: 92,
+        message: '姝ゆ爣绛句负澶嶅埗鏍囩锛岃淇敼鏍囩鍚嶇О鍜屾爣绛惧弬鏁帮紝涓嶅彲浠ユ椂闂存牸寮� YYYY-MM-DD HH:mm:ss 缁撳熬锛�',
+        duration: 5
+      })
+      return
+    }
+
+    if (_config.isAdd) {
+      if (_config.search[0] && _config.search[0].origin) {
+        _config.search = _config.search.filter(item => !item.origin)
+      }
+      if (_config.action[0] && _config.action[0].origin) {
+        _config.action = _config.action.filter(item => !item.origin)
+      }
+      if (_config.columns[0] && _config.columns[0].origin) {
+        _config.columns = _config.columns.filter(item => !item.origin)
+      }
+    }
+
+    if (_config.setting.doubleClick && _config.action.findIndex((item) => item.uuid === _config.setting.doubleClick) === -1) {
+      _config.setting.doubleClick = ''
+    }
+
+    // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负false
+    let result = this.verifyconfig(_config)
+  
+    if (result !== true) {
+      _config.enabled = false
+    }
+
+    if (this.state.closeVisible) { // 鏄剧ず鍏抽棴瀵硅瘽妗嗘椂锛屾ā鎬佹涓繚瀛樻寜閽紝鏄剧ず淇濆瓨涓姸鎬�
+      this.setState({
+        menucloseloading: true
+      })
+    } else {
+      this.setState({
+        menuloading: true
+      })
+    }
+
+    let _LongParam = ''
+    let reload = _config.isAdd
+
+    // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝system 銆乽ser
+    delete _config.type
+    delete _config.isAdd
+
+    try {
+      _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_config)))
+    } catch (e) {
+      notification.warning({
+        top: 92,
+        message: '缂栬瘧閿欒',
+        duration: 5
+      })
+
+      this.setState({
+        menucloseloading: false,
+        menuloading: false
+      })
+      return
+    }
+
+    let btnParam = {
+      func: 'sPC_Button_AddUpt',
+      Type: 40,
+      ParentID: _config.uuid,
+      MenuNo: _config.tabNo,
+      Template: 'SubTable',
+      PageParam: '',
+      LongParam: '',
+      LText: []
+    }
+
+    let btntabs = []
+
+    _config.action.forEach((item, index) => {
+      if (item.hidden === 'true') return
+      if (item.OpenType === 'popview') {
+        btntabs.push(`select '${item.uuid}' as MenuID ,'${item.linkTab}' as Tabid,'${item.label}' as TabName ,'${(index + 1) * 10}' as Sort`)
+      }
+      btnParam.LText.push(`select '${item.uuid}' as menuid, '${item.label}' as menuname, '${(index + 1) * 10}' as Sort`)
+    })
+
+    btnParam.LText = btnParam.LText.join(' union all ')
+    btnParam.LText = Utils.formatOptions(btnParam.LText)
+    btnParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    btnParam.secretkey = Utils.encrypt(btnParam.LText, btnParam.timestamp)
+
+    let tabParam = { // 娣诲姞鏍囩鎸夐挳tab椤�
+      func: 'sPC_sMenusTab_AddUpt',
+      MenuID: _config.uuid,
+      LText: btntabs.join(' union all ')
+    }
+
+    tabParam.LText = Utils.formatOptions(tabParam.LText)
+    tabParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
+
+    let param = {
+      func: 'sPC_Tab_AddUpt',
+      MenuID: _config.uuid,
+      MenuNo: _config.tabNo,
+      Template: 'SubTable',
+      MenuName: _config.tabName,
+      Remark: _config.Remark,
+      Sort: 0,
+      PageParam: JSON.stringify({Template: 'SubTable'}),
+      LongParam: _LongParam
+    }
+
+    if (openEdition) {
+      param.open_edition = openEdition
+    }
+
+    // 鏈夋寜閽垨鏍囩鍒犻櫎鏃讹紝鍏堣繘琛屽垹闄ゆ搷浣�
+    // 鍒犻櫎鎴愬姛鍚庯紝淇濆瓨椤甸潰閰嶇疆
+    new Promise(resolve => {
+      if (delActions.length > 0) {
+        let deffers = delActions.map(item => {
+          let _param = {
+            func: 'sPC_MainMenu_Del',
+            MenuID: item.card.uuid
+          }
+
+          let _ParentParam = null
+
+          try {
+            _ParentParam = window.btoa(window.encodeURIComponent(JSON.stringify(item.card)))
+          } catch (e) {
+            console.warn('Stringify Failure')
+            _ParentParam = null
+          }
+
+          if (_ParentParam) { // 鍒犻櫎鎸夐挳鏃讹紝淇濆瓨鎸夐挳閰嶇疆淇℃伅锛岀敤浜庢仮澶嶆寜閽�
+            _param.ParentParam = _ParentParam
+          }
+
+          return new Promise(resolve => {
+            Api.getSystemConfig(_param).then(response => {
+              resolve(response)
+            })
+          })
+        })
+        Promise.all(deffers).then(result => {
+          let error = null
+          result.forEach(response => {
+            if (!response.status) {
+              error = response
+            }
+          })
+
+          if (error) {
+            this.setState({
+              menuloading: false,
+              menucloseloading: false
+            })
+            notification.warning({
+              top: 92,
+              message: error.message,
+              duration: 5
+            })
+            resolve(false)
+          } else {
+            this.setState({
+              delActions: []
+            })
+            resolve(true)
+          }
+        })
+      } else if (delActions.length === 0) {
+        resolve(true)
+      }
+    }).then(resp => {
+      if (resp === false) return
+
+      if (thawButtons.length > 0) {
+        let defers = thawButtons.map(item => {
+          return new Promise((resolve) => {
+            Api.getSystemConfig({
+              func: 'sPC_MainMenu_ReDel',
+              MenuID: item
+            }).then(res => {
+              if (res.status) {
+                resolve('')
+              } else {
+                resolve(res.message)
+              }
+            })
+          })
+        })
+
+        return Promise.all(defers)
+      } else {
+        return true
+      }
+    }).then(res => {
+      if (res === true || res === false) return res
+
+      let msg = res.filter(Boolean)[0]
+      if (msg) {
+        notification.warning({
+          top: 92,
+          message: msg,
+          duration: 5
+        })
+        return false
+      } else {
+        this.setState({
+          thawButtons: []
+        })
+        return true
+      }
+    }).then(resp => {
+      if (resp === false) return
+
+      Api.getSystemConfig(param).then(response => {
+        if (response.status) {
+          this.setState({
+            openEdition: response.open_edition || '',
+            config: _config,
+            originConfig: fromJS(_config).toJS()
+          }, () => {
+            reload && MKEmitter.emit('revert')
+            this.setState({
+              menuloading: false,
+              menucloseloading: false
+            })
+            this.submitAction(btnParam, tabParam)
+          })
+        } else {
+          this.setState({
+            menuloading: false,
+            menucloseloading: false
+          })
+          notification.warning({
+            top: 92,
+            message: response.message,
+            duration: 5
+          })
+        }
+      })
+    })
+  }
+
+  /**
+   * @description 淇濆瓨鎴栦慨鏀硅彍鍗曟寜閽�
+   */
+  submitAction = (btnParam, tabParam) => {
+    const { config } = this.state
+
+    new Promise(resolve => {
+      let deffers = []
+
+      if (tabParam.LText) {
+        let defer = new Promise(resolve => {
+          Api.getSystemConfig(tabParam).then(result => {
+            resolve(result)
+          })
+        })
+        deffers.push(defer)
+      }
+
+      if (btnParam.LText) {
+        let defer = new Promise(resolve => {
+          Api.getSystemConfig(btnParam).then(result => {
+            if (result.status) {
+              this.setState({ // 淇濆瓨鎴愬姛鍚庢竻绌哄鍒跺垪琛�
+                copyActions: []
+              })
+            }
+            resolve(result)
+          })
+        })
+        deffers.push(defer)
+      }
+
+      if (deffers.length === 0) {
+        resolve(true)
+      } else {
+        Promise.all(deffers).then(result => {
+          let error = false
+          result.forEach(res => {
+            if (!res.status) {
+              error = res
+            }
+          })
+
+          if (error) {
+            notification.warning({
+              top: 92,
+              message: error.message,
+              duration: 5
+            })
+            resolve(false)
+          } else {
+            resolve(true)
+          }
+        })
+      }
+    }).then(response => {
+      if (response === false) return response
+
+      let oriActions = []
+      this.state.originActions.forEach(item => {
+        let curBtn = config.action.filter(cell => item.curuuid === cell.uuid)[0] // 鏌ョ湅鍒濆鍖栨寜閽槸鍚﹀瓨鍦�
+        if (!curBtn) return
+        if (curBtn.OpenType !== item.prebtn.OpenType) return
+        if (curBtn.OpenType === 'funcbutton' && curBtn.execMode !== 'pop') return
+
+        oriActions.push({
+          prebtn: item.prebtn,
+          curBtn: curBtn
+        })
+      })
+
+      if (oriActions.length === 0) return 'true'
+
+      oriActions.forEach(action => {
+        Api.getSystemConfig({
+          func: 'sPC_Get_LongParam',
+          MenuID: action.prebtn ? action.prebtn.uuid : ''
+        }).then(result => {
+          if (result.status && result.LongParam) {
+            let _LongParam = ''
+  
+            if (result.LongParam) {
+              try {
+                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
+              } catch (e) {
+                console.warn('Parse Failure')
+                _LongParam = ''
+              }
+            }
+
+            if (_LongParam) {
+              let param = {
+                func: 'sPC_ButtonParam_AddUpt',
+                ParentID: config.uuid,
+                MenuID: action.curBtn.uuid,
+                MenuNo: config.tabNo,
+                Template: _LongParam.type,
+                MenuName: action.curBtn.label,
+                PageParam: JSON.stringify({Template: _LongParam.type}),
+                LongParam: result.LongParam
+              }
+              Api.getSystemConfig(param).then(() => {})
+            }
+          }
+        })
+      })
+      return 'true'
+    }).then(response => {
+      if (response === 'true') {
+        notification.success({
+          top: 92,
+          message: '淇濆瓨鎴愬姛',
+          duration: 2
+        })
+        if (this.state.closeVisible) {
+          this.handleViewBack()
+        } else {
+          this.setState({
+            menuloading: false,
+            menucloseloading: false
+          })
+        }
+      } else {
+        this.setState({
+          menuloading: false,
+          menucloseloading: false
+        })
+      }
+    })
+  }
+
+  cancelConfig = () => {
+    const { config, originConfig } = this.state
+
+    let _this = this
+
+    if (originConfig.isAdd) {
+      confirm({
+        content: '鑿滃崟灏氭湭鎻愪氦锛岀‘瀹氭斁寮冧繚瀛樺悧锛�',
+        onOk() {
+          _this.handleViewBack()
+        },
+        onCancel() {}
+      })
+    } else {
+      if (!is(fromJS(originConfig), fromJS(config))) {
+        this.setState({
+          closeVisible: true
+        })
+      } else {
+        this.handleViewBack()
+      }
+    }
+  }
+
+  /**
+   * @description 璁剧疆鍙厤缃寜閽�
+   */
+  setSubConfig = (btn) => {
+    const {menu, editTab, tabConfig, editSubTab, btnTab, btnTabConfig} = this.props
+    const { config, originConfig, activeKey, openEdition } = this.state
+
+    if (originConfig.isAdd) {
+      notification.warning({
+        top: 92,
+        message: '鑿滃崟灏氭湭淇濆瓨锛岃淇濆瓨鑿滃崟閰嶇疆锛�',
+        duration: 5
+      })
+    } else {
+      if (!is(fromJS(originConfig), fromJS(config))) {
+        notification.warning({
+          top: 92,
+          message: '鑿滃崟閰嶇疆宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
+          duration: 5
+        })
+      } else {
+        // 瀛愯彍鍗曚俊鎭獙璇侀�氳繃鍚庯紝璺宠浆瀛愭寜閽厤缃〉闈�
+        let _view = ''
+        let _subtab = editSubTab
+
+        if (btn.OpenType === 'pop' || btn.execMode === 'pop') {
+          _view = 'Modal'      // 琛ㄥ崟椤甸潰
+        } else if (btn.OpenType === 'popview') {
+          _view = 'SubTable'   // 鏂板脊绐楁爣绛炬ā鏉� tabType 灞炴�у凡鍘婚櫎
+          _subtab = btn
+
+          if (editSubTab) {
+            notification.warning({
+              top: 92,
+              message: '寮圭獥(鏍囩)涓笉鏀寔姝ゆ寜閽墦寮�鏂瑰紡锛�',
+              duration: 5
+            })
+            return
+          }
+        }
+
+        if (editSubTab) {
+          editSubTab.activeKey = activeKey
+          editSubTab.open_edition = openEdition  // 鏇存柊鐗堟湰鍙�
+        } else {
+          editTab.activeKey = activeKey
+          editTab.open_edition = openEdition     // 鏇存柊鐗堟湰鍙�
+        }
+
+        let param = {
+          editMenu: menu,
+          editTab: editTab,
+          tabConfig: editSubTab ? tabConfig : originConfig,
+          editSubTab: _subtab,
+          subTabConfig: editSubTab ? originConfig : null,
+          btnTab: btnTab,
+          btnTabConfig: btnTabConfig,
+          editAction: btn,
+          subConfig: '',
+          tabview: _view
+        }
+
+        this.setState({
+          loading: true
+        })
+
+        Api.getSystemConfig({
+          func: 'sPC_Get_LongParam',
+          MenuID: btn.OpenType === 'popview' ? btn.linkTab : btn.uuid
+        }).then(res => {
+          if (res.status) {
+            this.setState({
+              loading: false
+            })
+            let _LongParam = ''
+            if (res.LongParam) {
+              try {
+                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+              } catch (e) {
+                console.warn('Parse Failure')
+                _LongParam = ''
+              }
+            }
+
+            if (_LongParam && param.tabview === 'Modal' && _LongParam.type === 'Modal') {
+              param.subConfig = _LongParam
+            } else if (_LongParam && param.tabview === 'SubTable' && _LongParam.Template === 'SubTable') {
+              param.subConfig = _LongParam
+            }
+
+            if (param.editAction) {
+              param.editAction.open_edition = res.open_edition || ''
+            } else if (param.editSubTab) {
+              param.editSubTab.open_edition = res.open_edition || ''
+            }
+
+            this.props.handleView(param)
+          } else {
+            this.setState({
+              loading: false
+            })
+            notification.warning({
+              top: 92,
+              message: res.message,
+              duration: 5
+            })
+          }
+        })
+      }
+    }
+  }
+
+  /**
+   * @description 鍒囨崲鏍囩鏄惁鍚敤
+   */
+  onEnabledChange = () => {
+    const { config } = this.state
+
+    let _enabled = !config.enabled
+    let result = this.verifyconfig(config)
+
+    if (_enabled && result !== true) {
+      notification.warning({
+        top: 92,
+        message: result,
+        duration: 5
+      })
+      return
+    }
+
+    this.setState({
+      config: {...config, enabled: _enabled}
+    })
+  }
+
+  /**
+   * @description 鏍¢獙閰嶇疆淇℃伅鐨勫悎娉曟��
+   */
+  verifyconfig = (config) => {
+    let hasKey = false
+    let chartcols = []
+    config.columns.forEach(col => {
+      if (col.field) {
+        chartcols.push(col.field)
+      }
+      if (config.setting.primaryKey === col.field) {
+        hasKey = true
+      }
+    })
+
+    let chartError = ''
+    config.charts && config.charts.forEach((chart, index) => {
+      if (chartError) return
+      if (chart.Hide === 'true') return
+      if (!['line', 'bar', 'pie'].includes(chart.chartType)) return
+
+      if (!chart.Xaxis) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && (!chart.Yaxis || chart.Yaxis.length === 0)) { // query 鏌ヨ鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chart.InfoType || !chart.InfoValue)) { // statistics 缁熻鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (chart.chartType === 'pie' && !chart.Yaxis) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛皻鏈缃紝涓嶅彲鍚敤锛乣
+      } else if (!chartcols.includes(chart.Xaxis)) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (chart.chartType === 'pie' && !chartcols.includes(chart.Yaxis)) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype === 'statistics' && (!chartcols.includes(chart.InfoType) || !chartcols.includes(chart.InfoValue))) { // statistics 缁熻鏁版嵁
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      } else if (['line', 'bar'].includes(chart.chartType) && chart.datatype !== 'statistics' && chart.Yaxis.filter(yaxis => !chartcols.includes(yaxis)).length > 0) {
+        chartError = `鍥捐〃${chart.title ? '銆�' + chart.title + '銆�' : index + 1}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      }
+    })
+
+    config.action && config.action.forEach((btn) => {
+      if (['prompt', 'exec', 'pop'].includes(btn.OpenType) && btn.Ot === 'required' && btn.verify && btn.verify.scripts && btn.verify.scripts.length > 0) {
+        let hascheck = false
+        btn.verify.scripts.forEach(item => {
+          if (item.status === 'false') return
+    
+          if (/\$check@|@check\$/ig.test(item.sql)) {
+            hascheck = true
+          }
+        })
+        if (hascheck) {
+          notification.warning({
+            top: 92,
+            message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
+            duration: 5
+          })
+        }
+      }
+    })
+
+    if ((config.setting.interType === 'system' || config.setting.requestMode === 'system') && config.setting.default === 'false' && config.setting.scripts && config.setting.scripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愪腑涓嶆墽琛岄粯璁ql锛屼笖鏈坊鍔犺嚜瀹氫箟鑴氭湰锛屼笉鍙惎鐢紒'
+    } else if (config.setting.interType === 'custom' && config.setting.procMode !== 'inner' && config.setting.preScripts && config.setting.preScripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愭湭璁剧疆鍓嶇疆鑴氭湰锛屼笉鍙惎鐢紒'
+    } else if (config.setting.interType === 'custom' && config.setting.callbackType === 'script' && config.setting.cbScripts && config.setting.cbScripts.filter(item => item.status !== 'false').length === 0) {
+      return '鏁版嵁婧愭湭璁剧疆鍥炶皟鑴氭湰锛屼笉鍙惎鐢紒'
+    } else if (!config.setting.primaryKey) {
+      return '灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒'
+    }  else if (config.columns.length === 0) {
+      return '灏氭湭璁剧疆鏄剧ず鍒楋紝涓嶅彲鍚敤锛�'
+    } else if (!hasKey) {
+      return '鏄剧ず鍒椾腑涓嶅瓨鍦ㄤ富閿瓧娈碉紝涓嶅彲鍚敤锛�'
+    } else if (chartError) {
+      return chartError
+    } else {
+      return true
+    }
+  }
+
+  /**
+   * @description 缂栬緫鍔熻兘瀹屾垚鏇存柊锛屽寘鎷В鍐绘寜閽瓑
+   */
+  updateConfig = (res) => {
+    this.setState({
+      thawButtons: res.thawButtons,
+      config: res.config
+    })
+  }
+
+  /**
+   * @description 鏇存柊鎼滅储鏉′欢閰嶇疆淇℃伅
+   */
+  updatesearch = (config) => {
+
+    this.setState({
+      config: config
+    })
+  }
+
+  /**
+   * @description 鏇存柊鎸夐挳閰嶇疆淇℃伅
+   */
+  updateaction = (config, copyId, delcard) => {
+    const { copyActions, delActions } = this.state
+
+    this.setState({
+      config: config,
+      copyActions: copyId ? [...copyActions, copyId] : copyActions,
+      delActions: delcard ? [...delActions, delcard] : delActions
+    })
+  }
+
+  /**
+   * @description 鏇存柊鏄剧ず鍒楅厤缃俊鎭�
+   */
+  updateconfig = (config) => {
+    this.setState({
+      config: config
+    })
+  }
+
+  /**
+   * @description 鏇存柊鍥捐〃缁勯厤缃俊鎭�
+   */
+  updatechartgroup = (config, _chartview) => {
+    this.setState({
+      config: config,
+      chartview: _chartview
+    })
+  }
+
+  
+  refreshConfig = () => {
+    const { config } = this.props
+    
+    let param = {
+      func: 'sPC_Get_LongParam',
+      MenuID: config.uuid
+    }
+
+    Api.getSystemConfig(param).then(res => {
+      if (res.status) {
+        let _config = ''
+        if (res.LongParam) {
+          try {
+            _config = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
+          } catch (e) {
+            console.warn('Parse Failure')
+            _config = ''
+          }
+        }
+
+        if (!_config) {
+          notification.warning({
+            top: 92,
+            message: '鏈幏鍙栧埌閰嶇疆淇℃伅锛�',
+            duration: 5
+          })
+          return
+        }
+
+        // 鐗堟湰鍏煎
+        _config = updateSubTable(_config)
+
+        this.setState({
+          config: null
+        }, () => {
+          this.setState({
+            chartview: _config.charts ? _config.charts[0].uuid : '',
+            config: _config,
+            openEdition: res.open_edition || '',
+            activeKey: '0',
+            originActions: [],
+            originConfig: fromJS(_config).toJS()
+          })
+        })
+      } else {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+      }
+    })
+  }
+
+  render () {
+    const { config } = this.state
+
+    return (
+      <div className="model-subtable-board">
+        <DndProvider backend={HTML5Backend}>
+          <SettingComponent
+            config={config}
+            mainsearch={!this.props.editSubTab && this.props.editTab.mainsearch ? this.props.editTab.mainsearch : ''}
+            MenuID={config.uuid}
+            updatesetting={this.updateconfig}
+          />
+          <SearchComponent
+            config={config}
+            updatesearch={this.updatesearch}
+          />
+          <ActionComponent
+            type="subtable"
+            menu={{MenuID: config.uuid, MenuName: config.tabName, MenuNo: config.tabNo, fstMenuList: this.props.menu.fstMenuList}}
+            config={config}
+            tabs={this.state.tabviews}
+            setSubConfig={this.setSubConfig}
+            updateaction={this.updateaction}
+          />
+          <ColumnComponent
+            config={config}
+            menu={this.props.menu}
+            updatecolumn={this.updateconfig}
+          />
+        </DndProvider>
+      </div>
+    )
+  }
+}
+
+export default TableConfig
diff --git a/src/views/tabledesign/tableconfig/index.scss b/src/views/tabledesign/tableconfig/index.scss
new file mode 100644
index 0000000..0adcbba
--- /dev/null
+++ b/src/views/tabledesign/tableconfig/index.scss
@@ -0,0 +1,203 @@
+.model-subtable-board {
+  position: fixed;
+  z-index: 1;
+  padding-top: 48px;
+  top: 0px;
+  left: 0px;
+  right: 0px;
+  bottom: 0px;
+  background: rgba(0, 0, 0, 0.35);
+  display: flex;
+  .tools {
+    flex: 1;
+    background: #ffffff;
+    border-right: 1px solid #d9d9d9;
+    height: 100%;
+    overflow-y: hidden;
+    padding-bottom: 30px;
+    .ant-collapse-borderless {
+      background-color: #ffffff;
+    }
+    .ant-collapse-item {
+      position: relative;
+      border: 0;
+    }
+    .ant-input-search {
+      margin-top: 10px;
+    }
+    .ant-collapse-item.ant-collapse-item-active {
+      border-bottom: 1px solid #d9d9d9;
+    }
+    .ant-collapse .ant-collapse-header {
+      padding: 11px 16px 10px 40px;
+      border-bottom: 1px solid #d9d9d9;
+      background: #1890ff;
+      color: #ffffff;
+    }
+    .ant-collapse-content-box {
+      .ant-form-item {
+        margin-bottom: 10px;
+        .ant-form-item-label {
+          text-align: left;
+          height: 25px;
+          line-height: 25px;
+        }
+      }
+    }
+    .search-element {
+      padding-top: 10px;
+      li {
+        padding: 0px 16px 10px;
+        div {
+          cursor: move;
+        }
+      }
+    }
+    .config-btn {
+      position: relative;
+
+      .config-btn-title {
+        margin-top: 20px;
+        margin-bottom: 10px;
+        color: #1890ff;
+        border-bottom: 1px solid #e8e8e8;
+      }
+    }
+    .ant-list {
+      margin-top: 20px;
+      .ant-list-item {
+        display: -webkit-box;
+        padding-right: 20px;
+        position: relative;
+        padding-left: 5px;
+        overflow: hidden;
+        text-overflow: ellipsis;
+        -webkit-line-clamp: 2;
+        -webkit-box-orient: vertical;
+        min-height: 55px;
+        width: 100%;
+        .anticon {
+          position: absolute;
+          top: 0px;
+          right: 0px;
+          padding: 3px 3px 10px 10px;
+          cursor: pointer;
+        }
+        .bottom-mask {
+          position: absolute;
+          width: 100%;
+          height: 8px;
+          bottom: 0;
+          left: 0;
+          background: #ffffff;
+          border-radius: 8px;
+        }
+      }
+    }
+    .config-button {
+      min-width: 65px;
+    }
+  }
+  .tools {
+    overflow-y: auto;
+  }
+  .tools::-webkit-scrollbar {
+    width: 4px;
+  }
+  .tools::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.08);
+    background: rgba(0, 0, 0, 0.08);
+  }
+  .tools::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
+
+  .setting {
+    position: relative;
+    width: calc(100vw - 235px);
+    height: 100%;
+    background: #ffffff;
+    .ant-switch.big {
+      min-width: 60px;
+      height: 28px;
+      line-height: 28px;
+      margin-top: -2px;
+      .ant-switch-inner {
+        font-size: 14px;
+      }
+    }
+    .ant-switch.big::after {
+      width: 24px;
+      height: 24px;
+    }
+    .ant-card-head {
+      min-height: 44px;
+    }
+    .ant-card-head-title {
+      padding: 5px 0;
+      color: #1890ff;
+    }
+    .ant-card-extra {
+      padding: 5px 0;
+      button {
+        margin-left: 20px;
+      }
+    }
+    .ant-card-body {
+      position: relative;
+      padding: 0;
+      
+      .chart-view {
+        margin-bottom: 70px;
+
+        .chart-title {
+          position: relative;
+          color: rgba(0, 0, 0, 0.65);
+          font-weight: 400;
+          font-size: 16px;
+          text-overflow: ellipsis;
+          white-space: nowrap;
+          overflow: hidden;
+          margin: 0 20px;
+          padding: 10px 5px 5px;
+        }
+      }
+      > .anticon-setting {
+        position: absolute;
+        font-size: 18px;
+        right: 7px;
+        top: 10px;
+      }
+    }
+  }
+  .setting {
+    overflow-y: scroll;
+  }
+  .setting::-webkit-scrollbar {
+    width: 7px;
+  }
+  .setting::-webkit-scrollbar-thumb {
+    border-radius: 5px;
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.13);
+    background: rgba(0, 0, 0, 0.13);
+    display: none;
+  }
+  .setting::-webkit-scrollbar-track {
+    box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05);
+    border-radius: 3px;
+    border: 1px solid rgba(0, 0, 0, 0.07);
+    background: rgba(0, 0, 0, 0);
+  }
+  .setting:hover::-webkit-scrollbar-thumb {
+    display: block;
+  }
+  .ant-spin {
+    position: absolute;
+    margin-left: calc(50vw - 22px);
+    margin-top: 30vh;
+  }
+}
diff --git a/src/views/tabledesign/tableconfig/menuform/index.jsx b/src/views/tabledesign/tableconfig/menuform/index.jsx
new file mode 100644
index 0000000..72f493f
--- /dev/null
+++ b/src/views/tabledesign/tableconfig/menuform/index.jsx
@@ -0,0 +1,116 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import { is, fromJS } from 'immutable'
+import { Form, Row, Col, Input } from 'antd'
+import { formRule } from '@/utils/option.js'
+import './index.scss'
+
+const { TextArea } = Input
+
+class MainSearch extends Component {
+  static propTpyes = {
+    dict: PropTypes.object, // 瀛楀吀椤�
+    config: PropTypes.object,
+    updatemenu: PropTypes.func
+  }
+
+  changeName = (e) => {
+    let value = e.target.value || ''
+    if (value.length > 100) return
+
+    this.setState({}, () => {
+      this.props.updatemenu({...this.props.config, tabName: value})
+    })
+  }
+
+  changeNo = (e) => {
+    let value = e.target.value || ''
+    if (value.length > 100) return
+    this.setState({}, () => {
+      this.props.updatemenu({...this.props.config, tabNo: value})
+    })
+  }
+
+  changeRemark = (e) => {
+    let value = e.target.value || ''
+    if (value.length > 100) return
+    this.setState({}, () => {
+      this.props.updatemenu({...this.props.config, Remark: value})
+    })
+  }
+
+  shouldComponentUpdate (nextProps, nextState) {
+    return is(fromJS(this.props), fromJS(nextProps))
+  }
+
+  render() {
+    const { dict, config } = this.props
+    const { getFieldDecorator } = this.props.form
+    const formItemLayout = {
+      labelCol: {
+        xs: { span: 24 },
+        sm: { span: 24 }
+      },
+      wrapperCol: {
+        xs: { span: 24 },
+        sm: { span: 24 }
+      }
+    }
+
+    return (
+      <Form {...formItemLayout} className="ant-advanced-search-form" id="subqazxcvbn">
+        <Row gutter={24}>
+          <Col span={24}>
+            <Form.Item label="椤甸潰鍚嶇О">
+              {getFieldDecorator('tabName', {
+                initialValue: config.tabName,
+                rules: [
+                  {
+                    required: true,
+                    message: dict['form.required.input'] + '椤甸潰鍚嶇О!'
+                  },
+                  {
+                    max: formRule.input.max,
+                    message: formRule.input.message
+                  }
+                ]
+              })(<Input placeholder="" autoComplete="off" onChange={this.changeName}/>)}
+            </Form.Item>
+          </Col>
+          <Col span={24}>
+            <Form.Item label={dict['model.menu'] + dict['model.param']}>
+              {getFieldDecorator('tabNo', {
+                initialValue: config.tabNo,
+                rules: [
+                  {
+                    required: true,
+                    message: dict['form.required.input'] + dict['model.menu'] + dict['model.param'] + '!'
+                  },
+                  {
+                    max: formRule.input.max,
+                    message: formRule.input.message
+                  }
+                ]
+              })(<Input placeholder="" autoComplete="off" onChange={this.changeNo}/>)}
+            </Form.Item>
+          </Col>
+          <Col span={24}>
+            <Form.Item label={dict['header.menu.Remark']}>
+              {getFieldDecorator('Remark', {
+                initialValue: config.Remark,
+                rules: [
+                  {
+                    max: formRule.input.max,
+                    message: formRule.input.message
+                  }
+                ]
+              })(<TextArea rows={2} placeholder="" autoComplete="off" onChange={this.changeRemark}/>)}
+            </Form.Item>
+          </Col>
+        </Row>
+      </Form>
+    )
+  }
+}
+
+export default Form.create()(MainSearch)
\ No newline at end of file
diff --git a/src/views/tabledesign/tableconfig/menuform/index.scss b/src/views/tabledesign/tableconfig/menuform/index.scss
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/views/tabledesign/tableconfig/menuform/index.scss
diff --git a/src/views/tabledesign/tableconfig/source.jsx b/src/views/tabledesign/tableconfig/source.jsx
new file mode 100644
index 0000000..bb48d97
--- /dev/null
+++ b/src/views/tabledesign/tableconfig/source.jsx
@@ -0,0 +1,339 @@
+import Utils from '@/utils/utils.js'
+import zhCN from '@/locales/zh-CN/model.js'
+import enUS from '@/locales/en-US/model.js'
+
+const CommonDict = sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS
+
+class SubTableBaseData {
+  baseConfig = {
+    version: '1.0',
+    type: 'system',
+    Template: 'SubTable',
+    enabled: false,
+    tabName: '',
+    tabNo: '',
+    Remark: '',
+    uuid: Utils.getuuid(),
+    setting: {
+      tableName: '',
+      tableType: 'checkbox',
+      primaryKey: '',
+      order: '',
+      dataresource: '',
+      interType: 'system',
+      innerFunc: '',
+      interface: '',
+      outerFunc: ''
+    },
+    tables: [],
+    search: [
+      {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'label',
+        field: '',
+        initval: '',
+        type: 'text',
+        resourceType: '0',
+        options: [],
+        orderType: 'asc',
+        match: 'like',
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'label',
+        field: '',
+        initval: '',
+        type: 'select',
+        resourceType: '0',
+        options: [],
+        orderType: 'asc',
+        match: 'equal',
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'label',
+        field: '',
+        initval: '',
+        type: 'date',
+        resourceType: '0',
+        options: [],
+        orderType: 'asc',
+        match: 'greater',
+      }
+    ],
+    action: [
+      {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'add',
+        intertype: 'system',
+        Ot: 'notRequired',
+        position: 'toolbar',
+        execSuccess: 'grid',
+        execError: 'never',
+        OpenType: 'pop',
+        icon: 'plus',
+        class: 'green',
+        verify: null
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'update',
+        intertype: 'system',
+        Ot: 'requiredSgl',
+        position: 'grid',
+        execSuccess: 'grid',
+        execError: 'never',
+        OpenType: 'pop',
+        icon: 'form',
+        class: 'purple',
+        verify: null
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        label: 'delete',
+        intertype: 'system',
+        Ot: 'required',
+        position: 'toolbar',
+        execSuccess: 'grid',
+        execError: 'never',
+        OpenType: 'prompt',
+        icon: 'delete',
+        class: 'red',
+        verify: null
+      }
+    ],
+    columns: [
+      {
+        origin: true,
+        uuid: Utils.getuuid(),
+        Align: 'left',
+        label: 'label',
+        field: '',
+        Hide: 'false',
+        IsSort: 'true',
+        type: 'text',
+        Width: 120
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        Align: 'left',
+        label: 'label',
+        field: '',
+        Hide: 'false',
+        IsSort: 'true',
+        type: 'text',
+        Width: 120
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        Align: 'left',
+        label: 'label',
+        field: '',
+        Hide: 'false',
+        IsSort: 'true',
+        type: 'text',
+        Width: 120
+      }, {
+        origin: true,
+        uuid: Utils.getuuid(),
+        Align: 'left',
+        label: 'label',
+        field: '',
+        Hide: 'false',
+        IsSort: 'true',
+        type: 'text',
+        Width: 120
+      }
+    ],
+    gridBtn: {
+      display: false,
+      Align: 'center',
+      IsSort: 'false',
+      uuid: Utils.getuuid(),
+      label: CommonDict['model.operation'],
+      type: 'action',
+      style: 'button',
+      show: 'horizontal',
+      Width: 120
+    },
+    expand: false,
+    charts: [{
+      uuid: Utils.getuuid(),
+      label: '',
+      title: '',
+      chartType: 'table',
+      icon: 'table',
+      Hide: 'false',
+      blacklist: []
+    }]
+  }
+
+  searchItems = [
+    {
+      type: 'search',
+      label: CommonDict['model.form.text'],
+      subType: 'text',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.select'],
+      subType: 'select',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.multiselect'],
+      subType: 'multiselect',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.link'],
+      subType: 'link',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: '閫夐」鍗�',
+      subType: 'checkcard',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: '鏃ユ湡锛堝ぉ锛�',
+      subType: 'date',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: '鏃ユ湡锛堝懆锛�',
+      subType: 'dateweek',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.datemonth'],
+      subType: 'datemonth',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.daterange'],
+      subType: 'daterange',
+      url: ''
+    },
+    {
+      type: 'search',
+      label: CommonDict['model.form.dategroup'],
+      subType: 'group',
+      url: ''
+    }
+  ]
+
+  actionItems = [
+    {
+      type: 'action',
+      label: CommonDict['model.form.popform'],
+      subType: 'pop',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.prompt'],
+      subType: 'prompt',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.exec'],
+      subType: 'exec',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.excelIn'],
+      subType: 'excelIn',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.excelOut'],
+      subType: 'excelOut',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.popview'],
+      subType: 'popview',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.tab'],
+      subType: 'tab',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.newpage'],
+      subType: 'innerpage',
+      url: ''
+    },
+    {
+      type: 'action',
+      label: CommonDict['model.form.funcbutton'],
+      subType: 'funcbutton',
+      url: ''
+    }
+  ]
+
+  columnItems = [
+    {
+      type: 'columns',
+      label: CommonDict['model.form.text'],
+      subType: 'text',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: CommonDict['model.form.picture'],
+      subType: 'picture',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: CommonDict['model.form.number'],
+      subType: 'number',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: CommonDict['model.form.href'],
+      subType: 'link',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: CommonDict['model.form.textarea'],
+      subType: 'textarea',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: CommonDict['model.form.colspan'],
+      subType: 'colspan',
+      url: ''
+    },
+    {
+      type: 'columns',
+      label: '搴忓彿',
+      subType: 'index',
+      url: ''
+    }
+  ]
+}
+
+export default new SubTableBaseData()

--
Gitblit v1.8.0