import { useEffect, useMemo, useState } from 'react'; import { View, Text } from '@tarojs/components'; import Taro, { useRouter, useShareAppMessage, useShareTimeline } from '@tarojs/taro'; import PageShell from '../../components/PageShell'; import SubPageHeader from '../../components/SubPageHeader'; import ShareNavButton from '../../components/ShareNavButton'; import WechatShareReady from '../../components/WechatShareReady'; import ContactCsButton from '../../components/ContactCsButton'; 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'; const isWeapp = process.env.TARO_ENV === 'weapp'; type OrderItem = { productName?: string; productSpec?: string; quantity?: number; }; type OrderDetail = { id: string; orderNo?: string; status?: string; payAmount?: number; productName?: string; quantity?: number; qty?: number; receiverName?: string; receiverPhone?: string; receiverProvince?: string; receiverCity?: string; receiverDistrict?: string; receiverAddress?: string; createdAt?: string; originOrderId?: string | null; items?: OrderItem[]; }; const STATUS_LABELS: Record = { PENDING_PAY: '待付款', PENDING_SHIP: '待发货', OUT_WAREHOUSE: '出库中', SHIPPING: '配送中', SHIPPED: '配送中', PENDING_RECEIVE: '待签收', DELIVERED: '待签收', COMPLETED: '已完成', CANCELLED: '已取消', REFUNDING: '退款中', 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 ?? ''; const [order, setOrder] = useState(null); const [confirming, setConfirming] = useState(false); useEffect(() => { if (!orderId) return; request(`/trade/orders/${orderId}`) .then(setOrder) .catch((e) => toast(e instanceof Error ? e.message : '加载失败')); }, [orderId]); const isReship = !!order?.originOrderId; const canPay = !!order && order.status === 'PENDING_PAY' && !isReship; const canConfirmReceive = !!order && !isReship && ['PENDING_RECEIVE', 'DELIVERED'].includes(order.status || ''); 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: productName !== '杜康商品' ? `我买了${productName} · 杜康好客` : DEFAULT_SHARE_TITLE, desc: DEFAULT_SHARE_DESC, path: orderId ? `/pages/order-detail/index?id=${orderId}` : '/pages/home/index', }), [productName, orderId], ); useShareAppMessage(() => toWeappShareMessage(sharePayload)); useShareTimeline(() => ({ title: sharePayload.title || DEFAULT_SHARE_TITLE, query: orderId ? `id=${orderId}` : '', })); function goPay() { if (!order) return; Taro.navigateTo({ url: buildPayUrl({ orderId: order.id }) }); } function goCustomerService() { Taro.navigateTo({ url: '/pages/customer-service/index' }); } async function confirmReceive() { if (!order || !canConfirmReceive || confirming) return; const { confirm } = await Taro.showModal({ title: '确认收货?', content: '请确认已收到商品。确认后订单将完成,好客权益可正常使用。', confirmText: '确认收货', cancelText: '再想想', }); if (!confirm) return; setConfirming(true); try { const updated = await request(`/trade/orders/${order.id}/confirm-receive`, { method: 'POST', data: {}, }); setOrder(updated); toast('已确认收货'); } catch (e) { toast(e instanceof Error ? e.message : '确认收货失败'); } finally { setConfirming(false); } } const pageClass = [ 'order-detail-page', order ? 'order-detail-page--with-actions' : '', canPay || canConfirmReceive ? 'order-detail-page--with-pay' : '', ] .filter(Boolean) .join(' '); return ( } /> {!order ? ( 加载中… ) : ( <> 订单状态 {STATUS_LABELS[order.status || ''] || order.status || '处理中'} 商品信息 {productName} x{quantity} 实付金额 ¥{Number(order.payAmount ?? 0).toFixed(2)} 收货信息 {receiverLine || addressText ? ( <> {receiverLine ? ( 收货人 {receiverLine} ) : null} {addressText ? ( 收货地址 {addressText} ) : null} ) : ( 地址信息待完善 )} 订单信息 订单编号 {order.orderNo || order.id} 下单时间 {order.createdAt ? String(order.createdAt).slice(0, 19).replace('T', ' ') : '-'} )} {order ? ( {isWeapp ? ( 联系客服 ) : ( 联系客服 )} {canPay ? ( <> 待支付 ¥{Number(order.payAmount ?? 0).toFixed(2)} 去付款 ) : null} {canConfirmReceive ? ( void confirmReceive()} > {confirming ? '提交中…' : '确认收货'} ) : null} ) : null} ); }