From bd1dfc9e6c9b9f8076ca2783ce598e0936b4c664 Mon Sep 17 00:00:00 2001
From: king <18310653075@163.com>
Date: 星期三, 22 十二月 2021 14:36:03 +0800
Subject: [PATCH] 2021-12-22

---
 src/tabviews/zshare/actionList/normalbutton/index.jsx |  739 ++++++++++++++++++++++++++++++++++++++++----------------
 1 files changed, 523 insertions(+), 216 deletions(-)

diff --git a/src/tabviews/zshare/actionList/normalbutton/index.jsx b/src/tabviews/zshare/actionList/normalbutton/index.jsx
index 7c27ad4..ba6f77f 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 {connect} from 'react-redux'
 import { is, fromJS } from 'immutable'
-import { Button, Modal, notification, message } from 'antd'
+import { Button, Modal, notification, message, Drawer } from 'antd'
 
 import Api from '@/api'
 import Utils, { getSysDefaultSql } from '@/utils/utils.js'
@@ -11,8 +11,10 @@
 import zhCN from '@/locales/zh-CN/main.js'
 import enUS from '@/locales/en-US/main.js'
 import asyncSpinComponent from '@/utils/asyncSpinComponent'
+import { updateForm } from '@/utils/utils-update.js'
 import MKEmitter from '@/utils/events.js'
-import './index.scss'
+import MkIcon from '@/components/mk-icon'
+// import './index.scss'
 
 const MutilForm = asyncSpinComponent(() => import('@/tabviews/zshare/mutilform'))
 const { confirm } = Modal
@@ -36,12 +38,32 @@
     dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
     visible: false,
     formdata: null,
-    tabledata: null,
+    selines: null,
     confirmLoading: false,
     btnconfig: null,
     loading: false,
     loadingNumber: '',
-    checkParam: null
+    disabled: false,
+    hidden: false,
+    checkParam: null,
+    autoMatic: false
+  }
+
+  moduleParams = null
+
+  UNSAFE_componentWillMount () {
+    const { btn, selectedData } = this.props
+    let disabled = false
+
+    if (btn.controlField && selectedData && selectedData.length > 0) { // 琛ㄦ牸涓寜閽殣钘忔帶鍒�
+      selectedData.forEach(item => {
+        let s = item[btn.controlField] + ''
+        if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
+          disabled = true
+        }
+      })
+      this.setState({disabled, hidden: disabled && btn.control === 'hidden'})
+    }
   }
 
   shouldComponentUpdate (nextProps, nextState) {
@@ -49,10 +71,34 @@
   }
 
   componentDidMount () {
-    const { position } = this.props
+    const { position, btn } = this.props
 
-    if (position === 'toolbar') {
-      MKEmitter.addListener('triggerBtnId', this.actionTrigger)
+    MKEmitter.addListener('triggerBtnId', this.actionTrigger)
+    if (position === 'form') {
+      MKEmitter.addListener('triggerFormSubmit', this.actionSubmit)
+    }
+    MKEmitter.addListener('returnModuleParam', this.resetModuleParam)
+
+    if (btn.autoMatic) {
+      MKEmitter.addListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
+    }
+  }
+
+  UNSAFE_componentWillReceiveProps (nextProps) {
+    const { btn, selectedData } = this.props
+
+    if (btn.controlField && !is(fromJS(nextProps.selectedData || []), fromJS(selectedData || []))) {
+      let disabled = false
+
+      if (nextProps.selectedData && nextProps.selectedData.length > 0) { // 琛ㄦ牸涓寜閽殣钘忔帶鍒�
+        nextProps.selectedData.forEach(item => {
+          let s = item[btn.controlField] + ''
+          if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
+            disabled = true
+          }
+        })
+      }
+      this.setState({disabled, hidden: disabled && btn.control === 'hidden'})
     }
   }
 
@@ -61,41 +107,71 @@
       return
     }
     MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
+    MKEmitter.removeListener('triggerFormSubmit', this.actionSubmit)
+    MKEmitter.removeListener('returnModuleParam', this.resetModuleParam)
+    MKEmitter.removeListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
+  }
+
+  triggerBtnPopSubmit = (id) => {
+    const { btn } = this.props
+
+    if (btn.uuid !== id) return
+
+    this.handleOk()
+  }
+
+  actionSubmit = (res) => {
+    const { btn } = this.props
+
+    if (btn.uuid !== res.menuId) return
+
+    this.setState({ loading: true })
+
+    this.execSubmit(this.state.selines, () => {}, res.form)
+  }
+
+  resetModuleParam = (menuId, btnId, param) => {
+    const { btn } = this.props
+    
+    if (btn.$menuId !== menuId || btn.uuid !== btnId || !param) return
+
+    this.moduleParams = param
   }
 
   /**
    * @description 鎸夐挳鐘舵�佹敼鍙�
    */
