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 Api from '@/api'
|
import Utils from '@/utils/utils.js'
|
import options from '@/store/options.js'
|
import zhCN from '@/locales/zh-CN/main.js'
|
import enUS from '@/locales/en-US/main.js'
|
import asyncSpinComponent from '@/utils/asyncSpinComponent'
|
import { updateForm } from '@/utils/utils-update.js'
|
import MKEmitter from '@/utils/events.js'
|
import MkIcon from '@/components/mk-icon'
|
// import './index.scss'
|
|
const MutilForm = asyncSpinComponent(() => import('@/tabviews/zshare/mutilform'))
|
const { confirm } = Modal
|
let socket = null
|
|
class PrintButton extends Component {
|
static propTpyes = {
|
BID: PropTypes.string, // 主表ID
|
BData: PropTypes.any, // 主表数据
|
selectedData: PropTypes.any, // 子表中选择数据
|
MenuID: PropTypes.string, // 菜单ID
|
btn: PropTypes.object, // 按钮
|
setting: PropTypes.any, // 页面通用设置
|
columns: PropTypes.array,
|
disabled: PropTypes.any, // 行按钮禁用
|
}
|
|
state = {
|
dict: sessionStorage.getItem('lang') !== 'en-US' ? zhCN : enUS,
|
visible: false,
|
formdata: null,
|
selines: null,
|
btnconfig: null,
|
confirmLoading: false,
|
loading: false,
|
disabled: false,
|
hidden: false,
|
autoMatic: false
|
}
|
|
UNSAFE_componentWillMount () {
|
const { btn, selectedData, BData } = this.props
|
let disabled = false
|
|
if (btn.controlField && selectedData && selectedData.length > 0) { // 表格中按钮隐藏控制
|
selectedData.forEach(item => {
|
let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
|
if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
|
disabled = true
|
}
|
})
|
this.setState({hidden: disabled && btn.control === 'hidden'})
|
} else 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 (this.props.disabled || disabled) {
|
this.setState({disabled: true})
|
}
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.props), fromJS(nextProps)) || !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
componentDidMount () {
|
const { btn } = this.props
|
|
MKEmitter.addListener('triggerBtnId', this.actionTrigger)
|
|
if (btn.autoMatic) {
|
MKEmitter.addListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
|
}
|
}
|
|
UNSAFE_componentWillReceiveProps (nextProps) {
|
const { btn, selectedData, BData } = this.props
|
|
let disabled = false
|
if (btn.controlField && !is(fromJS(nextProps.selectedData || []), fromJS(selectedData || []))) {
|
if (nextProps.selectedData && nextProps.selectedData.length > 0) { // 表格中按钮隐藏控制
|
nextProps.selectedData.forEach(item => {
|
let s = item[btn.controlField] !== undefined ? item[btn.controlField] + '' : ''
|
if (s === btn.controlVal || (btn.controlVal && btn.controlVal.split(',').includes(s))) {
|
disabled = true
|
}
|
})
|
}
|
this.setState({disabled, hidden: disabled && btn.control === 'hidden'})
|
} else 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 || disabled) {
|
this.setState({disabled: true})
|
} else {
|
this.setState({disabled: false})
|
}
|
}
|
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
MKEmitter.removeListener('triggerBtnId', this.actionTrigger)
|
MKEmitter.removeListener('triggerBtnPopSubmit', this.triggerBtnPopSubmit)
|
}
|
|
triggerBtnPopSubmit = (id) => {
|
const { btn } = this.props
|
|
if (btn.uuid !== id) return
|
|
this.handleOk()
|
}
|
|
/**
|
* @description 触发按钮操作
|
*/
|
actionTrigger = (triggerId, record, type) => {
|
const { BID, btn, selectedData, setting } = 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(selectedData || []), fromJS(record))) {
|
return
|
}
|
|
this.setState({autoMatic: type === 'autoMatic'})
|
|
let _this = this
|
let data = record || selectedData || []
|
|
if (btn.Ot !== 'notRequired' && data.length === 0) {
|
// 需要选择行时,校验数据
|
notification.warning({
|
top: 92,
|
message: this.state.dict['main.action.confirm.selectline'],
|
duration: 5
|
})
|
return
|
} else if (btn.Ot === 'requiredSgl' && data.length !== 1) {
|
// 需要选择单行时,校验数据
|
notification.warning({
|
top: 92,
|
message: this.state.dict['main.action.confirm.selectSingleLine'],
|
duration: 5
|
})
|
return
|
} else if (!['requiredSgl', 'notRequired', 'requiredOnce', 'required'].includes(btn.Ot)) {
|
// 数据选择类型校验
|
this.actionSettingError()
|
return
|
} else if (!btn.verify || !btn.verify.printMode) {
|
notification.warning({
|
top: 92,
|
message: '请完善打印验证信息!',
|
duration: 5
|
})
|
return
|
} else if (btn.intertype === 'system' && btn.verify.dataType === 'custom' && (!btn.verify.setting || btn.verify.columns.length === 0)) {
|
notification.warning({
|
top: 92,
|
message: '自定义打印数据请设置数据源!',
|
duration: 5
|
})
|
return
|
}
|
|
this.setState({
|
selines: data
|
})
|
|
if (btn.execMode === 'pop') {
|
let modal = this.state.btnconfig
|
if (!modal && btn.modal) {
|
modal = this.handleModelConfig(btn.modal)
|
}
|
|
this.setState({
|
loading: true,
|
btnconfig: modal
|
}, () => {
|
this.improveAction()
|
})
|
} else if (btn.execMode === 'prompt') {
|
this.setState({ loading: true })
|
confirm({
|
title: this.state.dict['main.action.confirm.tip'],
|
onOk() {
|
_this.triggerPrint(data)
|
},
|
onCancel() {
|
_this.setState({ loading: false })
|
}
|
})
|
} else {
|
this.triggerPrint(data)
|
}
|
|
if (window.GLOB.systemType === 'production') {
|
MKEmitter.emit('queryTrigger', {menuId: btn.uuid, name: '标签打印'})
|
}
|
}
|
|
triggerPrint = (data, formlist = []) => {
|
const { btn } = this.props
|
|
if (btn.verify.printMode === 'RFID') {
|
this.triggerRFIDPrint(data, formlist)
|
} else {
|
this.triggerNormalPrint(data, formlist)
|
}
|
}
|
|
/**
|
* @description 触发打印
|
*/
|
triggerNormalPrint = (data, formlist) => {
|
const { btn } = this.props
|
let formdata = {}
|
|
formlist.forEach(_data => {
|
let _key = _data.key.toLowerCase()
|
formdata[_key] = _data.value
|
})
|
|
let printlist = []
|
let templates = []
|
|
new Promise(resolve => {
|
if (btn.intertype === 'system' && btn.verify.dataType !== 'custom') { // 使用系统时,直接从表格或表单中选取数据
|
if (btn.Ot === 'notRequired') {
|
let printcell = {}
|
|
printcell.printType = formdata.printtype || ''
|
printcell.printCount = +(formdata.printcount || 1)
|
printcell.templateID = formdata.templateid || btn.verify.Template || ''
|
|
printcell.data = [formdata]
|
|
if (isNaN(printcell.printCount) || printcell.printCount < 1) {
|
printcell.printCount = 1
|
}
|
|
templates.push(printcell.templateID)
|
|
printlist.push(printcell)
|
} else {
|
data.forEach(cell => {
|
let _cell = {}
|
|
Object.keys(cell).forEach(key => {
|
let _key = key.toLowerCase()
|
_cell[_key] = cell[key]
|
})
|
|
_cell = {..._cell, ...formdata}
|
|
let printcell = {data: [_cell]}
|
|
printcell.printType = _cell.printtype || ''
|
printcell.printCount = +(_cell.printcount || 1)
|
printcell.templateID = _cell.templateid || btn.verify.Template || ''
|
|
if (isNaN(printcell.printCount) || printcell.printCount < 1) {
|
printcell.printCount = 1
|
}
|
|
templates.push(printcell.templateID)
|
|
printlist.push(printcell)
|
})
|
}
|
|
if (btn.verify.printMode === 'custom') {
|
this.execCustomPrint(printlist, formdata)
|
resolve(false)
|
} else {
|
resolve(true)
|
}
|
} else {
|
this.getprintdata(btn, data, formdata, formlist).then(result => {
|
if (!result.next) {
|
resolve(false)
|
return
|
}
|
|
// 自定义打印
|
if (btn.verify.printMode === 'custom') {
|
this.execCustomPrint(result.list, formdata)
|
resolve(false)
|
return
|
}
|
|
result.list.forEach(cell => {
|
// 系统打印数据,校验data字段
|
if (!cell.data || cell.data.length === 0) return
|
|
cell.data.forEach(item => {
|
let _item = {...formdata}
|
|
_item.printtype = cell.printtype || ''
|
_item.printcount = cell.printcount || 1
|
_item.templateid = cell.templateid || ''
|
|
Object.keys(item).forEach(key => {
|
let _key = key.toLowerCase()
|
_item[_key] = item[key]
|
})
|
|
let printcell = {data: [_item]}
|
|
printcell.printType = _item.printtype || ''
|
printcell.printCount = +(_item.printcount || 1)
|
printcell.templateID = _item.templateid || btn.verify.Template || ''
|
|
if (isNaN(printcell.printCount) || printcell.printCount < 1) {
|
printcell.printCount = 1
|
}
|
|
templates.push(printcell.templateID)
|
|
printlist.push(printcell)
|
})
|
})
|
|
resolve(true)
|
})
|
}
|
}).then(res => {
|
// 获取打印模板 getTemp
|
if (!res) return false
|
|
templates = Array.from(new Set(templates)) // 去重
|
|
let deffers = templates.map(tempId => {
|
return new Promise(resolve => {
|
let param = {
|
func: 's_PrintTemplateMGetData',
|
Type: 'Y',
|
// ID: tempId, // 添加模板时,保存及查询使用模板参数
|
PrintTempNO: tempId
|
}
|
|
if (window.GLOB.mainSystemApi) { // 从单点登录服务器取打印配置信息
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
|
Api.getSystemCacheConfig(param).then(result => {
|
result.tempId = tempId
|
resolve(result)
|
})
|
})
|
})
|
|
return Promise.all(deffers)
|
}).then(result => {
|
if (!result) return
|
|
let errorMsg = ''
|
let _temps = {}
|
let images = []
|
|
result.forEach(res => {
|
if (res.status && !errorMsg) {
|
let _temp = this.getPrintConfigParam(res)
|
|
if (_temp.error) {
|
errorMsg = {
|
ErrCode: 'N',
|
message: _temp.error,
|
ErrMesg: _temp.error,
|
status: false
|
}
|
} else {
|
images = [...images, ..._temp.imgs]
|
_temps[res.tempId] = _temp
|
}
|
} else if (!errorMsg) {
|
errorMsg = res
|
}
|
})
|
|
if (!errorMsg) {
|
if (images.length > 0) {
|
let errorUrls = []
|
images.forEach(url => {
|
let img = new Image()
|
img.onerror = () => {
|
errorUrls.push(url)
|
}
|
img.src = url
|
})
|
|
setTimeout(() => {
|
if (errorUrls.length > 0) {
|
notification.warning({
|
top: 92,
|
message: '模板中图片 ' + errorUrls.join(',') + ' 已失效!',
|
duration: 5
|
})
|
Object.keys(_temps).forEach(key => {
|
_temps[key].config.ReportHeader.Control = _temps[key].config.ReportHeader.Control.map(item => {
|
if (item.Type === 'image' && errorUrls.includes(item.Value)) {
|
item.Value = ''
|
}
|
return item
|
})
|
})
|
}
|
|
this.execPrint(printlist, _temps)
|
}, 500)
|
} else {
|
this.execPrint(printlist, _temps)
|
}
|
} else {
|
this.execError(errorMsg)
|
}
|
})
|
}
|
|
/**
|
* @description 触发RFID打印
|
*/
|
triggerRFIDPrint = (data, formlist) => {
|
const { btn } = this.props
|
let formdata = {}
|
let list = []
|
|
formlist.forEach(_data => {
|
formdata[_data.key] = _data.value
|
})
|
|
new Promise(resolve => {
|
if (btn.intertype === 'system' && btn.verify.dataType !== 'custom') { // 使用系统时,直接从表格或表单中选取数据
|
if (btn.Ot === 'notRequired') {
|
if (formlist.length > 0) {
|
list = [formdata]
|
}
|
} else {
|
data.forEach(cell => {
|
let _cell = {...cell, ...formdata}
|
list.push(_cell)
|
})
|
}
|
|
resolve(true)
|
} else {
|
this.getprintdata(btn, data, formdata, formlist).then(result => {
|
if (result.next) {
|
result.list.forEach(cell => {
|
// 系统打印数据,校验data字段
|
if (!cell.data || cell.data.length === 0) return
|
|
cell.data.forEach(m => {
|
let _cell = {...m, ...formdata}
|
list.push(_cell)
|
})
|
})
|
}
|
|
resolve(result.next)
|
})
|
}
|
}).then(res => {
|
// 获取打印模板 getTemp
|
if (!res) return false
|
|
if (list.length === 0) {
|
notification.warning({
|
top: 92,
|
message: '未获取到打印数据!',
|
duration: 5
|
})
|
return false
|
}
|
|
let param = {
|
func: 's_PrintTemplateMGetData',
|
Type: 'Y',
|
// ID: tempId, // 添加模板时,保存及查询使用模板参数
|
PrintTempNO: btn.verify.Template
|
}
|
|
if (window.GLOB.mainSystemApi) { // 从单点登录服务器取打印配置信息
|
param.rduri = window.GLOB.mainSystemApi
|
}
|
|
return Api.getSystemCacheConfig(param)
|
}).then(result => {
|
if (!result) {
|
this.setState({ loading: false })
|
return
|
}
|
|
if (!result.ConfigParam) {
|
notification.warning({
|
top: 92,
|
message: '未获取到打印模板信息!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else {
|
let configParam = ''
|
try {
|
configParam = JSON.parse(window.decodeURIComponent(window.atob(result.ConfigParam)))
|
} catch (e) {
|
configParam = ''
|
}
|
|
if (!configParam) {
|
notification.warning({
|
top: 92,
|
message: '打印模板解析错误!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else {
|
this.execRfidPrint(list, configParam)
|
}
|
}
|
})
|
}
|
|
/**
|
* @description 自定义打印,解析自定义js
|
*/
|
execCustomPrint = (printlist, formdata) => {
|
const { btn } = this.props
|
|
this.execSuccess({
|
ErrCode: '-1',
|
message: '',
|
ErrMesg: '',
|
status: true
|
})
|
|
try {
|
// eslint-disable-next-line
|
let func = new Function('data', 'form', 'printer', 'notification', 'Api', 'systemType', btn.verify.printFunc)
|
func(printlist, formdata, btn.verify, notification, Api, window.GLOB.systemType)
|
|
// 自定义打印示例
|
// let defaultPrinter = printer.defaultPrinter || 'lackprinter'
|
// let printers = {}
|
// let getuuid = () => {
|
// let uuid = []
|
// let _options = '0123456789abcdefghigklmnopqrstuv'
|
// for (let i = 0; i < 32; i++) {
|
// uuid.push(_options.substr(Math.floor(Math.random() * 0x20), 1))
|
// }
|
// return uuid.join('')
|
// }
|
// if (printer.printerTypeList && printer.printerTypeList.length > 0) {
|
// printer.printerTypeList.forEach(cell => {
|
// if (cell.printer) {
|
// printers[cell.Value] = cell.printer
|
// }
|
// })
|
// }
|
|
// let jdList = [];
|
// let jdNewList = [];
|
// let otherList = [];
|
// let _map = new Map()
|
// data.forEach(m => {
|
// if (!m.print_data || m.print_data.length === 0) return
|
|
// m.print_data.forEach(n => {
|
// if (n.InsideBill) {
|
// if (_map.has(n.InsideBill)) {
|
// return
|
// }
|
// _map.set(n.InsideBill, true)
|
// }
|
// if (n.CustomData) {
|
// n.CustomData = JSON.parse(n.CustomData.replace(/\n/g,"\\n").replace(/\r/g,"\\r"))
|
// }
|
|
// if (n.hasOwnProperty('StdTemplate')) {
|
// jdNewList.push(n);
|
// return
|
// } else if (!n.PrintData) {
|
// return
|
// }
|
|
// n.PrintData = JSON.parse(n.PrintData.replace(/\n/g,"\\n").replace(/\r/g,"\\r"))
|
// n.PrintData.data = {...form, ...n.PrintData.data}
|
|
// if (n.PrintData.ectype === 'jdpop') {
|
// jdList.push(n)
|
// } else {
|
// otherList.push(n)
|
// }
|
// })
|
// })
|
|
// if (jdList.length === 0 && otherList.length === 0 && jdNewList.length === 0) {
|
// notification.warning({
|
// top: 92,
|
// message: '无打印数据!',
|
// duration: 5
|
// })
|
// return
|
// }
|
|
// let execPrint = (list, linkUrl, type) => {
|
// let printdata = {};
|
// let printerList = [];
|
|
// if (type === 'jd') {
|
// printerList = list.map(m => {
|
// let _printer = defaultPrinter;
|
|
// if (m.printType && printers[m.printType]) {
|
// _printer = printers[m.printType];
|
// }
|
|
// return {
|
// orderType: "print",
|
// parameters: {
|
// printName: _printer === 'lackprinter' ? '' : _printer,
|
// tempUrl: m.StdTemplate,
|
// customTempUrl: m.CusTemplate,
|
// customData: [m.CustomData],
|
// printData: [m.PrintData]
|
// }
|
// }
|
// })
|
// } else {
|
// list.forEach(res => {
|
// let _printer = defaultPrinter
|
|
// if (res.printType && printers[res.printType]) {
|
// _printer = printers[res.printType]
|
// }
|
|
// printdata[_printer] = printdata[_printer] || []
|
|
// printdata[_printer].push(res)
|
// })
|
|
// Object.keys(printdata).forEach(printer => {
|
// let _documents = []
|
// printdata[printer].forEach(item => {
|
// let _cell = {
|
// documentID: getuuid(),
|
// contents: []
|
// }
|
|
// if (item.PrintData) {
|
// _cell.contents.push(item.PrintData)
|
// }
|
// if (item.CustomData) {
|
// _cell.contents.push(item.CustomData)
|
// }
|
|
// _documents.push(_cell)
|
// })
|
// printerList.push({
|
// cmd: 'print',
|
// requestID: '',
|
// version: '',
|
// task: {
|
// taskID: getuuid(),
|
// preview: false,
|
// printer: printer === 'lackprinter' ? '' : printer,
|
// documents: _documents
|
// }
|
// })
|
// })
|
// }
|
|
// let socket = new WebSocket('ws://' + linkUrl)
|
|
// // 打开Socket
|
// socket.onopen = () =>{
|
// printerList.forEach((cell, i) => {
|
// setTimeout(() => {
|
// socket.send(JSON.stringify(cell).replace(/\\r/g,"\r").replace(/\\n/g,"\n"))
|
// }, 1000 * i)
|
// });
|
|
// notification.success({
|
// top: 92,
|
// message: '打印请求已发出。',
|
// duration: 2
|
// })
|
// }
|
// // 监听消息
|
// socket.onmessage = (event) => {
|
// let data = ''
|
|
// if (event.data) {
|
// try {
|
// data = JSON.parse(event.data)
|
// } catch (e) {
|
// notification.warning({
|
// top: 92,
|
// message: event.data,
|
// duration: 10
|
// })
|
// data = ''
|
// }
|
// }
|
|
// if (data && data.message && !data.status) {
|
// notification.warning({
|
// top: 92,
|
// message: data.message,
|
// duration: 10
|
// })
|
// }
|
// }
|
|
// socket.onerror = () => {
|
// notification.warning({
|
// top: 92,
|
// message: '无法连接到:' + linkUrl,
|
// duration: 10
|
// })
|
// }
|
// }
|
|
// if (jdNewList.length > 0) {
|
// execPrint(jdNewList, '127.0.0.1:9113', 'jd');
|
// }
|
// if (jdList.length > 0) {
|
// execPrint(jdList, '127.0.0.1:13529')
|
// }
|
// if (otherList.length > 0) {
|
// execPrint(otherList, '127.0.0.1:13528')
|
// }
|
} catch (e) {
|
console.warn(e)
|
|
try {
|
// eslint-disable-next-line
|
let evalfunc = eval('(true && function (data, form, printer, notification, Api, systemType) {' + btn.verify.printFunc + '})')
|
evalfunc(printlist, formdata, btn.verify, notification, Api, window.GLOB.systemType)
|
} catch (error) {
|
console.warn(error)
|
notification.warning({
|
top: 92,
|
message: '自定义函数执行错误!',
|
duration: 5
|
})
|
}
|
}
|
}
|
|
/**
|
* @description 获取打印数据
|
*/
|
getprintdata = (btn, data, formdata, formlist) => {
|
const { setting, BID } = this.props
|
|
let _list = []
|
return new Promise(resolve => {
|
let params = []
|
|
if (btn.intertype === 'system' && btn.verify.dataType === 'custom') {
|
if (btn.Ot === 'notRequired') {
|
let _param = this.getDefaultSql(formlist, null, '')
|
|
params.push(_param)
|
} else if (btn.Ot === 'requiredSgl') {
|
let ID = ''
|
if (setting.primaryKey) {
|
ID = data[0][setting.primaryKey] || ''
|
}
|
|
let _param = this.getDefaultSql(formlist, data[0], ID)
|
|
params.push(_param)
|
} else if (btn.Ot === 'requiredOnce') {
|
let ID = ''
|
|
if (setting.primaryKey) {
|
let ids = data.map(d => { return d[setting.primaryKey]})
|
ids = ids.filter(Boolean)
|
ID = ids.join(',')
|
}
|
|
let _param = this.getDefaultSql(formlist, data[0], ID)
|
|
params.push(_param)
|
} else if (btn.Ot === 'required') {
|
params = data.map(cell => {
|
let ID = ''
|
if (setting.primaryKey) {
|
ID = cell[setting.primaryKey] || ''
|
}
|
|
return this.getDefaultSql(formlist, cell, ID)
|
})
|
}
|
} else {
|
if (btn.Ot === 'notRequired') {
|
let _param = { ...formdata }
|
|
if (BID) {
|
_param.BID = BID
|
}
|
|
params.push(_param)
|
} else if (btn.Ot === 'requiredSgl') {
|
let _param = { ...formdata }
|
|
if (setting.primaryKey) {
|
_param[setting.primaryKey] = data[0][setting.primaryKey]
|
}
|
|
if (BID) {
|
_param.BID = BID
|
}
|
|
params.push(_param)
|
} else if (btn.Ot === 'requiredOnce') {
|
let _param = { ...formdata }
|
|
if (setting.primaryKey) {
|
let ids = data.map(d => { return d[setting.primaryKey]})
|
ids = ids.filter(Boolean)
|
ids = ids.join(',')
|
|
_param[setting.primaryKey] = ids
|
}
|
|
if (BID) {
|
_param.BID = BID
|
}
|
|
params.push(_param)
|
} else if (btn.Ot === 'required') {
|
params = data.map((cell, index) => {
|
let _param = {}
|
|
if (setting.primaryKey) {
|
_param[setting.primaryKey] = cell[setting.primaryKey]
|
}
|
|
if (BID) {
|
_param.BID = BID
|
}
|
|
let _cell = {}
|
if (index !== 0) {
|
Object.keys(cell).forEach(key => {
|
_cell[key.toLowerCase()] = cell[key]
|
})
|
}
|
|
formlist.forEach(_data => {
|
if (index !== 0 && _data.readin && _cell.hasOwnProperty(_data.key.toLowerCase())) {
|
_param[_data.key] = _cell[_data.key.toLowerCase()]
|
} else {
|
_param[_data.key] = _data.value
|
}
|
})
|
return _param
|
})
|
}
|
}
|
|
if (btn.intertype === 'inner' || btn.intertype === 'system') {
|
if (btn.intertype === 'inner') {
|
params = params.map(_param => {
|
_param.func = btn.innerFunc
|
|
return _param
|
})
|
}
|
|
if (params.length <= 20) {
|
let deffers = params.map(par => {
|
return new Promise(resolve => {
|
Api.genericInterface(par).then(res => {
|
resolve(res)
|
})
|
})
|
})
|
Promise.all(deffers).then(result => {
|
let errorMsg = ''
|
result.forEach(res => {
|
if (!res.status) {
|
errorMsg = res
|
}
|
})
|
if (!errorMsg) {
|
resolve({next: true, list: result.map(res => {
|
Object.keys(res).forEach(key => {
|
let _key = key.toLowerCase()
|
if (['templateid', 'printtype', 'printcount'].includes(_key)) {
|
res[_key] = res[key]
|
}
|
})
|
|
return res
|
})})
|
} else {
|
this.execError(errorMsg)
|
resolve({next: false, list: []})
|
}
|
})
|
} else {
|
this.printInnerLoopRequest(params, btn, _list, resolve)
|
}
|
} else {
|
this.printOuterLoopRequest(params, btn, _list, resolve)
|
}
|
})
|
}
|
|
/**
|
* @description 获取默认存储过程请求参数
|
*/
|
getDefaultSql = (formlist, data, ID) => {
|
const { BID, btn, columns } = this.props
|
|
let arrFields = btn.verify.columns.map(col => col.field).join(',')
|
|
let param = {
|
func: 'sPC_Get_TableData',
|
obj_name: 'data',
|
exec_type: 'y',
|
arr_field: arrFields,
|
default_sql: btn.verify.setting.defaultSql
|
}
|
|
if (BID) {
|
param.BID = BID
|
}
|
if (ID) {
|
param.ID = ID
|
}
|
|
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') || ''
|
|
let _dataresource = btn.verify.setting.dataresource
|
let _customScript = ''
|
|
btn.verify.scripts && btn.verify.scripts.forEach(script => {
|
if (script.status !== 'false') {
|
_customScript += `
|
${script.sql}
|
`
|
}
|
})
|
|
if (btn.verify.setting.defaultSql === 'false') {
|
_dataresource = ''
|
}
|
|
if (/\s/.test(_dataresource)) {
|
_dataresource = '(' + _dataresource + ') tb'
|
}
|
|
if (sessionStorage.getItem('dataM') === 'true') { // 数据权限
|
_dataresource = _dataresource.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
|
_dataresource = _dataresource.replace(/@\$/ig, '*/')
|
_customScript = _customScript.replace(/\$@/ig, '/*').replace(/@datam@/ig, '\'Y\'')
|
_customScript = _customScript.replace(/@\$/ig, '*/')
|
} else {
|
_dataresource = _dataresource.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
_customScript = _customScript.replace(/@\$|\$@/ig, '').replace(/@datam@/ig, '\'\'')
|
}
|
|
let initsql = `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}'
|
`
|
|
let _vars = []
|
let _initvars = []
|
let _declare = []
|
// 获取字段键值对
|
formlist.forEach(form => {
|
let _key = form.key.toLowerCase()
|
|
if (_vars.includes(_key)) return
|
|
_vars.push(_key)
|
|
if (form.type === 'number' || form.type === 'rate') {
|
let val = form.value
|
if (isNaN(val)) {
|
val = 0
|
}
|
_initvars.push(`@${_key}=${val}`)
|
} else if (['date', 'datemonth'].includes(form.type)) {
|
_initvars.push(`@${_key}='${form.value || '1949-10-01'}'`)
|
} else {
|
_initvars.push(`@${_key}='${form.value}'`)
|
}
|
|
if (form.fieldlen && form.fieldlen > 2048) {
|
form.fieldlen = 'max'
|
}
|
|
let _type = `nvarchar(${form.fieldlen})`
|
|
if (form.type.match(/date/ig)) {
|
_type = 'datetime'
|
} else if (form.type === 'number') {
|
_type = `decimal(18,${form.fieldlen})`
|
} else if (form.type === 'rate') {
|
_type = `decimal(18,2)`
|
}
|
|
_declare.push(`@${_key} ${_type}`)
|
})
|
|
if (_declare.length > 0) {
|
initsql += `/* 表单变量 */
|
Declare ${_declare.join(',')}
|
select ${_initvars.join(',')}
|
`
|
|
_declare = []
|
_initvars = []
|
}
|
|
if (data && columns && columns.length > 0) {
|
let datavars = {}
|
|
Object.keys(data).forEach(key => {
|
datavars[key.toLowerCase()] = data[key]
|
})
|
|
columns.forEach(col => {
|
if (!col.field || !col.datatype) return
|
|
let _key = col.field.toLowerCase()
|
|
if (_vars.includes(_key)) return
|
|
let _val = datavars.hasOwnProperty(_key) ? datavars[_key] : ''
|
|
if (/^date/ig.test(col.datatype) && !_val) {
|
_val = '1949-10-01'
|
}
|
|
_initvars.push(`@${_key}='${_val}'`)
|
_declare.push(`@${_key} ${col.datatype}`)
|
})
|
}
|
|
if (_declare.length > 0) {
|
initsql += `/* 显示列变量 */
|
Declare ${_declare.join(',')}
|
select ${_initvars.join(',')}
|
`
|
}
|
|
|
if (_customScript) {
|
_customScript = `${initsql}
|
${_customScript}
|
`
|
}
|
|
_dataresource = _dataresource.replace(/@select\$|\$select@/ig, '')
|
_customScript = _customScript.replace(/@select\$|\$select@/ig, '')
|
_dataresource = _dataresource.replace(/\$sum@/ig, '/*')
|
_dataresource = _dataresource.replace(/@sum\$/ig, '*/')
|
_customScript = _customScript.replace(/\$sum@/ig, '/*')
|
_customScript = _customScript.replace(/@sum\$/ig, '*/')
|
|
_dataresource = _dataresource.replace(/@ID@/ig, `'${ID}'`)
|
_customScript = _customScript.replace(/@ID@/ig, `'${ID}'`)
|
_dataresource = _dataresource.replace(/@BID@/ig, `'${BID || ''}'`)
|
_customScript = _customScript.replace(/@BID@/ig, `'${BID || ''}'`)
|
_dataresource = _dataresource.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
|
_customScript = _customScript.replace(/@LoginUID@/ig, `'${sessionStorage.getItem('LoginUID') || ''}'`)
|
_dataresource = _dataresource.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
|
_customScript = _customScript.replace(/@SessionUid@/ig, `'${localStorage.getItem('SessionUid') || ''}'`)
|
_dataresource = _dataresource.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
|
_customScript = _customScript.replace(/@UserID@/ig, `'${sessionStorage.getItem('UserID') || ''}'`)
|
_dataresource = _dataresource.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
|
_customScript = _customScript.replace(/@Appkey@/ig, `'${window.GLOB.appkey || ''}'`)
|
|
|
let LText = ''
|
|
if (_dataresource) {
|
LText = `/*system_query*/select ${arrFields} from (select ${arrFields} ,ROW_NUMBER() over(order by ${btn.verify.setting.order}) as rows from ${_dataresource}) tmptable order by tmptable.rows `
|
}
|
|
if (_customScript) {
|
if (LText) {
|
LText = `${LText}
|
aaa:
|
if @ErrorCode!=''
|
insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
|
`
|
} else {
|
_customScript = `${_customScript}
|
aaa:
|
if @ErrorCode!=''
|
insert into tmp_err_retmsg (ID, ErrorCode, retmsg, CreateUserID) select @time_id@,@ErrorCode, @retmsg,@UserID@
|
`
|
}
|
} else {
|
LText = `${initsql}
|
${LText}
|
`
|
}
|
|
// 测试系统打印查询语句
|
if (window.GLOB.debugger === true || (window.debugger === true && options.sysType !== 'cloud')) {
|
_customScript && console.info(`${btn.logLabel ? `/*${btn.logLabel} 自定义脚本*/\n` : ''}${LText ? '' : '/*不执行默认sql*/\n'}${_customScript}`)
|
LText && console.info(`${btn.logLabel ? `/*${btn.logLabel} 数据源*/\n` : ''}` + LText.replace(/\n\s{8}/ig, '\n'))
|
}
|
|
if (btn.logLabel) {
|
param.menuname = btn.logLabel
|
}
|
|
param.custom_script = Utils.formatOptions(_customScript)
|
param.LText = Utils.formatOptions(LText)
|
|
param.timestamp = moment().format('YYYY-MM-DD HH:mm:ss')
|
param.secretkey = Utils.encrypt('', param.timestamp)
|
|
if (window.GLOB.probation) {
|
param.s_debug_type = 'Y'
|
}
|
|
return param
|
}
|
|
/**
|
* @description 外部请求循环执行
|
*/
|
printOuterLoopRequest = (params, btn, _list, _resolve) => {
|
let param = params.shift()
|
let _outParam = null
|
|
new Promise(resolve => {
|
// 内部请求
|
if (btn.innerFunc) {
|
param.func = btn.innerFunc
|
// 存在内部函数时,数据预处理
|
Api.genericInterface(param).then(res => {
|
if (res.status) {
|
delete res.ErrCode
|
delete res.ErrMesg
|
delete res.message
|
delete res.status
|
|
// 使用处理后的数据调用外部接口
|
let keys = Object.keys(res) // 提交外部接口前,添加BID
|
if (this.props.BID && keys.filter(key => key.toLowerCase() === 'bid').length === 0) {
|
res.BID = this.props.BID
|
}
|
|
resolve(res)
|
} else {
|
this.execError(res)
|
resolve(false)
|
_resolve({next: false, list: []})
|
}
|
})
|
} else {
|
resolve(param)
|
}
|
}).then(res => {
|
if (!res) return
|
// 外部请求
|
_outParam = JSON.parse(JSON.stringify(res))
|
|
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
|
}
|
|
return Api.genericInterface(res)
|
}).then(response => {
|
if (!response) return
|
|
if (btn.callbackFunc) {
|
// 存在回调函数时,调用
|
delete response.message
|
delete response.status
|
|
response.func = btn.callbackFunc
|
|
let _callbackparam = {..._outParam, ...response}
|
|
return Api.genericInterface(_callbackparam)
|
} else if (response.status) {
|
Object.keys(response).forEach(key => {
|
let _key = key.toLowerCase()
|
if (['templateid', 'printtype', 'printcount'].includes(_key)) {
|
response[_key] = response[key]
|
}
|
})
|
|
_list.push(response)
|
|
// 一次请求成功,进行下一项请求
|
if (params.length === 0) {
|
_resolve({next: true, list: _list})
|
} else {
|
this.printOuterLoopRequest(params, btn, _list, _resolve)
|
}
|
} else {
|
this.execError(response)
|
_resolve({next: false, list: []})
|
}
|
}).then(response => {
|
if (!response) return
|
|
if (response.status) {
|
Object.keys(response).forEach(key => {
|
let _key = key.toLowerCase()
|
if (['templateid', 'printtype', 'printcount'].includes(_key)) {
|
response[_key] = response[key]
|
}
|
})
|
|
_list.push(response)
|
|
// 一次请求成功,进行下一项请求
|
if (params.length === 0) {
|
_resolve({next: true, list: _list})
|
} else {
|
this.printOuterLoopRequest(params, btn, _list, _resolve)
|
}
|
} else {
|
this.execError(response)
|
_resolve({next: false, list: []})
|
}
|
})
|
}
|
|
/**
|
* @description 内部请求循环执行
|
*/
|
printInnerLoopRequest = (params, btn, _list, _resolve) => {
|
let param = params.shift()
|
|
Api.genericInterface(param).then(res => {
|
if (res.status) {
|
Object.keys(res).forEach(key => {
|
let _key = key.toLowerCase()
|
if (['templateid', 'printtype', 'printcount'].includes(_key)) {
|
res[_key] = res[key]
|
}
|
})
|
_list.push(res)
|
|
if (params.length === 0) {
|
_resolve({next: true, list: _list})
|
} else {
|
this.printInnerLoopRequest(params, btn, _list, _resolve)
|
}
|
} else {
|
this.execError(res)
|
_resolve({next: false, list: []})
|
}
|
})
|
}
|
|
getPrintConfigParam = (res) => {
|
let error = '' // 错误信息
|
let configParam = '' // 模板配置信息
|
let _configparam = '' // 打印配置信息
|
let fields = [] // 模板中所需字段
|
let nonEFields = [] // 非空字段
|
let imgs = []
|
|
if (!res.ConfigParam) {
|
error = '未获取到打印模板信息!'
|
} else {
|
try {
|
configParam = JSON.parse(window.decodeURIComponent(window.atob(res.ConfigParam)))
|
} catch (e) {
|
configParam = ''
|
}
|
|
if (!configParam) {
|
error = '打印模板解析错误!'
|
} else {
|
let control = []
|
let rotate = configParam.rotate || 0
|
let offsetTop = 0
|
let offsetLeft = 0
|
|
if (rotate === 90) {
|
offsetTop = configParam.width - configParam.height
|
} else if (rotate === 270) {
|
offsetLeft = configParam.height - configParam.width
|
}
|
|
configParam.elements.forEach(element => {
|
let _field = element.field || ''
|
|
if (_field === 'other_field') {
|
_field = element.cusfield || ''
|
}
|
|
let item = {
|
Name: element.name || '',
|
Type: element.type,
|
Value: element.value || '',
|
Field: _field.toLowerCase(),
|
Left: element.left + offsetLeft,
|
Top: element.top + offsetTop,
|
Width: element.width,
|
Height: element.height,
|
Rotate: rotate,
|
// Rotate: element.rotate,
|
BorderSize: element.borderSize / 10,
|
BorderColor: element.borderColor,
|
Align: element.align,
|
VerticalAlign: element.vertialAlign,
|
BackColor: element.background,
|
ForeColor: 'black'
|
}
|
|
if (!item.Width || !item.Height) {
|
item.Type = 'line'
|
item.Value = ''
|
item.Field = ''
|
item.FontFamily = element.fontFamily || ''
|
item.FontSize = element.fontSize || ''
|
item.FontStyle = (!element.fontWeight || element.fontWeight === 'normal') ? 'regular' : element.fontWeight
|
item.Padding = 0
|
item.Trimming = ''
|
if (!item.Width) {
|
item.Width = item.BorderSize
|
item.Left = item.Left - item.Width + 0.1
|
} else if (!item.Height) {
|
item.Height = item.BorderSize
|
item.Top = item.Top - item.Height + 0.1
|
}
|
item.BackColor = element.borderColor
|
item.BorderSize = 0
|
} else if (item.Type === 'image') {
|
item.ImageWidth = element.imgWidth
|
item.ImageHeight = element.imgHeight
|
item.Trimming = ''
|
if (!item.Field) {
|
if (element.productValue && window.GLOB.systemType === 'production') {
|
item.Value = element.productValue
|
imgs.push(item.Value)
|
} else if (item.Value) {
|
imgs.push(item.Value)
|
}
|
}
|
} else if (item.Type === 'text') {
|
item.FontFamily = element.fontFamily
|
item.FontSize = element.fontSize
|
item.FontStyle = element.fontWeight === 'normal' ? 'regular' : element.fontWeight
|
item.Padding = element.padding / 2
|
item.Trimming = ''
|
} else if (item.Type === 'barcode') {
|
item.BarcodeType = element.barcodeType
|
item.BarcodeWidth = element.barcodeWidth
|
item.BarcodeHeight = element.barcodeHeight
|
item.BarcodeLabel = element.barcodeLabel
|
item.LabelSize = element.fontSize
|
} else if (item.Type === 'qrcode') {
|
item.Type = 'barcode'
|
item.BarcodeType = element.qrcodeType
|
item.BarcodeWidth = element.qrcodeWidth
|
item.BarcodeHeight = element.qrcodeWidth
|
item.BarcodeLabel = false
|
}
|
|
if (item.Field) {
|
fields.push(item.Field)
|
// 条码二维码字段不可为空
|
if (item.Type === 'qrcode' || item.Type === 'barcode') {
|
nonEFields.push(item.Field)
|
}
|
}
|
|
control.push(item)
|
})
|
|
let down = false
|
|
if (rotate === 90 || rotate === 270) {
|
down = true
|
}
|
|
_configparam = {
|
Version: '',
|
Title: configParam.name,
|
Author: sessionStorage.getItem('UserID'),
|
Description: configParam.remark,
|
PrintTempNO: configParam.PrintTempNO,
|
PageSetting: {
|
Width: down ? configParam.height : configParam.width,
|
Height: down ? configParam.width : configParam.height,
|
Left: '0',
|
Right: '0',
|
Top: '0',
|
Bottom: '0',
|
Landscape: false
|
},
|
PageHeader: [],
|
ReportHeader: {
|
Control: control
|
},
|
ReportFooter: [],
|
PageFooter: []
|
}
|
}
|
}
|
|
return {
|
error: error,
|
config: _configparam,
|
fields: Array.from(new Set(fields)),
|
nonEFields: Array.from(new Set(nonEFields)),
|
imgs: imgs
|
}
|
}
|
|
execRfidPrint = (list, template) => {
|
const { btn } = this.props
|
|
list = list.filter(item => !!item[btn.verify.valueField])
|
|
if (list.length === 0) {
|
notification.warning({
|
top: 92,
|
message: '未获取到打印数据!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
return
|
}
|
|
let width = template.width
|
let height = template.height
|
let gap = template.gap || 0
|
let mm = 12
|
|
if (btn.verify.DPI === '203') {
|
mm = 8
|
} else if (btn.verify.DPI === '600') {
|
mm = 24
|
}
|
|
let items = []
|
template.elements.forEach(element => {
|
if (!['text', 'barcode', 'qrcode'].includes(element.type)) return
|
|
let _field = element.field
|
|
if (_field === 'other_field') {
|
_field = element.cusfield || ''
|
}
|
|
let item = {
|
type: element.type,
|
value: element.value || '',
|
field: _field
|
}
|
|
if (item.type === 'text') {
|
let size = Math.floor(4 * mm * (element.fontSize || 12) / 12)
|
let fontWeight = 400
|
if (element.fontWeight === 'bold') {
|
fontWeight = 600
|
} else if (element.fontWeight === 'bolder') {
|
fontWeight = 800
|
} else if (element.fontWeight === 'lighter') {
|
fontWeight = 300
|
}
|
item.draw = `${element.left * mm},${element.top * mm},${size},0,${element.fontFamily || '微软雅黑'},${element.align === 'center' ? 5 : 1},${fontWeight},0,0,0,`
|
} else if (item.type === 'barcode') {
|
let codeType = 1
|
if (element.barcodeType === 'EAN13') {
|
codeType = 'E30'
|
}
|
let narrowWidth = element.narrowWidth || 2
|
let horizontal = element.narrowWidth || 2
|
let vertical = Math.ceil(element.barcodeHeight * mm)
|
|
item.draw = `${element.left * mm},${element.top * mm},0,${codeType},${narrowWidth},${horizontal},${vertical},${element.barcodeLabel === 'true' ? 'B' : 'N'},`
|
} else if (item.type === 'qrcode') {
|
let r = Math.ceil(element.qrcodeWidth / 2)
|
|
item.draw = `${element.left * mm},${element.top * mm},0,0,0,${r},0,0,8,`
|
}
|
|
items.push(item)
|
})
|
|
let ip = '192.168.1.2'
|
let params = list.map(cell => {
|
let array = []
|
let value = cell[btn.verify.valueField]
|
|
if (btn.verify.linkType !== 'USB') {
|
array.push({PTK_Connect_Timer: `${ip},${btn.verify.port},5`}); // 打开打印机网络端口
|
} else {
|
array.push({PTK_OpenUSBPort: btn.verify.port}); // 打开打印机USB端口
|
}
|
|
array.push({PTK_ClearBuffer: ''}); // 清空缓存
|
array.push({PTK_SetDirection: 'B'}); // 设置打印方向
|
array.push({PTK_SetLabelHeight: height * mm + ',' + gap * mm + ',' + 0 + ',' + false}); // 设置标签高度、间隙及偏移
|
array.push({PTK_SetLabelWidth: width * mm}); // 设置标签宽度
|
array.push({PTK_SetRFID: '0,0,0,0,0'}); // UHF RFID打印设置
|
array.push({PTK_RWRFIDLabel: '1,0,0,4,1,' + value});
|
|
items.forEach(m => {
|
let val = ''
|
if (m.field) {
|
val = cell[m.field]
|
} else {
|
val = m.value
|
}
|
|
if (!val && val !== 0) return
|
|
if (m.type === 'text') {
|
array.push({PTK_DrawText_TrueType: m.draw + val});
|
} else if (m.type === 'barcode') {
|
array.push({PTK_DrawBarcode: m.draw + val});
|
} else if (m.type === 'qrcode') {
|
array.push({PTK_DrawBar2D_QR: m.draw + val});
|
}
|
})
|
|
array.push({PTK_PrintLabel: '1,1'});
|
array.push({PTK_CloseUSBPort: ''}); // 关闭USB通讯端口
|
|
return {
|
reqParam: '1',
|
printparams: JSON.stringify(array)
|
}
|
})
|
|
this.loopRFIDPrint(params)
|
}
|
|
loopRFIDPrint = (params) => {
|
let param = params.shift()
|
|
Api.postekPrint(param).then(res => {
|
if (res.retval === '0') {
|
if (params.length === 0) {
|
this.execSuccess({ ErrCode: 'S', message: '', ErrMesg: '打印请求已发出。', status: true })
|
} else {
|
setTimeout(() => {
|
this.loopRFIDPrint(params)
|
}, 200)
|
}
|
} else {
|
if (res.retval === '30021') {
|
res.msg = res.msg.replace(/PTK_ClearBuffer[\s\S]*/, '')
|
}
|
|
this.execError({ErrCode: 'N', message: res.msg})
|
}
|
})
|
}
|
|
execPrint = (list, template) => {
|
const { btn } = this.props
|
let _errors = []
|
|
let defaultPrinter = btn.verify.defaultPrinter || 'lackprinter'
|
let printers = {}
|
if (btn.verify.printerTypeList && btn.verify.printerTypeList.length > 0) {
|
btn.verify.printerTypeList.forEach(cell => {
|
if (cell.printer) {
|
printers[cell.Value] = cell.printer
|
}
|
})
|
}
|
|
let printdata = {}
|
|
list.forEach(res => {
|
let _printer = defaultPrinter
|
|
if (res.printType && printers[res.printType]) {
|
_printer = printers[res.printType]
|
}
|
|
printdata[_printer] = printdata[_printer] || []
|
|
printdata[_printer].push(res)
|
})
|
|
let printerList = []
|
|
Object.keys(printdata).forEach(printer => {
|
Object.keys(template).forEach(key => {
|
let _datalist = printdata[printer].filter(cell => cell.templateID === key)
|
|
if (_datalist.length === 0) return
|
|
let _data = []
|
_datalist.forEach(res => {
|
res.data.forEach(_cell => {
|
for (let i = 0; i < res.printCount; i++) {
|
_data.push(_cell)
|
}
|
})
|
})
|
|
let lacks = []
|
let emptys = []
|
|
_data.forEach(d => {
|
template[key].fields.forEach(f => {
|
if (!d.hasOwnProperty(f)) {
|
lacks.push(f)
|
} else if (template[key].nonEFields.includes(f) && !d[f] && d[f] !== 0) {
|
emptys.push(f)
|
}
|
})
|
})
|
|
if (lacks.length > 0 || emptys.length > 0) {
|
_errors.push({
|
title: template[key].config.Title,
|
lacks: lacks,
|
emptys: emptys
|
})
|
}
|
|
let results = []
|
let num = 100
|
for(let i = 0, len = _data.length; i < len; i += num){
|
results.push(_data.slice(i, i + num))
|
}
|
|
results.forEach(result => {
|
let _cell = {
|
documentID: Utils.getuuid(),
|
contents: [
|
{
|
data: result,
|
templateURL: JSON.stringify(template[key].config)
|
}
|
]
|
}
|
|
printerList.push({
|
cmd: 'print',
|
requestID: Utils.getuuid(),
|
version: Utils.getuuid(),
|
task: {
|
taskID: Utils.getuuid(),
|
preview: false,
|
printer: printer === 'lackprinter' ? '' : printer,
|
documents: [_cell]
|
}
|
})
|
})
|
})
|
})
|
|
if (list.length === 0) {
|
if (btn.verify.emptyTip === 'false') {
|
this.execSuccess({
|
ErrCode: '-1',
|
message: '未获取到打印信息!',
|
ErrMesg: '',
|
status: true
|
})
|
} else {
|
this.execError({
|
ErrCode: 'N',
|
message: '未获取到打印信息!',
|
ErrMesg: '',
|
status: false
|
})
|
}
|
return
|
} else if (_errors.length > 0) {
|
let lackerror = []
|
let emptyerror = []
|
|
_errors.forEach(err => {
|
if (err.lacks.length > 0) {
|
lackerror.push(`数据中未获取到模板(${err.title})${err.lacks.join('、')} 字段`)
|
}
|
if (err.emptys.length > 0) {
|
emptyerror.push(`数据中模板(${err.title}) ${err.emptys.join('、')} 字段不可为空`)
|
}
|
})
|
|
let msg = []
|
if (lackerror.length > 0) {
|
msg.push(lackerror.join(' ; '))
|
}
|
|
if (emptyerror.length > 0) {
|
msg.push(emptyerror.join(' ; '))
|
}
|
|
this.execError({
|
ErrCode: 'N',
|
message: msg.join(' ; ') + ' !',
|
ErrMesg: '',
|
status: false
|
})
|
return
|
}
|
|
if (!socket || socket.readyState !== 1 || socket.url !== 'ws://' + btn.verify.linkUrl) {
|
socket = new WebSocket('ws://' + btn.verify.linkUrl)
|
} else {
|
this.syncMessageSend(printerList)
|
|
this.execSuccess({
|
ErrCode: 'S',
|
message: '',
|
ErrMesg: '打印请求已发出。',
|
status: true
|
})
|
}
|
|
// 打开Socket
|
socket.onopen = () =>{
|
this.syncMessageSend(printerList)
|
|
this.execSuccess({
|
ErrCode: 'S',
|
message: '',
|
ErrMesg: '打印请求已发出。',
|
status: true
|
})
|
}
|
// 监听消息
|
socket.onmessage = (event) => {
|
let data = ''
|
|
if (event.data) {
|
try {
|
data = JSON.parse(event.data)
|
} catch (e) {
|
this.execError({
|
ErrCode: 'N',
|
message: event.data,
|
ErrMesg: '',
|
status: false
|
})
|
|
data = ''
|
}
|
}
|
|
// if (data && data.cmd === 'getPrinters' && data.status) {
|
// printerList = printerList.map(cell => {
|
// if (cell.task.printer === 'lackprinter') {
|
// cell.task.printer = data.defaultPrinter
|
// }
|
// return cell
|
// })
|
|
// this.syncMessageSend(printerList)
|
|
// this.execSuccess({
|
// ErrCode: 'S',
|
// message: '',
|
// ErrMesg: '打印请求已发出。',
|
// status: true
|
// })
|
// } else if (data && data.message && !data.status) {
|
if (data && data.message && !data.status) {
|
this.execError({
|
ErrCode: 'N',
|
message: data.message,
|
ErrMesg: '',
|
status: false
|
})
|
}
|
}
|
|
socket.onerror = () => {
|
this.execError({
|
ErrCode: 'N',
|
message: '无法连接到:' + btn.verify.linkUrl,
|
ErrMesg: '',
|
status: false
|
})
|
}
|
}
|
|
syncMessageSend = (list) => {
|
let param = list.shift()
|
|
if (socket && param) {
|
socket.send(JSON.stringify(param))
|
}
|
|
if (list && list.length > 0) {
|
setTimeout(() => {this.syncMessageSend(list)}, 3000)
|
}
|
}
|
/**
|
* @description 操作成功后处理
|
* 1、excel导出,成功后取消导出按钮加载中状态
|
* 2、状态码为 S 时,显示成功信息后系统默认信息
|
* 3、状态码为 -1 时,不显示任何信息
|
* 4、模态框执行成功后是否关闭
|
* 5、通知主列表刷新
|
*/
|
execSuccess = (res) => {
|
const { btn } = this.props
|
const { autoMatic, btnconfig } = this.state
|
|
if ((res.ErrCode === 'S' || !res.ErrCode) || autoMatic) { // 执行成功
|
notification.success({
|
top: 92,
|
message: res.ErrMesg || this.state.dict['main.action.confirm.success'],
|
duration: btn.verify && btn.verify.stime ? btn.verify.stime : 2
|
})
|
} else if (res.ErrCode === 'Y') { // 执行成功
|
Modal.success({
|
title: res.ErrMesg || this.state.dict['main.action.confirm.success']
|
})
|
} else if (res.ErrCode === '-1') { // 完成后不提示
|
|
}
|
|
if (autoMatic || !btnconfig || btnconfig.setting.finish !== 'unclose') {
|
this.setState({
|
visible: false
|
})
|
}
|
|
this.setState({
|
loading: false,
|
confirmLoading: false
|
})
|
|
if (autoMatic) {
|
MKEmitter.emit('autoExecOver', btn.uuid, 'success')
|
return
|
}
|
|
if (btn.execSuccess !== 'never') {
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execSuccess, btn, '', this.state.selines)
|
}
|
}
|
|
/**
|
* @description 操作失败后处理
|
* 1、状态码为 E、N、F、NM 时,显示相应提示信息
|
* 2、excel导出,失败后取消导出按钮加载中状态
|
* 3、通知主列表刷新
|
*/
|
execError = (res) => {
|
const { btn } = this.props
|
const { btnconfig, autoMatic } = this.state
|
|
if (res.ErrCode === 'E' && !autoMatic) {
|
Modal.error({
|
title: res.message || res.ErrMesg,
|
})
|
} else if (res.ErrCode === 'N' || autoMatic) {
|
notification.error({
|
top: 92,
|
message: res.message || res.ErrMesg,
|
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 || res.ErrMesg,
|
duration: btn.verify && btn.verify.ftime ? btn.verify.ftime : 10
|
})
|
} else if (res.ErrCode === 'NM') {
|
message.error(res.message || res.ErrMesg)
|
}
|
|
this.setState({
|
loading: false,
|
confirmLoading: false
|
})
|
|
if (autoMatic) {
|
MKEmitter.emit('autoExecOver', btn.uuid, 'error')
|
return
|
}
|
|
if (btnconfig && btnconfig.setting && btnconfig.setting.errFocus) {
|
MKEmitter.emit('mkFC', 'focus', btnconfig.setting.errFocus)
|
}
|
|
if (btn.execError !== 'never') {
|
MKEmitter.emit('refreshByButtonResult', btn.$menuId, btn.execError, btn, '', this.state.selines)
|
}
|
}
|
|
/**
|
* @description 按钮配置信息错误提示
|
*/
|
actionSettingError = () => {
|
notification.warning({
|
top: 92,
|
message: this.state.dict['main.action.settingerror'],
|
duration: 5
|
})
|
}
|
|
handleModelConfig = (config) => {
|
let roleId = sessionStorage.getItem('role_id') || '' // 角色ID
|
config.fields = config.fields.map(cell => {
|
// 数据源sql语句,预处理,权限黑名单字段设置为隐藏表单
|
if (['select', 'link', 'multiselect', 'radio', 'checkbox', 'checkcard'].includes(cell.type) && cell.resourceType === '1') {
|
let _option = Utils.getSelectQueryOptions(cell)
|
|
cell.base_sql = _option.sql
|
cell.arr_field = _option.field
|
}
|
|
// 字段权限黑名单
|
if (!cell.blacklist || cell.blacklist.length === 0) return cell
|
if (cell.blacklist.filter(v => roleId.indexOf(v) > -1).length > 0) {
|
cell.hidden = 'true'
|
}
|
|
return cell
|
})
|
return config
|
}
|
|
/**
|
* @description 获取按钮配置信息
|
*/
|
improveAction = () => {
|
const { btn } = this.props
|
const { btnconfig, autoMatic } = this.state
|
|
if (btnconfig) {
|
if (!autoMatic && (btnconfig.setting.display === 'prompt' || btnconfig.setting.display === 'exec')) { // 如果表单以是否框展示
|
this.modelconfirm()
|
} else {
|
this.setState({
|
visible: true
|
})
|
}
|
} else {
|
Api.getCacheConfig({
|
func: 'sPC_Get_LongParam',
|
MenuID: btn.uuid
|
}).then(res => {
|
let _LongParam = ''
|
|
if (res.status && res.LongParam) {
|
try {
|
_LongParam = JSON.parse(window.decodeURIComponent(window.atob(res.LongParam)))
|
} catch (e) {
|
console.warn('Parse Failure')
|
_LongParam = ''
|
}
|
}
|
|
if (!res.status) {
|
notification.warning({
|
top: 92,
|
message: res.message,
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else if (!_LongParam || (btn.execMode === 'pop' && _LongParam.type !== 'Modal')) {
|
notification.warning({
|
top: 92,
|
message: '未获取到按钮配置信息!',
|
duration: 5
|
})
|
this.setState({ loading: false })
|
} else {
|
_LongParam = updateForm(_LongParam)
|
_LongParam = this.handleModelConfig(_LongParam)
|
|
this.setState({
|
btnconfig: _LongParam
|
}, () => {
|
if (!autoMatic && (_LongParam.setting.display === 'prompt' || _LongParam.setting.display === 'exec')) { // 如果表单以是否框展示
|
this.modelconfirm()
|
} else {
|
this.setState({
|
visible: true
|
})
|
}
|
})
|
}
|
})
|
}
|
}
|
|
/**
|
* @description 模态框(表单),确认
|
*/
|
handleOk = () => {
|
if (!this.formRef) return
|
|
this.formRef.handleConfirm().then(res => {
|
this.setState({ confirmLoading: true })
|
this.triggerPrint(this.state.selines, res)
|
})
|
}
|
|
/**
|
* @description 模态框(表单),取消
|
*/
|
handleCancel = () => {
|
this.setState({
|
loading: false,
|
visible: false,
|
confirmLoading: false
|
})
|
}
|
|
modelconfirm = () => {
|
const { btnconfig, selines } = this.state
|
let _this = this
|
let result = []
|
let _data = {}
|
let BData = {}
|
|
if (selines[0]) {
|
Object.keys(selines[0]).forEach(key => {
|
_data[key.toLowerCase()] = selines[0][key]
|
})
|
}
|
if (this.props.BData) {
|
Object.keys(this.props.BData).forEach(key => {
|
BData[key.toLowerCase()] = this.props.BData[key]
|
})
|
}
|
|
btnconfig.fields.forEach(item => {
|
if (!item.field) return
|
let _readin = item.readin !== 'false'
|
let _initval = item.initval
|
|
if (item.type === 'linkMain' || item.type === 'funcvar') {
|
_readin = false
|
}
|
|
if (item.type === 'linkMain' && BData.hasOwnProperty(item.field.toLowerCase())) {
|
_initval = BData[item.field.toLowerCase()]
|
} else if (_readin && _data.hasOwnProperty(item.field.toLowerCase())) {
|
_initval = _data[item.field.toLowerCase()]
|
} else if (item.type === 'date' && _initval) {
|
_initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD')
|
} else if (item.type === 'datemonth' && _initval) {
|
_initval = moment().subtract(_initval, 'month').format('YYYY-MM')
|
} else if (item.type === 'datetime' && _initval) {
|
_initval = moment().subtract(_initval, 'days').format('YYYY-MM-DD HH:mm:ss')
|
}
|
|
let _fieldlen = item.fieldlength || 50
|
if (item.type === 'textarea' || item.type === 'fileupload' || item.type === 'multiselect') {
|
_fieldlen = item.fieldlength || 512
|
} else if (item.type === 'number') {
|
_fieldlen = item.decimal ? item.decimal : 0
|
} else if (item.type === 'rate') {
|
item.rateCount = item.rateCount || 5
|
let allowHalf = item.allowHalf === 'true'
|
|
if (allowHalf) {
|
_initval = parseFloat(_initval)
|
if (_initval % 0.5 !== 0) {
|
_initval = parseInt(_initval)
|
}
|
} else {
|
_initval = parseInt(_initval)
|
}
|
|
if (isNaN(_initval) || _initval < 0) {
|
_initval = 0
|
} else if (_initval > item.rateCount) {
|
_initval = item.rateCount
|
}
|
}
|
|
if (_initval === undefined) {
|
_initval = ''
|
}
|
|
result.push({
|
key: item.field,
|
readonly: item.readonly === 'true',
|
readin: item.readin !== 'false' && item.readin !== 'top',
|
fieldlen: _fieldlen,
|
type: item.type,
|
value: _initval
|
})
|
})
|
|
if (btnconfig.setting.display === 'exec') {
|
this.execSubmit(selines, () => {}, result)
|
} else {
|
confirm({
|
title: this.state.dict['main.action.confirm.tip'],
|
onOk() {
|
_this.triggerPrint(selines, result)
|
},
|
onCancel() {
|
_this.setState({ loading: false })
|
}
|
})
|
}
|
}
|
|
/**
|
* @description 显示模态框
|
*/
|
getModels = () => {
|
const { BID, btn } = this.props
|
const { btnconfig } = this.state
|
|
if (!this.state.visible || !btnconfig || !btnconfig.setting) return null
|
|
let title = btn.label
|
let width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + 'vw'
|
let clickouter = false
|
let container = document.body
|
|
if (btnconfig.setting.container === 'tab' && btn.ContainerId) {
|
width = btnconfig.setting.width > 100 ? btnconfig.setting.width : btnconfig.setting.width + '%'
|
container = () => document.getElementById(btn.ContainerId)
|
}
|
|
if (btnconfig.setting.clickouter === 'close') {
|
clickouter = true
|
}
|
|
return (
|
<Modal
|
title={title}
|
maskClosable={clickouter}
|
getContainer={container}
|
wrapClassName='action-modal'
|
visible={this.state.visible}
|
confirmLoading={this.state.confirmLoading}
|
width={width}
|
onOk={this.handleOk}
|
onCancel={this.handleCancel}
|
destroyOnClose
|
>
|
<MutilForm
|
BID={BID}
|
dict={this.state.dict}
|
action={btnconfig}
|
inputSubmit={this.handleOk}
|
data={this.state.selines[0]}
|
BData={this.props.BData}
|
wrappedComponentRef={(inst) => this.formRef = inst}
|
/>
|
</Modal>
|
)
|
}
|
|
render() {
|
const { btn } = this.props
|
const { loading, disabled, hidden } = 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 || ''
|
} 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}
|
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>
|
<span onClick={(e) => {e.stopPropagation()}}>{this.getModels()}</span>
|
</>
|
}
|
}
|
|
export default PrintButton
|