king
2023-11-14 169f6cd29a0d3add4fe2cf35c3579b45fa83c0d4
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -47,6 +47,7 @@
  }
  moduleParams = null
  preCallback = null
  UNSAFE_componentWillMount () {
    const { btn, selectedData, BData, disabled } = this.props
@@ -180,33 +181,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 +199,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, callback) => {
    const { btn, selectedData } = 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 && !is(fromJS(selectedData || []), fromJS(record))) 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: '尚未设置正式系统接口地址!',
          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 +238,6 @@
      this.setState({}, () => {
        MKEmitter.emit('mkFormSubmit', btn.uuid)
      })
      return
    } else if (btn.OpenType === 'prompt') {
      this.setState({loading: true})
      confirm({
@@ -410,10 +308,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: '尚未设置正式系统接口地址!',
          duration: 5
        })
        return false
      }
    }
    return true
  }
  getSystemParam = (data, formdata, retmsg) => {
@@ -441,20 +487,14 @@
        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'
          }
        }
        if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
          param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
        } else {
          param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
        }
        param.exec_type = 'y' // 后台解码
@@ -483,20 +523,14 @@
          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'
            }
          }
          if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
            param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
          } else {
            param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
          }
          param.exec_type = 'y' // 后台解码
@@ -515,20 +549,14 @@
          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'
            }
          }
          if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
            param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
          } else {
            param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
          }
          param.exec_type = 'y' // 后台解码
@@ -587,20 +615,14 @@
          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'
            }
          }
          if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
            param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
          } else {
            param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
          }
          param.exec_type = 'y' // 后台解码
@@ -633,20 +655,14 @@
            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'
              }
            }
            if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
              param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
            } else {
              param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
            }
            param.exec_type = 'y' // 后台解码
@@ -665,20 +681,14 @@
            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'
              }
            }
            if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
              param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
            } else {
              param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
            }
            param.exec_type = 'y' // 后台解码
@@ -740,6 +750,11 @@
      if (this.props.BID) {
        param.BID = this.props.BID
      }
      if (btn.recordUser === 'true') {
        param.username = sessionStorage.getItem('User_Name') || ''
        param.fullname = sessionStorage.getItem('Full_Name') || ''
      }
      
      let primaryId = ''
@@ -764,7 +779,7 @@
      }
      if (retmsg) {
        param.$callbacksql = this.getSysDeclareSql(btn, formdata, data[0], columns, primaryId, this.props.BID)
        param.$callbacksql = this.getSysDeclareSql(btn, formdata, data[0], columns, this.props.BID)
      }
      _params.push(param)
@@ -776,6 +791,11 @@
        if (this.props.BID) {
          param.BID = this.props.BID
        }
        if (btn.recordUser === 'true') {
          param.username = sessionStorage.getItem('User_Name') || ''
          param.fullname = sessionStorage.getItem('Full_Name') || ''
        }
        let primaryId = setting.primaryKey ? cell[setting.primaryKey] || '' : ''
@@ -809,7 +829,7 @@
        }
        if (retmsg) {
          param.$callbacksql = this.getSysDeclareSql(btn, formdata, cell, columns, primaryId, this.props.BID)
          param.$callbacksql = this.getSysDeclareSql(btn, formdata, cell, columns, this.props.BID)
        }
        return param
