From f448bd7b318f7696c97b392a263bc364700bc8a0 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期二, 09 六月 2020 15:54:45 +0800
Subject: [PATCH] 2020-06-09

---
 src/templates/sharecomponent/settingcomponent/index.jsx     |    5 
 src/templates/zshare/modalform/index.jsx                    |    8 
 src/tabviews/zshare/actionList/excelin/index.jsx            |    0 
 src/templates/formtabconfig/index.jsx                       |    9 
 src/tabviews/managetable/index.jsx                          |    1 
 src/tabviews/zshare/actionList/printbutton/index.jsx        | 2719 ++++++++++++++++++++++++++++++++++++++
 src/templates/sharecomponent/chartcomponent/index.jsx       |    2 
 src/utils/devutils.js                                       |  459 ++++++
 src/tabviews/zshare/mutilform/index.jsx                     |  153 +
 src/tabviews/zshare/actionList/index.jsx                    |   92 
 src/templates/sharecomponent/actioncomponent/index.jsx      |   17 
 src/templates/zshare/createinterface/index.jsx              |    4 
 src/tabviews/subtable/index.jsx                             |    2 
 src/tabviews/subtabtable/index.jsx                          |    2 
 src/tabviews/zshare/actionList/excelin/index.scss           |    0 
 src/tabviews/zshare/actionList/printbutton/index.scss       |  228 +++
 src/tabviews/commontable/index.jsx                          |    2 
 src/templates/sharecomponent/treesettingcomponent/index.jsx |    5 
 src/utils/utils.js                                          |  458 ------
 src/views/login/index.jsx                                   |    1 
 20 files changed, 3,595 insertions(+), 572 deletions(-)

diff --git a/src/tabviews/commontable/index.jsx b/src/tabviews/commontable/index.jsx
index e159a73..37488e6 100644
--- a/src/tabviews/commontable/index.jsx
+++ b/src/tabviews/commontable/index.jsx
@@ -1357,8 +1357,6 @@
                         triggerBtn={triggerBtn}
                         dict={this.state.dict}
                         MenuID={this.props.MenuID}
-                        permRoles={this.props.permRoles}
-                        dataManager={this.props.dataManager}
                         logcolumns={this.state.logcolumns}
                         ContainerId={this.state.ContainerId}
                         refreshdata={this.refreshbyaction}
diff --git a/src/tabviews/managetable/index.jsx b/src/tabviews/managetable/index.jsx
index 991c009..f45fec6 100644
--- a/src/tabviews/managetable/index.jsx
+++ b/src/tabviews/managetable/index.jsx
@@ -920,7 +920,6 @@
               dict={this.state.dict}
               triggerBtn={triggerBtn}
               MenuID={this.props.MenuID}
-              dataManager={this.props.dataManager}
               logcolumns={this.state.logcolumns}
               ContainerId={this.state.ContainerId}
               refreshdata={this.refreshbyaction}
diff --git a/src/tabviews/subtable/index.jsx b/src/tabviews/subtable/index.jsx
index a5c0f11..539c284 100644
--- a/src/tabviews/subtable/index.jsx
+++ b/src/tabviews/subtable/index.jsx
@@ -982,8 +982,6 @@
                       BData={this.props.BData}
                       dict={this.state.dict}
                       MenuID={this.props.MenuID}
-                      dataManager={this.props.dataManager}
-                      permRoles={this.props.permRoles}
                       logcolumns={this.state.logcolumns}
                       refreshdata={this.refreshbyaction}
                       ContainerId={this.props.ContainerId}
diff --git a/src/tabviews/subtabtable/index.jsx b/src/tabviews/subtabtable/index.jsx
index 948d2e6..e059907 100644
--- a/src/tabviews/subtabtable/index.jsx
+++ b/src/tabviews/subtabtable/index.jsx
@@ -756,8 +756,6 @@
                       dict={this.state.dict}
                       BData={this.props.BData}
                       MenuID={this.props.SupMenuID}
-                      permRoles={this.props.permRoles}
-                      dataManager={this.props.dataManager}
                       logcolumns={this.state.logcolumns}
                       refreshdata={this.refreshbyaction}
                       ContainerId={this.props.ContainerId}
diff --git a/src/tabviews/zshare/excelin/index.jsx b/src/tabviews/zshare/actionList/excelin/index.jsx
similarity index 100%
rename from src/tabviews/zshare/excelin/index.jsx
rename to src/tabviews/zshare/actionList/excelin/index.jsx
diff --git a/src/tabviews/zshare/excelin/index.scss b/src/tabviews/zshare/actionList/excelin/index.scss
similarity index 100%
rename from src/tabviews/zshare/excelin/index.scss
rename to src/tabviews/zshare/actionList/excelin/index.scss
diff --git a/src/tabviews/zshare/actionList/index.jsx b/src/tabviews/zshare/actionList/index.jsx
index b64d801..3db42cd 100644
--- a/src/tabviews/zshare/actionList/index.jsx
+++ b/src/tabviews/zshare/actionList/index.jsx
@@ -1,16 +1,18 @@
 import React, {Component} from 'react'
 import PropTypes from 'prop-types'
 import moment from 'moment'
+import {connect} from 'react-redux'
 import { is, fromJS } from 'immutable'
 import { Button, Affix, Modal, notification, Spin, message } from 'antd'
 import * as XLSX from 'xlsx'
-import MutilForm from '@/tabviews/zshare/mutilform'
-import ExcelIn from '../excelin'
+import ExcelIn from './excelin'
+import asyncSpinComponent from '@/utils/asyncSpinComponent'
 import Utils from '@/utils/utils.js'
 import options from '@/store/options.js'
 import Api from '@/api'
 import './index.scss'
 
+const MutilForm = asyncSpinComponent(() => import('@/tabviews/zshare/mutilform'))
 const { confirm } = Modal
 let socket = null
 
@@ -31,9 +33,7 @@
     triggerPopview: PropTypes.func,   // 寮圭獥鏍囩椤佃Е鍙�
     getexceloutparam: PropTypes.func, // 鑾峰彇excel瀵煎嚭鏁版嵁
     gettableselected: PropTypes.func, // 鑾峰彇琛ㄦ牸涓暟鎹�
-    permRoles: PropTypes.any,         // 鐢ㄦ埛鏉冮檺鍒楄〃
     triggerBtn: PropTypes.any,
-    dataManager: PropTypes.any        // 鏁版嵁鏉冮檺
   }
 
   state = {
@@ -2612,7 +2612,7 @@
   getModels = () => {
     const { execAction } = this.state
 
-    if (!execAction || !this.state.visible) return
+    if (!execAction || !this.state.visible) return null
 
     let title = ''
     let width = '62vw'
@@ -2668,38 +2668,70 @@
 
     let fixed = this.props.setting.actionfixed && this.props.type === 'main' // 鎸夐挳鏄惁鍥哄畾鍦ㄥご閮�
 
-    let actionlist = <div className="button-list toolbar-button" id={fixed ? this.props.MenuID + 'mainaction' : ''}>
-      {this.props.actions.map((item, index) => {
-        let label = item.label
-        if (loadingUuid === item.uuid && loadingNumber !== '') {
-          label = label + '(' + loadingNumber + ')'
-        }
-
-        return (
-          <Button
-            className={'mk-btn mk-' + item.class}
-            icon={item.icon}
-            key={'action' + index}
-            onClick={() => {this.actionTrigger(item)}}
-            loading={loadingUuid === item.uuid}
-          >{label}</Button>
-        )
-      })}
-      {this.getModels()}
-      {btnloading && <Spin size="large" />}
-      <ExcelIn MenuID={this.props.MenuID} returndata={this.getexceldata} ref="excelIn" />
-    </div>
-
     if (fixed) {
       return (
         <Affix offsetTop={48}>
-          {actionlist}
+          <div className="button-list toolbar-button" id={fixed ? this.props.MenuID + 'mainaction' : ''}>
+            {this.props.actions.map((item, index) => {
+              let label = item.label
+              if (loadingUuid === item.uuid && loadingNumber !== '') {
+                label = label + '(' + loadingNumber + ')'
+              }
+
+              return (
+                <Button
+                  className={'mk-btn mk-' + item.class}
+                  icon={item.icon}
+                  key={'action' + index}
+                  onClick={() => {this.actionTrigger(item)}}
+                  loading={loadingUuid === item.uuid}
+                >{label}</Button>
+              )
+            })}
+            {this.getModels()}
+            {btnloading && <Spin size="large" />}
+            <ExcelIn MenuID={this.props.MenuID} returndata={this.getexceldata} ref="excelIn" />
+          </div>
         </Affix>
       )
     } else {
-      return actionlist
+      return (
+        <div className="button-list toolbar-button" id={fixed ? this.props.MenuID + 'mainaction' : ''}>
+          {this.props.actions.map((item, index) => {
+            let label = item.label
+            if (loadingUuid === item.uuid && loadingNumber !== '') {
+              label = label + '(' + loadingNumber + ')'
+            }
+
+            return (
+              <Button
+                className={'mk-btn mk-' + item.class}
+                icon={item.icon}
+                key={'action' + index}
+                onClick={() => {this.actionTrigger(item)}}
+                loading={loadingUuid === item.uuid}
+              >{label}</Button>
+            )
+          })}
+          {this.getModels()}
+          {btnloading && <Spin size="large" />}
+          <ExcelIn MenuID={this.props.MenuID} returndata={this.getexceldata} ref="excelIn" />
+        </div>
+      )
     }
   }
 }
 
