优化新版积分

This commit is contained in:
gyq
2025-12-23 13:48:55 +08:00
parent 492b3a45d5
commit cf2f61c240
3 changed files with 17090 additions and 46 deletions

File diff suppressed because one or more lines are too long

View File

@@ -367,7 +367,7 @@ export function findCoupon(params) {
export function calcUsablePoints(params) {
return request({
method: "get",
url: "/account/admin/points/memberPoints/calcUsablePoints",
url: "/market/admin/points/userPoints",
params,
});
}

View File

@@ -206,7 +206,7 @@
<el-form-item label="积分抵扣">
<div class="flex">
<el-input v-model="couponForm.pointsNum"
:disabled="!couponFormUser.id || !pointOptions.usable || goodsStore.cartInfo.costSummary.finalPayAmount < pointOptions.minPaymentAmount"
:disabled="!couponFormUser.id || !pointOptions.usable || goodsStore.cartInfo.costSummary.finalPayAmount < pointOptions.minPaymentAmount || (couponFormUser.accountPoints || 0) < (pointOptions.minPoints || 0)"
:placeholder="pointOptions.usable ? '请输入需要抵扣的积分' : pointOptions.unusableReason"
v-loading="pointOptions.loading" @input="pointInput">
<template #prepend>现有积分:{{ couponFormUser.accountPoints || 0 }}</template>
@@ -252,7 +252,7 @@ import CouponModal from '@/components/payCard/couponModal.vue'
import { ElMessage } from "element-plus";
import { staffPermission } from "@/api/user.js";
import { cashPay, buyerPage, creditPay, vipPay } from "@/api/order.js";
import { calcUsablePoints, calcDeductionAmount } from '@/api/account.js'
import { calcUsablePoints } from '@/api/account.js'
import { useGoods } from "@/store/goods.js";
const emit = defineEmits(["paySuccess", 'orderExpired', 'reset']);
@@ -651,13 +651,20 @@ const couponResList1 = ref([])
const couponResList2 = ref([])
const pointOptions = ref({
min: 0,
max: 0,
minPaymentAmount: 0,
// 新接口字段
enableRewards: 0, // 是否开启消费赠送积分1 开启)
consumeAmount: 0, // 每消费xx元赠送1积分
minPaymentAmount: 0, // 下单实付抵扣门槛(元)
maxDeductionRatio: 0, // 下单最高抵扣比例(如 0.2 表示最多抵扣 20%
equivalentPoints: 0, // 1元 = ? 积分
enablePointsMall: 0, // 是否开启积分商城
// 派生字段(页面使用)
minPoints: 0, // 最少使用积分(换算后)
maxPoints: 0, // 最大可用积分(换算后)
usable: true,
unusableReason: '',
amount: 0,
equivalentPoints: '',
amount: 0, // 抵扣金额(元)
loading: false
})
@@ -734,9 +741,15 @@ function cancelAllDiscount() {
// 同意更新商品计算
function updateCartCalc() {
// 计算最大抵扣金额(按订单金额 * 最大抵扣比例)
const orderAmount = Number(goodsStore.cartInfo.costSummary.finalPayAmount || 0)
const maxDeductionAmount = (pointOptions.value.maxDeductionRatio && pointOptions.value.equivalentPoints !== undefined)
? orderAmount * pointOptions.value.maxDeductionRatio
: 0
goodsStore.calcCartInfo({
pointsPerYuan: pointOptions.value.equivalentPoints,
maxDeductionAmount: pointOptions.value.max,
maxDeductionAmount: maxDeductionAmount,
userPoints: couponForm.value.pointsNum,
backendCoupons: couponResList1.value,
fixedAmount: discountRateNumber.value
@@ -759,13 +772,26 @@ const pointInput = _.debounce(function (e) {
couponForm.value.pointsNum = inputFilterInt(e)
console.log('inputFilterInt===', couponForm.value.pointsNum);
// 若如果大于最大值
if (couponForm.value.pointsNum > pointOptions.value.max) {
couponForm.value.pointsNum = pointOptions.value.max
// 未登录用户或无可用积分时直接归0并返回
const userAvailablePoints = Number(couponFormUser.accountPoints || 0)
if (!couponFormUser.id || userAvailablePoints <= 0) {
couponForm.value.pointsNum = 0
pointOptions.value.amount = 0
updateCartCalc()
return
}
// 如果小于最大值
if (couponForm.value.pointsNum < pointOptions.value.min) {
couponForm.value.pointsNum = pointOptions.value.min
// 限制不得超过用户现有积分
if (couponForm.value.pointsNum > userAvailablePoints) {
couponForm.value.pointsNum = userAvailablePoints
}
// 边界限制:不得超过最大/小于最小
if (couponForm.value.pointsNum > pointOptions.value.maxPoints) {
couponForm.value.pointsNum = pointOptions.value.maxPoints
}
if (couponForm.value.pointsNum < pointOptions.value.minPoints) {
couponForm.value.pointsNum = pointOptions.value.minPoints
}
if (!e) {
@@ -779,7 +805,7 @@ const pointInput = _.debounce(function (e) {
// 满足条件式开始计算抵扣金额,由后端返回
if (couponForm.value.pointsNum >= pointOptions.value.min && couponForm.value.pointsNum <= pointOptions.value.max) {
if (couponForm.value.pointsNum >= pointOptions.value.minPoints && couponForm.value.pointsNum <= pointOptions.value.maxPoints) {
pointOptions.value.loading = true
calcPointMoney()
}
@@ -788,16 +814,33 @@ const pointInput = _.debounce(function (e) {
}, 500)
// 根据积分计算可抵扣金额
// 根据积分计算可抵扣金额(前端计算,不依赖后端)
const calcPointMoney = async () => {
try {
const res = await calcDeductionAmount({
shopUserId: goodsStore.vipUserInfo.id,
orderAmount: goodsStore.cartInfo.costSummary.finalPayAmount,
points: couponForm.value.pointsNum
})
pointOptions.value.amount = formatDecimal(+res)
couponForm.value.amount = couponForm.value.amount - res
const eq = Number(pointOptions.value.equivalentPoints || 0) // 积分与元的换算1元 = eq 积分
const points = Number(couponForm.value.pointsNum || 0)
const orderAmount = Number(goodsStore.cartInfo.costSummary.finalPayAmount || 0)
if (!eq || points <= 0) {
pointOptions.value.amount = 0
// 若未初始化 couponForm.value.amount,则用订单原价
couponForm.value.amount = couponForm.value.amount || originOrderAmount.value || orderAmount
updateCartCalc()
return
}
// 积分可抵扣的金额(元)
let deductionFromPoints = points / eq
// 最大可抵扣金额基于订单金额和最大抵扣比例
const maxDeductionAmount = orderAmount * (pointOptions.value.maxDeductionRatio || 0)
// 最终抵扣为积分抵扣金额与最大比例的较小者,且不超过订单可支付金额
const baseAmount = Number(couponForm.value.amount || originOrderAmount.value || orderAmount)
let deduction = Math.min(deductionFromPoints, maxDeductionAmount, baseAmount)
pointOptions.value.amount = formatDecimal(deduction)
couponForm.value.amount = formatDecimal(baseAmount - deduction)
updateCartCalc()
} catch (error) {
@@ -833,6 +876,12 @@ function couponDialogOpen() {
couponFormUserList.value = []
couponFormUser.value = ''
}
// 初始化优惠表单的金额基数:优先使用 originOrderAmount其次使用购物车的最终支付金额
const baseAmount = Number(originOrderAmount.value || 0) || Number(goodsStore.cartInfo.costSummary.finalPayAmount || 0)
couponForm.value.originAmount = formatDecimal(baseAmount)
couponForm.value.amount = formatDecimal(baseAmount - roundAmount.value)
resetCouponForm.value = { ...couponForm.value }
}
// 关闭后初始化dialog
@@ -906,17 +955,37 @@ function resetCoupon() {
// 选择完用户后开始获取积分使用配置
async function pointOptionsAjax() {
try {
const res = await calcUsablePoints({
const { pointsConfig, pointsUser } = await calcUsablePoints({
shopUserId: goodsStore.vipUserInfo.id,
orderAmount: goodsStore.cartInfo.costSummary.finalPayAmount
// orderAmount: goodsStore.cartInfo.costSummary.finalPayAmount
})
pointOptions.value.min = res.minDeductionPoints // 最少使用积分
pointOptions.value.max = res.maxUsablePoints // 最大使用积分
pointOptions.value.usable = res.usable // 是否可用
pointOptions.value.unusableReason = res.unusableReason // 不可用的原因
pointOptions.value.minPaymentAmount = res.minPaymentAmount // 最少使用的金额
pointOptions.value.equivalentPoints = res.equivalentPoints
const res = pointsConfig || {}
const userPoint = pointsUser
couponFormUser.value.accountPoints = userPoint.id ? userPoint.pointBalance : 0
// 映射最新接口字段
pointOptions.value.enableRewards = Number(res.enableRewards || 0)
pointOptions.value.consumeAmount = Number(res.consumeAmount || 0)
pointOptions.value.minPaymentAmount = Number(res.minPaymentAmount || 0)
pointOptions.value.maxDeductionRatio = Number(res.maxDeductionRatio || 0)
pointOptions.value.equivalentPoints = Number(res.equivalentPoints || 0)
pointOptions.value.enablePointsMall = Number(res.enablePointsMall || 0)
// 计算页面需要的最小/最大可用积分(按接口返回的金额阈值与比例换算为积分)
const eq = pointOptions.value.equivalentPoints || 0
const orderAmount = Number(goodsStore.cartInfo.costSummary.finalPayAmount || 0)
// 最少使用积分基于最小抵扣金额换算若无则为0
pointOptions.value.minPoints = pointOptions.value.minPaymentAmount && eq ? Math.ceil(pointOptions.value.minPaymentAmount * eq) : 0
// 最大可用积分:基于订单金额与最大抵扣比例换算
pointOptions.value.maxPoints = (pointOptions.value.maxDeductionRatio && eq) ? Math.floor(orderAmount * pointOptions.value.maxDeductionRatio * eq) : 0
// 可用性
pointOptions.value.usable = pointOptions.value.enableRewards === 1 && pointOptions.value.maxPoints > 0
pointOptions.value.unusableReason = pointOptions.value.usable ? '' : (pointOptions.value.enableRewards !== 1 ? '商家未开启积分抵扣' : '订单不可抵扣积分')
} catch (error) {
console.log(error);
}