优化提交预检、废卡按钮置灰与等待超时提示
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user