From e36eb1999794bd71e76482b92a0b0b20f49d0032 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期五, 05 三月 2021 19:37:03 +0800
Subject: [PATCH] 2021-03-05

---
 src/templates/subtableconfig/index.jsx | 2675 ++++++++++++++---------------------------------------------
 1 files changed, 635 insertions(+), 2,040 deletions(-)

diff --git a/src/templates/subtableconfig/index.jsx b/src/templates/subtableconfig/index.jsx
index 4cb409d..d3bda26 100644
--- a/src/templates/subtableconfig/index.jsx
+++ b/src/templates/subtableconfig/index.jsx
@@ -4,45 +4,39 @@
 import { is, fromJS } from 'immutable'
 import { DndProvider } from 'react-dnd'
 import HTML5Backend from 'react-dnd-html5-backend'
-import { Button, Card, Modal, Collapse, notification, Spin, Select, List, Icon, Empty, Switch, Tooltip } from 'antd'
+import { Button, Card, Modal, Collapse, notification, Spin, Icon, Switch, Tooltip, Col } from 'antd'
 import moment from 'moment'
 
 import Api from '@/api'
-import zhCN from '@/locales/zh-CN/comtable.js'
-import enUS from '@/locales/en-US/comtable.js'
+import zhCN from '@/locales/zh-CN/model.js'
+import enUS from '@/locales/en-US/model.js'
 import Utils from '@/utils/utils.js'
-import { getSearchForm, getActionForm, getColumnForm } from '@/templates/zshare/formconfig'
-import { queryTableSql } from '@/utils/option.js'
+import { updateSubTable } from '@/utils/utils-update.js'
 
-import ActionForm from './actionform'
-import SettingForm from './settingform'
-import SearchForm from '@/templates/zshare/searchform'
-import ColumnForm from '@/templates/zshare/columnform'
-import DragElement from '@/templates/zshare/dragelement'
-import PasteForm from '@/templates/zshare/pasteform'
-import ColspanForm from '@/templates/zshare/colspanform'
-import GridBtnForm from '@/templates/zshare/gridbtnform'
-import EditCard from '@/templates/zshare/editcard'
-import VerifyCard from '@/templates/zshare/verifycard'
-import VerifyCardExcelIn from '@/templates/zshare/verifycardexcelin'
-import VerifyCardExcelOut from '@/templates/zshare/verifycardexcelout'
-import MenuForm from '@/templates/zshare/menuform'
-import TransferForm from '@/components/transferform'
-import SourceElement from '@/templates/zshare/dragelement/source'
-import CreateFunc from '@/templates/zshare/createfunc'
-import CreateInterface from '@/templates/zshare/createinterface'
+import asyncComponent from '@/utils/asyncComponent'
+import SearchComponent from '@/templates/sharecomponent/searchcomponent'
+import ActionComponent from '@/templates/sharecomponent/actioncomponent'
+import ColumnComponent from '@/templates/sharecomponent/columncomponent'
+
+import MenuForm from './menuform'
+import SourceElement from '@/templates/zshare/dragsource'
 import Source from './source'
 import './index.scss'
 
 const { Panel } = Collapse
-const { Option } = Select
 const { confirm } = Modal
-const CommonDict = (!localStorage.getItem('lang') || localStorage.getItem('lang') === 'zh-CN') ? zhCN : enUS
+
+const EditComponent = asyncComponent(() => import('@/templates/zshare/editcomponent'))
+const SettingComponent = asyncComponent(() => import('@/templates/sharecomponent/settingcomponent'))
+const TableComponent = asyncComponent(() => import('@/templates/sharecomponent/tablecomponent'))
+const FieldsComponent = asyncComponent(() => import('@/templates/sharecomponent/fieldscomponent'))
+const ChartGroupComponent = asyncComponent(() => import('@/templates/sharecomponent/chartgroupcomponent'))
+const ChartComponent = asyncComponent(() => import('@/templates/sharecomponent/chartcomponent'))
+const CardComponent = asyncComponent(() => import('@/templates/sharecomponent/cardcomponent'))
 
 class SubTableConfig extends Component {
   static propTpyes = {
     menu: PropTypes.any,
-    optionLibs: PropTypes.any,
     editTab: PropTypes.any,
     tabConfig: PropTypes.any,
     editSubTab: PropTypes.any,
@@ -53,38 +47,22 @@
   }
 
   state = {
-    dict: CommonDict,        // 瀛楀吀
+    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,        // 瀛楀吀
     config: null,            // 椤甸潰閰嶇疆
     visible: false,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪锛屾ā鎬佹鏄剧ず鎺у埗
-    modalTitle: '',          // 妯℃�佹鐨勬爣棰�
-    tableVisible: false,     // 鏁版嵁琛ㄥ瓧娈垫ā鎬佹
-    addType: '',             // 娣诲姞绫诲瀷-鎼滅储鏉′欢鎴栨樉绀哄垪
-    tableColumns: [],        // 琛ㄦ牸鏄剧ず鍒�
-    fields: null,            // 鎼滅储鏉′欢鍙婃樉绀哄垪锛屽彲閫夊瓧娈�
-    menuformlist: null,      // 鍩烘湰淇℃伅琛ㄥ崟瀛楁
-    formlist: null,          // 鎼滅储鏉′欢銆佹寜閽�佹樉绀哄垪琛ㄥ崟瀛楁
-    formtemp: '',            // 琛ㄥ崟绫诲瀷锛屾樉绀哄垪銆佹寜閽�佹悳绱㈡潯浠�
-    modaltype: '',           // 妯℃�佹绫诲瀷锛屾帶鍒舵ā鎬佹鏄剧ず
-    card: null,              // 缂栬緫鍏冪礌
     menuloading: false,      // 鑿滃崟淇濆瓨涓�
     menucloseloading: false, // 鑿滃崟鍏抽棴鏃讹紝閫夋嫨淇濆瓨
     loading: false,          // 鍔犺浇涓紝椤甸潰spin
-    settingVisible: false,   // 鍏ㄥ眬閰嶇疆妯℃�佹
     closeVisible: false,     // 鍏抽棴妯℃�佹
-    tables: [],              // 鍙敤琛ㄥ悕
-    selectedTables: [],      // 宸查�夎〃鍚�
     originConfig: null,      // 鍘熼厤缃�
     originActions: null,     // 鍘熷鎸夐挳淇℃伅锛屼娇鐢ㄥ凡鏈夌敤鎴锋ā鏉�
     delActions: [],          // 鍒犻櫎鎸夐挳鍒楄〃
     copyActions: [],         // 澶嶅埗鎸夐挳缁�
-    showColumnName: false,   // 鏄剧ず鍒楀瓧娈靛悕鎺у埗
     tabviews: [],            // 鎵�鏈夋爣绛鹃〉
-    profileVisible: false,   // 楠岃瘉淇℃伅妯℃�佹
-    optionLibs: null,        // 鑷畾涔変笅鎷夐�夐」搴�
-    thawBtnVisible: false,   // 瑙e喕鎸夐挳寮圭獥
-    thawbtnlist: null,       // 瑙e喕鎸夐挳鍒楄〃
     thawButtons: [],         // 宸查�夋嫨瑕佽В鍐荤殑鎸夐挳
-    activeKey: '0'           // 榛樿灞曞紑鍩烘湰淇℃伅
+    activeKey: '0',          // 榛樿灞曞紑鍩烘湰淇℃伅
+    chartview: null,         // 褰撳墠瑙嗗浘
+    openEdition: ''          // 缂栬緫鐗堟湰鏍囪锛岄槻姝㈠浜烘搷浣�
   }
 
   /**
@@ -93,33 +71,17 @@
    * 2銆佽缃搷浣滅被鍨嬨�佸師濮嬭彍鍗曚俊鎭紙姣忔淇濆瓨鍚庨噸缃級銆佸凡浣跨敤琛ㄥ強鍩烘湰淇℃伅琛ㄥ崟
    */
   UNSAFE_componentWillMount () {
-    const { config, editTab, editSubTab, optionLibs } = this.props
+    const { config, editTab, editSubTab } = this.props
 
     let _config = null
 
     if (!config) {
-      _config = JSON.parse(JSON.stringify(Source.baseConfig))
+      _config = fromJS(Source.baseConfig).toJS()
       _config.uuid = editSubTab ? editSubTab.linkTab : editTab.linkTab
       _config.tabName = editSubTab ? editSubTab.label : editTab.label
       _config.isAdd = true
     } else {
-      _config = JSON.parse(JSON.stringify(config))
-
-      _config.search.forEach(item => {
-        if (
-          (item.type === 'select' || item.type === 'multiselect' || item.type === 'link') &&
-          item.resourceType === '0' &&
-          item.options && item.options.length > 0
-        ) {
-          optionLibs.set(_config.uuid + item.uuid, {
-            uuid: _config.uuid + item.uuid,
-            label: item.label,
-            parname: _config.tabName,
-            type: 'search',
-            options: item.options
-          })
-        }
-      })
+      _config = fromJS(config).toJS()
     }
     
     let _oriActions = []
@@ -127,9 +89,14 @@
     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: JSON.parse(JSON.stringify(item)),
+            prebtn: fromJS(item).toJS(),
             curuuid: uuid,
             Template: 'Modal'
           })
@@ -142,39 +109,16 @@
 
     let _activeKey =  editSubTab ? editSubTab.activeKey : editTab.activeKey
 
+    // 鐗堟湰鍏煎
+    _config = updateSubTable(_config)
+
     this.setState({
+      openEdition: editSubTab ? (editSubTab.open_edition || '') : (editTab.open_edition || ''),
+      chartview: _config.charts[0].uuid,
       originActions: _oriActions,
-      optionLibs: optionLibs,
       config: _config,
       activeKey: _activeKey || '0',
-      originConfig: _config,
-      selectedTables: _config.tables || [],
-      menuformlist: [
-        {
-          type: 'text',
-          key: 'tabName',
-          label: this.state.dict['header.menu.viewName'],
-          initVal: _config.tabName,
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'tabNo',
-          label: this.state.dict['header.menu.menuNo'],
-          initVal: _config.tabNo,
-          required: true,
-          readonly: false
-        },
-        {
-          type: 'text',
-          key: 'Remark',
-          label: this.state.dict['header.menu.Remark'],
-          initVal: _config.Remark,
-          required: false,
-          readonly: false
-        }
-      ]
+      originConfig: fromJS(_config).toJS(),
     })
   }
 
