Эх сурвалжийг харах

fix: 修复购物车选中状态丢失和优化订单交互体验

- 在多个页面的 onShow 钩子中添加购物车角标更新,确保角标状态正确
- 购物车页面加载时合并本地缓存的选中状态,避免切换页面时选中状态丢失
- 优化催发货弹窗样式和交互,点击联系卖家跳转客服页面并触发订单列表刷新
- 订单详情页地址区域增加可点击修改逻辑,优化支付按钮跳转收银台
ylong 1 өдөр өмнө
parent
commit
d0d9a1fffa

+ 12 - 7
pages-car/components/urge-delivery-dialog.vue

@@ -3,7 +3,7 @@
         :custom-style="{ padding: '0', borderRadius: '20rpx' }">
         <view class="urge-dialog-box">
             <view class="icon-area">
-                <u-icon name="checkmark-circle-fill" size="100" color="#ff4500"></u-icon>
+                <u-icon name="checkmark-circle-fill" size="100" color="#38C148"></u-icon>
             </view>
             <view class="urge-title">
                 平台跟进发货中
@@ -56,6 +56,7 @@
                         this.deadlineTime = this.formatDate(deadline);
 
                         this.$refs.urgeDialog.openPopup();
+                        this.$emit('success');
                     }
                 }).catch(() => {
                     uni.hideLoading();
@@ -65,9 +66,10 @@
                 this.$refs.urgeDialog.closePopup();
             },
             handleContact() {
-                // 联系卖家逻辑,目前仅提示
-                this.$u.toast('正在跳转联系卖家...');
                 this.closePopup();
+                uni.navigateTo({
+                    url: '/pages-mine/pages/customer-service'
+                });
             },
             formatDate(date) {
                 const month = (date.getMonth() + 1).toString().padStart(2, '0');
@@ -118,7 +120,7 @@
             padding: 0 20rpx;
 
             .highlight {
-                color: #ff4500;
+                color: #38C148;
                 margin-left: 10rpx;
             }
         }
@@ -147,13 +149,16 @@
             }
 
             .contact-btn {
-                background: #ffb800;
-                color: #fff;
+                background: #fff;
+                color: #38C148;
+                border: 2rpx solid #38C148;
                 flex: 1.5;
+                box-sizing: border-box;
+                line-height: 76rpx; // 调整线高因为有边框
             }
 
             .confirm-btn {
-                background: #ff4500;
+                background: #38C148;
                 color: #fff;
             }
         }

+ 15 - 1
pages-car/pages/index.vue

@@ -195,15 +195,28 @@
                 // 获取购物车列表
                 this.$u.api.getShopCartListAjax({}).then(res => {
                     this.loading = false;
+                    
+                    // 获取本地缓存的选中状态,和当前列表的选中状态合并
+                    let storageCheckedIds = uni.getStorageSync('cartCheckedIds') || [];
+                    const currentCheckedIds = this.cartList.filter(i => i.checked).map(i => i.id);
+                    
+                    // 合并并去重
+                    let checkedIds = [...new Set([...storageCheckedIds, ...currentCheckedIds])];
+                    
                     // 本地添加选中状态属性
                     const list = res.rows || [];
                     this.cartList = list.map(item => {
                         return {
                             ...item,
-                            checked: false,
+                            checked: checkedIds.includes(item.id),
                             show: false
                         };
                     });
+                    
+                    // 更新缓存中存在的且当前在购物车里的项
+                    const finalCheckedIds = this.cartList.filter(i => i.checked).map(i => i.id);
+                    uni.setStorageSync('cartCheckedIds', finalCheckedIds);
+                    
                 }).catch(() => {
                     this.loading = false;
                 });
@@ -232,6 +245,7 @@
                     }).then(() => {
                         item.quantity = num;
                         // 通过 computed 重新计算总额
+                        this.$updateCartBadge();
                     }).catch(() => {
                     });
                 }

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

@@ -23,7 +23,7 @@
         <fast-refund-dialog ref="refundDialog" @refresh="loadOrders(true, params)"></fast-refund-dialog>
         
         <!-- 催发货弹窗 -->
