优化旧码多明细选择提示

This commit is contained in:
andy
2026-07-28 12:59:16 +08:00
parent 042fc2ac80
commit 2db2f9a374
3 changed files with 25 additions and 34 deletions

View File

@@ -1,13 +1,15 @@
import assert from 'node:assert/strict' import assert from 'node:assert/strict'
import { test } from 'node:test' import { test } from 'node:test'
import { import {
findWriteOffItem,
getWriteOffItemAvailability, getWriteOffItemAvailability,
getWriteOffItemQuantity, getWriteOffItemQuantity,
getWriteOffStatusText, getWriteOffStatusText,
resolveWriteOffItemSelection resolveWriteOffItemSelection,
shouldShowManualSelectionHint
} from '../writeOffItem.ts' } from '../writeOffItem.ts'
const writeOffItemModule = await import('../writeOffItem.ts')
const items = [ const items = [
{ {
orderWriteOffItemId: 'item-1', 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', () => { test('calculates total, written off and remaining quantity from item fields', () => {
assert.deepEqual(getWriteOffItemQuantity(items[1]), { assert.deepEqual(getWriteOffItemQuantity(items[1]), {
total: 2, 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']) 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', () => { test('auto selects the only available item matched by legacy package name', () => {
const selection = resolveWriteOffItemSelection( const selection = resolveWriteOffItemSelection(
[ [

View File

@@ -1,10 +1,5 @@
import type { CommodityPackageConfig } from '@/types/order' import type { CommodityPackageConfig } from '@/types/order'
export interface WriteOffItemMatch {
orderWriteOffItemId?: string
packageName?: string
}
export interface WriteOffItemQuantity { export interface WriteOffItemQuantity {
total: number total: number
writtenOff: number writtenOff: number
@@ -83,20 +78,6 @@ export const getWriteOffItemAvailability = (item?: CommodityPackageConfig): Writ
return { available: true, reason: '' } 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[]) => { export const getFirstAvailableWriteOffItem = (items: CommodityPackageConfig[]) => {
return items.find((item) => getWriteOffItemAvailability(item).available) 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) => { export const getWriteOffStatusText = (item?: CommodityPackageConfig) => {
const status = item?.writeOffStatus ?? item?.packageStatus const status = item?.writeOffStatus ?? item?.packageStatus
const key = String(status) const key = String(status)

View File

@@ -16,6 +16,7 @@ import {
getWriteOffItemQuantity, getWriteOffItemQuantity,
getWriteOffStatusText, getWriteOffStatusText,
resolveWriteOffItemSelection, resolveWriteOffItemSelection,
shouldShowManualSelectionHint,
toNumber toNumber
} from '@/utils/writeOffItem' } from '@/utils/writeOffItem'
import { import {
@@ -60,7 +61,7 @@ const itemSelection = computed(() => {
const packageOptions = computed(() => itemSelection.value.options) const packageOptions = computed(() => itemSelection.value.options)
const isScanItemLocked = computed(() => itemSelection.value.locked) const isScanItemLocked = computed(() => itemSelection.value.locked)
const packageMismatch = computed(() => itemSelection.value.mismatch) const packageMismatch = computed(() => itemSelection.value.mismatch)
const requiresManualSelection = computed(() => itemSelection.value.requiresManualSelection) const showManualSelectionHint = computed(() => shouldShowManualSelectionHint(itemSelection.value, selectedItemId.value))
const selectedPackage = computed(() => { const selectedPackage = computed(() => {
return packageOptions.value.find((item) => getWriteOffItemId(item) === selectedItemId.value) return packageOptions.value.find((item) => getWriteOffItemId(item) === selectedItemId.value)
@@ -271,7 +272,7 @@ onMounted(loadDetail)
<BadgeCheck :size="20" /> <BadgeCheck :size="20" />
<span>该订单当前不可核销请返回订单详情核对状态</span> <span>该订单当前不可核销请返回订单详情核对状态</span>
</section> </section>
<section v-else-if="requiresManualSelection" class="panel warning-panel"> <section v-else-if="showManualSelectionHint" class="panel warning-panel">
<BadgeCheck :size="20" /> <BadgeCheck :size="20" />
<span>扫码套餐匹配到多个可核销明细请选择后再核销</span> <span>扫码套餐匹配到多个可核销明细请选择后再核销</span>
</section> </section>