@@ -184,148 +128,46 @@
    * 2銆佹牴鎹厤缃俊鎭腑宸蹭娇鐢ㄨ〃鑾峰彇鐩稿叧瀛楁淇℃伅
    */
   componentDidMount () {
-    let param = {
-      func: 'sPC_Get_SelectedList',
-      LText: queryTableSql,
-      obj_name: 'data',
-      arr_field: 'TbName,Remark'
-    }
-
-    param.LText = Utils.formatOptions(param.LText)
-    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
-
-    Api.getSystemConfig(param).then(res => {
-      if (res.status) {
-        this.setState({
-          tables: res.data
-        })
-      } else {
-        notification.warning({
-          top: 92,
-          message: res.message,
-          duration: 10
-        })
-      }
-    })
-
-    let deffers = this.state.selectedTables.map(item => {
-      return new Promise(resolve => {
-        Api.getSystemConfig({func: 'sPC_Get_FieldName', TBName: item.TbName}).then(res => {
-          res.TBName = item.TbName
-          resolve(res)
-        })
-      })
-    })
-    Promise.all(deffers).then(response => {
-      let _columns = []
-      response.forEach(res => {
-        if (res.status) {
-          let tabmsg = {
-            tableName: res.TBName,
-            columns: res.FDName.map(item => {
-              let _type = item.FieldType.toLowerCase()
-              let _decimal = 0
-              if (/^nvarchar/.test(_type)) {
-                _type = 'text'
-              } else if (/^int/.test(_type)) {
-                _type = 'number'
-              } else if (/^decimal/.test(_type)) {
-                _decimal = _type.split(',')[1]
-                _decimal = parseInt(_decimal)
-                if (_decimal > 4) {
-                  _decimal = 4
-                }
-                _type = 'number'
-              } else if (/^decimal/.test(_type)) {
-                _decimal = _type.split(',')[1]
-                _decimal = parseInt(_decimal)
-                if (_decimal > 4) {
-                  _decimal = 4
-                }
-                _type = 'number'
-              } else if (/^datetime/.test(_type)) {
-                _type = 'datetime'
-              } else if (/^date/.test(_type)) {
-                _type = 'date'
-              } else {
-                _type = 'text'
-              }
-  
-              return {
-                field: item.FieldName,
-                label: item.FieldDec,
-                type: _type,
-                datatype: _type,
-                decimal: _decimal
-              }
-            })
-          }
-          _columns.push(tabmsg)
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 10
-          })
-        }
-      })
-
-      this.setState({
-        tableColumns: _columns
-      })
-    })
-
-    Api.getSystemConfig({func: 'sPC_Get_UserTemp', TypeCharTwo: 'tab'}).then(res => {
-      if (res.status) {
-        this.setState({
-          tabviews: res.UserTemp.map(temp => {
-            return {
-              uuid: temp.MenuID,
-              value: temp.MenuID,
-              text: temp.MenuName,
-              type: temp.Template,
-              MenuNo: temp.MenuNo
-            }
-          })
-        })
-      } else {
-        notification.warning({
-          top: 92,
-          message: res.message,
-          duration: 10
-        })
-      }
-    })
+    this.reloadTab(false)
   }
 
   /**
    * @description 鍔犺浇鎴栧埛鏂版爣绛句俊鎭�
    */
