Commit 6838642c by wusiyi

fix: 尝试修复打印机任务并发导致打印内容错乱问题 #1001679

parent d44f0691
......@@ -2896,101 +2896,108 @@ const handleSeedingWall = (type: 'print' | 'sort') => {
podOrderVisible.value = true
}
const printOrder = async (
/** LODOP 单例不可并发,打印串行 */
let printOrderChain: Promise<void> = Promise.resolve()
const printOrder = (
data: OrderData,
callback: (status: boolean) => void,
) => {
const lodop = getCLodop(null, null)
if (!lodop) return
lodop.PRINT_INIT('打印内容')
const printerIndex = lodop.SET_PRINTER_INDEX(sheetPrinter.value)
console.log(
'printerIndex',
printerIndex,
`sheetPrinter.value:${sheetPrinter.value}`,
)
if (!printerIndex) {
ElMessage.error('打印机设置失败')
callback && callback(false)
return
}
if (data.filePath) {
const strURL = filePath + data.filePath
const isHttpsPdf = /(https):\/\/([^/]+)/i.test(strURL)
console.log('[printOrder] label source', {
id: data.id,
hasFilePath: !!data.filePath,
hasFileData: !!data.fileData,
isHttpsPdf,
strURL,
})
const pdfPayload = isHttpsPdf ? downloadPDF(strURL) : strURL
console.log('[printOrder] pdf payload meta', {
mode: isHttpsPdf ? 'base64' : 'url',
length: pdfPayload?.length || 0,
preview: pdfPayload?.slice(0, 30),
})
lodop.ADD_PRINT_PDF(0, 0, '100%', '100%', pdfPayload)
} else {
console.log('[printOrder] raw payload meta', {
id: data.id,
hasFilePath: !!data.filePath,
fileDataLength: data.fileData?.length || 0,
fileDataPreview: data.fileData?.slice(0, 30),
})
lodop.SEND_PRINT_RAWDATA(data.fileData || '')
}
console.log('lodop.CVERSION', lodop.CVERSION)
if (lodop.CVERSION) {
const startTime = Date.now()
const jobCode = await lodopCall((lodop) => {
lodop.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
return lodop.PRINT()
})
console.log('jobCode', jobCode)
// eslint-disable-next-line no-constant-condition
while (true) {
const ok = await lodopCall((lodop) =>
lodop.GET_VALUE('PRINT_STATUS_OK', jobCode),
)
console.log('PRINT_STATUS_OK:', jobCode, `ok: ${ok}`)
if (ok == 1) {
console.log('打印成功')
// 打印状态:成功
callback && callback(true)
return
}
// 如果打印状态表示未成功或者返回了空,继续获取任务是否存在
const exist = await lodopCall((lodop) =>
lodop.GET_VALUE('PRINT_STATUS_EXIST', jobCode),
)
console.log(
'[LODOP] PRINT_STATUS OK,EXIST',
jobCode,
`ok:${ok}`,
`exist:${exist}`,
`jobCode:${jobCode}`,
`(${Date.now() - startTime}ms)`,
)
if (exist == 0) {
console.log('任务不存在了', `exist:${exist}`)
// 任务不存在了
callback && callback(true)
return
}
const run = async () => {
const lodop = getCLodop(null, null)
if (!lodop) {
callback && callback(false)
return
}
lodop.PRINT_INIT('打印内容')
const printerIndex = lodop.SET_PRINTER_INDEX(sheetPrinter.value)
console.log(
'printerIndex',
printerIndex,
`sheetPrinter.value:${sheetPrinter.value}`,
)
if (!printerIndex) {
ElMessage.error('打印机设置失败')
callback && callback(false)
return
}
if (data.filePath) {
const strURL = filePath + data.filePath
const isHttpsPdf = /(https):\/\/([^/]+)/i.test(strURL)
console.log('[printOrder] label source', {
id: data.id,
hasFilePath: !!data.filePath,
hasFileData: !!data.fileData,
isHttpsPdf,
strURL,
})
const pdfPayload = isHttpsPdf ? downloadPDF(strURL) : strURL
console.log('[printOrder] pdf payload meta', {
mode: isHttpsPdf ? 'base64' : 'url',
length: pdfPayload?.length || 0,
preview: pdfPayload?.slice(0, 30),
})
lodop.ADD_PRINT_PDF(0, 0, '100%', '100%', pdfPayload)
} else {
console.log('[printOrder] raw payload meta', {
id: data.id,
hasFilePath: !!data.filePath,
fileDataLength: data.fileData?.length || 0,
fileDataPreview: data.fileData?.slice(0, 30),
})
lodop.SEND_PRINT_RAWDATA(data.fileData || '')
}
console.log('lodop.CVERSION', lodop.CVERSION)
if (lodop.CVERSION) {
const startTime = Date.now()
const jobCode = await lodopCall((lodop) => {
lodop.SET_PRINT_MODE('CATCH_PRINT_STATUS', true)
return lodop.PRINT()
})
console.log('jobCode', jobCode)
// eslint-disable-next-line no-constant-condition
while (true) {
const ok = await lodopCall((lodop) =>
lodop.GET_VALUE('PRINT_STATUS_OK', jobCode),
)
console.log('PRINT_STATUS_OK:', jobCode, `ok: ${ok}`)
if (ok == 1) {
console.log('打印成功')
callback && callback(true)
return
}
const exist = await lodopCall((lodop) =>
lodop.GET_VALUE('PRINT_STATUS_EXIST', jobCode),
)
console.log(
'[LODOP] PRINT_STATUS OK,EXIST',
jobCode,
`ok:${ok}`,
`exist:${exist}`,
`jobCode:${jobCode}`,
`(${Date.now() - startTime}ms)`,
)
if (exist == 0) {
console.log('任务不存在了', `exist:${exist}`)
callback && callback(true)
return
}
await new Promise((r) => setTimeout(r, 500))
if (Date.now() - startTime >= 30000) {
console.log('打印超时(30秒)')
ElMessage.error('打印超时(30秒)')
callback && callback(false)
return
await new Promise((r) => setTimeout(r, 500))
if (Date.now() - startTime >= 30000) {
console.log('打印超时(30秒)')
ElMessage.error('打印超时(30秒)')
callback && callback(false)
return
}
}
} else {
lodop.PRINT()
callback && callback(false)
}
} else {
lodop.PRINT()
callback && callback(false)
}
printOrderChain = printOrderChain.then(run, run)
}
let _lodop: LODOPObject | null = null
let _lodopCallback: { [key: string]: (value: string) => void } = {}
......
......@@ -1445,15 +1445,24 @@ const handlePrinterChange = (value: string) => {
emit('set-printer', value)
}
/** 已自动打印过的订单,避免 WS 回写清掉 printResult 后重复打印 */
const autoPrintedIds = new Set<number>()
const print = (data: OrderData, forcePrint = false, callback?: () => void) => {
const _boxIndex = boxIndex.value
const orderId = data.id
if (!forcePrint && data.printResult) {
if (
!forcePrint &&
(data.printResult || (orderId != null && autoPrintedIds.has(orderId)))
) {
callback && callback()
return
}
if (!forcePrint && orderId != null) autoPrintedIds.add(orderId)
props.printOrder(data, (status: boolean) => {
if (!status && orderId != null) autoPrintedIds.delete(orderId)
callback && callback()
const item = podBoxList.value?.find((item) => item.box === _boxIndex)
if (item && item.data) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment