寄卖手动匹配改走内部现货并统一展示与超时口径
- 手动匹配不再指派供货打手:停在待加好友,清空截止时间与超时分钟 - 物品名模板去掉「0 璀璨」残留;寄卖单号无提报号时回退库存编号 - 状态列按寄卖库存显示内部匹配,打手列保留供货打手标签 - 超时配置增加启用开关,默认关闭(不限时) - 补充前后端回归测试
This commit is contained in:
@@ -58,3 +58,25 @@ test('寄售仓库:列表/详情按模板渲染,编辑不再写死旧字段'
|
||||
assert.ok(page.includes('...(hasDynamicSpecs'), '有模板规格时不得再提交旧规格字段')
|
||||
assert.ok(page.includes('请填写「'), '动态必填字段必须在表单层校验')
|
||||
})
|
||||
|
||||
test('物品详情的打手提报时间取来源提报创建时间', () => {
|
||||
const inventoryPage = readPanel('ConsignmentInventoryPanel.tsx')
|
||||
assert.ok(
|
||||
inventoryPage.includes('viewingItem.sourceSubmissionCreatedAt || viewingItem.createdAt'),
|
||||
'打手提报时间必须优先取来源提报创建时间',
|
||||
)
|
||||
|
||||
const repo = readFileSync(
|
||||
fileURLToPath(
|
||||
new URL(
|
||||
'../../backend/src/repositories/worker-platform/consignment-repo.ts',
|
||||
import.meta.url,
|
||||
),
|
||||
),
|
||||
'utf8',
|
||||
)
|
||||
assert.ok(
|
||||
repo.includes('cs.created_at AS source_submission_created_at'),
|
||||
'库存查询必须带来源提报创建时间',
|
||||
)
|
||||
})
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
import test from 'node:test'
|
||||
|
||||
import type { WorkOrder } from '../src/types/worker-platform.ts'
|
||||
import {
|
||||
isConsignmentStockOrder,
|
||||
isInternalConsignmentOrder,
|
||||
resolveConsignmentWorkerDisplay,
|
||||
} from '../src/utils/consignment-display.ts'
|
||||
|
||||
function readPanel(name: string) {
|
||||
return readFileSync(
|
||||
fileURLToPath(new URL(`../src/pages/admin/panels/${name}`, import.meta.url)),
|
||||
'utf8',
|
||||
)
|
||||
}
|
||||
|
||||
test('内部匹配展示:押金履约也算寄卖库存匹配', () => {
|
||||
const deposit = {
|
||||
material: {
|
||||
consignment: { inventoryId: 12, fulfillmentType: 'worker_deposit', workerId: 7 },
|
||||
},
|
||||
}
|
||||
assert.equal(isConsignmentStockOrder(deposit), true)
|
||||
assert.equal(
|
||||
isConsignmentStockOrder({ material: { consignment: { inventoryNo: 'INV1' } } }),
|
||||
true,
|
||||
)
|
||||
assert.equal(isConsignmentStockOrder({ material: {} }), false)
|
||||
assert.equal(
|
||||
isInternalConsignmentOrder(deposit),
|
||||
false,
|
||||
'操作判定仍按原口径,不影响加好友文案与撤销入口',
|
||||
)
|
||||
})
|
||||
|
||||
test('内部匹配展示:供货打手 id 会随展示信息返回', () => {
|
||||
const display = resolveConsignmentWorkerDisplay({
|
||||
material: { consignment: { inventoryId: 1, workerId: 7, workerName: '苏尔南2号' } },
|
||||
} as unknown as WorkOrder)
|
||||
assert.equal(display?.tagText, '供货打手')
|
||||
assert.equal(display?.workerId, 7)
|
||||
assert.equal(display?.primaryName, '苏尔南2号')
|
||||
})
|
||||
|
||||
test('手动匹配内部现货:workerName 只是供货人快照,不算接单打手', () => {
|
||||
const manualMatched = {
|
||||
material: {
|
||||
consignment: {
|
||||
inventoryId: 88,
|
||||
inventoryNo: 'INV20261113001',
|
||||
sourceSubmissionNo: 'SUB20261113001',
|
||||
fulfillmentType: 'internal_stock',
|
||||
workerName: '苏尔南2号小号',
|
||||
},
|
||||
},
|
||||
}
|
||||
// 撤销寄卖入口依赖「没有接单打手」这一口径,供货人快照不能把它挡掉
|
||||
assert.equal(isInternalConsignmentOrder(manualMatched), true)
|
||||
assert.equal(isConsignmentStockOrder(manualMatched), true)
|
||||
const display = resolveConsignmentWorkerDisplay(manualMatched as unknown as WorkOrder)
|
||||
assert.equal(display?.tagText, '供货打手')
|
||||
assert.equal(display?.primaryName, '苏尔南2号小号')
|
||||
assert.equal(display?.workerId, null)
|
||||
})
|
||||
|
||||
test('工单列表:内部匹配标签用展示口径,打手列保留供货打手', () => {
|
||||
const orders = readPanel('WorkOrdersPanel.tsx')
|
||||
assert.ok(orders.includes('isConsignmentStockOrder(row)'), '状态列必须用寄卖库存展示判定')
|
||||
assert.ok(
|
||||
orders.includes("return info.sourceSubmissionNo || info.inventoryNo || ''"),
|
||||
'寄卖单号必须回退库存编号',
|
||||
)
|
||||
|
||||
const utils = readFileSync(
|
||||
fileURLToPath(new URL('../src/pages/admin/panels/work-order-panel-utils.tsx', import.meta.url)),
|
||||
'utf8',
|
||||
)
|
||||
assert.ok(utils.includes('supplierId === assignedId'), '接单人就是供货打手时必须保留供货打手标签')
|
||||
assert.ok(
|
||||
utils.includes('供货打手:${consignmentDisplay.primaryName}'),
|
||||
'指派其他打手时必须补一行供货打手信息',
|
||||
)
|
||||
})
|
||||
|
||||
test('配置面板:超时开关默认关闭,关闭即不限时', () => {
|
||||
const panel = readPanel('ConsignmentConfigPanel.tsx')
|
||||
assert.ok(panel.includes("name={['timeout', 'enabled']}"), '超时设置必须有启用开关')
|
||||
assert.ok(
|
||||
panel.includes("timeout: { enabled: false, hours: 0.5, policy: 'reopen' }"),
|
||||
'新建配置默认不限时',
|
||||
)
|
||||
assert.ok(panel.includes('minutes: values.timeout.enabled'), '保存时必须按开关决定 0 或分钟')
|
||||
assert.ok(panel.includes('默认关闭(不限时)'), '配置区文案必须说明默认不限时')
|
||||
})
|
||||
@@ -0,0 +1,67 @@
|
||||
import assert from 'node:assert/strict'
|
||||
import test from 'node:test'
|
||||
|
||||
import type { ConsignmentSpecField } from '../src/types/consignment.ts'
|
||||
import { buildSpecItemName } from '../src/utils/consignment-spec.ts'
|
||||
|
||||
function makeSpec(
|
||||
overrides: Partial<ConsignmentSpecField> & Pick<ConsignmentSpecField, 'key' | 'label'>,
|
||||
): ConsignmentSpecField {
|
||||
return {
|
||||
type: 'text',
|
||||
required: false,
|
||||
options: [],
|
||||
placeholder: '',
|
||||
helpText: '',
|
||||
matchMode: 'exact',
|
||||
wildcardValues: [],
|
||||
showInItemName: true,
|
||||
sortOrder: 0,
|
||||
...overrides,
|
||||
}
|
||||
}
|
||||
|
||||
const surnanSpecs = [
|
||||
makeSpec({ key: 'system', label: '操作系统', sortOrder: 10 }),
|
||||
makeSpec({ key: 'series', label: '系列', sortOrder: 20 }),
|
||||
makeSpec({ key: 'diamondLevel', label: '钻石等级', type: 'number', sortOrder: 30 }),
|
||||
makeSpec({ key: 'brillianceCount', label: '璀璨数', type: 'number', sortOrder: 40 }),
|
||||
]
|
||||
|
||||
const surnanTemplate = '{system}{series}{diamondLevel}钻{brillianceCount}璀璨 苏尔南'
|
||||
|
||||
test('物品名模板:璀璨数为 0 时不残留「璀璨」单位', () => {
|
||||
assert.equal(
|
||||
buildSpecItemName(surnanTemplate, surnanSpecs, {
|
||||
system: '安卓',
|
||||
series: '怒嚎',
|
||||
diamondLevel: '2',
|
||||
brillianceCount: '0',
|
||||
}),
|
||||
'安卓怒嚎2钻 苏尔南',
|
||||
)
|
||||
})
|
||||
|
||||
test('物品名模板:璀璨数大于 0 时单位正常保留', () => {
|
||||
assert.equal(
|
||||
buildSpecItemName(surnanTemplate, surnanSpecs, {
|
||||
system: '安卓',
|
||||
series: '怒嚎',
|
||||
diamondLevel: '2',
|
||||
brillianceCount: '3',
|
||||
}),
|
||||
'安卓怒嚎2钻3璀璨 苏尔南',
|
||||
)
|
||||
})
|
||||
|
||||
test('物品名模板:钻级为空时「钻」也不会单独残留', () => {
|
||||
assert.equal(
|
||||
buildSpecItemName(surnanTemplate, surnanSpecs, {
|
||||
system: '安卓',
|
||||
series: '怒嚎',
|
||||
diamondLevel: '',
|
||||
brillianceCount: '0',
|
||||
}),
|
||||
'安卓怒嚎 苏尔南',
|
||||
)
|
||||
})
|
||||
Reference in New Issue
Block a user