From 04c038af25f79ac7fc80e93054856a614f22b63b Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 12 六月 2024 16:43:39 +0800
Subject: [PATCH] 2024-06-12

---
 src/tabviews/zshare/actionList/normalbutton/index.jsx | 1019 +++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 768 insertions(+), 251 deletions(-)

diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index e3a10b6..c9547e1 100644
--- a/src/tabviews/zshare/actionList/normalbutton/index.jsx
+++ b/src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -3,7 +3,7 @@
 import moment from 'moment'
 import qs from 'qs'
 import { is, fromJS } from 'immutable'
-import { Button, Modal, notification, message, Drawer, Switch, Checkbox, Progress } from 'antd'
+import { Button, Modal, notification, message, Popover, Drawer, Switch, Checkbox, Progress } from 'antd'
 import md5 from 'md5'
 
 import Api from '@/api'
@@ -28,6 +28,7 @@
     columns: PropTypes.any,           // 瀛楁鍒�
     setting: PropTypes.any,           // 椤甸潰閫氱敤璁剧疆
     disabled: PropTypes.any,          // 琛屾寜閽鐢�
+    name: PropTypes.any
   }
 
   state = {
@@ -47,6 +48,7 @@
   }
 
   moduleParams = null
+  preCallback = null
 
   UNSAFE_componentWillMount () {
     const { btn, selectedData, BData, disabled } = this.props
@@ -180,33 +182,17 @@
   }
 
   actionSubmit = (res) => {
-    const { btn, setting, BID } = this.props
+    const { btn } = this.props
     const { selines } = this.state
 
     if (btn.uuid !== res.menuId) return
 
     let data = selines || []
 
-    if (setting.supModule && !BID) {
-      notification.warning({
-        top: 92,
-        message: '闇�瑕佷笂绾т富閿�硷紒',
-        duration: 3
-      })
-      return
-    } else if (btn.Ot !== 'notRequired' && data.length === 0) {
-      notification.warning({
-        top: 92,
-        message: '璇烽�夋嫨琛岋紒',
-        duration: 5
-      })
-      return
-    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
-      notification.warning({
-        top: 92,
-        message: '璇烽�夋嫨鍗曡鏁版嵁锛�',
-        duration: 5
-      })
+    let valid = this.checkBtnData(data)
+
+    if (!valid) {
+      this.preCallback && this.preCallback()
       return
     }
 
@@ -214,122 +200,36 @@
 
     this.execSubmit(data, () => {}, res.form)
   }
-
-  /**
-   * @description 鎸夐挳鐘舵�佹敼鍙�
-   */
-  updateStatus = () => {
-    this.setState({
-      loading: false,
-      visible: false,
-      confirmLoading: false
-    })
-  }
   
   /**
    * @description 瑙﹀彂鎸夐挳鎿嶄綔
    */
-  actionTrigger = (triggerId, record, type) => {
-    const { BID, btn, selectedData, setting } = this.props
+  actionTrigger = (triggerId, record, type, lid, callback) => {
+    const { btn, selectedData, LID } = this.props
     const { loading, disabled } = this.state
+
+    if (type === 'preButton') {
+      if (btn.uuid !== triggerId) return
+
+      this.preTrigger(callback)
+      return
+    } else {
+      this.preCallback = null
+    }
 
     if (loading || disabled) return
     if (triggerId && btn.uuid !== triggerId) return
-
-    if (setting.supModule && !BID) {
-      notification.warning({
-        top: 92,
-        message: '闇�瑕佷笂绾т富閿�硷紒',
-        duration: 5
-      })
-      return
-    } else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(selectedData || []), fromJS(record))) {
-      return
-    }
+    if (type === 'linkbtn' && !btn.$toolbtn && LID !== lid) return
+    if (btn.OpenType === 'form' && btn.formType === 'count_line') return
 
     this.setState({autoMatic: type === 'autoMatic'})
 
     let _this = this
     let data = record || selectedData || []
 
-    if (btn.Ot !== 'notRequired' && data.length === 0) {
-      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾暟鎹�
-      notification.warning({
-        top: 92,
-        message: '璇烽�夋嫨琛岋紒',
-        duration: 5
-      })
-      return
-    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
-      // 闇�瑕侀�夋嫨鍗曡鏃讹紝鏍¢獙鏁版嵁
-      notification.warning({
-        top: 92,
-        message: '璇烽�夋嫨鍗曡鏁版嵁锛�',
-        duration: 5
-      })
-      return
-    } else if (btn.intertype === 'system') {
-      // 浣跨敤鍐呴儴鎺ュ彛鏃讹紝鎿嶄綔绫诲瀷鍜屾暟鎹簮涓嶅彲涓虹┖
-      if (!btn.sql || !btn.sqlType) {
-        notification.warning({
-          top: 92,
-          message: '鎸夐挳鎿嶄綔绫诲瀷閿欒锛�',
-          duration: 5
-        })
-        return
-      } else if (data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
-        notification.warning({
-          top: 92,
-          message: '浣跨敤鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒',
-          duration: 5
-        })
-        return
-      }
-    } else if (btn.intertype === 'inner') {
-      // 浣跨敤鍐呴儴鎺ュ彛鏃讹紝鍐呴儴鍑芥暟涓嶅彲涓虹┖
-      if (!btn.innerFunc) {
-        notification.warning({
-          top: 92,
-          message: '鎸夐挳鍐呴儴鍑芥暟涓嶅彲涓虹┖锛�',
-          duration: 5
-        })
-        return
-      }
-    } else if (btn.intertype === 'custom' || btn.intertype === 'outer') {
-      if (btn.callbackType === 'script' && (!btn.verify || !btn.verify.cbScripts || !btn.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
-        notification.warning({
-          top: 92,
-          message: '浣跨敤鑷畾涔夎剼鏈洖璋冩椂锛屽洖璋冭剼鏈笉鍙负绌猴紒',
-          duration: 5
-        })
-        return
-      } else if (btn.procMode === 'system' && data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
-        notification.warning({
-          top: 92,
-          message: '浣跨敤鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒',
-          duration: 5
-        })
-        return
-      } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
-        notification.warning({
-          top: 92,
-          message: '灏氭湭璁剧疆姝e紡绯荤粺鎺ュ彛鍦板潃锛�',
-          duration: 5
-        })
-        return
-      }
-    } else if (!['inner', 'outer', 'system', 'custom'].includes(btn.intertype)) {
-      if (btn.OpenType === 'form' && btn.formType === 'count_line') {
-        return
-      }
-      // 鎺ュ彛绫诲瀷閿欒
-      notification.warning({
-        top: 92,
-        message: '鎸夐挳鎺ュ彛绫诲瀷閿欒锛�',
-        duration: 5
-      })
-      return
-    }
+    let valid = this.checkBtnData(data)
+
+    if (!valid) return
 
     this.setState({
       selines: data
@@ -339,7 +239,6 @@
       this.setState({}, () => {
         MKEmitter.emit('mkFormSubmit', btn.uuid)
       })
-      return
     } else if (btn.OpenType === 'prompt') {
       this.setState({loading: true})
       confirm({
@@ -410,10 +309,158 @@
       let _change = {
         prompt: '鎻愮ず妗�',
         exec: '鐩存帴鎵ц',
-        pop: '寮圭獥锛堣〃鍗曪級'
+        pop: '寮圭獥锛堣〃鍗曪級',
+        formSubmit: '琛ㄥ崟',
+        form: '琛ㄥ崟',
       }
       MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: _change[btn.OpenType]})
     }
+  }
+
+  preTrigger = (callback) => {
+    const { btn, selectedData } = this.props
+    const { loading, disabled } = this.state
+
+    if (loading || disabled) {
+      callback()
+      return
+    } else if (btn.OpenType === 'form') {
+      callback()
+      return
+    }
+
+    let _this = this
+    let data = selectedData || []
+
+    let valid = this.checkBtnData(data)
+
+    if (!valid) {
+      callback()
+      return
+    }
+
+    this.preCallback = callback
+
+    this.setState({
+      selines: data
+    })
+    
+    if (btn.OpenType === 'formSubmit') {
+      this.setState({}, () => {
+        MKEmitter.emit('mkFormSubmit', btn.uuid, callback)
+      })
+    } else if (btn.OpenType === 'prompt') {
+      this.setState({loading: true})
+      confirm({
+        title: btn.tipTitle || '纭畾瑕佹墽琛屽悧?',
+        onOk() {
+          return new Promise(resolve => {
+            _this.execSubmit(data, resolve)
+          })
+        },
+        onCancel() {
+          callback()
+          _this.setState({loading: false})
+        }
+      })
+    } else if (btn.OpenType === 'exec') {
+      this.setState({loading: true})
+      this.execSubmit(data, () => { this.setState({loading: false})})
+    } else if (btn.OpenType === 'pop') {
+      let modal = this.state.btnconfig
+      if (!modal && btn.modal) {
+        modal = this.handleModelConfig(btn.modal)
+      }
+
+      this.setState({
+        loading: true,
+        btnconfig: modal
+      })
+
+      if (modal) {
+        if (modal.setting.display === 'prompt' || modal.setting.display === 'exec') {
+          this.modelconfirm()
+        } else {
+          this.setState({
+            visible: true
+          })
+        }
+      }
+    }
+  }
+  
+  /**
+   * @description 鎸夐挳鐘舵�佹敼鍙�
+   */
+  updateStatus = () => {
+    this.setState({
+      loading: false,
+      visible: false,
+      confirmLoading: false
+    })
+  }
+
+  checkBtnData = (data) => {
+    const { BID, btn, setting } = this.props
+
+    if (setting.supModule && !BID) {
+      notification.warning({
+        top: 92,
+        message: '闇�瑕佷笂绾т富閿�硷紒',
+        duration: 5
+      })
+      return false
+    } else if (btn.Ot !== 'notRequired' && data.length === 0) {
+      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾暟鎹�
+      notification.warning({
+        top: 92,
+        message: '璇烽�夋嫨琛岋紒',
+        duration: 5
+      })
+      return false
+    } else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
+      // 闇�瑕侀�夋嫨鍗曡鏃讹紝鏍¢獙鏁版嵁
+      notification.warning({
+        top: 92,
+        message: '璇烽�夋嫨鍗曡鏁版嵁锛�',
+        duration: 5
+      })
+      return false
+    } else if (btn.intertype === 'system') {
+      if (data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
+        notification.warning({
+          top: 92,
+          message: '浣跨敤鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒',
+          duration: 5
+        })
+        return false
+      }
+    } else if (btn.intertype === 'custom' || btn.intertype === 'outer') {
+      if (btn.callbackType === 'script' && (!btn.verify || !btn.verify.cbScripts || !btn.verify.cbScripts.filter(item => item.status !== 'false').length === 0)) {
+        notification.warning({
+          top: 92,
+          message: '浣跨敤鑷畾涔夎剼鏈洖璋冩椂锛屽洖璋冭剼鏈笉鍙负绌猴紒',
+          duration: 5
+        })
+        return false
+      } else if (btn.procMode === 'system' && data.length === 0 && btn.verify && btn.verify.voucher && btn.verify.voucher.enabled) {
+        notification.warning({
+          top: 92,
+          message: '浣跨敤鍒涘缓鍑瘉鍑芥暟锛岄渶瑕侀�夋嫨琛岋紒',
+          duration: 5
+        })
+        return false
+      } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
+        notification.warning({
+          top: 92,
+          message: '灏氭湭璁剧疆姝e紡绯荤粺鎺ュ彛鍦板潃锛�',
+          duration: 5
+        })
+        return false
+      }
+    }
+
+    return true
   }
 
   getSystemParam = (data, formdata, retmsg) => {
@@ -441,17 +488,17 @@
         param.ID = primaryId
 
         if (retmsg) {
-          const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, data[0], columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+          const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, data[0], columns, retmsg, this.moduleParams) // 鏁版嵁婧�
           param.LText = sql
           param.$callbacksql = callbacksql
         } else {
-          param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+          param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, false, this.moduleParams) // 鏁版嵁婧�
           if (btn.output) {
             param.key_back_type = 'Y'
           }
         }
 
