hookehuyr

feat(订单): 添加订单发货和收货功能

- 在订单列表中添加待发货/待收货状态展示
- 实现卖家发货和买家收货功能
- 添加相关API接口和状态处理
- 更新订单状态显示和样式
- 处理微信小程序确认收货组件回调
/*
* @Date: 2025-07-03 17:21:45
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-07-14 14:43:05
* @LastEditTime: 2025-07-28 11:51:11
* @FilePath: /jgdl/src/api/orders.js
* @Description: 文件描述
*/
......@@ -14,6 +14,8 @@ const Api = {
REVIEW_ORDER: '/srv/?a=order&t=review',
DELETE_ORDER: '/srv/?a=order&t=del',
CANCEL_ORDER: '/srv/?a=order&t=cancel',
SHIP_ORDER: '/srv/?a=order&t=ship',
RECEIPT_ORDER_STATUS: '/srv/?a=order&t=receipt_status',
}
/**
......@@ -21,7 +23,7 @@ const Api = {
* @param page 页码,从0开始
* @param page_size 每页数量
* @param type 列表类型。buy=我买的,sell=我卖的
* @param status 订单状态(3=待支付, 5=已完成, 7=已取消
* @param status 订单状态(3=待支付, 5=已支付待发货, 7=已取消, 9=已发货/待收货, 11=已收货
* @returns data{ list[{ id, title, total_amount, status, create_time, payment_time, details{ id, vehicle_id, quantity, vehicle{} } }] }
*/
export const getOrderListAPI = (params) => fn(fetch.get(Api.GET_ORDER_LIST, params));
......@@ -63,3 +65,17 @@ export const deleteOrderAPI = (params) => fn(fetch.post(Api.DELETE_ORDER, params
* @returns data{}
*/
export const cancelOrderAPI = (params) => fn(fetch.post(Api.CANCEL_ORDER, params));
/**
* @description: 发货订单
* @param order_id 订单ID
* @returns data{}
*/
export const shipOrderAPI = (params) => fn(fetch.post(Api.SHIP_ORDER, params));
/**
* @description: 确认收货订单状态
* @param order_id 订单ID
* @returns data{ status 3=待支付, 5=已支付待发货, 7=已取消, 9=已发货/待收货, 11=已收货 }
*/
export const receiptOrderStatusAPI = (params) => fn(fetch.get(Api.RECEIPT_ORDER_STATUS, params));
......
/*
* @Date: 2025-06-28 10:33:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-07-14 16:45:23
* @LastEditTime: 2025-07-25 15:53:11
* @FilePath: /jgdl/src/app.js
* @Description: 文件描述
*/
......@@ -17,14 +17,14 @@ const App = createApp({
// 未授权状态跳转授权页面,首页不需要权限
const path = options.path;
const query = options.query;
// 缓存没有权限的地址
const router = routerStore();
router.add(path);
// 检查是否有sessionid
const sessionid = wx.getStorageSync("sessionid");
// 如果没有sessionid且不是auth页面本身,才跳转到授权页面
if (!sessionid && path !== 'pages/auth/index') {
// 添加延迟避免与页面初始化冲突
......@@ -42,6 +42,32 @@ const App = createApp({
}
},
onShow(options) {
// 处理确认收货组件回调
if (options && options.referrerInfo && options.referrerInfo.extraData) {
const { status, errormsg, req_extradata } = options.referrerInfo.extraData
if (status === 'success') {
// 确认收货成功,通过事件总线通知订单页面
Taro.eventCenter.trigger('confirmReceiveSuccess', {
merchantId: req_extradata.merchant_id,
transactionId: req_extradata.transaction_id,
merchantTradeNo: req_extradata.merchant_trade_no,
})
Taro.showToast({
title: '确认收货成功',
icon: 'success',
duration: 2000
})
} else if (status === 'fail') {
Taro.showToast({
title: errormsg || '确认收货失败',
icon: 'error',
duration: 2000
})
}
// status === 'cancel' 时用户取消操作,不需要特殊处理
}
},
// 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
});
......
<!--
* @Date: 2025-06-28 10:33:00
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-07-24 14:21:19
* @LastEditTime: 2025-07-28 09:32:03
* @FilePath: /jgdl/src/pages/index/index.vue
* @Description: 捡个电驴首页
-->
......@@ -153,8 +153,8 @@ useDidShow(() => {
useReady(async () => {
// 版本更新检查
if (!wx.canIUse("getUpdateManager")) {
wx.showModal({
if (!Taro.canIUse("getUpdateManager")) {
Taro.showModal({
title: "提示",
content: "当前微信版本过低,无法使用该功能,请升级到最新微信版本后重试",
showCancel: false,
......@@ -163,7 +163,7 @@ useReady(async () => {
}
// https://developers.weixin.qq.com/miniprogram/dev/api/base/update/UpdateManager.html
const updateManager = wx.getUpdateManager();
const updateManager = Taro.getUpdateManager();
updateManager.onCheckForUpdate((res) => {
// 请求完新版本信息的回调
......
......@@ -224,6 +224,10 @@
color: #f97316;
}
&.status-shipping {
color: #f97316;
}
&.status-completed {
color: #10b981;
}
......
<!--
* @Date: 2022-09-19 14:11:06
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2025-07-25 10:55:07
* @LastEditTime: 2025-07-28 11:52:38
* @FilePath: /jgdl/src/pages/myOrders/index.vue
* @Description: 订单管理页面
-->
......@@ -25,10 +25,12 @@
<view class="tab-item" :class="{ active: activeTab === '' }" @click="setActiveTab('')">
全部
</view>
<view v-if="viewMode === 'buy'" class="tab-item" :class="{ active: activeTab === 3 }"
@click="setActiveTab(3)">
<view v-if="viewMode === 'buy'" class="tab-item" :class="{ active: activeTab === 3 }" @click="setActiveTab(3)">
待支付
</view>
<view class="tab-item" :class="{ active: activeTab === 4 }" @click="setActiveTab(4)">
{{ viewMode === 'buy' ? '待收货' : '待发货' }}
</view>
<view class="tab-item" :class="{ active: activeTab === 5 }" @click="setActiveTab(5)">
已完成
</view>
......@@ -41,8 +43,8 @@
<!-- 订单列表 -->
<view class="order-list">
<!-- 滚动列表 -->
<scroll-view ref="scrollViewRef" class="order-scroll-view" :style="scrollStyle" :scroll-y="true" @scrolltolower="loadMore"
@scroll="scroll" :lower-threshold="50" :enable-flex="false" :scroll-top="scrollTop">
<scroll-view ref="scrollViewRef" class="order-scroll-view" :style="scrollStyle" :scroll-y="true"
@scrolltolower="loadMore" @scroll="scroll" :lower-threshold="50" :enable-flex="false" :scroll-top="scrollTop">
<!-- 空状态 -->
<view v-if="filteredOrders.length === 0" class="empty-state">
<text class="empty-text">暂无订单</text>
......@@ -62,7 +64,8 @@
<!-- 车辆信息 -->
<nut-row :gutter="12" class="vehicle-info" @click="goToProductDetail(order)">
<nut-col :span="6">
<image :src="order.details.vehicle.front_photo || DEFAULT_COVER_IMG" :alt="order.details.vehicle.brand + ' ' + order.details.vehicle.model" class="vehicle-image"
<image :src="order.details.vehicle.front_photo || DEFAULT_COVER_IMG"
:alt="order.details.vehicle.brand + ' ' + order.details.vehicle.model" class="vehicle-image"
mode="aspectFill" />
</nut-col>
<nut-col :span="18">
......@@ -95,6 +98,28 @@
</nut-button>
</template>
<!-- 买车模式:待收货状态 -->
<template v-if="viewMode === 'buy' && order.status === 4">
<nut-button type="default" size="small" @click="viewOrderDetail(order.id)">
查看详情
</nut-button>
<nut-button type="primary" size="small" @click="handleConfirmReceive(order)" color="orange"
class="ml-2" :loading="receivingOrderId === order.id" :disabled="receivingOrderId === order.id">
{{ receivingOrderId === order.id ? '收货中...' : '确认收货' }}
</nut-button>
</template>
<!-- 卖车模式:待发货状态 -->
<template v-if="viewMode === 'sell' && order.status === 4">
<nut-button type="default" size="small" @click="viewOrderDetail(order.id)">
查看详情
</nut-button>
<nut-button type="primary" size="small" @click="handleConfirmShip(order)" color="orange" class="ml-2"
:loading="shippingOrderId === order.id" :disabled="shippingOrderId === order.id">
{{ shippingOrderId === order.id ? '发货中...' : '确认发货' }}
</nut-button>
</template>
<!-- 已完成状态 -->
<template v-if="order.status === 5">
<nut-button type="default" size="small" @click="viewOrderDetail(order.id)">
......@@ -132,8 +157,8 @@
<payCard :visible="show_pay" :data="payData" @close="onPayClose" @paySuccess="onPaySuccess" />
<!-- 评价弹窗 -->
<nut-popup v-model:visible="showRatePopup" position="right" :catch-move="true" :style="{ width: '100%', height: '100%' }" closeable
close-icon-position="top-right" @close="closeRatePopup">
<nut-popup v-model:visible="showRatePopup" position="right" :catch-move="true"
:style="{ width: '100%', height: '100%' }" closeable close-icon-position="top-right" @close="closeRatePopup">
<view class="rate-popup">
<view class="rate-header">
<text class="rate-title">{{ isReadOnlyMode ? '查看评价' : '商品评价' }}</text>
......@@ -142,10 +167,13 @@
<view class="rate-content">
<!-- 商品信息展示 -->
<view class="product-info">
<image :src="currentRateOrder?.details?.vehicle?.front_photo || DEFAULT_COVER_IMG" class="product-image" mode="aspectFill" />
<image :src="currentRateOrder?.details?.vehicle?.front_photo || DEFAULT_COVER_IMG" class="product-image"
mode="aspectFill" />
<view class="product-details">
<text class="product-name">{{ currentRateOrder?.details?.vehicle?.brand }} {{ currentRateOrder?.details?.vehicle?.model }}</text>
<text class="product-specs">{{ currentRateOrder?.details?.vehicle?.manufacture_year }}年 · 里程: {{ currentRateOrder?.details?.vehicle?.range_km }}km</text>
<text class="product-name">{{ currentRateOrder?.details?.vehicle?.brand }} {{
currentRateOrder?.details?.vehicle?.model }}</text>
<text class="product-specs">{{ currentRateOrder?.details?.vehicle?.manufacture_year }}年 · 里程: {{
currentRateOrder?.details?.vehicle?.range_km }}km</text>
<text class="product-price">¥ {{ currentRateOrder?.details?.vehicle?.price }}</text>
</view>
</view>
......@@ -162,8 +190,8 @@
<view class="rate-input-section">
<text class="input-label">{{ isReadOnlyMode ? '评价内容' : '请输入评价内容' }}</text>
<view class="border border-gray-100">
<nut-textarea v-model="rateContent" :placeholder="isReadOnlyMode ? '' : '请输入您的评价内容...'" :max-length="200" :cursorSpacing="100"
:rows="4" :show-word-limit="!isReadOnlyMode" :readonly="isReadOnlyMode"
<nut-textarea v-model="rateContent" :placeholder="isReadOnlyMode ? '' : '请输入您的评价内容...'" :max-length="200"
:cursorSpacing="100" :rows="4" :show-word-limit="!isReadOnlyMode" :readonly="isReadOnlyMode"
:class="{ 'readonly': isReadOnlyMode }" />
</view>
<!-- <text v-if="isReadOnlyMode && currentRateOrder?.details?.review?.date" class="review-date">
......@@ -182,8 +210,8 @@
</nut-popup>
<!-- 订单详情弹窗 -->
<nut-popup v-model:visible="showOrderDetailPopup" position="right" :catch-move="true" :style="{ width: '100%', height: '100%' }"
@close="closeOrderDetailPopup">
<nut-popup v-model:visible="showOrderDetailPopup" position="right" :catch-move="true"
:style="{ width: '100%', height: '100%' }" @close="closeOrderDetailPopup">
<view class="order-detail-popup">
<view class="detail-header">
<text class="detail-title">订单详情</text>
......@@ -221,12 +249,16 @@
<view class="detail-section">
<text class="section-title">商品信息</text>
<view class="product-detail-info">
<image :src="currentOrderDetail?.details?.vehicle?.front_photo || DEFAULT_COVER_IMG" class="product-detail-image" mode="aspectFill" />
<image :src="currentOrderDetail?.details?.vehicle?.front_photo || DEFAULT_COVER_IMG"
class="product-detail-image" mode="aspectFill" />
<view class="product-detail-content">
<text class="product-detail-name">{{ currentOrderDetail?.details?.vehicle?.brand }} {{ currentOrderDetail?.details?.vehicle?.model }}</text>
<text class="product-detail-specs">{{ currentOrderDetail?.details?.vehicle?.manufacture_year }}年 · 续航: {{
currentOrderDetail?.details?.vehicle?.range_km }}km/h</text>
<text class="product-detail-battery">电池容量: {{ currentOrderDetail?.details?.vehicle?.battery_capacity_ah }}Ah</text>
<text class="product-detail-name">{{ currentOrderDetail?.details?.vehicle?.brand }} {{
currentOrderDetail?.details?.vehicle?.model }}</text>
<text class="product-detail-specs">{{ currentOrderDetail?.details?.vehicle?.manufacture_year }}年 · 续航:
{{
currentOrderDetail?.details?.vehicle?.range_km }}km/h</text>
<text class="product-detail-battery">电池容量: {{ currentOrderDetail?.details?.vehicle?.battery_capacity_ah
}}Ah</text>
<text class="product-detail-price">¥ {{ currentOrderDetail?.details?.vehicle?.price }}</text>
</view>
</view>
......@@ -237,11 +269,13 @@
<text class="section-title">交易信息</text>
<view class="info-row">
<text class="info-label">{{ viewMode === 'buy' ? '卖家' : '买家' }}</text>
<text class="info-value">{{ viewMode === 'buy' ? currentOrderDetail?.details?.vehicle?.seller?.nickname : currentOrderDetail?.buyer?.nickname }}</text>
<text class="info-value">{{ viewMode === 'buy' ? currentOrderDetail?.details?.vehicle?.seller?.nickname :
currentOrderDetail?.buyer?.nickname }}</text>
</view>
<view class="info-row">
<text class="info-label">联系电话</text>
<text class="info-value">{{ viewMode === 'buy' ? currentOrderDetail?.details?.vehicle?.seller?.phone : currentOrderDetail?.buyer?.phone }}</text>
<text class="info-value">{{ viewMode === 'buy' ? currentOrderDetail?.details?.vehicle?.seller?.phone :
currentOrderDetail?.buyer?.phone }}</text>
</view>
<!-- <view class="info-row">
<text class="info-label">交易地点</text>
......@@ -255,8 +289,8 @@
<view class="review-info">
<view class="review-rating">
<text class="rating-label">评分:</text>
<nut-rate :model-value="currentOrderDetail?.details?.review?.rating" readonly size="20" active-color="#ff6b35"
void-color="#e5e5e5" />
<nut-rate :model-value="currentOrderDetail?.details?.review?.rating" readonly size="20"
active-color="#ff6b35" void-color="#e5e5e5" />
<!-- <text class="rating-text">{{ currentOrderDetail?.details?.review?.rating }}/5分</text> -->
</view>
<view class="review-content">
......@@ -280,14 +314,8 @@
</nut-popup>
<!-- Delete Confirmation Modal -->
<nut-dialog
v-model:visible="showConfirmModal"
title="温馨提示"
cancel-text="取消"
ok-text="确认"
@cancel="showConfirmModal = false"
@ok="performDeleteOrder(pendingDeleteOrderId)"
>
<nut-dialog v-model:visible="showConfirmModal" title="温馨提示" cancel-text="取消" ok-text="确认"
@cancel="showConfirmModal = false" @ok="performDeleteOrder(pendingDeleteOrderId)">
<template #default>
<view>
<text style="font-size: 1rem;">是否确认删除订单?</text>
......@@ -296,20 +324,34 @@
</nut-dialog>
<!-- Cancel Order Confirmation Modal -->
<nut-dialog
v-model:visible="showCancelConfirmModal"
title="温馨提示"
cancel-text="我再想想"
ok-text="确定取消"
@cancel="showCancelConfirmModal = false"
@ok="performCancelOrder(pendingCancelOrderId)"
>
<nut-dialog v-model:visible="showCancelConfirmModal" title="温馨提示" cancel-text="我再想想" ok-text="确定取消"
@cancel="showCancelConfirmModal = false" @ok="performCancelOrder(pendingCancelOrderId)">
<template #default>
<view>
<text style="font-size: 1rem;">是否确认取消订单?</text>
</view>
</template>
</nut-dialog>
<!-- 确认发货弹窗 -->
<nut-dialog v-model:visible="showShipConfirmModal" title="确认发货" cancel-text="取消" ok-text="确认发货"
@cancel="showShipConfirmModal = false" @ok="performConfirmShip(pendingShipOrderId)">
<template #default>
<view>
<text style="font-size: 1rem;">确认已将车辆发货给买家?</text>
</view>
</template>
</nut-dialog>
<!-- 确认收货弹窗 -->
<nut-dialog v-model:visible="showReceiveConfirmModal" title="确认收货" cancel-text="取消" ok-text="确认收货"
@cancel="showReceiveConfirmModal = false" @ok="performConfirmReceive(pendingReceiveOrderId)">
<template #default>
<view>
<text style="font-size: 1rem;">确认已收到车辆?</text>
</view>
</template>
</nut-dialog>
</view>
</template>
......@@ -391,6 +433,7 @@ const filteredOrders = computed(() => {
return orders.filter(order => {
if (activeTab.value === 3) return order.status === 3
if (activeTab.value === 4) return order.status === 4
if (activeTab.value === 5) return order.status === 5
if (activeTab.value === 7) return order.status === 7
return true
......@@ -432,6 +475,41 @@ const loadOrderData = async (isLoadMore = false) => {
const status = activeTab.value || undefined
const page = isLoadMore ? currentPage.value + 1 : 0
// 添加mock数据用于测试
if (page === 0) {
const mockOrder = {
id: `mock_${type}_${Date.now()}`,
status: 4, // 待收货/待发货状态
created_time: new Date().toLocaleString('zh-CN'),
total_amount: 15000,
details: {
id: `detail_${Date.now()}`,
vehicle: {
id: `vehicle_${Date.now()}`,
brand: '雅迪',
model: 'DE2',
manufacture_year: 2023,
range_km: 60,
battery_capacity_ah: 48,
price: 15000,
front_photo: DEFAULT_COVER_IMG,
seller: {
nickname: '测试卖家',
phone: '138****8888'
}
}
},
buyer: {
nickname: '测试买家',
phone: '139****9999'
},
is_sold: false
}
const targetOrders = viewMode.value === 'buy' ? boughtOrders : soldOrders
targetOrders.value = [mockOrder]
}
const response = await getOrderListAPI({
type,
status,
......@@ -450,7 +528,7 @@ const loadOrderData = async (isLoadMore = false) => {
// 为待支付订单添加倒计时时间
if (processedOrder.status === 3) {
// 计算剩余时间(毫秒)
// 计算剩余时间(毫秒)
const current_date = new Date(processedOrder.server_time);
const end_date = new Date(processedOrder.pay_deadline_time);
let time_left = end_date - current_date;
......@@ -546,6 +624,8 @@ const getStatusText = (status) => {
switch (status) {
case 3:
return '待支付'
case 4:
return viewMode.value === 'buy' ? '待收货' : '待发货'
case 5:
return '已完成'
case 7:
......@@ -562,6 +642,8 @@ const getStatusClass = (status) => {
switch (status) {
case 3:
return 'status-pending'
case 4:
return 'status-shipping'
case 5:
return 'status-completed'
case 7:
......@@ -889,6 +971,36 @@ const showCancelConfirmModal = ref(false)
const pendingCancelOrderId = ref('')
/**
* 确认发货弹窗显示状态
*/
const showShipConfirmModal = ref(false)
/**
* 待发货的订单ID
*/
const pendingShipOrderId = ref('')
/**
* 发货中的订单ID
*/
const shippingOrderId = ref('')
/**
* 确认收货弹窗显示状态
*/
const showReceiveConfirmModal = ref(false)
/**
* 待收货的订单ID
*/
const pendingReceiveOrderId = ref('')
/**
* 收货中的订单ID
*/
const receivingOrderId = ref('')
/**
* 取消订单
* @param {string} orderId - 订单ID
*/
......@@ -898,8 +1010,8 @@ const handleCancelOrder = async (orderId) => {
pendingCancelOrderId.value = orderId
showCancelConfirmModal.value = true
} catch (error) {
// 用户取消操作或其他错误
// console.log('取消订单操作被取消或出错:', error)
// 用户取消操作或其他错误
// console.log('取消订单操作被取消或出错:', error)
}
}
......@@ -955,7 +1067,7 @@ const performCancelOrder = async (orderId) => {
throw new Error(response.msg || '取消失败')
}
} catch (error) {
// console.error('取消订单失败:', error)
// console.error('取消订单失败:', error)
Taro.showToast({
title: error.msg || '取消订单失败,请重试',
......@@ -980,8 +1092,149 @@ const deleteOrder = async (orderId) => {
pendingDeleteOrderId.value = orderId
showConfirmModal.value = true
} catch (error) {
// 用户取消删除或其他错误
// console.log('删除操作被取消或出错:', error)
// 用户取消删除或其他错误
// console.log('删除操作被取消或出错:', error)
}
}
/**
* 确认收货处理
* @param {Object} order - 订单对象
*/
const handleConfirmReceive = async (order) => {
try {
// 保存待收货的订单ID
pendingReceiveOrderId.value = order.id
showReceiveConfirmModal.value = true
} catch (error) {
Taro.showToast({
title: '操作失败',
icon: 'error',
duration: 2000
})
}
}
/**
* 执行确认收货操作
* @param {string} orderId - 订单ID
*/
const performConfirmReceive = async (orderId) => {
// 关闭确认弹窗
showReceiveConfirmModal.value = false
// 设置收货状态,用于显示加载效果
receivingOrderId.value = orderId
try {
const order = boughtOrders.value.find(o => o.id === orderId)
if (wx.openBusinessView) {
wx.openBusinessView({
businessType: 'weappOrderConfirm',
extraData: {
merchant_id: '1230000109',
merchant_trade_no: order.id,
transaction_id: order.transaction_id || ''
},
success() {
// 确认收货组件调用成功
},
fail(err) {
Taro.showToast({
title: '确认收货失败',
icon: 'error',
duration: 2000
})
},
complete() {
receivingOrderId.value = ''
}
});
} else {
// 引导用户升级微信版本
Taro.showModal({
title: '提示',
content: '当前微信版本过低,请升级微信版本后重试',
showCancel: false
})
}
} catch (error) {
Taro.showToast({
title: '操作失败',
icon: 'error',
duration: 2000
})
} finally {
// 清除收货状态
receivingOrderId.value = ''
// 清除待收货订单ID
pendingReceiveOrderId.value = ''
}
}
/**
* 确认发货处理
* @param {Object} order - 订单对象
*/
const handleConfirmShip = async (order) => {
try {
// 保存待发货的订单ID
pendingShipOrderId.value = order.id
showShipConfirmModal.value = true
} catch (error) {
console.error('确认发货失败:', error)
}
}
/**
* 执行确认发货操作
* @param {string} orderId - 订单ID
*/
const performConfirmShip = async (orderId) => {
// 关闭确认弹窗
showShipConfirmModal.value = false
// 设置发货状态,用于显示加载效果
shippingOrderId.value = orderId
try {
// TODO: 调用确认发货API(暂时使用mock)
// const response = await confirmShipAPI({ id: orderId })
// Mock API响应
const response = { code: true, msg: '发货成功' }
if (response.code) {
// API发货成功后的处理
const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders
const order = orders.value.find(o => o.id === orderId)
if (order) {
// 更新订单状态为已完成
order.status = 5
Taro.showToast({
title: response.msg || '发货成功',
icon: 'success',
duration: 2000
})
}
} else {
throw new Error(response.msg || '发货失败')
}
} catch (error) {
console.error('确认发货失败:', error)
Taro.showToast({
title: error.msg || '确认发货失败,请重试',
icon: 'error',
duration: 2000
})
} finally {
// 清除发货状态
shippingOrderId.value = ''
// 清除待发货订单ID
pendingShipOrderId.value = ''
}
}
......@@ -1034,6 +1287,19 @@ const performDeleteOrder = async (orderId) => {
}
}
/**
* 处理确认收货成功事件
* @param {Object} data - 事件数据
*/
const handleConfirmReceiveSuccess = ({ merchantId, transactionId, merchantTradeNo }) => {
const orders = boughtOrders.value
const order = orders.find(o => o.id === merchantTradeNo)
if (order) {
order.status = 5 // 更新为已完成状态
}
}
// 页面加载时的初始化
onMounted(async () => {
// 加载订单数据
......@@ -1048,11 +1314,16 @@ onMounted(async () => {
height: windowHeight - headerHeight - navHeight + 'px'
}
}, 500);
// 监听确认收货成功事件
Taro.eventCenter.on('confirmReceiveSuccess', handleConfirmReceiveSuccess)
})
// 页面卸载时清理定时器
// 页面卸载时清理定时器和事件监听器
onUnmounted(() => {
clearAllCountdowns()
// 移除确认收货成功事件监听器
Taro.eventCenter.off('confirmReceiveSuccess', handleConfirmReceiveSuccess)
})
</script>
......