feat(components): 新增 GiftCard礼品卡组件

- 新增 GiftCard 组件,支持多种类型礼品卡的展示和交互
- 组件包含商品信息、价格、折扣、使用指南等丰富功能- 优化图像展示,支持单
This commit is contained in:
2025-08-17 00:06:03 +08:00
parent 1b24a611a8
commit ecb5d9059a
22 changed files with 2788 additions and 191 deletions

View File

@@ -221,6 +221,19 @@ const OrderConfirm = () => {
return;
}
// 优惠券校验
if (selectedCoupon) {
const total = getGoodsTotal()
if (!isCouponUsable(selectedCoupon, total)) {
const reason = getCouponUnusableReason(selectedCoupon, total)
Taro.showToast({
title: reason || '优惠券不可用',
icon: 'error'
})
return;
}
}
// 构建订单数据
const orderData = buildSingleGoodsOrder(
goods.goodsId!,
@@ -230,26 +243,58 @@ const OrderConfirm = () => {
comments: goods.name,
deliveryType: 0,
buyerRemarks: orderRemark,
couponId: selectedCoupon ? selectedCoupon.id : undefined
// 确保couponId是数字类型
couponId: selectedCoupon ? Number(selectedCoupon.id) : undefined
}
);
// 根据支付方式选择支付类型
const paymentType = payment.type === 0 ? PaymentType.BALANCE : PaymentType.WECHAT;
// 执行支付
console.log('开始支付:', {
orderData,
paymentType,
selectedCoupon: selectedCoupon ? {
id: selectedCoupon.id,
title: selectedCoupon.title,
discount: getCouponDiscount()
} : null,
finalPrice: getFinalPrice()
});
// 执行支付 - 移除这里的成功提示让PaymentHandler统一处理
await PaymentHandler.pay(orderData, paymentType);
Taro.showToast({
title: '支付成功',
icon: 'success'
})
} catch (error) {
// ✅ 移除双重成功提示 - PaymentHandler会处理成功提示
// Taro.showToast({
// title: '支付成功',
// icon: 'success'
// })
} catch (error: any) {
console.error('支付失败:', error)
Taro.showToast({
title: '支付失败,请重试',
icon: 'error'
})
// 只处理PaymentHandler未处理的错误
if (!error.handled) {
let errorMessage = '支付失败,请重试';
// 根据错误类型提供具体提示
if (error.message?.includes('余额不足')) {
errorMessage = '账户余额不足,请充值后重试';
} else if (error.message?.includes('优惠券')) {
errorMessage = '优惠券使用失败,请重新选择';
} else if (error.message?.includes('库存')) {
errorMessage = '商品库存不足,请减少购买数量';
} else if (error.message?.includes('地址')) {
errorMessage = '收货地址信息有误,请重新选择';
} else if (error.message) {
errorMessage = error.message;
}
Taro.showToast({
title: errorMessage,
icon: 'error'
})
}
} finally {
setPayLoading(false)
}