feat(douyin-mashida): 商品展示统一改为内部 SKU(引流标题降级)

平台 sku_order_list[].code 是商家维护的**内部 SKU**(如「幸运币2个」),
product_name 只是店铺用来**引流**的长标题(如「【测试专用】和平精英皮肤小店入口…」)。
商家按内部 SKU 认货(后续履约匹配也用它),原来的展示把引流标题当商品名,
列表/详情/兑换页三处都会让人认错货。

改为以内部 SKU 为主、引流标题降级为副信息:
- 后台订单列表「商品 / 任务」:itemTitle = 内部 SKU,skuNick = 引流标题
- 后台订单详情「商品明细」:商品 = 内部 SKU;SKU/规格 不再重复展示同一串
- 兑换中心 /redeem:商品 = 内部 SKU(粗体)+ 引流标题(灰色小字,新增 productTitle 字段)

实现只在 `source === 'douyin_mashida'` 时生效(resolveOrderItemTitle /
resolveOrderItemSkuNick 加 douyin 分支),其它平台展示逻辑不变;
用真实订单形态补了单测。
This commit is contained in:
yml2213
2026-10-09 13:31:45 +08:00
parent 3505ca4e05
commit 7834ee7bef
6 changed files with 109 additions and 3 deletions
@@ -36,7 +36,10 @@ export type RedeemOrderView = {
orderNo: string
/** 脱敏摘要(不含买家手机号/地址/open_id) */
summary: {
/** 商品名(抖音码速达口径:**内部 SKU**,即平台 `sku_order_list[].code`) */
productName: string
/** 平台商品标题(店铺里用来引流的标题,仅作副信息展示) */
productTitle: string
quantity: number
amountFen: number
paidAt: string | null
@@ -260,7 +263,10 @@ function buildSummary(order: OrderRow, items: OrderItemRow[]) {
const quantity = items.reduce((total, item) => total + Math.max(1, Number(item.quantity || 1)), 0)
return {
productName: String(firstItem?.sku_name || order.shop_name || '').trim(),
// 内部 SKU(平台 code,如「幸运币2个」)才是商家认的商品;
// 平台标题(product_name)只是引流词,降级为副标题,避免买家/客服认错货。
productName: String(firstItem?.sku_code || firstItem?.sku_name || order.shop_name || '').trim(),
productTitle: String(firstItem?.sku_name || '').trim(),
quantity: Math.max(1, quantity),
amountFen: Number(order.total_amount || 0),
paidAt: order.paid_at || null,