import { useEffect, useMemo, useState } from 'react'; import { Link, useNavigate, useParams, useSearchParams } from 'react-router-dom'; import SubPageHeader from '../components/SubPageHeader'; import AppImage from '@dukang/shared-ui/AppImage'; import { request } from '../lib/api'; import { STITCH_ORDER_PRODUCT_IMAGE } from '../lib/order-images'; type OrderItem = { productName: string; productSpec: string; productImage: string; unitPrice: number; quantity: number; }; type StatusLog = { toStatus: string; createdAt: string; remark?: string; }; type Order = { id: string; orderNo: string; orderType?: string; status: string; originOrderId?: string | null; remark?: string | null; receiverName: string; receiverPhone: string; receiverAddress: string; payAmount: number; benefitAmount: number; createdAt: string; items?: OrderItem[]; statusLogs?: StatusLog[]; }; const RESHIP_TIMELINE = [ { key: 'placed', title: '补发单已下达', desc: '' }, { key: 'pickup', title: '包裹揽收中', desc: '包裹正由物流网点揽收处理' }, { key: 'transit', title: '运输中', desc: '暂无物流信息' }, ] as const; const STATUS_BANNER: Record = { PENDING_PAY: { title: '待付款', subtitle: '请尽快完成支付' }, PENDING_SHIP: { title: '待发货', subtitle: '商家正在备货' }, OUT_WAREHOUSE: { title: '出库中', subtitle: '商品正在出库' }, SHIPPING: { title: '配送中', subtitle: '包裹正在配送途中' }, PENDING_RECEIVE: { title: '待收货', subtitle: '请注意查收' }, COMPLETED: { title: '已完成', subtitle: '感谢您的购买' }, RESHIP: { title: '补发中', subtitle: '包裹正在揽收,请耐心等待' }, }; function maskPhone(phone: string) { return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2'); } function formatDateTime(value: string) { const d = new Date(value); if (Number.isNaN(d.getTime())) return value; const pad = (n: number) => String(n).padStart(2, '0'); return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`; } function reshipTimelineStep(status: string, index: number): 'done' | 'active' | 'pending' { if (status === 'COMPLETED') return 'done'; let activeIndex = 1; if (['SHIPPING', 'PENDING_RECEIVE'].includes(status)) activeIndex = 2; if (index < activeIndex) return 'done'; if (index === activeIndex) return 'active'; return 'pending'; } export default function OrderDetailPage() { const { id } = useParams(); const [params] = useSearchParams(); const navigate = useNavigate(); const [order, setOrder] = useState(null); const [showCs, setShowCs] = useState(false); useEffect(() => { if (id) request('USER_H5', `/trade/orders/${id}`).then(setOrder); }, [id]); const isReship = order?.orderType === 'RESHIPMENT' || params.get('type') === 'reship'; const banner = useMemo(() => { if (!order) return { title: '', subtitle: '' }; if (isReship) return STATUS_BANNER.RESHIP; return STATUS_BANNER[order.status] ?? { title: order.status, subtitle: '' }; }, [order, isReship]); const item = order?.items?.[0]; const productImage = item?.productImage || STITCH_ORDER_PRODUCT_IMAGE; const placedAt = order?.statusLogs?.find((l) => l.toStatus === 'PENDING_SHIP')?.createdAt ?? order?.createdAt ?? ''; if (!order) return
加载中...
; return (
navigate(-1)} />

{banner.title}

{banner.subtitle}

local_shipping
{isReship && (

物流动态

{RESHIP_TIMELINE.map((step, index) => { const state = reshipTimelineStep(order.status, index); return (
{state === 'done' && ( check )} {state === 'active' && } {state === 'pending' && }

{step.title}

{index === 0 && placedAt && (

{formatDateTime(placedAt)}

)} {step.desc && state !== 'pending' && (

{step.desc}

)} {step.desc && state === 'pending' && (

{step.desc}

)}
); })}
)} {isReship && (
补发原因 {order.remark || '商品破损'}
关联原订单 {order.originOrderId ? ( 查看原订单 ) : ( DK20231005002 )}
)} {item && (

{item.productName}

{item.productSpec}

¥{isReship ? '0.00' : Number(item.unitPrice).toFixed(2)} x{item.quantity}
{Number(order.benefitAmount) > 0 && (
¥{order.benefitAmount}好客权益 随单赠送
info
)}
)}
location_on

收货信息

{order.receiverName} {maskPhone(order.receiverPhone)}

{order.receiverAddress}

{!isReship && (
订单号 {order.orderNo}
实付金额 ¥{order.payAmount}
)}
{showCs && (
setShowCs(false)}>
e.stopPropagation()}>

联系客服

preV1 Mock:客服工作时间 9:00-18:00,请描述订单号 {order.orderNo}

)}
); }