Files
order_site/apps/frontend/tests/consignment-spec-options.test.ts
T
yml2213 f8101c1730 feat(consignment): 规格口径定案——互通通配 + 后台全量/发布端按物品展示
业务定案:
- 操作后台全量:系统 苹果/安卓/通用,区服 微信区/QQ区/互通;提报审核与
  库存编辑的系统/区服从自由文本改为受控下拉(单一来源 utils/consignment-spec.ts)
- 打手端发布按物品类型展示:苏尔南系统二选一(必须区分端),区服唯一
  「互通」选项且默认选中;后续其他品类在共享常量按品类加条目
- 匹配引擎通配符对称化:区服通配=互通(通用/全区/不限归一化为别名),
  系统通配=通用(双端/全端同理);订单侧写通配同样放行,只增不减匹配面;
  差异描述不把通配对当冲突
- 提报白名单校验(API 层):系统只收 苹果/安卓,区服只收 微信/QQ/互通,
  旧页面缓存或直调接口绕不过
- 物品名拼接:区服为互通时不拼入(对买家无信息量),前后端同口径

后端 481(+互通双向匹配/通配不算差异/真冲突仍排除/白名单校验)、
前端 54(+选项口径/表单引用/默认值)测试全绿;typecheck/lint/format/check:sql 通过
docs/寄卖系统优化方案.md 记录批次 W
2026-09-17 13:01:59 +08:00

62 lines
2.9 KiB
TypeScript

import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
/**
* 寄卖规格口径(2026-09 定案):
* - 操作后台全量:系统 苹果/安卓/通用,区服 微信区/QQ区/互通;
* - 打手端发布按物品类型展示:苏尔南 = 系统二选一(苹果/安卓,不给通用),
* 区服固定「互通」且默认选中(互通 = QQ/微信都能收);
* - 「互通」是区服通配值(互通现货匹配微信/QQ 订单,反之亦然),
* 订单文案里的「通用/全区/不限」由后端归一化成通配别名。
*/
test('后台全量选项:系统含通用,区服含互通', () => {
const source = readFileSync(
new URL('../src/utils/consignment-spec.ts', import.meta.url).pathname,
'utf8',
)
assert.ok(source.includes("{ label: '通用', value: '通用' }"), '系统全量选项必须含「通用」')
assert.ok(source.includes("value: '互通'"), '区服选项必须包含「互通」')
})
test('苏尔南发布选项:系统只有苹果/安卓,区服唯一「互通」且为默认值', () => {
const source = readFileSync(
new URL('../src/utils/consignment-spec.ts', import.meta.url).pathname,
'utf8',
)
const surnanSystem = source.slice(
source.indexOf('SURNAN_PUBLISH_SYSTEM_OPTIONS'),
source.indexOf('SURNAN_PUBLISH_ZONE_OPTIONS'),
)
assert.ok(!surnanSystem.includes("value: '通用'"), '苏尔南发布不允许再选系统「通用」')
assert.ok(source.includes("export const SURNAN_DEFAULT_ZONE = '互通'"), '苏尔南区服默认「互通」')
const surnanZone = source.slice(source.indexOf('SURNAN_PUBLISH_ZONE_OPTIONS'))
assert.ok(
!surnanZone.slice(0, surnanZone.indexOf('\n\n')).includes("value: '微信区'"),
'苏尔南发布端区服只有互通一个选项',
)
})
test('打手端发布表单:用苏尔南选项集 + 区服默认值,不引后台全量', () => {
const source = readFileSync(
new URL('../src/pages/worker/WorkerConsignmentPage.tsx', import.meta.url).pathname,
'utf8',
)
assert.ok(source.includes('SURNAN_PUBLISH_SYSTEM_OPTIONS'))
assert.ok(source.includes('SURNAN_PUBLISH_ZONE_OPTIONS'))
assert.ok(source.includes('initialValue={SURNAN_DEFAULT_ZONE}'), '区服默认值要落到表单项上')
assert.ok(!source.includes('[...CONSIGNMENT_'), '发布端不直接引用后台全量选项')
})
test('客服端两个表单(提报审核 / 库存编辑)用后台全量选项,不再自由填写', () => {
for (const file of ['ConsignmentSubmissionsPanel.tsx', 'ConsignmentInventoryPanel.tsx']) {
const source = readFileSync(
new URL(`../src/pages/admin/panels/${file}`, import.meta.url).pathname,
'utf8',
)
assert.ok(source.includes('CONSIGNMENT_SYSTEM_OPTIONS'), `${file} 应引用全量系统选项`)
assert.ok(source.includes('CONSIGNMENT_ZONE_OPTIONS'), `${file} 应引用全量区服选项`)
}
})