-  updateStatus = (type) => {
-    if (type === 'start') {
-      this.setState({
-        loading: true
-      })
-    } else if (type === 'over') {
-      this.setState({
-        loading: false,
-        visible: false
-      })
-    }
+  updateStatus = () => {
+    this.setState({
+      loading: false,
+      visible: false,
+      confirmLoading: false
+    })
   }
   
   /**
    * @description 瑙﹀彂鎸夐挳鎿嶄綔
    */
-  actionTrigger = (triggerId, record) => {
-    const { setting, Tab, BID, btn, selectedData } = this.props
-    const { loading } = this.state
+  actionTrigger = (triggerId, record, type) => {
+    const { Tab, BID, btn, selectedData, setting } = this.props
+    const { loading, disabled } = this.state
 
-    if ((triggerId && btn.uuid !== triggerId) || loading) return
+    if ((triggerId && btn.uuid !== triggerId) || loading || disabled) return
 
-    if (Tab && Tab.supMenu && !BID) {
+    if (((Tab && Tab.supMenu) || setting.supModule) && !BID) {
       notification.warning({
         top: 92,
         message: '闇�瑕佷笂绾т富閿�硷紒',
         duration: 5
       })
       return
+    } else if (type === 'linkbtn' && selectedData && selectedData.length === 1) {
+      if (record[0].$Index !== selectedData[0].$Index) {
+        return
+      }
     }
+
+    this.setState({autoMatic: type === 'autoMatic'})
 
     let _this = this
     let data = record || selectedData || []
@@ -113,14 +189,6 @@
       notification.warning({
         top: 92,
         message: this.state.dict['main.action.confirm.selectSingleLine'],
-        duration: 5
-      })
-      return
-    } else if (!setting.primaryKey) {
-      // 闇�瑕侀�夋嫨琛屾椂锛屾牎楠屾槸鍚﹁缃富閿�
-      notification.warning({
-        top: 92,
-        message: '鏈缃富閿紒',
         duration: 5
       })
       return
@@ -178,8 +246,15 @@
       return
     }
 
-    if (btn.OpenType === 'prompt') {
-      this.updateStatus('start')
+    this.setState({
+      selines: data
+    })
+    
+    if (btn.OpenType === 'formSubmit') {
+      MKEmitter.emit('mkFormSubmit', btn.uuid)
+      return
+    } else if (btn.OpenType === 'prompt') {
+      this.setState({loading: true})
       confirm({
         title: this.state.dict['main.action.confirm.tip'],
         onOk() {
@@ -188,22 +263,20 @@
           })
         },
         onCancel() {
-          _this.updateStatus('over')
+          _this.setState({loading: false})
         }
       })
     } else if (btn.OpenType === 'exec') {
-      this.updateStatus('start')
+      this.setState({loading: true})
       this.execSubmit(data, () => { this.setState({loading: false})})
     } else if (btn.OpenType === 'pop') {
-      this.updateStatus('start')
-
       let modal = this.state.btnconfig
       if (!modal && btn.modal) {
         modal = this.handleModelConfig(btn.modal)
       }
 
       this.setState({
-        tabledata: data,
+        loading: true,
         btnconfig: modal
       }, () => {
         this.improveAction()
@@ -236,7 +309,7 @@
       
       let primaryId = ''
 
-      if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
+      if ((btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') && setting.primaryKey) {
         let ids = data.map(d => { return d[setting.primaryKey] || ''})
         ids = ids.filter(Boolean)
         primaryId = ids.join(',')
@@ -246,11 +319,14 @@
         param.ID = primaryId
 
         if (retmsg) {
-          const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, data[0], columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+          const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, data[0], columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
           param.LText = sql
           param.$callbacksql = callbacksql
         } else {
-          param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, this.props.Tab) // 鏁版嵁婧�
+          param.LText = getSysDefaultSql(btn, setting, '', param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+          if (btn.output) {
+            param.key_back_type = 'Y'
+          }
         }
 
         if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -274,7 +350,7 @@
         }
 
         param.LText = Utils.formatOptions(param.LText)
-      } else if (btn.OpenType === 'pop') { // 琛ㄥ崟
+      } else if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit') { // 琛ㄥ崟
         if (btn.sqlType === 'insert') { // 绯荤粺鍑芥暟娣诲姞鏃讹紝鐢熸垚uuid
           primaryId = ''
 
@@ -288,11 +364,14 @@
           param.ID = primaryId || Utils.getguid()
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            if (btn.output) {
+              param.key_back_type = 'Y'
+            }
           }
           
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -320,11 +399,14 @@
           param.ID = primaryId
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, formdata, param, data[0], columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            if (btn.output) {
+              param.key_back_type = 'Y'
+            }
           }
           
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -360,6 +442,10 @@
 
       param.menuname = btn.logLabel
 
+      if (window.GLOB.probation) {
+        param.s_debug_type = 'Y'
+      }
+
       if (check_param) {
         check_param.menuname = btn.logLabel
         this.setState({checkParam: check_param})
@@ -382,11 +468,14 @@
           param.ID = primaryId
 
           if (retmsg) {
-            const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, cell, columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+            const { sql, callbacksql } = getSysDefaultSql(btn, setting, '', param, cell, columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
             param.LText = sql
             param.$callbacksql = callbacksql
           } else {
-            param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, this.props.Tab) // 鏁版嵁婧�
+            param.LText = getSysDefaultSql(btn, setting, '', param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions, Utils.getAllSearchOptions) // 鏁版嵁婧�
+            if (btn.output) {
+              param.key_back_type = 'Y'
+            }
           }
           
           if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -415,11 +504,14 @@
             param.ID = Utils.getguid()
 
             if (retmsg) {
-              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
               param.LText = sql
               param.$callbacksql = callbacksql
             } else {
-              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab) // 鏁版嵁婧�
+              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              if (btn.output) {
+                param.key_back_type = 'Y'
+              }
             }
             
             if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -438,11 +530,14 @@
             param.ID = primaryId
 
             if (retmsg) {
-              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, retmsg) // 鏁版嵁婧�
+              const { sql, callbacksql } = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, retmsg, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
               param.LText = sql
               param.$callbacksql = callbacksql
             } else {
-              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab) // 鏁版嵁婧�
+              param.LText = getSysDefaultSql(btn, setting, formdata, param, cell, columns, this.props.Tab, false, this.moduleParams, Utils.getAllSearchOptions) // 鏁版嵁婧�
+              if (btn.output) {
+                param.key_back_type = 'Y'
+              }
             }
             
             if (sessionStorage.getItem('dataM') === 'true') { // 鏁版嵁鏉冮檺
@@ -466,6 +561,9 @@
 
         if (param.func === 'sPC_TableData_InUpDe') {
           param.menuname = btn.logLabel
+          if (window.GLOB.probation) {
+            param.s_debug_type = 'Y'
+          }
         }
 
         return param
@@ -490,15 +588,17 @@
       
       let primaryId = ''
 
-      if (btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') {
+      if ((btn.Ot === 'requiredSgl' || btn.Ot === 'requiredOnce') && setting.primaryKey) {
         let ids = data.map(d => { return d[setting.primaryKey] || ''})
         ids = ids.filter(Boolean)
         primaryId = ids.join(',')
       }
 
-      param[setting.primaryKey] = primaryId // 璁剧疆涓婚敭鍙傛暟
+      if (setting.primaryKey) {
+        param[setting.primaryKey] = primaryId // 璁剧疆涓婚敭鍙傛暟
+      }
 
-      if (btn.OpenType === 'pop') { // 琛ㄥ崟
+      if (btn.OpenType === 'pop' || btn.OpenType === 'formSubmit') { // 琛ㄥ崟
         formdata.forEach(_data => {
           param[_data.key] = _data.value
         })
@@ -537,7 +637,9 @@
             param[_data.key] = _data.value
           })
         }
-        param[setting.primaryKey] = primaryId
+        if (setting.primaryKey) {
+          param[setting.primaryKey] = primaryId
+        }
 
         if (this.props.menuType === 'HS' && param.func === 's_sDataDictb_TBBack' && param.LTextOut) { // 鍑芥暟 s_sDataDictb_TBBack 浜戠楠岃瘉
           param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
@@ -557,6 +659,41 @@
    */
   execSubmit = (data, _resolve, formdata) => {
     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
+    ) {
+      MKEmitter.emit('queryModuleParam', btn.$menuId, btn.uuid)
+      setTimeout(() => {
+        if (this.moduleParams) {
+          this.execRealSubmit(data, _resolve, formdata)
+        } else {
+          setTimeout(() => {
+            this.execRealSubmit(data, _resolve, formdata)
+          }, 100)
+        }
+      }, 50)
+    } else {
+      this.execRealSubmit(data, _resolve, formdata)
+    }
+  }
+
+  execRealSubmit = (data, _resolve, formdata) => {
+    const { setting, btn, Tab, BID } = this.props
+
+    if (((Tab && Tab.supMenu) || setting.supModule) && !BID) {
+      notification.warning({
+        top: 92,
+        message: '闇�瑕佷笂绾т富閿�硷紒',
+        duration: 5
+      })
+      _resolve()
+      return
+    }
+
     if (btn.intertype === 'system' || btn.intertype === 'inner') { // 绯荤粺鎺ュ彛
       let params = []
 
@@ -567,14 +704,41 @@
       }
 
       if (params.length <= 20) {
-        let deffers = params.map(param => {
+        let deffers = params.map((param, i) => {
           return new Promise(resolve => {
-            Api.genericInterface(param).then(res => {
-              resolve(res)
-            }, () => {
-              this.updateStatus('over')
-              _resolve()
-            })
+            setTimeout(() => {
+              let _param = null
+              if (btn.preFunc) {
+                _param = fromJS(param).toJS()
+                param.func = btn.preFunc
+              }
+              Api.genericInterface(param).then(res => {
+                if (btn.preFunc && res.status && res.ErrCode !== '-1') {
+                  _param = {..._param, ...res}
+
+                  delete _param.status
+                  delete _param.ErrCode
+                  delete _param.ErrMesg
+                  delete _param.message
+
+                  setTimeout(() => {
+                    Api.genericInterface(_param).then(result => {
+                      if (!result.status) {
+                        notification.warning({
+                          top: 92,
+                          message: result.message,
+                          duration: 5
+                        })
+                      }
+                    })
+                  }, 600)
+                }
+                resolve(res)
+              }, () => {
+                this.updateStatus()
+                _resolve()
+              })
+            }, 100 * i)
           })
         })
         Promise.all(deffers).then(result => {
@@ -609,7 +773,7 @@
           param.BID = this.props.BID
         }
 
-        if (btn.OpenType === 'pop' && formdata) { // 琛ㄥ崟
+        if ((btn.OpenType === 'pop' || btn.OpenType === 'formSubmit') && formdata) { // 琛ㄥ崟
           formdata.forEach(_data => {
             param[_data.key] = _data.value
           })
@@ -726,7 +890,7 @@
                 }
                 resolve()
               }, () => {
-                _this.updateStatus('over')
+                _this.updateStatus()
                 resolve()
                 _resolve()
               })
@@ -743,7 +907,7 @@
         _resolve()
       }
     }, () => {
-      this.updateStatus('over')
+      this.updateStatus()
       _resolve()
     })
   }
@@ -778,7 +942,7 @@
     })
 
     Api.directRequest(url, btn.method, param, btn.cross).then(res => {
-      if (typeof(res) !== 'object' || Array.isArray(res)) {
+      if (typeof(res) !== 'object') {
         let error = '鏈煡鐨勮繑鍥炵粨鏋滐紒'
 
         if (typeof(res) === 'string') {
@@ -793,6 +957,9 @@
 
         this.customCallbackRequest(params, result, record, _resolve)
       } else {
+        if (Array.isArray(res)) {
+          res = { data: res }
+        }
         res.mk_api_key = mkey
         this.customCallbackRequest(params, res, record, _resolve)
       }
@@ -850,6 +1017,9 @@
             subObjs.push(val)
           }
         } else {
+          if (typeof(val) === 'string') {
+            val = val.replace(/'/ig, '"')
+          }
           keys.push(key)
           vals.push(`'${val}'`)
         }
@@ -948,6 +1118,10 @@
       param.LText = Utils.formatOptions(param.LText)
       param.menuname = btn.logLabel
 
+      if (window.GLOB.probation) {
+        param.s_debug_type = 'Y'
+      }
+
       if (this.props.menuType === 'HS') { // 鍑芥暟 sPC_TableData_InUpDe 浜戠楠岃瘉
         param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
       }
@@ -985,7 +1159,7 @@
         _resolve()
       }
     }, () => {
-      this.updateStatus('over')
+      this.updateStatus()
       _resolve()
     })
   }
