修复:修复下单可多次点击支付按钮问题;允许积分支付小数;
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user