-        <urge-delivery-dialog ref="urgeDialog"></urge-delivery-dialog>
+        <urge-delivery-dialog ref="urgeDialog" @success="loadOrders(true, params)"></urge-delivery-dialog>
 
         <!-- 取消订单弹窗 -->
         <cancel-order-popup ref="cancelDialog" @success="loadOrders(true, params)"></cancel-order-popup>

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

@@ -25,7 +25,7 @@
         </view>
 
         <!-- 地址信息 -->
-        <view class="info-card address-card">
+        <view class="info-card address-card" @click="handleAddressClick">
             <view class="icon-box">
                 <image src="/pages-mine/static/adderss.png" style="width: 40rpx; height: 40rpx"></image>
             </view>
@@ -36,7 +36,7 @@
                 </view>
                 <view class="address-detail">{{ orderInfo.receiverAddress }}</view>
             </view>
-            <u-icon name="arrow-right" color="#999" size="28"></u-icon>
+            <u-icon v-if="orderInfo.showModifyAddress == 1" name="arrow-right" color="#999" size="28"></u-icon>
         </view>
 
         <!-- 物流信息 (已发货/已完成/退款) -->
@@ -123,7 +123,7 @@
         <cancel-order-popup ref="cancelDialog" @success="loadOrderDetail(orderInfo.orderId)"></cancel-order-popup>
 
         <!-- 催发货弹窗 -->
-        <urge-delivery-dialog ref="urgeDialog"></urge-delivery-dialog>
+        <urge-delivery-dialog ref="urgeDialog" @success="loadOrderDetail(orderInfo.orderId)"></urge-delivery-dialog>
 
         <!-- 占位符,防止底部按钮遮挡内容 -->
         <view style="height: 120rpx;"></view>
@@ -226,6 +226,11 @@
                     url: `/pages-car/pages/logistics-detail?orderId=${this.orderInfo.orderId}`
                 });
             },
+            handleAddressClick() {
+                if (this.orderInfo.showModifyAddress == 1) {
+                    this.handleAction('address');
+                }
+            },
             handleAction(type) {
                 if (type === 'complaint') {
                     uni.setStorageSync('tempComplaintOrder', this.orderInfo);
@@ -335,7 +340,12 @@
                     });
                     return;
                 }
-                uni.showToast({ title: `点击了${type}`, icon: 'none' });
+                if (type === 'pay') {
+                    uni.navigateTo({
+                        url: `/pages-car/pages/cashier-desk?id=${this.orderInfo.orderId}`
+                    });
+                    return;
+                }
             }
         }
     };

+ 0 - 4
pages-sell/components/detail/footer-bar.vue

@@ -74,10 +74,6 @@
 				})
 			},
 			onCart() {
-				// 获取全局购物车角标并更新本地
-				if (uni.getStorageSync('token')) {
-					this.$updateCartBadge();
-				}
 				uni.switchTab({
 					url: '/pages/cart/index'
 				})

+ 2 - 1
pages/cart/index.vue

@@ -12,7 +12,8 @@
             }
         },
         onShow() {
-            // 每次显示页面时,调用子组件的刷新方法
+            // 每次显示页面时,更新购物车角标并调用子组件的刷新方法
+            this.$updateCartBadge();
             this.$nextTick(() => {
                 if (this.$refs.cartContainer) {
                     this.$refs.cartContainer.loadData();

+ 1 - 0
pages/home/index.vue

@@ -274,6 +274,7 @@ export default {
         });
     },
     onShow() {
+        this.$updateCartBadge();
         if (!app.globalData.isColdLaunch) {
             let token = uni.getStorageSync("token");
             if (token) {

+ 1 - 0
pages/mine/index.vue

@@ -498,6 +498,7 @@
 			this.getActivityStatus();
 		},
 		onShow() {
+			this.$updateCartBadge();
 			let token = uni.getStorageSync('token');
 			if (token) {
 				this.getUserInfo();

+ 3 - 0
pages/sell/index.vue

@@ -13,6 +13,9 @@ export default {
 	},
 	onLoad() {
 		
+	},
+	onShow() {
+		this.$updateCartBadge();
 	},
 	methods: {