king
2020-02-18 3d8cb6c1787dec23cbc85d4b262fd1f00654f891
src/tabviews/tableshare/actionList/index.jsx
@@ -2,6 +2,7 @@
import PropTypes from 'prop-types'
import moment from 'moment'
import { Button, Affix, Modal, notification, Spin, message } from 'antd'
import * as XLSX from 'xlsx'
import MutilForm from '@/tabviews/tableshare/mutilform'
import ExcelIn from '../excelin'
import Utils from '@/utils/utils.js'
@@ -18,12 +19,13 @@
    type: PropTypes.string,           // 判断当前为主表(main)、子表(sub)、子表标签(subtab)
    MenuID: PropTypes.string,         // 菜单ID
    actions: PropTypes.array,         // 按钮组
    logcolumns: PropTypes.array,      // 日志中显示列
    logcolumns: PropTypes.array,      // 显示列
    dict: PropTypes.object,           // 字典项
    setting: PropTypes.any,           // 页面通用设置
    ContainerId: PropTypes.any,       // tab页面ID,用于弹窗控制
    refreshdata: PropTypes.func,      // 执行完成后数据刷新
    triggerPopview: PropTypes.func,   // 弹窗标签页触发
    getexceloutparam: PropTypes.func,  // 获取excel导出数据
    gettableselected: PropTypes.func  // 获取表格中数据
  }