-        param.exec_type = 'y' // 鍚庡彴瑙g爜
+        param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
         param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
         param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -462,7 +509,7 @@
           param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
         }
 
-        param.LText = Utils.formatOptions(param.LText)
+        param.LText = Utils.formatOptions(param.LText, param.exec_type)
       } else if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit' || btn.OpenType === 'form') { // 琛ㄥ崟
         if (btn.sqlType === 'insert') { // 绯荤粺鍑芥暟娣诲姞鏃讹紝鐢熸垚uuid
           primaryId = ''
@@ -477,17 +524,17 @@
           param.ID = primaryId || Utils.getguid()
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg, this.moduleParams) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false, this.moduleParams) // 鏁版嵁婧�
             if (btn.output) {
               param.key_back_type = 'Y'
             }
           }
 
-          param.exec_type = 'y' // 鍚庡彴瑙g爜
+          param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
           param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
           param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -498,22 +545,22 @@
             param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
           }
 
-          param.LText = Utils.formatOptions(param.LText)
+          param.LText = Utils.formatOptions(param.LText, param.exec_type)
         } else {
           param.ID = primaryId
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, retmsg, this.moduleParams) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, false, this.moduleParams) // 鏁版嵁婧�
             if (btn.output) {
               param.key_back_type = 'Y'
             }
           }
 
