feat(consignment): 后台寄卖规格按分类模板动态渲染

This commit is contained in:
2026-11-08 11:50:51 +08:00
parent caa2358bbd
commit e03abc3a8a
5 changed files with 483 additions and 142 deletions
@@ -0,0 +1,112 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import type { ConsignmentSpecField } from '../src/types/consignment.ts'
import {
formatLegacyConsignmentSpec,
resolveConsignmentSpecDisplayItems,
resolveConsignmentSpecText,
} from '../src/utils/consignment-spec-display.ts'
function makeSpec(
overrides: Partial<ConsignmentSpecField> & Pick<ConsignmentSpecField, 'key' | 'label'>,
): ConsignmentSpecField {
return {
type: 'text',
required: false,
options: [],
placeholder: '',
helpText: '',
matchMode: 'exact',
wildcardValues: [],
showInItemName: false,
sortOrder: 0,
...overrides,
}
}
const productSpec = makeSpec({
key: 'product',
label: '商品',
type: 'select',
required: true,
sortOrder: 10,
options: [
{ label: '碎梦浮光珍宝礼盒', value: '15', enabled: true },
{ label: '指挥官密钥', value: '9', enabled: true },
],
})
const systemSpec = makeSpec({
key: 'system',
label: '系统',
type: 'select',
sortOrder: 1,
options: [
{ label: '苹果', value: 'ios', enabled: true },
{ label: '安卓', value: 'android', enabled: true },
],
})
const levelSpec = makeSpec({
key: 'diamondLevel',
label: '钻石等级',
type: 'number',
sortOrder: 2,
})
test('动态规格:选项值映射成选项名称(密钥分类 product=15)', () => {
const items = resolveConsignmentSpecDisplayItems([productSpec], { product: '15' })
assert.deepEqual(items, [{ key: 'product', label: '商品', value: '碎梦浮光珍宝礼盒' }])
})
test('动态规格:按模板 sortOrder 排序,空值不展示', () => {
const items = resolveConsignmentSpecDisplayItems([productSpec, levelSpec, systemSpec], {
product: '15',
system: 'ios',
diamondLevel: '',
})
assert.deepEqual(
items.map((item) => item.key),
['system', 'product'],
)
assert.equal(items[0]?.value, '苹果')
})
test('动态规格:没有模板字段时返回空数组', () => {
assert.deepEqual(resolveConsignmentSpecDisplayItems([], { product: '15' }), [])
assert.deepEqual(resolveConsignmentSpecDisplayItems(undefined, undefined), [])
})
test('规格文本:后端 specText 优先', () => {
assert.equal(
resolveConsignmentSpecText({
specText: '商品 碎梦浮光珍宝礼盒',
specs: [productSpec],
specValues: { product: '9' },
}),
'商品 碎梦浮光珍宝礼盒',
)
})
test('规格文本:无 specText 时按模板现拼', () => {
assert.equal(
resolveConsignmentSpecText({ specs: [productSpec], specValues: { product: '15' } }),
'商品 碎梦浮光珍宝礼盒',
)
})
test('规格文本:没有模板规格时回退旧列,0 璀璨不展示', () => {
assert.equal(
resolveConsignmentSpecText({
system: '苹果',
serverZone: '微信区',
series: '暗潮',
diamondLevel: 3,
brillianceCount: 2,
}),
'苹果 / 微信区 / 暗潮 / 3钻 / 2璀璨',
)
assert.equal(formatLegacyConsignmentSpec({ diamondLevel: 1, brillianceCount: 0 }), '1钻')
assert.equal(resolveConsignmentSpecText({}), '-')
})