king
2025-05-23 24842b40de5cd60700bf69dfd38a0332f5431e36
src/tabviews/zshare/actionList/printbutton/index.jsx
@@ -8,6 +8,7 @@
import Utils from '@/utils/utils.js'
import asyncSpinComponent from '@/utils/asyncSpinComponent'
import { updateForm } from '@/utils/utils-update.js'
import UtilsDM from '@/utils/utils-datamanage.js'
import MKEmitter from '@/utils/events.js'
import MkIcon from '@/components/mk-icon'
// import './index.scss'
@@ -37,7 +38,8 @@
    loading: false,
    disabled: false,
    hidden: false,
    autoMatic: false
    autoMatic: false,
    dict: window.GLOB.dict
  }
  UNSAFE_componentWillMount () {
@@ -130,34 +132,33 @@
  /**
   * @description 触发按钮操作
   */
  actionTrigger = (triggerId, record, type) => {
    const { BID, btn, selectedData, setting } = this.props
    const { loading, disabled } = this.state
  actionTrigger = (triggerId, record, type, lid) => {
    const { BID, btn, selectedData, setting, LID } = this.props
    const { loading, disabled, dict } = this.state
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
    if (type === 'linkbtn' && !btn.$toolbtn && LID !== lid) return
    if (setting.supModule && !BID) {
      notification.warning({
        top: 92,
        message: '需要上级主键值!',
        message: setting.supModTip || dict['sup_key_req'] || '需要上级主键值!',
        duration: 5
      })
      return
    } else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(selectedData || []), fromJS(record))) {
      return
    }
    this.setState({autoMatic: type === 'autoMatic'})
    let _this = this
    let that = this
    let data = record || selectedData || []
    if (btn.Ot !== 'notRequired' && data.length === 0) {
      // 需要选择行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择行!',
        message: dict['select_row'] || '请选择行!',
        duration: 5
      })
      return
