king
2022-05-20 652b0129ec60098ae1ad22fb8413eba009fb3aaf
src/tabviews/zshare/actionList/exceloutbutton/index.jsx
@@ -24,13 +24,37 @@
    btn: PropTypes.object,            // 按钮
    setting: PropTypes.any,           // 页面通用设置
    updateStatus: PropTypes.func,     // 按钮状态更新
    disabled: PropTypes.any,          // 行按钮禁用
  }
  state = {
    dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
    excelName: '',  // 文件名
    search: '',     // 搜索条件
    loading: false  // 导出中
    loading: false, // 导出中
    hidden: false,
    disabled: false
  }
  UNSAFE_componentWillMount () {
    const { btn, BData, disabled } = this.props
    if (btn.control === 'parent') {
      if (!BData || !BData.hasOwnProperty(btn.controlField)) {
        this.setState({hidden: true})
      } else {
        let s = BData[btn.controlField] + ''
        if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
          this.setState({hidden: true})
        } else {
          this.setState({hidden: false})
        }
      }
    }
    if (disabled) {
      this.setState({disabled: true})
    }
  }
  shouldComponentUpdate (nextProps, nextState) {
@@ -40,6 +64,29 @@
  componentDidMount () {
    MKEmitter.addListener('triggerBtnId', this.actionTrigger)
    MKEmitter.addListener('returnModuleParam', this.triggerExcelout)
  }
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { btn, BData } = this.props
    if (btn.control === 'parent' && !is(fromJS(nextProps.BData || {}), fromJS(BData || {}))) {
      if (!nextProps.BData || !nextProps.BData.hasOwnProperty(btn.controlField)) {
        this.setState({hidden: true})
      } else {
        let s = nextProps.BData[btn.controlField] + ''
        if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
          this.setState({hidden: true})
        } else {
          this.setState({hidden: false})
        }
      }
    }
    if (nextProps.disabled) {
      this.setState({disabled: true})
    } else {
      this.setState({disabled: false})
    }
  }
  componentWillUnmount () {
@@ -69,11 +116,12 @@
  /**
   * @description 触发按钮操作
   */
  actionTrigger = (triggerId) => {
  actionTrigger = (triggerId, record, type) => {
    const { setting, Tab, BID, btn } = this.props
    const { loading } = this.state
    const { loading, disabled } = this.state
    if ((triggerId && btn.uuid !== triggerId) || loading) return
    if (loading || disabled) return
    if (triggerId && btn.uuid !== triggerId) return
    if (((Tab && Tab.supMenu) || setting.supModule) && !BID) {
      notification.warning({
@@ -82,26 +130,21 @@
        duration: 5
      })
      return
    } else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(this.props.selectedData || []), fromJS(record))) {
      return
    }
    if (btn.intertype === 'system' && setting.interType !== 'system') {
      notification.warning({
        top: 92,
        message: '导出按钮配置错误!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'inner' && !btn.innerFunc) {
      notification.warning({
        top: 92,
        message: '导出按钮配置错误!',
        duration: 5
      })
      return
    } else if (!btn.verify || !btn.verify.columns || btn.verify.columns.length === 0) {
    if (!btn.verify || !btn.verify.columns || btn.verify.columns.length === 0) {
      notification.warning({
        top: 92,
        message: '请设置导出列!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'system' && setting.interType !== 'system' && btn.verify.dataType !== 'custom') {
      notification.warning({
        top: 92,
        message: '导出按钮配置错误!',
        duration: 5
      })
      return
@@ -124,7 +167,7 @@
    let name = `${viewParam.menuName}${moment().format('YYYYMMDDHHmmss')}.xlsx`
    let pageSize = 1000
    if (btn.search === 'true' && viewParam.search && viewParam.search.length > 0) {
    if (((btn.intertype === 'system' && btn.verify.dataType === 'custom' && btn.verify.useSearch === 'true') || btn.intertype !== 'system' || btn.verify.dataType !== 'custom') && btn.search === 'true' && viewParam.search && viewParam.search.length > 0) {
      let valid = false
      viewParam.search.forEach(item => {
        if (item.value || item.value === 0) {
@@ -142,16 +185,34 @@
      }
    }
    if (btn.intertype === 'system' && !viewParam.arr_field) { // 使用系统函数
      notification.warning({
        top: 92,
        message: '未设置显示列!',
        duration: 5
      })
      return
    } else if (btn.intertype === 'system' && btn.verify && btn.verify.enable === 'true') {
    if (btn.intertype === 'system') { // 使用系统函数
      if (btn.verify.dataType !== 'custom' && !viewParam.arr_field) {
        notification.warning({
          top: 92,
          message: '按钮需自定义导出数据!',
          duration: 5
        })
        return
      } else if (btn.verify.dataType === 'custom') {
        viewParam.arr_field = []
        btn.verify.columns.forEach(col => {
          if (col.Column && col.Column !== '$Index') {
            viewParam.arr_field.push(col.Column)
          }
        })
        viewParam.arr_field = viewParam.arr_field.join(',')
        viewParam.orderBy = btn.verify.order || viewParam.orderBy
      }
    }
    if (btn.intertype === 'system' && btn.verify.enable === 'true') {
      this.setState({search: fromJS(viewParam.search).toJS()})
    }
    if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && btn.verify.useSearch === 'false') {
      viewParam.search = []
    }
    viewParam.orderBy = viewParam.orderBy || viewParam.arr_field.split(',')[0]
    
    this.updateStatus('start', name)
@@ -424,11 +485,13 @@
  exportExcel = (data) => {
    const { btn } = this.props
    
    let columns = btn.verify.columns.filter(col => col.output !== 'false')
    try {
      let imgCol = btn.verify.columns.filter(col => col.type === 'image')[0]
      let imgCol = columns.filter(col => col.type === 'image')[0]
      if (imgCol) {
        const column = btn.verify.columns.map(item => {
        const column = columns.map(item => {
          let col = {
            title: item.Text, 
            key: item.Column,
@@ -449,7 +512,7 @@
  
          item.$Index = index + 1 + ''
  
          btn.verify.columns.forEach((col, i) => {
          columns.forEach((col, i) => {
            if (item[col.Column] && col.abs === 'true') {
              _row[col.Column] = Math.abs(item[col.Column])
            } else {
@@ -474,7 +537,7 @@
        let colwidth = []
        let abses = []
  
        btn.verify.columns.forEach(col => {
        columns.forEach(col => {
          if (_topRow[col.Column]) return
  
          _header.push(col.Column)
@@ -662,6 +725,41 @@
  getExcelDefaultParam = (arr_field, orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
    const { setting, btn } = this.props
    let defaultSql = setting.execute || setting.default || 'true'
    let customScript = setting.customScript || ''
    let _dataresource = setting.dataresource || ''
    let queryType = setting.queryType
    let transaction = setting.transaction
    if (btn.verify.dataType === 'custom') {
      defaultSql = btn.verify.defaultSql || 'true'
      _dataresource = btn.verify.dataresource || ''
      queryType = btn.verify.queryType
      transaction = btn.verify.transaction
      if (/\s/.test(_dataresource)) {
        _dataresource = '(' + _dataresource + ') tb'
      }
      customScript = ''
      btn.verify.scripts && btn.verify.scripts.forEach(script => {
        if (script.status !== 'false') {
          customScript += `
          ${script.sql}
          `
        }
      })
      if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
        _dataresource = _dataresource.replace(/\$@/ig, '/*')
        _dataresource = _dataresource.replace(/@\$/ig, '*/')
        customScript = customScript.replace(/\$@/ig, '/*')
        customScript = customScript.replace(/@\$/ig, '*/')
      } else {
        _dataresource = _dataresource.replace(/@\$|\$@/ig, '')
        customScript = customScript.replace(/@\$|\$@/ig, '')
      }
    }
    let _search = Utils.joinMainSearchkey(search)
    _search = _search ? 'where ' + _search : ''
@@ -670,8 +768,8 @@
      func: 'sPC_Get_TableData',
      obj_name: 'data',
      arr_field: arr_field,
      custom_script: setting.customScript,
      default_sql: setting.default || 'true',
      custom_script: customScript,
      default_sql: defaultSql,
      menuname: btn.logLabel
    }
@@ -695,11 +793,9 @@
      userName = sessionStorage.getItem('CloudUserName') || ''
      fullName = sessionStorage.getItem('CloudFullName') || ''
    }
    let _dataresource = setting.dataresource
    let regoptions = null
    if (setting.queryType === 'statistics' || param.custom_script) {
    if (queryType === 'statistics' || param.custom_script) {
      let allSearch = Utils.getAllSearchOptions(search)
      regoptions = allSearch.map(item => {
@@ -720,7 +816,7 @@
        value: fullName
      }, {
        reg: new RegExp('@orderBy@', 'ig'),
        value: orderBy
        value: orderBy || ''
      }, {
        reg: new RegExp('@pageSize@', 'ig'),
        value: pageSize
@@ -730,7 +826,7 @@
      })
    }
    if (setting.queryType === 'statistics') { // 统计数据源,内容替换
    if (queryType === 'statistics') { // 统计数据源,内容替换
      regoptions.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, item.value)
      })
@@ -739,9 +835,9 @@
    let LText = ''
    if (setting.default !== 'false' && !pagination) {
    if (defaultSql !== 'false' && !pagination) {
      LText = ` select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows `
    } else if (setting.default !== 'false') {
    } else if (defaultSql !== 'false') {
      LText = ` select top ${pageSize} ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderBy}) as rows from ${_dataresource} ${_search}) tmptable where rows > ${pageSize * (pageIndex - 1)} order by tmptable.rows `
    }
@@ -766,10 +862,14 @@
            insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
        `
      }
    } else if (LText) {
      LText = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(50),@mk_organization nvarchar(50),@login_city nvarchar(50) select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @login_city='${city}'
        ${LText}
      `
    }
    // 测试系统打印查询语句
    if ((options.sysType === 'local' && !window.GLOB.systemType) || window.debugger === true) {
    if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
      param.custom_script && console.info(`${LText ? '' : '/*不执行默认sql*/\n'}${param.custom_script}`)
      LText && console.info(LText)
    }
@@ -784,7 +884,7 @@
      param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
    }
    if (setting.transaction === 'true') {
    if (transaction === 'true') {
      param.func = 'sPC_Get_TableData_try'
    }
@@ -802,7 +902,7 @@
  execSuccess = (res) => {
    const { btn } = this.props
    if (res && res.ErrCode === 'S') { // 执行成功
    if (res && (res.ErrCode === 'S' || !res.ErrCode)) { // 执行成功
      notification.success({
        top: 92,
        message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
@@ -824,7 +924,10 @@
      MKEmitter.emit('popclose')
    } else if (btn.execSuccess !== 'never') {
      MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, '', [])
    } else {
      btn.syncComponentId && MKEmitter.emit('reloadData', btn.syncComponentId)
    }
    if (btn.switchTab && btn.switchTab.length > 0) {
      let id = btn.switchTab[btn.switchTab.length - 1]
      let node = document.getElementById('tab' + id)
@@ -875,13 +978,17 @@
  render() {
    const { btn, show } = this.props
    const { loading } = this.state
    const { loading, hidden, disabled } = this.state
    if (hidden) return null
    if (show === 'actionList') {
      return (
        <Button
          className={'mk-btn mk-' + btn.class}
          icon={btn.icon}
          disabled={disabled}
          title={disabled ? (btn.reason || '') : ''}
          onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
          loading={loading}
        >{btn.label}</Button>
@@ -906,8 +1013,9 @@
      return (
        <Button
          type="link"
          title={show === 'icon' ? btn.label : ''}
          title={disabled ? (btn.reason || '') : (show === 'icon' ? btn.label : '')}
          loading={loading}
          disabled={disabled}
          style={btn.style}
          icon={icon}
          onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}