-export default MainAction
\ No newline at end of file
+const mapStateToProps = (state) => {
+  return {
+    tabviews: state.tabviews,
+    permRoles: state.permRoles,
+    dataManager: state.dataManager
+  }
+}
+
+const mapDispatchToProps = () => {
+  return {}
+}
+
+export default connect(mapStateToProps, mapDispatchToProps)(MainAction)
\ No newline at end of file
diff --git a/src/tabviews/zshare/actionList/printbutton/index.jsx b/src/tabviews/zshare/actionList/printbutton/index.jsx
new file mode 100644
index 0000000..c6d4324
--- /dev/null
+++ b/src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -0,0 +1,2719 @@
+import React, {Component} from 'react'
+import PropTypes from 'prop-types'
+import moment from 'moment'
+import { is, fromJS } from 'immutable'
+import { Button, Affix, Modal, notification, Spin, message } from 'antd'
+import Utils from '@/utils/utils.js'
+import options from '@/store/options.js'
+import Api from '@/api'
+import './index.scss'
+
+let socket = null
+
+class PrintButton extends Component {
+  static propTpyes = {
+    menuType: PropTypes.any,          // 鑿滃崟绫诲瀷锛屾櫘閫氳彍鍗曟垨HS
+    BID: PropTypes.string,            // 涓昏〃ID
+    BData: PropTypes.any,             // 涓昏〃鏁版嵁
+    Tab: PropTypes.any,               // 濡傛灉褰撳墠鍏冪礌涓烘爣绛炬椂锛宼ab涓烘爣绛句俊鎭�
+    type: PropTypes.string,           // 鍒ゆ柇褰撳墠涓轰富琛紙main锛夈�佸瓙琛紙sub锛夈�佸瓙琛ㄦ爣绛撅紙subtab锛�
+    MenuID: PropTypes.string,         // 鑿滃崟ID
+    actions: PropTypes.array,         // 鎸夐挳缁�
+    logcolumns: PropTypes.array,      // 鏄剧ず鍒�
+    dict: PropTypes.object,           // 瀛楀吀椤�
+    setting: PropTypes.any,           // 椤甸潰閫氱敤璁剧疆
+    ContainerId: PropTypes.any,       // tab椤甸潰ID锛岀敤浜庡脊绐楁帶鍒�
+    refreshdata: PropTypes.func,      // 鎵ц瀹屾垚鍚庢暟鎹埛鏂�
+    triggerPopview: PropTypes.func,   // 寮圭獥鏍囩椤佃Е鍙�
+    getexceloutparam: PropTypes.func, // 鑾峰彇excel瀵煎嚭鏁版嵁
+    gettableselected: PropTypes.func, // 鑾峰彇琛ㄦ牸涓暟鎹�
+    triggerBtn: PropTypes.any,
+  }
+
+  state = {
+    visible: false,
+    formdata: null,
+    tabledata: null,
+    confirmLoading: false,
+    execAction: null,
+    loadingUuid: '',
+    btnloading: false,
+    configMap: {},
+    running: false,
+    loadingNumber: ''
+  }
+
+  /**
+   * @description 涓婄骇鑿滃崟id鍙樺寲鏃讹紝鍒锋柊鏁版嵁
+   */
+  UNSAFE_componentWillReceiveProps(nextProps) {
+    if (nextProps.triggerBtn && !is(fromJS(this.props.triggerBtn), fromJS(nextProps.triggerBtn)) && nextProps.triggerBtn.parentId === this.props.MenuID) {
+      if (!this.state.loadingUuid && !this.state.visible && !this.state.running) {
+        let _btn = nextProps.triggerBtn.button
+        if (!_btn.OpenType) {
+          _btn = this.props.actions.filter(item => item.uuid === _btn.uuid)[0]
+        }
+        if (_btn) {
+          this.actionTrigger(_btn, nextProps.triggerBtn.data)
+        }
+      }
+    }
+  }
+
+  refreshdata = (item, type) => {
+    this.props.refreshdata(item, type)
+  }
+  
+  /**
+   * @description 瑙﹀彂鎸夐挳鎿嶄綔
+   */
+  actionTrigger = (item, record) => {
+    const { setting, type, Tab, BID } = this.props
+
+    if (this.state.loadingUuid || this.state.visible || this.state.running) {
+      notification.warning({
+        top: 92,
+        message: '浠诲姟鎵ц涓紝璇风◢鍚庯紒',
+        duration: 5
+      })
+      return
+    }
+
+    if (type === 'sub' && Tab && Tab.supMenu && !BID) {
+      notification.warning({
+        top: 92,
+        message: '闇�瑕佷笂绾т富閿�硷紒',
+        duration: 5
+      })
+      return
+    }
+
+    let _this = this
+    let data = this.props.gettableselected() || []
+    
+    if (record) { // 琛ㄦ牸涓Е鍙戞寜閽�
+      data = [record]
+    }
+
+    if (item.Ot !== 'notRequired' && data.length === 0) {
+      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾暟鎹�
+      notification.warning({
+        top: 92,
+        message: this.props.dict['main.action.confirm.selectline'],
+        duration: 5
+      })
+      return
+    } else if (item.Ot === 'requiredSgl' && data.length !== 1) {
+      // 闇�瑕侀�夋嫨鍗曡鏃讹紝鏍¢獙鏁版嵁
+      notification.warning({
+        top: 92,
+        message: this.props.dict['main.action.confirm.selectSingleLine'],
+        duration: 5
+      })
+      return
+    } else if (item.Ot !== 'notRequired' && !setting.primaryKey) {
+      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾槸鍚﹁缃富閿�
+      notification.warning({
+        top: 92,
+        message: '鏈缃富閿紒',
+        duration: 5
+      })
+      return
+    }
+
+    if (item.OpenType === 'prompt') {
+      this.setState({
+        running: true
+      })
+      confirm({
+        title: this.props.dict['main.action.confirm.tip'],
+        onOk() {
+          _this.setState({
+            loadingUuid: item.uuid
+          })
+
+          return new Promise(resolve => {
+            _this.execSubmit(item, data, resolve)
+          })
+        },
+        onCancel() {
+          _this.setState({
+            running: false
+          })
+        }
+      })
+    } else if (item.OpenType === 'exec') {
+      this.setState({loadingUuid: item.uuid})
+      this.execSubmit(item, data, () => {
+        this.setState({loadingUuid: ''})
+      })
+    } else if (item.OpenType === 'pop') {
+      this.setState({
+        execAction: item,
+        tabledata: data,
+        btnloading: true
+      }, () => {
+        this.improveAction(item)
+      })
+    } else if (item.OpenType === 'excelOut') {
+      if (
+        item.intertype === 'inner' && !item.innerFunc &&
+        ((setting.interType === 'inner' && setting.innerFunc) || setting.interType === 'outer')
+      ) {
+        notification.warning({
+          top: 92,
+          message: '瀵煎嚭鎸夐挳閰嶇疆閿欒锛�',
+          duration: 5
+        })
+        return
+      }
+
+      this.triggerExcelout(item)
+
+    } else if (item.OpenType === 'excelIn') {
+      if (item.verify && item.verify.sheet && item.verify.columns && item.verify.columns.length > 0) {
+        let primaryId = '' // 瀵煎叆鏃惰Id
+        if (item.Ot === 'requiredSgl') {
+          primaryId = data[0][setting.primaryKey] || ''
+        }
+
+        this.refs.excelIn.exceltrigger(item, primaryId)
+      } else {
+        notification.warning({
+          top: 92,
+          message: 'excel瀵煎叆楠岃瘉淇℃伅鏈缃紒',
+          duration: 5
+        })
+      }
+    } else if (item.OpenType === 'popview' && this.props.type !== 'subtab') {
+      // 寮圭獥鏍囩璁剧疆涓轰笉閫夊垯琛屾椂锛屼笉浼犻�掓暟鎹�
+      this.props.triggerPopview(item, item.Ot === 'notRequired' ? [] : data)
+    } else if (item.OpenType === 'popview' && this.props.type === 'subtab') {
+      notification.warning({
+        top: 92,
+        message: '寮圭獥椤甸潰涓嶆敮鎸佹璁剧疆锛�',
+        duration: 5
+      })
+    } else if (item.OpenType === 'innerpage') {
+      let Id = data[0][setting.primaryKey]
+
+      if (item.pageTemplate === 'print') {
+        let cloudmsg = '&cuid=' + (sessionStorage.getItem('CloudUserID') || '') + '&csid=' + (sessionStorage.getItem('CloudSessionUid') || '') + '&clid=' + (sessionStorage.getItem('CloudLoginUID') || '') + '&cun=' + (sessionStorage.getItem('CloudUserName') || '')
+        let msg = '&uid=' + sessionStorage.getItem('UserID') + '&sid=' + sessionStorage.getItem('SessionUid') + '&lid=' + sessionStorage.getItem('LoginUID') + '&un=' + sessionStorage.getItem('User_Name')
+        let src = '#/print/' + window.btoa('ID=' + Id + msg + cloudmsg)
+        window.open(src)
+      } else {
+        notification.warning({
+          top: 92,
+          message: '椤甸潰绫诲瀷璁剧疆閿欒锛�',
+          duration: 5
+        })
+      }
+    } else if (item.OpenType === 'outerpage') {
+      let url = item.url
+      if (item.Ot === 'requiredSgl' && setting.primaryKey) {
+        url = url + '?ID=' + data[0][setting.primaryKey]
+      } else if (item.Ot !== 'notRequired' && !setting.primaryKey) {
+        let ids = data.map(_data => _data[setting.primaryKey]).join(',')
+        url = url + '?ID=' + ids
+      }
+      window.open(url)
+    } else if (item.OpenType === 'tab' || item.OpenType === 'blank') {
+      this.props.triggerPopview(item, data)
+    } else if (item.OpenType === 'funcbutton') {
+      if (item.funcType === 'changeuser') {
+        this.changeUser(item, data)
+      } else if (item.funcType === 'print') {
+        if (item.execMode === 'pop') {
+          this.setState({
+            execAction: item,
+            tabledata: data,
+            btnloading: true
+          }, () => {
+            this.improveAction(item)
+          })
+        } else if (item.execMode === 'prompt') {
+          this.setState({
+            running: true
+          })
+          confirm({
+            title: this.props.dict['main.action.confirm.tip'],
+            onOk() {
+              _this.triggerPrint(item, data)
+            },
+            onCancel() {
+              _this.setState({
+                running: false
+              })
+            }
+          })
+        } else {
+          this.triggerPrint(item, data)
+        }
+      }
+    } else {
+      notification.warning({
+        top: 92,
+        message: '瀹屽杽涓�傘�傘��',
+        duration: 5
+      })
+    }
+  }
+
+  /**
+   * @description 瑙﹀彂鎵撳嵃
+   */
+  triggerPrint = (btn, data, formlist = []) => {
+    let formdata = {}
+    formlist.forEach(_data => {
+      formdata[_data.key] = _data.value
+    })
+
+    if (
+      !btn.verify ||
+      (btn.verify.printMode === 'normal' && (!btn.verify.Template || !btn.verify.linkUrl)) ||
+      (btn.verify.printMode === 'custom' && (!btn.verify.printFunc || !btn.verify.linkUrl))
+    ) {
+      notification.warning({
+        top: 92,
+        message: '璇峰畬鍠勬墦鍗伴獙璇佷俊鎭紒',
+        duration: 5
+      })
+      return
+    }
+
+    let printlist = []
+    let templates = []
+    let printCount = 1
+
+    if (formdata.printCount && typeof(formdata.printCount) === 'number' && formdata.printCount >= 1) {
+      printCount = formdata.printCount
+    }
+
+    this.setState({loadingUuid: btn.uuid})
+
+    new Promise(resolve => {
+      if (btn.intertype === 'inner' && !btn.innerFunc) {
+        let printcell = {}
+
+        printcell.printType = formdata.printType || ''
+        printcell.printCount = printCount
+        printcell.templateID = btn.verify.Template || ''
+
+        if (btn.Ot === 'notRequired') {
+          printcell.data = [formdata]
+        } else {
+          printcell.data = data.map(cell => {
+            return {...cell, ...formdata}
+          })
+        }
+
+        templates.push(printcell.templateID)
+
+        printlist.push(printcell)
+
+        resolve(true)
+      } else {
+        this.getprintdata(btn, data, formdata, formlist).then(result => {
+          if (result.next) {
+            printlist = result.list.map(cell => {
+              cell.templateID = cell.templateID || btn.verify.Template
+              cell.printType = cell.printType || formdata.printType || ''
+
+              let _printCount = printCount
+              if (cell.printCount && typeof(cell.printCount) === 'number' && cell.printCount >= 1) {
+                _printCount = cell.printCount
+              }
+              
+              cell.printCount = _printCount
+
+              templates.push(cell.templateID)
+
+              return cell
+            })
+          }
+          
+          resolve(result.next)
+        })
+      }
+    }).then(res => {
+      // 鑾峰彇鎵撳嵃妯℃澘 getTemp
+      if (!res) return false
+
+      if (btn.verify.printMode === 'custom') {
+        this.execCustomPrint(btn, printlist, formdata)
+
+        return false
+      }
+
+      templates = Array.from(new Set(templates)) // 鍘婚噸
+
+      let deffers = templates.map(tempId => {
+        return new Promise(resolve => {
+          let param = {
+            func: 's_PrintTemplateMGetData',
+            Type: 'Y',
+            // ID: tempId, // 娣诲姞妯℃澘鏃讹紝淇濆瓨鍙婃煡璇娇鐢ㄦā鏉垮弬鏁�
+            PrintTempNO: tempId
+          }
+    
+          if (window.GLOB.mainSystemApi) { // 浠庡崟鐐圭櫥褰曟湇鍔″櫒鍙栨墦鍗伴厤缃俊鎭�
+            param.rduri = window.GLOB.mainSystemApi
+          }
+    
+          Api.getLocalConfig(param).then(result => {
+            result.tempId = tempId
+            resolve(result)
+          })
+        })
+      })
+
+      return Promise.all(deffers)
+    }).then(result => {
+      if (!result) return
+
+      let errorMsg = ''
+      let _temps = {}
+
+      result.forEach(res => {
+        if (res.status && !errorMsg) {
+          let _temp = this.getPrintConfigParam(res)
+
+          if (_temp.error) {
+            errorMsg = {
+              ErrCode: 'N',
+              message: _temp.error,
+              ErrMesg: _temp.error,
+              status: false
+            }
+          } else {
+            _temps[res.tempId] = _temp
+          }
+        } else if (!errorMsg) {
+          errorMsg = res
+        }
+      })
+
+      if (!errorMsg) {
+        this.execPrint(btn, printlist, _temps, formdata)
+      } else {
+        this.execError(errorMsg, btn)
+      }
+    })
+  }
+
+  execCustomPrint = (item, printlist, formdata) => {
+    this.setState({loadingUuid: ''})
+    this.execSuccess(item, {
+      ErrCode: '-1',
+      message: '',
+      ErrMesg: '',
+      status: true
+    })
+
+    try {
+      // eslint-disable-next-line
+      let func = new Function('data', 'form', 'printer', 'notification', item.verify.printFunc)
+      func(printlist, formdata, item.verify, notification)
+    } catch (e) {
+      console.warn(e)
+
+      try {
+        // eslint-disable-next-line
+        let evalfunc = eval('(true && function (data, form, printer, notification) {' + item.verify.printFunc + '})')
+        evalfunc(printlist, formdata, item.verify, notification)
+      } catch (error) {
+        console.warn(error)
+        notification.warning({
+          top: 92,
+          message: '鑷畾涔夊嚱鏁版墽琛岄敊璇紒',
+          duration: 5
+        })
+      }
+    }
+  }
+
+  /**
+   * @description 鑾峰彇鎵撳嵃鏁版嵁
+   */
+  getprintdata = (btn, data, formdata, formlist) => {
+    const { setting } = this.props
+
+    let _list = []
+    return new Promise(resolve => {
+      let params = []
+      let param = {}
+
+      if (this.props.BID) {
+        param.BID = this.props.BID
+      }
+
+      if (btn.Ot === 'notRequired') {
+        let _param = { ...param, ...formdata }
+        params.push(_param)
+      } else if (btn.Ot === 'requiredSgl') {
+        param[setting.primaryKey] = data[0][setting.primaryKey]
+
+        let _param = { ...param, ...formdata }
+
+        params.push(_param)
+      } else if (btn.Ot === 'requiredOnce') {
+        let ids = data.map(d => { return d[setting.primaryKey]})
+        ids = ids.filter(Boolean)
+        ids = ids.join(',')
+
+        param[setting.primaryKey] = ids
+
+        let _param = { ...param, ...formdata }
+
+        params.push(_param)
+      } else if (btn.Ot === 'required') {
+        params = data.map((cell, index) => {
+          let _param = { ...param }
+          _param[setting.primaryKey] = cell[setting.primaryKey]
+
+          formlist.forEach(_data => {
+            if (index !== 0 && _data.readin && cell.hasOwnProperty(_data.key)) {
+              _param[_data.key] = cell[_data.key]
+            } else {
+              _param[_data.key] = _data.value
+            }
+          })
+          return _param
+        })
+      }
+
+      if (btn.intertype === 'inner') {
+        params = params.map(_param => {
+          _param.func = btn.innerFunc
+
+          return _param
+        })
+
+        if (params.length <= 20) {
+          let deffers = params.map(par => {
+            return new Promise(resolve => {
+              Api.genericInterface(par).then(res => {
+                resolve(res)
+              })
+            })
+          })
+          Promise.all(deffers).then(result => {
+            let errorMsg = ''
+            result.forEach(res => {
+              if (!res.status) {
+                errorMsg = res
+              }
+            })
+            if (!errorMsg) {
+              resolve({next: true, list: result})
+            } else {
+              this.execError(errorMsg, btn)
+              resolve({next: false, list: []})
+            }
+          })
+        } else {
+          this.printInnerLoopRequest(params, btn, _list, resolve)
+        }
+      } else {
+        this.printOuterLoopRequest(params, btn, _list, resolve)
+      }
+    })
+  }
+
+  /**
+   * @description 澶栭儴璇锋眰寰幆鎵ц
+   */
+  printOuterLoopRequest = (params, btn, _list, _resolve) => {
+    let param = params.shift()
+    let _outParam = null
+
+    new Promise(resolve => {
+      // 鍐呴儴璇锋眰
+      if (btn.innerFunc) {
+        param.func = btn.innerFunc
+        // 瀛樺湪鍐呴儴鍑芥暟鏃讹紝鏁版嵁棰勫鐞�
+        Api.genericInterface(param).then(res => {
+          if (res.status) {
+            delete res.ErrCode
+            delete res.ErrMesg
+            delete res.message
+            delete res.status
+
+            // 浣跨敤澶勭悊鍚庣殑鏁版嵁璋冪敤澶栭儴鎺ュ彛
+            let keys = Object.keys(res) // 鎻愪氦澶栭儴鎺ュ彛鍓嶏紝娣诲姞BID
+            if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
+              res.BID = this.props.BID
+            }
+            
+            resolve(res)
+          } else {
+            this.execError(res, btn)
+            resolve(false)
+            _resolve({next: false, list: []})
+          }
+        })
+      } else {
+        resolve(param)
+      }
+    }).then(res => {
+      if (!res) return
+      // 澶栭儴璇锋眰
+      _outParam = JSON.parse(JSON.stringify(res))
+
+      if (this.props.menuType === 'HS') {
+        if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+          res.rduri = options.cloudServiceApi
+        } else if (btn.sysInterface !== 'true') {
+          res.rduri = btn.interface
+        }
+      } else {
+        if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+          res.rduri = window.GLOB.mainSystemApi
+        } else if (btn.sysInterface !== 'true') {
+          res.rduri = btn.interface
+        }
+      }
+
+      if (btn.outerFunc) {
+        res.func = btn.outerFunc
+      }
+
+      return Api.genericInterface(res)
+    }).then(response => {
+      if (!response) return
+
+      if (btn.callbackFunc) {
+        // 瀛樺湪鍥炶皟鍑芥暟鏃讹紝璋冪敤
+        delete response.message
+        delete response.status
+
+        response.func = btn.callbackFunc
+
+        let _callbackparam = {..._outParam, ...response}
+
+        return Api.genericInterface(_callbackparam)
+      } else if (response.status) {
+
+        _list.push(response)
+
+        // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
+        if (params.length === 0) {
+          _resolve({next: true, list: _list})
+        } else {
+          this.printOuterLoopRequest(params, btn, _list, _resolve)
+        }
+      } else {
+        this.execError(response, btn)
+        _resolve({next: false, list: []})
+      }
+    }).then(response => {
+      if (!response) return
+
+      if (response.status) {
+        _list.push(response)
+
+        // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
+        if (params.length === 0) {
+          _resolve({next: true, list: _list})
+        } else {
+          this.printOuterLoopRequest(params, btn, _list, _resolve)
+        }
+      } else {
+        this.execError(response, btn)
+        _resolve({next: false, list: []})
+      }
+    })
+  }
+
+  /**
+   * @description 鍐呴儴璇锋眰寰幆鎵ц
+   */
+  printInnerLoopRequest = (params, btn, _list, _resolve) => {
+    let param = params.shift()
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        _list.push(res)
+
+        if (params.length === 0) {
+          _resolve({next: true, list: _list})
+        } else {
+          this.printInnerLoopRequest(params, btn, _list, _resolve)
+        }
+      } else {
+        this.execError(res, btn)
+        _resolve({next: false, list: []})
+      }
+    })
+  }
+
+  getPrintConfigParam = (res) => {
+    let error = ''         // 閿欒淇℃伅
+    let configParam = ''   // 妯℃澘閰嶇疆淇℃伅
+    let _configparam = ''  // 鎵撳嵃閰嶇疆淇℃伅
+    let fields = []        // 妯℃澘涓墍闇�瀛楁
+    let nonEFields = []    // 闈炵┖瀛楁
+
+    if (!res.ConfigParam) {
+      error = '鏈幏鍙栧埌鎵撳嵃妯℃澘淇℃伅锛�'
+    } else {
+      try {
+        configParam = JSON.parse(window.decodeURIComponent(window.atob(res.ConfigParam)))
+      } catch (e) {
+        configParam = ''
+      }
+  
+      if (!configParam) {
+        error = '鎵撳嵃妯℃澘瑙f瀽閿欒锛�'
+      } else {
+        
+        let control = configParam.elements.map(element => {
+          let _field = element.field
+
+          if (_field === 'other_field') {
+            _field = element.cusfield || ''
+          }
+
+          let item = {
+            Name: element.name || '',
+            Type: element.type,
+            Value: element.value || '',
+            Field: _field,
+            Left: element.left,
+            Top: element.top,
+            Width: element.width,
+            Height: element.height,
+            Rotate: element.rotate,
+            BorderSize: element.borderSize / 10,
+            BorderColor: element.borderColor,
+            Align: element.align,
+            VerticalAlign: element.vertialAlign,
+            BackColor: element.background,
+            ForeColor: 'black'
+          }
+  
+          if (!item.Width || !item.Height) {
+            item.Type = 'line'
+            item.Value = ''
+            item.Field = ''
+            item.FontFamily = element.fontFamily || ''
+            item.FontSize = element.fontSize || ''
+            item.FontStyle = (!element.fontWeight || element.fontWeight === 'normal') ? 'regular' : element.fontWeight
+            item.Padding = 0
+            item.Trimming = ''
+          } else if (item.Type === 'image') {
+            item.ImageWidth = element.imgWidth
+            item.ImageHeight = element.imgHeight
+            item.Trimming = ''
+          } else if (item.Type === 'text') {
+            item.FontFamily = element.fontFamily
+            item.FontSize = element.fontSize
+            item.FontStyle = element.fontWeight === 'normal' ? 'regular' : element.fontWeight
+            item.Padding = element.padding / 2
+            item.Trimming = ''
+          } else if (item.Type === 'barcode') {
+            item.BarcodeType = element.barcodeType
+            item.BarcodeWidth = element.barcodeWidth
+            item.BarcodeHeight = element.barcodeHeight
+            item.BarcodeLabel = element.barcodeLabel
+            item.LabelSize = element.fontSize
+          } else if (item.Type === 'qrcode') {
+            item.Type = 'barcode'
+            item.BarcodeType = element.barcodeType
+            item.BarcodeWidth = element.qrcodeWidth
+            item.BarcodeHeight = element.qrcodeWidth
+            item.BarcodeLabel = false
+          }
+
+          if (item.Field) {
+            fields.push(item.Field)
+            // 鏉$爜浜岀淮鐮佸瓧娈典笉鍙负绌�
+            if (item.Type === 'qrcode' || item.Type === 'barcode') {
+              nonEFields.push(item.Field)
+            }
+          }
+
+          return item
+        })
+  
+        _configparam = {
+          Version: '',
+          Title: configParam.name,
+          Author: sessionStorage.getItem('UserID'),
+          Description: configParam.remark,
+          PrintTempNO: configParam.PrintTempNO,
+          PageSetting: {
+            Width: configParam.width,
+            Height: configParam.height,
+            Left: '0',
+            Right: '0',
+            Top: '0',
+            Bottom: '0',
+            Landscape: false
+          },
+          PageHeader: [],
+          ReportHeader: {
+            Control: control
+          },
+          ReportFooter: [],
+          PageFooter: []
+        }
+      }
+    }
+
+    return {
+      error: error,
+      config: _configparam,
+      fields: fields,
+      nonEFields: nonEFields
+    }
+  }
+
+  execPrint = (item, list, template, formdata) => {
+    let _errors = []
+    
+    let defaultPrinter = item.verify.defaultPrinter || 'lackprinter'
+    let printers = {}
+    if (item.verify.printerTypeList && item.verify.printerTypeList.length > 0) {
+      item.verify.printerTypeList.forEach(cell => {
+        if (cell.printer) {
+          printers[cell.Value] = cell.printer
+        }
+      })
+    }
+
+    let printdata = {}
+
+    list.forEach(res => {
+      let _printer = defaultPrinter
+
+      if (res.printType && printers[res.printType]) {
+        _printer = printers[res.printType]
+      }
+
+      printdata[_printer] = printdata[_printer] || []
+
+      printdata[_printer].push(res)
+    })
+
+    let printerList = []
+
+    Object.keys(printdata).forEach(printer => {
+      let _documents = []
+      Object.keys(template).forEach(key => {
+        let _datalist = printdata[printer].filter(cell => cell.templateID === key)
+  
+        if (_datalist.length > 0) {
+          let _data = []
+          _datalist.forEach(res => {
+            res.data.forEach(_cell => {
+              for (let i = 0; i < res.printCount; i++) {
+                _data.push({...formdata, ..._cell})
+              }
+            })
+          })
+
+          let _fields = Array.from(new Set(template[key].fields))
+          let _nonEFields = Array.from(new Set(template[key].nonEFields))
+          let lacks = []
+          let emptys = []
+  
+          _data.forEach(d => {
+            _fields.forEach(f => {
+              if (!d.hasOwnProperty(f)) {
+                lacks.push(f)
+              } else if (_nonEFields.includes(f) && !d[f] && d[f] !== 0) {
+                emptys.push(f)
+              }
+            })
+          })
+  
+          let _cell = {
+            documentID: Utils.getuuid(),
+            contents: [
+              {
+                data: _data,
+                templateURL: JSON.stringify(template[key].config)
+              }
+            ]
+          }
+  
+          if (lacks.length > 0 || emptys.length > 0) {
+            lacks = Array.from(new Set(lacks))
+            emptys = Array.from(new Set(emptys))
+  
+            _errors.push({
+              title: template[key].config.Title,
+              lacks: lacks,
+              emptys: emptys
+            })
+          }
+  
+          _documents.push(_cell)
+        }
+      })
+
+      if (_documents.length > 0) {
+        printerList.push({
+          cmd: 'print',
+          requestID: Utils.getuuid(),
+          version: Utils.getuuid(),
+          task: {
+            taskID: Utils.getuuid(),
+            preview: false,
+            printer: printer,
+            documents: _documents
+          }
+        })
+      }
+    })
+
+    if (list.length === 0) {
+      this.setState({loadingUuid: ''})
+      this.execError({
+        ErrCode: 'N',
+        message: '鏈幏鍙栧埌鎵撳嵃淇℃伅锛�',
+        ErrMesg: '',
+        status: false
+      }, item)
+      return
+    } else if (_errors.length > 0) {
+      let lackerror = []
+      let emptyerror = []
+
+      _errors.forEach(err => {
+        if (err.lacks.length > 0) {
+          lackerror.push(`鏁版嵁涓湭鑾峰彇鍒版ā鏉匡紙${err.title}锛�${err.lacks.join('銆�')} 瀛楁`)
+        }
+        if (err.emptys.length > 0) {
+          emptyerror.push(`鏁版嵁涓ā鏉匡紙${err.title}锛� ${err.emptys.join('銆�')} 瀛楁涓嶅彲涓虹┖`)
+        }
+      })
+
+      let msg = []
+      if (lackerror.length > 0) {
+        msg.push(lackerror.join(' ; '))
+      }
+
+      if (emptyerror.length > 0) {
+        msg.push(emptyerror.join(' ; '))
+      }
+
+      this.setState({loadingUuid: ''})
+      this.execError({
+        ErrCode: 'N',
+        message: msg.join(' ; ') + ' !',
+        ErrMesg: '',
+        status: false
+      }, item)
+      return
+    }
+
+    let lackItems = printerList.filter(cell => cell.task.printer === 'lackprinter')[0]
+
+    if (!socket || socket.readyState !== 1 || socket.url !== 'ws://' + item.verify.linkUrl) {
+      socket = new WebSocket('ws://' + item.verify.linkUrl)
+    } else {
+      if (lackItems) {
+        let request  = {
+          requestID: '',
+          version: '',
+          cmd: 'getPrinters'
+        }
+        socket.send(JSON.stringify(request))
+      } else {
+        printerList.forEach(cell => {
+          socket.send(JSON.stringify(cell))
+        })
+
+        this.setState({loadingUuid: ''})
+        this.execSuccess(item, {
+          ErrCode: 'S',
+          message: '',
+          ErrMesg: '鎵撳嵃璇锋眰宸插彂鍑恒��',
+          status: true
+        })
+      }
+    }
+    // 鎵撳紑Socket
+    socket.onopen = () =>{
+      if (lackItems) {
+        let request  = {
+          requestID: '',
+          version: '',
+          cmd: 'getPrinters'
+        }
+        socket.send(JSON.stringify(request))
+      } else {
+        printerList.forEach(cell => {
+          socket.send(JSON.stringify(cell))
+        })
+
+        this.setState({loadingUuid: ''})
+        this.execSuccess(item, {
+          ErrCode: 'S',
+          message: '',
+          ErrMesg: '鎵撳嵃璇锋眰宸插彂鍑恒��',
+          status: true
+        })
+      }
+    }
+    // 鐩戝惉娑堟伅
+    socket.onmessage = (event) => {
+      let data = ''
+
+      if (event.data) {
+        try {
+          data = JSON.parse(event.data)
+        } catch {
+          this.setState({loadingUuid: ''})
+          this.execError({
+            ErrCode: 'N',
+            message: event.data,
+            ErrMesg: '',
+            status: false
+          }, item)
+
+          data = ''
+        }
+      }
+
+      if (data && data.cmd === 'getPrinters' && data.status) {
+        printerList.forEach(cell => {
+          if (cell.task.printer === 'lackprinter') {
+            cell.task.printer = data.defaultPrinter
+          }
+          socket.send(JSON.stringify(cell))
+        })
+
+        this.setState({loadingUuid: ''})
+        this.execSuccess(item, {
+          ErrCode: 'S',
+          message: '',
+          ErrMesg: '鎵撳嵃璇锋眰宸插彂鍑恒��',
+          status: true
+        })
+      } else if (data && data.message && !data.status) {
+        this.setState({loadingUuid: ''})
+        this.execError({
+          ErrCode: 'N',
+          message: data.message,
+          ErrMesg: '',
+          status: false
+        }, item)
+      }
+    }
+
+    socket.onerror = () => {
+      this.setState({loadingUuid: ''})
+      this.execError({
+        ErrCode: 'N',
+        message: '鏃犳硶杩炴帴鍒�:' + item.verify.linkUrl,
+        ErrMesg: '',
+        status: false
+      }, item)
+    }
+  }
+
+  /**
+   * @description 鍒囨崲鐢ㄦ埛
+   */
+  changeUser = (btn, data) => {
+    const { setting } = this.props
+    let _this = this
+
+    let param = {
+      func: 'webapi_ChangeUser'
+    }
+
+    if (this.props.BID) {
+      param.BID = this.props.BID
+    }
+
+    if (window.GLOB.mainSystemApi) {
+      param.rduri = window.GLOB.mainSystemApi
+    }
+
+    param[setting.primaryKey] = data[0][setting.primaryKey]
+
+    this.setState({
+      running: true
+    })
+    confirm({
+      title: this.props.dict['main.action.confirm.tip'],
+      onOk() {
+        return new Promise(resolve => {
+          Api.genericInterface(param).then(res => {
+            resolve()
+            if (res.status) {
+              sessionStorage.setItem('avatar', res.icon || '')
+              sessionStorage.setItem('UserID', res.UserID)
+              sessionStorage.setItem('SessionUid', Utils.getuuid())
+              sessionStorage.setItem('LoginUID', res.LoginUID)
+              sessionStorage.setItem('User_Name', res.UserName)
+              sessionStorage.setItem('Full_Name', res.FullName)
+              
+              window.location.reload()
+            } else {
+              notification.error({
+                top: 92,
+                message: res.message || res.ErrMesg,
+                duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
+              })
+            }
+          })
+        })
+      },
+      onCancel() {
+        _this.setState({
+          running: false
+        })
+      }
+    })
+  }
+
+  /**
+   * @description 鎸夐挳鎻愪氦鎵ц
+   */
+  execSubmit = (btn, data, _resolve, formdata) => {
+    const { setting, logcolumns } = this.props
+
+    if (btn.OpenType === 'funcbutton' && btn.funcType === 'print' && btn.execMode === 'pop') {
+      this.setState({
+        confirmLoading: false,
+        visible: false
+      })
+      this.triggerPrint(btn, data, formdata)
+      return
+    }
+    if (btn.intertype === 'inner') {
+      // 浣跨敤鍐呴儴鎺ュ彛鏃讹紝鍐呴儴鍑芥暟鍜屾暟鎹簮涓嶅彲鍚屾椂涓虹┖, 浣跨敤绯荤粺鍑芥暟鏃讹紝绫诲瀷涓嶅彲涓虹┖
+      if (!btn.innerFunc && (!btn.sql || (btn.sql && !btn.sqlType))) {
+        this.actionSettingError()
+        _resolve()
+        return
+      }
+
+      // 鎵ц鏂瑰紡涓哄琛屾嫾鎺ワ紝涓旀墦寮�鏂瑰紡涓鸿〃鍗曟椂锛屼細杞负寰幆鍙戦�佽姹�
+      // 鎵撳紑鏂瑰紡涓烘ā鎬佹锛屼娇鐢ㄥ唴閮ㄥ嚱鏁版坊鍔�(鏈夋壒閲忔坊鍔犲満鏅紝宸插幓闄�)
+      if (
+        btn.Ot === 'notRequired' ||
+        btn.Ot === 'requiredSgl' ||
+        btn.Ot === 'requiredOnce'
+      ) {
+
+        // 鍒涘缓鍑瘉鏃讹紝闇�瑕侀�夋嫨琛屾椂
+        if (data.length === 0 && !btn.innerFunc && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
+          notification.warning({
+            top: 92,
+            message: '浣跨敤鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒',
+            duration: 5
+          })
+          return
+        }
+
+        let param = { // 绯荤粺瀛樺偍杩囩▼
+          func: 'sPC_TableData_InUpDe'
+        }
+
+        if (this.props.BID) {
+          param.BID = this.props.BID
+        }
+        
+        let primaryId = ''
+
+        if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
+          let ids = data.map(d => { return d[setting.primaryKey] || ''})
+          ids = ids.filter(Boolean)
+          primaryId = ids.join(',')
+        }
+
+        if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { // 鏄惁寮规鎴栫洿鎺ユ墽琛�
+          if (btn.innerFunc) { // 浣跨敤鑷畾涔夊嚱鏁�
+            param.func = btn.innerFunc
+            if (setting.primaryKey) { // 涓婚敭瀛樺湪鏃讹紝璁剧疆涓婚敭鍙傛暟
+              param[setting.primaryKey] = primaryId
+            }
+          } else if (btn.sql) {
+            param.ID = primaryId
+            param.LText = Utils.getSysDefaultSql(btn, setting, '', param, data[0], logcolumns, this.props.Tab) // 鏁版嵁婧�
+
+            if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+              param.LText = param.LText.replace(/\$@/ig, '/*')
+              param.LText = param.LText.replace(/@\$/ig, '*/')
+            } else {
+              param.LText = param.LText.replace(/@\$|\$@/ig, '')
+            }
+
+            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)
+          }
+        } else if (btn.OpenType === 'pop') { // 琛ㄥ崟
+          if (btn.innerFunc) {
+            param.func = btn.innerFunc
+
+            if (setting.primaryKey) { // 涓婚敭瀛樺湪鏃讹紝璁剧疆涓婚敭鍙傛暟
+              param[setting.primaryKey] = primaryId
+            }
+
+            formdata.forEach(_data => {
+              param[_data.key] = _data.value
+            })
+
+          } else if (btn.sql && btn.sqlType === 'insert') { // 绯荤粺鍑芥暟娣诲姞鏃讹紝鐢熸垚uuid
+            primaryId = ''
+
+            if (formdata && setting.primaryKey) { // 琛ㄥ崟涓瓨鍦ㄤ富閿瓧娈碉紝涓婚敭鍊间互琛ㄥ崟涓殑鍊间负鍑�
+              let _form = formdata.filter(_form => _form.key === setting.primaryKey)[0]
+              if (_form) {
+                primaryId = _form.value
+              }
+            }
+
+            param.ID = primaryId || Utils.getguid()
+            param.LText = Utils.getSysDefaultSql(btn, setting, formdata, param, data[0], logcolumns, this.props.Tab) // 鏁版嵁婧�
+            
+            if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+              param.LText = param.LText.replace(/\$@/ig, '/*')
+              param.LText = param.LText.replace(/@\$/ig, '*/')
+            } else {
+              param.LText = param.LText.replace(/@\$|\$@/ig, '')
+            }
+
+            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)
+          } else if (btn.sql) {
+            param.ID = primaryId
+            param.LText = Utils.getSysDefaultSql(btn, setting, formdata, param, data[0], logcolumns, this.props.Tab) // 鏁版嵁婧�
+            
+            if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+              param.LText = param.LText.replace(/\$@/ig, '/*')
+              param.LText = param.LText.replace(/@\$/ig, '*/')
+            } else {
+              param.LText = param.LText.replace(/@\$|\$@/ig, '')
+            }
+            
+            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.genericInterface(param).then((res) => {
+          if (res.status) {
+            this.execSuccess(btn, res)
+          } else {
+            this.execError(res, btn)
+          }
+          _resolve()
+        })
+      } else if (btn.Ot === 'required') {
+        let _formPrimaryId = ''
+        if (formdata && setting.primaryKey) { // 琛ㄥ崟涓瓨鍦ㄤ富閿瓧娈碉紝涓婚敭鍊间互琛ㄥ崟涓殑鍊间负鍑�
+          let _form = formdata.filter(_form => _form.key === setting.primaryKey)[0]
+          if (_form) {
+            _formPrimaryId = _form.value
+          }
+        }
+
+        let _params = data.map((cell, index) => {
+          let param = {
+            func: 'sPC_TableData_InUpDe'
+          }
+
+          if (this.props.BID) {
+            param.BID = this.props.BID
+          }
+
+          let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
+
+          if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') { // 鏄惁寮规鎴栫洿鎺ユ墽琛�
+
+            if (btn.innerFunc) {
+              param.func = btn.innerFunc
+              if (setting.primaryKey) {
+                param[setting.primaryKey] = primaryId
+              }
+            } else if (btn.sql) {
+              param.ID = primaryId
+              param.LText = Utils.getSysDefaultSql(btn, setting, '', param, cell, logcolumns, this.props.Tab) // 鏁版嵁婧�
+              
+              if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+                param.LText = param.LText.replace(/\$@/ig, '/*')
+                param.LText = param.LText.replace(/@\$/ig, '*/')
+              } else {
+                param.LText = param.LText.replace(/@\$|\$@/ig, '')
+              }
+
+              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)
+            }
+          } else if (btn.OpenType === 'pop') { // 琛ㄥ崟
+            if (index !== 0) {
+              formdata = formdata.map(_data => {
+                if (_data.readin && cell.hasOwnProperty(_data.key)) {
+                  _data.value = cell[_data.key]
+                }
+                return _data
+              })
+            }
+
+            if (btn.innerFunc) {
+              param.func = btn.innerFunc
+
+              formdata.forEach(_data => {
+                param[_data.key] = _data.value
+              })
+
+              if (setting.primaryKey) {
+                param[setting.primaryKey] = primaryId
+              }
+            } else if (btn.sql && btn.sqlType === 'insert') { // 绯荤粺鍑芥暟娣诲姞鏃讹紝鐢熸垚uuid
+              param.ID = _formPrimaryId || Utils.getguid()
+              param.LText = Utils.getSysDefaultSql(btn, setting, formdata, param, cell, logcolumns, this.props.Tab) // 鏁版嵁婧�
+              
+              if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+                param.LText = param.LText.replace(/\$@/ig, '/*')
+                param.LText = param.LText.replace(/@\$/ig, '*/')
+              } else {
+                param.LText = param.LText.replace(/@\$|\$@/ig, '')
+              }
+
+              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)
+            } else if (btn.sql) {
+              param.ID = primaryId
+              param.LText = Utils.getSysDefaultSql(btn, setting, formdata, param, cell, logcolumns, this.props.Tab) // 鏁版嵁婧�
+              
+              if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+                param.LText = param.LText.replace(/\$@/ig, '/*')
+                param.LText = param.LText.replace(/@\$/ig, '*/')
+              } else {
+                param.LText = param.LText.replace(/@\$|\$@/ig, '')
+              }
+
+              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)
+            }
+          }
+
+          return param
+        })
+
+        if (_params.length <= 20) {
+          let deffers = _params.map(param => {
+            return new Promise(resolve => {
+              Api.genericInterface(param).then(res => {
+                resolve(res)
+              })
+            })
+          })
+          Promise.all(deffers).then(result => {
+            let iserror = false
+            let errorMsg = ''
+            result.forEach(res => {
+              if (res.status) {
+                errorMsg = res
+              } else {
+                iserror = true
+                errorMsg = res
+              }
+            })
+            if (!iserror) {
+              this.execSuccess(btn, errorMsg)
+            } else {
+              this.execError(errorMsg, btn)
+            }
+            _resolve()
+          })
+        } else { // 瓒呭嚭20涓姹傛椂寰幆鎵ц
+          this.innerLoopRequest(_params, btn, _resolve)
+        }
+      } else {
+        this.actionSettingError()
+        _resolve()
+        return
+      }
+    } else if (btn.intertype === 'outer') {
+      /** *********************璋冪敤澶栭儴鎺ュ彛************************* */
+      if (!btn.interface) { // 鎺ュ彛鍦板潃涓嶅瓨鍦ㄦ椂鎶ラ敊
+        this.actionSettingError()
+        _resolve()
+        return
+      }
+
+      let _params = [] // 璇锋眰鍙傛暟鏁扮粍
+
+      if (btn.Ot === 'notRequired' || btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
+        let param = {}
+
+        if (this.props.BID) {
+          param.BID = this.props.BID
+        }
+
+        if (btn.OpenType === 'pop' && formdata) { // 琛ㄥ崟
+          formdata.forEach(_data => {
+            param[_data.key] = _data.value
+          })
+        }
+
+        // 鑾峰彇id
+        if (btn.Ot === 'notRequired') {
+          
+        } else if (btn.Ot === 'requiredSgl' && setting.primaryKey) {
+          param[setting.primaryKey] = data[0][setting.primaryKey]
+        } else if (btn.Ot === 'requiredOnce' && setting.primaryKey) {
+          let ids = data.map(d => { return d[setting.primaryKey]})
+          param[setting.primaryKey] = ids.join(',')
+        }
+
+        _params.push(param)
+      } else if (btn.Ot === 'required') {
+        // 閫夋嫨澶氳锛屽惊鐜皟鐢�
+        _params = data.map((cell, index) => {
+          let _cell = {}
+
+          if (this.props.BID) {
+            _cell.BID = this.props.BID
+          }
+
+          let _formparam = {}
+          if (btn.OpenType === 'pop' && formdata) { // 琛ㄥ崟
+            formdata.forEach(_data => {
+              if (index !== 0 && _data.readin && cell.hasOwnProperty(_data.key)) {
+                _formparam[_data.key] = cell[_data.key]
+              } else {
+                _formparam[_data.key] = _data.value
+              }
+            })
+          }
+
+          if (setting.primaryKey) {
+            _cell[setting.primaryKey] = cell[setting.primaryKey]
+          }
+
+          _cell = {..._formparam, ..._cell}
+
+          return _cell
+        })
+      } else {
+        this.actionSettingError()
+        _resolve()
+        return
+      }
+
+      // 寰幆璋冪敤澶栭儴鎺ュ彛锛堝寘鎷唴閮ㄥ強鍥炶皟鍑芥暟锛�
+      this.outerLoopRequest(_params, btn, _resolve, _params.length > 20)
+      
+    } else {
+      this.actionSettingError()
+      _resolve()
+      return
+    }
+  }
+
+  /**
+   * @description 鍐呴儴璇锋眰寰幆鎵ц
+   */
+  innerLoopRequest = (params, btn, _resolve) => {
+    if (!params && params.length === 0) return
+
+    let param = params.shift()
+
+    this.setState({
+      loadingNumber: params.length || ''
+    })
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        if (params.length === 0) {
+          this.execSuccess(btn, res)
+          _resolve()
+        } else {
+          this.innerLoopRequest(params, btn, _resolve)
+        }
+      } else {
+        this.execError(res, btn)
+        _resolve()
+      }
+    })
+  }
+
+  /**
+   * @description 澶栭儴璇锋眰寰幆鎵ц
+   */
+  outerLoopRequest = (params, btn, _resolve, widthNumber) => {
+    if (!params && params.length === 0) return
+
+    let param = params.shift()
+    let _outParam = null
+
+    if (widthNumber) {
+      this.setState({
+        loadingNumber: params.length || ''
+      })
+    }
+
+    new Promise(resolve => {
+      // 鍐呴儴璇锋眰
+      if (btn.innerFunc) {
+        param.func = btn.innerFunc
+        // 瀛樺湪鍐呴儴鍑芥暟鏃讹紝鏁版嵁棰勫鐞�
+        Api.genericInterface(param).then(res => {
+          if (res.status) {
+            delete res.ErrCode
+            delete res.ErrMesg
+            delete res.message
+            delete res.status
+
+            // 浣跨敤澶勭悊鍚庣殑鏁版嵁璋冪敤澶栭儴鎺ュ彛
+            let keys = Object.keys(res) // 鎻愪氦澶栭儴鎺ュ彛鍓嶏紝娣诲姞BID
+            if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
+              res.BID = this.props.BID
+            }
+            
+            resolve(res)
+          } else {
+            this.execError(res, btn)
+            resolve(false)
+            _resolve()
+          }
+        })
+      } else {
+        resolve(param)
+      }
+    }).then(res => {
+      if (!res) return
+      // 澶栭儴璇锋眰
+      _outParam = JSON.parse(JSON.stringify(res))
+
+      if (this.props.menuType === 'HS') {
+        if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+          res.rduri = options.cloudServiceApi
+        } else if (btn.sysInterface !== 'true') {
+          res.rduri = btn.interface
+        }
+      } else {
+        if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+          res.rduri = window.GLOB.mainSystemApi
+        } else if (btn.sysInterface !== 'true') {
+          res.rduri = btn.interface
+        }
+      }
+
+      if (btn.outerFunc) {
+        res.func = btn.outerFunc
+      }
+
+      return Api.genericInterface(res)
+    }).then(response => {
+      if (!response) return
+      // 鍥炶皟璇锋眰
+      if (btn.callbackFunc) {
+        // 瀛樺湪鍥炶皟鍑芥暟鏃讹紝璋冪敤
+        delete response.message
+        delete response.status
+
+        response.func = btn.callbackFunc
+
+        let _callbackparam = {..._outParam, ...response}
+        return Api.genericInterface(_callbackparam)
+      } else {
+        if (response.status) {
+          // 涓�娆¤姹傛垚鍔燂紝杩涜涓嬩竴椤硅姹�
+
+          if (params.length === 0) {
+            this.execSuccess(btn, response)
+            _resolve()
+          } else {
+            this.outerLoopRequest(params, btn, _resolve, widthNumber)
+          }
+        } else {
+          this.execError(response, btn)
+          _resolve()
+        }
+      }
+    }).then(res => {
+      if (!res) return
+
+      if (res.status) {
+        if (params.length === 0) {
+          this.execSuccess(btn, res)
+          _resolve()
+        } else {
+          this.outerLoopRequest(params, btn, _resolve, widthNumber)
+        }
+      } else {
+        this.execError(res, btn)
+        _resolve()
+      }
+    })
+  }
+
+  /**
+   * @description 鎿嶄綔鎴愬姛鍚庡鐞�
+   * 1銆乪xcel瀵煎嚭锛屾垚鍔熷悗鍙栨秷瀵煎嚭鎸夐挳鍔犺浇涓姸鎬�
+   * 2銆佺姸鎬佺爜涓� S 鏃讹紝鏄剧ず鎴愬姛淇℃伅鍚庣郴缁熼粯璁や俊鎭�
+   * 3銆佺姸鎬佺爜涓� -1 鏃讹紝涓嶆樉绀轰换浣曚俊鎭�
+   * 4銆佹ā鎬佹鎵ц鎴愬姛鍚庢槸鍚﹀叧闂�
+   * 5銆侀�氱煡涓诲垪琛ㄥ埛鏂�
+   */
+  execSuccess = (btn, res) => {
+    if (res && res.ErrCode === 'S') { // 鎵ц鎴愬姛
+      notification.success({
+        top: 92,
+        message: res.ErrMesg || this.props.dict['main.action.confirm.success'],
+        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
+      })
+    } else if (res && res.ErrCode === 'Y') { // 鎵ц鎴愬姛
+      Modal.success({
+        title: res.ErrMesg || this.props.dict['main.action.confirm.success']
+      })
+    } else if (res && res.ErrCode === '-1') { // 瀹屾垚鍚庝笉鎻愮ず
+
+    }
+    
+    if (btn.OpenType === 'pop' && btn.setting && btn.setting.finish !== 'unclose') {
+      this.setState({
+        visible: false
+      })
+    }
+
+    this.setState({
+      loadingUuid: '',
+      running: false,
+      loadingNumber: ''
+    })
+
+    this.refreshdata(btn, 'success')
+  }
+
+  /**
+   * @description 鎿嶄綔澶辫触鍚庡鐞�
+   * 1銆佺姸鎬佺爜涓� E銆丯銆丗銆丯M 鏃讹紝鏄剧ず鐩稿簲鎻愮ず淇℃伅
+   * 2銆乪xcel瀵煎嚭锛屽け璐ュ悗鍙栨秷瀵煎嚭鎸夐挳鍔犺浇涓姸鎬�
+   * 3銆侀�氱煡涓诲垪琛ㄥ埛鏂�
+   */
+  execError = (res, btn) => {
+    if (res.ErrCode === 'E') {
+      Modal.error({
+        title: res.message || res.ErrMesg,
+      })
+    } else if (res.ErrCode === 'N') {
+      notification.error({
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
+      })
+    } else if (res.ErrCode === 'F') {
+      notification.error({
+        className: 'notification-custom-error',
+        top: 92,
+        message: res.message || res.ErrMesg,
+        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
+      })
+    } else if (res.ErrCode === 'NM') {
+      message.error(res.message || res.ErrMesg)
+    }
+    
+    this.setState({
+      loadingUuid: '',
+      running: false,
+      loadingNumber: ''
+    })
+    
+    this.refreshdata(btn, 'error')
+  }
+
+  /**
+   * @description 鎸夐挳閰嶇疆淇℃伅閿欒鎻愮ず
+   */
+  actionSettingError = () => {
+    this.setState({
+      running: false
+    })
+    notification.warning({
+      top: 92,
+      message: this.props.dict['main.action.settingerror'],
+      duration: 5
+    })
+  }
+
+  /**
+   * @description 鑾峰彇鎸夐挳閰嶇疆淇℃伅
+   */
+  improveAction = (action) => {
+    const { configMap, execAction } = this.state
+
+    let _config = configMap[action.uuid]
+
+    if (_config) {
+      this.setState({
+        execAction: {..._config, ...execAction}
+      }, () => {
+        this.improveActionForm()
+      })
+    } else {
+      Api.getSystemCacheConfig({
+        func: 'sPC_Get_LongParam',
+        MenuID: action.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 (!res.status) {
+          notification.warning({
+            top: 92,
+            message: res.message,
+            duration: 5
+          })
+          this.setState({
+            execAction: null,
+            tabledata: null,
+            btnloading: false
+          })
+        } else if (!_LongParam || (action.OpenType === 'pop' && _LongParam.type !== 'Modal')) {
+          notification.warning({
+            top: 92,
+            message: '鏈幏鍙栧埌鎸夐挳閰嶇疆淇℃伅锛�',
+            duration: 5
+          })
+          this.setState({
+            execAction: null,
+            tabledata: null,
+            btnloading: false
+          })
+        } else {
+          if (_LongParam.groups.length > 0) {
+            _LongParam.groups.forEach(group => {
+              group.sublist = group.sublist.filter(cell => {
+                if (!cell.blacklist || cell.blacklist.length === 0) return true
+
+                let _black = cell.blacklist.filter(v => {
+                  return this.props.permRoles.indexOf(v) !== -1
+                })
+
+                if (_black.length > 0) {
+                  return false
+                } else {
+                  return true
+                }
+              })
+            })
+          } else {
+            _LongParam.fields = _LongParam.fields.filter(cell => {
+              if (!cell.blacklist || cell.blacklist.length === 0) return true
+
+              let _black = cell.blacklist.filter(v => {
+                return this.props.permRoles.indexOf(v) !== -1
+              })
+
+              if (_black.length > 0) {
+                return false
+              } else {
+                return true
+              }
+            })
+          }
+
+          this.setState({
+            configMap: {...configMap, [action.uuid]: _LongParam},
+            execAction: {..._LongParam, ...execAction}
+          }, () => {
+            this.improveActionForm()
+          })
+        }
+      })
+    }
+  }
+
+  /**
+   * @description 鑾峰彇涓嬫媺琛ㄥ崟閫夐」淇℃伅
+   */
+  improveActionForm = () => {
+    const { configMap, execAction } = this.state
+    let subfields = []
+
+    if (execAction.setting.display === 'prompt') { // 濡傛灉琛ㄥ崟浠ユ槸鍚︽灞曠ず锛屼笉璇锋眰涓嬫媺鑿滃崟淇℃伅
+      this.setState({
+        btnloading: false
+      })
+      this.modelconfirm()
+      return
+    }
+
+    if (execAction.groups.length > 0) {
+      execAction.groups.forEach(group => {
+        group.sublist.forEach(field => {
+          if ((field.type === 'select' || field.type === 'link' || field.type === 'multiselect') && field.resourceType === '1' && field.dataSource) {
+            subfields.push(field)
+          }
+        })
+      })
+    } else {
+      execAction.fields.forEach(field => {
+        if ((field.type === 'select' || field.type === 'link' || field.type === 'multiselect') && field.resourceType === '1' && field.dataSource) {
+          subfields.push(field)
+        }
+      })
+    }
+
+    if (subfields.length === 0) {
+      this.setState({
+        visible: true,
+        btnloading: false
+      })
+      return
+    }
+
+    let deffers = subfields.map(item => {
+      let _option = Utils.getSelectQueryOptions(item)
+      let _sql = Utils.formatOptions(_option.sql)
+      let isSSO = item.database === 'sso'
+
+      let param = {
+        func: 'sPC_Get_SelectedList',
+        LText: _sql,
+        obj_name: 'data',
+        arr_field: _option.field
+      }
+
+      if (this.props.BID) {
+        param.BID = this.props.BID
+      }
+      if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+        param.LText = param.LText.replace(/\$@/ig, '/*')
+        param.LText = param.LText.replace(/@\$/ig, '*/')
+      } else {
+        param.LText = param.LText.replace(/@\$|\$@/ig, '')
+      }
+
+      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
+      param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+      return new Promise(resolve => {
+        Api.getSystemCacheConfig(param, isSSO).then(res => {
+          res.search = item
+          resolve(res)
+        })
+      })
+    })
+
+    let _field = {}
+    let error = ''
+    Promise.all(deffers).then(result => {
+      result.forEach(res => {
+        if (res.status) {
+          let options = res.data.map(cell => {
+            let item = {
+              key: Utils.getuuid(),
+              Value: cell[res.search.valueField],
+              Text: cell[res.search.valueText]
+            }
+
+            if (res.search.type === 'link') {
+              item.parentId = cell[res.search.linkField]
+            } else if (res.search.type === 'select' && res.search.linkSubField && res.search.linkSubField.length > 0) {
+              res.search.linkSubField.forEach(_field => {
+                item[_field] = (cell[_field] || cell[_field] === 0) ? cell[_field] : ''
+              })
+            }
+
+            return item
+          })
+
+          _field[res.search.uuid] = options
+        } else {
+          error = res
+        }
+      })
+
+      if (error) {
+        notification.warning({
+          top: 92,
+          message: error.message,
+          duration: 5
+        })
+      }
+
+      this.setState({
+        configMap: {...configMap, ..._field}
+      }, () => {
+        this.setState({
+          visible: true,
+          btnloading: false
+        })
+      })
+    })
+  }
+
+  /**
+   * @description Excel 瀵煎叆
+   */
+  getexceldata = (data, btn, errors, primaryId) => {
+    if (errors) {
+      if (errors === 'notexit') {
+        notification.warning({
+          top: 92,
+          message: '宸ヤ綔琛ㄣ��' + btn.verify.sheet + '銆嬩笉瀛樺湪锛�',
+          duration: 5
+        })
+      } else if (errors === 'empty') {
+        notification.warning({
+          top: 92,
+          message: '宸ヤ綔琛ㄣ��' + btn.verify.sheet + '銆嬩负绌猴紒',
+          duration: 5
+        })
+      } else if (errors === 'headerError') {
+        notification.warning({
+          top: 92,
+          message: '宸ヤ綔琛ㄣ��' + btn.verify.sheet + '銆嬭〃澶磋缃敊璇紒',
+          duration: 5
+        })
+      }
+      
+      return
+    }
+
+    if (!data || data.length === 0) {
+      notification.warning({
+        top: 92,
+        message: '鏈幏鍙栧埌宸ヤ綔琛ㄣ��' + btn.verify.sheet + '銆嬫暟鎹紒',
+        duration: 5
+      })
+      return
+    }
+
+    let result = Utils.getExcelInSql(btn, data, this.props.dict)
+    if (result.errors) {
+      notification.warning({
+        top: 92,
+        message: result.errors,
+        duration: 5
+      })
+      return
+    }
+
+    let param = {
+      ID: primaryId
+    }
+
+    if (this.props.BID) {
+      param.BID = this.props.BID
+    }
+
+    if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+      result.sql = result.sql.replace(/\$@/ig, '/*')
+      result.sql = result.sql.replace(/@\$/ig, '*/')
+    } else {
+      result.sql = result.sql.replace(/@\$|\$@/ig, '')
+    }
+
+    param.LText = Utils.formatOptions(result.sql)
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
+    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+    this.setState({loadingUuid: btn.uuid})
+
+    if (btn.intertype === 'inner' && !btn.innerFunc) { // 绯荤粺瀛樺偍杩囩▼
+      param.func = 'sPC_TableData_InUpDe'
+
+      Api.genericInterface(param).then((res) => {
+        if (res.status) {
+          this.execSuccess(btn, res)
+        } else {
+          this.execError(res, btn)
+        }
+      })
+    } else if (btn.intertype === 'inner' && btn.innerFunc) { // 鑷畾涔夊瓨鍌ㄨ繃绋�
+      param.func = btn.innerFunc
+
+      Api.genericInterface(param).then((res) => {
+        if (res.status) {
+          this.execSuccess(btn, res)
+        } else {
+          this.execError(res, btn)
+        }
+      })
+    } else if (btn.intertype === 'outer') { // 澶栭儴鎺ュ彛
+      let _outParam = null
+
+      new Promise(resolve => {
+        // 鍐呴儴璇锋眰
+        if (btn.innerFunc) {
+          param.func = btn.innerFunc
+          // 瀛樺湪鍐呴儴鍑芥暟鏃讹紝鏁版嵁棰勫鐞�
+          Api.genericInterface(param).then(res => {
+            if (res.status) {
+              delete res.ErrCode
+              delete res.ErrMesg
+              delete res.message
+              delete res.status
+
+              // 浣跨敤澶勭悊鍚庣殑鏁版嵁璋冪敤澶栭儴鎺ュ彛
+              let keys = Object.keys(res) // 鎻愪氦澶栭儴鎺ュ彛鍓嶏紝娣诲姞BID
+              if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
+                res.BID = this.props.BID
+              }
+              resolve(res)
+            } else {
+              this.execError(res, btn)
+              resolve(false)
+            }
+          })
+        } else {
+          resolve(param)
+        }
+      }).then(res => {
+        if (!res) return
+        // 澶栭儴璇锋眰
+        _outParam = JSON.parse(JSON.stringify(res))
+
+        if (this.props.menuType === 'HS') {
+          if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+            param.rduri = options.cloudServiceApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        } else {
+          if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+            param.rduri = window.GLOB.mainSystemApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        }
+
+        if (btn.outerFunc) {
+          res.func = btn.outerFunc
+        }
+
+        return Api.genericInterface(res)
+      }).then(response => {
+        if (!response) return
+        // 鍥炶皟璇锋眰
+        if (btn.callbackFunc) {
+          // 瀛樺湪鍥炶皟鍑芥暟鏃讹紝璋冪敤
+          delete response.message
+          delete response.status
+
+          response.func = btn.callbackFunc
+
+          let _callbackparam = {..._outParam, ...response}
+          return Api.genericInterface(_callbackparam)
+        } else {
+          if (response.status) {
+            this.execSuccess(btn, response)
+          } else {
+            this.execError(response, btn)
+          }
+        }
+      }).then(res => {
+        if (!res) return
+
+        if (res.status) {
+          this.execSuccess(btn, res)
+        } else {
+          this.execError(res, btn)
+        }
+      })
+    }
+  }
+
+  /**
+   * @description Excel 瀵煎嚭
+   */
+  triggerExcelout = (btn) => {
+    let viewParam = this.props.getexceloutparam()
+    let name = `${viewParam.menuName}${moment().format('YYYYMMDDHHmmss')}.xlsx`
+    let pageSize = 1000
+
+    if (btn.search === 'true' && viewParam.search && viewParam.search.length > 0) {
+      let valid = false
+      viewParam.search.forEach(item => {
+        if (Array.isArray(item.value)) {
+          if (item.value.length > 0) {
+            valid = true
+          }
+        } else if (item.value || item.value === 0) {
+          valid = true
+        }
+      })
+
+      if (!valid) {
+        notification.warning({
+          top: 92,
+          message: '鎼滅储鏉′欢涓嶅彲涓虹┖锛�',
+          duration: 5
+        })
+        return
+      }
+    }
+    
+    this.setState({loadingUuid: btn.uuid})
+
+    if (btn.pagination !== 'true') {
+      if (btn.intertype === 'inner' && !btn.innerFunc) { // 浣跨敤绯荤粺鍑芥暟
+        if (!viewParam.arr_field) {
+          this.execError({ErrCode: 'N', message: '鏈缃樉绀哄垪锛�'}, btn)
+          return
+        }
+
+        let param = this.getExcelDefaultParam(viewParam.arr_field, viewParam.orderBy, viewParam.search)
+
+        Api.genericInterface(param).then(result => {
+          if (result.status) {
+            this.exportExcel(result.data, btn, name)
+          } else {
+            this.execError(result, btn)
+          }
+        })
+      } else if (btn.intertype === 'inner' && btn.innerFunc) { // 浣跨敤鍐呴儴鍑芥暟
+        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
+        param.func = btn.innerFunc
+
+        Api.genericInterface(param).then(result => {
+          if (result.status) {
+            this.exportExcel(result.data, btn, name)
+          } else {
+            this.execError(result, btn)
+          }
+        })
+      } else if (btn.intertype === 'outer' && !btn.innerFunc) { // 浣跨敤澶栭儴鍑芥暟
+        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
+
+        if (this.props.menuType === 'HS') {
+          if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+            param.rduri = options.cloudServiceApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        } else {
+          if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+            param.rduri = window.GLOB.mainSystemApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        }
+  
+        if (btn.outerFunc) {
+          param.func = btn.outerFunc
+        }
+
+        Api.genericInterface(param).then(result => {
+          if (result.status) {
+            this.exportExcel(result.data, btn, name)
+          } else {
+            this.execError(result, btn)
+          }
+        })
+      } else if (btn.intertype === 'outer' && btn.innerFunc) {
+        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
+        param.func = btn.innerFunc
+
+        Api.genericInterface(param).then(res => {
+          if (res.status) {
+            delete res.ErrCode
+            delete res.ErrMesg
+            delete res.message
+            delete res.status
+
+            if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+              res.rduri = window.GLOB.mainSystemApi
+            } else if (btn.sysInterface !== 'true') {
+              res.rduri = btn.interface
+            }
+  
+            if (btn.outerFunc) {
+              res.func = btn.outerFunc
+            }
+      
+            Api.genericInterface(res).then(result => {
+              if (result.status) {
+                this.exportExcel(result.data, btn, name)
+              } else {
+                this.execError(result, btn)
+              }
+            })
+          } else {
+            this.execError(res, btn)
+          }
+        })
+      } else {
+        this.execError({ErrCode: 'N', message: '瀵煎嚭鎸夐挳璁剧疆閿欒锛�'}, btn)
+      }
+    } else if (btn.intertype === 'outer' && btn.innerFunc) { // 鍒嗛〉锛屼笖涓ゆ璇锋眰
+      this.getExcelOutDoubleData(btn, viewParam, 1, pageSize, [], name)
+    } else { // 鍒嗛〉锛屼竴姝ヨ姹�
+      this.getExcelOutData(btn, viewParam, 1, pageSize, [], name)
+    }
+  }
+
+  /**
+   * @description 涓ゆ鍒嗛〉璇锋眰
+   */
+  getExcelOutDoubleData = (btn, viewParam, pageIndex, pageSize, data, name) => {
+    let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
+    param.func = btn.innerFunc
+
+    Api.genericInterface(param).then(res => {
+      if (res.status) {
+        delete res.ErrCode
+        delete res.ErrMesg
+        delete res.message
+        delete res.status
+
+        if (this.props.menuType === 'HS') {
+          if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+            param.rduri = options.cloudServiceApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        } else {
+          if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+            param.rduri = window.GLOB.mainSystemApi
+          } else if (btn.sysInterface !== 'true') {
+            param.rduri = btn.interface
+          }
+        }
+
+        if (btn.outerFunc) {
+          res.func = btn.outerFunc
+        }
+  
+        Api.genericInterface(res).then(result => {
+          if (result.status) {
+            if (!result.data) {
+              this.execError({ErrCode: 'N', message: '鏈幏鍙栧埌鏁版嵁淇℃伅锛�'}, btn)
+            } else if (result.data.length >= pageSize) {
+              data = data.concat(result.data)
+              pageIndex++
+              this.getExcelOutDoubleData(btn, viewParam, pageIndex, pageSize, data, name)
+            } else {
+              data = data.concat(result.data)
+              this.exportExcel(data, btn, name)
+            }
+          } else {
+            this.execError(result, btn)
+          }
+        })
+      } else {
+        this.execError(res, btn)
+      }
+    })
+  }
+
+  /**
+   * @description 涓�姝ュ垎椤佃姹�
+   */
+  getExcelOutData = (btn, viewParam, pageIndex, pageSize, data, name) => {
+    let param = null
+    if (btn.intertype === 'inner' && !btn.innerFunc) { // 浣跨敤绯荤粺鍑芥暟
+      if (!viewParam.arr_field) {
+        this.execError({ErrCode: 'N', message: '鏈缃樉绀哄垪锛�'}, btn)
+        return
+      }
+
+      param = this.getExcelDefaultParam(viewParam.arr_field, viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
+
+      
+    } else if (btn.intertype === 'inner' && btn.innerFunc) { // 浣跨敤鍐呴儴鍑芥暟
+      param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
+      param.func = btn.innerFunc
+
+    } else if (btn.intertype === 'outer' && !btn.innerFunc) { // 浣跨敤澶栭儴鍑芥暟
+      param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
+
+      if (this.props.menuType === 'HS') {
+        if (btn.sysInterface === 'true' && options.cloudServiceApi) {
+          param.rduri = options.cloudServiceApi
+        } else if (btn.sysInterface !== 'true') {
+          param.rduri = btn.interface
+        }
+      } else {
+        if (btn.sysInterface === 'true' && window.GLOB.mainSystemApi) {
+          param.rduri = window.GLOB.mainSystemApi
+        } else if (btn.sysInterface !== 'true') {
+          param.rduri = btn.interface
+        }
+      }
+      
+      if (btn.outerFunc) {
+        param.func = btn.outerFunc
+      }
+    }
+
+    Api.genericInterface(param).then(result => {
+      if (result.status) {
+        if (!result.data) {
+          this.execError({ErrCode: 'N', message: '鏈幏鍙栧埌鏁版嵁淇℃伅锛�'}, btn)
+        } else if (result.data.length >= pageSize) {
+          data = data.concat(result.data)
+          pageIndex++
+          this.getExcelOutData(btn, viewParam, pageIndex, pageSize, data, name)
+        } else {
+          data = data.concat(result.data)
+          this.exportExcel(data, btn, name)
+        }
+      } else {
+        this.execError(result, btn)
+      }
+    })
+  }
+
+  /**
+   * @description Excel 鐢熸垚
+   */
+  exportExcel = (data, btn, name) => {
+    const { logcolumns } = this.props
+    if (data && data.length > 0) {
+      try {
+        let _header = []
+        let _topRow = {}
+        let colwidth = []
+
+        let hidecolumns = []
+
+        let verifyColumn = {} // 璁板綍楠岃瘉淇℃伅涓殑Excel鍒楅厤缃�
+        if (btn.verify && btn.verify.columns && btn.verify.columns.length > 0) {
+          btn.verify.columns.forEach(col => {
+            verifyColumn[col.Column] = col
+          })
+        }
+
+        logcolumns.forEach(col => {
+          if (col.Hide === 'true') {
+            hidecolumns.push(col.field)
+            return
+          }
+          if (!data[0].hasOwnProperty(col.field)) return
+          if (_topRow[col.field]) return
+
+          if (verifyColumn[col.field]) { // 浼樺厛浣跨敤楠岃瘉淇℃伅涓殑鍒楄缃�
+            _header.push(col.field)
+            _topRow[col.field] = verifyColumn[col.field].Text
+  
+            colwidth.push({width: verifyColumn[col.field].Width})
+          } else {
+            _header.push(col.field)
+            _topRow[col.field] = col.label
+  
+            let _colwidth = Math.floor(col.Width / 6)
+  
+            if (!_colwidth || _colwidth < 5) {
+              _colwidth = 5
+            }
+  
+            colwidth.push({width: _colwidth})
+          }
+        })
+
+        if (btn.verify && btn.verify.columns && btn.verify.columns.length > 0) {
+          btn.verify.columns.forEach(col => {
+            if (hidecolumns.includes(col.Column)) return
+            if (!data[0].hasOwnProperty(col.Column)) return
+            if (_topRow[col.Column]) return
+
+            _header.push(col.Column)
+            _topRow[col.Column] = col.Text
+
+            colwidth.push({width: col.Width})
+          })
+        }
+
+        Object.keys(data[0]).forEach(key => {
+          if (hidecolumns.includes(key)) return
+          if (_topRow[key]) return
+
+          _header.push(key)
+          _topRow[key] = key
+
+          colwidth.push({width: 12})
+        })
+
+        let table = []
+
+        table.push(_topRow)
+
+        data.forEach(item => {
+          let _row = {}
+          _header.forEach(field => {
+            _row[field] = item[field]
+          })
+
+          table.push(_row)
+        })
+
+        const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true})
+
+        ws['!cols'] = colwidth
+
+        const wb = XLSX.utils.book_new()
+        XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
+
+        XLSX.writeFile(wb, name)
+
+        this.execSuccess(btn, {ErrCode: 'S', ErrMesg: '瀵煎嚭鎴愬姛锛�'})
+      } catch {
+        this.execError({ErrCode: 'N', message: 'Excel鐢熸垚澶辫触锛�'}, btn)
+      }
+      
+    } else {
+      this.execError({ErrCode: 'N', message: '鏈煡璇㈠埌瀵煎嚭鏁版嵁锛�'}, btn)
+    }
+  }
+
+  /**
+   * @description 鑾峰彇鐢ㄦ埛鑷畾涔夊瓨鍌ㄨ繃绋嬩紶鍙�
+   */
+  getExcelCustomParam = (orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
+    let _search = Utils.formatCustomMainSearch(search)
+
+    let param = {
+      OrderCol: orderBy,
+      ..._search
+    }
+
+    if (this.props.BID) {
+      param.BID = this.props.BID
+    }
+
+    if (pagination) {
+      param.PageIndex = pageIndex
+      param.PageSize = pageSize
+    }
+
+    return param
+  }
+
+  /**
+   * @description 鑾峰彇榛樿瀛樺偍杩囩▼璇锋眰鍙傛暟
+   */
+  getExcelDefaultParam = (arr_field, orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
+    const { setting } = this.props
+
+    let _search = Utils.joinMainSearchkey(search)
+
+    _search = _search ? 'where ' + _search : ''
+    
+    let param = {
+      func: 'sPC_Get_TableData',
+      obj_name: 'data',
+      arr_field: arr_field,
+      custom_script: setting.customScript || '',
+      default_sql: setting.default || 'true',
+      dataM: this.props.dataManager ? 'Y' : ''
+    }
+
+    if (this.props.BID) {
+      param.BID = this.props.BID
+    }
+    
+    let _dataresource = setting.dataresource
+
+    if (/\s/.test(_dataresource)) {
+      _dataresource = '(' + _dataresource + ') tb'
+    }
+
+    if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+      _dataresource = _dataresource.replace(/\$@/ig, '/*')
+      _dataresource = _dataresource.replace(/@\$/ig, '*/')
+      param.custom_script = param.custom_script.replace(/\$@/ig, '/*')
+      param.custom_script = param.custom_script.replace(/@\$/ig, '*/')
+    } else {
+      _dataresource = _dataresource.replace(/@\$|\$@/ig, '')
+      param.custom_script = param.custom_script.replace(/@\$|\$@/ig, '')
+    }
+
+    let regoptions = null
+    if (setting.queryType === 'statistics' || param.custom_script) {
+      let allSearch = Utils.getAllSearchOptions(search)
+
+      regoptions = allSearch.map(item => {
+        return {
+          reg: new RegExp('@' + item.key + '@', 'ig'),
+          value: `'${item.value}'`
+        }
+      })
+
+      regoptions.push({
+        reg: new RegExp('@orderBy@', 'ig'),
+        value: orderBy
+      }, {
+        reg: new RegExp('@pageSize@', 'ig'),
+        value: pageSize
+      }, {
+        reg: new RegExp('@pageIndex@', 'ig'),
+        value: pageIndex
+      })
+    }
+
+    if (setting.queryType === 'statistics') { // 缁熻鏁版嵁婧愶紝鍐呭鏇挎崲
+      regoptions.forEach(item => {
+        _dataresource = _dataresource.replace(item.reg, item.value)
+      })
+      _search = ''
+    }
+
+    let LText = `select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows`
+    
+    if (pagination) {
+      LText = `select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows`
+    }
+
+    if (param.custom_script) {
+      regoptions.forEach(item => {
+        param.custom_script = param.custom_script.replace(item.reg, item.value)
+      })
+
+      if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+        param.custom_script = param.custom_script.replace(/\$@/ig, '/*')
+        param.custom_script = param.custom_script.replace(/@\$/ig, '*/')
+      } else {
+        param.custom_script = param.custom_script.replace(/@\$|\$@/ig, '')
+      }
+
+      param.custom_script = Utils.formatOptions(param.custom_script)
+    }
+
+    if (this.props.dataManager) { // 鏁版嵁鏉冮檺
+      LText = LText.replace(/\$@/ig, '/*')
+      LText = LText.replace(/@\$/ig, '*/')
+    } else {
+      LText = LText.replace(/@\$|\$@/ig, '')
+    }
+
+    param.LText = Utils.formatOptions(LText)
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
+    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+    param.DateCount = ''
+
+    return param
+  }
+
+  /**
+   * @description 妯℃�佹锛堣〃鍗曪級锛岀‘璁�
+   */
+  handleOk = () => {
+    this.formRef.handleConfirm().then(res => {
+      this.setState({
+        confirmLoading: true
+      })
+
+      this.execSubmit(this.state.execAction, this.state.tabledata, () => {
+        this.setState({
+          confirmLoading: false
+        })
+      }, res)
+    }, () => {})
+  }
+
+  /**
+   * @description 妯℃�佹锛堣〃鍗曪級锛屽彇娑�
+   */
+  handleCancel = () => {
+    this.setState({
+      visible: false,
+      confirmLoading: false
+    })
+  }
+
+  modelconfirm = () => {
+    const { BData } = this.props
+    const { execAction, tabledata } = this.state
+    let _this = this
+    let _fields = []
+    
+    if (execAction.groups.length > 0) {
+      execAction.groups.forEach(group => {
+        _fields = [..._fields, ...group.sublist]
+      })
+    } else {
+      _fields = execAction.fields
+    }
+
+    let result = _fields.map(item => {
+      let _readin = item.readin !== 'false'
+      let _initval = item.initval
+
+      if (item.type === 'linkMain' || item.type === 'funcvar') {
+        _readin = false
+      }
+
+      if (item.type === 'linkMain' && BData && BData.hasOwnProperty(item.field)) {
+        _initval = BData[item.field]
+      } else if (_readin && tabledata[0] && tabledata[0].hasOwnProperty(item.field)) {
+        _initval = tabledata[0][item.field]
+      }
+
+      let _fieldlen = item.fieldlength || 50
+      if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect') {
+        _fieldlen = item.fieldlength || 512
+      } else if (item.type === 'number') {
+        _fieldlen = item.decimal ? item.decimal : 0
+      }
+
+      return {
+        key: item.field,
+        readonly: item.readonly === 'true',
+        readin: _readin,
+        fieldlen: _fieldlen,
+        type: item.type,
+        value: _initval
+      }
+    })
+
+    _this.setState({
+      running: true
+    })
+
+    confirm({
+      title: this.props.dict['main.action.confirm.tip'],
+      onOk() {
+        _this.setState({
+          loadingUuid: execAction.uuid
+        })
+
+        return new Promise(resolve => {
+          _this.execSubmit(execAction, tabledata, resolve, result)
+        })
+      },
+      onCancel() {
+        _this.setState({
+          loadingUuid: '',
+          running: false
+        })
+      }
+    })
+  }
+
+  /**
+   * @description 鏄剧ず妯℃�佹
+   */
+  getModels = () => {
+    const { execAction } = this.state
+
+    if (!execAction || !this.state.visible) return null
+
+    let title = ''
+    let width = '62vw'
+    let clickouter = false
+    let container = document.body
+
+    if (execAction && execAction.setting) {
+      title = execAction.setting.title
+      width = execAction.setting.width + 'vw'
+
+      if (this.props.type === 'main' && execAction.setting.container === 'tab' && this.props.ContainerId) {
+        width = execAction.setting.width + '%'
+        container = () => document.getElementById(this.props.ContainerId)
+      }
+
+      if (execAction.setting.clickouter === 'close') {
+        clickouter = true
+      }
+    }
+
+    if (this.props.type === 'subtab') {
+      container = document.body
+    }
+
+    return (
+      <Modal
+        title={title}
+        maskClosable={clickouter}
+        getContainer={container}
+        wrapClassName='action-modal'
+        visible={this.state.visible}
+        width={width}
+        onOk={this.handleOk}
+        confirmLoading={this.state.confirmLoading}
+        onCancel={this.handleCancel}
+        destroyOnClose
+      >
+        <MutilForm
+          dict={this.props.dict}
+          action={execAction}
+          inputSubmit={this.handleOk}
+          configMap={this.state.configMap}
+          data={this.state.tabledata[0]}
+          BData={this.props.BData}
+          wrappedComponentRef={(inst) => this.formRef = inst}
+        />
+      </Modal>
+    )
+  }
+
+  render() {
+    const { loadingUuid, btnloading, loadingNumber } = this.state
+
+    let fixed = this.props.setting.actionfixed && this.props.type === 'main' // 鎸夐挳鏄惁鍥哄畾鍦ㄥご閮�
+
+    if (fixed) {
+      return (
+        <Affix offsetTop={48}>
+          <div className="button-list toolbar-button" id={fixed ? this.props.MenuID + 'mainaction' : ''}>
+            {this.props.actions.map((item, index) => {
+              let label = item.label
+              if (loadingUuid === item.uuid && loadingNumber !== '') {
+                label = label + '(' + loadingNumber + ')'
+              }
+
+              return (
+                <Button
+                  className={'mk-btn mk-' + item.class}
+                  icon={item.icon}
+                  key={'action' + index}
+                  onClick={() => {this.actionTrigger(item)}}
+                  loading={loadingUuid === item.uuid}
+                >{label}</Button>
+              )
+            })}
+            {this.getModels()}
+            {btnloading && <Spin size="large" />}
+            <ExcelIn MenuID={this.props.MenuID} returndata={this.getexceldata} ref="excelIn" />
+          </div>
+        </Affix>
+      )
+    } else {
+      return (
+        <div className="button-list toolbar-button" id={fixed ? this.props.MenuID + 'mainaction' : ''}>
+          {this.props.actions.map((item, index) => {
+            let label = item.label
+            if (loadingUuid === item.uuid && loadingNumber !== '') {
+              label = label + '(' + loadingNumber + ')'
+            }
+
+            return (
+              <Button
+                className={'mk-btn mk-' + item.class}
+                icon={item.icon}
+                key={'action' + index}
+                onClick={() => {this.actionTrigger(item)}}
+                loading={loadingUuid === item.uuid}
+              >{label}</Button>
+            )
+          })}
+          {this.getModels()}
+          {btnloading && <Spin size="large" />}
+          <ExcelIn MenuID={this.props.MenuID} returndata={this.getexceldata} ref="excelIn" />
+        </div>
+      )
+    }
+  }
+}
+
+export default PrintButton
\ No newline at end of file
diff --git a/src/tabviews/zshare/actionList/printbutton/index.scss b/src/tabviews/zshare/actionList/printbutton/index.scss
new file mode 100644
index 0000000..4f63e95
--- /dev/null
+++ b/src/tabviews/zshare/actionList/printbutton/index.scss
@@ -0,0 +1,228 @@
+.card-row-box {
+  min-height: 50px;
+  padding: 0px 10px;
+  margin-bottom: 15px;
+
+  .chart-card-box {
+    padding: 0 10px;
+    .anticon {
+      margin-right: 0px;
+    }
+  }
+  > .chart-card-box {
+    margin-bottom: 20px;
+  }
+
+  .chart-card-box:not(.ant-col) {
+    display: inline-block;
+    margin-bottom: 20px;
+  }
+
+  >.ant-tabs {
+    .ant-tabs-bar {
+      border: 0;
+      margin: 0;
+      .ant-tabs-nav-scroll {
+        .ant-tabs-tab {
+          margin: 0;
+          padding: 12px 5px;
+          cursor: default;
+
+          .chart-card-box:not(.ant-col) {
+            margin-bottom: 0px;
+          }
+        }
+      }
+    }
+  }
+
+  .ant-empty {
+    .ant-empty-image {
+      height: 60px;
+    }
+  }
+
+  .loading-mask {
+    position: absolute;
+    left: 20px;
+    top: 0;
+    right: 20px;
+    bottom: 0;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    text-align: justify;
+    z-index: 1;
+
+    .ant-spin-blur {
+      position: absolute;
+      width: 100%;
+      height: 100%;
+      opacity: 0.5;
+      background: #ffffff;
+    }
+  }
+
+  .ant-card.chart-card {
+    transition: all 0.3s;
+
+    .ant-card-head {
+      min-height: 40px;
+      line-height: 2;
+      .ant-card-head-title {
+        font-weight: 500;
+      }
+      .ant-card-extra {
+        color: #1890ff;
+        .action-cell {
+          cursor: pointer;
+        }
+      }
+    }
+    .ant-card-actions {
+      height: 48px;
+    }
+  }
+
+  .ant-card.chart-card:not(.ant-card-bordered) {
+    .ant-card-head {
+      border-bottom: 0;
+    }
+    .ant-card-actions {
+      border-top: 0;
+    }
+  }
+
+  .ant-card.chart-card.chart-card-selected {
+    border: 1px solid #1890ff;
+    box-shadow: 0px 0px 8px #c4ebfd;
+  }
+
+  .ant-card.chart-card .ant-card-body {
+    padding: 0px;
+    zoom: 1;
+
+    .ant-card-meta.switch {
+      cursor: pointer;
+    }
+
+    .ant-card-meta {
+      margin: 0px;
+      padding: 20px;
+      position: relative;
+      white-space: normal;
+
+      .ant-card-meta-avatar {
+        padding-top: 0px;
+        padding-left: 0px;
+      }
+
+      .ant-avatar-image {
+        box-sizing: border-box;
+        margin: 0;
+        padding: 0;
+        font-variant: tabular-nums;
+        line-height: 1.5;
+        list-style: none;
+        font-feature-settings: 'tnum';
+        position: relative;
+        display: inline-block;
+        overflow: hidden;
+        color: #fff;
+        white-space: nowrap;
+        text-align: center;
+        vertical-align: middle;
+        border-radius: 50%;
+
+        img {
+          width: 100%;
+        }
+        .font {
+          background: transparent;
+        }
+      }
+      .ant-card-meta-title {
+        font-size: 14px;
+      }
+      .ant-card-meta-detail > div {
+        height: 23px;
+        vertical-align: top;
+      }
+      .ant-card-meta-detail > div:not(:last-child) {
+        margin-bottom: 2px;
+      }
+      .helf {
+        display: inline-block;
+        width: 50%;
+      }
+      .third {
+        display: inline-block;
+        width: 33.3%;
+      }
+      .align-center {
+        text-align: center;
+      }
+      .align-right {
+        text-align: right;
+      }
+    }
+  }
+
+  .chart-title {
+    margin-bottom: 10px;
+    margin-left: 0px;
+    margin-right: 0px;
+  }
+
+  .ant-card.chart-card {
+    .ant-card-actions {
+      li {
+        color: rgba(0, 0, 0, 0.45);
+        span {
+          overflow: hidden;
+          word-break: break-word;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+        }
+        .anticon {
+          width: unset;
+          margin-right: 3px;
+          color: rgba(0, 0, 0, 0.45);
+        }
+      }
+      li:hover {
+        color: #1890ff;
+        .anticon {
+          color: #1890ff;
+        }
+      }
+    }
+  }
+  .ant-card.chart-card.background {
+    .ant-card-meta-title {
+      color: unset;
+    }
+    .ant-card-meta-description {
+      color: unset;
+    }
+    .ant-card-head {
+      color: unset;
+      .ant-card-head-title {
+        color: unset;
+      }
+    }
+    .ant-card-actions {
+      background: transparent;
+      li {
+        white-space: nowrap;
+        color: unset;
+        .anticon {
+          color: unset;
+        }
+      }
+    }
+  }
+  .clear {
+    clear: both;
+  }
+}
diff --git a/src/tabviews/zshare/mutilform/index.jsx b/src/tabviews/zshare/mutilform/index.jsx
index 5e8fa89..bf40107 100644
--- a/src/tabviews/zshare/mutilform/index.jsx
+++ b/src/tabviews/zshare/mutilform/index.jsx
@@ -21,15 +21,15 @@
   }
 
   state = {
-    cols: 2,
-    datatype: null,
-    readtype: null,
-    readin: null,
-    fieldlen: null,
-    formlist: [],
+    cols: 2,         // 鏄剧ず涓哄灏戝垪
+    datatype: null,  // 鏁版嵁绫诲瀷
+    readtype: null,  // 鏄惁鍙
+    readin: null,    // 琛屾暟鎹槸鍚﹀啓鍏�
+    fieldlen: null,  // 瀛楁闀垮害
+    formlist: [],    // 琛ㄥ崟椤�
     encrypts: [],    // 鍔犲瘑瀛楁
     intercepts: [],  // 鎴彇瀛楁
-    record: {}
+    record: {}       // 璁板綍涓嬫媺琛ㄥ崟鍏宠仈瀛楁锛岀敤浜庢暟鎹啓鍏�
   }
 
   UNSAFE_componentWillMount () {
@@ -81,19 +81,24 @@
     formlist = formlist.map(item => {
       if (item.type === 'title') return item
 
+      // 鍔犲瘑瀛楁
       if (item.type === 'textarea' && item.encryption === 'true') {
         encrypts.push(item.field)
       }
+
+      // 瀛楃鎴彇瀛楁
       if (item.interception === 'true') {
         intercepts.push(item.field)
       }
 
+      // 鏁版嵁鍐欏叆
       let _readin = item.readin !== 'false'
       if (item.type === 'linkMain' || item.type === 'funcvar') {
         _readin = false
       }
 
-      item.initVal = typeof(item.initval) === 'object' ? JSON.parse(JSON.stringify(item.initval)) : item.initval // 鐢ㄤ簬鍙楁帶鍊肩殑琛ㄥ崟锛岄殣钘忔椂浼犻粯璁ゅ��
+      // 鐢ㄤ簬鍙楁帶鍊肩殑琛ㄥ崟锛岄殣钘忔椂浼犻粯璁ゅ��(鏈娇鐢紵)
+      item.initVal = typeof(item.initval) === 'object' ? JSON.parse(JSON.stringify(item.initval)) : item.initval
 
       let _fieldlen = item.fieldlength || 50
       if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect') {
@@ -120,22 +125,65 @@
           item.options = [...item.options, ...this.props.configMap[item.uuid]]
         }
 
+        // 淇濆瓨鍒濆鍒楄〃锛岀敤浜庡叧鑱旇彍鍗曟帶鍒�
         item.oriOptions = JSON.parse(JSON.stringify(item.options))
 
+        // 涓嬬骇琛ㄥ崟鎺у埗-瀛楁鍐欏叆
         if (item.linkSubField && item.linkSubField.length > 0) {
           let _fields = _inputfields.map(_item => _item.field)
           item.linkSubField = item.linkSubField.filter(_item => _fields.includes(_item))
         }
       }
 
-      let newval = '$$initval$$'
+      let newval = ''
+
       if (item.type === 'linkMain' && BData && BData.hasOwnProperty(item.field)) {
         newval = BData[item.field]
       } else if (item.type !== 'linkMain' && _readin && !/^date/.test(item.type) && this.props.data && this.props.data.hasOwnProperty(item.field)) {
         newval = this.props.data[item.field]
+      } else if (item.type === 'date') { // 鏃堕棿鎼滅储
+        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
+          newval = this.props.data[item.field]
+        }
+        if (newval) {
+          newval = moment(newval, 'YYYY-MM-DD')
+          newval = newval.format('YYYY-MM-DD') === 'Invalid date' ? '' : newval
+        }
+        if (!newval && item.initval) {
+          newval = moment().subtract(item.initval, 'days')
+        } else if (!newval) {
+          newval = null
+        }
+      } else if (item.type === 'datemonth') {
+        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
+          newval = this.props.data[item.field]
+        }
+        if (newval) {
+          newval = moment(newval, 'YYYY-MM')
+          newval = newval.format('YYYY-MM') === 'Invalid date' ? '' : newval
+        }
+        if (!newval && item.initval) {
+          newval = moment().subtract(item.initval, 'month')
+        } else if (!newval) {
+          newval = null
+        }
+      } else if (item.type === 'datetime') {
+        if (_readin && this.props.data && this.props.data.hasOwnProperty(item.field)) {
+          newval = this.props.data[item.field]
+        }
+        if (newval) {
+          newval = moment(newval, 'YYYY-MM-DD HH:mm:ss')
+          newval = newval.format('YYYY-MM-DD HH:mm:ss') === 'Invalid date' ? '' : newval
+        }
+        if (!newval && item.initval) {
+          newval = moment().subtract(item.initval, 'days')
+        } else if (!newval) {
+          newval = null
+        }
       }
 