-  reloadTab = () => {
+  reloadTab = (type) => {
     this.setState({
-      loading: true,
+      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: res.UserTemp.map(temp => {
-            return {
-              uuid: temp.MenuID,
-              value: temp.MenuID,
-              text: temp.MenuName,
-              type: temp.Template,
-              MenuNo: temp.MenuNo
-            }
+          tabviews: _tabviews
+        })
+
+        if (type) {
+          notification.success({
+            top: 92,
+            message: '鍒锋柊鎴愬姛銆�',
+            duration: 2
           })
-        })
-        notification.success({
-          top: 92,
-          message: '鍒锋柊鎴愬姛銆�',
-          duration: 2
-        })
+        }
       } else {
         this.setState({
           loading: false
@@ -333,7 +175,7 @@
         notification.warning({
           top: 92,
           message: res.message,
-          duration: 10
+          duration: 5
         })
       }
     })
@@ -357,7 +199,7 @@
     if (editSubTab) {
       _subconfig = tabConfig
       if (editTab.hasOwnProperty('OpenType')) {
-        _tabview = editTab.tabType
+        _tabview = editTab.tabType || 'SubTable'
       } else {
         _tabview = editTab.type
       }
@@ -368,7 +210,6 @@
 
     let param = {
       editMenu: menu,
-      optionLibs: this.state.optionLibs,
       editTab: editSubTab ? editTab : null,
       tabConfig: null,
       editSubTab: null,
@@ -392,925 +233,260 @@
   }
 
   /**
-   * @description 鍏冪礌娣诲姞鎴栨嫋鍔ㄦ椂椤哄簭鍙樺寲
-   */
-  handleList = (type, list, card) => {
-    const { config } = this.state
-
-    if (list.length > config[type].length) {
-      list = list.filter(item => !item.origin)
-
-      if (type === 'search') {
-        this.handleSearch(card)
-      } else if (type === 'action') {
-        this.handleAction(card)
-      } else if (type === 'columns') {
-        this.handleColumn(card)
-      }
-    }
-
-    this.setState({config: {...config, [type]: list}})
-  }
-
-  /**
-   * @description 鎼滅储鏉′欢缂栬緫锛岃幏鍙栨悳绱㈡潯浠惰〃鍗曚俊鎭�
-   */
-  handleSearch = (card) => {
-    const { menu } = this.props
-
-    this.setState({
-      modaltype: 'search',
-      card: card,
-      formlist: getSearchForm(card, menu.roleList)
-    })
-  }
-
-  /**
-   * @description 鎸夐挳缂栬緫锛岃幏鍙栨寜閽〃鍗曚俊鎭�
-   */
-  handleAction = (card, type) => {
-    let ableField = this.props.permFuncField.join(', ')
-    let functip = <div>
-      <p style={{marginBottom: '5px'}}>{this.state.dict['header.modal.func.innerface'].replace('@ableField', ableField)}</p>
-      <p>{this.state.dict['header.modal.func.outface']}</p>
-    </div>
-
-    this.setState({
-      modaltype: type === 'copy' ? 'actionCopy' : 'actionEdit',
-      card: card,
-      formlist: getActionForm(card, functip, this.state.config, this.props.permFuncField)
-    })
-  }
-
-  /**
-   * @description 鏄剧ず鍒椾笌鍚堝苟鍒楃紪杈戯紝鑾峰彇琛ㄥ崟淇℃伅
-   */
-  handleColumn = (card) => {
-    const { menu } = this.props
-
-    if (card.type !== 'colspan') {
-      this.setState({
-        modaltype: 'columns',
-        card: card,
-        formlist: getColumnForm(card, menu.roleList)
-      })
-    } else {
-      this.setState({
-        modaltype: 'colspan',
-        card: card
-      })
-    }
-  }
-
-  /**
-   * @description 鎿嶄綔鍒楃紪杈�
-   */
-  handleGridBtn = () => {
-    this.setState({
-      modaltype: 'gridbtn'
-    })
-  }
-
-  /**
-   * @description 鎼滅储銆佹寜閽�佹樉绀哄垪淇敼鍚庢彁浜や繚瀛�
-   * 1銆佹悳绱㈡潯浠朵繚瀛橈紝褰撶被鍨嬩负涓嬫媺妗嗕笖瀛樺湪鏁版嵁婧愭椂锛屽皢鏌ヨ鏉′欢鎷兼帴涓簊ql锛屽苟鐢╞ase64杞爜
-   * 2銆佹寜閽寘鎷甯哥紪杈戝拰澶嶅埗锛屽鍒舵椂,鎸夐挳鍒楁湯灏炬坊鍔�
-   * 3銆佹坊鍔犳垨缂栬緫鍒楋紝淇濆瓨鏃讹紝濡傛寜閽綅缃缃负琛ㄦ牸锛屽垯淇敼鎿嶄綔鍒楁樉绀虹姸鎬�
-   */
-  handleSubmit = () => {
-    const { card, config, modaltype, optionLibs } = this.state
-
-    if (modaltype === 'search') {
-      this.searchFormRef.handleConfirm().then(res => {
-        if ( // 鏇存柊涓嬫媺瀛楀吀
-          (res.type === 'select' || res.type === 'multiselect' || res.type === 'link') &&
-          res.resourceType === '0' &&
-          res.options && res.options.length > 0
-        ) {
-          optionLibs.set(config.uuid + res.uuid, {
-            uuid: config.uuid + res.uuid,
-            label: res.label,
-            parname: config.tabName,
-            type: 'search',
-            options: res.options
-          })
-        }
-
-        let _search = config.search.map(item => {
-          if (item.uuid === res.uuid) {
-            return res
-          } else {
-            return item
-          }
-        })
-        _search = _search.filter(item => !item.origin)
-
-        this.setState({
-          config: {...config, search: _search},
-          optionLibs: optionLibs,
-          modaltype: ''
-        })
-      })
-    } else if (modaltype === 'actionEdit' || modaltype === 'actionCopy') {
-      this.actionFormRef.handleConfirm().then(res => {
-        let _action = config.action.map(item => {
-          if (item.uuid === res.uuid) {
-            return res
-          } else {
-            return item
-          }
-        })
-        _action = _action.filter(item => !item.origin)
-
-        if (modaltype === 'actionCopy') {
-          _action.push(res)
-        }
-
-        // 澶嶅埗鎸夐挳鍓嶅悗鐨嗕负琛ㄥ崟鏃讹紝澶嶅埗琛ㄥ崟閰嶇疆淇℃伅锛宨d瀛樹簬澶嶅埗鍒楄〃
-        if (res.OpenType === 'pop' && card.originCard && card.originCard.OpenType === 'pop') {
-          Api.getSystemConfig({
-            func: 'sPC_Get_LongParam',
-            MenuID: card.originCard.uuid
-          }).then(result => {
-            if (result.status && result.LongParam) {
-              let _LongParam = ''
-
-              // 瑙f瀽閰嶇疆锛屼慨鏀规ā鎬佹鏍囬鍚嶇О
-              if (result.LongParam) {
-                try {
-                  _LongParam = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
-                } catch (e) {
-                  console.warn('Parse Failure')
-                  _LongParam = ''
-                }
-              }
-              if (_LongParam && _LongParam.type === 'Modal') {
-                try {
-                  _LongParam.setting.title = res.label
-                  _LongParam = window.btoa(window.encodeURIComponent(JSON.stringify(_LongParam)))
-                } catch {
-                  console.warn('Stringify Failure')
-                  _LongParam = ''
-                }
-              } else {
-                _LongParam = ''
-              }
-
-              let param = {
-                func: 'sPC_ButtonParam_AddUpt',
-                ParentID: config.uuid,
-                MenuID: res.uuid,
-                MenuNo: config.tabNo,
-                Template: 'Modal',
-                MenuName: res.label,
-                PageParam: JSON.stringify({Template: 'Modal'}),
-                LongParam: _LongParam
-              }
-              Api.getSystemConfig(param).then(response => {
-                if (!response.status) {
-                  notification.warning({
-                    top: 92,
-                    message: response.message,
-                    duration: 10
-                  })
-                } else {
-                  this.setState({
-                    copyActions: [...this.state.copyActions, res.uuid]
-                  })
-                }
-              })
-            }
-          })
-        }
-
-        // 鍒ゆ柇鏄惁瀛樺湪鎿嶄綔鍒�
-        let _hasGridbtn = _action.filter(act => act.position === 'grid').length > 0
-        let _gridBtn = config.gridBtn
-
-        if (_gridBtn) {
-          _gridBtn.display = _hasGridbtn
-        } else {
-          _gridBtn = {
-            display: _hasGridbtn,
-            Align: 'center',
-            IsSort: 'false',
-            uuid: Utils.getuuid(),
-            label: this.state.dict['header.form.column.action'],
-            type: 'action',
-            style: 'button',
-            show: 'horizontal',
-            Width: 120
-          }
-        }
-
-        this.setState({
-          config: {...config, action: _action, gridBtn: _gridBtn},
-          modaltype: ''
-        })
-      })
-    } else if (modaltype === 'columns' || modaltype === 'colspan') {
-      this.columnFormRef.handleConfirm().then(res => {
-        let _columns = config.columns.map(item => {
-          if (item.uuid === res.uuid) {
-            return res
-          } else {
-            return item
-          }
-        })
-        _columns = _columns.filter(item => !item.origin)
-
-        this.setState({
-          config: {...config, columns: _columns},
-          modaltype: ''
-        })
-      })
-    } else if (modaltype === 'gridbtn') {
-      this.gridBtnFormRef.handleConfirm().then(res => {
-        this.setState({
-          config: {...config, gridBtn: res},
-          modaltype: ''
-        })
-      })
-    }
-  }
-
-  /**
-   * @description 鍙栨秷淇濆瓨锛屽鏋滃厓绱犱负鏂版坊鍏冪礌锛屽垯浠庡簭鍒椾腑鍒犻櫎
-   */
-  editModalCancel = () => {
-    const { config, card, modaltype } = this.state
-
-    if (card.focus) {
-      let _config = null
-      if (modaltype === 'search') {
-        let _search = config.search.filter(item => item.uuid !== card.uuid)
-        _config = {...config, search: _search}
-      } else if (modaltype === 'actionEdit') {
-        let _action = config.action.filter(item => item.uuid !== card.uuid)
-        _config = {...config, action: _action}
-      } else if (modaltype === 'columns' || modaltype === 'colspan') {
-        let _columns = config.columns.filter(item => item.uuid !== card.uuid)
-        _config = {...config, columns: _columns}
-      } else {
-        _config = config
-      }
-
-      this.setState({
-        card: null,
-        config: _config,
-        modaltype: ''
-      })
-    } else {
-      this.setState({
-        card: null,
-        modaltype: ''
-      })
-    }
-  }
-
-  /**
-   * @description 鍒涘缓鎸夐挳瀛樺偍杩囩▼
-   */
-  creatFunc = () => {
-    let _config = JSON.parse(JSON.stringify(this.state.config))
-
-    this.actionFormRef.handleConfirm().then(res => {
-      let btn = res         // 鎸夐挳淇℃伅
-      let newLText = ''     // 鍒涘缓瀛樺偍杩囩▼sql
-      let DelText = ''      // 鍒犻櫎瀛樺偍杩囩▼sql
-
-      // 鍒涘缓瀛樺偍杩囩▼锛屽繀椤诲~鍐欏唴閮ㄥ嚱鏁板悕
-      if (!btn.innerFunc) {
-        notification.warning({
-          top: 92,
-          message: '璇峰~鍐欏唴閮ㄥ嚱鏁帮紒',
-          duration: 10
-        })
-        return
-      }
-
-      new Promise(resolve => {
-        // 寮圭獥锛堣〃鍗曪級绫绘寜閽紝鍏堣幏鍙栨寜閽厤缃俊鎭紝濡傛灉灏氭湭閰嶇疆鎸夐挳鍒欎細鎶ラ敊骞剁粓姝€��
-        // 鑾峰彇淇℃伅鍚庣敓鎴愬垹闄ゅ拰鍒涘缓瀛樺偍杩囩▼鐨勮鍙�
-        if (btn.OpenType === 'pop') {
-          Api.getSystemConfig({
-            func: 'sPC_Get_LongParam',
-            MenuID: btn.uuid
-          }).then(res => {
-            let _LongParam = ''
-            if (res.status && res.LongParam) {
-              try {
-                _LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
-              } catch (e) {
-                console.warn('Parse Failure')
-                _LongParam = ''
-              }
-            }
-
-            if (_LongParam) {
-              let fields = []
-              if (_LongParam.groups.length > 0) {
-                _LongParam.groups.forEach(group => {
-                  fields = [...fields, ...group.sublist]
-                })
-              } else {
-                fields = _LongParam.fields
-              }
-
-              let _param = {
-                funcName: btn.innerFunc,
-                name: _config.setting.tableName || '',
-                fields: fields,
-                menuNo: _config.tabNo
-              }
-              newLText = Utils.formatOptions(Utils.getfunc(_param, btn, {MenuID: _config.uuid, MenuName: _config.tabName}, _config))
-              DelText = Utils.formatOptions(Utils.dropfunc(_param.funcName))
-              resolve(true)
-            } else {
-              notification.warning({
-                top: 92,
-                message: '寮圭獥锛堣〃鍗曪級鎸夐挳锛岃鍏堥厤缃〃鍗曚俊鎭紒',
-                duration: 10
-              })
-              resolve(false)
-            }
-          })
-        } else if (btn.OpenType === 'excelIn') {
-          if (btn.verify && btn.verify.sheet && btn.verify.columns && btn.verify.columns.length > 0) {
-            let _param = {
-              funcName: btn.innerFunc,
-              menuNo: _config.tabNo
-            }
-            newLText = Utils.formatOptions(Utils.getexcelInfunc(_param, btn, {MenuID: _config.uuid, MenuName: _config.tabName}))
-            DelText = Utils.formatOptions(Utils.dropfunc(_param.funcName))
-            resolve(true)
-          } else {
-            notification.warning({
-              top: 92,
-              message: '璇峰畬鍠勫鍏xcel楠岃瘉淇℃伅锛�',
-              duration: 10
-            })
-            resolve(false)
-          }
-        } else if (btn.OpenType === 'excelOut') {
-          let _param = {
-            innerFunc: btn.innerFunc
-          }
-
-          newLText = Utils.formatOptions(Utils.getTableFunc(_param, {MenuID: _config.uuid, MenuName: _config.tabName, MenuNo: _config.tabNo}, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-          DelText = Utils.formatOptions(Utils.dropfunc(btn.innerFunc))
-
-          resolve(true)
-        } else {
-          let _param = {
-            funcName: btn.innerFunc,
-            name: _config.setting.tableName || '',
-            fields: '',
-            menuNo: _config.tabNo
-          }
-          newLText = Utils.formatOptions(Utils.getfunc(_param, btn, {MenuID: _config.uuid, MenuName: _config.tabName}, _config))
-          DelText = Utils.formatOptions(Utils.dropfunc(_param.funcName))
-          resolve(true)
-        }
-      }).then(res => {
-        if (!res) return
-
-        this.refs.btnCreatFunc.exec(btn.innerFunc, newLText, DelText).then(result => {
-          if (result !== 'success') return
-
-          _config.action = _config.action.map(item => {
-            if (item.uuid === btn.uuid) {
-              return btn
-            } else {
-              return item
-            }
-          })
-          _config.action = _config.action.filter(item => !item.origin)
-
-          // 鍒ゆ柇鏄惁瀛樺湪鎿嶄綔鍒�
-          let _hasGridbtn = _config.action.filter(act => act.position === 'grid').length > 0
-
-          if (_config.gridBtn) {
-            _config.gridBtn.display = _hasGridbtn
-          } else {
-            _config.gridBtn = {
-              display: _hasGridbtn,
-              Align: 'center',
-              IsSort: 'false',
-              uuid: Utils.getuuid(),
-              label: this.state.dict['header.form.column.action'],
-              type: 'action',
-              style: 'button',
-              show: 'horizontal',
-              Width: 120
-            }
-          }
-  
-          this.setState({
-            config: _config,
-          })
-        })
-      })
-    })
-  }
-
-  /**
-   * @description 鍒涘缓琛ㄦ牸瀛樺偍杩囩▼
-   */
-  tableCreatFunc = () => {
-    const { config } = this.state
-
-    this.settingRef.handleConfirm().then(setting => {
-
-      if (!(setting.interType === 'inner') || !setting.innerFunc) {
-        notification.warning({
-          top: 92,
-          message: '鎺ュ彛绫诲瀷涓�-鍐呴儴锛屼笖瀛樺湪鍐呴儴鍑芥暟鏃讹紝鎵嶅彲浠ュ垱寤哄瓨鍌ㄨ繃绋嬶紒',
-          duration: 10
-        })
-        return
-      }
-
-      if (/[^\s]+\s+[^\s]+/ig.test(setting.dataresource) && config.setting.dataresource !== setting.dataresource) {
-        let param = {
-          func: 's_DataSrc_Save',
-          LText: setting.dataresource,
-          MenuID: config.uuid
-        }
-
-        param.LText = Utils.formatOptions(param.LText)
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
-
-        Api.getLocalConfig(param)
-      }
-
-      let _config = {...config, setting: setting}
-      let newLText = Utils.formatOptions(Utils.getTableFunc(setting, {MenuID: _config.uuid, MenuName: _config.tabName, MenuNo: _config.tabNo}, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-      let DelText = Utils.formatOptions(Utils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
-      
-      this.refs.tableCreatFunc.exec(setting.innerFunc, newLText, DelText).then(result => {
-        if (result === 'success') {
-          this.setState({
-            config: _config
-          })
-        }
-      })
-    })
-  }
-
-  deleteElement = (element) => {
-    const { thawButtons } = this.state
-
-    let _this = this
-    confirm({
-      content: `纭畾鍒犻櫎<<${element.card.label}>>鍚楋紵`,
-      okText: this.state.dict['header.confirm'],
-      cancelText: this.state.dict['header.cancel'],
-      onOk() {
-        let _config = JSON.parse(JSON.stringify(_this.state.config))
-        _config[element.type] = _config[element.type].filter(item => {
-          if (item.uuid === element.card.uuid) {
-            return false
-          } else {
-            return true
-          }
-        })
-
-        // 鍒犻櫎鎸夐挳鍏冪礌
-        let _delActions = _this.state.delActions
-        if (element.type === 'action') {
-          _delActions.push(element)
-        }
-
-        _this.setState({
-          config: _config,
-          delActions: _delActions,
-          thawButtons: thawButtons.filter(key => key !== element.card.uuid)
-        })
-      },
-      onCancel() {}
-    })
-  }
-
-  /**
-   * @description 楠岃瘉淇℃伅閰嶇疆
-   */
-  profileAction = (element) => {
-    this.setState({
-      profileVisible: true,
-      card: element
-    })
-  }
-
-  /**
-   * @description 楠岃瘉淇℃伅淇濆瓨
-   */
-  verifySubmit = () => {
-    const { card } = this.state
-    let config = JSON.parse(JSON.stringify(this.state.config))
-    
-    if (card.OpenType === 'excelIn') {
-      this.verifyRef.handleConfirm().then(res => {
-        
-        config.action = config.action.map(item => {
-          if (item.uuid === card.uuid) {
-            item.verify = res
-          }
-    
-          return item
-        })
-    
-        this.setState({
-          profileVisible: false,
-          config: config,
-          card: ''
-        })
-      })
-    } else if (card.execMode) {
-      this.verifyRef.handleConfirm().then(res => {
-        
-        config.action = config.action.map(item => {
-          if (item.uuid === card.uuid) {
-            item.verify = res
-          }
-    
-          return item
-        })
-    
-        this.setState({
-          profileVisible: false,
-          config: config,
-          card: '',
-        })
-      })
-    } else {
-      let _verify = this.verifyRef.state.verify
-
-      if (card.OpenType !== 'excelOut' && _verify.default === 'false' && _verify.scripts.length === 0) {
-        notification.warning({
-          top: 92,
-          message: '涓嶆墽琛岄粯璁ql鏃讹紝蹇呴』璁剧疆鑷畾涔夎剼鏈紒',
-          duration: 10
-        })
-        return
-      } else if (card.OpenType === 'excelOut') {
-        let _cols = _verify.columns.map(col => col.Column)
-        let _vcols = Array.from(new Set(_cols))
-        if (_cols.length > _vcols.length) {
-          notification.warning({
-            top: 92,
-            message: 'Excel鍒楀瓧娈靛悕锛屼笉鍙噸澶�!',
-            duration: 10
-          })
-          
-          return
-        }
-      }
-
-      config.action = config.action.map(item => {
-        if (item.uuid === card.uuid) {
-          item.verify = _verify
-        }
-  
-        return item
-      })
-  
-      this.setState({
-        profileVisible: false,
-        config: config,
-        card: ''
-      })
-    }
-  }
-
-  /**
    * @description 鏍囩椤典繚瀛�
    */
   submitConfig = () => {
-    const { delActions, thawButtons, originConfig } = this.state
-    let config = JSON.parse(JSON.stringify(this.state.config))
+    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
 
-    this.menuformRef.handleConfirm().then(res => {
-
-      if (originConfig.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)
-        }
-      }
-
-      let _LongParam = ''
-      let _config = {...config, tables: this.state.selectedTables, ...res}
-
-      // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负false
-      if (_config.setting.interType === 'inner' && !_config.setting.innerFunc && !_config.setting.dataresource) {
-        _config.enabled = false
-      } else if (!_config.setting.primaryKey) {
-        _config.enabled = false
-      }
-
-      _config.funcs = []
-
-      _config.funcs.push({
-        type: 'view',
-        subtype: 'view',
-        uuid: _config.uuid,
-        intertype: _config.setting.interType || 'inner',
-        interface: _config.setting.interface || '',
-        tableName: _config.setting.tableName || '',
-        innerFunc: _config.setting.innerFunc || '',
-        outerFunc: _config.setting.outerFunc || ''
-      })
-
-      _config.action.forEach(item => {
-        let tablename = item.OpenType === 'excelIn' ? (item.sheet || '') : (item.sql || '')
-
-        if (item.OpenType === 'excelOut' && item.intertype === 'inner' && !item.innerFunc) {
-          tablename = _config.setting.tableName || ''
-        }
-
-        if (item.OpenType === 'popview') {
-          _config.funcs.push({
-            type: 'tab',
-            subtype: 'btn',
-            uuid: item.uuid,
-            label: item.label,
-            linkTab: item.linkTab
-          })
-        } else {
-          _config.funcs.push({
-            type: 'button',
-            subtype: 'btn',
-            uuid: item.uuid,
-            label: item.label,
-            tableName: tablename,
-            intertype: item.intertype,
-            interface: item.interface || '',
-            innerFunc: item.innerFunc || '',
-            outerFunc: item.outerFunc || '',
-            callbackFunc: item.callbackFunc || ''
-          })
-        }
-      })
-
-      if (this.state.closeVisible) { // 鏄剧ず鍏抽棴瀵硅瘽妗嗘椂锛屾ā鎬佹涓繚瀛樻寜閽紝鏄剧ず淇濆瓨涓姸鎬�
-        this.setState({
-          menucloseloading: true
-        })
-      } else {
-        this.setState({
-          menuloading: true
-        })
-      }
-
-      new Promise(resolve => {
-        let deffers = []
-        _config.funcs.forEach(item => {
-          if (item.type === 'tab') {
-            let deffer = new Promise(resolve => {
-              Api.getSystemConfig({
-                func: 'sPC_Get_LongParam',
-                MenuID: item.linkTab
-              }).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) {
-                    item.menuNo = _LongParam.tabNo
-                    item.subfuncs = _LongParam.funcs || []
-                  }
-                }
-                resolve()
-              })
-            })
-
-            deffers.push(deffer)
-          }
-        })
-
-        if (deffers.length === 0) {
-          resolve()
-        } else {
-          Promise.all(deffers).then(() => {
-            resolve()
-          })
-        }
-      }).then(() => {
-
-        // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝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: 10
-          })
-
-          this.setState({
-            menucloseloading: false,
-            menuloading: false
-          })
-          return
-        }
-  
-        let btnParam = {
-          func: 'sPC_Button_AddUpt',
-          Type: 40,
-          ParentID: _config.uuid,
-          MenuNo: res.tabNo,
-          Template: 'SubTable',
-          PageParam: '',
-          LongParam: '',
-          LText: []
-        }
-
-        let btntabs = []
-
-        config.action.forEach((item, index) => {
-          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') + '.000'
-        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') + '.000'
-        tabParam.secretkey = Utils.encrypt(tabParam.LText, tabParam.timestamp)
-  
-        let param = {
-          func: 'sPC_Tab_AddUpt',
-          MenuID: _config.uuid,
-          MenuNo: res.tabNo,
-          Template: 'SubTable',
-          MenuName: res.tabName,
-          Remark: res.Remark,
-          Sort: 0,
-          PageParam: JSON.stringify({Template: 'SubTable'}),
-          LongParam: _LongParam
-        }
-
-        // 鏈夋寜閽垨鏍囩鍒犻櫎鏃讹紝鍏堣繘琛屽垹闄ゆ搷浣�
-        // 鍒犻櫎鎴愬姛鍚庯紝淇濆瓨椤甸潰閰嶇疆
-        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: 10
-                })
-                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: 10
-            })
-            return false
-          } else {
-            this.setState({
-              thawButtons: []
-            })
-            return true
-          }
-        }).then(resp => {
-          if (resp === false) return
-  
-          Api.getSystemConfig(param).then(response => {
-            if (response.status) {
-              this.setState({
-                config: _config,
-                originConfig: _config
-              }, () => {
-                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: 10
-              })
-            }
-          })
-        })
-      })
-    }, () => {
+    // 鍩烘湰淇℃伅楠岃瘉
+    if (!_config.tabName || !_config.tabNo) {
       notification.warning({
         top: 92,
-        message: this.state.dict['header.menu.basemsg'],
-        duration: 10
+        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)
+      }
+    }
+
+    // 鏈缃暟鎹簮鎴栦富閿椂锛屽惎鐢ㄧ姸鎬佷负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
+      })
+    }
+
+    // 淇濆瓨鏃跺垹闄ら厤缃被鍨嬶紝system 銆乽ser
+    delete _config.type
+    delete _config.isAdd
+
+    let _LongParam = ''
+
+    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.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()
+          }, () => {
+            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
+          })
+        }
       })
     })
   }
