From 75490d86479821817eda14fb7e27c86591e9dd99 Mon Sep 17 00:00:00 2001 From: 24kycj <1637269896@qq.com> Date: Wed, 3 Jun 2026 10:27:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=A4=87=E5=8D=A1=E4=BD=8D?= =?UTF-8?q?=2013=20=E8=87=AA=E5=8A=A8=E7=BB=AD=E5=81=9A=EF=BC=9A=E5=8D=A1?= =?UTF-8?q?=E4=BD=8D=20API=20=E8=A7=A3=E6=9E=90=E4=B8=8E=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 兼容 workDll 返回值即卡位编号的语义,启动卡位轮询时同步主进程 mode,并修正续做失败时的 phase 时序。 --- app/src/main/ipc/register-handlers.ts | 5 ++- app/src/main/services/work-dll.service.ts | 7 ++-- app/src/renderer/src/api/cardsoon.ts | 6 ++- .../src/views/DistributeRunningView.vue | 38 +++++++++++-------- app/src/shared/card-position.ts | 18 +++++++++ 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/app/src/main/ipc/register-handlers.ts b/app/src/main/ipc/register-handlers.ts index 0cac8c2..0b6d8b9 100644 --- a/app/src/main/ipc/register-handlers.ts +++ b/app/src/main/ipc/register-handlers.ts @@ -287,9 +287,12 @@ export function registerIpcHandlers(): void { return ok() }) - tracedHandle('poll:card-position-start', async () => { + tracedHandle('poll:card-position-start', async (_e, sessionMode?: 'distributing' | 'usbCopying') => { try { assertReady() + if (sessionMode === 'distributing' || sessionMode === 'usbCopying') { + mainAppState.mode = sessionMode + } const dll = await loadDllModule() if (!dll.isCardPositionApiAvailable()) { return fail(CS_FAIL, '当前 DLL 不支持卡位查询,无法自动续做') diff --git a/app/src/main/services/work-dll.service.ts b/app/src/main/services/work-dll.service.ts index d242484..f22b3d3 100644 --- a/app/src/main/services/work-dll.service.ts +++ b/app/src/main/services/work-dll.service.ts @@ -1,6 +1,7 @@ import path from 'path' import koffi from 'koffi' import log from 'electron-log' +import { normalizeCardPositionQuery } from '@shared/card-position' import { CS_OK, JOB_ID_BUF_SIZE, LOG_FATAL_FLAG } from '../constants' import { emitTrace, isTraceEnabled } from '../utils/trace-bridge' import { getNativeDir } from './native-path' @@ -396,9 +397,9 @@ export function dllGetPrinterCardPosition(): { queryCode: number; position: numb return traceCall('SAPI_GetPrinterCardPosition', undefined, () => { loadLibrary() if (!SAPI_GetPrinterCardPosition) throw new Error('CARD_POSITION_API_UNAVAILABLE') - const position = [0] - const queryCode = SAPI_GetPrinterCardPosition!(position) as number - return { queryCode, position: position[0] } + const out = [0] + const ret = SAPI_GetPrinterCardPosition!(out) as number + return normalizeCardPositionQuery(ret, out[0]) }) } diff --git a/app/src/renderer/src/api/cardsoon.ts b/app/src/renderer/src/api/cardsoon.ts index add713b..be1baad 100644 --- a/app/src/renderer/src/api/cardsoon.ts +++ b/app/src/renderer/src/api/cardsoon.ts @@ -73,8 +73,10 @@ export async function pollUsbStop(opts?: { resetMode?: boolean }): Promise } -export async function pollCardPositionStart(): Promise { - return api().invoke('poll:card-position-start') as Promise +export async function pollCardPositionStart( + sessionMode?: 'distributing' | 'usbCopying' +): Promise { + return api().invoke('poll:card-position-start', sessionMode) as Promise } export async function pollCardPositionStop(): Promise { diff --git a/app/src/renderer/src/views/DistributeRunningView.vue b/app/src/renderer/src/views/DistributeRunningView.vue index 962df51..fdfe23e 100644 --- a/app/src/renderer/src/views/DistributeRunningView.vue +++ b/app/src/renderer/src/views/DistributeRunningView.vue @@ -218,16 +218,18 @@ async function stopTaskPollsOnly(): Promise { } } -async function startCardPositionWatch(): Promise { +async function startCardPositionWatch( + sessionMode: 'distributing' | 'usbCopying' +): Promise { await pollCardPositionStop() - const cardStarted = await pollCardPositionStart() - if (!cardStarted.ok) { - notify.warning(cardStarted.message || '无法监控卡位,请手动点击返回或重新提交') - } unsubCard?.() unsubCard = onCardPositionTick((payload) => applyCardPosition(payload as CardPositionPollPayload) ) + const cardStarted = await pollCardPositionStart(sessionMode) + if (!cardStarted.ok) { + notify.warning(cardStarted.message || '无法监控卡位,请手动点击返回或重新提交') + } } async function enterWaitPhase(next: 'completed' | 'failed', errorText = ''): Promise { @@ -253,9 +255,10 @@ async function enterWaitPhase(next: 'completed' | 'failed', errorText = ''): Pro failureErrorText.value = errorText } await stopTaskPollsOnly() - appStore.setMode(isCollect.value ? 'usbCopying' : 'distributing') + const sessionMode = isCollect.value ? 'usbCopying' : 'distributing' + appStore.setMode(sessionMode) lastCardPosition = -1 - await startCardPositionWatch() + await startCardPositionWatch(sessionMode) } async function enterFailedPhase(errorText = ''): Promise { @@ -287,16 +290,8 @@ async function resubmitTask(): Promise { await pollCardPositionStop() unsubCard?.() unsubCard = null - phase.value = 'running' - setProgress(0) - workflowStep.value = 1 - collectHint.value = '' - waitCard.value = false - queryFailStreak = 0 - usbQueryFailStreak = 0 const backToWait = async (message?: string): Promise => { - resubmitting = false if (message) notify.error(message) if (fromWaitPhase === 'failed') { await enterFailedPhase(message || failureErrorText.value) @@ -312,6 +307,12 @@ async function resubmitTask(): Promise { await backToWait('导入目录无效,无法继续') return } + phase.value = 'running' + setProgress(0) + workflowStep.value = 1 + collectHint.value = '' + queryFailStreak = 0 + usbQueryFailStreak = 0 const r = await dllUsbCopy(dest, collectStore.cardOutput, { resubmit: true }) if (!r.ok) { await backToWait(r.message || '重新提交收集任务失败') @@ -329,6 +330,11 @@ async function resubmitTask(): Promise { await backToWait() return } + phase.value = 'running' + setProgress(0) + workflowStep.value = 1 + waitCard.value = false + queryFailStreak = 0 const created = await createDistributeJob(formStore, { resubmit: true }) if (!created.ok) { await backToWait(created.message) @@ -341,6 +347,8 @@ async function resubmitTask(): Promise { return } unsubJob = onJobPollTick((payload) => applyJobProgress(payload as JobPollPayload)) + } catch (e) { + await backToWait(String(e)) } finally { resubmitting = false } diff --git a/app/src/shared/card-position.ts b/app/src/shared/card-position.ts index b584ff5..6d1c66b 100644 --- a/app/src/shared/card-position.ts +++ b/app/src/shared/card-position.ts @@ -1 +1,19 @@ +/** workDll 备卡位:检测到后可自动续做 */ export const POSITION_PREPARE = 13 + +/** 卡位编号合理上限(用于解析 DLL 返回值) */ +export const POSITION_MAX = 32 + +/** 归一化 SAPI_GetPrinterCardPosition:兼容返回值=CS_OK 与返回值=卡位编号两种 DLL */ +export function normalizeCardPositionQuery( + ret: number, + outPosition: number +): { queryCode: number; position: number } { + if (ret === 0) { + return { queryCode: 0, position: outPosition } + } + if (ret > 0 && ret <= POSITION_MAX) { + return { queryCode: 0, position: ret } + } + return { queryCode: ret, position: outPosition } +}