优化旧码多明细选择提示
This commit is contained in:
@@ -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(
|
||||||
[
|
[
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user