fix(mini-user): show real receiver fields on order detail
CI / verify (pull_request) Has been cancelled

Order detail used non-existent addressSnapshot; API returns receiverName/phone/address. Render those and fix product qty from items/quantity.
This commit is contained in:
2026-07-15 21:36:44 +08:00
parent d3d56150c5
commit 7b14f4a0cc
2 changed files with 68 additions and 10 deletions
+56 -10
View File
@@ -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<string, string> = {
@@ -37,6 +51,16 @@ const STATUS_LABELS: Record<string, string> = {
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() {
<View className="order-card">
<Text className="order-card-title"></Text>
<View className="order-row">
<Text className="order-row-label">{order.productName || '杜康商品'}</Text>
<Text className="order-row-value">x{order.qty ?? 1}</Text>
<Text className="order-row-label">{productName}</Text>
<Text className="order-row-value">x{quantity}</Text>
</View>
<View className="order-row">
<Text className="order-row-label"></Text>
@@ -106,9 +137,24 @@ export default function OrderDetailPage() {
</View>
<View className="order-card">
<Text className="order-card-title"></Text>
<Text className="u-muted">
{order.addressSnapshot || '地址信息待完善'}
</Text>
{receiverLine || addressText ? (
<>
{receiverLine ? (
<View className="order-row">
<Text className="order-row-label"></Text>
<Text className="order-row-value">{receiverLine}</Text>
</View>
) : null}
{addressText ? (
<View className="order-row order-row--address">
<Text className="order-row-label"></Text>
<Text className="order-row-value order-row-value--wrap">{addressText}</Text>
</View>
) : null}
</>
) : (
<Text className="u-muted"></Text>
)}
</View>
<View className="order-card">
<Text className="order-card-title"></Text>
+12
View File
@@ -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;