import React, { Component } from 'react'
|
import { is, fromJS } from 'immutable'
|
import { Col, Row, Spin, notification, Button } from 'antd'
|
import moment from 'moment'
|
|
import Api from '@/api'
|
import Utils from '@/utils/utils.js'
|
import zhCN from '@/locales/zh-CN/main.js'
|
import enUS from '@/locales/en-US/main.js'
|
import options from '@/store/options.js'
|
import UtilsDM from '@/utils/utils-datamanage.js'
|
import NotFount from '@/components/404'
|
import asyncComponent from '@/utils/asyncComponent'
|
|
import './index.scss'
|
|
// 通用组件
|
const AntvBarAndLine = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-bar-line'))
|
const AntvPie = asyncComponent(() => import('@/tabviews/custom/components/chart/antv-pie'))
|
const DataCard = asyncComponent(() => import('@/tabviews/custom/components/card/data-card'))
|
const PropCard = asyncComponent(() => import('@/tabviews/custom/components/card/prop-card'))
|
|
class BillPrint extends Component {
|
state = {
|
dict: localStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
loadingview: true,
|
dataManager: false,
|
BID: '',
|
data: '',
|
tempId: '',
|
config: null,
|
}
|
|
UNSAFE_componentWillMount() {
|
try {
|
let param = JSON.parse(window.decodeURIComponent(window.atob(this.props.match.params.param)))
|
this.setState({
|
BID: param.id || '',
|
tempId: param.tempId,
|
dataManager: param.dataManager
|
}, () => {
|
this.getMenuParam()
|
})
|
} catch {
|
notification.warning({
|
top: 92,
|
message: '菜单信息解析错误!',
|
duration: 5
|
})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
/**
|
* @description 组件销毁,清除state更新
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
getMenuParam = () => {
|
const { tempId, BID, dataManager } = this.state
|
|
let _param = {
|
func: 'sPC_Get_LongParam',
|
MenuID: tempId
|
}
|
|
if (window.GLOB.mainSystemApi) { // 从单点登录服务器取打印配置信息
|
_param.rduri = window.GLOB.mainSystemApi
|
}
|
|
Api.getLocalConfig(_param).then(result => {
|
if (result.status) {
|
let config = ''
|
|
try {
|
config = JSON.parse(window.decodeURIComponent(window.atob(result.LongParam)))
|
} catch (e) {
|
console.warn('Parse Failure')
|
config = ''
|
}
|
|
// 页面配置解析错误时提示
|
if (!config) {
|
this.setState({
|
viewlost: true,
|
loadingview: false
|
})
|
return
|
}
|
|
// 页面未启用时,显示未启用页面
|
if (!config.enabled) {
|
this.setState({
|
viewlost: true,
|
loadingview: false,
|
lostmsg: this.state.dict['main.view.unenabled']
|
})
|
return
|
}
|
|
let params = []
|
let _pars = []
|
|
config.components = config.components.filter(item => !['tabs', 'search'].includes(item.type) && item.subtype !== 'tablecard')
|
config.components = config.components.map(component => {
|
if (component.action) component.action = []
|
if (component.search) component.search = []
|
|
if (!component.setting) return component // 不使用系统函数时
|
if (!component.format || (component.subtype === 'propcard' && component.wrap.datatype === 'static')) return component // 没有动态数据 数据格式 array 或 object
|
if (component.setting.interType !== 'system') { // 不使用系统函数时
|
component.setting.sync = 'false'
|
return component
|
}
|
|
let _customScript = ''
|
component.scripts && component.scripts.forEach(script => {
|
if (script.status !== 'false') {
|
_customScript += `
|
${script.sql}
|
`
|
}
|
})
|
delete component.scripts
|
|
component.setting.execute = component.setting.execute !== 'false' // 默认sql是否执行,转为boolean 统一格式
|
component.setting.laypage = false // 是否分页,转为boolean 统一格式
|
component.setting.onload = 'true' // 默认加载
|
|
if (!component.setting.execute) {
|
component.setting.dataresource = ''
|
}
|
if (/\s/.test(component.setting.dataresource)) {
|
component.setting.dataresource = '(' + component.setting.dataresource + ') tb'
|
}
|
|
if (dataManager) { // 数据权限
|
component.setting.dataresource = component.setting.dataresource.replace(/\$@/ig, '/*')
|
component.setting.dataresource = component.setting.dataresource.replace(/@\$/ig, '*/')
|
_customScript = _customScript.replace(/\$@/ig, '/*')
|
_customScript = _customScript.replace(/@\$/ig, '*/')
|
} else {
|
component.setting.dataresource = component.setting.dataresource.replace(/@\$|\$@/ig, '')
|
_customScript = _customScript.replace(/@\$|\$@/ig, '')
|
}
|
|
component.setting.dataresource = component.setting.dataresource.replace(/@BID@/ig, BID)
|
_customScript = _customScript.replace(/@BID@/ig, BID)
|
|
component.setting.customScript = _customScript // 整理后自定义脚本
|
|
// floor 组件的层级
|
// dataName 系统生成的数据源名称
|
// pageable 是否分页,组件属性,不分页的组件才可以统一查询
|
if (component.dataName && component.setting.sync === 'true') {
|
let param = this.getDefaultParam(component)
|
_pars.push(param)
|
} else {
|
let arr_field = component.columns.map(col => col.field).join(',')
|
let param = UtilsDM.getQueryDataParams(component.setting, arr_field, [], component.setting.order || '', 1, 1000, BID, '', dataManager)
|
|
param.componentId = component.uuid
|
|
params.push(param)
|
}
|
component.setting.sync = 'true'
|
|
return component
|
})
|
|
_pars = this.getFormatParam(_pars)
|
|
if (_pars) {
|
_pars.componentId = 'union'
|
params.unshift(_pars)
|
}
|
|
this.setState({
|
config
|
}, () => {
|
if (params.length === 0) {
|
this.setState({loadingview: false})
|
} else {
|
this.loadmaindata(params)
|
}
|
})
|
} else {
|
notification.warning({
|
top: 92,
|
message: result.message,
|
duration: 5
|
})
|
}
|
})
|
}
|
|
/**
|
* @description 获取系统存储过程 sPC_Get_TableData 的参数
|
*/
|
getDefaultParam = (component) => {
|
const { columns, setting, dataName, format } = component
|
|
let arr_field = columns.map(col => col.field)
|
let _dataresource = setting.dataresource
|
let _customScript = setting.customScript
|
|
if (setting.order && _dataresource) {
|
_dataresource = `select top 1000 ${arr_field.join(',')} from (select ${arr_field.join(',')} ,ROW_NUMBER() over(order by ${setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
|
} else if (_dataresource) {
|
_dataresource = `select top 1000 ${arr_field.join(',')} from ${_dataresource} `
|
}
|
|
// 测试系统打印查询语句
|
if ((options.sysType === 'local' && !window.GLOB.systemType) || window.debugger === true) {
|
_customScript && console.log(`${_dataresource ? '' : '/*不执行默认sql*/\n'}${_customScript}`)
|
_dataresource && console.log(_dataresource)
|
}
|
|
return {
|
name: dataName,
|
columns: columns,
|
par_tablename: '',
|
type: format === 'array' ? format : '',
|
primaryKey: setting.primaryKey || '',
|
foreign_key: '',
|
sql: _dataresource,
|
script: _customScript
|
}
|
}
|
|
getFormatParam = (params) => {
|
if (!params || params.length === 0) return ''
|
let LText_field = []
|
let LText = params.map((item, index) => {
|
let _sql = item.sql
|
let _script = item.script
|
|
if (index === 0) {
|
_script = `declare @ErrorCode nvarchar(50),@retmsg nvarchar(4000) select @ErrorCode='',@retmsg =''
|
${_script}
|
`
|
}
|
|
item.columns.forEach(cell => {
|
LText_field.push(`Select '${item.name}' as tablename,'${cell.field}' as fieldname,'${cell.datatype}' as field_type`)
|
})
|
return `Select '${item.name}' as tablename,'${window.btoa(window.encodeURIComponent(_sql))}' as LText,'${window.btoa(window.encodeURIComponent(_script))}' as Lcustomize,'${item.type}' as table_type,'${item.primaryKey}' as primary_key,'${item.par_tablename}' as par_tablename,'${item.foreign_key}' as foreign_key,'${index}' as Sort`
|
})
|
|
let param = {
|
func: 'sPC_Get_structured_data',
|
LText: LText.join(' union all '),
|
LText_field: LText_field.join(' union all ')
|
}
|
|
param.LText = Utils.formatOptions(param.LText)
|
param.LText_field = Utils.formatOptions(param.LText_field)
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt(param.LText, param.timestamp)
|
|
return param
|
}
|
|
/**
|
* @description 主表数据加载
|
*/
|
loadmaindata = (params) => {
|
let deffers = params.map(item => {
|
let componentId = item.componentId
|
delete item.componentId
|
return new Promise(resolve => {
|
Api.getLocalConfig(item).then(res => {
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
resolve(false)
|
} else {
|
res.componentId = componentId
|
resolve(res)
|
}
|
})
|
})
|
})
|
|
Promise.all(deffers).then(results => {
|
let _results = results.filter(Boolean)
|
|
this.setState({loadingview: false})
|
|
if (_results.length === results.length) {
|
console.log(_results)
|
}
|
|
// delete result.ErrCode
|
// delete result.ErrMesg
|
// delete result.message
|
// delete result.status
|
})
|
}
|
|
print = () => {
|
let bdhtml = window.document.body.innerHTML
|
let jubuData = document.getElementById('bill-print').innerHTML
|
window.document.body.innerHTML = jubuData
|
// document.getElementsByTagName('body')[0].style.zoom = 0.7
|
|
try {
|
if (window.ActiveXObject) {
|
let hkeyRoot
|
let hkeyPath
|
let hkeyKey
|
// eslint-disable-next-line
|
let RegWsh = new ActiveXObject('WScript.Shell')
|
|
hkeyRoot = 'HKEY_CURRENT_USER'
|
hkeyPath = '\\Software\\Microsoft\\Internet Explorer\\PageSetup\\'
|
|
// 设置页眉/脚的字体样式
|
hkeyKey = 'font'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, 'font-size: 12px; font-family: 黑体; line-height: 24px')
|
|
// 设置页眉
|
hkeyKey = 'header'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '打印编号')
|
|
// 设置页脚
|
hkeyKey = 'footer'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '&b第 &p 页/共 &P 页')
|
|
// 设置页边距(0.6 要乘以 2.5为实际打印的尺寸)
|
hkeyKey = 'margin_bottom'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '0.6')
|
|
hkeyKey = 'margin_left'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '0.6')
|
|
hkeyKey = 'margin_right'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '0.6')
|
|
hkeyKey = 'margin_top'
|
RegWsh.RegWrite(hkeyRoot + hkeyPath + hkeyKey, '0.6')
|
|
window.print()
|
} else {
|
window.print()
|
}
|
} catch (e) {
|
notification.warning({
|
top: 92,
|
message: '打印异常!',
|
duration: 5
|
})
|
}
|
|
window.document.body.innerHTML = bdhtml
|
window.location.reload()
|
}
|
|
getComponents = () => {
|
const { config, BID, data, dataManager } = this.state
|
|
return config.components.map(item => {
|
if (!item) return null
|
|
if (item.type === 'bar' || item.type === 'line') {
|
return (
|
<Col span={item.width} key={item.uuid}>
|
<AntvBarAndLine config={item} data={data} BID={BID} mainSearch={[]} menuType="" dataManager={dataManager} />
|
</Col>
|
)
|
} else if (item.type === 'pie') {
|
return (
|
<Col span={item.width} key={item.uuid}>
|
<AntvPie config={item} data={data} BID={BID} mainSearch={[]} menuType="" dataManager={dataManager} />
|
</Col>
|
)
|
} else if (item.type === 'card' && item.subtype === 'datacard') {
|
return (
|
<Col span={item.width} key={item.uuid}>
|
<DataCard config={item} data={data} BID={BID} mainSearch={[]} menuType="" dataManager={dataManager} />
|
</Col>
|
)
|
} else if (item.type === 'card' && item.subtype === 'propcard') {
|
return (
|
<Col span={item.width} key={item.uuid}>
|
<PropCard config={item} data={data} BID={BID} mainSearch={[]} menuType="" dataManager={dataManager} />
|
</Col>
|
)
|
} else {
|
return null
|
}
|
})
|
}
|
|
render() {
|
const { loadingview, viewlost, config } = this.state
|
|
return (
|
<div className="bill-print-wrap" >
|
{loadingview && <Spin size="large" />}
|
{config ? <div id="bill-print" style={config.style}><Row>{this.getComponents()}</Row></div> : null}
|
{viewlost ? <NotFount msg={this.state.lostmsg} /> : null}
|
{!loadingview && !viewlost ? <div className="print-button"><Button onClick={this.print}>打印</Button></div> : null}
|
</div>
|
)
|
}
|
}
|
|
export default BillPrint
|