优化旧码多明细选择提示
This commit is contained in:
@@ -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(
|
||||
[
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
<BadgeCheck :size="20" />
|
||||
<span>该订单当前不可核销,请返回订单详情核对状态。</span>
|
||||
</section>
|
||||
<section v-else-if="requiresManualSelection" class="panel warning-panel">
|
||||
<section v-else-if="showManualSelectionHint" class="panel warning-panel">
|
||||
<BadgeCheck :size="20" />
|
||||
<span>扫码套餐匹配到多个可核销明细,请选择后再核销。</span>
|
||||
</section>
|
||||
|
||||
Reference in New Issue
Block a user