From 64a8fcd130f92e79f6d2efaa6619bb13380e33a9 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Tue, 11 Aug 2026 20:39:38 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/pda-loading.js | 12 +++---- pages/picking/picking.vue | 75 +++++++++++++++++++++++++-------------- pages/tasks/tasks.vue | 5 +-- stores/picking.js | 3 +- utils/picking-state.js | 15 +++++--- 5 files changed, 68 insertions(+), 42 deletions(-) diff --git a/api/pda-loading.js b/api/pda-loading.js index a26cf55..b9ec7a9 100644 --- a/api/pda-loading.js +++ b/api/pda-loading.js @@ -160,12 +160,11 @@ export async function submitContainerPickingBatch(task, actions, { warehouseId, } export function listLoadingOrders({ page = 1, size = 50, keyword = '' } = {}) { - const query = [`mainStatus=LOADING`, `page=${page}`, `size=${size}`] - if (session.tenantId) query.push(`tenantId=${encodeURIComponent(session.tenantId)}`) + const query = [] if (keyword) query.push(`keyword=${encodeURIComponent(keyword)}`) - return request({ url: `/orders?${query.join('&')}`, method: 'GET' }).then((data) => ({ - ...data, - records: (data && data.records ? data.records : []).map(normalizePdaOrder) + const suffix = query.length ? `?${query.join('&')}` : '' + return request({ url: `/first-leg/pda-loading/tasks/pending${suffix}`, method: 'GET' }).then((data) => ({ + page, size, records: (Array.isArray(data) ? data : data?.records || []).map(normalizePdaOrder) })) } @@ -176,12 +175,11 @@ export function normalizePdaOrder(row = {}) { inboundId: row.inboundId ?? row.inbound?.id ?? null, inboundVersion: row.inboundVersion ?? row.inbound?.version ?? null, tenantId: row.tenantId ?? row.accountId ?? row.inbound?.tenantId ?? null, - tenantId: row.tenantId ?? row.accountId ?? row.inbound?.tenantId ?? null, pickingVersion: row.pickingVersion ?? row.loading?.pickingVersion ?? null, taskId: row.taskId ?? row.pdaTaskId ?? row.loadingTaskId ?? row.loading?.taskId ?? null, containerNo: row.containerNo ?? row.container?.containerNo ?? row.loadingPlan?.containerNo ?? row.loading?.containerNo ?? '', warehouseId: row.warehouseId ?? row.warehouse?.id ?? row.loadingPlan?.warehouseId ?? null, - displayNo: row.orderNo ?? row.inboundCode ?? row.order?.orderNo ?? row.id + displayNo: row.orderNo ?? row.inboundCode ?? row.order?.orderNo ?? `任务 ${row.taskId ?? row.id}` } } diff --git a/pages/picking/picking.vue b/pages/picking/picking.vue index dda7d44..baec523 100644 --- a/pages/picking/picking.vue +++ b/pages/picking/picking.vue @@ -34,7 +34,7 @@ - + 支持硬件广播扫码,也可点击输入后按“完成”确认 @@ -58,11 +58,11 @@ @@ -85,7 +85,7 @@ :class="itemState(item)" > - {{ item.sku }} + {{ item.inboundCode || item.orderNo || '箱级拣货明细' }} 已拣 ✓ @@ -93,7 +93,7 @@ 已跳拣 - 需拣 {{ item.qty }} {{ item.unit }} + 需拣 {{ item.qty }} 箱 @@ -147,7 +147,7 @@ - {{ summary.pending }} 件待拣 + {{ summary.pending }} 箱待拣 {{ submitStatusHint }} @@ -33,6 +33,7 @@ onShow() { if (!requireSession()) return; this.user = session.currentUser; this.loadTasks() }, onUnload() { if (this._stopNetwork) this._stopNetwork(); clearTimeout(this._toastTimer) }, methods: { + statusLabel(status) { return status === 'IN_PROGRESS' ? '拣货中' : '待领取' }, async loadTasks() { if (!isOnline()) { this.error = '当前网络不可用,请联网后刷新'; return } this.loading = true; this.error = '' diff --git a/stores/picking.js b/stores/picking.js index 066f271..1b1f65a 100644 --- a/stores/picking.js +++ b/stores/picking.js @@ -11,7 +11,7 @@ function createInitialState() { boxes, currentBoxIndex: 0, itemStates: createItemStates(boxes[0].items), - partialQuantities: {}, boxDrafts: {}, completedBoxes: {}, scanValue: '', scanHistory: [] + partialQuantities: {}, scannedBoxCodes: {}, boxDrafts: {}, completedBoxes: {}, scanValue: '', scanHistory: [] } } @@ -46,6 +46,7 @@ function draftPayload(nextState, identity) { currentBoxIndex: nextState.currentBoxIndex, itemStates: nextState.itemStates, partialQuantities: nextState.partialQuantities, + scannedBoxCodes: nextState.scannedBoxCodes, boxDrafts: nextState.boxDrafts, completedBoxes: nextState.completedBoxes, scanHistory: nextState.scanHistory, diff --git a/utils/picking-state.js b/utils/picking-state.js index f554995..db590cb 100644 --- a/utils/picking-state.js +++ b/utils/picking-state.js @@ -12,7 +12,7 @@ export function createItemStates(items) { }, {}) } -export function getPickSummary(items, states) { +export function getPickSummary(items, states, partialQuantities = {}) { const summary = { total: items.length, picked: 0, @@ -23,7 +23,11 @@ export function getPickSummary(items, states) { items.forEach((item) => { const status = states[item.id] || ITEM_STATUS.PENDING - summary[status] += 1 + const quantity = Math.max(1, Number(item.qty || 1)) + summary.total += quantity - 1 + summary[status] += status === ITEM_STATUS.PARTIAL + ? Math.max(0, Number(partialQuantities[item.id] || 0)) + : quantity }) summary.processed = summary.picked + summary.partial + summary.skipped @@ -56,12 +60,13 @@ export function submitStates(items, states) { } } -export function classifyScan(items, states, scanCode) { - const item = items.find((entry) => entry.sku === scanCode) || null +export function classifyScan(items, states, scanCode, scannedBoxCodes = {}) { + const item = items.find((entry) => (entry.boxCodes || []).includes(scanCode)) || null if (!item) return { type: 'unknown', item: null } + if (scannedBoxCodes[scanCode]) return { type: 'processed', item, status: states[item.id] || ITEM_STATUS.PARTIAL } const status = states[item.id] || ITEM_STATUS.PENDING - if (status === ITEM_STATUS.PENDING) return { type: 'pending', item } + if (status !== ITEM_STATUS.PICKED && status !== ITEM_STATUS.SKIPPED) return { type: 'pending', item } return { type: 'processed', item, status } }