@@ -1362,7 +538,7 @@
             notification.warning({
               top: 92,
               message: error.message,
-              duration: 10
+              duration: 5
             })
             resolve(false)
           } else {
@@ -1378,6 +554,7 @@
         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,
@@ -1453,325 +630,20 @@
     if (originConfig.isAdd) {
       confirm({
         content: '鑿滃崟灏氭湭鎻愪氦锛岀‘瀹氭斁寮冧繚瀛樺悧锛�',
-        okText: this.state.dict['header.confirm'],
-        cancelText: this.state.dict['header.cancel'],
         onOk() {
           _this.handleViewBack()
         },
         onCancel() {}
       })
     } else {
-      this.menuformRef.handleConfirm().then(res => {
-        let _config = {...config, tables: this.state.selectedTables, ...res}
-
-        if (!is(fromJS(originConfig), fromJS(_config))) {
-          this.setState({
-            closeVisible: true
-          })
-        } else {
-          this.handleViewBack()
-        }
-      }, () => {
+      if (!is(fromJS(originConfig), fromJS(config))) {
         this.setState({
           closeVisible: true
         })
-      })
-    }
-  }
-
-  queryField = (type) => {
-    const {selectedTables, tableColumns, config} = this.state
-    // 鍒ゆ柇鏄惁宸查�夋嫨琛ㄥ悕
-    if (selectedTables.length === 0) {
-      notification.warning({
-        top: 92,
-        message: '璇烽�夋嫨琛ㄥ悕锛�',
-        duration: 10
-      })
-      return
-    }
-
-    // 琛ㄥ瓧娈甸泦杞负map鏁版嵁
-    let columns = new Map()
-    tableColumns.forEach(table => {
-      table.columns.forEach(column => {
-        columns.set(column.field, column)
-      })
-    })
-
-    if (type === 'search') {
-      // 娣诲姞鎼滅储鏉′欢锛屽瓧娈甸泦涓瓨鍦ㄦ悳绱㈡潯浠跺瓧娈碉紝浣跨敤鎼滅储鏉′欢瀵硅薄鏇挎崲瀛楁闆嗭紝璁剧疆鏁版嵁绫诲瀷
-      config.search.forEach(item => {
-        if (columns.has(item.field)) {
-          let _datatype = columns.get(item.field).datatype
-          columns.set(item.field, {...item, selected: true, datatype: _datatype})
-        }
-      })
-    } else if (type === 'columns') {
-      // 娣诲姞鏄剧ず鍒楋紝瀛楁闆嗕腑瀛樺湪鏄剧ず鍒楀瓧娈碉紝浣跨敤鏄剧ず鍒楀璞℃浛鎹㈠瓧娈甸泦锛岃缃暟鎹被鍨�
-      config.columns.forEach(item => {
-        if (columns.has(item.field)) {
-          let _datatype = columns.get(item.field).datatype
-          columns.set(item.field, {...item, selected: true, datatype: _datatype})
-        }
-      })
-    }
-
-    // 鏄剧ず瀛楁闆嗗脊绐�
-    this.setState({
-      addType: type,
-      tableVisible: true,
-      fields: [...columns.values()]
-    })
-  }
-
-  addFieldSubmit = () => {
-    // 瀛楁闆嗕负绌猴紝鍏抽棴寮圭獥
-    if (!this.state.fields || this.state.fields.length === 0) {
-      this.setState({
-        tableVisible: false,
-        addType: ''
-      })
-    }
-
-    const {addType, config} = this.state
-    const textmatch = { // 閫夋嫨text鏃跺尮閰嶈鍒�
-      text: 'like',
-      number: 'like',
-      datetime: 'like',
-      date: 'like'
-    }
-    const selectmatch = { // 閫夋嫨select鏃跺尮閰嶈鍒�
-      text: '=',
-      number: '=',
-      datetime: '=',
-      date: '='
-    }
-    const datematch = { // 閫夋嫨dateRange鏃跺尮閰嶈鍒�
-      text: 'between',
-      number: 'between',
-      datetime: 'between',
-      date: 'between'
-    }
-
-    // 鑾峰彇宸查�夊瓧娈甸泦鍚�
-    let cards = this.refs.searchcard.state.selectCards
-    let columnsMap = new Map()
-    cards.forEach(card => {
-      columnsMap.set(card.field, card)
-    })
-
-    let items = []
-    if (addType === 'search') {
-      config.search.forEach(item => {
-        if (columnsMap.has(item.field)) {
-          let cell = columnsMap.get(item.field)
-
-          if (cell.selected && cell.type === item.type) { // 鏁版嵁鏈慨鏀�
-            items.push(item)
-          } else if (cell.selected) { // 鏁版嵁绫诲瀷淇敼
-            if (cell.type === 'text') {
-              item.match = textmatch[cell.datatype]
-            } else if (cell.type === 'select') {
-              item.match = selectmatch[cell.datatype]
-            } else if (cell.type === 'daterange') {
-              item.match = datematch[cell.datatype]
-            } else {
-              cell.type = 'text'
-              item.match = textmatch[cell.datatype]
-            }
-            
-            item.type = cell.type
-            item.initval = ''
-            items.push(item)
-          }
-          columnsMap.delete(item.field)
-        } else if (!item.origin) {
-          items.push(item)
-        }
-      })
-
-      let _columns = [...columnsMap.values()]
-
-      _columns.forEach(item => {
-        if (item.selected) {
-          let _match = ''
-          if (item.type === 'text') {
-            _match = textmatch[item.datatype]
-          } else if (item.type === 'select') {
-            _match = selectmatch[item.datatype]
-          } else if (item.type === 'daterange') {
-            _match = datematch[item.datatype]
-          } else {
-            item.type = 'text'
-            _match = textmatch[item.datatype]
-          }
-
-          let newcard = {
-            uuid: Utils.getuuid(),
-            label: item.label,
-            field: item.field,
-            initval: '',
-            type: item.type,
-            resourceType: '0',
-            setAll: 'false',
-            options: [],
-            dataSource: '',
-            linkField: '',
-            valueField: '',
-            valueText: '',
-            orderBy: '',
-            orderType: 'asc',
-            match: _match,
-            display: 'dropdown'
-          }
-
-          items.push(newcard)
-        }
-      })
-    } else {
-      config.columns.forEach(item => {
-        if (columnsMap.has(item.field)) {
-          let cell = columnsMap.get(item.field)
-
-          if (cell.selected) {
-            items.push(item)
-          }
-          columnsMap.delete(item.field)
-        } else if (!item.origin) {
-          items.push(item)
-        }
-      })
-
-      let _columns = [...columnsMap.values()]
-
-      _columns.forEach(item => {
-        if (item.selected) {
-          let newcard = {
-            uuid: Utils.getuuid(),
-            Align: 'left',
-            label: item.label,
-            field: item.field,
-            Hide: 'false',
-            IsSort: item.type === 'picture' ? 'false' : 'true',
-            type: item.type,
-            Width: 120
-          }
-
-          items.push(newcard)
-        }
-      })
-    }
-
-    this.setState({
-      config: {...config, [addType]: items}
-    })
-
-    notification.success({
-      top: 92,
-      message: '鎿嶄綔鎴愬姛',
-      duration: 2
-    })
-  }
-
-  onTableChange = (value) => {
-    const {tables, selectedTables, tableColumns} = this.state
-
-    let _table = tables.filter(item => item.TbName === value)[0]
-    let isSelected = !!selectedTables.filter(cell => cell.TbName === value)[0]
-    if (!isSelected) {
-      this.setState({
-        selectedTables: [...selectedTables, _table]
-      })
-      Api.getSystemConfig({func: 'sPC_Get_FieldName', TBName: value}).then(res => {
-        if (res.status) {
-          let tabmsg = {
-            tableName: _table.name,
-            columns: res.FDName.map(item => {
-              let _type = item.FieldType.toLowerCase()
-              let _decimal = 0
-              if (/^nvarchar/.test(_type)) {
-                _type = 'text'
-              } else if (/^int/.test(_type)) {
-                _type = 'number'
-              } else if (/^decimal/.test(_type)) {
-                _decimal = _type.split(',')[1]
-                _decimal = parseInt(_decimal)
-                _type = 'number'
-              } else if (/^datetime/.test(_type)) {
-                _type = 'datetime'
-              } else if (/^date/.test(_type)) {
-                _type = 'date'
-              } else {
-                _type = 'text'
-              }
-
-              return {
-                field: item.FieldName,
-                label: item.FieldDec,
-                type: _type,
-                datatype: _type,
-                decimal: _decimal
-              }
-            })
-          }
-          this.setState({
-            tableColumns: [...tableColumns, tabmsg]
-          })
-        } else {
-          notification.warning({
-            top: 92,
-            message: res.message,
-            duration: 10
-          })
-        }
-      })
-    }
-  }
-
-  deleteTable = (table) => {
-    const {selectedTables, tableColumns} = this.state
-
-    this.setState({
-      selectedTables: selectedTables.filter(item => item.TbName !== table.TbName),
-      tableColumns: tableColumns.filter(item => item.tableName !== table.TbName)
-    })
-  }
-
-  changeSetting = () => {
-    this.setState({
-      settingVisible: true
-    })
-  }
-
-  settingSave = () => {
-    const { config } = this.state
-
-    this.settingRef.handleConfirm().then(res => {
-      if (
-        res.interType === 'inner' &&
-        !res.innerFunc &&
-        /[^\s]+\s+[^\s]+/ig.test(res.dataresource) &&
-        config.setting.dataresource !== res.dataresource
-      ) {
-        let param = {
-          func: 's_DataSrc_Save',
-          LText: res.dataresource,
-          MenuID: config.uuid
-        }
-
-        param.LText = Utils.formatOptions(param.LText)
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-        param.secretkey = Utils.encrypt(param.LText, param.timestamp)
-
-        Api.getLocalConfig(param)
+      } else {
+        this.handleViewBack()
       }
-
-      this.setState({
-        config: {...config, setting: res},
-        settingVisible: false,
-      })
-    })
+    }
   }
 
   /**
@@ -1779,374 +651,296 @@
    */
   setSubConfig = (btn) => {
     const {menu, editTab, tabConfig, editSubTab, btnTab, btnTabConfig} = this.props
-    const { config, originConfig, activeKey } = this.state
+    const { config, originConfig, activeKey, openEdition } = this.state
 
     if (originConfig.isAdd) {
       notification.warning({
         top: 92,
         message: '鑿滃崟灏氭湭淇濆瓨锛岃淇濆瓨鑿滃崟閰嶇疆锛�',
-        duration: 10
+        duration: 5
       })
     } else {
-      this.menuformRef.handleConfirm().then(res => {
-        let _config = {...config, tables: this.state.selectedTables, ...res}
-
-        if (!is(fromJS(originConfig), fromJS(_config))) {
-          notification.warning({
-            top: 92,
-            message: '鑿滃崟閰嶇疆宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
-            duration: 10
-          })
-        } else {
-          this.setState({
-            loading: true
-          })
-
-          // 瀛愯彍鍗曚俊鎭獙璇侀�氳繃鍚庯紝璺宠浆瀛愭寜閽厤缃〉闈�
-          let _view = ''
-          let _subtab = editSubTab
-
-          if (btn.OpenType === 'pop') {
-            _view = 'Modal'             // 琛ㄥ崟椤甸潰
-          } else if (btn.OpenType === 'popview') {
-            _view = btn.tabType        // 鏂板脊绐楁爣绛炬ā鏉�
-            _subtab = btn
-          }
-
-          if (editSubTab) {
-            editSubTab.activeKey = activeKey
-          } else {
-            editTab.activeKey = activeKey
-          }
-
-          let param = {
-            editMenu: menu,
-            optionLibs: this.state.optionLibs,
-            editTab: editTab,
-            tabConfig: editSubTab ? tabConfig : originConfig,
-            editSubTab: _subtab,
-            subTabConfig: editSubTab ? originConfig : null,
-            btnTab: btnTab,
-            btnTabConfig: btnTabConfig,
-            editAction: btn,
-            subConfig: '',
-            tabview: _view
-          }
-
-          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
-              }
-
-              this.props.handleView(param)
-            } else {
-              this.setState({
-                loading: false
-              })
-              notification.warning({
-                top: 92,
-                message: res.message,
-                duration: 10
-              })
-            }
-          })
-        }
-      }, () => {
+      if (!is(fromJS(originConfig), fromJS(config))) {
         notification.warning({
           top: 92,
-          message: '鑿滃崟鍩烘湰淇℃伅宸蹭慨鏀癸紝璇蜂繚瀛橈紒',
-          duration: 10
+          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
 
-    if (config.setting.interType === 'inner' && !config.setting.innerFunc && !config.setting.dataresource) {
+    let _enabled = !config.enabled
+    let result = this.verifyconfig(config)
+
+    if (_enabled && result !== true) {
       notification.warning({
         top: 92,
-        message: '灏氭湭璁剧疆鏁版嵁婧愶紝涓嶅彲鍚敤锛�',
-        duration: 10
+        message: result,
+        duration: 5
       })
-    } else if (!config.setting.primaryKey) {
-      notification.warning({
-        top: 92,
-        message: '灏氭湭璁剧疆涓婚敭锛屼笉鍙惎鐢紒',
-        duration: 10
-      })
-    } else {
-      this.setState({
-        config: {...config, enabled: !config.enabled}
-      })
-    }
-  }
-
-  onColumnNameChange = () => {
-    const { showColumnName, config } = this.state
-
-    if (!showColumnName) {
-      let fields = []
-      config.columns.forEach(col => {
-        if (col.field) {
-          fields.push(col.field)
-        }
-      })
-
-      fields = fields.join(',')
-
-      let textArea = document.createElement('textarea')
-      textArea.value = fields
-      document.body.appendChild(textArea)
-      textArea.select()
-
-      try {
-        document.execCommand('copy')
-        document.body.removeChild(textArea)
-      } catch (err) {
-        document.body.removeChild(textArea)
-      }
+      return
     }
 
     this.setState({
-      showColumnName: !showColumnName
+      config: {...config, enabled: _enabled}
     })
   }
 
   /**
-   * @description 瑙e喕鎸夐挳
+   * @description 鏍¢獙閰嶇疆淇℃伅鐨勫悎娉曟��
    */
-  handleThaw = () => {
-    const { config } = this.state
-
-    this.setState({
-      thawBtnVisible: true
-    })
-
-    Api.getSystemConfig({
-      func: 'sPC_Get_FrozenMenu',
-      ParentID: config.uuid,
-      TYPE: 40
-    }).then(res => {
-      if (res.status) {
-        let _list = []
-
-        res.data.forEach(menu => {
-          let _conf = ''
-
-          if (menu.ParentParam) {
-            try {
-              _conf = JSON.parse(window.decodeURIComponent(window.atob(menu.ParentParam)))
-            } catch (e) {
-              console.warn('Parse Failure')
-              _conf = ''
-            }
-          }
-
-          if (_conf) {
-            _list.push({
-              key: menu.MenuID,
-              title: menu.MenuName,
-              btnParam: _conf
-            })
-          }
-        })
-
-        this.setState({
-          thawbtnlist: _list
-        })
-      } else {
-        notification.warning({
-          top: 92,
-          message: res.message,
-          duration: 10
-        })
+  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
       }
     })
-  }
 
-  /**
-   * @description 瑙e喕鎸夐挳鎻愪氦
-   */
-  thawBtnSubmit = () => {
-    const { thawButtons, config, thawbtnlist } = this.state
-    // 涓夌骇鑿滃崟瑙i櫎鍐荤粨
-    if (this.refs.trawmenu.state.targetKeys.length === 0) {
-      notification.warning({
-        top: 92,
-        message: this.state.dict['form.required.select'] + this.state.dict['header.form.thawbutton'],
-        duration: 10
-      })
-    } else {
+    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
 
-      thawbtnlist.forEach(item => {
-        if (this.refs.trawmenu.state.targetKeys.includes(item.key)) {
-          config.action.push(item.btnParam)
-        }
-      })
+      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}鍧愭爣杞村瓧娈靛湪鏄剧ず鍒椾腑涓嶅瓨鍦紝涓嶅彲鍚敤锛乣
+      }
+    })
 
-      this.setState({
-        thawButtons: [...thawButtons, ...this.refs.trawmenu.state.targetKeys],
-        config: config,
-        thawBtnVisible: false
-      })
-    }
-  }
-
-  /**
-   * @description 鍒涘缓琛ㄦ牸鎺ュ彛
-   */
-  tableCreatInterface = () => {
-    const { config } = this.state
-
-    this.menuformRef.handleConfirm().then(res => {
-      this.settingRef.handleConfirm().then(setting => {
-
-        if (/[^\s]+\s+[^\s]+/ig.test(setting.dataresource) && config.setting.dataresource !== setting.dataresource) {
-          let param = {
-            func: 's_DataSrc_Save',
-            LText: setting.dataresource,
-            MenuID: config.uuid
+    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
           }
-  
-          param.LText = Utils.formatOptions(param.LText)
-          param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
-          param.secretkey = Utils.encrypt(param.LText, param.timestamp)
-  
-          Api.getLocalConfig(param)
-        }
-
-        if (setting.interType !== 'inner' || setting.innerFunc) {
+        })
+        if (hascheck) {
           notification.warning({
             top: 92,
-            message: '鎺ュ彛绫诲瀷涓�-鍐呴儴锛屼笖涓嶅瓨鍦ㄥ唴閮ㄥ嚱鏁版椂锛屾墠鍙互鍒涘缓鎺ュ彛锛�',
-            duration: 10
+            message: `鍙�夋嫨澶氳鐨勬寜閽��${btn.label}銆嬩腑 $check@ 鎴� @check$ 灏嗕笉浼氱敓鏁堬紒`,
+            duration: 5
           })
-          return
         }
-  
-        let _config = {...config, setting: setting}
-        let _menu = {
-          type: 'subtable',
-          MenuID: config.uuid,
-          menuName: res.tabName,
-          menuNo: res.tabNo
-        }
-  
-        this.refs.tableCreatInterface.exec(_menu, _config).then(result => {
-          if (result === 'success') {
-            this.setState({
-              config: _config
-            })
-          }
-        })
+      }
+    })
+
+    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) => {
+    if (res.type === 'thaw') {
+      this.setState({
+        thawButtons: res.thawButtons,
+        config: res.config
       })
+    } else if (res.type === 'paste') {
+      this.setState({config: res.config})
+    }
+  }
+
+  /**
+   * @description 鏇存柊鎼滅储鏉′欢閰嶇疆淇℃伅
+   */
+  updatesearch = (config) => {
+
+    this.setState({
+      config: config
     })
   }
 
