Files
order_site/apps/frontend/tests/consignment-evidence.test.ts
yml2213 ca04e09deb feat(consignment): 客服端凭证链可视化(提报凭证 + 赠送凭证)
问题:一件寄卖有两类凭证,客服界面只看得见第一类,还是 48x48 一张缩略图,
看不出是主页还是物品;第二类(证明"这件货真送出去了"的赠送完成截图)只在工单验收界面,
客服要证明赠送是否完成得自己跨模块翻,没有任何地方把两类凭证并排呈现。

- 两类凭证分别在哪里:
  提报凭证 = 提报表 screenshots_json(卖家提报时的游戏主页截图,含物品/仓库详情)
  赠送凭证 = 绑定工单的验收资料 work_orders.acceptance_json(冷却结束后上传、客服凭此验收)
- 后端把凭证链从客服两个列表/详情接口一起下发:提报表/库存 → 结果库存 → 绑定工单,
  新增 submissionScreenshots / giftEvidenceImages / giftEvidenceNote / giftEvidenceSubmittedAt /
  giftWorkOrderNo / giftWorkOrderStatus / giftEvidenceReviewStatus(none|pending|accepted|submitted);
  赠送凭证图从 imageUrls 与 files[].url|mediumUrl|thumbnailUrl 两处取并去重
- 提报凭证口径统一:有来源提报单用提报单主页截图,客服手工入库现货回退库存自身截图,
  前端只看 submissionScreenshots 一个字段,不会拿错
- 前端新增共享组件 ConsignmentEvidenceGallery(缩略图 + 大图预览 + 共 N 张,
  预览用 Image.PreviewGroup items,被折叠的图在大图里仍能翻看);审核面板把「凭据截图」
  拆成「提报凭证(游戏主页截图)」与「赠送凭证」(带待验收/已验收 Tag + 关联工单 Tooltip),
  仓库面板新增「凭证」列并分组展示,两个详情弹窗同口径(含备注/提交时间/工单号/一句话说明)

真实库验证:赠送凭证解析在构造的工单验收资料上取到 3 张图(imageUrls 1 + files 2)并识别
pending_acceptance → 待客服验收;提报凭证在真实数据上取到 1 张。临时数据已清理。
2026-09-17 11:22:59 +08:00

90 lines
3.3 KiB
TypeScript

import assert from 'node:assert/strict'
import test from 'node:test'
import {
describeGiftEvidence,
resolveGiftEvidenceBadge,
} from '../src/utils/consignment-evidence.ts'
import type { GiftEvidenceReviewStatus } from '../src/types/consignment.ts'
/** 故意构造后端未来可能新增的状态,验证未知状态不会崩 */
const FUTURE_STATUS = 'reviewing' as unknown as GiftEvidenceReviewStatus
test('赠送凭证标签:四种状态各有文案与配色', () => {
assert.deepEqual(resolveGiftEvidenceBadge('none'), { text: '未提交', color: 'default' })
assert.deepEqual(resolveGiftEvidenceBadge('pending'), { text: '待客服验收', color: 'gold' })
assert.deepEqual(resolveGiftEvidenceBadge('accepted'), { text: '已验收', color: 'green' })
assert.deepEqual(resolveGiftEvidenceBadge('submitted'), { text: '已提交', color: 'blue' })
})
test('赠送凭证标签:未知状态回退为未提交 / default', () => {
assert.deepEqual(resolveGiftEvidenceBadge(FUTURE_STATUS), { text: '未提交', color: 'default' })
assert.equal(describeGiftEvidence({ status: FUTURE_STATUS, images: ['a.png'] }), '未提交')
})
test('未提交(none)只说一句「未提交」', () => {
assert.equal(describeGiftEvidence({ status: 'none', images: [] }), '未提交')
})
test('未提交但有残留图片与时间时,仍然只说「未提交」', () => {
assert.equal(
describeGiftEvidence({
status: 'none',
images: ['a.png', 'b.png'],
submittedAt: '2026-09-17T10:00:00',
}),
'未提交',
)
})
test('待客服验收:按「已提交 N 张,待客服验收」,没有提交时间就不拼时间', () => {
assert.equal(
describeGiftEvidence({ status: 'pending', images: ['a.png', 'b.png', 'c.png'] }),
'已提交 3 张,待客服验收',
)
assert.equal(
describeGiftEvidence({
status: 'pending',
images: ['a.png'],
submittedAt: '2026-09-17T10:00:00',
}),
'已提交 1 张,待客服验收 · 2026-09-17 10:00',
)
})
test('已验收:按「已验收(N 张)· 提交时间」', () => {
assert.equal(
describeGiftEvidence({
status: 'accepted',
images: ['a.png', 'b.png', 'c.png'],
submittedAt: '2026-09-17T10:00:30',
}),
'已验收(3 张)· 2026-09-17 10:00',
)
})
test('已提交:有图按张数,0 张 / 空数组写「已提交,无截图」', () => {
assert.equal(describeGiftEvidence({ status: 'submitted', images: ['a.png'] }), '已提交 1 张')
assert.equal(
describeGiftEvidence({ status: 'submitted', images: ['a.png', '', ' '] }),
'已提交 1 张',
)
assert.equal(describeGiftEvidence({ status: 'submitted', images: [] }), '已提交,无截图')
})
test('已验收但没截图写「已验收,无截图」;时间非法或空白时省略时间部分', () => {
assert.equal(describeGiftEvidence({ status: 'accepted', images: [] }), '已验收,无截图')
assert.equal(
describeGiftEvidence({ status: 'accepted', images: [], submittedAt: '' }),
'已验收,无截图',
)
assert.equal(
describeGiftEvidence({ status: 'accepted', images: [], submittedAt: ' ' }),
'已验收,无截图',
)
assert.equal(
describeGiftEvidence({ status: 'accepted', images: [], submittedAt: '不是时间' }),
'已验收,无截图',
)
})