139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
const normalizePrinterName = (printerName) => String(printerName ?? '').trim()
|
|
|
|
const parsePayload = (job) => {
|
|
if (job?.payload && typeof job.payload === 'object') {
|
|
return job.payload
|
|
}
|
|
|
|
if (typeof job?.payload_json === 'string') {
|
|
try {
|
|
return JSON.parse(job.payload_json)
|
|
} catch {
|
|
return null
|
|
}
|
|
}
|
|
|
|
if (job?.payload_json && typeof job.payload_json === 'object') {
|
|
return job.payload_json
|
|
}
|
|
|
|
return null
|
|
}
|
|
|
|
const getAssetLabelItems = (job) => {
|
|
const payload = parsePayload(job)
|
|
if (!payload || !Array.isArray(payload.items)) {
|
|
return null
|
|
}
|
|
return payload.items
|
|
}
|
|
|
|
const getRenderedLabelImages = (job) => {
|
|
const payload = parsePayload(job)
|
|
if (!payload || !Array.isArray(payload.rendered_labels)) {
|
|
return null
|
|
}
|
|
|
|
return payload.rendered_labels
|
|
.filter((item) => item && typeof item === 'object')
|
|
.map((item) => ({
|
|
equipment_id: Number(item.equipment_id),
|
|
image_data_url: String(item.image_data_url ?? '').trim()
|
|
}))
|
|
.filter((item) => item.equipment_id > 0 && item.image_data_url)
|
|
}
|
|
|
|
export function createTestPrintSuccessMessage(printerName) {
|
|
const resolvedPrinterName = normalizePrinterName(printerName) || '已选打印机'
|
|
return `测试标签已发送到 ${resolvedPrinterName},请确认是否按 60x40mm 正常出纸。`
|
|
}
|
|
|
|
export function createJobProcessor({
|
|
printAssetLabels = async () => {
|
|
throw new Error('尚未注入真实资产标签打印执行器')
|
|
},
|
|
printTestLabel = async () => {
|
|
throw new Error('尚未注入真实测试标签打印执行器')
|
|
}
|
|
} = {}) {
|
|
return {
|
|
async process(job, { selectedPrinterName } = {}) {
|
|
if (job?.job_type === 'asset_label') {
|
|
const printerName = normalizePrinterName(selectedPrinterName)
|
|
if (!printerName) {
|
|
return {
|
|
ok: false,
|
|
nextStatus: 'failed',
|
|
errorMessage: '尚未选择标签打印机,请先在打印助手里完成打印机配置。'
|
|
}
|
|
}
|
|
|
|
const items = getAssetLabelItems(job)
|
|
if (!items?.length) {
|
|
return {
|
|
ok: false,
|
|
nextStatus: 'failed',
|
|
errorMessage: '当前打印任务缺少可用的资产标签数据,已阻止实际出纸。'
|
|
}
|
|
}
|
|
|
|
try {
|
|
const renderedLabels = getRenderedLabelImages(job)
|
|
const printResult = await printAssetLabels({
|
|
job,
|
|
items,
|
|
renderedLabels,
|
|
printerName
|
|
})
|
|
|
|
const printedCount =
|
|
typeof printResult?.printed_count === 'number' ? printResult.printed_count : items.length
|
|
|
|
return {
|
|
ok: true,
|
|
nextStatus: 'completed',
|
|
message: `已发送到 ${printerName} 打印,准备输出 ${printedCount} 张资产标签。`
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
ok: false,
|
|
nextStatus: 'failed',
|
|
errorMessage: error instanceof Error ? error.message : '资产标签打印失败'
|
|
}
|
|
}
|
|
}
|
|
|
|
return {
|
|
ok: true,
|
|
nextStatus: 'completed',
|
|
message: '当前任务类型未实现,已跳过。'
|
|
}
|
|
},
|
|
async runTestPrint({ selectedPrinterName }) {
|
|
const printerName = normalizePrinterName(selectedPrinterName)
|
|
if (!printerName) {
|
|
return {
|
|
ok: false,
|
|
message: '尚未选择标签打印机,请先保存打印机后再做测试打印。'
|
|
}
|
|
}
|
|
|
|
try {
|
|
await printTestLabel({
|
|
printerName
|
|
})
|
|
|
|
return {
|
|
ok: true,
|
|
message: createTestPrintSuccessMessage(printerName)
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
ok: false,
|
|
message: error instanceof Error ? error.message : '测试打印失败'
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|