import { useCallback, useRef, useState } from 'react' import Taro, { useDidShow, useReachBottom, useRouter } from '@tarojs/taro' import { View, Text, ScrollView } from '@tarojs/components' import { Empty, Popup } from '@antmjs/vantui' import useAuthStore from '@/stores/auth/useAuthStore' import { cancelOrderApi, getOrderDetailApi, getOrderListApi } from '@/services/order' import { ORDER_STATUS_FILTERS, ORDER_STATUS_TEXT } from '@/types/order' import type { OrderDetail, OrderListItem, OrderStatus } from '@/types/order' import './index.less' const PAGE_SIZE = 10 /** * 订单列表页 * 入口:/pages/order-list/index?status=0|1|2|3|4|9|all * 状态文案一律使用接口返回的 status_name(详情接口无该字段时沿用列表行) */ export default function OrderListPage() { const router = useRouter() const token = useAuthStore(s => s.token) /** 当前状态筛选(undefined = 全部) */ const [status, setStatus] = useState(undefined) const [orders, setOrders] = useState([]) const [page, setPage] = useState(1) const [loading, setLoading] = useState(false) const [finished, setFinished] = useState(false) const loadingRef = useRef(false) /** 订单详情弹层(statusName 沿用列表行,详情接口不返回 status_name) */ const [showDetail, setShowDetail] = useState(false) const [orderDetail, setOrderDetail] = useState(null) const [detailStatusName, setDetailStatusName] = useState('') const loggedIn = !!token /** 解析路由参数中的 status('all' / 数字 / 缺省 → undefined) */ const parseStatus = useCallback((raw?: string): OrderStatus | undefined => { if (!raw || raw === 'all' || raw === '') return undefined const num = Number(raw) return Number.isNaN(num) ? undefined : (num as OrderStatus) }, []) /** 拉取订单列表 */ const loadOrders = useCallback( async (pageNum: number, reset: boolean, statusParam?: OrderStatus) => { if (!loggedIn || loadingRef.current) return loadingRef.current = true setLoading(true) try { const res = await getOrderListApi({ status: statusParam, page: pageNum, pageSize: PAGE_SIZE, }) const { data, total } = res.data setOrders(prev => (reset ? data : [...prev, ...data])) setPage(pageNum) setFinished(pageNum * PAGE_SIZE >= total) } catch { // 错误已由 request 层 toast } finally { loadingRef.current = false setLoading(false) } }, [loggedIn], ) useDidShow(() => { const statusParam = parseStatus(router.params.status) setStatus(statusParam) loadOrders(1, true, statusParam) }) useReachBottom(() => { if (!finished && !loadingRef.current && loggedIn) { loadOrders(page + 1, false, status) } }) /** 切换状态筛选 */ const handleStatusTap = useCallback( (value?: OrderStatus) => { setStatus(value) setFinished(false) loadOrders(1, true, value) }, [loadOrders], ) /** 查看订单详情 */ const handleOrderTap = useCallback(async (order: OrderListItem) => { try { const res = await getOrderDetailApi(order.id) setOrderDetail(res.data) setDetailStatusName(order.status_name) setShowDetail(true) } catch { // 错误已由 request 层 toast } }, []) /** 取消订单(仅待接单可取消,以 can_cancel 为准) */ const handleCancelOrder = useCallback( (order: OrderListItem) => { Taro.showModal({ title: '取消订单', content: `确定取消订单 ${order.order_no} 吗?`, confirmColor: '#ee0a24', success: res => { if (res.confirm) { cancelOrderApi(order.id) .then(() => { Taro.showToast({ title: '订单已取消', icon: 'success' }) loadOrders(1, true, status) }) .catch(() => {}) } }, }) }, [loadOrders, status], ) /** 跳转关联账单详情 */ const handleBillTap = useCallback((billId: number) => { Taro.navigateTo({ url: `/pages/bill-detail/index?id=${billId}` }) }, []) const goLogin = useCallback(() => { Taro.navigateTo({ url: '/pages/login/index' }) }, []) return ( {/* ========== 状态筛选 ========== */} {ORDER_STATUS_FILTERS.map(item => ( handleStatusTap(item.value)} > {item.label} ))} {/* ========== 订单列表 ========== */} {!loggedIn ? ( 去登录 ) : orders.length === 0 ? ( loading ? ( 加载中... ) : ( ) ) : ( orders.map(order => ( handleOrderTap(order)}> {order.order_no} {order.status_name} {/* 商品预览(仅前 3 条,完整明细见详情) */} {order.items.map(i => `${i.product_name}×${i.quantity}`).join('、')} {order.item_count > 3 ? ` 等${order.item_count}种` : ''} 订货日期 {order.order_date} 共 {order.total_quantity} 件 ¥{order.total_amount} {order.remark && 备注:{order.remark}} {(order.can_cancel || order.bill_id > 0) && ( {order.bill_id > 0 && ( { e.stopPropagation() handleBillTap(order.bill_id) }} > 查看账单 )} {order.can_cancel && ( { e.stopPropagation() handleCancelOrder(order) }} > 取消订单 )} )} )) )} {loggedIn && finished && orders.length > 0 && ( 没有更多了 )} {/* ========== 订单详情弹层 ========== */} setShowDetail(false)} > {orderDetail && ( {orderDetail.order_no} {orderDetail.order_date} 下单 {orderDetail.created_at} {detailStatusName || ORDER_STATUS_TEXT[orderDetail.status] || ''} {(orderDetail.items ?? []).map(item => ( {item.product_name} {item.product_spec ? `${item.product_spec} ` : ''}¥{item.price}/{item.unit} × {item.quantity} ¥{item.amount} ))} {orderDetail.remark && ( 备注:{orderDetail.remark} )} 合计 ¥{orderDetail.total_amount} )} ) }