hookehuyr

feat(订单): 添加取消订单功能

实现订单取消功能,包括添加取消订单API接口和在订单管理页面添加取消操作按钮及确认弹窗
1 /* 1 /*
2 * @Date: 2025-07-03 17:21:45 2 * @Date: 2025-07-03 17:21:45
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-07-14 09:34:58 4 + * @LastEditTime: 2025-07-14 14:43:05
5 * @FilePath: /jgdl/src/api/orders.js 5 * @FilePath: /jgdl/src/api/orders.js
6 * @Description: 文件描述 6 * @Description: 文件描述
7 */ 7 */
...@@ -13,6 +13,7 @@ const Api = { ...@@ -13,6 +13,7 @@ const Api = {
13 CREATE_ORDER: '/srv/?a=order&t=add', 13 CREATE_ORDER: '/srv/?a=order&t=add',
14 REVIEW_ORDER: '/srv/?a=order&t=review', 14 REVIEW_ORDER: '/srv/?a=order&t=review',
15 DELETE_ORDER: '/srv/?a=order&t=del', 15 DELETE_ORDER: '/srv/?a=order&t=del',
16 + CANCEL_ORDER: '/srv/?a=order&t=cancel',
16 } 17 }
17 18
18 /** 19 /**
...@@ -55,3 +56,10 @@ export const reviewOrderAPI = (params) => fn(fetch.post(Api.REVIEW_ORDER, params ...@@ -55,3 +56,10 @@ export const reviewOrderAPI = (params) => fn(fetch.post(Api.REVIEW_ORDER, params
55 * @returns data{} 56 * @returns data{}
56 */ 57 */
57 export const deleteOrderAPI = (params) => fn(fetch.post(Api.DELETE_ORDER, params)); 58 export const deleteOrderAPI = (params) => fn(fetch.post(Api.DELETE_ORDER, params));
59 +
60 +/**
61 + * @description: 取消订单
62 + * @param order_id 订单ID
63 + * @returns data{}
64 + */
65 +export const cancelOrderAPI = (params) => fn(fetch.post(Api.CANCEL_ORDER, params));
......
1 <!-- 1 <!--
2 * @Date: 2022-09-19 14:11:06 2 * @Date: 2022-09-19 14:11:06
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2025-07-14 14:36:50 4 + * @LastEditTime: 2025-07-14 14:51:17
5 * @FilePath: /jgdl/src/pages/myOrders/index.vue 5 * @FilePath: /jgdl/src/pages/myOrders/index.vue
6 * @Description: 订单管理页面 6 * @Description: 订单管理页面
7 --> 7 -->
...@@ -81,7 +81,11 @@ ...@@ -81,7 +81,11 @@
81 <view class="order-actions"> 81 <view class="order-actions">
82 <!-- 买车模式:待支付状态 --> 82 <!-- 买车模式:待支付状态 -->
83 <template v-if="viewMode === 'buy' && order.status === 3"> 83 <template v-if="viewMode === 'buy' && order.status === 3">
84 - <nut-button type="primary" size="small" @click="handlePayment(order)" color="orange"> 84 + <nut-button type="default" size="small" @click="handleCancelOrder(order.id)"
85 + :loading="cancelingOrderId === order.id" :disabled="cancelingOrderId === order.id">
86 + {{ cancelingOrderId === order.id ? '取消中...' : '取消订单' }}
87 + </nut-button>
88 + <nut-button type="primary" size="small" @click="handlePayment(order)" color="orange" class="ml-2">
85 去支付 89 去支付
86 </nut-button> 90 </nut-button>
87 </template> 91 </template>
...@@ -270,7 +274,7 @@ ...@@ -270,7 +274,7 @@
270 </view> 274 </view>
271 </nut-popup> 275 </nut-popup>
272 276
273 - <!-- Confirmation Modal --> 277 + <!-- Delete Confirmation Modal -->
274 <nut-dialog 278 <nut-dialog
275 v-model:visible="showConfirmModal" 279 v-model:visible="showConfirmModal"
276 title="温馨提示" 280 title="温馨提示"
...@@ -285,6 +289,22 @@ ...@@ -285,6 +289,22 @@
285 </view> 289 </view>
286 </template> 290 </template>
287 </nut-dialog> 291 </nut-dialog>
292 +
293 + <!-- Cancel Order Confirmation Modal -->
294 + <nut-dialog
295 + v-model:visible="showCancelConfirmModal"
296 + title="温馨提示"
297 + cancel-text="我再想想"
298 + ok-text="确定取消"
299 + @cancel="showCancelConfirmModal = false"
300 + @ok="performCancelOrder(pendingCancelOrderId)"
301 + >
302 + <template #default>
303 + <view>
304 + <text style="font-size: 1rem;">取消订单后将无法恢复,确定要取消吗?</text>
305 + </view>
306 + </template>
307 + </nut-dialog>
288 </view> 308 </view>
289 </template> 309 </template>
290 310
...@@ -295,7 +315,7 @@ import './index.less' ...@@ -295,7 +315,7 @@ import './index.less'
295 import { $ } from '@tarojs/extend' 315 import { $ } from '@tarojs/extend'
296 import payCard from '@/components/payCard.vue' 316 import payCard from '@/components/payCard.vue'
297 // 导入接口 317 // 导入接口
298 -import { getOrderListAPI, getOrderDetailAPI, reviewOrderAPI } from '@/api/orders' 318 +import { getOrderListAPI, getOrderDetailAPI, reviewOrderAPI, cancelOrderAPI, deleteOrderAPI } from '@/api/orders'
299 import { DEFAULT_COVER_IMG } from '@/utils/config' 319 import { DEFAULT_COVER_IMG } from '@/utils/config'
300 320
301 const scrollStyle = ref({ 321 const scrollStyle = ref({
...@@ -683,6 +703,9 @@ const submitRate = async () => { ...@@ -683,6 +703,9 @@ const submitRate = async () => {
683 } 703 }
684 } 704 }
685 705
706 +// 取消订单相关状态
707 +const cancelingOrderId = ref('')
708 +
686 // 删除订单相关状态 709 // 删除订单相关状态
687 const deletingOrderId = ref('') 710 const deletingOrderId = ref('')
688 711
...@@ -697,6 +720,80 @@ const showConfirmModal = ref(false) ...@@ -697,6 +720,80 @@ const showConfirmModal = ref(false)
697 const pendingDeleteOrderId = ref('') 720 const pendingDeleteOrderId = ref('')
698 721
699 /** 722 /**
723 + * 取消订单确认弹窗显示状态
724 + */
725 +const showCancelConfirmModal = ref(false)
726 +
727 +/**
728 + * 待取消的订单ID
729 + */
730 +const pendingCancelOrderId = ref('')
731 +
732 +/**
733 + * 取消订单
734 + * @param {string} orderId - 订单ID
735 + */
736 +const handleCancelOrder = async (orderId) => {
737 + try {
738 + // 保存待取消的订单ID
739 + pendingCancelOrderId.value = orderId
740 + showCancelConfirmModal.value = true
741 + } catch (error) {
742 + // 用户取消操作或其他错误
743 + // console.log('取消订单操作被取消或出错:', error)
744 + }
745 +}
746 +
747 +/**
748 + * 执行取消订单操作
749 + * @param {string} orderId - 订单ID
750 + */
751 +const performCancelOrder = async (orderId) => {
752 + // 关闭确认弹窗
753 + showCancelConfirmModal.value = false
754 +
755 + // 设置取消状态,用于显示加载效果
756 + cancelingOrderId.value = orderId
757 +
758 + try {
759 + // 调用取消订单API
760 + const response = await cancelOrderAPI({ id: orderId })
761 +
762 + if (response.code) {
763 + // API取消成功后的处理
764 + const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders
765 + const order = orders.value.find(o => o.id === orderId)
766 +
767 + if (order) {
768 + // 更新订单状态为已取消
769 + order.status = 7
770 +
771 + Taro.showToast({
772 + title: '订单已取消',
773 + icon: 'success',
774 + duration: 2000
775 + })
776 + }
777 + } else {
778 + throw new Error(response.message || '取消失败')
779 + }
780 + } catch (error) {
781 + // console.error('取消订单失败:', error)
782 +
783 + Taro.showToast({
784 + title: error.message || '取消订单失败,请重试',
785 + icon: 'error',
786 + duration: 2000
787 + })
788 + } finally {
789 + // 清除取消状态
790 + cancelingOrderId.value = ''
791 + // 清除待取消订单ID
792 + pendingCancelOrderId.value = ''
793 + }
794 +}
795 +
796 +/**
700 * 删除订单 797 * 删除订单
701 * @param {string} orderId - 订单ID 798 * @param {string} orderId - 订单ID
702 */ 799 */
...@@ -723,24 +820,11 @@ const performDeleteOrder = async (orderId) => { ...@@ -723,24 +820,11 @@ const performDeleteOrder = async (orderId) => {
723 deletingOrderId.value = orderId 820 deletingOrderId.value = orderId
724 821
725 try { 822 try {
726 - // 真实的API调用(当前注释掉,使用模拟数据) 823 + // 调用删除订单API
727 - // const response = await deleteOrderAPI({ orderId }) 824 + const response = await deleteOrderAPI({ id: orderId })
728 - // if (response.code) { 825 +
729 - // // API删除成功后的处理 826 + if (response.code) {
730 - // const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders 827 + // API删除成功后的处理
731 - // const orderIndex = orders.value.findIndex(order => order.id === orderId)
732 - // if (orderIndex !== -1) {
733 - // orders.value.splice(orderIndex, 1)
734 - // }
735 - // Toast.success(response.message || '订单删除成功')
736 - // } else {
737 - // throw new Error(response.message || '删除失败')
738 - // }
739 -
740 - // 模拟API调用延迟(开发阶段使用)
741 - await new Promise(resolve => setTimeout(resolve, 1000))
742 -
743 - // 从本地数据中移除订单
744 const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders 828 const orders = viewMode.value === 'buy' ? boughtOrders : soldOrders
745 const orderIndex = orders.value.findIndex(order => order.id === orderId) 829 const orderIndex = orders.value.findIndex(order => order.id === orderId)
746 830
...@@ -748,12 +832,13 @@ const performDeleteOrder = async (orderId) => { ...@@ -748,12 +832,13 @@ const performDeleteOrder = async (orderId) => {
748 orders.value.splice(orderIndex, 1) 832 orders.value.splice(orderIndex, 1)
749 833
750 Taro.showToast({ 834 Taro.showToast({
751 - title: '订单删除成功', 835 + title: response.message || '订单删除成功',
752 icon: 'success', 836 icon: 'success',
753 duration: 2000 837 duration: 2000
754 }) 838 })
839 + }
755 } else { 840 } else {
756 - throw new Error('订单不存在') 841 + throw new Error(response.message || '删除失败')
757 } 842 }
758 843
759 } catch (error) { 844 } catch (error) {
......