import { useEffect, useState } from 'react'; import { useNavigate, useParams } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import { request } from '../lib/api'; import { toastError, toastSuccess } from '../lib/toast'; import { usePartnerPageView } from '../lib/usePageView'; const TIMELINE = [ { key: 'confirm', label: '待确认' }, { key: 'accepted', label: '已接单' }, { key: 'delivering', label: '配送中' }, { key: 'shipping', label: '运输中', desc: '包裹正在送往目的地' }, { key: 'done', label: '已送达' }, ]; function statusIndex(status: string) { const s = String(status).toUpperCase(); if (s === 'COMPLETED') return 4; if (s.includes('SHIP') || s === 'OUT_WAREHOUSE') return 3; if (s === 'PENDING_RECEIVE') return 3; if (s.includes('DELIVER')) return 2; return 1; } function statusBanner(status: string) { const s = String(status).toUpperCase(); if (s.includes('SHIP') || s === 'OUT_WAREHOUSE') return { title: '运输中', desc: '预计今日 18:00 前送达', icon: 'local_shipping' }; if (s === 'COMPLETED') return { title: '已完成', desc: '订单已送达', icon: 'check_circle' }; if (s.includes('PENDING')) return { title: '待发货', desc: '商家正在备货', icon: 'inventory_2' }; return { title: status, desc: '', icon: 'receipt_long' }; } function canShip(status: string) { const s = status.toUpperCase(); return s.includes('PENDING') || s === 'PAID' || s === 'PENDING_SHIP'; } export default function OrderDetailPage() { const { id } = useParams(); usePartnerPageView('partner_order_detail_view', id ? { orderId: id } : undefined); const navigate = useNavigate(); const [order, setOrder] = useState | null>(null); const [shipping, setShipping] = useState(false); useEffect(() => { document.title = '订单详情'; }, []); useEffect(() => { if (id) void request>('PARTNER_H5', `/partner/orders/${id}`).then(setOrder); }, [id]); async function reload() { if (!id) return; const next = await request>('PARTNER_H5', `/partner/orders/${id}`); setOrder(next); } async function advance(status: string) { if (!id) return; setShipping(true); try { await request('PARTNER_H5', `/partner/orders/${id}/mock-advance-delivery`, { method: 'POST', body: JSON.stringify({ targetStatus: status }), }); await reload(); toastSuccess('已更新配送状态'); } finally { setShipping(false); } } function handleContactCourier() { const delivery = order?.delivery as Record | undefined; const trackingNo = String(delivery?.trackingNo || delivery?.providerOrderNo || '').trim(); if (trackingNo) { void navigator.clipboard?.writeText(trackingNo); toastSuccess(`运单号已复制:${trackingNo}`); return; } toastError('暂无配送员联系方式'); } if (!order) return
加载中...
; const banner = statusBanner(String(order.status)); const currentIdx = statusIndex(String(order.status)); const payAmount = Number(order.payAmount || 0); const showShip = canShip(String(order.status)); return (
navigate('/orders')} />
{banner.icon}

{banner.title}

{banner.desc &&

{banner.desc}

}
{TIMELINE.map((item, i) => { const done = i < currentIdx; const current = i === currentIdx; const pending = i > currentIdx; return (
{done && check}

{item.label}

{item.desc && current &&

{item.desc}

}
); })}
liquor

{String(order.productName || '杜康好酒')}

x{Number(order.quantity || 1)}

¥ {payAmount.toFixed(2)}

收货地址

location_on

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

{String(order.receiverAddress)}

{showShip && ( )}
{import.meta.env.DEV && (
Dev: Mock 推进配送 {['OUT_WAREHOUSE', 'SHIPPING', 'PENDING_RECEIVE', 'COMPLETED'].map((s) => ( ))}
)}
); }