-  pasteSubmit = () => {
-    this.pasteFormRef.handleConfirm().then(res => {
-      if (res.copyType !== 'action') {
-        notification.warning({
-          top: 92,
-          message: '閰嶇疆淇℃伅鏍煎紡閿欒锛�',
-          duration: 10
-        })
-        return
-      } else if (!['pop', 'prompt', 'exec', 'excelIn', 'excelOut', 'popview'].includes(res.OpenType)) {
-        notification.warning({
-          top: 92,
-          message: '涓嶆敮鎸佹鎵撳紑鏂瑰紡锛�',
-          duration: 10
-        })
-        return
-      }
+  /**
+   * @description 鏇存柊鎸夐挳閰嶇疆淇℃伅
+   */
+  updateaction = (config, copyId, delcard) => {
+    const { copyActions, delActions } = this.state
 
-      this.setState({
-        modaltype: ''
-      }, () => {
-        this.handleAction(res, 'copy')
-      })
+    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
     })
   }
 
   render () {
-    const { modaltype, activeKey } = this.state
-    const configAction = this.state.config.action.filter(_action =>
-      !_action.origin && (_action.OpenType === 'pop' || _action.OpenType === 'popview' || _action.OpenType === 'blank' || _action.OpenType === 'tab')
-    )
+    const { activeKey, config, chartview } = this.state
+
+    const confActions = config.action.filter(_action => !_action.origin && (['pop', 'popview'].includes(_action.OpenType) || (_action.OpenType === 'funcbutton' && _action.execMode === 'pop')))
 
     return (
-      <div className="common-table-board">
+      <div className="model-subtable-board">
         <DndProvider backend={HTML5Backend}>
           {/* 宸ュ叿鏍� */}
           <div className="tools">
-            <Collapse accordion defaultActiveKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
+            <Collapse accordion activeKey={activeKey} bordered={false} onChange={(key) => this.setState({activeKey: key})}>
               {/* 鍩烘湰淇℃伅 */}
-              <Panel forceRender={true} header={'鏍囩鍩烘湰淇℃伅'} key="0" id="common-basedata">
+              <Panel forceRender={true} header={'鏍囩鍩烘湰淇℃伅'} key="0" id="subtable-basedata">
                 {/* 鑿滃崟淇℃伅 */}
                 <MenuForm
                   dict={this.state.dict}
-                  formlist={this.state.menuformlist}
-                  wrappedComponentRef={(inst) => this.menuformRef = inst}
+                  config={config}
+                  updatemenu={this.updateconfig}
                 />
                 {/* 琛ㄥ悕娣诲姞 */}
-                <div className="ant-col ant-form-item-label">
-                  <label>
-                    <Tooltip placement="topLeft" title="姝ゅ鍙互娣诲姞閰嶇疆鐩稿叧鐨勫父鐢ㄨ〃锛屽湪娣诲姞鎼滅储鏉′欢鍜屾樉绀哄垪鏃讹紝鍙�氳繃宸ュ叿鏍忎腑鐨勬坊鍔犳寜閽紝鎵归噺娣诲姞琛ㄦ牸鐩稿叧瀛楁銆�">
-                      <Icon type="question-circle" />
-                      {this.state.dict['header.menu.table.add']}
-                    </Tooltip>
-                  </label>
-                </div>
-                <Select
-                  showSearch
-                  className="tables"
-                  style={{ width: '100%' }}
-                  optionFilterProp="children"
-                  value={this.state.dict['header.menu.table.placeholder']}
-                  onChange={this.onTableChange}
-                  showArrow={false}
-                  getPopupContainer={() => document.getElementById('common-basedata')}
-                  filterOption={(input, option) => {
-                    return option.props.children.toLowerCase().indexOf(input.toLowerCase()) >= 0 ||
-                      option.props.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
-                  }}
-                > 
-                  {this.state.tables.map((table, index) => (
-                    <Option key={index} title={table.TbName} value={table.TbName}>{table.Remark}</Option>
-                  ))}
-                </Select>
-                {this.state.selectedTables.length > 0 && <List
-                  size="small"
-                  bordered
-                  dataSource={this.state.selectedTables}
-                  renderItem={(item, index) => <List.Item key={index} title={item.Remark + ' (' + item.TbName + ')'}>
-                    {item.Remark + ' (' + item.TbName + ')'}
-                    <Icon type="close" onClick={() => this.deleteTable(item)}/>
-                    <div className="bottom-mask"></div>
-                  </List.Item>}
-                />}
+                <TableComponent
+                  config={config}
+                  containerId="subtable-basedata"
+                  updatetable={this.updateconfig}
+                />
               </Panel>
               {/* 鎼滅储鏉′欢娣诲姞 */}
               <Panel header={this.state.dict['header.menu.search']} key="1">
@@ -2155,7 +949,11 @@
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
-                <Button type="primary" block onClick={() => this.queryField('search')}>{this.state.dict['header.menu.search.add']}</Button>
+                <FieldsComponent
+                  config={config}
+                  type="search"
+                  updatefield={this.updateconfig}
+                />
               </Panel>
               {/* 鎸夐挳娣诲姞 */}
               <Panel header={this.state.dict['header.menu.action']} key="2">
@@ -2165,7 +963,7 @@
                   })}
                 </div>
                 <div className="config-btn">
