فهرست منبع

feat(退款): 支持修改退款申请并优化物流状态显示

- 新增退款申请修改功能,允许用户修改已提交的退款申请
- 优化物流详情页面,支持多个包裹显示并适配不同快递公司状态描述
- 修复订单状态显示逻辑,统一使用后端返回的状态映射
- 调整订单组件按钮显示条件,优化用户体验
ylong 6 روز پیش
والد
کامیت
ff194b3d6b

+ 3 - 0
api/modules/mall.js

@@ -70,5 +70,8 @@ export const useMallApi = (Vue, vm) => {
 
         // 查看订单快递信息
         getOrderTrackingAjax: (params) => vm.$u.get('/token/shop/order/getOrderTracking', params),
+
+        // 修改退款申请
+        refundApplyModifyAjax: (data) => vm.$u.post('/token/shop/order/refundApplyModify', data),
 	}
 }

+ 18 - 16
pages-car/components/buy-order-item.vue

@@ -62,8 +62,9 @@
                 :custom-style="btnStyle" @click.stop="handleAction('evaluate', order)">评价</u-button>
 
             <!-- 查看物流 -->
-            <u-button v-if="order.showCheckExpress == 1" size="mini" shape="circle"
-                type="primary" plain :custom-style="btnStyle" @click.stop="handleAction('logistics', order)">查看物流</u-button>
+            <u-button v-if="order.showCheckExpress == 1 && order.status != '4'" size="mini" shape="circle"
+                type="primary" plain :custom-style="btnStyle"
+                @click.stop="handleAction('logistics', order)">查看物流</u-button>
 
             <!-- 延长收货 -->
             <u-button v-if="order.showExtendReceivingTime == 1" size="mini" shape="circle" plain
@@ -73,27 +74,22 @@
             <u-button v-if="order.showUrge == 1" size="mini" shape="circle" type="warning" plain
                 :custom-style="btnStyle" @click.stop="handleAction('remind', order)">催发货</u-button>
 
-            <!-- 更多操作 (仅在已完成状态下显示) -->
-            <u-button
-                v-if="order.status == '4' && (order.showAfterSales == 1 || order.showCheckExpress == 1 || order.showApplyInvoice == 1)"
-                size="mini" shape="circle" plain :custom-style="btnStyle"
-                @click.stop="handleMoreAction">更多</u-button>
 
             <!-- 申请售后 -->
             <u-button v-if="order.showAfterSales == 1 && order.status != '4'" size="mini" shape="circle" type="error"
                 plain :custom-style="btnStyle" @click.stop="handleAction('refund', order)">申请售后</u-button>
 
             <!-- 取消订单 (未包含在Flags中,保留原逻辑: 待付款且未取消) -->
-            <u-button v-if="order.showCancel" size="mini" shape="circle" type="error"
-                plain :custom-style="btnStyle" @click.stop="handleAction('cancel', order)">取消订单</u-button>
+            <u-button v-if="order.showCancel" size="mini" shape="circle" type="error" plain :custom-style="btnStyle"
+                @click.stop="handleAction('cancel', order)">取消订单</u-button>
 
             <!-- 钱款去向 -->
             <u-button v-if="order.showMoneyDestination == 1" size="mini" shape="circle" type="primary" plain
                 :custom-style="btnStyle" @click.stop="handleAction('moneyWhere', order)">钱款去向</u-button>
 
             <!-- 查看详情 -->
-            <u-button v-if="order.showShowDetail == 1" size="mini" shape="circle" plain
-                :custom-style="btnStyle" @click.stop="handleAction('detail', order)">查看详情</u-button>
+            <u-button v-if="order.showShowDetail == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
+                @click.stop="handleAction('detail', order)">查看详情</u-button>
 
             <!-- 申请开票 -->
             <u-button v-if="order.showApplyInvoice == 1 && order.status != '4'" size="mini" shape="circle" plain
