From f0fee9085d5665c55f9935428baac5a5984c92ee Mon Sep 17 00:00:00 2001
From: YeMingfei666 <1619116647@qq.com>
Date: Fri, 10 Oct 2025 09:26:39 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=9A=E5=91=98=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pages/order/components/orderInfo.vue | 4 +-
pages/order/confirm-order.vue | 7 +-
user/vip/buy-vip.vue | 52 +-
user/vip/vip.vue | 731 ++++++++++++++-------------
utils/goods-utils.js | 177 ++++---
5 files changed, 529 insertions(+), 442 deletions(-)
diff --git a/pages/order/components/orderInfo.vue b/pages/order/components/orderInfo.vue
index 9bf1f3c..4114984 100644
--- a/pages/order/components/orderInfo.vue
+++ b/pages/order/components/orderInfo.vue
@@ -474,7 +474,9 @@
})
Object.assign(pointsRes, res)
maxPointDiscount.value = res.maxDeductionAmount
- cartStore.setUserPoints(res.maxUsablePoints || 0)
+ if(usePoints.value){
+ cartStore.setUserPoints(res.maxUsablePoints || 0)
+ }
console.log('getMaxPointsDiscount:cartStore.orderCostSummary.pointUsed', cartStore.orderCostSummary.pointUsed);
}
watch(() => maxMoney.value, (newval) => {
diff --git a/pages/order/confirm-order.vue b/pages/order/confirm-order.vue
index 052a306..e893384 100644
--- a/pages/order/confirm-order.vue
+++ b/pages/order/confirm-order.vue
@@ -221,10 +221,9 @@
if (newval && newval.id) {
disablePayType.value = ['余额支付']
paymentMethodref.value.groupChanges(2)
- } else {
- disablePayType.value = []
- }
-
+ return
+ }
+ console.log('orderVIP.value.amount',orderVIP.value.amount);
if (!orderVIP.value.amount) {
disablePayType.value = ['余额支付']
if (paymentMethodref.value) {
diff --git a/user/vip/buy-vip.vue b/user/vip/buy-vip.vue
index 32065f9..ede2699 100644
--- a/user/vip/buy-vip.vue
+++ b/user/vip/buy-vip.vue
@@ -146,7 +146,8 @@
import {
ref,
reactive,
- computed
+ computed,
+ watch
} from "vue"
import {
joinMember,
@@ -194,15 +195,15 @@
const state = reactive({
openType: 'CONDITION'
})
-
- const pay_menus = ref([{
+
+ const $pay_menus=[{
name: '赠送成长值',
desc: '赠送成长值',
icon: '/user/static/buy-vip/Frame_220.png',
},
{
name: '优惠券',
- desc: '每月赠送2张优惠券',
+ desc: '',
icon: '/user/static/buy-vip/Frame_221.png'
},
{
@@ -212,7 +213,7 @@
},
{
name: '会员折扣',
- desc: '全店折扣98折',
+ desc: '',
icon: '/user/static/buy-vip/Frame_223.png'
},
{
@@ -225,7 +226,9 @@
desc: '',
icon: '/user/static/buy-vip/Frame_225.png'
}
- ])
+ ]
+
+ const pay_menus = ref($pay_menus)
let tiaojian_menus =ref( [{
name: '享会员价',
@@ -295,7 +298,7 @@
if (res) {
if(!res.memberConfig.isMemberPrice){
tiaojian_menus.value=tiaojian_menus.value.filter(v=>v.name!='享会员价')
- pay_menus.value=pay_menus.value.filter(v=>v.name!='享会员价')
+ pay_menus.value=$pay_menus.filter(v=>v.name!='享会员价')
}
if (res.memberConfig.isSubmitInfo && (shopUserInfo.value.sex === null || shopUserInfo.value.sex ===
undefined || !shopUserInfo.value.nickName || !shopUserInfo.value.birthDay || !shopUserInfo.value
@@ -319,8 +322,9 @@
configList.value = res.memberConfig.configList
Object.assign(state, res.memberConfig)
- memberLevel.value = res.memberLevel
-
+ const first_lv=(res.memberLevelList||[])[0]
+ memberLevel.value = res.memberLevel||first_lv
+ filterPay_menus()
}
}
const returnReward = computed(() => {
@@ -389,6 +393,36 @@
},1000)
}
}
+ //过滤掉部分未开启的菜单相
+ function filterPay_menus(){
+ pay_menus.value=$pay_menus.filter(v=>{
+ if(!state.isMemberPrice&&v.name=='享会员价'){
+ return false
+ }
+ if (state.isSubmitInfo && (shopUserInfo.value.sex === null || shopUserInfo.value.sex ===
+ undefined || !shopUserInfo.value.nickName || !shopUserInfo.value.birthDay || !shopUserInfo.value
+ .phone)) {
+ memberOpen.value = true;
+ }
+ const viplv= configList.value[vipSel.value]
+ if(viplv.couponList.length==0&&v.name=='优惠券'){
+ return false
+ }
+ if((!memberLevel.value||!memberLevel.value.isCostRewardPoints)&&v.name=='消费送积分'){
+ return false
+ }
+ if((!memberLevel.value||!memberLevel.value.isCycleReward)&&v.name=='周期福利'){
+ return false
+ }
+ return true
+ })
+ }
+ watch(()=>vipSel.value,(newval,oldval)=>{
+ console.log('vipSel.value',newval);
+ filterPay_menus()
+
+ })
+
diff --git a/user/vip/vip.vue b/user/vip/vip.vue
index 354f613..9f6271f 100644
--- a/user/vip/vip.vue
+++ b/user/vip/vip.vue
@@ -47,7 +47,8 @@
{{ item.name }}
-
+
{{ item.desc }}
@@ -78,383 +79,423 @@
+ .up-content {
+ color: #999;
+ font-size: 12px;
+ }
+
+ .buy-btn {
+ margin: 98rpx 48rpx 48rpx 48rpx;
+ padding: 32rpx 32rpx;
+ color: #fff;
+ font-size: 16px;
+ font-weight: 700;
+ border-radius: 80rpx;
+ line-height: 1;
+ background: linear-gradient(98deg, #fe6d1100 40.64%, #ffd1b4 105.2%), linear-gradient(259deg, #fe6d11 50.14%, #ffd1b4 114.93%);
+ box-shadow: 0 14rpx 30.4rpx 0 #fe8b435e;
+ }
+
\ No newline at end of file
diff --git a/utils/goods-utils.js b/utils/goods-utils.js
index 262236c..41b8638 100644
--- a/utils/goods-utils.js
+++ b/utils/goods-utils.js
@@ -12,13 +12,13 @@ import _ from "lodash";
* @param {Object} shopInfo
*/
export function returnGoodsPrice(goods, user, shopInfo) {
- if(!goods){
+ if (!goods) {
return 0
}
if (goods.discount_sale_amount * 1 > 0) {
return goods.discount_sale_amount;
}
- if(shopInfo&&!shopInfo.isMemberPrice){
+ if (shopInfo && !shopInfo.isMemberPrice) {
return goods.salePrice;
}
if (user.isVip && goods.memberPrice * 1 <= goods.salePrice * 1 && goods.memberPrice * 1 > 0) {
@@ -68,38 +68,37 @@ export function returnCoupType(coupon) {
* @param user 用户信息
*/
export function returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user) {
- const types = [2, 4, 6];
- // 收集已抵扣商品并关联对应的优惠券类型
- const goodsCouponGoods = selCoupon
- .filter((v) => types.includes(v.type))
- .reduce((prev, cur) => {
- // 给每个抵扣商品添加所属优惠券类型
- const goodsWithType = cur.discount.hasDiscountGoodsArr.map(goods => ({
- ...goods,
- couponType: cur.type // 记录该商品是被哪种类型的优惠券抵扣的
- }));
- prev.push(...goodsWithType);
- return prev;
- }, []);
+ const types = [2, 4, 6];
+ // 收集已抵扣商品并关联对应的优惠券类型
+ const goodsCouponGoods = selCoupon
+ .filter((v) => types.includes(v.type))
+ .reduce((prev, cur) => {
+ // 给每个抵扣商品添加所属优惠券类型
+ const goodsWithType = cur.discount.hasDiscountGoodsArr.map(goods => ({
+ ...goods,
+ couponType: cur.type // 记录该商品是被哪种类型的优惠券抵扣的
+ }));
+ prev.push(...goodsWithType);
+ return prev;
+ }, []);
+ const arr = _.cloneDeep(canDikouGoodsArr)
+ .map((v) => {
+ const findCart = goodsCouponGoods.find((carts) => carts.id == v.id);
+ if (findCart) {
+ // 根据优惠券类型判断扣减数量
+ if ([4, 6].includes(findCart.couponType)) {
+ // 类型4(第二件半价)或6(买一送一),数量减2
+ v.num -= 2;
+ } else {
+ // 其他类型(如类型2商品券),按原逻辑扣减对应数量
+ v.num -= findCart.num;
+ }
+ }
+ return v;
+ })
+ .filter((v) => v.num > 0); // 过滤掉数量<=0的商品
- const arr = _.cloneDeep(canDikouGoodsArr)
- .map((v) => {
- const findCart = goodsCouponGoods.find((carts) => carts.id == v.id);
- if (findCart) {
- // 根据优惠券类型判断扣减数量
- if ([4, 6].includes(findCart.couponType)) {
- // 类型4(第二件半价)或6(买一送一),数量减2
- v.num -= 2;
- } else {
- // 其他类型(如类型2商品券),按原逻辑扣减对应数量
- v.num -= findCart.num;
- }
- }
- return v;
- })
- .filter((v) => v.num > 0); // 过滤掉数量<=0的商品
-
- return arr;
+ return arr;
}
/**
@@ -135,25 +134,24 @@ export function returnCouponCanUse(args) {
reason: "优惠券未启用"
};
}
-
+
// 计算门槛金额
let fullAmount = goodsOrderPrice;
- canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user,shopInfo);
-
+ canDikouGoodsArr = returnCanDikouGoodsArr(canDikouGoodsArr, selCoupon, user, shopInfo);
//优惠券指定门槛商品列表
- let canCalcGoodsArr=[...canDikouGoodsArr]
+ let canCalcGoodsArr = [...canDikouGoodsArr]
//部分商品参与门槛计算
- if(coupon.thresholdFoods.length){
- canCalcGoodsArr = canDikouGoodsArr.filter((v) => {
+ if (coupon.thresholdFoods.length) {
+ canCalcGoodsArr = canDikouGoodsArr.filter((v) => {
return coupon.thresholdFoods.find((food) => food.id == v.productId);
});
fullAmount = canCalcGoodsArr.reduce((pre, cur) => {
- return pre + returnGoodsPrice(cur, user,shopInfo) * cur.num;
+ return pre + returnGoodsPrice(cur, user, shopInfo) * cur.num;
}, 0);
}
-
-
-
+
+
+
// 是否全部商品可用
const isDikouAll = coupon.useFoods.length === 0;
// 订单可用商品列表
@@ -163,27 +161,27 @@ export function returnCouponCanUse(args) {
return coupon.useFoods.find((food) => food.id == v.productId);
});
}
- if(user.isVip&&!coupon.vipPriceShare){
+ if (user.isVip && !coupon.vipPriceShare) {
return {
canUse: false,
reason: "非会员可用"
};
}
- if(selCoupon.length>0&&!selCoupon[0].otherCouponShare){
- return {
+ if (selCoupon.length > 0 && !selCoupon[0].otherCouponShare) {
+ return {
canUse: false,
reason: "当前选中的券不可与其他券同享"
};
}
- if(selCoupon.length>0&&!coupon.otherCouponShare){
- return {
+ if (selCoupon.length > 0 && !coupon.otherCouponShare) {
+ return {
canUse: false,
reason: "当前选中的券不可与其他券同享"
};
}
// 满减券和折扣券计算门槛金额是否满足
- if([1,3].includes(coupon.type)){
- if(canCalcGoodsArr.length<=0){
+ if ([1, 3].includes(coupon.type)) {
+ if (canCalcGoodsArr.length <= 0) {
return {
canUse: false,
reason: "没有可参与计算门槛的商品"
@@ -198,9 +196,15 @@ export function returnCouponCanUse(args) {
}
}
// 商品兑换券,第二件半价和买一送一判断是否有可用商品
- if([2,4,5].includes(coupon.type)){
+ if ([2, 4, 5].includes(coupon.type)) {
// 没有符合条件的商品
- if (!isDikouAll && canCalcGoodsArr.length === 0) {
+ if (isDikouAll && canDikouGoodsArr.length === 0) {
+ return {
+ canUse: false,
+ reason: "没有符合条件的商品"
+ };
+ }
+ if (!isDikouAll && canUseGoodsArr.length === 0) {
return {
canUse: false,
reason: "没有符合条件的商品"
@@ -208,7 +212,7 @@ export function returnCouponCanUse(args) {
}
}
//商品兑换券是否达到门槛金额
- if(coupon.type==2&&goodsOrderPrice {
return new BigNumber(prve).plus(new BigNumber(cur.discount.discountPrice));
}, new BigNumber(0));
-
+
// 将商品订单价格转换为BigNumber并减去优惠券折扣
const adjustedGoodsOrderPrice = new BigNumber(goodsOrderPrice).minus(goodsCouponDiscount);
console.log('adjustedGoodsOrderPrice', adjustedGoodsOrderPrice.toNumber());
-
+
// 计算优惠比例:(100 - 折扣率) / 100
const discountAmountRatio = new BigNumber(100).minus(discountRate).dividedBy(100);
-
+
// 计算折扣金额:调整后的商品订单金额 × 优惠比例
let discountPrice = adjustedGoodsOrderPrice.times(discountAmountRatio)
.decimalPlaces(2, BigNumber.ROUND_FLOOR)
.toNumber();
-
+
// 应用最大折扣金额限制
if (maxDiscountAmount !== 0) {
discountPrice = discountPrice >= maxDiscountAmount ? maxDiscountAmount : discountPrice;
@@ -372,7 +376,7 @@ export function returnCouponZhekouDiscount(
* @param user 用户信息
* @param shopInfo 店铺信息
*/
-export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user,shopInfo) {
+export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user, shopInfo) {
const {
useFoods,
discountNum,
@@ -402,7 +406,7 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user,shopI
discountGoodsArr = discountSelGoodsArr.slice(0, discountNum);
}
}
- const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user,shopInfo);
+ const result = calcDiscountGoodsArrPrice(discountGoodsArr, discountNum, user, shopInfo);
return result;
}
@@ -413,7 +417,7 @@ export function returnCouponProductDiscount(canDikouGoodsArr, coupon, user,shopI
* @param user 用户信息
* @param shopInfo 店铺信息
*/
-function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user,shopInfo) {
+function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user, shopInfo) {
const {
useFoods,
useRule
@@ -425,23 +429,28 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user,shopIn
//抵扣全部商品
if (useFoods.length === 0) {
if (useRule == "price_asc") {
- discountGoods = canUseGoods[canUseGoods.length - 1];
+ discountGoods = canUseGoods[canUseGoods.length - 1]
} else {
- discountGoods = canUseGoods.slice(0, 1);
+ discountGoods = canUseGoods[0];
}
} else {
//符合抵扣条件的商品
const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId));
if (useRule == "price_asc") {
- discountGoods = canUseGoods1[canUseGoods1.length - 1];
+ discountGoods = canUseGoods1[canUseGoods1.length - 1]
} else {
- discountGoods = canUseGoods1.slice(0, 1);
+ discountGoods = canUseGoods1[0]
}
}
- const discountPrice = returnGoodsPrice(discountGoods, user,shopInfo);
- const hasDiscountGoodsArr = [discountGoods];
+ let discountPrice = 0;
+ let hasDiscountGoodsArr = []
+ console.log('returnCouponBuyOneGiveOneDiscount:discountGoods',discountGoods);
+ if (discountGoods) {
+ discountPrice = returnGoodsPrice(discountGoods, user, shopInfo);
+ hasDiscountGoodsArr = [discountGoods];
+ }
return {
- discountPrice,
+ discountPrice:discountPrice<=0?0:discountPrice,
hasDiscountGoodsArr
};
}
@@ -453,38 +462,40 @@ function returnCouponBuyOneGiveOneDiscount(canDikouGoodsArr, coupon, user,shopIn
* @param user 用户信息
* @param shopInfo 店铺信息
*/
-function returnSecoendDiscount(canDikouGoodsArr, coupon, user,shopInfo) {
+function returnSecoendDiscount(canDikouGoodsArr, coupon, user, shopInfo) {
const {
useFoods,
useRule
} = coupon;
//抵扣商品
let discountGoods = undefined;
- //符合买一送一条件的商品
+ //符合条件的商品
const canUseGoods = canDikouGoodsArr.filter((v) => v.num >= 2);
//抵扣全部商品
if (useFoods.length === 0) {
if (useRule == "price_asc") {
- discountGoods = canUseGoods[canUseGoods.length - 1];
+ discountGoods = canUseGoods[canUseGoods.length - 1]
} else {
- discountGoods = canUseGoods.slice(0, 1);
+ discountGoods = canUseGoods[0]
}
} else {
//符合抵扣条件的商品
const canUseGoods1 = canUseGoods.filter((v) => useFoods.find((food) => food.id == v.productId));
if (useRule == "price_asc") {
- discountGoods = canUseGoods1[canUseGoods1.length - 1];
+ discountGoods = canUseGoods1[canUseGoods1.length - 1]
} else {
- discountGoods = canUseGoods1.slice(0, 1);
+ discountGoods = canUseGoods1[0]
}
}
- console.log('returnSecoendDiscount:discountGoods',discountGoods);
- const discountPrice = returnGoodsPrice(discountGoods[0], user,shopInfo);
- console.log('returnSecoendDiscount:discountPrice',discountPrice);
- const hasDiscountGoodsArr = [discountGoods];
+ let discountPrice = 0;
+ let hasDiscountGoodsArr = []
+ if (discountGoods) {
+ discountPrice = returnGoodsPrice(discountGoods, user, shopInfo);
+ hasDiscountGoodsArr = [discountGoods];
+ }
//返回半价价格
return {
- discountPrice: new BigNumber(discountPrice).dividedBy(2).toNumber(),
+ discountPrice: discountPrice <= 0 ? 0 : new BigNumber(discountPrice).dividedBy(2).toNumber(),
hasDiscountGoodsArr,
};
}