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, }; }