-          param.exec_type = 'y' // 鍚庡彴瑙g爜
+          param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
           param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
           param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -524,7 +571,7 @@
             param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
           }
 
-          param.LText = Utils.formatOptions(param.LText)
+          param.LText = Utils.formatOptions(param.LText, param.exec_type)
         }
       }
 
@@ -544,7 +591,7 @@
 
       if (param.$unCheckParam) {
         param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
-        param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText)
+        param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText, param.exec_type)
         param.$unCheckParam.menuname = btn.logLabel
 
         if (window.GLOB.probation) {
@@ -569,17 +616,17 @@
           param.ID = primaryId
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, cell, columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, cell, columns, retmsg, this.moduleParams) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, false, this.moduleParams) // 鏁版嵁婧�
             if (btn.output) {
               param.key_back_type = 'Y'
             }
           }
 
-          param.exec_type = 'y' // 鍚庡彴瑙g爜
+          param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
           param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
           param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -590,7 +637,7 @@
             param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
           }
 
-          param.LText = Utils.formatOptions(param.LText)
+          param.LText = Utils.formatOptions(param.LText, param.exec_type)
         } else if (btn.OpenType === 'pop') { // 琛ㄥ崟
           if (index !== 0) {
             let _cell = {}
@@ -609,17 +656,17 @@
             param.ID = Utils.getguid()
 
             if (retmsg) {
-              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg, this.moduleParams) // 鏁版嵁婧�
               param.LText = sql
               param.$callbacksql = callbacksql
             } else {
-              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false, this.moduleParams) // 鏁版嵁婧�
               if (btn.output) {
                 param.key_back_type = 'Y'
               }
             }
 
-            param.exec_type = 'y' // 鍚庡彴瑙g爜
+            param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
             param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
             param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -630,22 +677,22 @@
               param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
             }
 
-            param.LText = Utils.formatOptions(param.LText)
+            param.LText = Utils.formatOptions(param.LText, param.exec_type)
           } else {
             param.ID = primaryId
 
             if (retmsg) {
-              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, retmsg, this.moduleParams) // 鏁版嵁婧�
               param.LText = sql
               param.$callbacksql = callbacksql
             } else {
-              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, false, this.moduleParams) // 鏁版嵁婧�
               if (btn.output) {
                 param.key_back_type = 'Y'
               }
             }
 
-            param.exec_type = 'y' // 鍚庡彴瑙g爜
+            param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
             param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
             param.secretkey = Utils.encrypt('', param.timestamp)
 
@@ -656,7 +703,7 @@
               param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
             }
 
-            param.LText = Utils.formatOptions(param.LText)
+            param.LText = Utils.formatOptions(param.LText, param.exec_type)
           }
         }
 