@@ -114,8 +116,20 @@
        this.improveAction(item)
      })
    } else if (item.OpenType === 'excelOut') {
      this.setState({loadingUuid: item.uuid})
      this.refreshdata(item, 'excelOut')
      if (
        item.intertype === 'inner' && !item.innerFunc &&
        ((setting.interType === 'inner' && setting.innerFunc) || setting.interType === 'outer')
      ) {
        notification.warning({
          top: 92,
          message: '导出按钮配置错误!',
          duration: 10
        })
        return
      }
      this.triggerExcelout(item)
    } else if (item.OpenType === 'excelIn') {
      if (item.verify && item.verify.sheet && item.verify.columns && item.verify.columns.length > 0) {
        let primaryId = '' // 导入时行Id
@@ -543,15 +557,11 @@
   * 5、通知主列表刷新
   */
  execSuccess = (btn, res) => {
    if (btn.OpenType === 'excelOut' || btn.OpenType === 'excelIn') { // 导出excel
      this.setState({
        loadingUuid: ''
      })
    } else if (res && res.ErrCode === 'S') { // 执行成功
    if (res && res.ErrCode === 'S') { // 执行成功
      notification.success({
        top: 92,
        message: res.ErrMesg || this.props.dict['main.action.confirm.success'],
        duration: 2
        duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
      })
    } else if (res && res.ErrCode === '-1') { // 完成后不提示
@@ -570,7 +580,12 @@
      this.setState({
        visible: false
      })
    } else if (btn.OpenType === 'excelOut' || btn.OpenType === 'excelIn') { // 导出excel
      this.setState({
        loadingUuid: ''
      })
    }
    this.refreshdata(btn, 'success')
  }
@@ -589,14 +604,14 @@
      notification.error({
        top: 92,
        message: res.message || res.ErrMesg,
        duration: btn.errorTime || 15
        duration: btn.verify && btn.verify.ntime ? btn.verify.ntime : 15
      })
    } else if (res.ErrCode === 'F') {
      notification.error({
        className: 'notification-custom-error',
        top: 92,
        message: res.message || res.ErrMesg,
        duration: btn.errorTime || 15
        duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 15
      })
    } else if (res.ErrCode === 'NM') {
      message.error(res.message || res.ErrMesg)
@@ -796,6 +811,9 @@
    })
  }
  /**
   * @description Excel 导入
   */
  getexceldata = (data, btn, errors, primaryId) => {
    if (errors) {
      if (errors === 'notexit') {
@@ -946,6 +964,244 @@
  }
  /**
   * @description Excel 导出
   */
  triggerExcelout = (btn) => {
    let viewParam = this.props.getexceloutparam()
    let name = `${viewParam.menuName}${moment().format('YYYYMMDDHHmmss')}.xlsx`
    // let pageSize = 100
    this.setState({loadingUuid: btn.uuid})
    if (btn.pagination !== 'true') {
      if (btn.intertype === 'inner' && !btn.innerFunc) { // 使用系统函数
        if (!viewParam.arr_field) {
          this.execError({ErrCode: 'N', message: '未设置显示列!'}, btn)
          return
        }
        let param = this.getExcelDefaultParam(viewParam.arr_field, viewParam.orderBy, viewParam.search)
        Api.genericInterface(param).then(result => {
          if (result.status) {
            this.exportExcel(result.data, btn, name)
          } else {
            this.execError(result, btn)
          }
        })
      } else if (btn.intertype === 'inner' && btn.innerFunc) { // 使用内部函数
        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
        param.func = btn.innerFunc
        Api.genericInterface(param).then(result => {
          if (result.status) {
            this.exportExcel(result.data, btn, name)
          } else {
            this.execError(result, btn)
          }
        })
      } else if (btn.intertype === 'outer' && !btn.innerFunc) { // 使用外部函数
        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
        if (btn.sysInterface === 'true') {
          param.rduri = window.GLOB.mainSystemApi || window.GLOB.subSystemApi
        } else {
          param.rduri = btn.interface
        }
        param.appkey = window.GLOB.appkey || ''
        if (btn.outerFunc) {
          param.func = btn.outerFunc
        }
        Api.genericInterface(param).then(result => {
          if (result.status) {
            this.exportExcel(result.data, btn, name)
          } else {
            this.execError(result, btn)
          }
        })
      } else if (btn.intertype === 'outer' && btn.innerFunc) {
        let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
        param.func = btn.innerFunc
        Api.genericInterface(param).then(res => {
          if (res.status) {
            delete res.ErrCode
            delete res.ErrMesg
            delete res.message
            delete res.status
            if (btn.sysInterface === 'true') {
              res.rduri = window.GLOB.mainSystemApi || window.GLOB.subSystemApi
            } else {
              res.rduri = btn.interface
            }
            if (btn.outerFunc) {
              res.func = btn.outerFunc
            }
            res.appkey = window.GLOB.appkey || '' // 外部请求时,统一添加appkey
            Api.genericInterface(res).then(result => {
              if (result.status) {
                this.exportExcel(result.data, btn, name)
              } else {
                this.execError(result, btn)
              }
            })
          } else {
            this.execError(res, btn)
          }
        })
      } else {
        this.execError({ErrCode: 'N', message: '导出按钮设置错误!'}, btn)
      }
    }
  }
  exportExcel = (data, btn, name) => {
    const { logcolumns } = this.props
    if (data && data.length > 0) {
      try {
        let _header = []
        let _topRow = {}
        let colwidth = []
        logcolumns.forEach(col => {
          if (col.Hide === 'true') return
          if (!data[0].hasOwnProperty(col.field)) return
          _header.push(col.field)
          _topRow[col.field] = col.label
          let _colwidth = Math.floor(col.Width / 6)
          if (!_colwidth || _colwidth < 10) {
            _colwidth = 10
          }
          colwidth.push({width: _colwidth})
        })
        let table = []
        table.push(_topRow)
        data.forEach(item => {
          let _row = {}
          _header.forEach(field => {
            _row[field] = item[field]
          })
          table.push(_row)
        })
        // const ws = XLSX.utils.aoa_to_sheet(data)
        const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true})
        ws['!cols'] = colwidth
        const wb = XLSX.utils.book_new()
        XLSX.utils.book_append_sheet(wb, ws, 'Sheet1')
        XLSX.writeFile(wb, name)
        this.execSuccess(btn, {ErrCode: 'S', ErrMesg: '导出成功!'})
      } catch {
        this.execError({ErrCode: 'N', message: 'Excel生成失败!'}, btn)
      }
    } else {
      this.execError({ErrCode: 'N', message: '未查询到导出数据!'}, btn)
    }
  }
  /**
   * @description 获取用户自定义存储过程传参
   */
  getExcelCustomParam = (orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
    let _search = Utils.formatCustomMainSearch(search)
    let param = {
      OrderCol: orderBy,
      ..._search
    }
    if (pagination) {
      param.PageIndex = pageIndex
      param.PageSize = pageSize
    }
    return param
  }
  /**
   * @description 获取默认存储过程请求参数
   */
  getExcelDefaultParam = (arr_field, orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
    const { setting } = this.props
    let _search = Utils.joinMainSearchkey(search)
    _search = _search ? 'where ' + _search : ''
    let param = {
      func: 'sPC_Get_TableData',
      obj_name: 'data',
      arr_field: arr_field,
      appkey: window.GLOB.appkey || ''
    }
    let _dataresource = setting.dataresource
    if (/\s/.test(_dataresource)) {
      _dataresource = '(' + _dataresource + ') tb'
    }
    if (setting.queryType === 'statistics') { // 统计数据源,内容替换
      let fieldmap = new Map()
      let options = search.map(item => {
        let _field = item.key
        if (fieldmap.has(_field)) {
          _field = _field + '1'
        }
        fieldmap.set(item.key, true)
        return {
          reg: new RegExp('@' + _field, 'ig'),
          value: item.value
        }
      })
      options.reverse()
      options.forEach(item => {
        _dataresource = _dataresource.replace(item.reg, `'${item.value}'`)
      })
      _search = ''
    }
    let LText = ''
    if (pagination) {
      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`
    } else {
      LText = `select ${arr_field} from (select ${arr_field} ,ROW_NUMBER() over(order by ${orderBy}) as rows from ${_dataresource} ${_search}) tmptable order by tmptable.rows`
    }
    param.LText = Utils.formatOptions(LText)
    param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss') + '.000'
    param.secretkey = Utils.encrypt(param.LText, param.timestamp)
    param.DateCount = ''
    return param
  }
  /**
   * @description 模态框(表单),确认
   */
  handleOk = () => {