import { useCallback, useEffect, useMemo, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import PageHeader from '@dukang/shared-ui/PageHeader'; import PullToRefresh from '@dukang/shared-ui/PullToRefresh'; import { isLoggedIn, request } from '../lib/api'; import { usePartnerSession } from '../contexts/PartnerSessionContext'; import { hasWarehouseAccess } from '../lib/partnerAccess'; import { usePartnerPageView } from '../lib/usePageView'; type DateFilter = 'today' | '7d' | '30d'; type StatusFilter = 'ALL' | 'PENDING_SHIP' | 'SHIPPING' | 'COMPLETED' | 'ABNORMAL'; function orderStatusLabel(status: string) { const s = String(status).toUpperCase(); if (s.includes('SHIP') || s === 'OUT_WAREHOUSE') return { label: '运输中', color: 'var(--color-status-blue)' }; if (s === 'COMPLETED') return { label: '已完成', color: 'var(--color-success-green)' }; if (s.includes('PENDING') || s === 'PAID') return { label: '待发货', color: 'var(--color-secondary)' }; if (s.includes('ERROR') || s.includes('ABNORMAL')) return { label: '异常', color: 'var(--color-error)' }; return { label: status, color: 'var(--color-subtle-gray)' }; } const DATE_FILTERS: { key: DateFilter; label: string }[] = [ { key: 'today', label: '今日' }, { key: '7d', label: '近7天' }, { key: '30d', label: '近30天' }, ]; const STATUS_FILTERS: { key: StatusFilter; label: string }[] = [ { key: 'ALL', label: '全部' }, { key: 'PENDING_SHIP', label: '待发货' }, { key: 'SHIPPING', label: '运输中' }, { key: 'COMPLETED', label: '已完成' }, { key: 'ABNORMAL', label: '异常' }, ]; type OrderListPageProps = { /** Tab 根页:无返回顶栏 */ tabRoot?: boolean; }; type OrdersResponse = { list: Array>; hasWarehouseAccess?: boolean; message?: string; }; export default function OrderListPage({ tabRoot = false }: OrderListPageProps) { usePartnerPageView('partner_order_list_view'); const navigate = useNavigate(); const { account } = usePartnerSession(); const warehouseOk = hasWarehouseAccess(account); const [data, setData] = useState({ list: [] }); const [tab, setTab] = useState<'orders' | 'coupons'>('orders'); const [dateFilter, setDateFilter] = useState('today'); const [statusFilter, setStatusFilter] = useState('ALL'); const [shippingId, setShippingId] = useState(null); const [shipForm, setShipForm] = useState({ logisticsCompany: '', trackingNo: '', manualQueryUrl: '' }); const [shipModalId, setShipModalId] = useState(null); const [loaded, setLoaded] = useState(false); useEffect(() => { document.title = '订单管理'; }, []); const loadOrders = useCallback(() => { if (!isLoggedIn()) { navigate('/login'); return Promise.resolve(); } if (!warehouseOk) { setData({ list: [], hasWarehouseAccess: false, message: '未配置仓库管理权限' }); setLoaded(true); return Promise.resolve(); } return request('PARTNER_H5', '/partner/orders') .then((res) => { setData({ list: Array.isArray(res.list) ? res.list : [], hasWarehouseAccess: res.hasWarehouseAccess, message: res.message, }); }) .catch(() => setData({ list: [] })) .finally(() => setLoaded(true)); }, [navigate, warehouseOk]); useEffect(() => { void loadOrders(); }, [loadOrders]); const filtered = useMemo(() => data.list.filter((o) => { if (statusFilter === 'ALL') return true; const s = String(o.status).toUpperCase(); if (statusFilter === 'PENDING_SHIP') return s.includes('PENDING') || s === 'PAID'; if (statusFilter === 'SHIPPING') return s.includes('SHIP') || s === 'OUT_WAREHOUSE'; if (statusFilter === 'COMPLETED') return s === 'COMPLETED'; if (statusFilter === 'ABNORMAL') return s.includes('ERROR') || s.includes('ABNORMAL'); return true; }), [data.list, statusFilter]); async function handleShip(orderId: string, e: React.MouseEvent) { e.preventDefault(); e.stopPropagation(); setShipModalId(orderId); setShipForm({ logisticsCompany: '', trackingNo: '', manualQueryUrl: '' }); } async function submitManualShip() { if (!shipModalId) return; if (!shipForm.logisticsCompany.trim() || !shipForm.trackingNo.trim()) { window.alert('请填写快递公司和运单号'); return; } setShippingId(shipModalId); try { await request('PARTNER_H5', `/partner/orders/${shipModalId}/manual-ship`, { method: 'POST', body: JSON.stringify(shipForm), }); setShipModalId(null); const next = await request('PARTNER_H5', '/partner/orders'); setData({ list: Array.isArray(next.list) ? next.list : [], hasWarehouseAccess: next.hasWarehouseAccess, message: next.message, }); } catch (err) { window.alert(err instanceof Error ? err.message : '发货失败'); } finally { setShippingId(null); } } function canShip(status: string) { const s = status.toUpperCase(); return s.includes('PENDING') || s === 'PAID' || s === 'PENDING_SHIP'; } if (loaded && !warehouseOk) { return (
{!tabRoot && navigate('/')} />}
warehouse

未配置仓库管理权限

购酒订单由总部履约,不会推送到本账号。如需管仓发货,请联系总部配置仓库。

); } return ( {!tabRoot && navigate('/')} />}
{!tabRoot && ( )}
{tab === 'orders' && ( <>
{DATE_FILTERS.map((f) => ( ))}
{STATUS_FILTERS.map((f) => ( ))}
{filtered.length === 0 &&
暂无订单
} {filtered.map((o) => { const st = orderStatusLabel(String(o.status)); const payAmount = Number(o.payAmount || 0); const orderId = String(o.id); return (
NO. {String(o.orderNo)} {st.label}
liquor

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

¥{payAmount.toFixed(2)}

location_on

{String(o.receiverAddress || '收货地址')}

{canShip(String(o.status)) && !(o.delivery as { trackingNo?: string } | undefined)?.trackingNo && ( )}
); })} )} {tab === 'coupons' && !tabRoot && (

累计已发放权益金额

42,800.00

权益记录 preV1 占位

)} {shipModalId && (
setShipModalId(null)}>
e.stopPropagation()}>

填写运单

)}
); }