import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import moment from 'moment'
|
import { is, fromJS } from 'immutable'
|
import { Button, Modal, notification, message } from 'antd'
|
import * as XLSX from 'sheetjs-style'
|
|
import Utils from '@/utils/utils.js'
|
import Api from '@/api'
|
import UtilsDM from '@/utils/utils-datamanage.js'
|
import MKEmitter from '@/utils/events.js'
|
import MkIcon from '@/components/mk-icon'
|
// import './index.scss'
|
|
class ExcelOutButton extends Component {
|
static propTpyes = {
|
BID: PropTypes.string, // 主表ID
|
BData: PropTypes.any, // 主表数据
|
selectedData: PropTypes.any, // 子表中选择数据
|
btn: PropTypes.object, // 按钮
|
setting: PropTypes.any, // 页面通用设置
|
disabled: PropTypes.any, // 行按钮禁用
|
}
|
|
state = {
|
loading: false,
|
hidden: false,
|
disabled: false,
|
dict: window.GLOB.dict
|
}
|
|
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 (btn.controlVals.includes(s)) {
|
this.setState({hidden: true})
|
} else {
|
this.setState({hidden: false})
|
}
|
}
|
}
|
|
if (disabled) {
|
this.setState({disabled: true})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
componentDidMount () {
|
MKEmitter.addListener('triggerBtnId', this.actionTrigger)
|
}
|
|
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 (btn.controlVals.includes(s)) {
|
this.setState({hidden: true})
|
} else {
|
this.setState({hidden: false})
|
}
|
}
|
}
|
|
if (nextProps.disabled) {
|
this.setState({disabled: true})
|
} else {
|
this.setState({disabled: false})
|
}
|
}
|
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
|
}
|
|
/**
|
* @description 触发按钮操作
|
*/
|
actionTrigger = (triggerId, _, type, lid) => {
|
const { setting, BID, btn, 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: setting.supModTip || dict['sup_key_req'] || '需要上级主键值!',
|
duration: 5
|
})
|
} else {
|
MKEmitter.emit('queryModuleParam', btn.$menuId, this.triggerExcelout)
|
if (window.GLOB.systemType === 'production') {
|
MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: '导出Excel'})
|
}
|
}
|
}
|
|
/**
|
* @description Excel 导出
|
*/
|
triggerExcelout = (viewParam) => {
|
const { btn } = this.props
|
|
let pageSize = 1000
|
|
if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && btn.verify.useSearch === 'false') {
|
viewParam.search = []
|
} else 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) {
|
valid = true
|
}
|
})
|
|
if (!valid) {
|
notification.warning({
|
top: 92,
|
message: window.GLOB.dict['miss_search'] || '搜索条件不可为空!',
|
duration: 5
|
})
|
return
|
}
|
}
|
|
this.setState({
|
loading: true
|
})
|
|
if (btn.pagination !== 'true') {
|
if (btn.intertype === 'system') { // 使用系统函数
|
let param = this.getExcelDefaultParam(viewParam.orderBy, viewParam.search)
|
if (btn.database === 'sso' && window.GLOB.mainSystemApi) {
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data, result.ErrCode, result.message, viewParam.search)
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
} else if (btn.intertype === 'inner') { // 使用内部函数
|
let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
|
param.func = btn.innerFunc
|
|
if (btn.recordUser === 'true') {
|
param.username = sessionStorage.getItem('User_Name') || ''
|
param.fullname = sessionStorage.getItem('Full_Name') || ''
|
}
|
if (btn.dataM === 'true') {
|
param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
|
}
|
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data, result.ErrCode, result.message, viewParam.search)
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
} else if (btn.intertype === 'outer' && !btn.innerFunc) { // 使用外部函数
|
let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search)
|
|
if (btn.sysInterface === 'true') {
|
if (window.GLOB.mainSystemApi) {
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.sysInterface === 'external') {
|
if (window.GLOB.systemType === 'production') {
|
param.$token = btn.exProInterface || ''
|
} else {
|
param.$token = btn.exInterface || ''
|
}
|
} else {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
param.rduri = btn.proInterface
|
} else {
|
param.rduri = btn.interface
|
}
|
let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
|
if (param.rduri.indexOf(host) === -1 && /\/dostars/.test(param.rduri)) {
|
param.$login = true
|
}
|
}
|
|
if (btn.outerFunc) {
|
param.func = btn.outerFunc
|
}
|
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data, result.ErrCode, result.message, viewParam.search)
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
} 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') {
|
if (window.GLOB.mainSystemApi) {
|
res.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.sysInterface === 'external') {
|
if (window.GLOB.systemType === 'production') {
|
res.$token = btn.exProInterface || ''
|
} else {
|
res.$token = btn.exInterface || ''
|
}
|
} else {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
res.rduri = btn.proInterface
|
} else {
|
res.rduri = btn.interface
|
}
|
let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
|
if (res.rduri.indexOf(host) === -1 && /\/dostars/.test(res.rduri)) {
|
res.$login = true
|
}
|
}
|
|
if (btn.outerFunc) {
|
res.func = btn.outerFunc
|
}
|
|
Api.genericInterface(res).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data, result.ErrCode, result.message, viewParam.search)
|
} else {
|
this.execError(result)
|
}
|
})
|
} else {
|
this.execError(res)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
} else {
|
notification.warning({
|
top: 92,
|
message: '导出按钮设置错误!',
|
duration: 5
|
})
|
this.setState({
|
loading: false
|
})
|
}
|
} else if (btn.intertype === 'outer' && btn.innerFunc) { // 分页,且两步请求
|
this.getExcelOutDoubleData(viewParam, 1, pageSize, [])
|
} else { // 分页,一步请求
|
this.getExcelOutData(viewParam, 1, pageSize, [])
|
}
|
}
|
|
/**
|
* @description 两步分页请求
|
*/
|
getExcelOutDoubleData = (viewParam, pageIndex, pageSize, data) => {
|
const { btn } = this.props
|
let param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
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') {
|
if (window.GLOB.mainSystemApi) {
|
res.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.sysInterface === 'external') {
|
if (window.GLOB.systemType === 'production') {
|
res.$token = btn.exProInterface || ''
|
} else {
|
res.$token = btn.exInterface || ''
|
}
|
} else {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
res.rduri = btn.proInterface
|
} else {
|
res.rduri = btn.interface
|
}
|
let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
|
if (res.rduri.indexOf(host) === -1 && /\/dostars/.test(res.rduri)) {
|
res.$login = true
|
}
|
}
|
|
if (btn.outerFunc) {
|
res.func = btn.outerFunc
|
}
|
|
Api.genericInterface(res).then(result => {
|
if (result.status) {
|
if (!result.data) {
|
this.execError({ErrCode: 'N', message: window.GLOB.dict['no_data'] || '未获取到数据信息!'})
|
} else if (result.data.length >= pageSize) {
|
data = data.concat(result.data)
|
pageIndex++
|
this.getExcelOutDoubleData(viewParam, pageIndex, pageSize, data)
|
} else {
|
data = data.concat(result.data)
|
this.exportExcel(data, result.ErrCode, result.message, viewParam.search)
|
}
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
} else {
|
this.execError(res)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
}
|
|
/**
|
* @description 一步分页请求
|
*/
|
getExcelOutData = (viewParam, pageIndex, pageSize, data) => {
|
const { btn } = this.props
|
let param = null
|
if (btn.intertype === 'system') { // 使用系统函数
|
param = this.getExcelDefaultParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
if (btn.database === 'sso' && window.GLOB.mainSystemApi) {
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.intertype === 'inner') { // 使用内部函数
|
param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
param.func = btn.innerFunc
|
|
if (btn.recordUser === 'true') {
|
param.username = sessionStorage.getItem('User_Name') || ''
|
param.fullname = sessionStorage.getItem('Full_Name') || ''
|
}
|
if (btn.dataM === 'true') {
|
param.dataM = sessionStorage.getItem('dataM') === 'true' ? 'Y' : ''
|
}
|
} else if (btn.intertype === 'outer' && !btn.innerFunc) { // 使用外部函数
|
param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
|
if (btn.sysInterface === 'true') {
|
if (window.GLOB.mainSystemApi) {
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
} else if (btn.sysInterface === 'external') {
|
if (window.GLOB.systemType === 'production') {
|
param.$token = btn.exProInterface || ''
|
} else {
|
param.$token = btn.exInterface || ''
|
}
|
} else {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
param.rduri = btn.proInterface
|
} else {
|
param.rduri = btn.interface
|
}
|
|
let host = window.GLOB.baseurl.replace(/http(s):\/\//, '')
|
if (param.rduri.indexOf(host) === -1 && /\/dostars/.test(param.rduri)) {
|
param.$login = true
|
}
|
}
|
|
if (btn.outerFunc) {
|
param.func = btn.outerFunc
|
}
|
}
|
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
if (!result.data) {
|
this.execError({ErrCode: 'N', message: window.GLOB.dict['no_data'] || '未获取到数据信息!'})
|
} else if (result.data.length >= pageSize) {
|
data = data.concat(result.data)
|
pageIndex++
|
this.getExcelOutData(viewParam, pageIndex, pageSize, data)
|
} else {
|
data = data.concat(result.data)
|
this.exportExcel(data, result.ErrCode, result.message, viewParam.search)
|
}
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
}
|
|
/**
|
* @description Excel 生成
|
*/
|
exportExcel = (data = [], ErrCode, msg, search) => {
|
const { btn } = this.props
|
const { dict } = this.state
|
|
let imgCol = false
|
let merge = false
|
let styles = []
|
let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
let columns = btn.verify.columns.map((col, index) => {
|
if (col.type === 'image') {
|
imgCol = true
|
}
|
if (btn.verify.merge === 'true' && /.+-.+/.test(col.Text)) {
|
merge = true
|
}
|
|
let i = Math.floor(index / 26)
|
let s = letters[i - 1] || ''
|
col.name = s + letters[index % 26]
|
|
if (col.type === 'number') {
|
if (col.decimal || col.decimal === 0) {
|
col.round = Math.pow(10, col.decimal)
|
|
if (col.format) {
|
let dec = Array(col.decimal).fill(0).join('')
|
dec = dec ? '.' + dec : ''
|
if (col.format === 'thdSeparator') {
|
col.z = '#,##0' + dec
|
} else if (col.format === 'thdSepPm') {
|
col.z = '#,##0' + dec + ';'
|
col.z = col.z + '[Red]-' + col.z
|
} else if (col.format === 'percent') {
|
let _dec = ''
|
if (col.decimal > 2) {
|
Array(col.decimal - 2).fill(0).join('')
|
_dec = _dec ? '.' + _dec : ''
|
}
|
|
col.z = '0' + _dec + '%'
|
}
|
}
|
}
|
} else if (col.type === 'text') {
|
if (col.wrapText === 'true') {
|
col.s = {alignment: { wrapText: true }}
|
}
|
if (col.textFormat) {
|
if (col.textFormat === 'YYYY-MM-DD') {
|
col.z = 'yyyy-mm-dd;@'
|
} else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss') {
|
col.z = 'yyyy-mm-dd hh:mm:ss'
|
}
|
}
|
}
|
|
if (col.z || col.s) {
|
styles.push(col)
|
}
|
|
return col
|
})
|
|
if (data[0]) {
|
let errors = []
|
columns.forEach(col => {
|
if (col.output === 'false') return
|
if (col.Column && data[0][col.Column] === undefined) {
|
errors.push(col.Text)
|
}
|
})
|
|
if (errors.length) {
|
notification.error({
|
top: 92,
|
message: (dict['miss_field'] || '数据中缺少字段') + ':' + errors.join('、'),
|
duration: 5
|
})
|
|
this.setState({
|
loading: false
|
})
|
|
return
|
}
|
}
|
|
try {
|
if (btn.verify.excelHandle === 'true') {
|
// eslint-disable-next-line
|
let func = new Function('XLSX', 'data', 'columns', 'searches', 'callback', btn.verify.excel_func)
|
func(XLSX, data, columns, search, (res) => {
|
res = res || {ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'}
|
this.execSuccess(res)
|
})
|
} else if (imgCol) {
|
const column = columns.map(item => {
|
let col = {
|
title: item.Text,
|
key: item.Column,
|
type: 'text',
|
width: (item.Width || 20) * 10
|
}
|
if (item.type === 'image') {
|
col.type = 'image'
|
col.height = col.width
|
}
|
return col
|
})
|
|
let table = []
|
|
data.forEach((item, index) => {
|
let _row = {}
|
|
item.$Index = index + 1 + ''
|
|
columns.forEach((col, i) => {
|
let val = item[col.Column]
|
if (col.output === 'false') {
|
if (col.type === 'number' && col.noValue !== 'false') {
|
val = 0
|
} else {
|
val = ''
|
}
|
} else if (col.type === 'number') {
|
if (val && typeof(val) === 'string' && !isNaN(val)) {
|
val = +val
|
}
|
if (typeof(val) === 'number') {
|
if (col.abs === 'true') {
|
val = Math.abs(val)
|
}
|
if (col.round) {
|
val = Math.round(val * col.round) / col.round
|
}
|
if (col.noValue === 'false' && val === 0) {
|
val = ''
|
}
|
}
|
} else if (col.type === 'text') {
|
val = val + ''
|
|
if (col.textFormat) {
|
if (col.textFormat === 'YYYY-MM-DD' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1])/.test(val)) {
|
val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)}`
|
} else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1]).([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/.test(val)) {
|
val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)} ${val.substr(11, 2)}:${val.substr(14, 2)}:${val.substr(17, 2)}`
|
}
|
}
|
|
if (col.noValue === 'false' && val < '1949-10-02') {
|
val = ''
|
}
|
}
|
|
if (val !== '') {
|
if (col.prefix) {
|
val = col.prefix + val
|
}
|
if (col.postfix) {
|
val = val + col.postfix
|
}
|
}
|
|
_row[col.Column] = val
|
})
|
|
table.push(_row)
|
})
|
|
this.table2excel(column, table)
|
|
this.execSuccess({ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'})
|
} else {
|
let table = []
|
let _header = []
|
let _topRow = {}
|
let colwidth = []
|
let requires = []
|
let merges = []
|
|
columns.forEach(col => {
|
_header.push(col.Column)
|
_topRow[col.Column] = col.Text
|
colwidth.push({wch: col.Width || 20})
|
if (col.required === 'true') {
|
requires.push(col.name)
|
}
|
})
|
|
if (merge) {
|
let fLine = {}
|
let sLine = {}
|
let sign = ''
|
columns.forEach((col, i) => {
|
if (/.+-.+/.test(col.Text)) {
|
let _sign = col.Text.split('-')[0]
|
let _name = col.Text.split('-')[1]
|
fLine[col.Column] = _sign
|
sLine[col.Column] = _name
|
|
if (sign === _sign) {
|
merges[merges.length - 1] = merges[merges.length - 1].split(':')[0] + `:${col.name}1`
|
} else {
|
merges.push(`${col.name}1:${col.name}2`)
|
sign = _sign
|
}
|
} else {
|
fLine[col.Column] = col.Text
|
sLine[col.Column] = col.Text
|
sign = ''
|
merges.push(`${col.name}1:${col.name}2`)
|
}
|
})
|
|
table.push(fLine)
|
table.push(sLine)
|
} else {
|
table.push(_topRow)
|
}
|
|
data.forEach((item, index) => {
|
let _row = {}
|
|
item.$Index = index + 1 + ''
|
|
columns.forEach((col, i) => {
|
let val = item[col.Column]
|
|
if (col.output === 'false') {
|
if (col.type === 'number' && col.noValue !== 'false') {
|
val = 0
|
} else {
|
val = ''
|
}
|
} else if (col.type === 'number') {
|
if (val && typeof(val) === 'string' && !isNaN(val)) {
|
val = +val
|
}
|
if (typeof(val) === 'number') {
|
if (col.abs === 'true') {
|
val = Math.abs(val)
|
}
|
if (col.round) {
|
val = Math.round(val * col.round) / col.round
|
}
|
if (col.noValue === 'false' && val === 0) {
|
val = ''
|
}
|
}
|
} else if (col.type === 'text') {
|
val = val + ''
|
|
if (col.textFormat) {
|
if (col.textFormat === 'YYYY-MM-DD' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1])/.test(val)) {
|
val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)}`
|
} else if (col.textFormat === 'YYYY-MM-DD HH:mm:ss' && /^[1-9]\d{3}(-|\/)(0[1-9]|1[0-2])(-|\/)(0[1-9]|[1-2][0-9]|3[0-1]).([0-1][0-9]|2[0-3]):[0-5][0-9]:[0-5][0-9]/.test(val)) {
|
val = `${val.substr(0, 4)}-${val.substr(5, 2)}-${val.substr(8, 2)} ${val.substr(11, 2)}:${val.substr(14, 2)}:${val.substr(17, 2)}`
|
}
|
}
|
|
if (col.noValue === 'false' && val < '1949-10-02') {
|
val = ''
|
}
|
}
|
|
if (val !== '') {
|
if (col.prefix) {
|
val = col.prefix + val
|
}
|
if (col.postfix) {
|
val = val + col.postfix
|
}
|
}
|
|
_row[col.Column] = val
|
})
|
|
table.push(_row)
|
})
|
|
const ws = XLSX.utils.json_to_sheet(table, {header: _header, skipHeader: true})
|
|
ws['!cols'] = colwidth
|
|
if (btn.verify.rowHeight) {
|
ws['!rows'] = Array(table.length).fill({hpx: btn.verify.rowHeight})
|
}
|
|
if (requires.length) {
|
requires.forEach(col => {
|
ws[col + '1'].s = {font: { color: { rgb: 'F5222D' } }}
|
})
|
}
|
|
if (merge) {
|
ws['!merges'] = []
|
merges.forEach(item => {
|
ws['!merges'].push(XLSX.utils.decode_range(item))
|
})
|
|
columns.forEach(col => {
|
ws[col.name + '1'].s = ws[col.name + '1'].s || {}
|
ws[col.name + '1'].s.alignment = { horizontal: 'center', vertical: 'center' }
|
|
ws[col.name + '2'].s = {alignment: { horizontal: 'center', vertical: 'center' }}
|
})
|
}
|
|
// ws['A3'].s = {font: { sz: 10 , bold: true }, alignment: { horizontal: 'center', vertical: 'center' }, border: {top: {style: 'thin', color: '000000'}, left: {style: 'thin', color: '000000'}, bottom: {style: 'thin', color: '000000'}, right: {style: 'thin', color: '000000'}}};
|
// ws['A3'].z = '#,##0.00';
|
// ws['A3'].z = '#,##0.00;[Red]-#,##0.00;';
|
// ws["A1"].s = {fill: { bgColor: { rgb: "FFFFAA" }}, font: { color: { rgb: "1890FF" } }}
|
|
if (data.length && styles.length) {
|
for (let n = table.length - data.length + 1; n <= table.length; n++) {
|
styles.forEach(col => {
|
if (col.z) {
|
ws[col.name + n].z = col.z
|
}
|
if (col.s) {
|
ws[col.name + n].s = col.s
|
}
|
})
|
}
|
}
|
|
const wb = XLSX.utils.book_new()
|
XLSX.utils.book_append_sheet(wb, ws, btn.verify.sheet || 'Sheet1')
|
|
XLSX.writeFile(wb, `${btn.verify.excelName || btn.$menuName || ''}${moment().format('YYYYMMDDHHmmss')}.xlsx`)
|
|
this.execSuccess({ErrCode: ErrCode || 'S', message: msg || dict['exc_success'] || '导出成功!'})
|
}
|
} catch (e) {
|
console.warn(e)
|
this.execError({ErrCode: 'N', message: 'Excel生成失败!'})
|
}
|
}
|
|
table2excel = (column, data) => {
|
let thead = column.reduce((result, item) => {
|
return result + `<th>${item.title}</th>`
|
}, '')
|
|
thead = `<thead><tr>${thead}</tr></thead>`
|
|
let tbody = data.reduce((result, row) => {
|
const temp = column.reduce((tds, col) => {
|
let cell = '<td></td>'
|
if (col.type !== 'image' || !row[col.key]) {
|
cell = `<td style="width: ${col.width}px;">${row[col.key]}</td>`
|
} else if (col.type === 'image') {
|
cell = `<td style="width: ${col.width}px;height: ${col.height}px;"><img src="${row[col.key]}" width="${col.width * 0.75}"></td>`
|
}
|
return tds + cell
|
}, '')
|
return result + `<tr>${temp}</tr>`
|
}, '')
|
|
tbody = `<tbody>${tbody}</tbody>`
|
|
const table = thead + tbody
|
|
let html = "<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:x='urn:schemas-microsoft-com:office:excel' xmlns='http://www.w3.org/TR/REC-html40'>"
|
html += '<head><meta http-equiv="content-type" content="application/vnd.ms-excel; charset=UTF-8">'
|
html += '<xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>Sheet1</x:Name><x:WorksheetOptions><x:Print><x:ValidPrinterInfo/></x:Print></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml></head>'
|
html += `<body><table>${table}</table></body>`
|
html += '</html>'
|
|
let url = 'data:application/vnd.ms-excel;charset=utf-8,' + encodeURIComponent(html)
|
// let url = 'data:application/vnd.ms-excel;base64,' + window.btoa(unescape(encodeURIComponent(html)))
|
let link = document.createElement('a')
|
link.href = url
|
link.download = `${this.props.btn.$menuName || ''}${moment().format('YYYYMMDDHHmmss')}.xls`
|
document.body.appendChild(link)
|
link.click()
|
document.body.removeChild(link)
|
}
|
|
/**
|
* @description 获取用户自定义存储过程传参
|
*/
|
getExcelCustomParam = (orderBy, search, pagination = false, pageIndex = 1, pageSize = 100) => {
|
const { btn, selectedData } = this.props
|
let _search = Utils.formatCustomMainSearch(search)
|
|
let param = {
|
OrderCol: orderBy,
|
..._search
|
}
|
|
// 数据管理权限
|
if (sessionStorage.getItem('dataM') === 'true') {
|
param.dataM = 'Y'
|
}
|
|
if (btn.Ot === 'requiredOnce' && selectedData && selectedData.length > 0) {
|
let primaryId = selectedData.map(d => d.$$uuid || '').filter(Boolean).join(',')
|
if (primaryId) {
|
param.ID = primaryId
|
}
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
if (pagination) {
|
param.PageIndex = pageIndex
|
param.PageSize = pageSize
|
}
|
|
return param
|
}
|
|
/**
|
* @description 获取默认存储过程请求参数
|
*/
|
getExcelDefaultParam = (orderBy, search, pagination = false, pageIndex = 1, pageSize = 9999) => {
|
const { setting, btn, selectedData, BID } = this.props
|
|
let _setting = {}
|
let _orderBy = orderBy || ''
|
|
if (btn.verify.dataType === 'custom') {
|
_setting.uuid = btn.uuid
|
_setting.interType = 'system'
|
_setting.arr_field = []
|
|
btn.verify.columns.forEach(col => {
|
if (col.output === 'false' || !col.Column || col.Column === '$Index') return
|
|
_setting.arr_field.push(col.Column)
|
})
|
_setting.arr_field = _setting.arr_field.join(',')
|
_setting.execute = btn.verify.defaultSql !== 'false'
|
_setting.dataresource = btn.verify.dataresource || ''
|
_setting.primaryKey = btn.verify.primaryKey || setting.primaryKey || 'ID'
|
|
if (!_setting.execute) {
|
_setting.dataresource = ''
|
}
|
|
let _customScript = ''
|
let _tailScript = ''
|
btn.verify.scripts && btn.verify.scripts.forEach(script => {
|
if (script.status === 'false') return
|
if (script.position !== 'back') {
|
_customScript += `
|
${script.sql}
|
`
|
} else {
|
_tailScript += `
|
${script.sql}
|
`
|
}
|
})
|
|
if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
|
_setting.dataresource = _setting.dataresource.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
_customScript = _customScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
_tailScript = _tailScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
} else {
|
_setting.dataresource = _setting.dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
_customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
_tailScript = _tailScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
}
|
|
if (btn.$flowId && window.GLOB.UserCacheMap.has(btn.$flowId)) {
|
let flow = window.GLOB.UserCacheMap.get(btn.$flowId)
|
_setting.dataresource = _setting.dataresource.replace(/@works_flow_code@/ig, `'${flow.flow_code}'`)
|
_customScript = _customScript.replace(/@works_flow_code@/ig, `'${flow.flow_code}'`)
|
_tailScript = _tailScript.replace(/@works_flow_code@/ig, `'${flow.flow_code}'`)
|
}
|
|
_setting.customScript = _customScript // 整理后自定义脚本
|
_setting.tailScript = _tailScript // 后置自定义脚本
|
|
_setting.laypage = pagination
|
_setting.custompage = false
|
|
if (/order\s+by\s+sort_id\s*$/i.test(_setting.dataresource)) {
|
_setting.custompage = true
|
} else if (/@pageSize@|@orderBy@|@mk_total/i.test(_setting.dataresource + _setting.customScript)) {
|
_setting.custompage = true
|
}
|
|
if (/\s/.test(_setting.dataresource)) {
|
_setting.dataresource = '(' + _setting.dataresource + ') tb'
|
}
|
|
_setting.queryType = btn.verify.queryType
|
_setting.$name = btn.logLabel
|
|
_orderBy = btn.verify.order || ''
|
} else {
|
_setting = {...setting}
|
_setting.$name = btn.logLabel
|
_setting.laypage = pagination
|
_setting.arr_field = _setting.all_field || _setting.arr_field
|
|
if (setting.sub_field || setting.laypage !== pagination) {
|
_setting.uuid = btn.uuid
|
}
|
|
delete _setting.sub_field
|
}
|
|
let primaryId = ''
|
if (btn.Ot === 'requiredOnce' && selectedData && selectedData.length > 0) {
|
primaryId = selectedData.map(d => d.$$uuid || '').filter(Boolean).join(',')
|
primaryId = primaryId ? 'excel:' + primaryId : ''
|
}
|
|
let param = UtilsDM.getQueryDataParams(_setting, search, _orderBy, pageIndex, pageSize, BID, primaryId)
|
|
delete param.DateCount
|
|
return param
|
}
|
|
/**
|
* @description 操作成功后处理
|
* 1、excel导出,成功后取消导出按钮加载中状态
|
* 2、状态码为 S 时,显示成功信息后系统默认信息
|
* 3、状态码为 -1 时,不显示任何信息
|
* 4、模态框执行成功后是否关闭
|
* 5、通知主列表刷新
|
*/
|
execSuccess = (res) => {
|
const { btn } = this.props
|
|
if (res.ErrCode === 'S') { // 执行成功
|
notification.success({
|
top: 92,
|
message: res.message,
|
duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
|
})
|
} else if (res.ErrCode === 'Y') { // 执行成功
|
Modal.success({
|
title: res.message,
|
okText: window.GLOB.dict['got_it'] || '知道了'
|
})
|
} else if (res.ErrCode === '-1') { // 完成后不提示
|
|
}
|
|
this.setState({
|
loading: false
|
})
|
|
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, btn.urlPar === 'true')
|
return
|
}
|
|
if (btn.execSuccess === 'closepoptab') {
|
MKEmitter.emit('popclose')
|
} else if (btn.execSuccess !== 'never') {
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, '', [])
|
}
|
|
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 {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}
|
}
|
|
if (tabId) {
|
MKEmitter.emit('reloadMenuView', tabId, btn.urlPar === 'true')
|
}
|
|
if (btn.switchTab && btn.switchTab.length > 0) {
|
let id = btn.switchTab[btn.switchTab.length - 1]
|
let node = document.getElementById('tab' + id)
|
node && node.click()
|
}
|
|
if (btn.execSuccess === 'popclose' && btn.$tabId) { // 标签关闭刷新
|
MKEmitter.emit('refreshPopButton', btn.$tabId)
|
}
|
}
|
|
/**
|
* @description 操作失败后处理
|
* 1、状态码为 E、N、F、NM 时,显示相应提示信息
|
* 2、excel导出,失败后取消导出按钮加载中状态
|
* 3、通知主列表刷新
|
*/
|
execError = (res = {}) => {
|
const { btn } = this.props
|
const { dict } = this.state
|
|
if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
|
res.ErrCode = 'E'
|
}
|
|
if (res.ErrCode === 'E') {
|
Modal.error({
|
title: res.message || dict['exc_fail'] || '执行失败!',
|
okText: dict['got_it'] || '知道了'
|
})
|
} else if (res.ErrCode === 'N') {
|
notification.error({
|
top: 92,
|
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 || dict['exc_fail'] || '执行失败!',
|
duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
|
})
|
} else if (res.ErrCode === 'NM') {
|
message.error(res.message || dict['exc_fail'] || '执行失败!')
|
}
|
|
this.setState({
|
loading: false
|
})
|
|
if (btn.execError === 'closepoptab') {
|
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, btn.urlPar === 'true')
|
return
|
}
|
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', [])
|
|
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 {
|
MKEmitter.emit('reloadData', btn.syncComponentId)
|
}
|
}
|
|
if (tabId) {
|
MKEmitter.emit('reloadMenuView', tabId, btn.urlPar === 'true')
|
}
|
}
|
|
if (btn.execError === 'popclose' && btn.$tabId) { // 标签关闭刷新
|
MKEmitter.emit('refreshPopButton', btn.$tabId)
|
}
|
}
|
|
render() {
|
const { btn } = this.props
|
const { loading, hidden, disabled } = this.state
|
|
if (hidden) return null
|
|
let label = ''
|
|
if (btn.show === 'link') {
|
label = <span>{btn.label}{btn.icon ? <MkIcon style={{marginLeft: '8px'}} type={btn.icon} /> : ''}</span>
|
} else if (btn.show === 'icon') {
|
label = !loading ? <MkIcon type={btn.icon} /> : null
|
} else {
|
label = <span>{!loading && btn.icon ? <MkIcon style={{marginRight: '8px'}} type={btn.icon} /> : ''}{btn.label}</span>
|
}
|
|
return (
|
<Button
|
type="link"
|
id={'button' + btn.uuid}
|
title={disabled ? (btn.reason || '') : (btn.show === 'icon' ? btn.label : '')}
|
loading={loading}
|
disabled={disabled}
|
style={btn.style || null}
|
className={btn.hover || ''}
|
onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
|
>{label}</Button>
|
)
|
}
|
}
|
|
export default ExcelOutButton
|