import {useEffect, useState} from "react"; import {Cell, CellGroup, Image, Space, Button, Dialog} from '@nutui/nutui-react-taro' import Taro from '@tarojs/taro' import {View} from '@tarojs/components' import {ShopOrder} from "@/api/shop/shopOrder/model"; import {getShopOrder, updateShopOrder, refundShopOrder} from "@/api/shop/shopOrder"; import {listShopOrderGoods} from "@/api/shop/shopOrderGoods"; import {ShopOrderGoods} from "@/api/shop/shopOrderGoods/model"; import dayjs from "dayjs"; import PaymentCountdown from "@/components/PaymentCountdown"; import './index.scss' // 申请退款:支付成功后仅允许在指定时间窗内发起(前端展示层限制,后端仍应校验) const isWithinRefundWindow = (payTime?: string, windowMinutes: number = 60): boolean => { if (!payTime) return false; const raw = String(payTime).trim(); const t = /^\d+$/.test(raw) ? dayjs(Number(raw) < 1e12 ? Number(raw) * 1000 : Number(raw)) // 兼容秒/毫秒时间戳 : dayjs(raw); if (!t.isValid()) return false; return dayjs().diff(t, 'minute') <= windowMinutes; }; const OrderDetail = () => { const [order, setOrder] = useState(null); const [orderGoodsList, setOrderGoodsList] = useState([]); const [confirmReceiveDialogVisible, setConfirmReceiveDialogVisible] = useState(false) const router = Taro.getCurrentInstance().router; const orderId = router?.params?.orderId; // 处理支付超时 const handlePaymentExpired = async () => { if (!order) return; if (!order.orderId) return; try { // 自动取消过期订单 await updateShopOrder({ // 只传最小字段,避免误取消/误走售后流程 orderId: order.orderId, orderStatus: 2 // 已取消 }); // 更新本地状态 setOrder(prev => prev ? {...prev, orderStatus: 2} : null); Taro.showToast({ title: '订单已自动取消', icon: 'none', duration: 2000 }); } catch (error) { console.error('自动取消订单失败:', error); } }; // 申请退款 const handleApplyRefund = async () => { if (order) { try { const confirm = await Taro.showModal({ title: '申请退款', content: '确认要申请退款吗?', confirmText: '确认', cancelText: '取消' }) if (!confirm?.confirm) return Taro.showLoading({ title: '提交中...' }) // 退款相关操作使用退款接口:PUT /api/shop/shop-order/refund await refundShopOrder({ orderId: order.orderId, refundMoney: order.payPrice || order.totalPrice, orderStatus: 7 }) // 乐观更新本地状态 setOrder(prev => prev ? { ...prev, orderStatus: 7 } : null) Taro.showToast({ title: '退款申请已提交', icon: 'success' }) } catch (error) { console.error('申请退款失败:', error); Taro.showToast({ title: '操作失败,请重试', icon: 'none' }); } finally { try { Taro.hideLoading() } catch (_e) { // ignore } } } }; // 确认收货(客户) const handleConfirmReceive = async () => { if (!order?.orderId) return try { setConfirmReceiveDialogVisible(false) await updateShopOrder({ orderId: order.orderId, deliveryStatus: order.deliveryStatus, // 10未发货 20已发货 30部分发货 orderStatus: 1 // 已完成 }) Taro.showToast({title: '确认收货成功', icon: 'success'}) setOrder(prev => (prev ? {...prev, orderStatus: 1} : prev)) } catch (e) { console.error('确认收货失败:', e) Taro.showToast({title: '确认收货失败', icon: 'none'}) setConfirmReceiveDialogVisible(true) } } const getOrderStatusText = (order: ShopOrder) => { // 优先检查订单状态 if (order.orderStatus === 2) return '已取消'; if (order.orderStatus === 3) return '取消中'; if (order.orderStatus === 4) return '退款申请中'; if (order.orderStatus === 5) return '退款被拒绝'; if (order.orderStatus === 6) return '退款成功'; if (order.orderStatus === 7) return '客户端申请退款'; // 检查支付状态 (payStatus为boolean类型) if (!order.payStatus) return '待付款'; // 已付款后检查发货状态 if (order.deliveryStatus === 10) return '待发货'; if (order.deliveryStatus === 20) { // 若订单有配送员,则以配送员送达时间作为“可确认收货”的依据 if (order.riderId) { if (order.sendEndTime && order.orderStatus !== 1) return '待确认收货'; return '配送中'; } return '待收货'; } if (order.deliveryStatus === 30) return '部分发货'; // 最后检查订单完成状态 if (order.orderStatus === 1) return '已完成'; if (order.orderStatus === 0) return '未使用'; return '未知状态'; }; const getPayTypeText = (payType?: number) => { switch (payType) { case 0: return '余额支付'; case 1: return '微信支付'; case 102: return '微信Native'; case 2: return '会员卡支付'; case 3: return '支付宝'; case 4: return '现金'; case 5: return 'POS机'; default: return '未知支付方式'; } }; useEffect(() => { if (orderId) { console.log('shop-goods', orderId) getShopOrder(Number(orderId)).then(async (res) => { setOrder(res); // 获取订单商品列表 const goodsRes = await listShopOrderGoods({orderId: Number(orderId)}); if (goodsRes && goodsRes.length > 0) { setOrderGoodsList(goodsRes); } }).catch(error => { console.error("Failed to fetch order detail:", error); }); } }, [orderId]); if (!order) { return
加载中...
; } const currentUserId = Number(Taro.getStorageSync('UserId')) const isOwner = !!currentUserId && currentUserId === order.userId const canConfirmReceive = isOwner && order.payStatus && order.orderStatus !== 1 && order.deliveryStatus === 20 && (!order.riderId || !!order.sendEndTime) return (
{/* 支付倒计时显示 - 详情页实时更新 */} {!order.payStatus && order.orderStatus !== 2 && (
)} {orderGoodsList.map((item, index) => (
{item.goodsName}
{item.spec &&
规格:{item.spec}
}
数量:{item.totalNum}
¥{item.price}
))}
{order.payStatus && ( )} {!order.payStatus && } {!order.payStatus && } {order.orderStatus === 1 && order.payStatus && isWithinRefundWindow(order.payTime, 60) && ( )} {canConfirmReceive && ( )} setConfirmReceiveDialogVisible(false)} > 确定已经收到商品了吗?确认后订单将完成。
); }; export default OrderDetail;