From 7b14f4a0cc9b81ecd581e84ef886c240832dc145 Mon Sep 17 00:00:00 2001 From: jacy <18049821889@163.com> Date: Wed, 15 Jul 2026 21:36:44 +0800 Subject: [PATCH] fix(mini-user): show real receiver fields on order detail Order detail used non-existent addressSnapshot; API returns receiverName/phone/address. Render those and fix product qty from items/quantity. --- .../src/pages/order-detail/index.tsx | 66 ++++++++++++++++--- apps/mini-user/src/styles/order.css | 12 ++++ 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/apps/mini-user/src/pages/order-detail/index.tsx b/apps/mini-user/src/pages/order-detail/index.tsx index edfb363..808fa63 100644 --- a/apps/mini-user/src/pages/order-detail/index.tsx +++ b/apps/mini-user/src/pages/order-detail/index.tsx @@ -7,22 +7,36 @@ import ShareNavButton from '../../components/ShareNavButton'; import WechatShareReady from '../../components/WechatShareReady'; import { request, toast } from '../../lib/api'; import { buildPayUrl } from '../../lib/checkout-nav'; +import { maskPhone } from '../../lib/phone'; import { DEFAULT_SHARE_DESC, DEFAULT_SHARE_TITLE, toWeappShareMessage, } from '../../lib/wechat-share'; +type OrderItem = { + productName?: string; + productSpec?: string; + quantity?: number; +}; + type OrderDetail = { id: string; orderNo?: string; status?: string; payAmount?: number; productName?: string; + quantity?: number; qty?: number; - addressSnapshot?: string; + receiverName?: string; + receiverPhone?: string; + receiverProvince?: string; + receiverCity?: string; + receiverDistrict?: string; + receiverAddress?: string; createdAt?: string; originOrderId?: string | null; + items?: OrderItem[]; }; const STATUS_LABELS: Record = { @@ -37,6 +51,16 @@ const STATUS_LABELS: Record = { REFUNDED: '已退款', }; +function fullReceiverAddress(order: OrderDetail) { + const detail = (order.receiverAddress || '').trim(); + const region = [order.receiverProvince, order.receiverCity, order.receiverDistrict] + .filter(Boolean) + .join(''); + if (!region && !detail) return ''; + if (region && detail.startsWith(region)) return detail; + return `${region}${detail}`; +} + export default function OrderDetailPage() { const router = useRouter(); const orderId = router.params.id ?? ''; @@ -50,16 +74,23 @@ export default function OrderDetailPage() { }, [orderId]); const canPay = !!order && order.status === 'PENDING_PAY' && !order.originOrderId; + const item = order?.items?.[0]; + const productName = item?.productName || order?.productName || '杜康商品'; + const quantity = item?.quantity ?? order?.quantity ?? order?.qty ?? 1; + const addressText = order ? fullReceiverAddress(order) : ''; + const receiverLine = order + ? [order.receiverName, order.receiverPhone ? maskPhone(String(order.receiverPhone)) : ''] + .filter(Boolean) + .join(' ') + : ''; const sharePayload = useMemo( () => ({ - title: order?.productName - ? `我买了${order.productName} · 杜康好客` - : DEFAULT_SHARE_TITLE, + title: productName !== '杜康商品' ? `我买了${productName} · 杜康好客` : DEFAULT_SHARE_TITLE, desc: DEFAULT_SHARE_DESC, path: orderId ? `/pages/order-detail/index?id=${orderId}` : '/pages/home/index', }), - [order, orderId], + [productName, orderId], ); useShareAppMessage(() => toWeappShareMessage(sharePayload)); @@ -94,8 +125,8 @@ export default function OrderDetailPage() { 商品信息 - {order.productName || '杜康商品'} - x{order.qty ?? 1} + {productName} + x{quantity} 实付金额 @@ -106,9 +137,24 @@ export default function OrderDetailPage() { 收货信息 - - {order.addressSnapshot || '地址信息待完善'} - + {receiverLine || addressText ? ( + <> + {receiverLine ? ( + + 收货人 + {receiverLine} + + ) : null} + {addressText ? ( + + 收货地址 + {addressText} + + ) : null} + + ) : ( + 地址信息待完善 + )} 订单信息 diff --git a/apps/mini-user/src/styles/order.css b/apps/mini-user/src/styles/order.css index 7313cf2..5e0eed8 100644 --- a/apps/mini-user/src/styles/order.css +++ b/apps/mini-user/src/styles/order.css @@ -118,6 +118,18 @@ font-weight: 500; } +.order-row--address { + align-items: flex-start; +} + +.order-row-value--wrap { + flex: 1; + text-align: right; + white-space: normal; + word-break: break-all; + line-height: 1.5; +} + .order-row-value--price { color: var(--color-heritage-red); font-weight: 700;