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('默认关闭(不限时)'), '配置区文案必须说明默认不限时') })