修复:修复下单可多次点击支付按钮问题;允许积分支付小数;

This commit is contained in:
2025-12-22 17:52:02 +08:00
parent 55455fa4f2
commit cafb86cc9d
9 changed files with 283 additions and 132 deletions

View File

@@ -67,7 +67,7 @@
<view class="points-input-box">
<input
v-model="pointsDiscounted"
type="number"
type="digit"
clearable
:placeholder="$t('order.pointsPlaceholder')"
class="text-right"
@@ -90,7 +90,7 @@
<text class="label">{{ $t('order.total') }}</text>
<text class="amount">{{ finalAmount }} {{ t('global.coin') }}</text>
</view>
<wd-button type="primary" @click="handleSubmit">
<wd-button type="primary" :loading="submitLoading" @click="handleSubmit">
{{ $t('order.submit') }}
</wd-button>
</view>
@@ -128,6 +128,7 @@ import { getUserInfo } from '@/api/modules/user'
import { useUserStore } from '@/stores/user'
import { t } from '@/utils/i18n'
import type { IGoods, IGoodsDiscountParams } from '@/types/order'
import type { IUserInfo } from '@/types/user'
import PayWay from '@/components/order/PayWay.vue'
const userStore = useUserStore()
@@ -135,14 +136,13 @@ const userStore = useUserStore()
// 使用页面传参
interface Props {
goodsList: IGoods[],
userInfo: object,
userInfo: IUserInfo,
allowPointPay?: boolean,
orderType?: string,
backStep?: number // 购买完成后返回几层页面
}
const props = withDefaults(defineProps<Props>(), {
goodsList: () => [],
userInfo: () => ({}),
allowPointPay: true,
orderType: 'order',
backStep: 1
@@ -270,13 +270,24 @@ const calculatePromotionDiscounted = async () => {
const handlePointsInput = (value: any) => {
let val = String(value.detail.value)
// 允许数字字符,去掉小数点
val = val.replace(/[^0-9]/g, '')
// 允许数字字符小数点
val = val.replace(/[^0-9.]/g, '')
if (val === '0' || val === '') {
// 确保只有一个小数点
const dotIndex = val.indexOf('.')
if (dotIndex !== -1) {
// 限制小数点后最多两位
val = val.substring(0, dotIndex + 1) + val.substring(dotIndex + 1).replace(/\./g, '')
const decimalPart = val.substring(dotIndex + 1)
if (decimalPart.length > 2) {
val = val.substring(0, dotIndex + 1) + decimalPart.substring(0, 2)
}
}
if (val === '' || val === '.') {
pointsDiscounted.value = 0
} else {
let numericValue = parseInt(val, 10)
let numericValue = parseFloat(val)
if (numericValue < 0 || isNaN(numericValue)) {
numericValue = 0
}
@@ -316,7 +327,7 @@ const calculateFinalPrice = () => {
const orderAmountAfterDiscount = totalAmount.value - promotionDiscounted.value - vipDiscounted.value - couponAmount
pointsUsableMax.value = Math.min(
props?.userInfo?.jf || 0,
Math.floor(props.allowPointPay ? orderAmountAfterDiscount : 0)
props.allowPointPay ? orderAmountAfterDiscount : 0
)
pointsDiscounted.value = pointsUsableMax.value
@@ -362,28 +373,37 @@ const validateOrder = (): boolean => {
/**
* 提交订单
*/
const handleSubmit = async () => {
const submitLoading = ref<boolean>(false)
const handleSubmit = async () => {
// 验证订单
if (!validateOrder()) return
submitLoading.value = true
// 创建订单 此app用天医币支付创建订单成功即支付成功
await createOrder()
try {
// 创建订单 此app用天医币支付创建订单成功即支付成功
await createOrder()
// 重新获取用户信息更新store和本地缓存
const res = await getUserInfo()
userStore.setUserInfo(res.result)
// 重新获取用户信息更新store和本地缓存
const res = await getUserInfo()
userStore.setUserInfo(res.result)
uni.showToast({
title: t('order.orderSuccess'),
icon: 'success'
})
// 返回上一页
setTimeout(() => {
uni.navigateBack({
delta: props.backStep
uni.showToast({
title: t('order.orderSuccess'),
icon: 'success'
})
}, 500)
// 返回上一页
setTimeout(() => {
uni.navigateBack({
delta: props.backStep
})
}, 500)
} catch (error) {
console.error('提交订单失败:', error)
} finally {
// 无论成功还是失败都要重置loading状态
submitLoading.value = false
}
}
/**