修复备卡位续做:兼容 queryCode 即卡位并缓存任务 JSON
resolveCardPosition 解析 ret=13/out=0 真机语义;续做时重发 lastJobJson;poll tick 发送前统一归一化。
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { BrowserWindow } from 'electron'
|
import { BrowserWindow } from 'electron'
|
||||||
import log from 'electron-log'
|
import log from 'electron-log'
|
||||||
|
import { normalizeCardPositionQuery } from '@shared/card-position'
|
||||||
import { POLL_INTERVAL_MS, CS_OK } from '../constants'
|
import { POLL_INTERVAL_MS, CS_OK } from '../constants'
|
||||||
import {
|
import {
|
||||||
USB_TASK_COMPLETED,
|
USB_TASK_COMPLETED,
|
||||||
@@ -159,7 +160,7 @@ async function pollCardPositionOnce(): Promise<void> {
|
|||||||
const dll = await loadDllModule()
|
const dll = await loadDllModule()
|
||||||
if (!dll.isCardPositionApiAvailable()) return
|
if (!dll.isCardPositionApiAvailable()) return
|
||||||
const r = dll.dllGetPrinterCardPosition()
|
const r = dll.dllGetPrinterCardPosition()
|
||||||
const tick = { queryCode: r.queryCode, position: r.position }
|
const tick = normalizeCardPositionQuery(r.queryCode, r.position)
|
||||||
emitTrace('[poll] card:position-tick', tick)
|
emitTrace('[poll] card:position-tick', tick)
|
||||||
send('card:position-tick', tick)
|
send('card:position-tick', tick)
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ import { defineStore } from 'pinia'
|
|||||||
export const useJobStore = defineStore('job', {
|
export const useJobStore = defineStore('job', {
|
||||||
state: () => ({
|
state: () => ({
|
||||||
jobId: '',
|
jobId: '',
|
||||||
|
lastJobJson: '',
|
||||||
submitting: false,
|
submitting: false,
|
||||||
successCount: 0,
|
successCount: 0,
|
||||||
failCount: 0
|
failCount: 0
|
||||||
@@ -11,11 +12,15 @@ export const useJobStore = defineStore('job', {
|
|||||||
setActiveJob(jobId: string) {
|
setActiveJob(jobId: string) {
|
||||||
this.jobId = jobId
|
this.jobId = jobId
|
||||||
},
|
},
|
||||||
|
setLastJobJson(json: string) {
|
||||||
|
this.lastJobJson = json
|
||||||
|
},
|
||||||
clearActiveJob() {
|
clearActiveJob() {
|
||||||
this.jobId = ''
|
this.jobId = ''
|
||||||
},
|
},
|
||||||
reset() {
|
reset() {
|
||||||
this.jobId = ''
|
this.jobId = ''
|
||||||
|
this.lastJobJson = ''
|
||||||
this.submitting = false
|
this.submitting = false
|
||||||
this.successCount = 0
|
this.successCount = 0
|
||||||
this.failCount = 0
|
this.failCount = 0
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { genTaskId } from '@shared/gen-task-id'
|
|||||||
import { buildJobConfig } from '@/utils/buildJobConfig'
|
import { buildJobConfig } from '@/utils/buildJobConfig'
|
||||||
import { resolveJobTasks } from '@/utils/validateJobConfig'
|
import { resolveJobTasks } from '@/utils/validateJobConfig'
|
||||||
import { dllJobCreate, fsWriteJobCsv } from '@/api/cardsoon'
|
import { dllJobCreate, fsWriteJobCsv } from '@/api/cardsoon'
|
||||||
|
import { useJobStore } from '@/stores/job'
|
||||||
import type { DistributeFormState } from '@/stores/distributeForm'
|
import type { DistributeFormState } from '@/stores/distributeForm'
|
||||||
|
|
||||||
function printFieldRows(form: DistributeFormState) {
|
function printFieldRows(form: DistributeFormState) {
|
||||||
@@ -11,10 +12,7 @@ function printFieldRows(form: DistributeFormState) {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function createDistributeJob(
|
async function buildJobJson(form: DistributeFormState): Promise<{ ok: true; json: string } | { ok: false; message: string }> {
|
||||||
form: DistributeFormState,
|
|
||||||
opts?: { resubmit?: boolean }
|
|
||||||
): Promise<{ ok: true; jobId: string } | { ok: false; message: string }> {
|
|
||||||
const { hasCopy, hasPrint } = resolveJobTasks(form)
|
const { hasCopy, hasPrint } = resolveJobTasks(form)
|
||||||
if (!hasCopy && !hasPrint) {
|
if (!hasCopy && !hasPrint) {
|
||||||
return { ok: false, message: '请配置拷贝路径或打印模板' }
|
return { ok: false, message: '请配置拷贝路径或打印模板' }
|
||||||
@@ -33,7 +31,25 @@ export async function createDistributeJob(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const json = JSON.stringify(buildJobConfig(form, { taskId, udfFile }))
|
return { ok: true, json: JSON.stringify(buildJobConfig(form, { taskId, udfFile })) }
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createDistributeJob(
|
||||||
|
form: DistributeFormState,
|
||||||
|
opts?: { resubmit?: boolean }
|
||||||
|
): Promise<{ ok: true; jobId: string } | { ok: false; message: string }> {
|
||||||
|
const jobStore = useJobStore()
|
||||||
|
let json: string
|
||||||
|
|
||||||
|
if (opts?.resubmit && jobStore.lastJobJson) {
|
||||||
|
json = jobStore.lastJobJson
|
||||||
|
} else {
|
||||||
|
const built = await buildJobJson(form)
|
||||||
|
if (!built.ok) return built
|
||||||
|
json = built.json
|
||||||
|
jobStore.setLastJobJson(json)
|
||||||
|
}
|
||||||
|
|
||||||
const created = await dllJobCreate(json, opts)
|
const created = await dllJobCreate(json, opts)
|
||||||
if (!created.ok || !created.data?.jobId) {
|
if (!created.ok || !created.data?.jobId) {
|
||||||
return { ok: false, message: created.message || '创建任务失败' }
|
return { ok: false, message: created.message || '创建任务失败' }
|
||||||
|
|||||||
@@ -108,7 +108,7 @@ import {
|
|||||||
import { createDistributeJob } from '@/utils/createDistributeJob'
|
import { createDistributeJob } from '@/utils/createDistributeJob'
|
||||||
import { validateJobPreflight } from '@/utils/validateJobPreflight'
|
import { validateJobPreflight } from '@/utils/validateJobPreflight'
|
||||||
import { mapJobStateToUi } from '@/utils/job-state'
|
import { mapJobStateToUi } from '@/utils/job-state'
|
||||||
import { POSITION_PREPARE } from '@shared/card-position'
|
import { POSITION_PREPARE, resolveCardPosition } from '@shared/card-position'
|
||||||
import {
|
import {
|
||||||
USB_TASK_COPYING,
|
USB_TASK_COPYING,
|
||||||
USB_TASK_PREPARING,
|
USB_TASK_PREPARING,
|
||||||
@@ -275,8 +275,8 @@ function canAutoResubmit(): boolean {
|
|||||||
|
|
||||||
function applyCardPosition(p: CardPositionPollPayload): void {
|
function applyCardPosition(p: CardPositionPollPayload): void {
|
||||||
if (!canAutoResubmit() || resubmitting) return
|
if (!canAutoResubmit() || resubmitting) return
|
||||||
if (p.queryCode !== 0) return
|
const pos = resolveCardPosition(p.queryCode, p.position)
|
||||||
const pos = p.position
|
if (pos === null) return
|
||||||
const enteredPrepare = pos === POSITION_PREPARE && lastCardPosition !== POSITION_PREPARE
|
const enteredPrepare = pos === POSITION_PREPARE && lastCardPosition !== POSITION_PREPARE
|
||||||
lastCardPosition = pos
|
lastCardPosition = pos
|
||||||
if (!enteredPrepare) return
|
if (!enteredPrepare) return
|
||||||
@@ -324,11 +324,13 @@ async function resubmitTask(): Promise<void> {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const err = await validateJobPreflight(formStore)
|
if (!jobStore.lastJobJson) {
|
||||||
if (err) {
|
const err = await validateJobPreflight(formStore)
|
||||||
notify.warning(err)
|
if (err) {
|
||||||
await backToWait()
|
notify.warning(err)
|
||||||
return
|
await backToWait()
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
phase.value = 'running'
|
phase.value = 'running'
|
||||||
setProgress(0)
|
setProgress(0)
|
||||||
|
|||||||
@@ -4,16 +4,30 @@ export const POSITION_PREPARE = 13
|
|||||||
/** 卡位编号合理上限(用于解析 DLL 返回值) */
|
/** 卡位编号合理上限(用于解析 DLL 返回值) */
|
||||||
export const POSITION_MAX = 32
|
export const POSITION_MAX = 32
|
||||||
|
|
||||||
/** 归一化 SAPI_GetPrinterCardPosition:兼容返回值=CS_OK 与返回值=卡位编号两种 DLL */
|
/**
|
||||||
|
* 解析 SAPI_GetPrinterCardPosition。
|
||||||
|
* 真机常见:ret=13,out=0(返回值即卡位);或 ret=0,out=卡位。
|
||||||
|
*/
|
||||||
|
export function resolveCardPosition(queryCode: number, position: number): number | null {
|
||||||
|
if (queryCode === 0 && position >= 0 && position <= POSITION_MAX) {
|
||||||
|
return position
|
||||||
|
}
|
||||||
|
if (queryCode > 0 && queryCode <= POSITION_MAX) {
|
||||||
|
return queryCode
|
||||||
|
}
|
||||||
|
if (position > 0 && position <= POSITION_MAX) {
|
||||||
|
return position
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
export function normalizeCardPositionQuery(
|
export function normalizeCardPositionQuery(
|
||||||
ret: number,
|
ret: number,
|
||||||
outPosition: number
|
outPosition: number
|
||||||
): { queryCode: number; position: number } {
|
): { queryCode: number; position: number } {
|
||||||
if (ret === 0) {
|
const pos = resolveCardPosition(ret, outPosition)
|
||||||
return { queryCode: 0, position: outPosition }
|
if (pos !== null) {
|
||||||
}
|
return { queryCode: 0, position: pos }
|
||||||
if (ret > 0 && ret <= POSITION_MAX) {
|
|
||||||
return { queryCode: 0, position: ret }
|
|
||||||
}
|
}
|
||||||
return { queryCode: ret, position: outPosition }
|
return { queryCode: ret, position: outPosition }
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user