-                  {configAction.length > 0 ?
+                  {confActions.length > 0 ?
                     <p className="config-btn-title">
                       <Tooltip placement="topLeft" title="鐐瑰嚮鎸夐挳锛屽彲瀹屾垚鎴栨煡鐪嬫寜閽厤缃俊鎭��">
                         <Icon type="question-circle" />
@@ -2173,11 +971,8 @@
                       {this.state.dict['header.menu.action.configurable']}
                     </p> : null
                   }
-                  <div className="thawbutton" title={this.state.dict['header.form.thawbutton']} onClick={this.handleThaw}>
-                    <Icon type="unlock" />
-                  </div>
                 </div>
-                {configAction.map((item, index) => {
+                {confActions.map((item, index) => {
                   return (
                     <div key={index}>
                       <Button
@@ -2197,7 +992,11 @@
                     return (<SourceElement key={index} content={item}/>)
                   })}
                 </div>
-                <Button type="primary" block onClick={() => this.queryField('columns')}>{this.state.dict['header.menu.column.add']}</Button>
+                <FieldsComponent
+                  config={config}
+                  type="columns"
+                  updatefield={this.updateconfig}
+                />
               </Panel>
             </Collapse>
           </div>
@@ -2205,256 +1004,80 @@
             <Card title={
               <div>
                 鏍囩锛堝瓙琛級椤甸潰閰嶇疆 
-                <Icon type="redo" style={{marginLeft: '10px'}} title="鍒锋柊鏍囩鍒楄〃" onClick={this.reloadTab} />
+                <Icon type="redo" style={{marginLeft: '10px'}} title="鍒锋柊鏍囩鍒楄〃" onClick={() => this.reloadTab(true)} />
               </div>
             } bordered={false} extra={
               <div>
-                <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={this.state.config.enabled} onChange={this.onEnabledChange} />
-                <Button type="primary" onClick={this.submitConfig} loading={this.state.menuloading}>{this.state.dict['header.save']}</Button>
-                <Button onClick={this.cancelConfig}>{this.state.dict['header.return']}</Button>
+                <EditComponent dict={this.state.dict} options={['search', 'action', 'columns']} config={config} MenuID={config.uuid} thawButtons={this.state.thawButtons} refresh={this.updateConfig}/>
+                <Switch className="big" checkedChildren="鍚�" unCheckedChildren="鍋�" checked={config.enabled} onChange={this.onEnabledChange} />
+                <Button type="primary" onClick={this.submitConfig} loading={this.state.menuloading}>{this.state.dict['model.save']}</Button>
+                <Button onClick={this.cancelConfig}>{this.state.dict['model.back']}</Button>
               </div>
             } style={{ width: '100%' }}>
-              <Icon type="setting" onClick={this.changeSetting} />
-              <div className="search-list">
-                <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃悳绱€�嬩腑锛岄�夋嫨瀵瑰簲鎼滅储妗嗘嫋鑷虫澶勬坊鍔狅紱鎴栫偣鍑绘寜閽�婃坊鍔犳悳绱㈡潯浠躲�嬫壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ��">
-                  <Icon type="question-circle" />
-                </Tooltip>
-                <DragElement
-                  type="search"
-                  list={this.state.config.search}
-                  handleList={this.handleList}
-                  handleMenu={this.handleSearch}
-                  deleteMenu={this.deleteElement}
-                  placeholder={this.state.dict['header.form.search.placeholder']}
-                />
-              </div>
-              <div className="action-list">
-                <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃寜閽�嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬寜閽嫋鑷虫澶勬坊鍔狅紝濡傞�夋嫨鎸夐挳绫诲瀷涓鸿〃鍗曘�佹柊鏍囩椤电瓑鍚湁閰嶇疆椤甸潰鐨勬寜閽紝鍙湪宸︿晶宸ュ叿鏍�-鎸夐挳-鍙厤缃寜閽锛岀偣鍑绘寜閽畬鎴愮浉鍏抽厤缃�傛敞锛氬綋璁剧疆鎸夐挳鏄剧ず浣嶇疆涓鸿〃鏍兼椂锛屾樉绀哄垪浼氬鍔犳搷浣滃垪銆�">
-                  <Icon type="question-circle" />
-                </Tooltip>
-                <div className="copybutton" title={this.state.dict['header.form.paste']} onClick={() => {this.setState({modaltype: 'paste'})}}>
-                  <Icon type="snippets" />
-                </div>
-                <DragElement
-                  type="action"
-                  list={this.state.config.action}
-                  setting={this.state.config.setting}
-                  handleList={this.handleList}
-                  handleMenu={this.handleAction}
-                  copyElement={(val) => this.handleAction(val, 'copy')}
-                  deleteMenu={this.deleteElement}
-                  profileMenu={this.profileAction}
-                  placeholder={this.state.dict['header.form.action.placeholder']}
-                />
-              </div>
-              <div className="column-list">
-                <Tooltip placement="bottomLeft" overlayClassName="middle" title="鍦ㄥ乏渚у伐鍏锋爮銆婃樉绀哄垪銆嬩腑锛岄�夋嫨瀵瑰簲绫诲瀷鐨勬樉绀哄垪鎷栬嚦姝ゅ娣诲姞锛涙垨鐐瑰嚮銆婃坊鍔犳樉绀哄垪銆嬫寜閽壒閲忔坊鍔狅紝閫夋嫨鎵归噺娣诲姞鏃讹紝闇�鎻愬墠閫夋嫨浣跨敤琛ㄣ�傛敞锛氭坊鍔犲悎骞跺垪鏃讹紝闇�璁剧疆鍙�夊垪銆�">
-                  <Icon type="question-circle" />
-                </Tooltip>
-                <Switch checkedChildren="寮�" unCheckedChildren="鍏�" defaultChecked={this.state.showColumnName} onChange={this.onColumnNameChange} />
-                <DragElement
-                  type="columns"
-                  list={this.state.config.columns}
-                  setting={this.state.config.setting}
-                  gridBtn={this.state.config.gridBtn}
-                  handleList={this.handleList}
-                  handleMenu={this.handleColumn}
-                  deleteMenu={this.deleteElement}
-                  handleGridBtn={this.handleGridBtn}
-                  showfield={this.state.showColumnName}
-                  placeholder={this.state.dict['header.form.column.placeholder']}
-                />
+              <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}
+              />
+              <div className="chart-view" style={{position: 'relative'}}>
+                {/* 瑙嗗浘缁� 鏉冮檺 浼氬憳绛夌骇20+ */}
+                {this.props.memberLevel >= 20 ? <ChartGroupComponent
+                  config={config}
+                  updatechartgroup={this.updatechartgroup}
+                /> : null}
+                {config.charts.map(item => {
+                  if (!config.expand && chartview !== item.uuid) return ''
+
+                  if (item.chartType === 'table') {
+                    return (
+                      <Col span={item.width || 24} key={item.uuid}>
+                        {config.charts.length > 1 ? <p className="chart-title">{item.title}</p> : null}
+                        <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}
+                        />
+                      </Col>
+                    )
+                  } else if (item.chartType === 'card') {
+                    return (
+                      <Col span={item.width} key={item.uuid}>
+                        <CardComponent
+                          card={item}
+                          config={config}
+                          plotchange={this.updateconfig}
+                        />
+                      </Col>
+                    )
+                  } else {
+                    return (
+                      <Col span={item.width} key={item.uuid}>
+                        <ChartComponent
+                          plot={item}
+                          config={config}
+                          plotchange={this.updateconfig}
+                        />
+                      </Col>
+                    )
+                  }
+                })}
               </div>
             </Card>
           </div>
         </DndProvider>
-        {/* 缂栬緫鎼滅储鏉′欢 */}
-        <Modal
-          title={this.state.dict['header.modal.search.edit']}
-          visible={modaltype === 'search'}
-          width={700}
-          maskClosable={false}
-          onOk={this.handleSubmit}
-          onCancel={this.editModalCancel}
-          destroyOnClose
-        >
-          <SearchForm
-            dict={this.state.dict}
-            card={this.state.card}
-            formlist={this.state.formlist}
-            inputSubmit={this.handleSubmit}
-            optionLibs={this.state.optionLibs}
-            wrappedComponentRef={(inst) => this.searchFormRef = inst}
-          />
-        </Modal>
-        {/* 缂栬緫鎸夐挳锛氬鍒躲�佺紪杈� */}
-        <Modal
-          title={modaltype === 'actionEdit' ? this.state.dict['header.modal.action.edit'] : this.state.dict['header.modal.action.copy']}
-          visible={modaltype === 'actionEdit' || modaltype === 'actionCopy'}
-          width={700}
-          maskClosable={false}
-          onCancel={this.editModalCancel}
-          footer={[
-            modaltype === 'actionEdit' ? <CreateFunc key="create" dict={this.state.dict} ref="btnCreatFunc" trigger={this.creatFunc}/> : null,
-            <Button key="cancel" onClick={this.editModalCancel}>{this.state.dict['header.cancel']}</Button>,
-            <Button key="confirm" type="primary" onClick={this.handleSubmit}>{this.state.dict['header.confirm']}</Button>
-          ]}
-          destroyOnClose
-        >
-          <ActionForm
-            dict={this.state.dict}
-            card={this.state.card}
-            tabs={this.state.tabviews}
-            formlist={this.state.formlist}
-            inputSubmit={this.handleSubmit}
-            setting={this.state.config.setting}
-            wrappedComponentRef={(inst) => this.actionFormRef = inst}
-          />
-        </Modal>
-        {/* 鏄剧ず鍒楃紪杈� */}
-        <Modal
-          title={this.state.dict['header.modal.column.edit']}
-          visible={modaltype === 'columns'}
-          width={700}
-          maskClosable={false}
-          onOk={this.handleSubmit}
-          onCancel={this.editModalCancel}
-          destroyOnClose
-        >
-          <ColumnForm
-            dict={this.state.dict}
-            card={this.state.card}
-            inputSubmit={this.handleSubmit}
-            formlist={this.state.formlist}
-            wrappedComponentRef={(inst) => this.columnFormRef = inst}
-          />
-        </Modal>
-        {/* 鍚堝苟鍒楃紪杈� */}
-        <Modal
-          title={this.state.dict['header.modal.colspan.edit']}
-          visible={modaltype === 'colspan'}
-          width={700}
-          maskClosable={false}
-          onOk={this.handleSubmit}
-          onCancel={this.editModalCancel}
-          destroyOnClose
-        >
-          <ColspanForm
-            dict={this.state.dict}
-            card={this.state.card}
-            inputSubmit={this.handleSubmit}
-            columns={this.state.config.columns}
-            wrappedComponentRef={(inst) => this.columnFormRef = inst}
-          />
-        </Modal>
-        {/* 鎿嶄綔鍒楃紪杈� */}
-        <Modal
-          title={this.state.dict['header.modal.gridbtn.edit']}
-          visible={modaltype === 'gridbtn'}
-          width={700}
-          maskClosable={false}
-          onOk={this.handleSubmit}
-          onCancel={this.editModalCancel}
-          destroyOnClose
-        >
-          <GridBtnForm
-            dict={this.state.dict}
-            inputSubmit={this.handleSubmit}
-            card={this.state.config.gridBtn}
-            wrappedComponentRef={(inst) => this.gridBtnFormRef = inst}
-          />
-        </Modal>
-        {/* 鏍规嵁瀛楁鍚嶆坊鍔犳樉绀哄垪鍙婃悳绱㈡潯浠� */}
-        <Modal
-          wrapClassName="common-table-fields-modal"
-          title={this.state.dict['header.edit']}
-          visible={this.state.tableVisible}
-          width={'65vw'}
-          maskClosable={false}
-          style={{minWidth: '900px', maxWidth: '1200px'}}
-          cancelText={this.state.dict['header.close']}
-          onOk={this.addFieldSubmit}
-          onCancel={() => { // 鍙栨秷娣诲姞
-            this.setState({
-              tableVisible: false,
-              addType: ''
-            })
-          }}
-          destroyOnClose
-        >
-          {this.state.addType && this.state.fields.length > 0 ?
-            <EditCard data={this.state.fields} ref="searchcard" type={this.state.addType} dict={this.state.dict} /> : null
-          }
-          {(!this.state.fields || this.state.fields.length === 0) &&
-            <Empty />
-          }
-        </Modal>
-        {/* 鎸夐挳浣跨敤绯荤粺瀛樺偍杩囩▼鏃讹紝楠岃瘉淇℃伅妯℃�佹 */}
-        <Modal
-          wrapClassName="common-table-fields-modal"
-          title={'楠岃瘉淇℃伅'}
-          visible={this.state.profileVisible}
-          width={'75vw'}
-          maskClosable={false}
-          style={{minWidth: '900px', maxWidth: '1200px'}}
-          onOk={this.verifySubmit}
-          onCancel={() => { this.setState({ profileVisible: false }) }}
-          destroyOnClose
-        >
-          {this.state.card && this.state.card.OpenType !== 'excelIn' ?
-            <VerifyCard
-              floor="subtable"
-              card={this.state.card}
-              dict={this.state.dict}
-              columns={this.state.config.columns}
-              wrappedComponentRef={(inst) => this.verifyRef = inst}
-            /> : null
-          }
-          {this.state.card && this.state.card.OpenType === 'excelIn' ?
-            <VerifyCardExcelIn
-              card={this.state.card}
-              dict={this.state.dict}
-              columns={this.state.config.columns}
-              wrappedComponentRef={(inst) => this.verifyRef = inst}
-            /> : null
-          }
-          {this.state.card && this.state.card.OpenType === 'excelOut' ?
-            <VerifyCardExcelOut
-              card={this.state.card}
-              dict={this.state.dict}
-              wrappedComponentRef={(inst) => this.verifyRef = inst}
-            /> : null
-          }
-        </Modal>
-        {/* 璁剧疆鍏ㄥ眬閰嶇疆鍙婂垪琛ㄦ暟鎹簮 */}
-        <Modal
-          title={this.state.dict['header.edit']}
-          visible={this.state.settingVisible}
-          width={700}
-          maskClosable={false}
-          onCancel={() => { // 鍙栨秷淇敼
-            this.setState({
-              settingVisible: false
-            })
-          }}
-          footer={[
-            <CreateInterface key="interface" dict={this.state.dict} ref="tableCreatInterface" trigger={this.tableCreatInterface}/>,
-            <CreateFunc key="create" dict={this.state.dict} ref="tableCreatFunc" trigger={this.tableCreatFunc}/>,
-            <Button key="cancel" onClick={() => { this.setState({ settingVisible: false }) }}>{this.state.dict['header.cancel']}</Button>,
-            <Button key="confirm" type="primary" onClick={this.settingSave}>{this.state.dict['header.confirm']}</Button>
-          ]}
-          destroyOnClose
-        >
-          <SettingForm
-            dict={this.state.dict}
-            tabId={this.state.config.uuid}
-            inputSubmit={this.settingSave}
-            data={this.state.config.setting}
-            columns={this.state.config.columns}
-            usefulFields={this.props.permFuncField}
-            wrappedComponentRef={(inst) => this.settingRef = inst}
-          />
-        </Modal>
         <Modal
           bodyStyle={{textAlign: 'center', color: '#000000', fontSize: '16px'}}
           closable={false}
@@ -2462,41 +1085,13 @@
           visible={this.state.closeVisible}
           onCancel={() => { this.setState({closeVisible: false}) }}
           footer={[
-            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>{this.state.dict['header.save']}</Button>,
-            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>{this.state.dict['header.notsave']}</Button>,
-            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>{this.state.dict['header.cancel']}</Button>
+            <Button key="save" className="mk-btn mk-green" loading={this.state.menucloseloading} onClick={this.submitConfig}>{this.state.dict['model.save']}</Button>,
+            <Button key="confirm" className="mk-btn mk-yellow" onClick={this.handleViewBack}>{this.state.dict['model.notsave']}</Button>,
+            <Button key="cancel" onClick={() => { this.setState({closeVisible: false}) }}>{this.state.dict['model.cancel']}</Button>
           ]}
           destroyOnClose
         >
           {this.state.dict['header.menu.config.placeholder']}
-        </Modal>
-        {/* 瑙e喕鎸夐挳妯℃�佹 */}
-        <Modal
-          title={this.state.dict['header.form.thawbutton']}
-          okText={this.state.dict['header.confirm']}
-          cancelText={this.state.dict['header.cancel']}
-          visible={this.state.thawBtnVisible}
-          onOk={this.thawBtnSubmit}
-          onCancel={() => {this.setState({thawBtnVisible: false, thawbtnlist: null})}}
-          destroyOnClose
-        >
-          {!this.state.thawbtnlist && <Spin style={{marginLeft: 'calc(50% - 22px)', marginTop: '70px', marginBottom: '70px'}} size="large" />}
-          {this.state.thawbtnlist && <TransferForm ref="trawmenu" menulist={this.state.thawbtnlist}/>}
-        </Modal>
-        {/* 鎸夐挳閰嶇疆淇℃伅绮樿创澶嶅埗 */}
-        <Modal
-          title={this.state.dict['header.form.paste']}
-          visible={modaltype === 'paste'}
-          width={600}
-          maskClosable={false}
-          onOk={this.pasteSubmit}
-          onCancel={() => {this.setState({modaltype: ''})}}
-          destroyOnClose
-        >
-          <PasteForm
-            dict={this.state.dict}
-            wrappedComponentRef={(inst) => this.pasteFormRef = inst}
-          />
         </Modal>
         {this.state.loading && <Spin size="large" />}
       </div>
@@ -2506,7 +1101,7 @@
 
 const mapStateToProps = (state) => {
   return {
-    permFuncField: state.permFuncField
+    memberLevel: state.memberLevel
   }
 }
 

--
Gitblit v1.8.0