@@ -1000,8 +1174,35 @@
       loadingNumber: params.length || ''
     })
 
+    let _param = null
+
+    if (btn.preFunc) {
+      _param = fromJS(param).toJS()
+      param.func = btn.preFunc
+    }
+
     Api.genericInterface(param).then(res => {
       if (res.status) {
+        if (btn.preFunc && res.ErrCode !== '-1') {
+          _param = {..._param, ...res}
+  
+          delete _param.status
+          delete _param.ErrCode
+          delete _param.ErrMesg
+          delete _param.message
+  
+          setTimeout(() => {
+            Api.genericInterface(_param).then(result => {
+              if (!result.status) {
+                notification.warning({
+                  top: 92,
+                  message: result.message,
+                  duration: 5
+                })
+              }
+            })
+          }, 600)
+        }
         if (params.length === 0) {
           this.execSuccess(res)
           _resolve()
@@ -1013,7 +1214,7 @@
         _resolve()
       }
     }, () => {
-      this.updateStatus('over')
+      this.updateStatus()
       _resolve()
     })
   }
@@ -1066,7 +1267,7 @@
             _resolve()
           }
         }, () => {
-          this.updateStatus('over')
+          this.updateStatus()
           _resolve()
         })
       } else {
@@ -1172,9 +1373,9 @@
    */
   execSuccess = (res) => {
     const { btn } = this.props
-    const { btnconfig } = this.state
+    const { btnconfig, autoMatic } = this.state
 
-    if (res && res.ErrCode === 'S') { // 鎵ц鎴愬姛
+    if ((res && res.ErrCode === 'S') || autoMatic) { // 鎵ц鎴愬姛
       notification.success({
         top: 92,
         message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
@@ -1188,7 +1389,14 @@
 
     }
     
-    if (btn.OpenType !== 'pop' || !btnconfig || btnconfig.setting.finish !== 'unclose') {
+    if (autoMatic) {
+      this.setState({
+        loading: false,
+        visible: false
+      })
+      MKEmitter.emit('autoExecOver', btn.uuid, 'success')
+      return
+    } else if (btn.OpenType !== 'pop' || !btnconfig || btnconfig.setting.finish !== 'unclose') {
       this.setState({
         loading: false,
         visible: false
@@ -1199,8 +1407,44 @@
       this.sendMessage()
     }
 
-    if (btn.execSuccess !== 'never') {
-      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn)
+    let id = ''
+    if (btn.output) {
+      id = res.mk_b_id || res[btn.output] || ''
+    }
+
+    if (btn.execSuccess === 'closetab') {
+      MKEmitter.emit('closeTabView', btn.$MenuID)
+    } else if (btn.execSuccess === 'closepoptab') {
+      MKEmitter.emit('popclose')
+    } else if (btn.execSuccess !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, id, this.state.selines)
+    }
+
+    if (btn.refreshTab && btn.refreshTab.length > 0) {
+      MKEmitter.emit('reloadMenuView', btn.refreshTab[btn.refreshTab.length - 1], 'table')
+    }
+    if (btn.switchTab && btn.switchTab.length > 0) {
+      let id = btn.switchTab[btn.switchTab.length - 1]
+      let node = document.getElementById('tab' + id)
+      node && node.click()
+    }
+
+    if (btn.openmenu && btn.openmenu.length > 0 && btn.MenuID) {
+      let newtab = {
+        MenuID: btn.MenuID,
+        MenuName: btn.MenuName,
+        MenuNo: btn.MenuNo,
+        type: btn.tabType,
+        param: {
+          $BID: id
+        }
+      }
+
+      if (['linkage_navigation', 'linkage', 'menu_board'].includes(window.GLOB.navBar)) {
+        MKEmitter.emit('modifyTabs', newtab, 'replace')
+      } else {
+        MKEmitter.emit('modifyTabs', newtab, 'plus', true)
+      }
     }
   }
 
@@ -1230,6 +1474,7 @@
       let _param = {
         templatecode: verify.noteCode, // 妯℃澘缂栫爜
         TypeCharOne: verify.noteTemp,  // N涓嶅悓鍐呭锛孻鐩稿悓鍐呭
+        ID: verify.noteId || ''        // 妯℃澘Id锛屾殏鏃舵湭浣跨敤
       }
 
       _param.submitdate = res.submitdate
@@ -1294,10 +1539,12 @@
       _param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
       _param.secretkey = Utils.encrypt(_param.LText, _param.timestamp)
 
-      _param.rduri = 'http://sso.mk9h.cn/webapi/dostar'
-      _param.appkey = window.GLOB.appkey || ''
+      _param.rduri = 'http://sso.mk9h.cn/webapi/dostars'
 
-      Api.dostarInterface(_param).then(result => {
+      _param.userid = 'bh0bapabtd45epsgra79segbch6c1ibk'
+      _param.LoginUID = 'bh0bapabtd45epsgra79segbch6c1ibk'
+
+      Api.getLocalConfig(_param).then(result => {
         if (!result.status) {
           notification.warning({
             top: 92,
@@ -1317,12 +1564,13 @@
    */
   execError = (res) => {
     const { btn } = this.props
+    const { btnconfig, autoMatic } = this.state
 
-    if (res.ErrCode === 'E') {
+    if (res.ErrCode === 'E' && !autoMatic) {
       Modal.error({
         title: res.message || res.ErrMesg,
       })
-    } else if (res.ErrCode === 'N') {
+    } else if (res.ErrCode === 'N' || autoMatic) {
       notification.error({
         top: 92,
         message: res.message || res.ErrMesg,
@@ -1337,6 +1585,16 @@
       })
     } else if (res.ErrCode === 'NM') {
       message.error(res.message || res.ErrMesg)
+    }
+
+    if (autoMatic) {
+      this.setState({
+        loading: false,
+        loadingNumber: '',
+        visible: false
+      })
+      MKEmitter.emit('autoExecOver', btn.uuid, 'error')
+      return
     }
     
     this.setState({
@@ -1373,7 +1631,7 @@
               visible: false
             })
             if (btn.execError !== 'never') {
-              MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn)
+              MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
             }
           }
         })
@@ -1386,8 +1644,14 @@
       }
     }
 
-    if (btn.execError !== 'never') {
-      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn)
+    if (btnconfig && btnconfig.setting && btnconfig.setting.errFocus) {
+      MKEmitter.emit('mkFC', 'focus', btnconfig.setting.errFocus)
+    }
+
+    if (btn.execError === 'closepoptab') {
+      MKEmitter.emit('popclose')
+    } else if (btn.execError !== 'never') {
+      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
     }
   }
 
@@ -1404,52 +1668,24 @@
 
   handleModelConfig = (config) => {
     let roleId = sessionStorage.getItem('role_id') || '' // 瑙掕壊ID
-    if (config.groups.length > 0) {
-      config.groups.forEach(group => {
-        group.sublist = group.sublist.map(cell => {
-          // 鏁版嵁婧恠ql璇彞锛岄澶勭悊锛� 鏉冮檺榛戝悕鍗曞瓧娈佃缃负闅愯棌琛ㄥ崟
-          if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
-            let _option = Utils.getSelectQueryOptions(cell)
+    config.fields = config.fields.map(cell => {
+      // 鏁版嵁婧恠ql璇彞锛岄澶勭悊锛屾潈闄愰粦鍚嶅崟瀛楁璁剧疆涓洪殣钘忚〃鍗�
+      if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
+        let _option = Utils.getSelectQueryOptions(cell)
 
-            // 澶栬仈鏁版嵁搴撴浛鎹�
-            if (window.GLOB.externalDatabase !== null) {
-              _option.sql = _option.sql.replace(/@db@/ig, window.GLOB.externalDatabase)
-            }
+        cell.data_sql = Utils.formatOptions(_option.sql)
+        cell.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
+        cell.arr_field = _option.field
+      }
 
-            cell.data_sql = Utils.formatOptions(_option.sql)
-            cell.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
-            cell.arr_field = _option.field
-          }
+      // 瀛楁鏉冮檺榛戝悕鍗�
+      if (!cell.blacklist || cell.blacklist.length === 0) return cell
+      if (cell.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
+        cell.hidden = 'true'
+      }
 
-          // 瀛楁鏉冮檺榛戝悕鍗�
-          if (!cell.blacklist || cell.blacklist.length === 0) return cell
-          if (cell.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
-            cell.hidden = 'true'
-          }
-
-          return cell
-        })
-      })
-    } else {
-      config.fields = config.fields.map(cell => {
-        // 鏁版嵁婧恠ql璇彞锛岄澶勭悊锛屾潈闄愰粦鍚嶅崟瀛楁璁剧疆涓洪殣钘忚〃鍗�
-        if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
-          let _option = Utils.getSelectQueryOptions(cell)
-
-          cell.data_sql = Utils.formatOptions(_option.sql)
-          cell.base_sql = window.btoa(window.encodeURIComponent(_option.sql))
-          cell.arr_field = _option.field
-        }
-
-        // 瀛楁鏉冮檺榛戝悕鍗�
-        if (!cell.blacklist || cell.blacklist.length === 0) return cell
-        if (cell.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
-          cell.hidden = 'true'
-        }
-
-        return cell
-      })
-    }
+      return cell
+    })
     return config
   }
 
@@ -1458,10 +1694,10 @@
    */
   improveAction = () => {
     const { btn } = this.props
-    const { btnconfig } = this.state
+    const { btnconfig, autoMatic } = this.state
 
     if (btnconfig) {
-      if (btnconfig.setting.display === 'prompt') { // 濡傛灉琛ㄥ崟浠ユ槸鍚︽灞曠ず
+      if (!autoMatic && (btnconfig.setting.display === 'prompt' || btnconfig.setting.display === 'exec')) { // 濡傛灉琛ㄥ崟浠ユ槸鍚︽灞曠ず
         this.modelconfirm()
       } else {
         this.setState({
@@ -1490,21 +1726,22 @@
             message: res.message,
             duration: 5
           })
-          this.updateStatus('over')
+          this.setState({ loading: false })
         } else if (!_LongParam || (btn.OpenType === 'pop' && _LongParam.type !== 'Modal')) {
           notification.warning({
             top: 92,
             message: '鏈幏鍙栧埌鎸夐挳閰嶇疆淇℃伅锛�',
             duration: 5
           })
-          this.updateStatus('over')
+          this.setState({ loading: false })
         } else {
+          _LongParam = updateForm(_LongParam)
           _LongParam = this.handleModelConfig(_LongParam)
           
           this.setState({
             btnconfig: _LongParam
           }, () => {
-            if (_LongParam.setting.display === 'prompt') { // 濡傛灉琛ㄥ崟浠ユ槸鍚︽灞曠ず
+            if (!autoMatic && (_LongParam.setting.display === 'prompt' || _LongParam.setting.display === 'exec')) { // 濡傛灉琛ㄥ崟浠ユ槸鍚︽灞曠ず
               this.modelconfirm()
             } else {
               this.setState({
@@ -1521,16 +1758,11 @@
    * @description 妯℃�佹锛堣〃鍗曪級锛岀‘璁�
    */
   handleOk = () => {
+    if (!this.formRef) return
     this.formRef.handleConfirm().then(res => {
-      this.setState({
-        confirmLoading: true
-      })
+      this.setState({ confirmLoading: true })
 
-      this.execSubmit(this.state.tabledata, () => {
-        this.setState({
-          confirmLoading: false
-        })
-      }, res)
+      this.execSubmit(this.state.selines, () => { this.setState({ confirmLoading: false }) }, res)
     })
   }
 
@@ -1539,27 +1771,20 @@
    */
   handleCancel = () => {
     this.setState({
+      loading: false,
       visible: false,
       confirmLoading: false
     })
-    this.updateStatus('over')
   }
 
   modelconfirm = () => {
     const { BData } = this.props
-    const { btnconfig, tabledata } = this.state
+    const { btnconfig, selines } = this.state
     let _this = this
-    let _fields = []
-    
-    if (btnconfig.groups.length > 0) {
-      btnconfig.groups.forEach(group => {
-        _fields = [..._fields, ...group.sublist]
-      })
-    } else {
-      _fields = btnconfig.fields
-    }
 
-    let result = _fields.map(item => {
+    let result = []
+    btnconfig.fields.forEach(item => {
+      if (!item.field) return
       let _readin = item.readin !== 'false'
       let _initval = item.initval
 
@@ -1569,8 +1794,8 @@
 
       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]
+      } else if (_readin && selines[0] && selines[0].hasOwnProperty(item.field)) {
+        _initval = selines[0][item.field]
       } else if (item.type === 'date' && _initval) {
         _initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD')
       } else if (item.type === 'datemonth' && _initval) {
@@ -1590,86 +1815,152 @@
         _initval = ''
       }
 
-      return {
+      let _type = item.type
+
+      if (['date', 'datemonth', 'datetime'].includes(_type) && item.declareType === 'nvarchar(50)') {
+        _type = 'text'
+      } else if (item.type === 'rate') {
+        item.rateCount = item.rateCount || 5
+        let allowHalf = item.allowHalf === 'true'
+
+        if (allowHalf) {
+          _initval = parseFloat(_initval)
+          if (_initval % 0.5 !== 0) {
+            _initval = parseInt(_initval)
+          }
+        } else {
+          _initval = parseInt(_initval)
+        }
+
+        if (isNaN(_initval) || _initval < 0) {
+          _initval = 0
+        } else if (_initval > item.rateCount) {
+          _initval = item.rateCount
+        }
+      }
+
+      result.push({
         key: item.field,
         readonly: item.readonly === 'true',
-        readin: _readin,
+        readin: item.readin !== 'false' && item.readin !== 'top',
         fieldlen: _fieldlen,
         writein: item.writein !== 'false',
-        type: item.type,
+        type: _type,
         value: _initval
-      }
+      })
     })
 
-    confirm({
-      title: this.state.dict['main.action.confirm.tip'],
-      onOk() {
-        return new Promise(resolve => {
-          _this.execSubmit(tabledata, resolve, result)
-        })
-      },
-      onCancel() {
-        _this.updateStatus('over')
-      }
-    })
+    if (btnconfig.setting.display === 'exec') {
+      this.execSubmit(selines, () => {}, result)
+    } else {
+      confirm({
+        title: this.state.dict['main.action.confirm.tip'],
+        onOk() {
+          return new Promise(resolve => {
+            _this.execSubmit(selines, resolve, result)
+          })
+        },
+        onCancel() {
+          _this.setState({ loading: false })
+        }
+      })
+    }
   }
 
   /**
    * @description 鏄剧ず妯℃�佹
    */
   getModels = () => {
-    const { setting, BID, btn } = this.props
+    const { setting, BID, btn, BData } = this.props
     const { btnconfig, visible } = this.state
 
     if (!btnconfig || !btnconfig.setting) return null
 
     let title = btnconfig.setting.title
     let width = btnconfig.setting.width + 'vw'
-    let clickouter = false
-    let container = document.body
+    let clickouter = btnconfig.setting.clickouter === 'close'
 
-    if (
-      (setting.tabType === 'main' && btnconfig.setting.container === 'tab' && this.props.ContainerId) ||
-      (btnconfig.setting.container === 'tab' && btn.ContainerId)
-    ) {
-      width = btnconfig.setting.width + '%'
-      container = () => document.getElementById(this.props.ContainerId || btn.ContainerId)
+    if (btnconfig.setting.display === 'drawer') {
+      let height = '100vh'
+      if (btnconfig.setting.placement === 'top' || btnconfig.setting.placement === 'bottom') {
+        width = '100vw'
+        height = btnconfig.setting.width + 'vh'
+      }
+      return (
+        <Drawer
+          title={title}
+          width={width}
+          height={height}
+          maskClosable={clickouter}
+          onClose={this.handleCancel}
+          visible={visible}
+          placement={btnconfig.setting.placement || 'right'}
+          bodyStyle={{ paddingBottom: 80 }}
+          destroyOnClose
+        >
+          <MutilForm
+            BID={BID}
+            dict={this.state.dict}
+            menuType={this.props.menuType}
+            action={btnconfig}
+            inputSubmit={this.handleOk}
+            data={this.state.selines[0]}
+            BData={BData}
+            wrappedComponentRef={(inst) => this.formRef = inst}
+          />
+          <div className="ant-drawer-footer" style={{ position: 'absolute', zIndex: 1, right: 0, bottom: 0, width: '100%', borderTop: '1px solid #e9e9e9', padding: '10px 16px', background: '#fff', textAlign: 'right'}}>
+            <Button onClick={this.handleCancel} style={{ marginRight: 8 }}>
+              {btnconfig.setting.formType !== 'check' ? '鍙栨秷' : '鍏抽棴'}
+            </Button>
+            {btnconfig.setting.formType !== 'check' ? <Button onClick={this.handleOk} loading={this.state.confirmLoading} type="primary">
+              纭畾
+            </Button> : null}
+          </div>
+        </Drawer>
+      )
+    } else {
+      let container = document.body
+
+      if (
+        (setting.tabType === 'main' && btnconfig.setting.container === 'tab' && this.props.ContainerId) ||
+        (btnconfig.setting.container === 'tab' && btn.ContainerId)
+      ) {
+        width = btnconfig.setting.width + '%'
+        container = () => document.getElementById(this.props.ContainerId || btn.ContainerId)
+      }
+      return (
+        <Modal
+          title={title}
+          maskClosable={clickouter}
+          getContainer={container}
+          wrapClassName='action-modal'
+          visible={visible}
+          width={width}
+          onOk={this.handleOk}
+          confirmLoading={this.state.confirmLoading}
+          onCancel={this.handleCancel}
+          destroyOnClose
+        >
+          <MutilForm
+            BID={BID}
+            dict={this.state.dict}
+            menuType={this.props.menuType}
+            action={btnconfig}
+            inputSubmit={this.handleOk}
+            data={this.state.selines[0]}
+            BData={BData}
+            wrappedComponentRef={(inst) => this.formRef = inst}
+          />
+        </Modal>
+      )
     }
-
-    if (btnconfig.setting.clickouter === 'close') {
-      clickouter = true
-    }
-
-    return (
-      <Modal
-        title={title}
-        maskClosable={clickouter}
-        getContainer={container}
-        wrapClassName='action-modal'
-        visible={visible}
-        width={width}
-        onOk={this.handleOk}
-        confirmLoading={this.state.confirmLoading}
-        onCancel={this.handleCancel}
-        destroyOnClose
-      >
-        <MutilForm
-          BID={BID}
-          dict={this.state.dict}
-          menuType={this.props.menuType}
-          action={btnconfig}
-          inputSubmit={this.handleOk}
-          data={this.state.tabledata[0]}
-          BData={this.props.BData}
-          wrappedComponentRef={(inst) => this.formRef = inst}
-        />
-      </Modal>
-    )
   }
 
   render() {
     const { btn, show, style } = this.props
-    const { loadingNumber, loading, visible } = this.state
+    const { loadingNumber, loading, disabled, hidden } = this.state
+
+    if (hidden) return null
 
     if (show === 'actionList') {
       return <div style={{display: 'inline-block'}} onClick={(e) => e.stopPropagation()}>
@@ -1677,13 +1968,14 @@
           style={style}
           icon={btn.icon}
           loading={loading}
+          disabled={disabled}
           className={'mk-btn mk-' + btn.class}
           onClick={() => {this.actionTrigger()}}
         >{(loadingNumber ? `(${loadingNumber})` : '') + btn.label}</Button>
-        {visible ? this.getModels() : null}
+        {this.getModels()}
       </div>
     } else if (show && show.indexOf('plus') > -1) {
-      return <div className="mk-btn-wrap">
+      return <div style={{display: 'inline-block'}}>
         <Button
           type="link"
           loading={loading}
@@ -1691,19 +1983,35 @@
           style={{fontSize: show.substring(4) + 'px'}}
           onClick={() => {this.actionTrigger()}}
         ></Button>
-        {visible ? this.getModels() : null}
+        {this.getModels()}
       </div>
     } else { // icon銆乼ext銆� all 鍗$墖
+      let label = ''
+      let icon = ''
+
+      if (show === 'button') {
+        label = btn.label
+        icon = btn.icon || ''
+      } else if (show === 'link') {
+        label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
+        icon = ''
+      } else if (show === 'icon') {
+        icon = btn.icon || ''
+      } else {
+        label = btn.label
+      }
+
       return <div style={{display: 'inline-block'}} onClick={(e) => e.stopPropagation()}>
         <Button
           type="link"
           title={show === 'icon' ? btn.label : ''}
           loading={loading}
-          style={btn.btnstyle || style}
-          icon={show === 'text' ? '' : (btn.icon || '')}
+          disabled={disabled}
+          style={btn.style || style}
+          icon={icon}
           onClick={() => {this.actionTrigger()}}
-        >{show === 'icon' && btn.icon ? '' : btn.label}</Button>
-        {visible ? this.getModels() : null}
+        >{label}</Button>
+        {this.getModels()}
       </div>
     }
   }
@@ -1711,7 +2019,6 @@
 
 const mapStateToProps = (state) => {
   return {
-    tabviews: state.tabviews,
     menuType: state.editLevel
   }
 }

--
Gitblit v1.8.0