king
2024-06-21 2bccb9ec7bdefe23292a22bc153463cfa1479a49
src/tabviews/zshare/actionList/normalbutton/index.jsx
@@ -44,7 +44,8 @@
    hidden: false,
    autoMatic: false,
    check: false,
    count: 0
    count: 0,
    dict: window.GLOB.dict
  }
  moduleParams = null
@@ -204,9 +205,9 @@
  /**
   * @description 触发按钮操作
   */
  actionTrigger = (triggerId, record, type, callback) => {
    const { btn, selectedData } = this.props
    const { loading, disabled } = this.state
  actionTrigger = (triggerId, record, type, lid, callback) => {
    const { btn, selectedData, LID } = this.props
    const { loading, disabled, dict } = this.state
    if (type === 'preButton') {
      if (btn.uuid !== triggerId) return
@@ -219,7 +220,7 @@
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
    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'})
@@ -242,7 +243,9 @@
    } else if (btn.OpenType === 'prompt') {
      this.setState({loading: true})
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(data, resolve)
@@ -319,7 +322,7 @@
  preTrigger = (callback) => {
    const { btn, selectedData } = this.props
    const { loading, disabled } = this.state
    const { loading, disabled, dict } = this.state
    if (loading || disabled) {
      callback()
@@ -352,7 +355,9 @@
    } else if (btn.OpenType === 'prompt') {
      this.setState({loading: true})
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btn.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(data, resolve)
@@ -402,11 +407,12 @@
  checkBtnData = (data) => {
    const { BID, btn, setting } = this.props
    const { dict } = this.state
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return false
@@ -414,7 +420,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return false
@@ -422,42 +428,17 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        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
      }
    } else if (btn.intertype === 'custom' && window.GLOB.systemType === 'production' && !btn.proInterface) {
      notification.warning({
        top: 92,
        message: dict['no_prod_link'] || '尚未设置正式系统接口地址!',
        duration: 5
      })
      return false
    }
    return true
@@ -1081,7 +1062,7 @@
    if (times > 50) {
      notification.warning({
        top: 92,
        message: '前置按钮加载失败!',
        message: window.GLOB.dict['pre_btn_failed'] || '前置按钮加载失败!',
        duration: 5
      })
      this.setState({loading: false})
@@ -1093,7 +1074,7 @@
    let node = document.getElementById('button' + btnId)
    if (node) {
      MKEmitter.emit('triggerBtnId', btnId, null, 'preButton', (res) => {
      MKEmitter.emit('triggerBtnId', btnId, null, 'preButton', null, (res) => {
        if (!res) {
          this.setState({loading: false})
          resolve()
@@ -1119,7 +1100,7 @@
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: window.GLOB.dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      _resolve()
@@ -1134,6 +1115,12 @@
        if (btn.returnValue === 'true') {
          params = params.map(item => {
            item.script_type = 'Y'
            return item
          })
        }
        if (btn.database === 'sso' && window.GLOB.mainSystemApi) {
          params = params.map(item => {
            item.rduri = window.GLOB.mainSystemApi
            return item
          })
        }
@@ -1638,11 +1625,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 => {
@@ -1725,6 +1713,7 @@
      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') { // 数据权限
@@ -1838,8 +1827,10 @@
        }
        const _this = this
        confirm({
          title: '请确认',
          title: window.GLOB.dict['exec_sure'] || '请确认',
          content: msg,
          okText: window.GLOB.dict['ok'] || '确定',
          cancelText: window.GLOB.dict['cancel'] || '取消',
          onOk() {
            return new Promise(resolve => {
              Api.genericInterface(unCheckParam).then(result => {
@@ -2236,7 +2227,7 @@
   */
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { autoMatic } = this.state
    const { autoMatic, dict } = this.state
    if (btn.resetForms) {
      let data = {}
@@ -2271,6 +2262,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(/<<.*>>/)
@@ -2286,7 +2288,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, '')
    }
@@ -2306,20 +2309,21 @@
      if (btn.formType !== 'counter' || res.message) {
        notification.success({
          top: 92,
          message: res.message || '执行成功!',
          message: res.message || dict['exc_success'] || '执行成功!',
          duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
        })
      }
    } else if (res.ErrCode === 'Y') { // 执行成功
      let msg = res.message || '执行成功!'
      let msg = res.message || dict['exc_success'] || '执行成功!'
      if (/\n|\r/.test(msg)) {
        msg = msg.replace(/\n|\r/ig, '<br/>')
        msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
      }
      Modal.success({
        title: msg,
        okText: dict['got_it'] || '知道了',
        onOk: () => {
          this.successContinue(sign, id)
          this.successContinue(sign, id, res, focusField)
        }
      })
      return
@@ -2327,12 +2331,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: '',
@@ -2351,9 +2359,9 @@
      tabId = btn.refreshTab[btn.refreshTab.length - 1]
    }
    if (btn.formCache === 'clear') { // 清除表单缓存
      window.GLOB.CacheMap = new Map()
    }
    // if (btn.formCache === 'clear') { // 清除表单缓存
    //   window.GLOB.CacheMap = new Map()
    // }
    if (tabId && btn.$MenuID === tabId) { // 刷新当前菜单时,停止其他操作
      MKEmitter.emit('reloadMenuView', tabId, 'table')
@@ -2434,6 +2442,34 @@
    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: window.GLOB.dict['no_prod_link'] || '尚未设置正式系统链接地址!',
            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)
    }
  }
@@ -2567,9 +2603,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'
        }
@@ -2934,7 +2970,7 @@
   */
  execError = (res = {}) => {
    const { btn } = this.props
    const { autoMatic } = this.state
    const { autoMatic, dict } = this.state
    if (this.preCallback) {
      this.setState({
@@ -2946,7 +2982,7 @@
    } else if (autoMatic) {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: 10
      })
@@ -2986,13 +3022,14 @@
    }
    if (res.ErrCode === 'E') {
      let msg = res.message || '执行失败!'
      let msg = res.message || dict['exc_fail'] || '执行失败!'
      if (/\n|\r/.test(msg)) {
        msg = msg.replace(/\n|\r/ig, '<br/>')
        msg = <span dangerouslySetInnerHTML={{__html: msg}}></span>
      }
      Modal.error({
        title: msg,
        okText: dict['got_it'] || '知道了',
        onOk: () => {
          this.errorContinue(sign)
        }
@@ -3001,18 +3038,18 @@
    } else if (res.ErrCode === 'N') {
      notification.error({
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 10
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || '执行失败!',
        message: res.message || dict['exc_fail'] || '执行失败!',
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || '执行失败!')
      message.error(res.message || dict['exc_fail'] || '执行失败!')
    } else if (res.ErrCode === '-2') {
      this.setState({
        loadingNumber: '',
@@ -3049,8 +3086,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
@@ -3205,8 +3281,8 @@
  }
  modelconfirm = () => {
    const { btn, BID } = this.props
    const { btnconfig, selines } = this.state
    const { BID } = this.props
    const { btnconfig, selines, dict } = this.state
    let _this = this
    let result = []
@@ -3350,7 +3426,9 @@
      this.execSubmit(selines, () => {}, result)
    } else {
      confirm({
        title: btn.tipTitle || '确定要执行吗?',
        title: btnconfig.setting.tipTitle || dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          return new Promise(resolve => {
            _this.execSubmit(selines, resolve, result)
@@ -3369,7 +3447,7 @@
   */
  getModels = () => {
    const { BID, btn, BData } = this.props
    const { btnconfig, visible } = this.state
    const { btnconfig, visible, dict } = this.state
    if (!btnconfig || !btnconfig.setting) return null
@@ -3405,10 +3483,10 @@
          />
          <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' ? '取消' : '关闭'}
              {btnconfig.setting.formType !== 'check' ? dict['cancel'] || '取消' : dict['close'] || '关闭'}
            </Button>
            {btnconfig.setting.formType !== 'check' ? <Button onClick={this.handleOk} loading={this.state.confirmLoading} type="primary">
              确定
              {dict['ok'] || '确定'}
            </Button> : null}
          </div>
        </Drawer>
@@ -3436,6 +3514,8 @@
          wrapClassName={'action-modal' + (btnconfig.setting.moveable === 'true' ? ' moveable-modal modal-' + btn.uuid : '')}
          visible={visible}
          width={width}
          okText={dict['ok'] || '确定'}
          cancelText={dict['cancel'] || '取消'}
          onOk={this.handleOk}
          maskStyle={btnconfig.setting.moveable === 'true' ?  {backgroundColor: 'rgba(0, 0, 0, 0.15)'} : null}
          confirmLoading={this.state.confirmLoading}
@@ -3500,7 +3580,7 @@
  changeLineCount = (count) => {
    const { btn, selectedData } = this.props
    const { disabled } = this.state
    const { disabled, dict } = this.state
    if (disabled) return
@@ -3510,7 +3590,7 @@
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
@@ -3518,7 +3598,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -3567,7 +3647,7 @@
      loading={loading}
      disabled={disabled}
      style={btn.style}
      className={btn.$toolbtn ? (btn.hover || '') : ''}
      className={btn.hover || ''}
      onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
    >{label}</Button>