优化新版积分
This commit is contained in:
17003
dist-electron/main.js
17003
dist-electron/main.js
File diff suppressed because one or more lines are too long
@@ -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,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user