-      if (encrypts.includes(item.field) && newval !== '$$initval$$') {
+      // 鍔犲瘑瀛楁锛岃В瀵嗗鐞�
+      if (item.type === 'textarea' && item.encryption === 'true' && newval !== '') {
         try {
           newval = window.decodeURIComponent(window.atob(newval))
         } catch (e) {
@@ -143,10 +191,10 @@
         }
       }
 
-      if (newval !== '$$initval$$') {
-        item.initval = newval
-      }
+      // 璇诲彇琛ㄦ牸鏁版嵁鎴栬鏈夋椂闂寸殑鍒濆鍊�
+      item.initval = newval !== '' ? newval : item.initval
 
+      // 涓嬫媺琛ㄥ崟锛屽瓨鍦ㄤ笂绾ц彍鍗曟椂锛岀敓鎴愭樉绀哄�煎垪琛紝浼樺厛浠ユ暟瀛楀垽鏂�
       if (item.supvalue) {
         let supvals = []
         item.supvalue.split(',').forEach(val => {
@@ -317,9 +365,6 @@
     const fields = []
 
     formlist.forEach((item, index) => {
-      // if ((!item.field && item.type !== 'title') || item.hidden === 'true') return
-      // if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) return
-
       if (item.type === 'title') {
         fields.push(
           <Col span={24} key={index}>
@@ -459,17 +504,11 @@
           </Col>
         )
       } else if (item.type === 'date') { // 鏃堕棿鎼滅储
-        let _initval = this.props.data ? this.props.data[item.field] : ''
-        if (_initval && this.state.readin[item.field]) {
-          _initval = moment(_initval, 'YYYY-MM-DD')
-        } else {
-          _initval = item.initval ? moment().subtract(item.initval, 'days') : null
-        }
         fields.push(
           <Col span={24 / cols} key={index}>
             <Form.Item label={item.label}>
               {getFieldDecorator(item.field, {
-                initialValue: _initval,
+                initialValue: item.initval,
                 rules: [
                   {
                     required: item.required === 'true',
@@ -483,17 +522,11 @@
           </Col>
         )
       } else if (item.type === 'datemonth') {
-        let _initval = this.props.data ? this.props.data[item.field] : ''
-        if (_initval && this.state.readin[item.field]) {
-          _initval = moment(_initval, 'YYYY-MM')
-        } else {
-          _initval = item.initval ? moment().subtract(item.initval, 'month') : null
-        }
         fields.push(
           <Col span={24 / cols} key={index}>
             <Form.Item label={item.label}>
               {getFieldDecorator(item.field, {
-                initialValue: _initval,
+                initialValue: item.initval,
                 rules: [
                   {
                     required: item.required === 'true',
@@ -507,17 +540,11 @@
           </Col>
         )
       } else if (item.type === 'datetime') {
-        let _initval = this.props.data ? this.props.data[item.field] : ''
-        if (_initval && this.state.readin[item.field]) {
-          _initval = moment(_initval, 'YYYY-MM-DD HH:mm:ss')
-        } else {
-          _initval = item.initval ? moment().subtract(item.initval, 'days') : null
-        }
         fields.push(
           <Col span={24 / cols} key={index}>
             <Form.Item label={item.label}>
               {getFieldDecorator(item.field, {
-                initialValue: _initval,
+                initialValue: item.initval,
                 rules: [
                   {
                     required: item.required === 'true',
@@ -525,7 +552,6 @@
                   }
                 ]
               })(
-                // <DatePicker showTime getCalendarContainer={() => document.getElementById('form-box')} />
                 <DatePicker showTime disabled={item.readonly === 'true'} />
               )}
             </Form.Item>
@@ -620,9 +646,14 @@
   }
 
   handleConfirm = () => {
-    const { record, encrypts, intercepts } = this.state
+    const { record, intercepts } = this.state
+    let _encrypts = JSON.parse(JSON.stringify(this.state.encrypts))
+    let _format = {
+      date: 'YYYY-MM-DD',
+      datemonth: 'YYYY-MM',
+      datetime: 'YYYY-MM-DD HH:mm:ss'
+    }
 
-    let _encrypts = JSON.parse(JSON.stringify(encrypts))
     // 琛ㄥ崟鎻愪氦鏃舵鏌ヨ緭鍏ュ�兼槸鍚︽纭�
     return new Promise((resolve, reject) => {
       this.props.form.validateFieldsAndScroll((err, values) => {
@@ -632,56 +663,63 @@
           this.state.formlist.forEach(item => {
             if (!item.field) return
 
+            let _item = null
             if (item.type === 'funcvar') {
-              search.push({
+              _item = {
                 type: 'funcvar',
                 readonly: 'true',
                 readin: false,
                 fieldlen: this.state.fieldlen[item.field],
                 key: item.field,
                 value: ''
-              })
+              }
             } else if (item.hidden === 'true') {
               let _val = item.initval
               if (record.hasOwnProperty(item.field)) {
                 _val = record[item.field]
-                _encrypts = _encrypts.filter(_field => _field !== item.field)
+                _encrypts = _encrypts.filter(_field => _field !== item.field) // 闅愯棌瀛楁锛屼笉鍙備笌鍔犲瘑澶勭悊
               }
               
-              search.push({
+              _item = {
                 type: this.state.datatype[item.field],
                 readonly: this.state.readtype[item.field],
                 readin: this.state.readin[item.field],
                 fieldlen: this.state.fieldlen[item.field],
                 key: item.field,
                 value: _val
-              })
+              }
             } else if (item.supField && !item.supvalue.includes(this.props.form.getFieldValue(item.supField))) {
-              search.push({
+              _item = {
                 type: this.state.datatype[item.field],
                 readonly: this.state.readtype[item.field],
                 readin: this.state.readin[item.field],
                 fieldlen: this.state.fieldlen[item.field],
                 key: item.field,
                 value: item.initval
-              })
+              }
             }
+
+            if (!_item) return
+
+            if (item.type === 'date' || item.type === 'datemonth' || item.type === 'datetime') {
+              if (_item.value && _item.value.format) {
+                _item.value = _item.value.format(_format[item.type])
+              } else if (!_item.value) {
+                _item.value = ''
+              }
+            }
+
+            search.push(_item)
           })
 
           Object.keys(values).forEach(key => {
             let _value = ''
             if (this.state.datatype[key] === 'datetime') {
-              if (values[key]) {
-                _value = moment(values[key]).format('YYYY-MM-DD HH:mm:ss')
-              }
+              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD HH:mm:ss') : ''
             } else if (this.state.datatype[key] === 'datemonth') {
-              if (values[key]) {
-                _value = moment(values[key]).format('YYYY-MM')
-              }
+              _value = values[key] ? moment(values[key]).format('YYYY-MM') : ''
             } else if (this.state.datatype[key] === 'date') {
-              if (values[key]) {
-                _value = moment(values[key]).format('YYYY-MM-DD')
-              }
+              _value = values[key] ? moment(values[key]).format('YYYY-MM-DD') : ''
             } else if (this.state.datatype[key] === 'number') {
               _value = values[key]
 
@@ -723,6 +761,7 @@
             })
           })
 
+          // 鍚湁鍔犲瘑瀛楁鏃讹紝瀵硅〃鍗曞�艰繘琛屽姞瀵�
           if (_encrypts && _encrypts.length > 0) {
             search = search.map(item => {
               let _value = item.value
@@ -769,6 +808,7 @@
     let rowIndex = 0
     let colIndex = 0
 
+    // 琛ㄥ崟鍒嗚锛岄伩鍏嶆帓鍒椾笉鏁撮綈
     formlist.forEach(item => {
       if ((!item.field && item.type !== 'title') || item.hidden === 'true' || item.type === 'funcvar') return
 
@@ -796,7 +836,6 @@
 
     return (
       <Form {...formItemLayout} className="ant-advanced-search-form main-form-field" id="main-form-box">
-        {/* <Row gutter={24}>{this.getFields(formlist)}</Row> */}
         {_formlist.map((formrow, index) => <Row key={index} gutter={24}>{this.getFields(formrow)}</Row>)}
       </Form>
     )
diff --git a/src/templates/formtabconfig/index.jsx b/src/templates/formtabconfig/index.jsx
index c726398..01149c4 100644
--- a/src/templates/formtabconfig/index.jsx
+++ b/src/templates/formtabconfig/index.jsx
@@ -11,6 +11,7 @@
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import Utils from '@/utils/utils.js'
+import DevUtils from '@/utils/devutils.js'
 import { getModalForm, getActionForm } from '@/templates/zshare/formconfig'
 import { queryTableSql } from '@/utils/option.js'
 
@@ -754,8 +755,8 @@
         menuNo: menu.MenuNo
       }
 
-      newLText = Utils.formatOptions(Utils.getfunc(_param, btn, menu, _config))
-      DelText = Utils.formatOptions(Utils.dropfunc(_param.funcName))
+      newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
+      DelText = Utils.formatOptions(DevUtils.dropfunc(_param.funcName))
 
       this.refs.btnCreatFunc.exec(btn.innerFunc, newLText, DelText).then(result => {
         if (result !== 'success') return
@@ -814,8 +815,8 @@
       }
 
       let _config = {...config, setting: setting}
-      let newLText = Utils.formatOptions(Utils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-      let DelText = Utils.formatOptions(Utils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
+      let newLText = Utils.formatOptions(DevUtils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
+      let DelText = Utils.formatOptions(DevUtils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
 
       this.refs.tableCreatFunc.exec(setting.innerFunc, newLText, DelText).then(result => {
         if (result === 'success') {
diff --git a/src/templates/sharecomponent/actioncomponent/index.jsx b/src/templates/sharecomponent/actioncomponent/index.jsx
index ca28bf8..1f96bd0 100644
--- a/src/templates/sharecomponent/actioncomponent/index.jsx
+++ b/src/templates/sharecomponent/actioncomponent/index.jsx
@@ -6,6 +6,7 @@
 
 import Api from '@/api'
 import Utils from '@/utils/utils.js'
+import DevUtils from '@/utils/devutils.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import { getActionForm } from '@/templates/zshare/formconfig'
@@ -712,8 +713,8 @@
                 fields: fields,
                 menuNo: menu.MenuNo
               }
-              newLText = Utils.formatOptions(Utils.getfunc(_param, btn, menu, _config))
-              DelText = Utils.formatOptions(Utils.dropfunc(btn.innerFunc))
+              newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
+              DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
               resolve(true)
             } else {
               notification.warning({
@@ -730,8 +731,8 @@
               funcName: btn.innerFunc,
               menuNo: menu.MenuNo
             }
-            newLText = Utils.formatOptions(Utils.getexcelInfunc(_param, btn, menu))
-            DelText = Utils.formatOptions(Utils.dropfunc(btn.innerFunc))
+            newLText = Utils.formatOptions(DevUtils.getexcelInfunc(_param, btn, menu))
+            DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
             resolve(true)
           } else {
             notification.warning({
@@ -746,8 +747,8 @@
             innerFunc: btn.innerFunc
           }
 
-          newLText = Utils.formatOptions(Utils.getTableFunc(_param, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-          DelText = Utils.formatOptions(Utils.dropfunc(btn.innerFunc))
+          newLText = Utils.formatOptions(DevUtils.getTableFunc(_param, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
+          DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
 
           resolve(true)
         } else {
@@ -757,8 +758,8 @@
             fields: '',
             menuNo: menu.MenuNo
           }
-          newLText = Utils.formatOptions(Utils.getfunc(_param, btn, menu, _config))
-          DelText = Utils.formatOptions(Utils.dropfunc(btn.innerFunc))
+          newLText = Utils.formatOptions(DevUtils.getfunc(_param, btn, menu, _config))
+          DelText = Utils.formatOptions(DevUtils.dropfunc(btn.innerFunc))
           resolve(true)
         }
       }).then(res => {
diff --git a/src/templates/sharecomponent/chartcomponent/index.jsx b/src/templates/sharecomponent/chartcomponent/index.jsx
index 6b2faac..df17181 100644
--- a/src/templates/sharecomponent/chartcomponent/index.jsx
+++ b/src/templates/sharecomponent/chartcomponent/index.jsx
@@ -607,7 +607,7 @@
 
   render() {
     const { plot } = this.props
-    console.log(plot)
+
     return (
       <div className="line-chart-edit-box" style={{minHeight: plot.height ? plot.height + 50 : 450}}>
         {plot.title ? <p className="chart-title">{plot.title}</p> : null}
diff --git a/src/templates/sharecomponent/settingcomponent/index.jsx b/src/templates/sharecomponent/settingcomponent/index.jsx
index f20ae5e..cd90ce6 100644
--- a/src/templates/sharecomponent/settingcomponent/index.jsx
+++ b/src/templates/sharecomponent/settingcomponent/index.jsx
@@ -4,6 +4,7 @@
 import { Icon, Modal, Button, notification } from 'antd'
 
 import Utils from '@/utils/utils.js'
+import DevUtils from '@/utils/devutils.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import { getSettingForm } from '@/templates/zshare/formconfig'
@@ -120,8 +121,8 @@
       }
 
       let _config = {...config, setting: setting}
-      let newLText = Utils.formatOptions(Utils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-      let DelText = Utils.formatOptions(Utils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
+      let newLText = Utils.formatOptions(DevUtils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
+      let DelText = Utils.formatOptions(DevUtils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
 
       this.refs.funcCreatComponent.exec(setting.innerFunc, newLText, DelText).then(result => {
         if (result === 'success') {
diff --git a/src/templates/sharecomponent/treesettingcomponent/index.jsx b/src/templates/sharecomponent/treesettingcomponent/index.jsx
index a45f4f5..5ef6025 100644
--- a/src/templates/sharecomponent/treesettingcomponent/index.jsx
+++ b/src/templates/sharecomponent/treesettingcomponent/index.jsx
@@ -4,6 +4,7 @@
 import { Icon, Modal, Button, notification } from 'antd'
 
 import Utils from '@/utils/utils.js'
+import DevUtils from '@/utils/devutils.js'
 import zhCN from '@/locales/zh-CN/model.js'
 import enUS from '@/locales/en-US/model.js'
 import { getTreeSettingForm } from '@/templates/zshare/formconfig'
@@ -93,8 +94,8 @@
       }
 
       let _config = {...config, setting: setting}
-      let newLText = Utils.formatOptions(Utils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
-      let DelText = Utils.formatOptions(Utils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
+      let newLText = Utils.formatOptions(DevUtils.getTableFunc(setting, menu, _config)) // 鍒涘缓瀛樺偍杩囩▼sql
+      let DelText = Utils.formatOptions(DevUtils.dropfunc(setting.innerFunc))          // 鍒犻櫎瀛樺偍杩囩▼sql
 
       this.refs.funcCreatComponent.exec(setting.innerFunc, newLText, DelText).then(result => {
         if (result === 'success') {
diff --git a/src/templates/zshare/createinterface/index.jsx b/src/templates/zshare/createinterface/index.jsx
index 9af5ba5..172050a 100644
--- a/src/templates/zshare/createinterface/index.jsx
+++ b/src/templates/zshare/createinterface/index.jsx
@@ -528,7 +528,7 @@
       param.Ltextgridparam = Utils.formatOptions(param.Ltextgridparam)
       param.Ltexttableparam = Utils.formatOptions(param.Ltexttableparam)
 
-      param.Ltext = this.getSysDefaultSql(btn, config, formlist, receipt, BID)
+      param.Ltext = this.getInterfaceSysDefaultSql(btn, config, formlist, receipt, BID)
       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)
@@ -588,7 +588,7 @@
     })
   }
 
-  getSysDefaultSql = (btn, config, formlist, receipt, BID) => {
+  getInterfaceSysDefaultSql = (btn, config, formlist, receipt, BID) => {
     let setting = config.setting
     let primaryKey = setting.primaryKey || 'id'
     let columns = config.columns.filter(col => !!col.field)
diff --git a/src/templates/zshare/modalform/index.jsx b/src/templates/zshare/modalform/index.jsx
index 9efb4c7..aeb4ea4 100644
--- a/src/templates/zshare/modalform/index.jsx
+++ b/src/templates/zshare/modalform/index.jsx
@@ -250,6 +250,14 @@
         _options = [..._options, 'dataSource', 'valueField', 'valueText', 'orderBy', 'orderType', 'database']
       }
 
+      if (openType !== 'funcvar' && openType !== 'linkMain') {
+        if (this.state.supField) {
+          _options.push('supField', 'supvalue')
+        } else {
+          _options.push('supField')
+        }
+      }
+
       this.setState({
         resourceType: value,
         formlist: this.state.formlist.map(form => {
diff --git a/src/utils/devutils.js b/src/utils/devutils.js
new file mode 100644
index 0000000..b314e29
--- /dev/null
+++ b/src/utils/devutils.js
@@ -0,0 +1,459 @@
+export default class Utils {
+  /**
+   * @description 鍒犻櫎瀛樺偍杩囩▼sql
+   * @return {String} name 瀛樺偍杩囩▼鍚嶇О
+   */
+  static dropfunc (name) {
+    return `IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('${name}') AND type in (N'P', N'PC'))  mdrpk PROCEDURE ${name}`
+  }
+
+  /**
+   * @description 鍒涘缓椤甸潰瀛樺偍杩囩▼
+   * @return {String}
+   */
+  static getTableFunc (param, menu, config) {
+    let form = ''
+    let formParam = ''
+    let _vars = ['bid', 'pageindex', 'pagesize', 'ordercol', 'ordertype', 'exceltype', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg']
+    let _columns = []
+    let primaryKey = config.setting.primaryKey || 'ID'
+
+    if (!_vars.includes(primaryKey.toLowerCase())) {
+      _vars.push(primaryKey.toLowerCase())
+      formParam = `mchr13k@${primaryKey} nvarchar(50)='',`
+    }
+
+    if (config.search && config.search.length > 0) {
+      let _fields = new Map()
+      config.search.forEach(item => {
+        if (item.field) {
+          let type = ''
+
+          if (item.type.match(/date/ig)) {
+            type = 'datetime=null'
+          } else {
+            type = 'nvarchar(50)=\'\''
+          }
+
+          item.field.split(',').forEach(cell => {
+            let _f = cell
+            if (_fields.has(cell)) {
+              _f = _f + '1'
+            }
+  
+            _fields.set(cell, true)
+
+            if (!_vars.includes(_f.toLowerCase())) {
+              _vars.push(_f.toLowerCase())
+              formParam = formParam + `mchr13k@${_f} ${type},`
+            }
+          })
+        }
+      })
+    }
+
+    if (config.columns && config.columns.length > 0) {
+      config.columns.forEach(item => {
+        if (item.field) {
+          _columns.push(`${item.field} as ${item.label}`)
+        }
+      })
+
+      form = `
+        declare @dc table (${_columns.join(',')})
+        
+        @tableid ='${menu.MenuID}'
+      `
+    }
+
+    let Ltext = `create proc ${param.innerFunc}
+    ( /*${menu.MenuName}*/
+    @appkey nvarchar(50)='',
+    @BID nvarchar(50)='',${formParam}
+    @PageIndex nvarchar(50)='',
+    @PageSize nvarchar(50)='',
+    @OrderCol nvarchar(50)='',
+    @OrderType nvarchar(50)='',
+    @exceltype nvarchar(50)='',
+    @sEPTMenuNo nvarchar(50)='${menu.MenuNo}',
+    @lang nvarchar(50)='',
+    @debug nvarchar(50)='',
+    @LoginUID nvarchar(50)='',
+    @SessionUid nvarchar(50)='',
+    @UserID nvarchar(50),
+    @ErrorCode nvarchar(50) out,
+    @retmsg nvarchar(4000) out
+    )
+    as
+    begin
+    declare  @BegindateTest datetime,@EnddateTest datetime
+    select  @BegindateTest=getdate()
+    set @ErrorCode=''
+    set @retmsg=''
+    BEGIN TRY
+      /*浜嬪姟鎿嶄綔*/
+      BEGIN TRAN
+        /*鍏蜂綋涓氬姟鎿嶄綔*/
+        
+        /* 
+        select top 10 * from sProcExcep order by id desc
+        
+        declare @UserName  nvarchar(50),@FullName nvarchar(50)
+        
+        select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
+        ${form}
+        if 1=2
+        begin
+          set @ErrorCode='E'
+          set @retmsg='鍦ㄦ鍐欐姤閿�'
+          goto GOTO_RETURN
+        end
+        
+        insert into sNote (remark,createuserid,CreateUser,CreateStaff)
+        select '鍦ㄦ鍐欐棩蹇�',@UserID,@UserName,@FullName
+        */
+        
+      COMMIT TRAN
+      SET NOCOUNT ON
+      RETURN
+    END TRY
+    BEGIN CATCH
+      /*閿欒澶勭悊*/
+      ROLLBACK TRAN
+      DECLARE @ErrorMessage NVARCHAR(4000);
+      DECLARE @ErrorSeverity INT;
+      DECLARE @ErrorState INT;
+      
+      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
+      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
+      SET @retmsg=ERROR_MESSAGE();
+      SELECT @ErrorMessage=ERROR_MESSAGE(),
+        @ErrorSeverity=ERROR_SEVERITY(),
+        @ErrorState=ERROR_STATE();
+        
+      RAISERROR(@ErrorMessage, /*-- Message text.*/
+        @ErrorSeverity, /*-- Severity.*/
+        @ErrorState  /*-- State.*/
+      );
+    END CATCH
+    
+    GOTO_RETURN:
+      ROLLBACK TRAN
+      
+    END`
+
+    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
+
+    return Ltext
+  }
+
+  /**
+   * @description 鍒涘缓瀛樺偍杩囩▼
+   * @return {String}
+   */
+  static getfunc (param, btn, menu, config) {
+    let form = ''
+    let formParam = ''
+    let _vars = ['bid', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg']
+    let columns = config.columns
+    let primaryKey = config.setting.primaryKey || 'ID'
+
+    if (!_vars.includes(primaryKey.toLowerCase())) {
+      _vars.push(primaryKey.toLowerCase())
+      let _type = '50'
+      if (btn.Ot === 'requiredOnce') { // 澶氳鎷兼帴鏃讹紝涓婚敭璁句负max
+        _type = 'max'
+      }
+      formParam = `mchr13k@${primaryKey} nvarchar(${_type})='',`
+    }
+
+    if (param.fields && param.fields.length > 0) {
+      let _fields = []
+      param.fields.forEach(item => {
+        if (item.field) {
+          let type = ''
+          if (item.type.match(/date/ig)) {
+            type = 'datetime=null'
+          } else if (item.type === 'number') {
+            type = `decimal(18,${item.decimal})=0`
+          } else {
+            type = 'nvarchar(50)=\'\''
+          }
+
+          if (!_vars.includes(item.field.toLowerCase())) {
+            _vars.push(item.field.toLowerCase())
+            formParam = formParam + `mchr13k@${item.field} ${type},`
+          }
+
+          _fields.push(item.field)
+        }
+      })
+
+      let field1 = _fields.join(',')
+      let field2 = _fields.join(',@')
+      let field3 = _fields.map(cell => {
+        return cell + '=@' + cell
+      })
+
+      field2 = field2 ? '@' + field2 : ''
+      field3 = field3.join(',')
+
+      form = `
+        insert into ${param.name} (${field1},createuserid) select ${field2},@UserID
+        
+        update ${param.name} set ${field3},modifydate=getdate(),modifyuserid=@UserID
+      `
+    } else if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') {
+      form = `
+        update ${param.name} set ModifyDate=getdate(),ModifyUserID=@UserID where ${primaryKey}=@${primaryKey}
+      `
+    }
+
+    if (columns) {
+      let _col = []
+      let _field = []
+      columns.forEach(col => {
+        if (col.field) {
+          if (col.type === 'number') {
+            _col.push(col.field + ' decimal(18,2)')
+          } else {
+            _col.push(col.field + ' nvarchar(50)')
+          }
+          _field.push(col.field)
+        }
+      })
+      _col = _col.join(',')
+      _field = _field.join(',')
+
+      form = form + `
+        declare @dc table (${_col})
+        
+        insert into @dc (${_field})
+
+        @tableid ='${menu.MenuID}'
+      `
+    }
+
+    // 鎵撳嵃鑷畾涔夋ā鏉垮瓧娈垫彁绀�
+    let _printRemark = ''
+    if (btn.funcType === 'print') {
+      _printRemark = '/* 鑷畾涔夋暟鎹墦鍗版ā鏉挎椂锛岃浣跨敤TemplateID瀛楁 */'
+    }
+
+    let Ltext = `create proc ${param.funcName}
+    ( /*${menu.MenuName}  ${btn.label}*/
+    @appkey nvarchar(50)='',
+    @BID nvarchar(50)='',${formParam}
+    @sEPTMenuNo nvarchar(50)='${param.menuNo}',
+    @lang nvarchar(50)='',
+    @debug nvarchar(50)='',
+    @LoginUID nvarchar(50)='',
+    @SessionUid nvarchar(50)='',
+    @UserID nvarchar(50),
+    @ErrorCode nvarchar(50) out,
+    @retmsg nvarchar(4000) out
+    )
+    as
+    begin
+    declare  @BegindateTest datetime,@EnddateTest datetime
+    select  @BegindateTest=getdate()
+    set @ErrorCode=''
+    set @retmsg=''
+    BEGIN TRY
+      /*浜嬪姟鎿嶄綔*/
+      BEGIN TRAN
+        /*鍏蜂綋涓氬姟鎿嶄綔*/
+        ${_printRemark}
+        /* 
+        select top 10 * from sProcExcep order by id desc
+        
+        declare @UserName  nvarchar(50),@FullName nvarchar(50)
+        
+        select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
+        ${form}
+        if 1=2
+        begin
+          set @ErrorCode='E'
+          set @retmsg='鍦ㄦ鍐欐姤閿�'
+          goto GOTO_RETURN
+        end
+        
+        insert into sNote (remark,createuserid,CreateUser,CreateStaff)
+        select '鍦ㄦ鍐欐棩蹇�',@UserID,@UserName,@FullName
+        */
+        
+      COMMIT TRAN
+      SET NOCOUNT ON
+      RETURN
+    END TRY
+    BEGIN CATCH
+      /*閿欒澶勭悊*/
+      ROLLBACK TRAN
+      DECLARE @ErrorMessage NVARCHAR(4000);
+      DECLARE @ErrorSeverity INT;
+      DECLARE @ErrorState INT;
+      
+      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
+      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
+      SET @retmsg=ERROR_MESSAGE();
+      SELECT @ErrorMessage=ERROR_MESSAGE(),
+        @ErrorSeverity=ERROR_SEVERITY(),
+        @ErrorState=ERROR_STATE();
+        
+      RAISERROR(@ErrorMessage, /*-- Message text.*/
+        @ErrorSeverity, /*-- Severity.*/
+        @ErrorState  /*-- State.*/
+      );
+    END CATCH
+    
+    GOTO_RETURN:
+      ROLLBACK TRAN
+      
+    END`
+
+    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
+
+    return Ltext
+  }
+
+  /**
+   * @description 鍒涘缓瀵煎叆瀛樺偍杩囩▼
+   * @return {String}
+   */
+  static getexcelInfunc (param, btn, menu) {
+    let _verify = btn.verify
+
+    let _uniquesql = ''
+    if (_verify.uniques && _verify.uniques.length > 0) {
+      _verify.uniques.forEach(unique => {
+        if (unique.status === 'false') return
+
+        let _fields = unique.field.split(',')
+        let _fields_ = _fields.map(_field => {
+          return `a.${_field}=b.${_field}`
+        })
+        _fields_ = _fields_.join(' and ')
+
+        if (unique.verifyType !== 'physical') {
+          _fields_ += ' and b.deleted=0'
+        }
+
+        _uniquesql += `
+        Set @tbid=''
+        Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${unique.field} from @${btn.sheet} ) a group by ${unique.field} having sum(n)>1
+
+        If @tbid!=''
+        Begin
+          select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 閲嶅'
+          goto aaa
+        end
+
+        Set @tbid=''
+        Select top 1 @tbid=${_fields.join('+\' \'+')} from  @${btn.sheet} a
+        Inner join ${btn.sheet} b on ${_fields_}
+
+        If @tbid!=''
+        Begin
+          select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 涓庡凡鏈夋暟鎹噸澶�'
+          goto aaa
+        end
+        `
+      })
+
+      if (_uniquesql) {
+        _uniquesql = `
+        Declare @tbid Nvarchar(512)
+        ${_uniquesql}`
+      }
+    }
+
+    let declarefields = []
+    let fields = []
+
+    _verify.columns.forEach(col => {
+      declarefields.push(`${col.Column} ${col.type}`)
+      fields.push(col.Column)
+    })
+
+    fields = fields.join(',')
+
+    let _sql = `declare @${btn.sheet} table (${declarefields.join(',')},jskey nvarchar(50))
+      Declare @UserName nvarchar(50),@FullName nvarchar(50)
+      
+      select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
+      
+      Insert into @${btn.sheet} (${fields},jskey)
+
+      exec s_KeyWords_Replace
+      @LText=@LText, @BID=@BID,@LoginUID=@LoginUID,@SessionUid=@SessionUid,@UserID=@UserID,@ID=@ID
+      ${_uniquesql}
+      Insert into ${btn.sheet} (${fields},createuserid,createuser,createstaff,bid) 
+      Select ${fields},@userid,@username,@fullname,@BID From @${btn.sheet}
+
+      Delete @${btn.sheet}`
+
+    let Ltext = `create proc ${param.funcName}
+    ( /*${menu.MenuName}  ${btn.label}*/
+      @appkey nvarchar(50)='',
+      @ID nvarchar(50)='',
+      @BID nvarchar(50)='',
+      @Ltext nvarchar(max)='',
+      @sEPTMenuNo nvarchar(50)='${param.menuNo}', 
+      @secretkey nvarchar(50)='',
+      @timestamp nvarchar(50)='',
+      @lang nvarchar(50)='',
+      @LoginUID nvarchar(50)='',
+      @SessionUid nvarchar(50)='',
+      @UserID nvarchar(50), 
+      @ErrorCode nvarchar(50) out,
+      @retmsg nvarchar(4000) out
+    )
+    as
+    begin
+    declare @BegindateTest datetime,@EnddateTest datetime 
+    select @BegindateTest=getdate() 
+    set @ErrorCode=''
+    set @retmsg=''
+    BEGIN TRY
+      /*浜嬪姟鎿嶄綔*/
+      BEGIN TRAN
+        /*鍏蜂綋涓氬姟鎿嶄綔*/
+
+        /* 
+        ${_sql}
+        */
+        
+      COMMIT TRAN
+      SET NOCOUNT ON
+      RETURN
+    END TRY
+    BEGIN CATCH
+      /*閿欒澶勭悊*/
+      ROLLBACK TRAN
+      DECLARE @ErrorMessage NVARCHAR(4000);
+      DECLARE @ErrorSeverity INT;
+      DECLARE @ErrorState INT;
+      
+      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
+      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
+      SET @retmsg=ERROR_MESSAGE();
+      SELECT @ErrorMessage=ERROR_MESSAGE(),
+        @ErrorSeverity=ERROR_SEVERITY(),
+        @ErrorState=ERROR_STATE();
+        
+      RAISERROR(@ErrorMessage, /*-- Message text.*/
+        @ErrorSeverity, /*-- Severity.*/
+        @ErrorState  /*-- State.*/
+      );
+    END CATCH
+    
+    GOTO_RETURN:
+      ROLLBACK TRAN
+      
+    END`
+
+    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
+
+    return Ltext
+  }
+}
\ No newline at end of file
diff --git a/src/utils/utils.js b/src/utils/utils.js
index 10f3a4a..771b170 100644
--- a/src/utils/utils.js
+++ b/src/utils/utils.js
@@ -1424,462 +1424,4 @@
     console.log(_sql)
     return _sql
   }
-
-  /**
-   * @description 鍒犻櫎瀛樺偍杩囩▼sql
-   * @return {String} name 瀛樺偍杩囩▼鍚嶇О
-   */
-  static dropfunc (name) {
-    return `IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID('${name}') AND type in (N'P', N'PC'))  mdrpk PROCEDURE ${name}`
-  }
-
-  /**
-   * @description 鍒涘缓椤甸潰瀛樺偍杩囩▼
-   * @return {String}
-   */
-  static getTableFunc (param, menu, config) {
-    let form = ''
-    let formParam = ''
-    let _vars = ['bid', 'pageindex', 'pagesize', 'ordercol', 'ordertype', 'exceltype', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg']
-    let _columns = []
-    let primaryKey = config.setting.primaryKey || 'ID'
-
-    if (!_vars.includes(primaryKey.toLowerCase())) {
-      _vars.push(primaryKey.toLowerCase())
-      formParam = `mchr13k@${primaryKey} nvarchar(50)='',`
-    }
-
-    if (config.search && config.search.length > 0) {
-      let _fields = new Map()
-      config.search.forEach(item => {
-        if (item.field) {
-          let type = ''
-
-          if (item.type.match(/date/ig)) {
-            type = 'datetime=null'
-          } else {
-            type = 'nvarchar(50)=\'\''
-          }
-
-          item.field.split(',').forEach(cell => {
-            let _f = cell
-            if (_fields.has(cell)) {
-              _f = _f + '1'
-            }
-  
-            _fields.set(cell, true)
-
-            if (!_vars.includes(_f.toLowerCase())) {
-              _vars.push(_f.toLowerCase())
-              formParam = formParam + `mchr13k@${_f} ${type},`
-            }
-          })
-        }
-      })
-    }
-
-    if (config.columns && config.columns.length > 0) {
-      config.columns.forEach(item => {
-        if (item.field) {
-          _columns.push(`${item.field} as ${item.label}`)
-        }
-      })
-
-      form = `
-        declare @dc table (${_columns.join(',')})
-        
-        @tableid ='${menu.MenuID}'
-      `
-    }
-
-    let Ltext = `create proc ${param.innerFunc}
-    ( /*${menu.MenuName}*/
-    @appkey nvarchar(50)='',
-    @BID nvarchar(50)='',${formParam}
-    @PageIndex nvarchar(50)='',
-    @PageSize nvarchar(50)='',
-    @OrderCol nvarchar(50)='',
-    @OrderType nvarchar(50)='',
-    @exceltype nvarchar(50)='',
-    @sEPTMenuNo nvarchar(50)='${menu.MenuNo}',
-    @lang nvarchar(50)='',
-    @debug nvarchar(50)='',
-    @LoginUID nvarchar(50)='',
-    @SessionUid nvarchar(50)='',
-    @UserID nvarchar(50),
-    @ErrorCode nvarchar(50) out,
-    @retmsg nvarchar(4000) out
-    )
-    as
-    begin
-    declare  @BegindateTest datetime,@EnddateTest datetime
-    select  @BegindateTest=getdate()
-    set @ErrorCode=''
-    set @retmsg=''
-    BEGIN TRY
-      /*浜嬪姟鎿嶄綔*/
-      BEGIN TRAN
-        /*鍏蜂綋涓氬姟鎿嶄綔*/
-        
-        /* 
-        select top 10 * from sProcExcep order by id desc
-        
-        declare @UserName  nvarchar(50),@FullName nvarchar(50)
-        
-        select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
-        ${form}
-        if 1=2
-        begin
-          set @ErrorCode='E'
-          set @retmsg='鍦ㄦ鍐欐姤閿�'
-          goto GOTO_RETURN
-        end
-        
-        insert into sNote (remark,createuserid,CreateUser,CreateStaff)
-        select '鍦ㄦ鍐欐棩蹇�',@UserID,@UserName,@FullName
-        */
-        
-      COMMIT TRAN
-      SET NOCOUNT ON
-      RETURN
-    END TRY
-    BEGIN CATCH
-      /*閿欒澶勭悊*/
-      ROLLBACK TRAN
-      DECLARE @ErrorMessage NVARCHAR(4000);
-      DECLARE @ErrorSeverity INT;
-      DECLARE @ErrorState INT;
-      
-      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
-      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
-      SET @retmsg=ERROR_MESSAGE();
-      SELECT @ErrorMessage=ERROR_MESSAGE(),
-        @ErrorSeverity=ERROR_SEVERITY(),
-        @ErrorState=ERROR_STATE();
-        
-      RAISERROR(@ErrorMessage, /*-- Message text.*/
-        @ErrorSeverity, /*-- Severity.*/
-        @ErrorState  /*-- State.*/
-      );
-    END CATCH
-    
-    GOTO_RETURN:
-      ROLLBACK TRAN
-      
-    END`
-
-    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
-
-    return Ltext
-  }
-
-  /**
-   * @description 鍒涘缓瀛樺偍杩囩▼
-   * @return {String}
-   */
-  static getfunc (param, btn, menu, config) {
-    let form = ''
-    let formParam = ''
-    let _vars = ['bid', 'septmenuno', 'lang', 'debug', 'loginuid', 'sessionuid', 'userid', 'errorcode', 'retmsg']
-    let columns = config.columns
-    let primaryKey = config.setting.primaryKey || 'ID'
-
-    if (!_vars.includes(primaryKey.toLowerCase())) {
-      _vars.push(primaryKey.toLowerCase())
-      let _type = '50'
-      if (btn.Ot === 'requiredOnce') { // 澶氳鎷兼帴鏃讹紝涓婚敭璁句负max
-        _type = 'max'
-      }
-      formParam = `mchr13k@${primaryKey} nvarchar(${_type})='',`
-    }
-
-    if (param.fields && param.fields.length > 0) {
-      let _fields = []
-      param.fields.forEach(item => {
-        if (item.field) {
-          let type = ''
-          if (item.type.match(/date/ig)) {
-            type = 'datetime=null'
-          } else if (item.type === 'number') {
-            type = `decimal(18,${item.decimal})=0`
-          } else {
-            type = 'nvarchar(50)=\'\''
-          }
-
-          if (!_vars.includes(item.field.toLowerCase())) {
-            _vars.push(item.field.toLowerCase())
-            formParam = formParam + `mchr13k@${item.field} ${type},`
-          }
-
-          _fields.push(item.field)
-        }
-      })
-
-      let field1 = _fields.join(',')
-      let field2 = _fields.join(',@')
-      let field3 = _fields.map(cell => {
-        return cell + '=@' + cell
-      })
-
-      field2 = field2 ? '@' + field2 : ''
-      field3 = field3.join(',')
-
-      form = `
-        insert into ${param.name} (${field1},createuserid) select ${field2},@UserID
-        
-        update ${param.name} set ${field3},modifydate=getdate(),modifyuserid=@UserID
-      `
-    } else if (btn.OpenType === 'prompt' || btn.OpenType === 'exec') {
-      form = `
-        update ${param.name} set ModifyDate=getdate(),ModifyUserID=@UserID where ${primaryKey}=@${primaryKey}
-      `
-    }
-
-    if (columns) {
-      let _col = []
-      let _field = []
-      columns.forEach(col => {
-        if (col.field) {
-          if (col.type === 'number') {
-            _col.push(col.field + ' decimal(18,2)')
-          } else {
-            _col.push(col.field + ' nvarchar(50)')
-          }
-          _field.push(col.field)
-        }
-      })
-      _col = _col.join(',')
-      _field = _field.join(',')
-
-      form = form + `
-        declare @dc table (${_col})
-        
-        insert into @dc (${_field})
-
-        @tableid ='${menu.MenuID}'
-      `
-    }
-
-    // 鎵撳嵃鑷畾涔夋ā鏉垮瓧娈垫彁绀�
-    let _printRemark = ''
-    if (btn.funcType === 'print') {
-      _printRemark = '/* 鑷畾涔夋暟鎹墦鍗版ā鏉挎椂锛岃浣跨敤TemplateID瀛楁 */'
-    }
-
-    let Ltext = `create proc ${param.funcName}
-    ( /*${menu.MenuName}  ${btn.label}*/
-    @appkey nvarchar(50)='',
-    @BID nvarchar(50)='',${formParam}
-    @sEPTMenuNo nvarchar(50)='${param.menuNo}',
-    @lang nvarchar(50)='',
-    @debug nvarchar(50)='',
-    @LoginUID nvarchar(50)='',
-    @SessionUid nvarchar(50)='',
-    @UserID nvarchar(50),
-    @ErrorCode nvarchar(50) out,
-    @retmsg nvarchar(4000) out
-    )
-    as
-    begin
-    declare  @BegindateTest datetime,@EnddateTest datetime
-    select  @BegindateTest=getdate()
-    set @ErrorCode=''
-    set @retmsg=''
-    BEGIN TRY
-      /*浜嬪姟鎿嶄綔*/
-      BEGIN TRAN
-        /*鍏蜂綋涓氬姟鎿嶄綔*/
-        ${_printRemark}
-        /* 
-        select top 10 * from sProcExcep order by id desc
-        
-        declare @UserName  nvarchar(50),@FullName nvarchar(50)
-        
-        select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
-        ${form}
-        if 1=2
-        begin
-          set @ErrorCode='E'
-          set @retmsg='鍦ㄦ鍐欐姤閿�'
-          goto GOTO_RETURN
-        end
-        
-        insert into sNote (remark,createuserid,CreateUser,CreateStaff)
-        select '鍦ㄦ鍐欐棩蹇�',@UserID,@UserName,@FullName
-        */
-        
-      COMMIT TRAN
-      SET NOCOUNT ON
-      RETURN
-    END TRY
-    BEGIN CATCH
-      /*閿欒澶勭悊*/
-      ROLLBACK TRAN
-      DECLARE @ErrorMessage NVARCHAR(4000);
-      DECLARE @ErrorSeverity INT;
-      DECLARE @ErrorState INT;
-      
-      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
-      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
-      SET @retmsg=ERROR_MESSAGE();
-      SELECT @ErrorMessage=ERROR_MESSAGE(),
-        @ErrorSeverity=ERROR_SEVERITY(),
-        @ErrorState=ERROR_STATE();
-        
-      RAISERROR(@ErrorMessage, /*-- Message text.*/
-        @ErrorSeverity, /*-- Severity.*/
-        @ErrorState  /*-- State.*/
-      );
-    END CATCH
-    
-    GOTO_RETURN:
-      ROLLBACK TRAN
-      
-    END`
-
-    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
-
-    return Ltext
-  }
-
-  /**
-   * @description 鍒涘缓瀵煎叆瀛樺偍杩囩▼
-   * @return {String}
-   */
-  static getexcelInfunc (param, btn, menu) {
-    let _verify = btn.verify
-
-    let _uniquesql = ''
-    if (_verify.uniques && _verify.uniques.length > 0) {
-      _verify.uniques.forEach(unique => {
-        if (unique.status === 'false') return
-
-        let _fields = unique.field.split(',')
-        let _fields_ = _fields.map(_field => {
-          return `a.${_field}=b.${_field}`
-        })
-        _fields_ = _fields_.join(' and ')
-
-        if (unique.verifyType !== 'physical') {
-          _fields_ += ' and b.deleted=0'
-        }
-
-        _uniquesql += `
-        Set @tbid=''
-        Select top 1 @tbid=${_fields.join('+\' \'+')} from (select 1 as n,${unique.field} from @${btn.sheet} ) a group by ${unique.field} having sum(n)>1
-
-        If @tbid!=''
-        Begin
-          select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 閲嶅'
-          goto aaa
-        end
-
-        Set @tbid=''
-        Select top 1 @tbid=${_fields.join('+\' \'+')} from  @${btn.sheet} a
-        Inner join ${btn.sheet} b on ${_fields_}
-
-        If @tbid!=''
-        Begin
-          select @ErrorCode='${unique.errorCode}',@retmsg=@tbid+' 涓庡凡鏈夋暟鎹噸澶�'
-          goto aaa
-        end
-        `
-      })
-
-      if (_uniquesql) {
-        _uniquesql = `
-        Declare @tbid Nvarchar(512)
-        ${_uniquesql}`
-      }
-    }
-
-    let declarefields = []
-    let fields = []
-
-    _verify.columns.forEach(col => {
-      declarefields.push(`${col.Column} ${col.type}`)
-      fields.push(col.Column)
-    })
-
-    fields = fields.join(',')
-
-    let _sql = `declare @${btn.sheet} table (${declarefields.join(',')},jskey nvarchar(50))
-      Declare @UserName nvarchar(50),@FullName nvarchar(50)
-      
-      select @UserName=UserName,@FullName=FullName from SUsers where UID=@UserID
-      
-      Insert into @${btn.sheet} (${fields},jskey)
-
-      exec s_KeyWords_Replace
-      @LText=@LText, @BID=@BID,@LoginUID=@LoginUID,@SessionUid=@SessionUid,@UserID=@UserID,@ID=@ID
-      ${_uniquesql}
-      Insert into ${btn.sheet} (${fields},createuserid,createuser,createstaff,bid) 
-      Select ${fields},@userid,@username,@fullname,@BID From @${btn.sheet}
-
-      Delete @${btn.sheet}`
-
-    let Ltext = `create proc ${param.funcName}
-    ( /*${menu.MenuName}  ${btn.label}*/
-      @appkey nvarchar(50)='',
-      @ID nvarchar(50)='',
-      @BID nvarchar(50)='',
-      @Ltext nvarchar(max)='',
-      @sEPTMenuNo nvarchar(50)='${param.menuNo}', 
-      @secretkey nvarchar(50)='',
-      @timestamp nvarchar(50)='',
-      @lang nvarchar(50)='',
-      @LoginUID nvarchar(50)='',
-      @SessionUid nvarchar(50)='',
-      @UserID nvarchar(50), 
-      @ErrorCode nvarchar(50) out,
-      @retmsg nvarchar(4000) out
-    )
-    as
-    begin
-    declare @BegindateTest datetime,@EnddateTest datetime 
-    select @BegindateTest=getdate() 
-    set @ErrorCode=''
-    set @retmsg=''
-    BEGIN TRY
-      /*浜嬪姟鎿嶄綔*/
-      BEGIN TRAN
-        /*鍏蜂綋涓氬姟鎿嶄綔*/
-
-        /* 
-        ${_sql}
-        */
-        
-      COMMIT TRAN
-      SET NOCOUNT ON
-      RETURN
-    END TRY
-    BEGIN CATCH
-      /*閿欒澶勭悊*/
-      ROLLBACK TRAN
-      DECLARE @ErrorMessage NVARCHAR(4000);
-      DECLARE @ErrorSeverity INT;
-      DECLARE @ErrorState INT;
-      
-      /*鎶婅嚜瀹氫箟鐨勫弸濂界殑閿欒淇℃伅鎻愮ず鍔犱笂*/
-      set @ErrorCode=cast(ERROR_NUMBER() as nvarchar(50))
-      SET @retmsg=ERROR_MESSAGE();
-      SELECT @ErrorMessage=ERROR_MESSAGE(),
-        @ErrorSeverity=ERROR_SEVERITY(),
-        @ErrorState=ERROR_STATE();
-        
-      RAISERROR(@ErrorMessage, /*-- Message text.*/
-        @ErrorSeverity, /*-- Severity.*/
-        @ErrorState  /*-- State.*/
-      );
-    END CATCH
-    
-    GOTO_RETURN:
-      ROLLBACK TRAN
-      
-    END`
-
-    Ltext = Ltext.replace(/\n\s{4}/ig, 'mchr13k')
-
-    return Ltext
-  }
 }
\ No newline at end of file
diff --git a/src/views/login/index.jsx b/src/views/login/index.jsx
index 5b0d9b9..add45cc 100644
--- a/src/views/login/index.jsx
+++ b/src/views/login/index.jsx
@@ -353,7 +353,6 @@
             triggerBtn={{}}
             dict={{}}
             MenuID=""
-            permRoles={{}}
             logcolumns={[]}
             ContainerId=""
             refreshdata={() => {}}

--
Gitblit v1.8.0