@@ -822,7 +842,7 @@
  /**
   * @description 获取回调脚本的字段定义
   */
  getSysDeclareSql = (btn, formdata, data, columns, primaryId, BID = '') => {
  getSysDeclareSql = (btn, formdata, data, columns, BID = '') => {
    let datavars = {}                 // 声明的变量,表单及显示列
    // 需要声明的变量集
    let _vars = ['tbid', 'errorcode', 'retmsg', 'billcode', 'bvoucher', 'fibvoucherdate', 'fiyear', 'username', 'fullname', 'modulardetailcode', 'roleid', 'mk_departmentcode', 'mk_organization', 'mk_user_type', 'mk_nation', 'mk_province', 'mk_city', 'mk_district', 'mk_address', 'mk_deleted', 'bid']
@@ -866,7 +886,7 @@
      if (!_vars.includes(_key)) {
        _vars.push(_key)
  
        if (form.fieldlen && form.fieldlen > 2048) {
        if (form.fieldlen && form.fieldlen > 4000) {
          form.fieldlen = 'max'
        }
  
@@ -920,7 +940,7 @@
          if (col.datatype) {
            _declarefields.push(`@${_key} ${col.datatype}`)
          } else {
            if (col.fieldlength && col.fieldlength > 2048) {
            if (col.fieldlength && col.fieldlength > 4000) {
              col.fieldlength = 'max'
            }
  
@@ -991,41 +1011,98 @@
        `
    }
    _sql = _sql.replace(/@ID@/ig, `'${primaryId || ''}'`)
    _sql = _sql.replace(/@BID@/ig, `'${BID}'`)
    _sql = _sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
    _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(/@typename@/ig, `'admin'`)
    if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
      _sql = _sql.replace(/@datam@/ig, '\'Y\'')
    } else {
      _sql = _sql.replace(/@datam@/ig, '\'\'')
    }
    return _sql
  }
  /**
   * @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', (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)
    }
  }
@@ -1185,6 +1262,8 @@
   * @description 自定义请求循环执行
   */
  customLoopRequest = (params, _resolve) => {
    const { setting, btn } = this.props
    let param = params.shift()
    this.setState({
@@ -1196,6 +1275,10 @@
      ID: param.ID || '',
      callbacksql: param.$callbacksql || '',
      mk_api_key: ''
    }
    if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
      record.ID = param[setting.primaryKey]
    }
    delete param.$callbacksql
@@ -1226,7 +1309,13 @@
            if (Array.isArray(res.mk_ex_data) && res.mk_ex_data.length > 0) {
              let pices = res.mk_ex_data.map(item => {
                item.$pice = true
                item.$record = record
                item.$record = {...record}
                if (item.hasOwnProperty('mk_api_key')) {
                  item.$record.mk_api_key = item.mk_api_key || record.mk_api_key || ''
                  delete item.mk_api_key
                }
                return item
              })
              params = [...pices, ...params]
@@ -1422,7 +1511,6 @@
        result.status = false
        result.message = result.$ErrMesg
        result.ErrCode = 'E'
        result.ErrMesg = result.$ErrMesg
      } else {
        result.status = result.status !== false
        result.ErrCode = result.ErrCode || '-1'
@@ -1471,7 +1559,22 @@
  getCallBackSql = (result, record) => {
    const { btn } = this.props
    let lines = []
    let pre = btn.callbackType === 'script' ? '@' : ''
    let pre = ''
    let tables = []
    if (btn.callbackType === 'script') { // 使用自定义脚本
      pre = '@'
      btn.verify.cbScripts.forEach(script => {
        if (script.status === 'false') return
        if (/\s#[a-z0-9_]+(\s|\()/ig.test(script.sql)) {
          tables.push(...script.sql.match(/\s#[a-z0-9_]+(\s|\()/ig))
        }
      })
      tables = tables.map(tb => tb.replace(/\s|\(/g, ''))
    }
    let errSql = ''
    if (result.$ErrCode === 'E') {
@@ -1488,6 +1591,11 @@
      let vals = []
      let subObjs = []
      let id = Utils.getuuid()
      let tbName = pre + tb
      if (tables.includes('#' + tb)) {
        tbName = '#' + tb
      }
      delete obj.$$key
@@ -1516,9 +1624,11 @@
        }
      })
      keys = keys.join(',')
      lines.push({
        table: tb,
        insert: `Insert into ${pre}${tb} (${keys.join(',')},[mk_level],[mk_id],[mk_bid])`,
        table: md5(tb + keys),
        insert: `Insert into ${tbName} (${keys},[mk_level],[mk_id],[mk_bid])`,
        select: `Select ${vals.join(',')},'${level}','${id}','${bid}'`
      })
@@ -1550,7 +1660,7 @@
      param.func = 'sPC_TableData_InUpDe'
      
      if (record.BID) {
        param.BID = this.props.BID
        param.BID = record.BID
      }
      if (record.ID) {
        param.ID = record.ID
@@ -1580,6 +1690,8 @@
      if (btn.output) {
        _backCustomScript += `
          aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg,${btn.output} as mk_b_id`
        param.key_back_type = 'Y'
      } else {
        _backCustomScript += `
          aaa: select @ErrorCode as ErrorCode,@retmsg as retmsg`
@@ -1595,26 +1707,25 @@
      sql = sql + _backCustomScript
      sql = sql.replace(/@ID@/ig, `'${record.ID || ''}'`)
      sql = sql.replace(/@BID@/ig, `'${this.props.BID || ''}'`)
      sql = sql.replace(/@BID@/ig, `'${record.BID || ''}'`)
      sql = sql.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
      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(/@typename@/ig, `'admin'`)
      if (window.GLOB.debugger === true || (window.debugger === true && window.GLOB.sysType !== 'cloud')) {
      if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
        sql = sql.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
      } else {
        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
      if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
        param.LText = param.LText.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
      } else {
        param.LText = param.LText.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
      }
      param.LText = param.LText.replace(/\$check@|@check\$/ig, '')
      param.exec_type = 'y' // 后台解码
      param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
      param.secretkey = Utils.encrypt('', param.timestamp)
@@ -1638,7 +1749,7 @@
        Sort: index + 1
      }))
      if (window.GLOB.debugger === true || (window.debugger === true && window.GLOB.sysType !== 'cloud')) {
      if (window.GLOB.debugger === true) {
        let sql = [...lineMap.values()].map(item => (`
          ${item.insert}
          ${item.selects.join(` union all
@@ -1756,7 +1867,7 @@
   * @description 外部请求循环执行
   */
  outerLoopRequest = (params, _resolve) => {
    if (!params && params.length === 0) return
    const { setting, btn } = this.props
    let param = params.shift()
@@ -1768,6 +1879,10 @@
      BID: param.BID || '',
      ID: param.ID || '',
      callbacksql: param.$callbacksql || ''
    }
    if (!record.ID && btn.Ot !== 'notRequired' && param[setting.primaryKey]) {
      record.ID = param[setting.primaryKey]
    }
    delete param.$callbacksql
@@ -1823,58 +1938,62 @@
    if (btn.outerFunc) {
      result.func = btn.outerFunc
    }
    if (window.GLOB.mkHS) {
      if (btn.outerFunc === 's_app_version_upt') { // special 更新版本号时访问sso
        if (window.GLOB.mainSystemApi) {
          result.rduri = window.GLOB.mainSystemApi
        }
      } else if (btn.sysInterface === 'true' && window.GLOB.cloudServiceApi) {
        result.rduri = window.GLOB.cloudServiceApi
        result.userid = sessionStorage.getItem('CloudUserID') || ''
        result.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
      } else if (btn.sysInterface !== 'true') {
        if (window.GLOB.systemType === 'production' && btn.proInterface) {
          result.rduri = btn.proInterface
        } else {
          result.rduri = btn.interface
    if (btn.sysInterface === 'true') {
      if (window.GLOB.mainSystemApi) {
        result.rduri = window.GLOB.mainSystemApi
      }
    } else if (btn.sysInterface === 'external') {
      if (window.GLOB.systemType === 'production') {
        result.$token = btn.exProInterface || ''
      } else {
        result.$token = btn.exInterface || ''
      }
      ver_token = true
    } else {
      if (window.GLOB.systemType === 'production' && btn.proInterface) {
        result.rduri = btn.proInterface
      } else {
        result.rduri = btn.interface
      }
      if (/function:/i.test(result.rduri)) {
        let rduri = result.rduri
        try {
          rduri = rduri.replace(/function:/i, '')
          // eslint-disable-next-line
          let func = new Function(rduri)
          result.rduri = func()
        } catch (e) {
          console.warn(e)
        }
      }
      // special 函数 s_sDataDictb_TBBack 云端验证
      if (result.func === 's_sDataDictb_TBBack' && result.LTextOut) {
      let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
      if (result.rduri.indexOf(host) === -1 && /\/dostars/.test(result.rduri)) {
        result.$login = true
      }
    }
    if (window.GLOB.mkHS) {
      if (result.func === 's_app_version_upt') { // special 更新版本号时访问sso
        delete result.rduri
        if (window.GLOB.localSystemApi) {
          result.rduri = window.GLOB.localSystemApi
        }
        result.userid = sessionStorage.getItem('LocalUserID') || ''
        result.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
      } else if (result.func === 's_sDataDictb_TBBack' && result.LTextOut) { // special 函数 s_sDataDictb_TBBack 云端验证
        result.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
        result.secretkey = Utils.encrypt(result.LTextOut, result.timestamp)
        result.open_key = Utils.encryptOpenKey(result.secretkey, result.timestamp)
      }
    } else {
      if (btn.sysInterface === 'true') {
        if (window.GLOB.mainSystemApi) {
          result.rduri = window.GLOB.mainSystemApi
        }
      } else if (btn.sysInterface === 'external') {
        if (window.GLOB.systemType === 'production') {
          result.$token = btn.exProInterface || ''
        } else {
          result.$token = btn.exInterface || ''
        }
        ver_token = true
      } else {
        if (window.GLOB.systemType === 'production' && btn.proInterface) {
          result.rduri = btn.proInterface
        } else {
          result.rduri = btn.interface
        }
        let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
        if (result.rduri.indexOf(host) === -1 && /\/dostars/.test(result.rduri)) {
          result.$login = true
        }
      }
    }
    Api.genericInterface(result).then(res => {
      if (!res) return // LoginError时中断请求
      if (ver_token && res.ErrMesg === 'token_error') {
      if (ver_token && res.ErrCode === 'token_error') {
        res.ErrCode = 'E'
        this.execError(res)
        return
      }
@@ -1995,10 +2114,12 @@
      callParam.open_key = Utils.encryptOpenKey(callParam.secretkey, callParam.timestamp)
    }
    if (callParam.UpType === 'SSO' && window.GLOB.mainSystemApi) {
      ssoParam = fromJS(callParam).toJS()
    callParam.userid = sessionStorage.getItem('LocalUserID') || ''
    callParam.LoginUID = sessionStorage.getItem('LocalLoginUID') || ''
      ssoParam.rduri = window.GLOB.mainSystemApi
    if (callParam.UpType === 'SSO' && window.GLOB.localSystemApi) {
      ssoParam = fromJS(callParam).toJS()
      ssoParam.rduri = window.GLOB.localSystemApi
      delete ssoParam.UpType
    } else {
@@ -2055,7 +2176,18 @@
    const { btn } = this.props
    const { autoMatic } = this.state
    if (autoMatic) {
    if (btn.resetForm) {
      MKEmitter.emit('mkFC', 'reset', btn.resetForm)
    }
    if (this.preCallback) {
      this.setState({
        loading: false,
        visible: false
      })
      this.preCallback(res)
      return
    } else if (autoMatic) {
      this.setState({
        loading: false,
        visible: false
@@ -2166,9 +2298,15 @@
      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)
      }
@@ -2191,22 +2329,22 @@
    if (btn.openmenu && Array.isArray(btn.openmenu) && btn.openmenu.length > 0 && sign !== '@no_target_menu@') {
      let menuId = btn.openmenu.slice(-1)[0]
      let newtab = window.GLOB.mkThdMenus.filter(m => m.MenuID === menuId)[0]
      let menu = null
      if (!newtab && btn.MenuID) {
        newtab = {
      if (window.GLOB.mkThdMenus.has(menuId)) {
        menu = {...window.GLOB.mkThdMenus.get(menuId), param: { $BID: id }}
      } else if (btn.MenuID) {
        menu = {
          MenuID: btn.MenuID,
          MenuName: btn.MenuName,
          MenuNo: btn.MenuNo,
          type: btn.tabType
          type: btn.tabType,
          param: { $BID: id }
        }
      } else if (!newtab) {
        return
      }
      newtab = {...newtab, param: { $BID: id }}
      MKEmitter.emit('modifyTabs', newtab, true)
      if (menu) {
        MKEmitter.emit('modifyTabs', menu, true)
      }
    }
    if (btn.execSuccess === 'popclose' && btn.$tabId) { // 标签关闭刷新
@@ -2256,7 +2394,7 @@
    if (!id) return
    setTimeout(() => {
      window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: id, tempId: btn.verify.printTempId, dataM: sessionStorage.getItem('dataM') }))))
      window.open('#/billprint/' + window.btoa(window.encodeURIComponent(JSON.stringify({ id: id, tempId: btn.verify.printTempId, pageId: btn.$MenuID || '', dataM: sessionStorage.getItem('dataM') }))))
    }, 500)
  }
@@ -2550,7 +2688,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 || '执行失败!',
@@ -2800,6 +2945,8 @@
      visible: false,
      confirmLoading: false
    })
    this.preCallback && this.preCallback()
  }
  modelconfirm = () => {
@@ -2878,7 +3025,19 @@
        _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 {
            _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 || ''))
@@ -2929,6 +3088,7 @@
          })
        },
        onCancel() {
          _this.preCallback && _this.preCallback()
          _this.setState({ loading: false })
        }
      })
@@ -2992,6 +3152,13 @@
        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 (
        <Modal
          title={title}