forked from gxwebsoft/mp-10550
Compare commits
2 Commits
d6eb6d5e05
...
fb06816e37
| Author | SHA1 | Date | |
|---|---|---|---|
| fb06816e37 | |||
| 939d7b3ec2 |
@@ -8,8 +8,7 @@ import {
|
|||||||
updateShopOrder,
|
updateShopOrder,
|
||||||
createOrder,
|
createOrder,
|
||||||
getShopOrder,
|
getShopOrder,
|
||||||
prepayShopOrder,
|
prepayShopOrder
|
||||||
refundShopOrder
|
|
||||||
} from "@/api/shop/shopOrder";
|
} from "@/api/shop/shopOrder";
|
||||||
import {OrderCreateRequest, ShopOrder, ShopOrderParam} from "@/api/shop/shopOrder/model";
|
import {OrderCreateRequest, ShopOrder, ShopOrderParam} from "@/api/shop/shopOrder/model";
|
||||||
import {listShopOrderGoods} from "@/api/shop/shopOrderGoods";
|
import {listShopOrderGoods} from "@/api/shop/shopOrderGoods";
|
||||||
@@ -133,6 +132,8 @@ function OrderList(props: OrderListProps) {
|
|||||||
const [orderToConfirmReceive, setOrderToConfirmReceive] = useState<ShopOrder | null>(null)
|
const [orderToConfirmReceive, setOrderToConfirmReceive] = useState<ShopOrder | null>(null)
|
||||||
const isReadOnly = props.readOnly || props.mode === 'store' || props.mode === 'rider'
|
const isReadOnly = props.readOnly || props.mode === 'store' || props.mode === 'rider'
|
||||||
|
|
||||||
|
const isOrderCompleted = (order: ShopOrder) => Number(order.orderStatus) === 1 || order.formId === 10074;
|
||||||
|
|
||||||
// 获取订单状态文本
|
// 获取订单状态文本
|
||||||
const getOrderStatusText = (order: ShopOrder) => {
|
const getOrderStatusText = (order: ShopOrder) => {
|
||||||
|
|
||||||
@@ -142,31 +143,27 @@ function OrderList(props: OrderListProps) {
|
|||||||
if (order.orderStatus === 5) return '退款被拒绝';
|
if (order.orderStatus === 5) return '退款被拒绝';
|
||||||
if (order.orderStatus === 6) return '退款成功';
|
if (order.orderStatus === 6) return '退款成功';
|
||||||
if (order.orderStatus === 7) return '客户端申请退款';
|
if (order.orderStatus === 7) return '客户端申请退款';
|
||||||
|
if (isOrderCompleted(order)) return '已完成';
|
||||||
|
|
||||||
// 检查支付状态 (payStatus为boolean类型,false/0表示未付款,true/1表示已付款)
|
// 检查支付状态 (payStatus为boolean类型,false/0表示未付款,true/1表示已付款)
|
||||||
if (!order.payStatus) return '等待买家付款';
|
if (!order.payStatus) return '等待买家付款';
|
||||||
|
|
||||||
// 已付款后检查发货状态
|
// 已付款后检查发货状态
|
||||||
if (order.deliveryStatus === 10) return '待发货';
|
if (order.deliveryStatus === 10) return '待发货';
|
||||||
if (order.formId === 10074) return '已完成';
|
|
||||||
if (order.deliveryStatus === 20) {
|
if (order.deliveryStatus === 20) {
|
||||||
// 若订单没有配送员,沿用原“待收货”语义
|
// 若订单没有配送员,沿用原“待收货”语义
|
||||||
if (!order.riderId) return '待收货';
|
if (!order.riderId || Number(order.riderId) === 0) return '待收货';
|
||||||
// 配送员确认送达后(sendEndTime有值),才进入“待确认收货”
|
// 配送员确认送达后(sendEndTime有值),才进入“待确认收货”
|
||||||
if (order.sendEndTime && order.orderStatus !== 1) return '待确认收货';
|
if (order.sendEndTime && !isOrderCompleted(order)) return '待确认收货';
|
||||||
return '配送中';
|
return '配送中';
|
||||||
}
|
}
|
||||||
if (order.deliveryStatus === 30) return '部分发货';
|
if (order.deliveryStatus === 30) return '部分发货';
|
||||||
|
|
||||||
// 最后检查订单完成状态
|
|
||||||
if (order.orderStatus === 1) return '已完成';
|
|
||||||
if (order.orderStatus === 0) return '未使用';
|
if (order.orderStatus === 0) return '未使用';
|
||||||
|
|
||||||
return '未知状态';
|
return '未知状态';
|
||||||
};
|
};
|
||||||
|
|
||||||
const isOrderCompleted = (order: ShopOrder) => order.orderStatus === 1 || order.formId === 10074;
|
|
||||||
|
|
||||||
// 获取订单状态颜色
|
// 获取订单状态颜色
|
||||||
const getOrderStatusColor = (order: ShopOrder) => {
|
const getOrderStatusColor = (order: ShopOrder) => {
|
||||||
// 优先检查订单状态
|
// 优先检查订单状态
|
||||||
@@ -175,6 +172,7 @@ function OrderList(props: OrderListProps) {
|
|||||||
if (order.orderStatus === 5) return 'text-red-500'; // 退款被拒绝
|
if (order.orderStatus === 5) return 'text-red-500'; // 退款被拒绝
|
||||||
if (order.orderStatus === 6) return 'text-green-500'; // 退款成功
|
if (order.orderStatus === 6) return 'text-green-500'; // 退款成功
|
||||||
if (order.orderStatus === 7) return 'text-orange-500'; // 客户端申请退款
|
if (order.orderStatus === 7) return 'text-orange-500'; // 客户端申请退款
|
||||||
|
if (isOrderCompleted(order)) return 'text-green-600'; // 已完成
|
||||||
|
|
||||||
// 检查支付状态
|
// 检查支付状态
|
||||||
if (!order.payStatus) return 'text-orange-500'; // 等待买家付款
|
if (!order.payStatus) return 'text-orange-500'; // 等待买家付款
|
||||||
@@ -182,14 +180,12 @@ function OrderList(props: OrderListProps) {
|
|||||||
// 已付款后检查发货状态
|
// 已付款后检查发货状态
|
||||||
if (order.deliveryStatus === 10) return 'text-blue-500'; // 待发货
|
if (order.deliveryStatus === 10) return 'text-blue-500'; // 待发货
|
||||||
if (order.deliveryStatus === 20) {
|
if (order.deliveryStatus === 20) {
|
||||||
if (!order.riderId) return 'text-purple-500'; // 待收货
|
if (!order.riderId || Number(order.riderId) === 0) return 'text-purple-500'; // 待收货
|
||||||
if (order.sendEndTime && order.orderStatus !== 1) return 'text-purple-500'; // 待确认收货
|
if (order.sendEndTime && !isOrderCompleted(order)) return 'text-purple-500'; // 待确认收货
|
||||||
return 'text-blue-500'; // 配送中
|
return 'text-blue-500'; // 配送中
|
||||||
}
|
}
|
||||||
if (order.deliveryStatus === 30) return 'text-blue-500'; // 部分发货
|
if (order.deliveryStatus === 30) return 'text-blue-500'; // 部分发货
|
||||||
|
|
||||||
// 最后检查订单完成状态
|
|
||||||
if (order.orderStatus === 1) return 'text-green-600'; // 已完成
|
|
||||||
if (order.orderStatus === 0) return 'text-gray-500'; // 未使用
|
if (order.orderStatus === 0) return 'text-gray-500'; // 未使用
|
||||||
|
|
||||||
return 'text-gray-600'; // 默认颜色
|
return 'text-gray-600'; // 默认颜色
|
||||||
@@ -330,55 +326,11 @@ function OrderList(props: OrderListProps) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 申请退款 (待发货状态)
|
// 申请退款 (待发货状态)
|
||||||
const applyRefund = async (order: ShopOrder) => {
|
const applyRefund = (order: ShopOrder) => {
|
||||||
if (!order?.orderId) {
|
// 跳转到退款申请页面(订单状态在选择退款原因后再更新)
|
||||||
Taro.showToast({ title: '订单信息错误', icon: 'none' })
|
Taro.navigateTo({
|
||||||
return
|
url: `/user/order/refund/index?orderId=${order.orderId}&orderNo=${order.orderNo}`
|
||||||
}
|
});
|
||||||
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,
|
|
||||||
// Best-effort: pass refund amount when available; backend may ignore and calculate by orderId.
|
|
||||||
refundMoney: order.payPrice || order.totalPrice,
|
|
||||||
// Backend requires orderStatus to determine refund flow (client applying).
|
|
||||||
orderStatus: 7
|
|
||||||
});
|
|
||||||
|
|
||||||
Taro.showToast({ title: '退款申请已提交', icon: 'success' })
|
|
||||||
|
|
||||||
// 乐观更新本地状态,提升反馈速度
|
|
||||||
setList(prev => prev.map(item =>
|
|
||||||
item.orderId === order.orderId ? { ...item, orderStatus: 7 } : item
|
|
||||||
))
|
|
||||||
|
|
||||||
// 刷新列表以服务端为准
|
|
||||||
void reload(true)
|
|
||||||
props.onReload?.()
|
|
||||||
|
|
||||||
} catch (error) {
|
|
||||||
console.error('申请退款失败:', error);
|
|
||||||
Taro.showToast({
|
|
||||||
title: '操作失败,请重试',
|
|
||||||
icon: 'none'
|
|
||||||
});
|
|
||||||
} finally {
|
|
||||||
try {
|
|
||||||
Taro.hideLoading()
|
|
||||||
} catch (_e) {
|
|
||||||
// ignore
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// 查看物流 (待收货状态)
|
// 查看物流 (待收货状态)
|
||||||
@@ -865,7 +817,7 @@ function OrderList(props: OrderListProps) {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{/* 待发货状态:显示申请退款 */}
|
{/* 待发货状态:显示申请退款 */}
|
||||||
{item.payStatus && isWithinRefundWindow(item.payTime, 60) && item.deliveryStatus === 10 && item.orderStatus !== 2 && item.orderStatus !== 4 && item.orderStatus !== 7 && !isOrderCompleted(item) && (
|
{item.payStatus && isWithinRefundWindow(item.payTime, 60) && item.deliveryStatus === 10 && item.orderStatus !== 2 && item.orderStatus !== 4 && item.orderStatus !== 6 && item.orderStatus !== 7 && !isOrderCompleted(item) && (
|
||||||
<Button size={'small'} onClick={(e) => {
|
<Button size={'small'} onClick={(e) => {
|
||||||
e.stopPropagation();
|
e.stopPropagation();
|
||||||
applyRefund(item);
|
applyRefund(item);
|
||||||
@@ -873,7 +825,7 @@ function OrderList(props: OrderListProps) {
|
|||||||
)}
|
)}
|
||||||
|
|
||||||
{/* 待收货状态:显示查看物流和确认收货 */}
|
{/* 待收货状态:显示查看物流和确认收货 */}
|
||||||
{item.deliveryStatus === 20 && (!item.riderId || !!item.sendEndTime) && item.orderStatus !== 2 && item.orderStatus !== 6 && !isOrderCompleted(item) && (
|
{item.deliveryStatus === 20 && (!item.riderId || Number(item.riderId) === 0 || !!item.sendEndTime) && item.orderStatus !== 2 && item.orderStatus !== 6 && !isOrderCompleted(item) && (
|
||||||
<Space>
|
<Space>
|
||||||
{/*<Button size={'small'} onClick={(e) => {*/}
|
{/*<Button size={'small'} onClick={(e) => {*/}
|
||||||
{/* e.stopPropagation();*/}
|
{/* e.stopPropagation();*/}
|
||||||
|
|||||||
@@ -8,12 +8,11 @@ import {
|
|||||||
RadioGroup,
|
RadioGroup,
|
||||||
TextArea,
|
TextArea,
|
||||||
Button,
|
Button,
|
||||||
Uploader,
|
|
||||||
Loading,
|
Loading,
|
||||||
Empty,
|
|
||||||
InputNumber
|
InputNumber
|
||||||
} from '@nutui/nutui-react-taro'
|
} from '@nutui/nutui-react-taro'
|
||||||
import { getShopOrder, refundShopOrder } from '@/api/shop/shopOrder'
|
import { applyAfterSale } from '@/api/afterSale'
|
||||||
|
import { getShopOrder, updateShopOrder } from '@/api/shop/shopOrder'
|
||||||
import { listShopOrderGoods } from '@/api/shop/shopOrderGoods'
|
import { listShopOrderGoods } from '@/api/shop/shopOrderGoods'
|
||||||
import './index.scss'
|
import './index.scss'
|
||||||
|
|
||||||
@@ -60,6 +59,7 @@ const RefundPage: React.FC = () => {
|
|||||||
|
|
||||||
const [loading, setLoading] = useState(true)
|
const [loading, setLoading] = useState(true)
|
||||||
const [submitting, setSubmitting] = useState(false)
|
const [submitting, setSubmitting] = useState(false)
|
||||||
|
const [markedClientRefund, setMarkedClientRefund] = useState(false)
|
||||||
const [orderGoods, setOrderGoods] = useState<OrderGoods[]>([])
|
const [orderGoods, setOrderGoods] = useState<OrderGoods[]>([])
|
||||||
const [orderAmount, setOrderAmount] = useState(0)
|
const [orderAmount, setOrderAmount] = useState(0)
|
||||||
const [refundApp, setRefundApp] = useState<RefundApplication>({
|
const [refundApp, setRefundApp] = useState<RefundApplication>({
|
||||||
@@ -73,6 +73,40 @@ const RefundPage: React.FC = () => {
|
|||||||
isUrgent: false
|
isUrgent: false
|
||||||
})
|
})
|
||||||
|
|
||||||
|
const toMoneyNumber = (value: unknown, defaultValue: number = 0): number => {
|
||||||
|
if (typeof value === 'number') return Number.isFinite(value) ? value : defaultValue
|
||||||
|
if (typeof value === 'string') {
|
||||||
|
// Be tolerant of API strings like "¥12.34" or "1,234.56".
|
||||||
|
const cleaned = value.trim().replace(/,/g, '').replace(/[^\d.-]/g, '')
|
||||||
|
const n = Number.parseFloat(cleaned)
|
||||||
|
return Number.isFinite(n) ? n : defaultValue
|
||||||
|
}
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
const formatMoney = (value: unknown): string => {
|
||||||
|
const n = toMoneyNumber(value, 0)
|
||||||
|
return n.toFixed(2)
|
||||||
|
}
|
||||||
|
|
||||||
|
const markOrderClientRefund = async () => {
|
||||||
|
if (markedClientRefund) return
|
||||||
|
if (!orderId) return
|
||||||
|
const orderIdNum = Number.parseInt(String(orderId), 10)
|
||||||
|
if (!Number.isFinite(orderIdNum)) return
|
||||||
|
|
||||||
|
try {
|
||||||
|
await updateShopOrder({
|
||||||
|
orderId: orderIdNum,
|
||||||
|
orderStatus: 7 // 客户端申请退款
|
||||||
|
})
|
||||||
|
setMarkedClientRefund(true)
|
||||||
|
} catch (e) {
|
||||||
|
console.error('更新订单状态为客户端申请退款失败:', e)
|
||||||
|
// 不阻塞用户填写表单;提交时仍会再次尝试更新一次
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (orderId) {
|
if (orderId) {
|
||||||
loadOrderInfo()
|
loadOrderInfo()
|
||||||
@@ -84,51 +118,52 @@ const RefundPage: React.FC = () => {
|
|||||||
try {
|
try {
|
||||||
setLoading(true)
|
setLoading(true)
|
||||||
|
|
||||||
const numericOrderId = Number(orderId)
|
if (!orderId) {
|
||||||
if (!Number.isFinite(numericOrderId) || numericOrderId <= 0) {
|
throw new Error('缺少订单ID')
|
||||||
setOrderGoods([])
|
|
||||||
setOrderAmount(0)
|
|
||||||
return
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const order = await getShopOrder(numericOrderId)
|
const orderIdNum = Number.parseInt(String(orderId), 10)
|
||||||
|
if (!Number.isFinite(orderIdNum)) {
|
||||||
|
throw new Error('订单ID不合法')
|
||||||
|
}
|
||||||
|
|
||||||
// 优先使用订单详情自带的 orderGoods;缺失时补拉一次商品明细
|
// 以订单实付金额为准(避免商品单价合计与优惠/运费等不一致)
|
||||||
const rawGoods = (order?.orderGoods && order.orderGoods.length)
|
const order = await getShopOrder(orderIdNum)
|
||||||
? order.orderGoods
|
const payAmount = toMoneyNumber(order?.payPrice ?? order?.totalPrice, 0)
|
||||||
: (await listShopOrderGoods({ orderId: numericOrderId })) || []
|
|
||||||
|
|
||||||
const goods: OrderGoods[] = (rawGoods || []).map((g: any) => {
|
// 商品信息加载失败时,不阻塞退款申请(全额退款不依赖商品明细)
|
||||||
const qty = Number(g?.totalNum ?? g?.quantity ?? 1)
|
let mappedGoods: OrderGoods[] = []
|
||||||
const price = Number(g?.price ?? 0)
|
try {
|
||||||
return {
|
const goods = (await listShopOrderGoods({ orderId: orderIdNum })) || []
|
||||||
goodsId: String(g?.goodsId ?? g?.itemId ?? ''),
|
mappedGoods = goods.map((g, idx) => {
|
||||||
goodsName: String(g?.goodsName || g?.goodsTitle || g?.title || ''),
|
const goodsNum = Number(g.totalNum ?? 0) || 0
|
||||||
goodsImage: String(g?.image || ''),
|
return {
|
||||||
goodsPrice: Number.isFinite(price) ? price : 0,
|
goodsId: String(g.goodsId ?? idx),
|
||||||
goodsNum: Number.isFinite(qty) && qty > 0 ? qty : 1,
|
goodsName: g.goodsName || '订单商品',
|
||||||
canRefundNum: Number.isFinite(qty) && qty > 0 ? qty : 1,
|
goodsImage: g.image || '/default-goods.png',
|
||||||
skuInfo: g?.spec ? String(g.spec) : (g?.specInfo ? String(g.specInfo) : undefined)
|
goodsPrice: toMoneyNumber(g.price, 0),
|
||||||
}
|
goodsNum,
|
||||||
}).filter(g => !!g.goodsId)
|
canRefundNum: goodsNum,
|
||||||
|
skuInfo: g.spec
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('加载订单商品失败(不阻塞退款申请):', e)
|
||||||
|
}
|
||||||
|
|
||||||
// 优先使用订单的实付金额;兜底按商品合计
|
setOrderGoods(mappedGoods)
|
||||||
const amountFromOrder = Number(order?.payPrice ?? order?.totalPrice ?? 0)
|
setOrderAmount(payAmount)
|
||||||
const totalAmount = (Number.isFinite(amountFromOrder) && amountFromOrder > 0)
|
|
||||||
? amountFromOrder
|
|
||||||
: goods.reduce((sum, g) => sum + g.goodsPrice * g.goodsNum, 0)
|
|
||||||
|
|
||||||
setOrderGoods(goods)
|
// 初始化退款申请信息:默认全额退款
|
||||||
setOrderAmount(totalAmount)
|
|
||||||
|
|
||||||
// 初始化退款申请信息
|
|
||||||
setRefundApp(prev => ({
|
setRefundApp(prev => ({
|
||||||
...prev,
|
...prev,
|
||||||
refundAmount: totalAmount,
|
refundType: 'full',
|
||||||
refundGoods: goods.map(goods => ({
|
refundAmount: payAmount,
|
||||||
goodsId: goods.goodsId,
|
refundGoods: mappedGoods.map(g => ({
|
||||||
refundNum: goods.goodsNum
|
goodsId: g.goodsId,
|
||||||
}))
|
refundNum: g.goodsNum
|
||||||
|
})),
|
||||||
|
evidenceImages: []
|
||||||
}))
|
}))
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
@@ -186,27 +221,6 @@ const RefundPage: React.FC = () => {
|
|||||||
updateRefundApp('refundAmount', newRefundAmount)
|
updateRefundApp('refundAmount', newRefundAmount)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理图片上传
|
|
||||||
const handleImageUpload = async (files: any) => {
|
|
||||||
try {
|
|
||||||
const uploadedImages: string[] = []
|
|
||||||
|
|
||||||
for (const file of files) {
|
|
||||||
if (file.url) {
|
|
||||||
uploadedImages.push(file.url)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
updateRefundApp('evidenceImages', uploadedImages)
|
|
||||||
} catch (error) {
|
|
||||||
console.error('图片上传失败:', error)
|
|
||||||
Taro.showToast({
|
|
||||||
title: '图片上传失败',
|
|
||||||
icon: 'none'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 提交退款申请
|
// 提交退款申请
|
||||||
const submitRefund = async () => {
|
const submitRefund = async () => {
|
||||||
try {
|
try {
|
||||||
@@ -240,20 +254,57 @@ const RefundPage: React.FC = () => {
|
|||||||
|
|
||||||
setSubmitting(true)
|
setSubmitting(true)
|
||||||
|
|
||||||
const numericOrderId = Number(orderId)
|
// 构造请求参数
|
||||||
if (!Number.isFinite(numericOrderId) || numericOrderId <= 0) {
|
const params = {
|
||||||
throw new Error('订单信息错误')
|
orderId: orderId || '',
|
||||||
|
type: 'refund' as const,
|
||||||
|
reason: refundApp.refundReason,
|
||||||
|
description: refundApp.refundDescription,
|
||||||
|
amount: refundApp.refundAmount,
|
||||||
|
contactPhone: refundApp.contactPhone,
|
||||||
|
evidenceImages: refundApp.evidenceImages,
|
||||||
|
...(refundApp.refundGoods.some(item => item.refundNum > 0)
|
||||||
|
? {
|
||||||
|
goodsItems: refundApp.refundGoods
|
||||||
|
.filter(item => item.refundNum > 0)
|
||||||
|
.map(item => ({
|
||||||
|
goodsId: item.goodsId,
|
||||||
|
quantity: item.refundNum
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
: {})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 退款相关操作使用退款接口:PUT /api/shop/shop-order/refund
|
// 调用API提交退款申请
|
||||||
await refundShopOrder({
|
const result = await applyAfterSale(params)
|
||||||
orderId: numericOrderId,
|
|
||||||
refundMoney: String(refundApp.refundAmount),
|
|
||||||
orderStatus: 7
|
|
||||||
})
|
|
||||||
|
|
||||||
Taro.showToast({ title: '退款申请提交成功', icon: 'success' })
|
if (result.success) {
|
||||||
setTimeout(() => Taro.navigateBack(), 1200)
|
// 更新订单状态为"客户端申请退款"
|
||||||
|
if (orderId) {
|
||||||
|
try {
|
||||||
|
await updateShopOrder({
|
||||||
|
orderId: parseInt(orderId),
|
||||||
|
orderStatus: 7 // 客户端申请退款
|
||||||
|
})
|
||||||
|
setMarkedClientRefund(true)
|
||||||
|
} catch (updateError) {
|
||||||
|
console.error('更新订单状态失败:', updateError)
|
||||||
|
// 即使更新订单状态失败,也继续执行后续操作
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Taro.showToast({
|
||||||
|
title: '退款申请提交成功',
|
||||||
|
icon: 'success'
|
||||||
|
})
|
||||||
|
|
||||||
|
// 延迟返回上一页
|
||||||
|
setTimeout(() => {
|
||||||
|
Taro.navigateBack()
|
||||||
|
}, 1500)
|
||||||
|
} else {
|
||||||
|
throw new Error(result.message || '提交失败')
|
||||||
|
}
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('提交退款申请失败:', error)
|
console.error('提交退款申请失败:', error)
|
||||||
@@ -277,30 +328,12 @@ const RefundPage: React.FC = () => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (orderGoods.length === 0) {
|
|
||||||
return (
|
|
||||||
<View className="refund-page">
|
|
||||||
<Empty
|
|
||||||
description="暂无订单信息"
|
|
||||||
imageSize={80}
|
|
||||||
>
|
|
||||||
<Button type="primary" size="small" onClick={() => Taro.navigateBack()}>
|
|
||||||
返回
|
|
||||||
</Button>
|
|
||||||
</Empty>
|
|
||||||
</View>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// @ts-ignore
|
|
||||||
// @ts-ignore
|
|
||||||
// @ts-ignore
|
|
||||||
return (
|
return (
|
||||||
<View className="refund-page">
|
<View className="refund-page">
|
||||||
{/* 订单信息 */}
|
{/* 订单信息 */}
|
||||||
<View className="order-info">
|
<View className="order-info">
|
||||||
<Text className="order-no">订单号:{orderNo}</Text>
|
<Text className="order-no">订单号:{orderNo}</Text>
|
||||||
<Text className="order-amount">订单金额:¥{orderAmount}</Text>
|
<Text className="order-amount">订单金额:¥{formatMoney(orderAmount)}</Text>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* 退款类型选择 */}
|
{/* 退款类型选择 */}
|
||||||
@@ -348,7 +381,7 @@ const RefundPage: React.FC = () => {
|
|||||||
value={refundNum}
|
value={refundNum}
|
||||||
min={0}
|
min={0}
|
||||||
max={goods.canRefundNum}
|
max={goods.canRefundNum}
|
||||||
onChange={(value) => updateGoodsRefundNum(goods.goodsId, Number(value))}
|
onChange={(value) => updateGoodsRefundNum(goods.goodsId, Number(value) || 0)}
|
||||||
/>
|
/>
|
||||||
<Text className="max-num">最多{goods.canRefundNum}件</Text>
|
<Text className="max-num">最多{goods.canRefundNum}件</Text>
|
||||||
</View>
|
</View>
|
||||||
@@ -361,7 +394,7 @@ const RefundPage: React.FC = () => {
|
|||||||
{/* 退款金额 */}
|
{/* 退款金额 */}
|
||||||
<CellGroup title="退款金额">
|
<CellGroup title="退款金额">
|
||||||
<Cell>
|
<Cell>
|
||||||
<Text className="refund-amount">¥{refundApp.refundAmount}</Text>
|
<Text className="refund-amount">¥{formatMoney(refundApp.refundAmount)}</Text>
|
||||||
</Cell>
|
</Cell>
|
||||||
</CellGroup>
|
</CellGroup>
|
||||||
|
|
||||||
@@ -369,7 +402,10 @@ const RefundPage: React.FC = () => {
|
|||||||
<CellGroup title="退款原因">
|
<CellGroup title="退款原因">
|
||||||
<RadioGroup
|
<RadioGroup
|
||||||
value={refundApp.refundReason}
|
value={refundApp.refundReason}
|
||||||
onChange={(value) => updateRefundApp('refundReason', value)}
|
onChange={(value) => {
|
||||||
|
updateRefundApp('refundReason', value)
|
||||||
|
void markOrderClientRefund()
|
||||||
|
}}
|
||||||
>
|
>
|
||||||
{REFUND_REASONS.map(reason => (
|
{REFUND_REASONS.map(reason => (
|
||||||
<Cell key={reason} className="reason-cell">
|
<Cell key={reason} className="reason-cell">
|
||||||
@@ -393,19 +429,18 @@ const RefundPage: React.FC = () => {
|
|||||||
/>
|
/>
|
||||||
</View>
|
</View>
|
||||||
|
|
||||||
{/* 凭证图片 */}
|
{/* 凭证图片:当前上传链路不可用,先隐藏(保留数据结构,后续可恢复) */}
|
||||||
<View className="evidence-section">
|
{/*<View className="evidence-section">*/}
|
||||||
<View className="section-title">上传凭证(可选)</View>
|
{/* <View className="section-title">上传凭证(可选)</View>*/}
|
||||||
<Uploader
|
{/* <Uploader*/}
|
||||||
// @ts-ignore
|
{/* value={refundApp.evidenceImages.map(url => ({ url }))}*/}
|
||||||
value={refundApp.evidenceImages.map(url => ({ url }))}
|
{/* onChange={handleImageUpload}*/}
|
||||||
onChange={handleImageUpload}
|
{/* multiple*/}
|
||||||
multiple
|
{/* maxCount={6}*/}
|
||||||
maxCount={6}
|
{/* previewType="picture"*/}
|
||||||
previewType="picture"
|
{/* deletable*/}
|
||||||
deletable
|
{/* />*/}
|
||||||
/>
|
{/*</View>*/}
|
||||||
</View>
|
|
||||||
|
|
||||||
{/* 其他选项 */}
|
{/* 其他选项 */}
|
||||||
{/*<CellGroup>*/}
|
{/*<CellGroup>*/}
|
||||||
|
|||||||
Reference in New Issue
Block a user