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 options from '@/store/options.js'
|
import Api from '@/api'
|
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, // 页面通用设置
|
updateStatus: PropTypes.func, // 按钮状态更新
|
disabled: PropTypes.any, // 行按钮禁用
|
}
|
|
state = {
|
excelName: '', // 文件名
|
search: '', // 搜索条件
|
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 (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 按钮状态改变
|
*/
|
updateStatus = (type, name) => {
|
if (type === 'start') {
|
this.setState({
|
loading: true,
|
excelName: name
|
})
|
} else if (type === 'over') {
|
this.setState({
|
loading: false
|
})
|
}
|
}
|
|
/**
|
* @description 触发按钮操作
|
*/
|
actionTrigger = (triggerId, record, type) => {
|
const { setting, BID, btn } = this.props
|
const { loading, disabled } = this.state
|
|
if (loading || disabled) return
|
if (triggerId && btn.uuid !== triggerId) return
|
|
if (setting.supModule && !BID) {
|
notification.warning({
|
top: 92,
|
message: '需要上级主键值!',
|
duration: 5
|
})
|
return
|
} else if (type === 'linkbtn' && !btn.$toolbtn && !is(fromJS(this.props.selectedData || []), fromJS(record))) {
|
return
|
}
|
|
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
|
}
|
|
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 name = `${viewParam.menuName}${moment().format('YYYYMMDDHHmmss')}.xlsx`
|
let pageSize = 1000
|
|
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: '搜索条件不可为空!',
|
duration: 5
|
})
|
return
|
}
|
}
|
|
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 || ''
|
}
|
}
|
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)
|
|
if (btn.pagination !== 'true') {
|
if (btn.intertype === 'system') { // 使用系统函数
|
let param = this.getExcelDefaultParam(viewParam.arr_field, viewParam.orderBy, viewParam.search)
|
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data)
|
} 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
|
|
Api.genericInterface(param).then(result => {
|
if (result.status) {
|
this.exportExcel(result.data)
|
} 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 (window.GLOB.mkHS) {
|
if (btn.sysInterface === 'true' && options.cloudServiceApi) {
|
param.rduri = options.cloudServiceApi
|
param.userid = sessionStorage.getItem('CloudUserID') || ''
|
param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
|
} else if (btn.sysInterface !== 'true') {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
param.rduri = btn.proInterface
|
} else {
|
param.rduri = btn.interface
|
}
|
}
|
} else {
|
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)
|
} 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 (window.GLOB.mkHS) {
|
if (btn.sysInterface === 'true' && options.cloudServiceApi) {
|
res.rduri = options.cloudServiceApi
|
res.userid = sessionStorage.getItem('CloudUserID') || ''
|
res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
|
} else if (btn.sysInterface !== 'true') {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
res.rduri = btn.proInterface
|
} else {
|
res.rduri = btn.interface
|
}
|
}
|
} else {
|
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)
|
} 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.updateStatus('over')
|
}
|
} 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 (window.GLOB.mkHS) {
|
if (btn.sysInterface === 'true' && options.cloudServiceApi) {
|
res.rduri = options.cloudServiceApi
|
res.userid = sessionStorage.getItem('CloudUserID') || ''
|
res.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
|
} else if (btn.sysInterface !== 'true') {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
res.rduri = btn.proInterface
|
} else {
|
res.rduri = btn.interface
|
}
|
}
|
} else {
|
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: '未获取到数据信息!'})
|
} 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)
|
}
|
} 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') { // 使用系统函数
|
if (!viewParam.arr_field) {
|
this.execError({ErrCode: 'N', message: '未设置显示列!'})
|
return
|
}
|
|
param = this.getExcelDefaultParam(viewParam.arr_field, viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
} else if (btn.intertype === 'inner') { // 使用内部函数
|
param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
param.func = btn.innerFunc
|
|
} else if (btn.intertype === 'outer' && !btn.innerFunc) { // 使用外部函数
|
param = this.getExcelCustomParam(viewParam.orderBy, viewParam.search, true, pageIndex, pageSize)
|
|
if (window.GLOB.mkHS) {
|
if (btn.sysInterface === 'true' && options.cloudServiceApi) {
|
param.rduri = options.cloudServiceApi
|
param.userid = sessionStorage.getItem('CloudUserID') || ''
|
param.LoginUID = sessionStorage.getItem('CloudLoginUID') || ''
|
} else if (btn.sysInterface !== 'true') {
|
if (window.GLOB.systemType === 'production' && btn.proInterface) {
|
param.rduri = btn.proInterface
|
} else {
|
param.rduri = btn.interface
|
}
|
}
|
} else {
|
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: '未获取到数据信息!'})
|
} 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)
|
}
|
} else {
|
this.execError(result)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.execError({})
|
})
|
}
|
|
/**
|
* @description Excel 生成
|
*/
|
exportExcel = (data) => {
|
const { btn } = this.props
|
|
let imgCol = false
|
let columns = btn.verify.columns.filter(col => {
|
if (col.output === 'false') return false
|
|
if (col.type === 'image') {
|
imgCol = true
|
}
|
|
if (col.type === 'number' && (col.decimal || col.decimal === 0) ) {
|
col.round = Math.pow(10, col.decimal)
|
}
|
|
return col
|
})
|
|
if (data && data[0]) {
|
let errors = []
|
columns.forEach(col => {
|
if (col.Column && data[0][col.Column] === undefined) {
|
errors.push(col.Text)
|
}
|
})
|
|
if (errors.length) {
|
notification.error({
|
top: 92,
|
message: '数据中缺少字段:' + errors.join('、'),
|
duration: 5
|
})
|
|
this.setState({
|
loading: false
|
})
|
|
return
|
}
|
}
|
|
try {
|
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 && data.forEach((item, index) => {
|
let _row = {}
|
|
item.$Index = index + 1 + ''
|
|
columns.forEach((col, i) => {
|
let val = item[col.Column]
|
if (col.type === 'number' && typeof(val) === 'number') {
|
if (col.abs === 'true') {
|
val = Math.abs(val)
|
}
|
if (col.round) {
|
val = Math.round(val * col.round) / col.round
|
// val = val.toFixed(col.decimal)
|
}
|
}
|
|
_row[col.Column] = val
|
})
|
|
table.push(_row)
|
})
|
|
this.table2excel(column, table, this.state.excelName.replace(/\.xlsx/ig, '.xls'))
|
|
if (btn.verify.enable === 'true' && btn.verify.script) {
|
this.execCustomScript()
|
} else {
|
this.execSuccess({ErrCode: 'S', message: '导出成功!'})
|
}
|
} else {
|
let letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
let cols = []
|
|
for (let index = 0; index < columns.length; index++) {
|
let i = Math.floor(index / 26)
|
let s = letters[i - 1] || ''
|
|
cols.push(s + letters[index % 26])
|
}
|
|
let table = []
|
let _header = []
|
let _topRow = {}
|
let colwidth = []
|
let requires = []
|
let merges = []
|
|
columns.forEach((col, i) => {
|
_header.push(col.Column)
|
_topRow[col.Column] = col.Text
|
colwidth.push({wch: col.Width || 20})
|
if (col.required === 'true') {
|
requires.push(i)
|
}
|
})
|
|
if (btn.verify.merge === 'true') {
|
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] + `:${cols[i]}1`
|
} else {
|
merges.push(`${cols[i]}1:${cols[i]}2`)
|
sign = _sign
|
}
|
} else {
|
fLine[col.Column] = col.Text
|
sLine[col.Column] = col.Text
|
sign = ''
|
merges.push(`${cols[i]}1:${cols[i]}2`)
|
}
|
})
|
|
table.push(fLine)
|
table.push(sLine)
|
} else {
|
table.push(_topRow)
|
}
|
|
data && data.forEach((item, index) => {
|
let _row = {}
|
|
item.$Index = index + 1 + ''
|
|
columns.forEach((col, i) => {
|
let val = item[col.Column]
|
|
if (col.type === 'number' && typeof(val) === 'number') {
|
if (col.abs === 'true') {
|
val = Math.abs(val)
|
}
|
if (col.round) {
|
val = Math.round(val * col.round) / col.round
|
// val = val.toFixed(col.decimal)
|
}
|
}
|
|
_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 => {
|
if (cols[col]) {
|
ws[cols[col] + '1'].s = {font: { color: { rgb: 'F5222D' } }}
|
}
|
})
|
}
|
|
if (merges.length) {
|
ws['!merges'] = []
|
merges.forEach(item => {
|
ws['!merges'].push(XLSX.utils.decode_range(item))
|
})
|
|
cols.forEach(col => {
|
if (ws[col + '1'].s) {
|
ws[col + '1'].s = {font: { color: { rgb: 'F5222D' } }, alignment: { horizontal: 'center', vertical: 'center' }}
|
} else {
|
ws[col + '1'].s = {alignment: { horizontal: 'center', vertical: 'center' }}
|
}
|
ws[col + '2'].s = {alignment: { horizontal: 'center', vertical: 'center' }}
|
})
|
}
|
|
if (btn.verify.wrapText === 'true' && data) {
|
let lines = data.length + 1
|
let start = 2
|
if (btn.verify.merge === 'true') {
|
lines = data.length + 2
|
}
|
for (let n = 0; n < cols.length; n++) {
|
for (let m = start; m <= lines; m++) {
|
if (ws[cols[n] + m] && !ws[cols[n] + m].s) {
|
ws[cols[n] + m].s = {alignment: { wrapText: true }}
|
}
|
}
|
}
|
}
|
|
// ws["A1"].s = {fill: { bgColor: { rgb: "FFFFAA" }}, font: { color: { rgb: "1890FF" } }}
|
|
const wb = XLSX.utils.book_new()
|
XLSX.utils.book_append_sheet(wb, ws, btn.verify.sheet || 'Sheet1')
|
|
XLSX.writeFile(wb, this.state.excelName)
|
|
if (btn.verify.enable === 'true' && btn.verify.script) {
|
this.execCustomScript()
|
} else {
|
this.execSuccess({ErrCode: 'S', message: '导出成功!'})
|
}
|
}
|
} catch (e) {
|
this.execError({ErrCode: 'N', message: 'Excel生成失败!'})
|
}
|
}
|
|
table2excel = (column, data, excelName) => {
|
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 = excelName
|
document.body.appendChild(link)
|
link.click()
|
document.body.removeChild(link)
|
}
|
|
|
/**
|
* @description 执行自定义脚本
|
*/
|
execCustomScript = () => {
|
const { btn } = this.props
|
const { search } = this.state
|
let script = btn.verify.script
|
|
if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
|
script = script.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
} else {
|
script = script.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
}
|
|
let allSearch = Utils.getAllSearchOptions(search)
|
let regoptions = allSearch.map(item => {
|
return {
|
reg: new RegExp('@' + item.key + '@', 'ig'),
|
value: `'${item.value}'`
|
}
|
})
|
|
regoptions.forEach(item => {
|
script = script.replace(item.reg, item.value)
|
})
|
|
let param = {
|
func: 'sPC_TableData_InUpDe',
|
menuname: btn.logLabel
|
}
|
|
if (this.props.BID) {
|
param.BID = this.props.BID
|
}
|
|
param.exec_type = 'y' // 后台解码
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
param.LText = Utils.formatOptions(script)
|
|
if (window.GLOB.mkHS) { // 系统函数云端验证
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
if (window.GLOB.probation) {
|
param.s_debug_type = 'Y'
|
}
|
|
Api.genericInterface(param).then((res) => {
|
if (res.status) {
|
this.execSuccess({ErrCode: 'S', message: '导出成功!'})
|
} else {
|
this.execError(res)
|
}
|
}, (error) => {
|
if (error && error.ErrCode === 'LoginError') return
|
this.updateStatus('over')
|
})
|
}
|
|
/**
|
* @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 = (arr_field, orderBy, search, pagination = false, pageIndex = 1, pageSize = 9999) => {
|
const { setting, btn, selectedData, BID } = this.props
|
|
let defaultSql = setting.execute || setting.default || 'true'
|
let customScript = setting.customScript || ''
|
let _dataresource = setting.dataresource || ''
|
let queryType = setting.queryType
|
let primaryKey = setting.primaryKey || 'ID'
|
|
if (btn.verify.dataType === 'custom') {
|
defaultSql = btn.verify.defaultSql || 'true'
|
_dataresource = btn.verify.dataresource || ''
|
queryType = btn.verify.queryType
|
// primaryKey = btn.verify.primaryKey || 'ID'
|
|
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, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
customScript = customScript.replace(/\$@/ig, '/*').replace(/@\$/ig, '*/').replace(/@datam@/ig, '\'Y\'')
|
} else {
|
_dataresource = _dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
customScript = customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
}
|
}
|
|
let custompage = /@pageSize@/i.test(_dataresource + customScript)
|
let _search = Utils.joinMainSearchkey(search)
|
_search = _search ? 'where ' + _search : ''
|
|
let param = {
|
func: 'sPC_Get_TableData',
|
obj_name: 'data',
|
arr_field: arr_field,
|
custom_script: customScript,
|
default_sql: defaultSql,
|
menuname: btn.logLabel
|
}
|
|
if (btn.verify.dataType !== 'custom' && setting.sub_field) {
|
arr_field = arr_field + ',' + setting.sub_field
|
param.arr_field = arr_field
|
}
|
|
// 数据管理权限
|
if (sessionStorage.getItem('dataM') === 'true') {
|
param.dataM = 'Y'
|
}
|
|
if (BID) {
|
param.BID = BID
|
}
|
|
let userName = sessionStorage.getItem('User_Name') || ''
|
let fullName = sessionStorage.getItem('Full_Name') || ''
|
let RoleID = sessionStorage.getItem('role_id') || ''
|
let departmentcode = sessionStorage.getItem('departmentcode') || ''
|
let organization = sessionStorage.getItem('organization') || ''
|
let mk_user_type = sessionStorage.getItem('mk_user_type') || ''
|
let nation = sessionStorage.getItem('nation') || ''
|
let province = sessionStorage.getItem('province') || ''
|
let city = sessionStorage.getItem('city') || ''
|
let district = sessionStorage.getItem('district') || ''
|
let address = sessionStorage.getItem('address') || ''
|
|
if (sessionStorage.getItem('isEditState') === 'true') {
|
userName = sessionStorage.getItem('CloudUserName') || ''
|
fullName = sessionStorage.getItem('CloudFullName') || ''
|
}
|
|
let allSearch = Utils.getAllSearchOptions(search)
|
let regoptions = allSearch.map(item => {
|
return {
|
reg: new RegExp('@' + item.key + '@', 'ig'),
|
value: `'${item.value}'`
|
}
|
})
|
|
regoptions.push({
|
reg: new RegExp('@userName@', 'ig'),
|
value: userName
|
}, {
|
reg: new RegExp('@fullName@', 'ig'),
|
value: fullName
|
}, {
|
reg: new RegExp('@orderBy@', 'ig'),
|
value: orderBy || ''
|
}, {
|
reg: new RegExp('@pageSize@', 'ig'),
|
value: pageSize
|
}, {
|
reg: new RegExp('@pageIndex@', 'ig'),
|
value: pageIndex
|
})
|
|
regoptions.forEach(item => {
|
_dataresource = _dataresource.replace(item.reg, item.value)
|
param.custom_script = param.custom_script.replace(item.reg, item.value)
|
})
|
|
if (queryType === 'statistics') { // 统计数据源,内容替换
|
_search = ''
|
}
|
|
let primaryId = ''
|
if (btn.Ot === 'requiredOnce' && selectedData && selectedData.length > 0) {
|
primaryId = selectedData.map(d => d.$$uuid || '').filter(Boolean).join(',')
|
if (_search && primaryId) {
|
_search += ` and ${primaryKey} in (select ID from dbo.SplitComma('${primaryId}'))`
|
} else if (primaryId) {
|
_search = `where ${primaryKey} in (select ID from dbo.SplitComma('${primaryId}'))`
|
}
|
}
|
|
let LText = ''
|
|
if (custompage) {
|
LText = `/*system_query*/select ${arr_field} from ${_dataresource} ${_search} `
|
} else if (defaultSql !== 'false' && !pagination) {
|
LText = `/*system_query*/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 (defaultSql !== 'false') {
|
LText = `/*system_query*/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 `
|
}
|
|
if (param.custom_script) {
|
param.custom_script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000),@UserName nvarchar(50),@FullName nvarchar(50),@RoleID nvarchar(512),@mk_departmentcode nvarchar(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
|
${param.custom_script}
|
`
|
|
if (LText) {
|
LText += `
|
aaa:
|
if @ErrorCode!=''
|
insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
|
`
|
} else {
|
param.custom_script += `
|
aaa:
|
if @ErrorCode!=''
|
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(512),@mk_organization nvarchar(512),@mk_user_type nvarchar(20),@mk_nation nvarchar(50),@mk_province nvarchar(50),@mk_city nvarchar(50),@mk_district nvarchar(50),@mk_address nvarchar(100) select @ErrorCode='',@retmsg ='',@UserName='${userName}', @FullName='${fullName}', @RoleID='${RoleID}', @mk_departmentcode='${departmentcode}', @mk_organization='${organization}', @mk_user_type='${mk_user_type}', @mk_nation='${nation}', @mk_province='${province}', @mk_city='${city}', @mk_district='${district}', @mk_address='${address}'
|
${LText}
|
`
|
}
|
|
LText = LText.replace(/@ID@/ig, `'${primaryId || ''}'`)
|
param.custom_script = param.custom_script.replace(/@ID@/ig, `'${primaryId || ''}'`)
|
LText = LText.replace(/@BID@/ig, `'${BID}'`)
|
param.custom_script = param.custom_script.replace(/@BID@/ig, `'${BID}'`)
|
LText = LText.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
|
param.custom_script = param.custom_script.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
|
LText = LText.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
|
param.custom_script = param.custom_script.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
|
LText = LText.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
|
param.custom_script = param.custom_script.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
|
LText = LText.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
|
param.custom_script = param.custom_script.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
|
LText = LText.replace(/@typename@/ig, `'admin'`)
|
param.custom_script = param.custom_script.replace(/@typename@/ig, `'admin'`)
|
|
// 测试系统打印查询语句
|
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)
|
}
|
|
param.custom_script = Utils.formatOptions(param.custom_script)
|
param.LText = Utils.formatOptions(LText)
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
param.DateCount = ''
|
|
if (window.GLOB.mkHS) { // 云端数据验证
|
param.open_key = Utils.encryptOpenKey(param.secretkey, param.timestamp)
|
}
|
|
return param
|
}
|
|
/**
|
* @description 操作成功后处理
|
* 1、excel导出,成功后取消导出按钮加载中状态
|
* 2、状态码为 S 时,显示成功信息后系统默认信息
|
* 3、状态码为 -1 时,不显示任何信息
|
* 4、模态框执行成功后是否关闭
|
* 5、通知主列表刷新
|
*/
|
execSuccess = (res = {}) => {
|
const { btn } = this.props
|
|
if (res.ErrCode === 'S' || !res.ErrCode) { // 执行成功
|
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 || '执行成功!'
|
})
|
} else if (res.ErrCode === '-1') { // 完成后不提示
|
|
}
|
|
this.setState({
|
loading: false
|
})
|
|
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(() => {
|
MKEmitter.emit('reloadData', id)
|
}, 20 * i)
|
})
|
} else {
|
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)
|
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
|
|
if (!['LoginError', 'C', '-2', 'E', 'N', 'F', 'NM'].includes(res.ErrCode)) {
|
res.ErrCode = 'E'
|
}
|
|
if (res.ErrCode === 'E') {
|
Modal.error({
|
title: res.message || '执行失败!',
|
})
|
} else if (res.ErrCode === 'N') {
|
notification.error({
|
top: 92,
|
message: res.message || '执行失败!',
|
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 || '执行失败!',
|
duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
|
})
|
} else if (res.ErrCode === 'NM') {
|
message.error(res.message || '执行失败!')
|
}
|
|
this.setState({
|
loading: false
|
})
|
|
if (btn.execError === 'closepoptab') {
|
MKEmitter.emit('popclose')
|
} else if (btn.execError !== 'never') {
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', [])
|
}
|
|
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 = ''
|
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 = ''
|
} else if (btn.show === 'icon') {
|
icon = btn.icon || 'download'
|
} else if (!btn.$toolbtn) {
|
icon = btn.icon || ''
|
label = btn.label
|
className = 'mk-btn mk-' + btn.class
|
} else {
|
type = ''
|
icon = btn.icon || ''
|
label = btn.label
|
className = 'mk-btn mk-' + btn.class
|
}
|
|
return (
|
<Button
|
type={type}
|
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}
|
onClick={(e) => {e.stopPropagation(); this.actionTrigger()}}
|
>{label}</Button>
|
)
|
}
|
}
|
|
export default ExcelOutButton
|