diff --git a/frontend/src/features/orders/composables/useMobilePaymentCashier.ts b/frontend/src/features/orders/composables/useMobilePaymentCashier.ts index d10b711..2ce20ca 100644 --- a/frontend/src/features/orders/composables/useMobilePaymentCashier.ts +++ b/frontend/src/features/orders/composables/useMobilePaymentCashier.ts @@ -32,7 +32,7 @@ export function useMobilePaymentCashier() { confirmButtonText: '知道了', }) }, - paidMessage: '支付成功,等待号主交接', + paidMessage: '支付成功,正在进入群消息', pollIntervalMs: 2500, qrWidth: 220, openExternalURL: url => { diff --git a/frontend/src/features/orders/composables/useOrderActions.ts b/frontend/src/features/orders/composables/useOrderActions.ts index 93cf1a6..34c9cb3 100644 --- a/frontend/src/features/orders/composables/useOrderActions.ts +++ b/frontend/src/features/orders/composables/useOrderActions.ts @@ -61,7 +61,7 @@ export interface UseOrderActionsOptions { /** * 打开收银台 UI(二维码弹窗 / App 浏览器跳转)。由调用方注入。 * 仅在 payment 未支付时被调用;payment 已支付的情况由 composable 自行提示并 loadOrder。 - * onPaid:支付完成(轮询发现 paid)时的回调,通常传入 loadOrder。 + * onPaid:支付完成(轮询发现 paid)时的回调,通常跳转到群消息。 */ startCashier: (payment: PaymentOrder, onPaid: () => Promise) => void | Promise /** 修改结账提交成功后触发(如关闭弹窗)。可选。 */ @@ -270,11 +270,11 @@ export function useOrderActions(options: UseOrderActionsOptions) { try { const payment = await startOrderPayment(order.value.id, { pay_way: payWay }) if (payment.paid) { - options.notifySuccess('支付成功,等待号主交接') - await loadOrder() + options.notifySuccess('支付成功,正在进入群消息') + await openOrderChatAfterPayment() return } - await options.startCashier(payment, loadOrder) + await options.startCashier(payment, openOrderChatAfterPayment) } catch (error) { options.notifyError(readError(error, '支付失败')) } finally { @@ -520,12 +520,30 @@ export function useOrderActions(options: UseOrderActionsOptions) { async function openOrderChat() { if (!order.value || openingChat.value) return + await navigateToOrderChat(order.value.id, '订单群聊暂不可用') + } + + async function openOrderChatAfterPayment() { + if (!order.value) return + const opened = await navigateToOrderChat( + order.value.id, + '支付成功,但群消息暂不可用,请稍后从消息进入' + ) + if (!opened) { + await loadOrder() + } + } + + async function navigateToOrderChat(orderID: number, errorMessage: string) { + if (openingChat.value) return false openingChat.value = true try { - const chat = await fetchOrderChat(order.value.id) + const chat = await fetchOrderChat(orderID) await router.push(`${options.chatPathPrefix}${chat.id}`) + return true } catch { - options.notifyError('订单群聊暂不可用') + options.notifyError(errorMessage) + return false } finally { openingChat.value = false } diff --git a/frontend/src/features/orders/composables/useOrderPaymentCashier.ts b/frontend/src/features/orders/composables/useOrderPaymentCashier.ts index d8c9a3f..9ee9376 100644 --- a/frontend/src/features/orders/composables/useOrderPaymentCashier.ts +++ b/frontend/src/features/orders/composables/useOrderPaymentCashier.ts @@ -28,7 +28,7 @@ export interface UseOrderPaymentCashierOptions { * Mobile 用 vant dialog(带"知道了"按钮)做强提示,PC 用普通提示即可。 */ notifyFallback: (message: string) => void - /** 支付完成的提示文案,默认 "支付成功,等待号主交接"。 */ + /** 支付完成的提示文案,默认 "支付成功,正在进入群消息"。 */ paidMessage?: string /** 轮询间隔,PC 3000 / Mobile 2500。 */ pollIntervalMs?: number @@ -60,7 +60,7 @@ export function useOrderPaymentCashier(options: UseOrderPaymentCashierOptions) { const pollIntervalMs = options.pollIntervalMs ?? 2500 const qrWidth = options.qrWidth ?? 220 - const paidMessage = options.paidMessage ?? '支付成功,等待号主交接' + const paidMessage = options.paidMessage ?? '支付成功,正在进入群消息' const payURL = computed(() => paymentPayURL(activePayment.value)) diff --git a/frontend/src/features/orders/views/MobileOrdersView.vue b/frontend/src/features/orders/views/MobileOrdersView.vue index 83a0ea0..a7fdbe2 100644 --- a/frontend/src/features/orders/views/MobileOrdersView.vue +++ b/frontend/src/features/orders/views/MobileOrdersView.vue @@ -13,6 +13,7 @@ import { } from '@/features/orders/api/orders' import MobilePaymentCashierPopup from '@/features/orders/components/MobilePaymentCashierPopup.vue' import { useMobilePaymentCashier } from '@/features/orders/composables/useMobilePaymentCashier' +import { fetchOrderChat } from '@/features/chats/api/chats' import { centToYuan, formatMoney } from '@/shared/utils/money' import { useSessionStore } from '@/stores/session' import { formatDateMinute } from '@/shared/utils/time' @@ -100,10 +101,10 @@ async function handlePay(order: Order) { try { const payment = await startOrderPayment(order.id, { pay_way: payWay }) if (payment.paid) { - showToast({ message: '支付成功,等待号主交接', icon: 'passed' }) - await loadOrders() + showToast({ message: '支付成功,正在进入群消息', icon: 'passed' }) + await openOrderChatAfterPayment(order) } else { - await openMobilePaymentCashier(payment, loadOrders) + await openMobilePaymentCashier(payment, () => openOrderChatAfterPayment(order)) } } catch (error) { showToast({ message: readError(error, '支付失败'), icon: 'cross' }) @@ -112,6 +113,16 @@ async function handlePay(order: Order) { } } +async function openOrderChatAfterPayment(order: Order) { + try { + const chat = await fetchOrderChat(order.id) + await router.push(`/m/chats/${chat.id}`) + } catch { + showToast({ message: '支付成功,但群消息暂不可用,请稍后从消息进入', icon: 'warning-o' }) + await loadOrders() + } +} + // selectPayWay 在列表快捷支付前让用户选择支付宝或微信。 async function selectPayWay(): Promise { try { diff --git a/frontend/src/features/orders/views/OrderDetailView.vue b/frontend/src/features/orders/views/OrderDetailView.vue index fc7c8b1..48c085f 100644 --- a/frontend/src/features/orders/views/OrderDetailView.vue +++ b/frontend/src/features/orders/views/OrderDetailView.vue @@ -23,7 +23,7 @@ const cashier = useOrderPaymentCashier({ notifyError: message => ElMessage.error(message), notifyInfo: message => ElMessage.info(message), notifyFallback: message => ElMessage.warning(message), - paidMessage: '支付成功,等待号主交接', + paidMessage: '支付成功,正在进入群消息', pollIntervalMs: 3000, qrWidth: 240, })