@@ -106,6 +102,12 @@
             <!-- 修改地址 -->
             <u-button v-if="order.showModifyAddress == 1" size="mini" shape="circle" plain :custom-style="btnStyle"
                 @click.stop="handleAction('address', order)">修改地址</u-button>
+
+            <!-- 更多操作 (仅在已完成状态下显示) -->
+            <u-button
+                v-if="(order.showAfterSales == 1 || order.showCheckExpress == 1 || order.showApplyInvoice == 1) && order.status == '4'"
+                size="mini" shape="circle" plain :custom-style="btnStyle" @click.stop="handleMoreAction">更多</u-button>
+
         </view>
     </view>
 </template>
@@ -146,15 +148,15 @@
                 })
             },
             getStatusText(order) {
-                if (order.cancelStatus == '1') return '已取消';
-                if (order.refundStatus == '2') return '退款中';
-                if (order.refundStatus == '3') return '已退款';
-
+                //订单状态:1-待付款 2-待发货 3-待收货 4-已完成 5-已取消 6-退款中 7-已退款
                 const map = {
                     '1': '待付款',
                     '2': '待发货',
                     '3': '待收货',
-                    '4': '已完成'
+                    '4': '已完成',
+                    '5': '已取消',
+                    '6': '退款中',
+                    '7': '已退款'
                 }
                 return map[order.status] || '未知状态'
             },

+ 81 - 10
pages-car/pages/apply-refund.vue

