- 新增 consignment-template-spec-service:按「分类 + 子树」解析接单模板商品名, 全部可拆成统一维度且无组合碰撞时生成多字段矩阵,否则整类降级为商品名下拉; 选项只存 ruleKey,取价时实时回查模板,模板停用/删除即无价(missingPricePolicy=block)。 - 匹配引擎:模板驱动配置强制使用 profile specs(不再回退库存旧快照),订单侧按 product_rule_id 反解规格;解析失败按 unknown 处理,不参与自动匹配。 - 管理端:寄卖配置新增「从接单模板生成」,弹窗给出推荐模式(规格字段 / 商品名下拉)、 降级原因与组合→模板价覆盖矩阵。 - 打手端:选项超过 8 个改用带搜索的下拉(地铁逃生 100 个商品),规格网格按字段数 自适应铺满;物品名改用商品名,去掉硬编码「苏尔南」后缀。 - 迁移重编号:合并 main 后寄卖线顺延为 147–151,migrate.ts 保留 legacy→new 幂等映射。 - 同工作区的拼单份额报酬口径、超时重匹配兜底、整单/拼单匹配弹窗调整一并提交。 验证:前端 254/254、后端寄卖相关 41/41、双端 tsc 通过;开发库已实跑 发布→审核入库→自动匹配(模板价 1200 → 匹配报酬 1200)。
65 lines
2.3 KiB
TypeScript
65 lines
2.3 KiB
TypeScript
import assert from 'node:assert/strict'
|
|
import { readFileSync } from 'node:fs'
|
|
import { fileURLToPath } from 'node:url'
|
|
import test from 'node:test'
|
|
|
|
function read(relativePath: string) {
|
|
return readFileSync(fileURLToPath(new URL(relativePath, import.meta.url)), 'utf8').replace(
|
|
/\r\n/g,
|
|
'\n',
|
|
)
|
|
}
|
|
|
|
const page = read('../src/pages/worker/WorkerConsignmentPage.tsx')
|
|
const css = read('../src/styles/worker.css')
|
|
|
|
test('模板驱动商品字段:选项超过 8 个必须改用带搜索的下拉,不能用按钮组', () => {
|
|
assert.ok(
|
|
page.includes('options.length > 8'),
|
|
'必须按选项数量降级:地铁逃生 314 个商品全塞进 Radio.Group 会把页面横向撑爆',
|
|
)
|
|
assert.ok(page.includes('optionFilterProp="label"'), '几百个商品名必须支持按名称搜索')
|
|
assert.ok(
|
|
page.includes('popupMatchSelectWidth={false}'),
|
|
'下拉宽度要跟随内容,避免长商品名被固定窄列截断',
|
|
)
|
|
assert.ok(
|
|
page.includes("whiteSpace: 'normal'"),
|
|
'选项文本要允许换行,长商品名不能被 nowrap 撑出弹层',
|
|
)
|
|
})
|
|
|
|
test('少量选项仍保留按钮组,内置五字段体验不变', () => {
|
|
assert.ok(
|
|
page.includes('<Radio.Group') && page.includes('worker-consignment-chips'),
|
|
'系统/区服/系列/钻级/璀璨仍用按钮组',
|
|
)
|
|
assert.ok(
|
|
page.indexOf('options.length > 8') < page.indexOf('<Radio.Group'),
|
|
'数量判断必须在按钮组之前生效',
|
|
)
|
|
})
|
|
|
|
test('规格网格按字段数自适应:单字段铺满、两字段两列', () => {
|
|
assert.ok(page.includes("' is-single'"), '单字段必须走 is-single')
|
|
assert.ok(page.includes("' is-duo'"), '两字段必须走 is-duo')
|
|
assert.ok(
|
|
css.includes('.worker-consignment-spec-grid.is-single') &&
|
|
css.includes('grid-template-columns: minmax(0, 1fr);'),
|
|
'单字段必须铺满整行,否则下拉只剩 168px',
|
|
)
|
|
assert.ok(
|
|
css.includes('.worker-consignment-spec-grid.is-duo') &&
|
|
css.includes('grid-template-columns: repeat(2, minmax(0, 1fr));'),
|
|
'两字段必须两列等宽',
|
|
)
|
|
})
|
|
|
|
test('按钮组兜底换行,避免异常配置再次把页面撑爆', () => {
|
|
const chipsBlock = css.slice(
|
|
css.indexOf('.worker-consignment-chips {'),
|
|
css.indexOf('.worker-consignment-chips {') + 160,
|
|
)
|
|
assert.ok(chipsBlock.includes('flex-wrap: wrap'), '按钮组必须允许换行兜底')
|
|
})
|