优化提交预检、废卡按钮置灰与等待超时提示

This commit is contained in:
24kycj
2026-09-09 23:45:25 +08:00
parent ac566846c9
commit 9ab1bcbd5e
25 changed files with 1442 additions and 100 deletions
+14
View File
@@ -106,6 +106,20 @@ function createWindow(): void {
)
})
// 页面加载失败(dev server 未就绪 / 生产文件缺失)时记录并提示,避免静默白屏
mainWindow.webContents.on('did-fail-load', (_event, errorCode, errorDescription, validatedURL) => {
log.error('renderer did-fail-load', { errorCode, errorDescription, validatedURL })
if (errorCode !== -3) {
mainWindow?.webContents.executeJavaScript(
`document.getElementById('app').innerHTML = '<pre style="margin:16px;padding:16px;background:#fff5f5;border:1px solid #feb2b2;border-radius:8px;color:#c53030;font-size:13px;white-space:pre-wrap;">[main:did-fail-load] ${errorCode} ${errorDescription}\\n${validatedURL}</pre>'`
).catch(() => undefined)
}
})
mainWindow.webContents.on('preload-error', (_event, preloadPath, error) => {
log.error('preload-error', { preloadPath, error: String(error) })
})
if (process.env.ELECTRON_RENDERER_URL) {
mainWindow.loadURL(process.env.ELECTRON_RENDERER_URL)
} else {
+22 -4
View File
@@ -136,7 +136,12 @@ export function registerIpcHandlers(): void {
assertReady()
const dll = await loadDllModule()
const code = dll.dllPrinterReset()
return code === CS_OK ? ok() : fail(code, '重置失败')
// 物理动作指令:负数为错误,0 或正数(状态/警告码)均视为指令已被打印机接受
if (code < 0) {
log.warn('SAPI_PrinterResetprinter returned non-OK code', code)
return fail(code, '重置失败')
}
return ok({ code })
} catch (err) {
return fail(CS_FAIL, String(err))
}
@@ -148,7 +153,11 @@ export function registerIpcHandlers(): void {
const dll = await loadDllModule()
if (!dll.isRejectApiAvailable()) return fail(CS_FAIL, 'REJECT_API_UNAVAILABLE')
const code = dll.dllPrinterReject()
return code === CS_OK ? ok() : fail(code, '废卡失败')
if (code < 0) {
log.warn('SAPI_PrinterMovetoreject returned non-OK code', code)
return fail(code, '废卡失败')
}
return ok({ code })
} catch (err) {
return fail(CS_FAIL, String(err))
}
@@ -161,7 +170,11 @@ export function registerIpcHandlers(): void {
const dll = await loadDllModule()
if (!dll.isUsbReaderApiAvailable()) return fail(CS_FAIL, 'USB_READER_API_UNAVAILABLE')
const code = dll.dllPrinterMoveToUsbReader()
return code === CS_OK ? ok() : fail(code, '读卡失败')
if (code < 0) {
log.warn('SAPI_PrinterMovetousbreader returned non-OK code', code)
return fail(code, '读卡失败')
}
return ok({ code })
} catch (err) {
return fail(CS_FAIL, String(err))
}
@@ -174,7 +187,12 @@ export function registerIpcHandlers(): void {
const dll = await loadDllModule()
if (!dll.isHopperApiAvailable()) return fail(CS_FAIL, 'HOPPER_API_UNAVAILABLE')
const code = dll.dllPrinterMoveToHopper()
return code === CS_OK ? ok() : fail(code, '退卡失败')
if (code < 0) {
log.warn('SAPI_PrinterMovetohopper returned non-OK code', code)
return fail(code, '退卡失败')
}
// 卡已物理退出但返回正数状态码时,不再误报失败
return ok({ code })
} catch (err) {
return fail(CS_FAIL, String(err))
}
+11 -1
View File
@@ -80,6 +80,15 @@ export function startJobPoll(id: string): void {
const cancelled = r.jobState === 6
const finished = r.jobState === 100
const terminal = failed || cancelled
// 失败当刻立即取打印机错误串(与 USB 收集轮询对齐),避免渲染层事后取到通用/过期文案
let errorMessage = ''
if (failed) {
try {
errorMessage = dll.dllGetPrinterErrorStr(-1) || ''
} catch (e) {
log.warn('GetPrinterErrorStr on job failed failed', e)
}
}
const tick = {
jobId,
queryErrorCode: r.queryErrorCode,
@@ -88,7 +97,8 @@ export function startJobPoll(id: string): void {
terminal,
failed,
cancelled,
finished
finished,
errorMessage
}
emitTrace('[poll] job:poll-tick', tick)
send('job:poll-tick', tick)
@@ -44,6 +44,8 @@ let SAPI_PrinterMovetoreject: any = null
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let SAPI_PrinterMovetousbreader: any = null
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let SAPI_PrinterMovetohopper: any = null
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let SAPI_GetPrinterCardPosition: any = null
// eslint-disable-next-line @typescript-eslint/no-explicit-any
let SAPI_PrinterCheckstatus: any = null
@@ -55,6 +57,7 @@ let hasCheckstatusApi = false
let hasCancelApi = false
let hasUploadApi = false
let hasUsbReaderApi = false
let hasHopperApi = false
let loggedCancelMissing = false
let loggedRejectMissing = false
@@ -206,6 +209,7 @@ function loadLibrary(): void {
cancel: hasCancelApi,
reject: hasRejectApi,
usbReader: hasUsbReaderApi,
hopper: hasHopperApi,
cardPosition: hasCardPositionApi,
checkstatus: hasCheckstatusApi
})
@@ -231,6 +235,11 @@ export function isUsbReaderApiAvailable(): boolean {
return hasUsbReaderApi
}
export function isHopperApiAvailable(): boolean {
loadLibrary()
return hasHopperApi
}
export function isCardPositionApiAvailable(): boolean {
loadLibrary()
return hasCardPositionApi