@@ -222,6 +222,8 @@
 		data() {
 			return {
 				orderId: '',
+				isModify: false, // 是否是修改申请模式
+				refundOrderId: '', // 修改模式下的退款单ID
 				orderInfo: {
 					detailVoList: [],
 					discountMoney: 0,
@@ -291,14 +293,11 @@
 
 				if (totalOriginal === 0) return '0.00';
 
-				let selectedOriginal = 0;
+				let refund = 0;
 				this.selectedGoods.forEach(item => {
-					selectedOriginal += Number(item.payPrice) * item.refundNum;
+					refund += Number(item.payPrice) * item.refundNum;
 				});
 
-				let payMoney = Number(this.orderInfo.payMoney) || 0;
-				// 按比例计算: (选中商品原价 / 订单总原价) * 实付金额
-				let refund = (selectedOriginal / totalOriginal) * payMoney;
 				return refund.toFixed(2);
 			},
 			refundMoney() {
@@ -321,10 +320,14 @@
 			}
 		},
 		onLoad(options) {
-			if (options.orderId) {
+			this.getRefundReasons();
+			if (options.isModify == '1' && options.refundOrderId) {
+				this.isModify = true;
+				this.refundOrderId = options.refundOrderId;
+				this.loadRefundDetail();
+			} else if (options.orderId) {
 				this.orderId = options.orderId;
 				this.loadOrderDetail();
-				this.getRefundReasons();
 			}
 		},
 		onShow() {
@@ -338,6 +341,66 @@
 
 		},
 		methods: {
+			loadRefundDetail() {
+				// 使用退款详情接口回填数据
+				this.$u.api.getNewRefundOrderDetailAjax({
+					refundOrderId: this.refundOrderId
+				}).then(res => {
+					if (res.code === 200) {
+						const data = res.data;
+						this.orderId = data.originOrderId; // 确保orderId存在
+						
+						// 构造页面需要的 orderInfo 结构
+						// 注意:退款详情接口返回的 detailList 结构可能与订单详情的 detailVoList 略有不同,需要映射
+						this.orderInfo = {
+							...data,
+							detailVoList: data.detailList.map(item => ({
+								...item,
+								num: item.num, // 原购买数量
+								refundNum: item.refundNum // 之前申请的退款数量
+							}))
+						};
+						console.log(this.orderInfo, 'orderInfo');
+
+						// 回填表单数据
+						this.refundType = String(data.refundType);
+						// this.refundTypeText 需要根据 options 查找或直接设置,这里简单根据值设置
+						this.refundTypeText = this.refundType === '1' ? '退货退款' : '仅退款';
+						
+						this.shopStatus = String(data.shopStatus);
+						this.shopStatusText = this.shopStatus === '1' ? '未收到货' : '已收到货';
+						
+						this.refundReason = data.refundReason;
+						this.refundReasonText = data.refundReason; // 假设后端直接返回文本,或者需要遍历 reasonList 匹配
+						
+						this.returnMethod = String(data.sendType);
+						// 查找 returnMethodText
+						const methodObj = this.returnMethodList.find(m => m.value === this.returnMethod);
+						this.returnMethodText = methodObj ? methodObj.label : '';
+						
+						this.description = data.description || '';
+						
+						// 回填图片
+						if (data.fileUrlList) {
+							this.fileList = data.fileUrlList;
+						}
+
+						// 初始化选中状态
+						this.orderInfo.detailVoList.forEach(item => {
+							this.$set(item, 'checked', true);
+							// 修改模式下,默认显示上次申请的数量
+							this.$set(item, 'refundNum', item.refundNum || 1);
+						});
+						
+						this.address = {	
+							id: data.sendAddressId,
+							name: data.sendName,
+							mobile: data.sendMobile,
+							fullAddress: data.sendAddress,
+						}
+					}
+				});
+			},
 			loadOrderDetail() {
 				this.$u.api.getShopOrderDetailAjax({ orderId: this.orderId }).then(res => {
 					if (res.code === 200) {
@@ -463,14 +526,22 @@
 					params.address = this.address;
 				}
 
-				this.$u.api.applyRefundAjax(params).then(res => {
+				const api = this.isModify ? this.$u.api.refundApplyModifyAjax : this.$u.api.applyRefundAjax;
+				// 修改模式下可能需要传入 refundOrderId (虽然截图只有 orderId, 但为了保险起见或者后端根据 orderId 找)
+				// 截图显示 Request body 包含 orderId 和 refundDetailList 等。
+				// 如果是修改,通常 orderId 指的是原订单ID。后端可能通过 orderId 找到对应的 active refund application 或者需要 refundOrderId。
+				// 根据截图,只有 body,没有 path param。body 里有 orderId。
+				// 如果是修改,我们可能需要额外传 refundOrderId 吗? 截图里没有显示 refundOrderId 字段。
+				// 假设后端通过 orderId 识别当前正在进行的退款申请进行修改,或者复用 applyRefund 的逻辑只是接口不同。
+				
+				api(params).then(res => {
 					if (res.code === 200) {
-						this.$u.toast('提交成功');
+						this.$u.toast(this.isModify ? '修改成功' : '提交成功');
 						setTimeout(() => {
 							uni.navigateBack();
 						}, 1500);
 					} else {
-						this.$u.toast(res.msg || '提交失败');
+						this.$u.toast(res.msg || (this.isModify ? '修改失败' : '提交失败'));
 					}
 				});
 			}

+ 10 - 10
pages-car/pages/logistics-detail.vue

@@ -40,16 +40,16 @@
             <view class="timeline-item" v-for="(trace, index) in currentPackage.trackingVoList" :key="index">
                 <view class="left-col">
                     <!-- 不同状态显示不同图标 -->
-                    <view v-if="index === 0 && trace.status === '已签收'" class="icon-box check-icon">
+                    <view v-if="index === 0 && ['已签收', '签收'].includes(trace.status)" class="icon-box check-icon">
                         <u-icon name="checkmark" color="#fff" size="20"></u-icon>
                     </view>
-                    <view v-else-if="trace.status === '派送中'" class="icon-box delivery-icon">
-                        <u-icon name="man" color="#fff" size="24"></u-icon> <!-- 使用uView图标或自定义 -->
+                    <view v-else-if="['派送中', '派件'].includes(trace.status)" class="icon-box delivery-icon">
+                        <u-icon name="man" color="#fff" size="24"></u-icon>
                     </view>
-                    <view v-else-if="trace.status === '运输中'" class="icon-box transport-icon">
+                    <view v-else-if="['运输中', '在途'].includes(trace.status)" class="icon-box transport-icon">
                         <u-icon name="car" color="#fff" size="24"></u-icon>
                     </view>
-                    <view v-else-if="trace.status === '已下单'" class="icon-box order-icon">
+                    <view v-else-if="['已下单', '揽收'].includes(trace.status)" class="icon-box order-icon">
                         <u-icon name="order" color="#fff" size="24"></u-icon>
                     </view>
                     <view v-else class="dot"></view>
@@ -103,13 +103,13 @@ export default {
             this.$u.api.getOrderTrackingAjax(params).then(res => {
                 uni.hideLoading();
                 if (res.code == 200) {
-                    const data = res.data;
+                    const data = res.data || [];
                     
                     // 直接使用后端返回的字段
-                    this.packages = [{
-                        name: '包裹1', // 前端固定名称,因为接口只返回一个包裹信息
-                        ...data
-                    }];
+                    this.packages = data.map((item, index) => ({
+                        name: `包裹${index + 1}`,
+                        ...item
+                    }));
                 } else {
                     this.$u.toast(res.msg || '获取物流信息失败');
                 }

+ 3 - 1
pages-car/pages/my-order.vue

@@ -164,7 +164,9 @@
                         }
                     });
                 } else if (type === 'logistics') {
-                    uni.showToast({ title: '查看物流信息', icon: 'none' });
+                    uni.navigateTo({
+                        url: `/pages-car/pages/logistics-detail?orderId=${order.orderId}`
+                    });
                 } else if (type === 'address') {
                     this.modifyingOrderId = order.orderId;
                     // 兼容列表和详情可能的字段差异

+ 9 - 4
pages-car/pages/order-detail.vue

@@ -2,10 +2,7 @@
     <view class="order-detail-page">
         <!-- 顶部状态栏 -->
         <view class="status-header">
-            <view class="status-text" v-if="orderInfo.cancelStatus == 1">已取消</view>
-            <view class="status-text" v-else-if="orderInfo.refundStatus == 3">交易关闭</view>
-            <view class="status-text" v-else-if="orderInfo.refundStatus == 2">退款中</view>
-            <view class="status-text" v-else>{{ statusText }}</view>
+            <view class="status-text">{{ statusText }}</view>
             <view class="status-desc" v-if="orderInfo.status == '2'">
                 订单编号:{{ orderInfo.orderId }}
                 <u-icon name="copy" size="28" @click="copyOrderNo" style="margin-left: 10rpx;"></u-icon>
@@ -164,11 +161,15 @@
         },
         computed: {
             statusText() {
+                //订单状态:1-待付款 2-待发货 3-待收货 4-已完成 5-已取消 6-退款中 7-已退款
                 const map = {
                     '1': '等待买家付款',
                     '2': '等待卖家发货',
                     '3': '已发货',
                     '4': '交易完成',
+                    '5': '已取消',
+                    '6': '退款中',
+                    '7': '交易关闭'
                 };
                 return map[String(this.orderInfo.status)] || '未知状态';
             }
@@ -250,6 +251,10 @@
                     });
                     return;
                 }
+                if (type === 'logistics') {
+                    this.viewLogistics();
+                    return;
+                }
                 uni.showToast({ title: `点击了${type}`, icon: 'none' });
             }
         }

+ 4 - 2
pages-car/pages/refund-detail.vue

@@ -247,8 +247,10 @@
 						});
 						break;
 					case 'modify':
-						// 修改申请
-						uni.showToast({ title: '修改申请', icon: 'none' });
+						// 跳转到修改申请页面
+						uni.navigateTo({
+							url: `/pages-car/pages/apply-refund?refundOrderId=${this.refundOrderId}&isModify=1`
+						});
 						break;
 					case 'complaint':
 						uni.navigateTo({