From 2db2f9a374148ca5d0390ddbbcd3c6c77e6a27b6 Mon Sep 17 00:00:00 2001 From: andy Date: Tue, 28 Jul 2026 12:59:16 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A7=E7=A0=81=E5=A4=9A?= =?UTF-8?q?=E6=98=8E=E7=BB=86=E9=80=89=E6=8B=A9=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/__tests__/writeOffItem.test.ts | 31 ++++++++++++++---------- src/utils/writeOffItem.ts | 23 +++--------------- src/views/verify/VerifyConfirmView.vue | 5 ++-- 3 files changed, 25 insertions(+), 34 deletions(-) diff --git a/src/utils/__tests__/writeOffItem.test.ts b/src/utils/__tests__/writeOffItem.test.ts index 4c3f32c..0bdc678 100644 --- a/src/utils/__tests__/writeOffItem.test.ts +++ b/src/utils/__tests__/writeOffItem.test.ts @@ -1,13 +1,15 @@ import assert from 'node:assert/strict' import { test } from 'node:test' import { - findWriteOffItem, getWriteOffItemAvailability, getWriteOffItemQuantity, getWriteOffStatusText, - resolveWriteOffItemSelection + resolveWriteOffItemSelection, + shouldShowManualSelectionHint } from '../writeOffItem.ts' +const writeOffItemModule = await import('../writeOffItem.ts') + const items = [ { orderWriteOffItemId: 'item-1', @@ -27,17 +29,6 @@ const items = [ } ] -test('finds write off item by id before matching duplicated package name', () => { - assert.equal( - findWriteOffItem(items, { orderWriteOffItemId: 'item-2', packageName: '双人套餐' })?.orderWriteOffItemId, - 'item-2' - ) -}) - -test('matches legacy package name when item id is absent', () => { - assert.equal(findWriteOffItem(items, { packageName: '双人套餐' })?.orderWriteOffItemId, 'item-1') -}) - test('calculates total, written off and remaining quantity from item fields', () => { assert.deepEqual(getWriteOffItemQuantity(items[1]), { total: 2, @@ -78,6 +69,20 @@ test('does not auto select when legacy package name matches multiple available i assert.deepEqual(selection.options.map((item) => item.orderWriteOffItemId), ['item-1', 'item-2']) }) +test('hides manual selection hint after an item is selected', () => { + const selection = resolveWriteOffItemSelection(items, { + source: 'scan', + packageName: '双人套餐' + }) + + assert.equal(shouldShowManualSelectionHint(selection, ''), true) + assert.equal(shouldShowManualSelectionHint(selection, 'item-1'), false) +}) + +test('does not export legacy package name finder', () => { + assert.equal('findWriteOffItem' in writeOffItemModule, false) +}) + test('auto selects the only available item matched by legacy package name', () => { const selection = resolveWriteOffItemSelection( [ diff --git a/src/utils/writeOffItem.ts b/src/utils/writeOffItem.ts index 8ed51cd..2acc3a9 100644 --- a/src/utils/writeOffItem.ts +++ b/src/utils/writeOffItem.ts @@ -1,10 +1,5 @@ import type { CommodityPackageConfig } from '@/types/order' -export interface WriteOffItemMatch { - orderWriteOffItemId?: string - packageName?: string -} - export interface WriteOffItemQuantity { total: number writtenOff: number @@ -83,20 +78,6 @@ export const getWriteOffItemAvailability = (item?: CommodityPackageConfig): Writ return { available: true, reason: '' } } -export const findWriteOffItem = (items: CommodityPackageConfig[], match: WriteOffItemMatch) => { - const itemId = String(match.orderWriteOffItemId || '').trim() - if (itemId) { - return items.find((item) => getWriteOffItemId(item) === itemId) - } - - const packageName = String(match.packageName || '').trim() - if (packageName) { - return items.find((item) => getWriteOffItemName(item) === packageName || item.packageName === packageName) - } - - return undefined -} - export const getFirstAvailableWriteOffItem = (items: CommodityPackageConfig[]) => { return items.find((item) => getWriteOffItemAvailability(item).available) } @@ -161,6 +142,10 @@ export const resolveWriteOffItemSelection = ( } } +export const shouldShowManualSelectionHint = (selection: WriteOffItemSelection, selectedItemId: string) => { + return selection.requiresManualSelection && !String(selectedItemId || '').trim() +} + export const getWriteOffStatusText = (item?: CommodityPackageConfig) => { const status = item?.writeOffStatus ?? item?.packageStatus const key = String(status) diff --git a/src/views/verify/VerifyConfirmView.vue b/src/views/verify/VerifyConfirmView.vue index 0575494..57f203d 100644 --- a/src/views/verify/VerifyConfirmView.vue +++ b/src/views/verify/VerifyConfirmView.vue @@ -16,6 +16,7 @@ import { getWriteOffItemQuantity, getWriteOffStatusText, resolveWriteOffItemSelection, + shouldShowManualSelectionHint, toNumber } from '@/utils/writeOffItem' import { @@ -60,7 +61,7 @@ const itemSelection = computed(() => { const packageOptions = computed(() => itemSelection.value.options) const isScanItemLocked = computed(() => itemSelection.value.locked) const packageMismatch = computed(() => itemSelection.value.mismatch) -const requiresManualSelection = computed(() => itemSelection.value.requiresManualSelection) +const showManualSelectionHint = computed(() => shouldShowManualSelectionHint(itemSelection.value, selectedItemId.value)) const selectedPackage = computed(() => { return packageOptions.value.find((item) => getWriteOffItemId(item) === selectedItemId.value) @@ -271,7 +272,7 @@ onMounted(loadDetail) 该订单当前不可核销,请返回订单详情核对状态。 -
+
扫码套餐匹配到多个可核销明细,请选择后再核销。