From c26ede3e03b0dae929ca1e40dc0a7a45450a1fb9 Mon Sep 17 00:00:00 2001
From: gqt <3217233537@qq.com>
Date: Sun, 12 Jul 2026 21:11:24 +0800
Subject: [PATCH] feat: connect comprehensive profile and stored value payment
---
.../scripts/verify-comprehensive-commerce.mjs | 11 ++++++++
.../src/pages/comprehensive/pay/index.vue | 26 +++++++++++++++----
.../src/pages/comprehensive/profile/index.vue | 26 ++++++++++++++++++-
.../pages/comprehensive/profile/orders.vue | 4 ++-
4 files changed, 60 insertions(+), 7 deletions(-)
diff --git a/miniprogram/scripts/verify-comprehensive-commerce.mjs b/miniprogram/scripts/verify-comprehensive-commerce.mjs
index d7b7c7b..b8ac96d 100644
--- a/miniprogram/scripts/verify-comprehensive-commerce.mjs
+++ b/miniprogram/scripts/verify-comprehensive-commerce.mjs
@@ -20,6 +20,9 @@ const pagesJson = readFileSync(resolve(srcRoot, 'pages.json'), 'utf8')
const mallPage = readFileSync(resolve(srcRoot, 'pages/comprehensive/mall/index.vue'), 'utf8')
const availablePage = readFileSync(resolve(srcRoot, 'pages/comprehensive/membership/available-sessions.vue'), 'utf8')
const bookingDetail = readFileSync(resolve(srcRoot, 'pages/comprehensive/membership/booking-detail.vue'), 'utf8')
+const profilePage = readFileSync(resolve(srcRoot, 'pages/comprehensive/profile/index.vue'), 'utf8')
+const orderPage = readFileSync(resolve(srcRoot, 'pages/comprehensive/profile/orders.vue'), 'utf8')
+const payPage = readFileSync(resolve(srcRoot, 'pages/comprehensive/pay/index.vue'), 'utf8')
expectIncludes(membershipApi, "url: '/api/membership/plans'", 'membership plans')
expectIncludes(membershipApi, "url: '/api/membership/orders'", 'membership order')
@@ -40,6 +43,14 @@ expectIncludes(mallPage, 'face_value', 'face value display')
expectIncludes(availablePage, 'available_card_ids', 'available card selection')
expectExcludes(bookingDetail, 'booking.order', 'card booking has no order')
+expectIncludes(profilePage, '/pages/comprehensive/mall/index', 'mall entry')
+expectIncludes(profilePage, '/pages/comprehensive/membership/cards', 'my cards entry')
+expectIncludes(profilePage, '/pages/comprehensive/profile/balance', 'balance records entry')
+expectIncludes(profilePage, '/pages/comprehensive/profile/orders', 'consumption records entry')
+expectIncludes(orderPage, "value: 'membership'", 'membership filter')
+expectIncludes(orderPage, "value: 'stored_value'", 'stored value filter')
+expectIncludes(payPage, "order.value?.business_type === 'stored_value'", 'stored value payment guard')
+
if (failures.length) {
console.error(`Comprehensive commerce verification failed with ${failures.length} issue(s):`)
for (const failure of failures) console.error(`- ${failure}`)
diff --git a/miniprogram/src/pages/comprehensive/pay/index.vue b/miniprogram/src/pages/comprehensive/pay/index.vue
index c4bd567..c40362d 100644
--- a/miniprogram/src/pages/comprehensive/pay/index.vue
+++ b/miniprogram/src/pages/comprehensive/pay/index.vue
@@ -24,6 +24,7 @@
支付方式
toAmountNumber(balance.value.balance) >= toAmountNumber(order.value?.amount))
+const isStoredValueOrder = computed(() => order.value?.business_type === 'stored_value')
+const canUseBalance = computed(() => {
+ if (isStoredValueOrder.value) return false
+ return toAmountNumber(balance.value.balance) >= toAmountNumber(order.value?.amount)
+})
const canPay = computed(() => order.value?.status === 'pending_pay' && (payMethod.value !== 'balance' || canUseBalance.value))
const payButtonText = computed(() => {
if (order.value?.status !== 'pending_pay') return '订单不可支付'
@@ -108,7 +113,11 @@ const loadPage = async () => {
])
order.value = orderData
balance.value = balanceData
- if (!canUseBalance.value) payMethod.value = 'wechat'
+ if (isStoredValueOrder.value) {
+ payMethod.value = 'wechat'
+ } else if (!canUseBalance.value) {
+ payMethod.value = 'wechat'
+ }
updateCountdownTimer()
}
@@ -131,15 +140,22 @@ const stopCountdown = () => {
const padTime = (value) => String(value).padStart(2, '0')
const selectMethod = (method) => {
- if (method === 'balance' && !canUseBalance.value) {
- uni.showToast({ title: '余额不足', icon: 'none' })
- return
+ if (method === 'balance') {
+ if (isStoredValueOrder.value) {
+ uni.showToast({ title: '储值卡订单仅支持微信支付', icon: 'none' })
+ return
+ }
+ if (!canUseBalance.value) {
+ uni.showToast({ title: '余额不足', icon: 'none' })
+ return
+ }
}
payMethod.value = method
}
const pay = async () => {
if (!canPay.value || isSubmitting.value) return
+ if (isStoredValueOrder.value && payMethod.value === 'balance') return
isSubmitting.value = true
try {
if (payMethod.value === 'balance') {
diff --git a/miniprogram/src/pages/comprehensive/profile/index.vue b/miniprogram/src/pages/comprehensive/profile/index.vue
index 566c961..36d0ca4 100644
--- a/miniprogram/src/pages/comprehensive/profile/index.vue
+++ b/miniprogram/src/pages/comprehensive/profile/index.vue
@@ -17,6 +17,7 @@
{{ session.member.phone }}
+ 余额 ¥{{ balanceText }}
@@ -71,25 +72,40 @@