feat(consignment): 保证金支持按规格选项价格乘寄售数量计算

This commit is contained in:
2026-11-08 12:52:24 +08:00
parent ac2411ab6e
commit 01c2517f29
9 changed files with 436 additions and 17 deletions
@@ -0,0 +1,85 @@
import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import { fileURLToPath } from 'node:url'
import test from 'node:test'
import { resolveConsignmentDepositFen } from '../src/utils/consignment-deposit.ts'
const perSpecDeposit = {
enabled: true,
mode: 'per_spec' as const,
fixedAmountFen: 0,
unitAmountFen: 0,
specKey: 'diamondLevel',
specPrices: { '1': 100, '3': 300 },
}
test('按数量(规格):选项价格 × 寄售数量', () => {
assert.equal(
resolveConsignmentDepositFen({
deposit: perSpecDeposit,
quantity: 5,
specValues: { diamondLevel: '3' },
fallbackFen: 2000,
}),
1500,
)
})
test('按数量(规格):未配价格或字段缺失按 0 计,不阻塞发布', () => {
assert.equal(
resolveConsignmentDepositFen({
deposit: perSpecDeposit,
quantity: 2,
specValues: { diamondLevel: '2' },
fallbackFen: 2000,
}),
0,
)
assert.equal(
resolveConsignmentDepositFen({
deposit: perSpecDeposit,
quantity: 2,
specValues: {},
fallbackFen: 2000,
}),
0,
)
})
test('固定 / 按数量 / 关闭保证金的口径保持原样', () => {
assert.equal(
resolveConsignmentDepositFen({
deposit: { ...perSpecDeposit, enabled: false },
quantity: 3,
specValues: { diamondLevel: '3' },
fallbackFen: 2000,
}),
2000,
)
assert.equal(
resolveConsignmentDepositFen({
deposit: { ...perSpecDeposit, mode: 'fixed', fixedAmountFen: 500 },
quantity: 3,
fallbackFen: 2000,
}),
500,
)
assert.equal(
resolveConsignmentDepositFen({
deposit: { ...perSpecDeposit, mode: 'per_quantity', unitAmountFen: 200 },
quantity: 3,
fallbackFen: 2000,
}),
600,
)
})
test('打手端发布页:保证金按规格价格实时计算', () => {
const page = readFileSync(
fileURLToPath(new URL('../src/pages/worker/WorkerConsignmentPage.tsx', import.meta.url)),
'utf8',
)
assert.ok(page.includes('resolveConsignmentDepositFen('), '发布页押金必须走统一的规格保证金计算')
assert.ok(page.includes('deposit.specKey'), '发布页必须按所选规格字段实时计算押金')
})
@@ -124,3 +124,14 @@ test('寄卖配置:未售出时长支持一位小数', () => {
assert.ok(block.includes('precision={1}'), '未售出时长必须支持一位小数')
assert.ok(block.includes('min={0.1}'), '未售出时长下限应为 0.1 小时')
})
test('寄卖配置:保证金支持按数量(规格),弹窗内配置选项价格', () => {
const panel = read('../src/pages/admin/panels/ConsignmentConfigPanel.tsx')
assert.ok(
panel.includes("{ value: 'per_spec', label: '按数量(规格)' }"),
'保证金模式必须包含「按数量(规格)」',
)
assert.ok(panel.includes('title="按数量(规格)保证金"'), '必须提供规格价格配置弹窗')
assert.ok(panel.includes('specPricesYuan'), '选项价格必须写回配置')
assert.ok(panel.includes('填充全部选项'), '弹窗必须支持批量填充选项价格')
})