@@ -675,7 +722,7 @@
 
         if (param.$unCheckParam) {
           param.$unCheckParam.LText = param.$unCheckParam.LText.replace(/\$check@/ig, '/*').replace(/@check\$/ig, '*/')
-          param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText)
+          param.$unCheckParam.LText = Utils.formatOptions(param.$unCheckParam.LText, param.exec_type)
           param.$unCheckParam.menuname = btn.logLabel
   
           if (window.GLOB.probation) {
@@ -708,6 +755,9 @@
       if (btn.recordUser === 'true') {
         param.username = sessionStorage.getItem('User_Name') || ''
         param.fullname = sessionStorage.getItem('Full_Name') || ''
+      }
+      if (btn.dataM === 'true') {
+        param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
       }
       
       let primaryId = ''
@@ -750,6 +800,9 @@
         if (btn.recordUser === 'true') {
           param.username = sessionStorage.getItem('User_Name') || ''
           param.fullname = sessionStorage.getItem('Full_Name') || ''
+        }
+        if (btn.dataM === 'true') {
+          param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
         }
 
         let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
@@ -971,21 +1024,92 @@
   /**
    * @description 鎸夐挳鎻愪氦鎵ц
    */
-  execSubmit = (data, _resolve, formdata) => {
+  execSubmit = (data, _resolve, formdata, force) => {
     const { setting, btn } = this.props
     this.moduleParams = null
 
-    if (
-      (btn.intertype === 'system' || (btn.intertype === 'custom' && btn.procMode === 'system')) && 
-      btn.sqlType !== 'insert' && btn.Ot !== 'notRequired' && btn.verify && btn.verify.invalid === 'true' &&
-      setting.dataresource
-    ) {
+    if (btn.preButton && !force) {
+      this.trigger(btn.preButton, data, _resolve, formdata, 0)
+    } else if (btn.verify && btn.verify.invalid === 'true' && setting.dataresource) {
       MKEmitter.emit('queryModuleParam', btn.$menuId, (param) => {
-        this.moduleParams = param
+        let datasource = setting.dataresource
+        let customScript = setting.customScript || ''
+        let allSearch = Utils.getAllSearchOptions(param.search)
+
+        let regoptions = allSearch.map(item => {
+          return {
+            reg: new RegExp('@' + item.key + '@', 'ig'),
+            value: `'${item.value}'`
+          }
+        })
+
+        regoptions.push({
+          reg: new RegExp('@userName@', 'ig'),
+          value: `'${sessionStorage.getItem('User_Name') || ''}'`
+        }, {
+          reg: new RegExp('@fullName@', 'ig'),
+          value: `'${sessionStorage.getItem('Full_Name') || ''}'`
+        }, {
+          reg: new RegExp('@orderBy@', 'ig'),
+          value: setting.order
+        }, {
+          reg: new RegExp('@pageSize@', 'ig'),
+          value: 10
+        }, {
+          reg: new RegExp('@pageIndex@', 'ig'),
+          value: 1
+        })
+
+        regoptions.forEach(item => {
+          datasource = datasource.replace(item.reg, item.value)
+          customScript = customScript.replace(item.reg, item.value)
+        })
+
+        this.moduleParams = {
+          datasource,
+          customScript
+        }
+
         this.execRealSubmit(data, _resolve, formdata)
       })
     } else {
       this.execRealSubmit(data, _resolve, formdata)
+    }
+  }
+
+  trigger = (btnId, data, resolve, formdata, times) => {
+    if (times > 50) {
+      notification.warning({
+        top: 92,
+        message: '鍓嶇疆鎸夐挳鍔犺浇澶辫触锛�',
+        duration: 5
+      })
+      this.setState({loading: false})
+      resolve()
+      return
+    }
+    times++
+
+    let node = document.getElementById('button' + btnId)
+
+    if (node) {
+      MKEmitter.emit('triggerBtnId', btnId, null, 'preButton', null, (res) => {
+        if (!res) {
+          this.setState({loading: false})
+          resolve()
+          return
+        }
+
+        if (res.status) {
+          this.execSubmit(data, resolve, formdata, true)
+        } else {
+          this.execError(res)
+        }
+      })
+    } else {
+      setTimeout(() => {
+        this.trigger(btnId, data, resolve, formdata, times)
+      }, 100)
     }
   }
 
@@ -1007,6 +1131,20 @@
 
       if (btn.intertype === 'system') {
         params = this.getSystemParam(data, formdata)
+        if (btn.returnValue === 'true') {
+          params = params.map(item => {
+            item.script_type = 'Y'
+            return item
+          })
+        }
+        if (btn.database === 'sso') {
+          if ((window.GLOB.mkHS || window.GLOB.systemType === 'production') && window.GLOB.mainSystemApi) {
+            params = params.map(item => {
+              item.rduri = window.GLOB.mainSystemApi
+              return item
+            })
+          }
+        }
       } else {
         params = this.getInnerParam(data, formdata)
       }
@@ -1178,7 +1316,7 @@
       return
     }
 
-    Api.genericInterface(param).then(res => {
+    Api.genericInterface(param, btn.$innerScript, 'inner').then(res => {
       record.mk_api_key = res.mk_api_key || ''
 
       if (res.status) {
@@ -1418,7 +1556,7 @@
       param.menuname = param.menuname + '(鍥炶皟)'
     }
 
-    Api.genericInterface(param).then(res => {
+    Api.genericInterface(param, btn.$callbackScript, 'callback').then(res => {
       if (res.status) {
         this.triggerNote(res, param.ID) // 娑堟伅
 
@@ -1508,11 +1646,12 @@
       })
 
       keys = keys.join(',')
+      vals = vals.join(',')
 
       lines.push({
         table: md5(tb + keys),
-        insert: `Insert into ${tbName} (${keys},[mk_level],[mk_id],[mk_bid])`,
-        select: `Select ${vals.join(',')},'${level}','${id}','${bid}'`
+        insert: `Insert into ${tbName} (${keys ? keys + ',' : ''}[mk_level],[mk_id],[mk_bid])`,
+        select: `Select ${keys ? vals + ',' : ''}'${level}','${id}','${bid}'`
       })
 
       subObjs.forEach(item => {
@@ -1595,23 +1734,25 @@
       sql = sql.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
       sql = sql.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
       sql = sql.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
+      sql = sql.replace(/@lang@/ig, `'${sessionStorage.getItem('lang')}'`)
       sql = sql.replace(/@typename@/ig, `'admin'`)
 
       if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
-        sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
+        sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, `'Y'`)
       } else {
-        sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
+        sql = sql.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, `''`)
       }
 
       if (window.GLOB.debugger === true) {
+        console.info('%c' + btn.logLabel + '(鍥炶皟)', 'color: blue')
         console.info(sql.replace(/\n\s{8}/ig, '\n'))
       }
 
       param.LText = sql
-      param.exec_type = 'y' // 鍚庡彴瑙g爜
+      param.exec_type = window.GLOB.execType || 'y' // 鍚庡彴瑙g爜
       param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
       param.secretkey = Utils.encrypt('', param.timestamp)
-      param.LText = Utils.formatOptions(param.LText)
+      param.LText = Utils.formatOptions(param.LText, param.exec_type)
       param.menuname = btn.logLabel
 
       if (window.GLOB.probation) {
@@ -1774,7 +1915,7 @@
       return
     }
 
-    Api.genericInterface(param).then(res => {
+    Api.genericInterface(param, btn.$innerScript, 'inner').then(res => {
       if (res.status) {
         if ((res.mk_ex_invoke === 'false' || res.mk_ex_invoke === false) && params.length === 0) {
           this.execSuccess(res)
@@ -1872,7 +2013,7 @@
       }
     }
 
-    Api.genericInterface(result).then(res => {
+    Api.genericInterface(result, btn.$outerScript, 'outer').then(res => {
       if (!res) return // LoginError鏃朵腑鏂姹�
       if (ver_token && res.ErrCode === 'token_error') {
         res.ErrCode = 'E'
@@ -1935,11 +2076,14 @@
         func: btn.callbackFunc
       }
 
-      // special 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
-      if (window.GLOB.mkHS && param.func === 's_sDataDictb_TBBack' && param.LTextOut) {
-        param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-        param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
-        param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+      if (window.GLOB.mkHS) {
+        if (btn.callbackFunc === 's_sVersion_Local_add' && window.GLOB.forcedUpdate) { // special 浼犺緭鍙锋坊鍔犲洖璋冨鐞�
+          param.local_userid = sessionStorage.getItem('LocalUserID') || ''
+        } else if (btn.callbackFunc === 's_sDataDictb_TBBack' && param.LTextOut) { // special 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
+          param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+          param.secretkey = Utils.encrypt(param.LTextOut, param.timestamp)
+          param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
+        }
       }
     } else {
       if (result.status) {
@@ -1961,7 +2105,7 @@
       param.menuname = param.menuname + '(鍥炶皟)'
     }
 
-    Api.genericInterface(param).then(res => {
+    Api.genericInterface(param, btn.$callbackScript, 'callback').then(res => {
       if (res.status) {
         this.triggerNote(res, param.ID) // 娑堟伅
 
@@ -1985,30 +2129,76 @@
     delete result.message
     delete result.status
 
-    result.func = btn.callbackFunc
-
     let ssoParam = null
+    let sinParam = null
     let callParam = {...outParam, ...result}
 
-    if (callParam.LTextOut) {
-      callParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
-      callParam.secretkey = Utils.encrypt(callParam.LTextOut, callParam.timestamp)
-      callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
-    }
-
+    callParam.func = btn.callbackFunc
     callParam.userid = sessionStorage.getItem('LocalUserID') || ''
     callParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
 
-    if (callParam.UpType === 'SSO' && window.GLOB.localSystemApi) {
+    if (result.LTextOut) {
+      callParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      callParam.secretkey = Utils.encrypt(callParam.LTextOut, callParam.timestamp)
+      callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
+    } else {
+      callParam = {...outParam}
+      callParam.func = btn.callbackFunc
+      callParam.MenuNO = 'sVersionDetail_LocalM'
+      callParam.UpType = 'SSO'
+      callParam.LTextOut = 'minke'
+      callParam.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      callParam.secretkey = Utils.encrypt(callParam.LTextOut, callParam.timestamp)
+      callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
+      callParam.userid = sessionStorage.getItem('LocalUserID') || ''
+      callParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
+
+      delete result.ErrCode
+      delete result.ErrMesg
+
+      sinParam = {...result}
+      sinParam.func = 'sPC_TrdMenu_AddUpt_sso'
+
+      if (window.GLOB.sysType === 'local') {
+        if (!window.GLOB.systemType && window.GLOB.cloudServiceApi) {
+          sinParam.rduri = window.GLOB.cloudServiceApi
+        } else if (window.GLOB.localSystemApi) {
+          sinParam.rduri = window.GLOB.localSystemApi
+          sinParam.userid = sessionStorage.getItem('LocalUserID') || ''
+          sinParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
+        }
+      }
+    }
+    
+    if (result.UpType === 'SSO' && window.GLOB.localSystemApi) {
       ssoParam = fromJS(callParam).toJS()
       ssoParam.rduri = window.GLOB.localSystemApi
 
       delete ssoParam.UpType
-    } else {
-      delete callParam.UpType
     }
 
-    if (ssoParam) {
+    if (sinParam) {
+      Api.genericInterface(sinParam).then(res => {
+        if (!res.status) {
+          this.execError(res)
+          _resolve()
+        } else {
+          Api.genericInterface(callParam).then(re => {
+            if (!re.status) {
+              this.execError(re)
+              _resolve()
+            } else {
+              if (params.length === 0) {
+                this.execSuccess(res)
+                _resolve()
+              } else {
+                this.outerLoopRequest(params, _resolve)
+              }
+            }
+          })
+        }
+      })
+    } else if (ssoParam) {
       Api.genericInterface(ssoParam).then(res => {
         if (!res.status) {
           this.execError(res)
@@ -2058,7 +2248,30 @@
     const { btn } = this.props
     const { autoMatic } = this.state
 
-    if (autoMatic) {
+    if (btn.resetForms) {
+      let data = {}
+
+      Object.keys(res).forEach(key => {
+        data[key.toLowerCase()] = res[key]
+      })
+
+      delete data.errcode
+      delete data.errmesg
+      delete data.message
+      delete data.status
+
+      MKEmitter.emit('resetForms', btn.uuid, data)
+      MKEmitter.emit('refreshByButtonResult', btn.$menuId, 'resetData', btn, null, null, data)
+    }
+
+    if (this.preCallback) {
+      this.setState({
+        loading: false,
+        visible: false
+      })
+      this.preCallback(res)
+      return
+    } else if (autoMatic) {
       this.setState({
         loading: false,
         visible: false
@@ -2068,6 +2281,17 @@
     }
 
     let sign = ''
+    let focusField = ''
+
+    if (/@focus:[a-z0-9_]+@/i.test(res.message)) {
+      let val = res.message.match(/@focus:[a-z0-9_]+@/i)
+      res.message = res.message.replace(/@focus:[a-z0-9_]+@/i, '')
+      focusField = val ? val[0].replace(/@focus:|@/ig, '') : ''
+
+      if (!res.message) {
+        res.ErrCode = '-1'
+      }
+    }
     if (/^@speak@/i.test(res.message)) {
       res.message = res.message.replace(/^@speak@/i, '')
       let val = res.message.match(/<<.*>>/)
@@ -2083,7 +2307,8 @@
       if (!res.message) {
         res.ErrCode = '-1'
       }
-    } else if (/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i.test(res.message)) {
+    }
+    if (/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i.test(res.message)) {
       sign = res.message.match(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i)[0].toLowerCase()
       res.message = res.message.replace(/@close_tab@|@close_popup@|@goback@|@no_target_menu@/i, '')
     }
@@ -2116,7 +2341,7 @@
       Modal.success({
         title: msg,
         onOk: () => {
-          this.successContinue(sign, id)
+          this.successContinue(sign, id, res, focusField)
         }
       })
       return
@@ -2124,12 +2349,16 @@
 
     }
 
-    this.successContinue(sign, id)
+    this.successContinue(sign, id, res, focusField)
   }
 
-  successContinue = (sign, id) => {
+  successContinue = (sign, id, res, focusField) => {
     const { btn } = this.props
     const { btnconfig } = this.state
+
+    if (focusField) {
+      MKEmitter.emit('resetFocus', btn.uuid, focusField)
+    }
 
     this.setState({
       loadingNumber: '',
@@ -2147,6 +2376,10 @@
     if (btn.refreshTab && btn.refreshTab.length > 0) {
       tabId = btn.refreshTab[btn.refreshTab.length - 1]
     }
+
+    // if (btn.formCache === 'clear') { // 娓呴櫎琛ㄥ崟缂撳瓨
+    //   window.GLOB.CacheMap = new Map()
+    // }
 
     if (tabId && btn.$MenuID === tabId) { // 鍒锋柊褰撳墠鑿滃崟鏃讹紝鍋滄鍏朵粬鎿嶄綔
       MKEmitter.emit('reloadMenuView', tabId, 'table')
@@ -2169,11 +2402,24 @@
       if (btn.syncComponentId === 'multiComponent') {
         btn.syncComponentIds.forEach((id, i) => {
           setTimeout(() => {
-            MKEmitter.emit('reloadData', id)
+            if (/\$focus/.test(id)) {
+              MKEmitter.emit('reloadData', id.split('$')[0], id.split('$')[1])
+            } else {
+              MKEmitter.emit('reloadData', id)
+            }
           }, 20 * i)
         })
+      } else if (/\$focus/.test(btn.syncComponentId)) {
+        MKEmitter.emit('reloadData', btn.syncComponentId.split('$')[0], btn.syncComponentId.split('$')[1])
       } else {
-        MKEmitter.emit('reloadData', btn.syncComponentId)
+        if (btn.syncDelay) {
+          this.delayTimer && clearTimeout(this.delayTimer)
+          this.delayTimer = setTimeout(() => {
+            MKEmitter.emit('reloadData', btn.syncComponentId)
+          }, btn.syncDelay)
+        } else {
+          MKEmitter.emit('reloadData', btn.syncComponentId)
+        }
       }
     }
 
@@ -2215,13 +2461,41 @@
     if (btn.execSuccess === 'popclose' && btn.$tabId) { // 鏍囩鍏抽棴鍒锋柊
       MKEmitter.emit('refreshPopButton', btn.$tabId)
     }
+
+    if (btn.verify && btn.verify.linkEnable === 'true') {
+      let url = ''
+      if (window.GLOB.systemType === 'production') {
+        url = btn.verify.linkProUrl
+        if (!url) {
+          notification.warning({
+            top: 92,
+            message: '灏氭湭娣诲姞姝e紡绯荤粺閾炬帴鍦板潃锛�',
+            duration: 5
+          })
+          return
+        }
+      } else {
+        url = btn.verify.linkUrl
+      }
+
+      if (/@/.test(url)) {
+        Object.keys(res).forEach(key => {
+          url = url.replace(new RegExp('@' + key + '@', 'ig'), res[key])
+        })
+      }
+      if (!/^http/.test(url)) {
+        url = window.location.origin + url
+      }
+
+      window.open(url)
+    }
   }
 
   triggerNote = (res, ID) => {
     const { btn } = this.props
 
     if (!btn.verify) return
-    if (btn.verify.noteEnable !== 'true' && btn.verify.wxNote !== 'true' && btn.verify.printEnable !== 'true') return
+    if (btn.verify.noteEnable !== 'true' && btn.verify.wxNote !== 'true' && btn.verify.printEnable !== 'true' && btn.verify.emailEnable !== 'true') return
 
     let id = ''
     if (btn.output) {
@@ -2236,6 +2510,9 @@
 
     if (btn.verify.noteEnable === 'true') {
       this.sendMessage(btn.verify, id)
+    }
+    if (btn.verify.emailEnable === 'true') {
+      this.sendEmail(btn.verify, id)
     }
     if (btn.verify.wxNote === 'true') {
       if (btn.verify.wxTemplateId === 'mk_category_temp') {
@@ -2258,9 +2535,38 @@
 
     if (!id) return
 
-    setTimeout(() => {
-      window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: id, tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM') }))))
-    }, 500)
+    if (btn.verify.preHandle === 'true' && btn.verify.pre_func && /#position-print/.test(btn.verify.pre_func)) {
+      MKEmitter.emit('queryModuleParam', btn.$menuId, (res) => {
+        let searches = {}
+        res.search && res.search.forEach(item => {
+          searches[item.key] = item.value
+        })
+        let _param = { id: id || '', tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM')}
+
+        try {
+          // eslint-disable-next-line
+          let func = new Function('btn', 'searches', 'param', 'systemType', btn.verify.pre_func)
+          _param = func(btn, searches, _param, window.GLOB.systemType)
+        } catch (e) {
+          console.warn(e)
+        }
+
+        if (!_param || _param.error) {
+          notification.warning({
+            top: 92,
+            message: _param ? _param.error : '鏈幏鍙栧埌鎵撳嵃鍙傛暟锛岃嚜瀹氫箟鑴氭湰閿欒锛�',
+            duration: 5
+          })
+          return
+        }
+        
+        window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify(_param))))
+      })
+    } else {
+      setTimeout(() => {
+        window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: id, tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM') }))))
+      }, 200)
+    }
   }
 
   sendWxMessage = (verify, id) => {
@@ -2278,7 +2584,7 @@
       upid: id
     }
 
-    param.LText = Utils.formatOptions(Utils.getuuid())
+    param.LText = Utils.getuuid()
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
     param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
@@ -2315,9 +2621,9 @@
 
       if (verify.wxNoteLink === 'url' && verify.wxNoteLinkUrl) {
         _param.url = verify.wxNoteLinkUrl
-      } else if (verify.wxNoteLink === 'miniProgram' && window.GLOB.WXminiAppID) {
+      } else if (verify.wxNoteLink === 'miniProgram' && (window.GLOB.WXminiAppID || verify.wxNoteMiniId)) {
         _param.miniprogram = {
-          appid: window.GLOB.WXminiAppID,
+          appid: verify.wxNoteMiniId || window.GLOB.WXminiAppID,
           pagepath: '/pages/index/index'
         }
 
@@ -2372,7 +2678,7 @@
                 msg_result: msg
               }
 
-              _p.LText = Utils.formatOptions(Utils.getuuid())
+              _p.LText = Utils.getuuid()
               _p.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
               _p.secretkey = Utils.encrypt(_p.LText, _p.timestamp)
 
@@ -2415,12 +2721,12 @@
   sendMessage = (verify, id) => {
     let param = {
       func: 's_get_sms_local',
-      TypeCharOne: verify.noteTemp, // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
-      TypeCharTwo: verify.noteType, // N瀹氭椂锛孻瀹炴椂
+      TypeCharOne: verify.noteTemp || 'Y', // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
+      TypeCharTwo: verify.noteType || 'N', // N瀹氭椂锛孻瀹炴椂
       upid: id
     }
 
-    param.LText = Utils.formatOptions(Utils.getuuid())
+    param.LText = Utils.getuuid()
     param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
     param.secretkey = Utils.encrypt(param.LText, param.timestamp)
 
@@ -2435,9 +2741,9 @@
       }
 
       let _param = {
-        templatecode: verify.noteCode, // 妯℃澘缂栫爜
-        TypeCharOne: verify.noteTemp,  // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
-        ID: verify.noteId || ''        // 妯℃澘Id锛屾殏鏃舵湭浣跨敤
+        templatecode: verify.noteCode,        // 妯℃澘缂栫爜
+        TypeCharOne: verify.noteTemp || 'Y',  // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
+        ID: verify.noteId || ''               // 妯℃澘Id锛屾殏鏃舵湭浣跨敤
       }
 
       _param.submitdate = res.submitdate
@@ -2445,17 +2751,17 @@
       let limit = 5 // 瀹炴椂鏈�澶т负5鏉★紝瀹氭椂鏈�澶т负100鏉�
       let mobMap = new Map()
 
-      if (verify.noteType === 'N') {
+      if (verify.noteType === 'Y') {
+        _param.func = 's_get_sms_sso_realtime'
+      } else {
         _param.func = 's_get_sms_sso_timer'
         limit = 100
-      } else if (verify.noteType === 'Y') {
-        _param.func = 's_get_sms_sso_realtime'
       }
 
       let Ltext = []
       let error = false
 
-      if (verify.noteTemp === 'Y') {
+      if (verify.noteTemp !== 'N') {
         _param.p1 = res.p1 || ''
         _param.p2 = res.p2 || ''
         _param.p3 = res.p3 || ''
@@ -2464,25 +2770,156 @@
 
         let _p = _param.p1 + _param.p2 + _param.p3 + _param.p4 + _param.p5
 
-        if (/\/|\.|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊|Q/.test(_p)) {
+        if (/\/|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊/.test(_p)) {
           error = true
         }
       }
 
       res.send_data && res.send_data.forEach(item => {
         if (item.mob && !mobMap.has(item.mob) && Ltext.length < limit) {
-          if (verify.noteTemp === 'Y') {
+          if (verify.noteTemp !== 'N') {
             Ltext.push(`'${item.mob}'`)
           } else {
             let _p = `'${item.p1 || ''}','${item.p2 || ''}','${item.p3 || ''}','${item.p4 || ''}','${item.p5 || ''}','${item.mob}'`
 
-            if (/\/|\.|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊|Q/.test(_p)) {
+            if (/\/|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊/.test(_p)) {
               error = true
             }
 
             Ltext.push(_p)
           }
           mobMap.set(item.mob, true)
+        }
+      })
+
+      if (error) {
+        notification.warning({
+          top: 92,
+          message: '娑堟伅涓惈鏈夐潪娉曞瓧绗�',
+          duration: 5
+        })
+        return
+      }
+
+      if (Ltext.length === 0) return
+
+      Ltext = Ltext.join(';')
+
+      _param.LText = window.btoa(window.encodeURIComponent(Ltext))
+      _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+      _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
+
+      _param.rduri = 'https://sso.mk9h.cn/webapi/dostars'
+
+      _param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
+      _param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
+
+      Api.genericInterface(_param).then(result => {
+        if (!result.status) {
+          notification.warning({
+            top: 92,
+            message: result.message,
+            duration: 5
+          })
+        }
+      }, (error) => {
+        if (error && error.ErrCode === 'LoginError') {
+          let param = {
+            func: 's_visitor_login',
+            timestamp: moment().format('YYYY-MM-DD HH:mm:ss'), 
+            SessionUid: 'bh0bapabtd45epsgra79segbch6c1ibk',
+            TypeCharOne: 'pc',
+            appkey: '202004041613277377A6A2456D34A4948AE84'
+          }
+
+          param.LText = md5(window.btoa('bh0bapabtd45epsgra79segbch6c1ibk' + param.timestamp))
+          param.secretkey = md5(param.LText + 'mingke' + param.timestamp)
+
+          let params = {
+            url: 'https://sso.mk9h.cn/webapi/dologon',
+            method: 'post',
+            data: JSON.stringify(param)
+          }
+
+          Api.directRequest(params)
+
+          return
+        }
+      })
+    })
+  }
+
+  sendEmail = (verify, id) => {
+    let param = {
+      func: 's_get_email_local',
+      TypeCharOne: verify.emailTemp || 'Y', // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
+      TypeCharTwo: verify.emailType || 'N', // N瀹氭椂锛孻瀹炴椂
+      upid: id
+    }
+
+    param.LText = Utils.getuuid()
+    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
+    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
+
+    Api.genericInterface(param).then(res => {
+      if (!res.status) {
+        notification.warning({
+          top: 92,
+          message: res.message,
+          duration: 5
+        })
+        return
+      }
+
+      let _param = {
+        msn_email_temp_no: verify.emailCode,   // 妯℃澘缂栫爜
+        TypeCharOne: verify.emailTemp || 'Y',  // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
+        ID: verify.emailId || ''               // 妯℃澘Id锛屾殏鏃舵湭浣跨敤
+      }
+
+      _param.submitdate = res.submitdate
+
+      let limit = 5 // 瀹炴椂鏈�澶т负5鏉★紝瀹氭椂鏈�澶т负100鏉�
+      let mobMap = new Map()
+
+      if (verify.emailType === 'Y') {
+        _param.func = 's_get_email_sso_realtime'
+      } else {
+        _param.func = 's_get_email_sso_timer'
+        limit = 100
+      }
+
+      let Ltext = []
+      let error = false
+
+      if (verify.emailTemp !== 'N') {
+        _param.p1 = res.p1 || ''
+        _param.p2 = res.p2 || ''
+        _param.p3 = res.p3 || ''
+        _param.p4 = res.p4 || ''
+        _param.p5 = res.p5 || ''
+
+        let _p = _param.p1 + _param.p2 + _param.p3 + _param.p4 + _param.p5
+
+        if (/\/|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊/.test(_p)) {
+          error = true
+        }
+      }
+
+      res.send_data && res.send_data.forEach(item => {
+        if (item.email && !mobMap.has(item.email) && Ltext.length < limit) {
+          if (verify.emailTemp !== 'N') {
+            Ltext.push(`'${item.email}'`)
+          } else {
+            let _p = `'${item.p1 || ''}','${item.p2 || ''}','${item.p3 || ''}','${item.p4 || ''}','${item.p5 || ''}','${item.email}'`
+
+            if (/\/|.*鍏�.*浜.*涔�.*杩憒闈㈣瘯|閭�璇穦涓嬭浇|绾㈠寘|鎷涜仒|濂借瘎|璇勪环|鏀垮姟閫氱煡|缂磋垂|淇濋櫓|鑲$エ|閲戣瀺|鎴垮湴浜鏁欒偛|娓告垙|寰俊/.test(_p)) {
+              error = true
+            }
+
+            Ltext.push(_p)
+          }
+          mobMap.set(item.email, true)
         }
       })
 
@@ -2553,7 +2990,14 @@
     const { btn } = this.props
     const { autoMatic } = this.state
 
-    if (autoMatic) {
+    if (this.preCallback) {
+      this.setState({
+        loading: false,
+        visible: false
+      })
+      this.preCallback(res)
+      return
+    } else if (autoMatic) {
       notification.error({
         top: 92,
         message: res.message || '鎵ц澶辫触锛�',
@@ -2623,6 +3067,13 @@
       })
     } else if (res.ErrCode === 'NM') {
       message.error(res.message || '鎵ц澶辫触锛�')
+    } else if (res.ErrCode === '-2') {
+      this.setState({
+        loadingNumber: '',
+        loadingTotal: '',
+        loading: false
+      })
+      return
     }
 
     this.errorContinue(sign)
@@ -2652,8 +3103,47 @@
     } else if (btn.execError === 'closepoptab' || sign === '@close_popup@') {
       MKEmitter.emit('popclose')
     } else if (btn.execError !== 'never') {
+      let tabId = ''
+      if (btn.refreshTab && btn.refreshTab.length > 0) {
+        tabId = btn.refreshTab[btn.refreshTab.length - 1]
+      }
+      if (tabId && btn.$MenuID === tabId) { // 鍒锋柊褰撳墠鑿滃崟鏃讹紝鍋滄鍏朵粬鎿嶄綔
+        MKEmitter.emit('reloadMenuView', tabId, 'table')
+        return
+      }
+
       MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
+
+      if (btn.syncComponentId) {
+        if (btn.syncComponentId === 'multiComponent') {
+          btn.syncComponentIds.forEach((id, i) => {
+            setTimeout(() => {
+              if (/\$focus/.test(id)) {
+                MKEmitter.emit('reloadData', id.split('$')[0], id.split('$')[1])
+              } else {
+                MKEmitter.emit('reloadData', id)
+              }
+            }, 20 * i)
+          })
+        } else if (/\$focus/.test(btn.syncComponentId)) {
+          MKEmitter.emit('reloadData', btn.syncComponentId.split('$')[0], btn.syncComponentId.split('$')[1])
+        } else {
+          if (btn.syncDelay) {
+            this.delayTimer && clearTimeout(this.delayTimer)
+            this.delayTimer = setTimeout(() => {
+              MKEmitter.emit('reloadData', btn.syncComponentId)
+            }, btn.syncDelay)
+          } else {
+            MKEmitter.emit('reloadData', btn.syncComponentId)
+          }
+        }
+      }
+
+      if (tabId) {
+        MKEmitter.emit('reloadMenuView', tabId, 'table')
+      }
     }
+
     if (btn.OpenType === 'form') {
       let data = this.props.selectedData && this.props.selectedData[0] ? this.props.selectedData[0] : null
 
@@ -2803,10 +3293,12 @@
       visible: false,
       confirmLoading: false
     })
+
+    this.preCallback && this.preCallback()
   }
 
   modelconfirm = () => {
-    const { btn, BID } = this.props
+    const { BID } = this.props
     const { btnconfig, selines } = this.state
     let _this = this
 
@@ -2881,7 +3373,33 @@
         _item.value = _item.value.replace(/\t+|\v+/g, '')       // 鍘婚櫎鍒惰〃绗�
 
         if (item.interception !== 'false') {                    // 鍘婚櫎棣栧熬绌烘牸
-          _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          if (item.interception === 'func') {
+            try {
+              // eslint-disable-next-line
+              let func = new Function('value', 'data', item.func)
+              _item.value = func(_item.value, _data)
+              _item.value = _item.value !== undefined ? _item.value : ''
+            } catch (e) {
+              console.warn(e)
+              _item.value = ''
+            }
+          } else if (item.interception === 'charTure') {
+            let str = _item.value.replace(/(^\s*|\s*$)/g, '')
+            let result = ''
+            for (let i = 0 ; i < str.length; i++) {
+              let code = str.charCodeAt(i)
+              if (code >= 65281 && code <= 65373) {
+                result += String.fromCharCode(str.charCodeAt(i) - 65248)
+              } else if (code === 12288) {
+                result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
+              } else {
+                result += str.charAt(i)
+              }
+            }
+            _item.value = result
+          } else {
+            _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
+          }
         }
         if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 鐗规畩瀛楁鏇挎崲
           _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (BID || ''))
@@ -2925,13 +3443,14 @@
       this.execSubmit(selines, () => {}, result)
     } else {
       confirm({
-        title: btn.tipTitle || '纭畾瑕佹墽琛屽悧?',
+        title: btnconfig.setting.tipTitle || '纭畾瑕佹墽琛屽悧?',
         onOk() {
           return new Promise(resolve => {
             _this.execSubmit(selines, resolve, result)
           })
         },
         onCancel() {
+          _this.preCallback && _this.preCallback()
           _this.setState({ loading: false })
         }
       })
@@ -2993,6 +3512,13 @@
       if (btnconfig.setting.container === 'tab' && btn.ContainerId) {
         width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + '%'
         container = () => document.getElementById(btn.ContainerId)
+      }
+
+      if (btnconfig.setting.icon) {
+        title = <>
+          <span className={'mk-modal-icon-' + btnconfig.setting.iconType} style={{background: btnconfig.setting.iconColor || 'unset', color: btnconfig.setting.iconColor || 'inherit'}}><MkIcon type={btnconfig.setting.icon}/></span>
+          {title}
+        </>
       }
 
       return (
@@ -3097,7 +3623,7 @@
   }
 
   render() {
-    const { btn } = this.props
+    const { btn, name } = this.props
     const { loadingNumber, loadingTotal, loading, disabled, hidden, check, count } = this.state
 
     if (hidden) return null
@@ -3116,45 +3642,36 @@
     }
 
     let label = ''
-    let icon = ''
-    let type = 'link'
-    let className = ''
 
-    if (btn.show === 'button') {
-      label = btn.label
-      icon = btn.icon || ''
-    } else if (btn.show === 'link') {
-      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
-      icon = ''
+    if (btn.show === 'link') {
+      label = <span>{name || btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
     } else if (btn.show === 'icon') {
-      icon = btn.icon || ''
-    } else if (!btn.$toolbtn) {
-      icon = btn.icon || ''
-      label = btn.label
-      className = 'mk-btn mk-' + (btn.class || 'unset')
+      label = !loading ? <MkIcon type={btn.icon} /> : null
+    } else if (btn.$toolbtn) {
+      label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{loadingNumber && !loadingTotal ? `(${loadingNumber})` : ''}{btn.label}</span>
     } else {
-      type = ''
-      icon = btn.icon || ''
-      label = btn.label
-      className = 'mk-btn mk-' + (btn.class || 'unset')
+      label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{name || btn.label}</span>
     }
 
-    if (loadingNumber && btn.progress !== 'progressbar' && btn.$toolbtn && (!btn.show || btn.show === 'button')) {
-      label = (loadingNumber ? `(${loadingNumber})` : '') + btn.label
+    let BTN = <Button
+      type="link"
+      id={'button' + btn.uuid}
+      title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
+      loading={loading}
+      disabled={disabled}
+      style={btn.style}
+      className={btn.hover || ''}
+      onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
+    >{label}</Button>
+
+    if (btn.hoverTitle) {
+      BTN = <Popover mouseLeaveDelay={0.3} mouseEnterDelay={0.3} content={btn.hoverTitle} trigger="hover">
+        {BTN}
+      </Popover>
     }
 
     return <>
-      <Button
-        type={type}
-        icon={icon}
-        id={'button' + btn.uuid}
-        title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
-        loading={loading}
-        disabled={disabled}
-        style={btn.style}
-        className={className}
-        onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
-      >{label}</Button>
+      {BTN}
       <span onClick={(e) => {e.stopPropagation()}}>{this.getModels()}</span>
       {loadingTotal ? <Progress className="mk-button-progress" percent={(loadingTotal - loadingNumber) / loadingTotal * 100} size="small" showInfo={false} /> : null}
     </>

--
Gitblit v1.8.0