@@ -165,21 +166,7 @@
      // 需要选择单行时,校验数据
      notification.warning({
        top: 92,
        message: '请选择单行数据!',
        duration: 5
      })
      return
    } else if (!btn.verify || !btn.verify.printMode) {
      notification.warning({
        top: 92,
        message: '请完善打印验证信息!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && (!btn.verify.setting || btn.verify.columns.length === 0)) {
      notification.warning({
        top: 92,
        message: '自定义打印数据请设置数据源!',
        message: dict['select_single_row'] || '请选择单行数据!',
        duration: 5
      })
      return
@@ -193,6 +180,7 @@
      let modal = this.state.btnconfig
      if (!modal && btn.modal) {
        modal = this.handleModelConfig(btn.modal)
        modal.uuid = btn.uuid
      }
      this.setState({
@@ -204,12 +192,14 @@
    } else if (btn.execMode === 'prompt') {
      this.setState({ loading: true })
      confirm({
        title: '确定要执行吗?',
        title: dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          _this.triggerPrint(data)
          that.triggerPrint(data)
        },
        onCancel() {
          _this.setState({ loading: false })
          that.setState({ loading: false })
        }
      })
    } else {
@@ -270,6 +260,9 @@
            Object.keys(cell).forEach(key => {
              let _key = key.toLowerCase()
              if (/^\$/.test(_key)) return
              _cell[_key] = cell[key]
            })
@@ -505,7 +498,7 @@
      if (list.length === 0) {
        notification.warning({
          top: 92,
          message: '未获取到打印数据!',
          message: window.GLOB.dict['no_data'] || '未获取到打印数据!',
          duration: 5
        })
        return false
@@ -532,7 +525,7 @@
      if (!result.ConfigParam) {
        notification.warning({
          top: 92,
          message: '未获取到打印模板信息!',
          message: window.GLOB.dict['no_print_temp'] || '未获取到打印模板信息!',
          duration: 5
        })
        this.setState({ loading: false })
@@ -564,16 +557,66 @@
  execCustomPrint = (printlist, formdata) => {
    const { btn } = this.props
    this.execSuccess({
      ErrCode: '-1',
      message: '',
      status: true
    })
    let callback = null
    let printReject = null
    let skip = false
    let send = false
    let data = fromJS({
      data: printlist,
      form: formdata
    }).toJS()
    if (!window.GLOB.errorLog) {
      printReject = (msg) => {
        if (send) return
        send = true
        data.message = msg
        window.mkInfo(JSON.stringify(data))
      }
    } else {
      printReject = (msg) => {
        if (send) return
        send = true
        data.message = msg
        let param = {
          func: 's_special_error_note_log',
          api_url: btn.logLabel,
          error_code: 507,
          error_time: moment().format('YYYY-MM-DD HH:mm:ss'),
          api_param: JSON.stringify(data)
        }
        Api.genericInterface(param)
      }
    }
    if (/callback\(\)/.test(btn.verify.printFunc)) {
      callback = () => {
        if (skip) return
        skip = true
        this.execSuccess({
          ErrCode: '-1',
          message: '',
          status: true
        })
      }
    } else {
      this.execSuccess({
        ErrCode: '-1',
        message: '',
        status: true
      })
    }
    try {
      // eslint-disable-next-line
      let func = new Function('data', 'form', 'printer', 'notification', 'Api', 'systemType', btn.verify.printFunc)
      func(printlist, formdata, btn.verify, notification, Api, window.GLOB.systemType)
      let func = new Function('data', 'form', 'printer', 'notification', 'Api', 'systemType', 'callback', 'printReject', btn.verify.printFunc)
      func(printlist, formdata, btn.verify, notification, Api, window.GLOB.systemType, callback, printReject)
      // 自定义打印示例
      // let defaultPrinter = printer.defaultPrinter || 'lackprinter'
@@ -769,18 +812,13 @@
    } catch (e) {
      console.warn(e)
      try {
        // eslint-disable-next-line
        let evalfunc = eval('(true && function (data, form, printer, notification, Api, systemType) {' + btn.verify.printFunc + '})')
        evalfunc(printlist, formdata, btn.verify, notification, Api, window.GLOB.systemType)
      } catch (error) {
        console.warn(error)
        notification.warning({
          top: 92,
          message: '自定义函数执行错误!',
          duration: 5
        })
      }
      notification.warning({
        top: 92,
        message: window.GLOB.dict['func_error'] || '自定义函数执行错误!',
        duration: 5
      })
      printReject(window.GLOB.dict['func_error'] || '自定义函数执行错误!')
    }
  }
@@ -907,6 +945,9 @@
              _param.username = sessionStorage.getItem('User_Name') || ''
              _param.fullname = sessionStorage.getItem('Full_Name') || ''
            }
            if (btn.dataM === 'true') {
              _param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
            }
  
            return _param
          })
@@ -923,7 +964,7 @@
          Promise.all(deffers).then(result => {
            let errorMsg = ''
            result.forEach(res => {
              if (!res.status) {
              if (!res.status && !errorMsg) {
                errorMsg = res
              }
            })
@@ -949,12 +990,71 @@
  getDefaultSql = (formlist, data, ID) => {
    const { BID, btn, columns } = this.props
    if (window.backend && window.GLOB.CacheData.has('sql_' + btn.uuid)) {
      let setting = {...btn.verify.setting}
      setting.interType = 'system'
      setting.uuid = btn.uuid
      let _param = UtilsDM.getQueryDataParams(setting, [], setting.order, 1, 9999, BID, ID)
      let item = window.GLOB.CacheData.get('sql_' + btn.uuid)
      _param.data[0].exps = _param.data[0].exps.filter(n => n.key !== 'mk_search')
      let formkeys = []
      formlist.forEach(form => {
        if (!item.reps.includes(form.key)) return
        formkeys.push(form.key)
        let val = form.value
        if (form.type === 'number' || form.type === 'rate') {
          if (isNaN(val) || val === '') {
            val = 0
          }
        } else if (['date', 'datemonth'].includes(form.type)) {
          val = val || '1949-10-01'
        }
        _param.data[0].exps.push({
          key: 'mk_' + form.key + '_mk',
          value: val
        })
      })
      if (data && columns && columns.length > 0) {
        let datavars = {}
        Object.keys(data).forEach(key => {
          datavars[key.toLowerCase()] = data[key]
        })
        columns.forEach(col => {
          if (!item.reps.includes(col.field) || formkeys.includes(col.field)) return
          if (!col.datatype) return
          let _key = col.field.toLowerCase()
          let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
          if (/^date/ig.test(col.datatype) && !_val) {
            _val = '1949-10-01'
          }
          _param.data[0].exps.push({
            key: 'mk_' + col.field + '_mk',
            value: _val
          })
        })
      }
      return _param
    }
    let arrFields = btn.verify.columns.map(col => col.field).join(',')
    let param = {
      func: 'sPC_Get_TableData',
      obj_name: 'data',
      exec_type: 'y',
      exec_type: window.GLOB.execType || 'y',
      arr_field: arrFields,
      default_sql: btn.verify.setting.defaultSql
    }
@@ -998,14 +1098,26 @@
      _dataresource = ''
    }
    let custompage = false
    if (/order\s+by\s+sort_id\s*$/i.test(_dataresource)) {
      custompage = true
    } else if (/@pageSize@|@orderBy@|@mk_total/i.test(_dataresource + _customScript + _tailScript)) {
      custompage = true
    }
    let isDataM = sessionStorage.getItem('dataM') === 'true'
    let regoptions = [
      { reg: /@orderBy@/ig, value: btn.verify.setting.order },
      { reg: /@pageSize@/ig, value: '9999' },
      { reg: /@pageIndex@/ig, value: '1'},
      { reg: /@ID@/ig, value: `'${ID}'`},
      { reg: /@BID@/ig, value: `'${BID || ''}'`},
      { reg: /@LoginUID@/ig, value: `'${sessionStorage.getItem('LoginUID') || ''}'`},
      { reg: /@SessionUid@/ig, value: `'${localStorage.getItem('SessionUid') || ''}'`},
      { reg: /@UserID@/ig, value: `'${sessionStorage.getItem('UserID') || ''}'`},
      { reg: /@Appkey@/ig, value: `'${window.GLOB.appkey || ''}'`},
      { reg: /@lang@/ig, value: `'${sessionStorage.getItem('lang')}'`},
      { reg: /@typename@/ig, value: `'admin'`},
      { reg: /\$@/ig, value: isDataM ? '/*' : ''},
      { reg: /@\$/ig, value: isDataM ? '*/' : ''},
@@ -1033,13 +1145,11 @@
    formlist.forEach(form => {
      let _key = form.key.toLowerCase()
      if (_vars.includes(_key)) return
      _vars.push(_key)
      if (form.type === 'number' || form.type === 'rate') {
        let val = form.value
        if (isNaN(val)) {
        if (isNaN(val) || val === '') {
          val = 0
        }
        _initvars.push(`@${_key}=${val}`)
@@ -1117,7 +1227,11 @@
    let LText = ''
    if (_dataresource) {
      LText = `/*system_query*/select ${arrFields} from (select ${arrFields} ,ROW_NUMBER() over(order by ${btn.verify.setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
      if (custompage) {
        LText = `/*system_query*/select ${arrFields} from ${_dataresource} `
      } else {
        LText = `/*system_query*/select ${arrFields} from (select ${arrFields} ,ROW_NUMBER() over(order by ${btn.verify.setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
      }
    }
    if (_customScript) {
@@ -1152,16 +1266,16 @@
    // 测试系统打印查询语句
    if (window.GLOB.debugger === true) {
      _customScript && console.info(`${btn.logLabel ? `/*${btn.logLabel} 自定义脚本*/\n` : ''}${LText ? '' : '/*不执行默认sql*/\n'}${_customScript}`)
      LText && console.info(`${btn.logLabel ? `/*${btn.logLabel} 数据源*/\n` : ''}` + LText.replace(/\n\s{8}/ig, '\n'))
      _customScript && window.mkInfo(`${btn.logLabel ? `/*${btn.logLabel} 自定义脚本*/\n` : ''}${LText ? '' : '/*不执行默认sql*/\n'}${_customScript}`)
      LText && window.mkInfo(`${btn.logLabel ? `/*${btn.logLabel} 数据源*/\n` : ''}` + LText.replace(/\n\s{8}/ig, '\n'))
    }
    if (btn.logLabel) {
      param.menuname = btn.logLabel
    }
    param.custom_script = Utils.formatOptions(_customScript)
    param.LText = Utils.formatOptions(LText)
    param.custom_script = Utils.formatOptions(_customScript, param.exec_type)
    param.LText = Utils.formatOptions(LText, param.exec_type)
    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
    param.secretkey = Utils.encrypt('', param.timestamp)
@@ -1326,7 +1440,7 @@
    let imgs = []
    if (!res.ConfigParam) {
      error = '未获取到打印模板信息!'
      error = window.GLOB.dict['no_print_temp'] || '未获取到打印模板信息!'
    } else {
      try {
        configParam = JSON.parse(window.decodeURIComponent(window.atob(res.ConfigParam)))
@@ -1427,8 +1541,13 @@
          if (item.Field) {
            fields.push(item.Field)
            // 条码二维码字段不可为空
            if (item.Type === 'qrcode' || item.Type === 'barcode') {
            if (item.Type === 'barcode') {
              nonEFields.push(item.Field)
            }
          } else if (!item.Value) {
            // 条码二维码内容不可为空
            if (item.Type === 'barcode') {
              error = '模板中条码/二维码内容不可为空!'
            }
          }
@@ -1483,7 +1602,7 @@
    if (list.length === 0) {
      notification.warning({
        top: 92,
        message: '未获取到打印数据!',
        message: window.GLOB.dict['no_data'] || '未获取到打印数据!',
        duration: 5
      })
      this.setState({ loading: false })
@@ -1602,7 +1721,7 @@
    Api.postekPrint(param).then(res => {
      if (res.retval === '0') {
        if (params.length === 0) {
          this.execSuccess({ ErrCode: 'S', message: '打印请求已发出。', status: true })
          this.execSuccess({ ErrCode: 'S', message: window.GLOB.dict['print_out'] || '打印请求已发出。', status: true })
        } else {
          setTimeout(() => {
            this.loopRFIDPrint(params)
@@ -1620,6 +1739,43 @@
  execPrint = (list, template) => {
    const { btn } = this.props
    const { dict } = this.state
    let printReject = null
    let send = false
    let data = fromJS({
      data: list,
      template: template
    }).toJS()
    if (!window.GLOB.errorLog) {
      printReject = (msg) => {
        if (send) return
        send = true
        data.message = msg
        window.mkInfo(JSON.stringify(data))
      }
    } else {
      printReject = (msg) => {
        if (send) return
        send = true
        data.message = msg
        let param = {
          func: 's_special_error_note_log',
          api_url: btn.logLabel,
          error_code: 507,
          error_time: moment().format('YYYY-MM-DD HH:mm:ss'),
          api_param: JSON.stringify(data)
        }
        Api.genericInterface(param)
      }
    }
    let _errors = []
    let defaultPrinter = btn.verify.defaultPrinter || 'lackprinter'
@@ -1720,13 +1876,13 @@
      if (btn.verify.emptyTip === 'false') {
        this.execSuccess({
          ErrCode: '-1',
          message: '未获取到打印信息!',
          message: dict['no_data'] || '未获取到打印信息!',
          status: true
        })
      } else {
        this.execError({
          ErrCode: 'N',
          message: '未获取到打印信息!',
          message: dict['no_data'] || '未获取到打印信息!',
          status: false
        })
      }
@@ -1740,7 +1896,7 @@
          lackerror.push(`数据中未获取到模板(${err.title})${err.lacks.join('、')} 字段`)
        }
        if (err.emptys.length > 0) {
          emptyerror.push(`数据中模板(${err.title}) ${err.emptys.join('、')} 字段不可为空`)
          emptyerror.push(dict['not_empty'] ? `${err.title}: ${err.emptys.join('、')} ${dict['not_empty']}` : `数据中模板(${err.title}) ${err.emptys.join('、')} 字段不可为空`)
        }
      })
@@ -1761,26 +1917,35 @@
      return
    }
    if (printerList.length === 0) {
      this.execSuccess({
        ErrCode: '-1',
        message: dict['no_data'] || '未获取到打印信息!',
        status: true
      })
      return
    }
    if (!socket || socket.readyState !== 1 || socket.url !== 'ws://' + btn.verify.linkUrl) {
      socket = new WebSocket('ws://' + btn.verify.linkUrl)
    } else {
      this.syncMessageSend(printerList)
      this.execSuccess({
        ErrCode: 'S',
        message: '打印请求已发出。',
        status: true
      this.syncMessageSend(printerList, () => {
        this.execSuccess({
          ErrCode: 'S',
          message: dict['print_out'] || '打印请求已发出。',
          status: true
        })
      })
    }
    // 打开Socket
    socket.onopen = () =>{
      this.syncMessageSend(printerList)
      this.execSuccess({
        ErrCode: 'S',
        message: '打印请求已发出。',
        status: true
      this.syncMessageSend(printerList, () => {
        this.execSuccess({
          ErrCode: 'S',
          message: dict['print_out'] || '打印请求已发出。',
          status: true
        })
      })
    }
    // 监听消息
@@ -1823,29 +1988,40 @@
          message: data.message,
          status: false
        })
        printReject(data.message)
      }
    }
    socket.onerror = () => {
      this.execError({
        ErrCode: 'N',
        message: '无法连接到:' + btn.verify.linkUrl,
        message: (dict['un_connect'] || '无法连接到') + ':' + btn.verify.linkUrl,
        status: false
      })
    }
  }
  syncMessageSend = (list) => {
  syncMessageSend = (list, callback) => {
    let param = list.shift()
    if (socket && param) {
      socket.send(JSON.stringify(param))
    if (socket) {
      try {
        socket.send(JSON.stringify(param))
      } catch(e) {
        console.warn('打印请求发送失败!')
      }
    }
    if (list && list.length > 0) {
      setTimeout(() => {this.syncMessageSend(list)}, 3000)
    if (list.length > 0) {
      setTimeout(() => {
        this.syncMessageSend(list, callback)
      }, 3000)
    } else {
      callback()
    }
  }
  /**
   * @description 操作成功后处理
   * 1、excel导出,成功后取消导出按钮加载中状态
@@ -1856,17 +2032,18 @@
   */
  execSuccess = (res = {}) => {
    const { btn } = this.props
    const { autoMatic, btnconfig } = this.state
    const { autoMatic, btnconfig, dict } = this.state
    if ((res.ErrCode === 'S' || !res.ErrCode) || autoMatic) { // 执行成功
      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') { // 执行成功
      Modal.success({
        title: res.message || '执行成功!'
        title: res.message || dict['exc_success'] || '执行成功!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === '-1') { // 完成后不提示
@@ -1905,7 +2082,7 @@
   */
  execError = (res) => {
    const { btn } = this.props
    const { btnconfig, autoMatic } = this.state
    const { btnconfig, autoMatic, dict } = this.state
    if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
      res.ErrCode = 'E'
@@ -1913,23 +2090,24 @@
    if (res.ErrCode === 'E' && !autoMatic) {
      Modal.error({
        title: res.message || '执行失败!',
        title: res.message || dict['exc_fail'] || '执行失败!',
        okText: dict['got_it'] || '知道了'
      })
    } else if (res.ErrCode === 'N' || autoMatic) {
      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'] || '执行失败!')
    }
    
    this.setState({
@@ -1941,6 +2119,8 @@
      MKEmitter.emit('autoExecOver', btn.uuid, 'error')
      return
    }
    if (res.ErrCode === '-2') return
    if (btnconfig && btnconfig.setting && btnconfig.setting.errFocus) {
      MKEmitter.emit('mkFC', 'focus', btnconfig.setting.errFocus)
@@ -2034,6 +2214,7 @@
        } else {
          _LongParam = updateForm(_LongParam)
          _LongParam = this.handleModelConfig(_LongParam)
          _LongParam.uuid = btn.uuid
          this.setState({
            btnconfig: _LongParam
@@ -2075,8 +2256,8 @@
  }
  modelconfirm = () => {
    const { btnconfig, selines } = this.state
    let _this = this
    const { btnconfig, selines, dict } = this.state
    let that = this
    let result = []
    let _data = {}
    let BData = {}
@@ -2108,6 +2289,10 @@
      let key = item.field.toLowerCase()
      let _readin = item.readin !== 'false'
      if (item.type === 'linkMain' && item.verifyVal === 'true') {
        _item.$verify = true
        _item.label = item.label
      }
      if (_item.type === 'date') { // 时间兼容
        _item.precision = item.precision || 'day'
      } else if (_item.type === 'datetime') {
@@ -2153,17 +2338,36 @@
              // 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) {
              if (window.GLOB.debugger === true) {
                console.warn(e)
              console.warn(e)
              _item.value = ''
            }
          } else if (item.interception === 'charTure') {
            let str = _item.value.replace(/(^\s*|\s*$)/g, '')
            let result = ''
            for (let i = 0 ; i < str.length; i++) {
              let code = str.charCodeAt(i)
              if (code >= 65281 && code <= 65373) {
                result += String.fromCharCode(str.charCodeAt(i) - 65248)
              } else if (code === 12288) {
                result += String.fromCharCode(str.charCodeAt(i) - 12288 + 32)
              } else {
                result += str.charAt(i)
              }
            }
            _item.value = result
          } else {
            _item.value = _item.value.replace(/(^\s*|\s*$)/g, '')
          }
        }
        if (_item.type === 'text' && /@appkey@|@SessionUid@|@bid@/ig.test(_item.value)) { // 特殊字段替换
          _item.value = _item.value.replace(/^(\s*)@appkey@(\s*)$/ig, window.GLOB.appkey).replace(/^(\s*)@SessionUid@(\s*)$/ig, (localStorage.getItem('SessionUid') || '')).replace(/^(\s*)@bid@(\s*)$/ig, (this.props.BID || ''))
        if (_item.type === 'text') {
          if (/@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, (this.props.BID || ''))
          }
          if (/@currentYear@/ig.test(_item.value)) { // 系统变量替换
            _item.value = _item.value.replace(/@currentYear@/ig, moment().format('YYYY'))
          }
        }
        if (_item.type === 'text' && item.lenControl && item.lenControl !== 'limit') {
          if (item.lenControl === 'left') {
@@ -2204,12 +2408,14 @@
      this.execSubmit(selines, () => {}, result)
    } else {
      confirm({
        title: '确定要执行吗?',
        title: dict['exec_sure'] || '确定要执行吗?',
        okText: dict['ok'] || '确定',
        cancelText: dict['cancel'] || '取消',
        onOk() {
          _this.triggerPrint(selines, result)
          that.triggerPrint(selines, result)
        },
        onCancel() {
          _this.setState({ loading: false })
          that.setState({ loading: false })
        }
      })
    }
@@ -2220,7 +2426,7 @@
   */
  getModels = () => {
    const { BID, btn } = this.props
    const { btnconfig } = this.state
    const { btnconfig, dict } = this.state
    if (!this.state.visible || !btnconfig || !btnconfig.setting) return null
@@ -2238,6 +2444,13 @@
      clickouter = true
    }
    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}
@@ -2247,6 +2460,8 @@
        visible={this.state.visible}
        confirmLoading={this.state.confirmLoading}
        width={width}
        okText={dict['ok'] || '确定'}
        cancelText={dict['cancel'] || '取消'}
        maskStyle={btnconfig.setting.moveable === 'true' ?  {backgroundColor: 'rgba(0, 0, 0, 0.15)'} : null}
        onOk={this.handleOk}
        onCancel={this.handleCancel}
@@ -2308,39 +2523,24 @@
    if (hidden) return null
    let label = ''
    let icon = ''
    let type = 'link'
    let className = ''
    if (btn.show === 'button') {
      label = btn.label
      icon = btn.icon || ''
    } else if (btn.show === 'link') {
      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon}/> : ''}</span>
      icon = ''
    if (btn.show === 'link') {
      label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
    } else if (btn.show === 'icon') {
      icon = btn.icon || ''
    } else if (!btn.$toolbtn) {
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
      label = !loading ? <MkIcon type={btn.icon} /> : null
    } else {
      type = ''
      icon = btn.icon || ''
      label = btn.label
      className = 'mk-btn mk-' + btn.class
      label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{btn.label}</span>
    }
    return <>
      <Button
        type={type}
        type="link"
        id={'button' + btn.uuid}
        title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
        loading={loading}
        disabled={disabled}
        style={btn.style || null}
        icon={icon}
        className={className}
        className={btn.hover || ''}
        onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
      >{label}</Button>
      <span onClick={(e) => {e.stopPropagation()}}>{this.getModels()}</span>