Ver código fonte

feat(member): 优化会员相关功能及赠品订单展示

- 在购物车和分类页价格显示中,新增会员激活状态区分,显示会员价及原价
- 赠品订单确认页面根据是否为赠品订单分别更新商品列表和配送信息
- 赠品订单确认页新增会员权益和赠品价格展示样式
- 优化订单详情页,调整退款、优惠券、积分显示逻辑,区分赠品订单显示
- 会员优惠券页面支持路由类型参数,VIP路由跳转逻辑调整
- 会员中心新增领取赠品逻辑,防止重复领取并提示
- 订单列表页售后申请禁止赠品订单操作
- 修正赠品订单状态显示为“待自提”与“待配送”区分
- 调整部分样式及增加控制台日志便于调试会员状态变化
zouzexu 2 dias atrás
pai
commit
7573c0d9d3

+ 1 - 1
src/pages/cart/index.vue

@@ -189,7 +189,7 @@ async function handleSelectAddress() {
                 ¥ {{ totalProduct?.amount || 0 }}
               </view>
               <view v-if="totalProduct?.coupon" class="ml-10rpx text-24rpx text-[#FF4A39]">
-                共减¥{{ totalProduct?.coupon }}
+                共减¥{{ totalProduct?.coupon + (totalProduct?.memberDiscountAmount || 0) }}
               </view>
               <view v-if="totalProduct?.amount" class="ml10rpx flex items-center text-24rpx text-gray" @click="priceDetailPopup = !priceDetailPopup">
                 明细 <view class="flex items-center" :class="[priceDetailPopup ? 'rotate-180' : '']">

+ 3 - 0
src/store/user.ts

@@ -290,10 +290,13 @@ export const useUserStore = defineStore('user', {
         */
 
     clearCart(skuList: Api.CartSkuVo[]) {
+      console.log('进入清空购物车')
       uni.showLoading({ mask: true })
       return new Promise((resolve) => {
         const skuids = skuList.map(item => item.id).join(',')
+        console.log(skuids, '执行前')
         if (skuids.length) {
+          console.log(skuids, '执行中')
           Apis.common.deleteShoppingCart({
             pathParams: {
               ids: skuids,

+ 2 - 2
src/subPack-charge/chargeOrderDetail/chargeOrderDetail.vue

@@ -169,7 +169,7 @@ async function getOrderDetail() {
             {{ chargeOrderDetail?.memberDiscountDesc }}
           </view>
           <view class="text-24rpx text-#F44033">
-            {{ chargeOrderDetail?.memberDiscountAmount || '--' }}元
+            - {{ chargeOrderDetail?.memberDiscountAmount || '--' }}元
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">
@@ -177,7 +177,7 @@ async function getOrderDetail() {
             积分扣减
           </view>
           <view class="text-24rpx text-#F44033">
-            {{ chargeOrderDetail ? (chargeOrderDetail.actualTotal || 0) - (chargeOrderDetail.platformVolume || 0) : '--' }}元
+            - {{ chargeOrderDetail ? (chargeOrderDetail.actualTotal || 0) - (chargeOrderDetail.platformVolume || 0) : '--' }}元
           </view>
         </view>
         <view class="mt-28rpx flex items-center justify-between">

+ 1 - 1
src/subPack-smqjh/giveawaysVip/giveawaysVip.vue

@@ -106,7 +106,7 @@ async function pickUp() {
     <view class="h-20rpx" />
     <view v-for="item in giveawaysList" :key="item.channelId" class="mb-20rpx flex items-center gap-20rpx rounded-16rpx bg-#FFF p-24rpx">
       <view class="w-32rpx">
-        <wd-icon name="check-circle-filled" size="20px" color="#9ED605" />
+        <wd-icon name="check-circle-filled" size="20px" color="var(--them-color)" />
       </view>
       <view class="flex items-center gap-20rpx">
         <image

+ 33 - 14
src/subPack-smqjh/userVip/userVip.vue

@@ -14,11 +14,19 @@ definePage({
 })
 const { userMemberInfo } = storeToRefs(useUserStore())
 const rightsInfo = ref()
+const showRightsContent = computed(() => userMemberInfo.value.active || userMemberInfo.value.memberStatus === 'EXPIRED')
+const isMemberExpired = computed(() => userMemberInfo.value.memberStatus === 'EXPIRED')
 onMounted(() => {
   useUserStore().getUserInfo()
   opcity.value = 0
-  rightsInfo.value = JSON.parse(userMemberInfo.value.benefitConfigJson || '')
-  console.log(JSON.parse(userMemberInfo.value.benefitConfigJson || ''), '解析出的json')
+  try {
+    rightsInfo.value = userMemberInfo.value.benefitConfigJson
+      ? JSON.parse(userMemberInfo.value.benefitConfigJson)
+      : null
+  }
+  catch {
+    rightsInfo.value = null
+  }
 })
 
 onPageScroll((e) => {
@@ -27,11 +35,15 @@ onPageScroll((e) => {
 })
 
 function toUse() {
+  if (isMemberExpired.value)
+    return
   wx.openOfficialAccountArticle({
     url: 'https://mp.weixin.qq.com/s/lxpdZ6DUhgqg00AT9klu5Q',
   })
 }
 function toShoppingList() {
+  if (isMemberExpired.value)
+    return
   if (!userMemberInfo?.value.giftReceived) {
     router.push({ name: 'smqjh-giveaways-vip' })
   }
@@ -39,16 +51,23 @@ function toShoppingList() {
     useGlobalToast().show({ msg: '您已经领取过咯~~' })
   }
 }
+function handleRightsClick(callback: () => void) {
+  if (isMemberExpired.value) {
+    useGlobalToast().show({ msg: '会员已失效,请重新开通' })
+    return
+  }
+  callback()
+}
 </script>
 
 <template>
-  <view class="min-h-screen" :class="userMemberInfo.active ? 'bg-[linear-gradient(225deg,#13141D_0%,#55565D_34.72%,#15161F_100%)]' : ''">
+  <view class="min-h-screen" :class="showRightsContent ? 'bg-[linear-gradient(225deg,#13141D_0%,#55565D_34.72%,#15161F_100%)]' : ''">
     <wd-navbar
       title="会员中心" :custom-style="`background-color: rgba(226, 255, 145, ${opcity});color: ${opcity > 0.5 ? '#000' : '#FFF'};`"
       :bordered="false" :z-index="999" safe-area-inset-top left-arrow fixed @click-left="router.back()"
     />
     <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
-    <view v-if="userMemberInfo.active" class="px24rpx">
+    <view v-if="showRightsContent" class="px24rpx">
       <view class="mt-54rpx">
         <image :src="`${StaticUrl}/vip-welcome.png`" class="h-46rpx w-339rpx" />
         <view class="mt-36rpx text-28rpx text-#b5b5b5">
@@ -112,7 +131,7 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 每升立减{{ rightsInfo?.oilPerLiterDiscount }}元
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="toUse">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="toUse">
                 去使用
               </view>
             </view>
@@ -128,7 +147,7 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 折扣率{{ rightsInfo?.mallDiscountRate }}折
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="router.push({ name: 'xsb-homeTabbar' })">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="handleRightsClick(() => router.push({ name: 'xsb-homeTabbar' }))">
                 去使用
               </view>
             </view>
@@ -144,7 +163,7 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 每度电立减{{ rightsInfo?.chargePerKwhDiscount }}元
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="router.push({ name: 'charge-index' })">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="handleRightsClick(() => router.push({ name: 'charge-index' }))">
                 去使用
               </view>
             </view>
@@ -160,14 +179,14 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 折扣率{{ rightsInfo?.parkingDiscountRate }}折
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="router.push({ name: rightsInfo?.parkingRoutePath })">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="handleRightsClick(() => router.push({ name: rightsInfo?.parkingRoutePath }))">
                 去使用
               </view>
             </view>
             <image :src="rightsInfo?.parkingIcon" class="h-80rpx w-80rpx" />
           </view>
         </view>
-        <view v-if="userMemberInfo?.couponConfig.length > 0" class="w-304rpx border-[1rpx_solid_#F4E5BD] rounded-32rpx bg-[rgba(255,255,255,0.3)] p-20rpx">
+        <view v-if="userMemberInfo?.couponConfig?.length > 0" class="w-304rpx border-[1rpx_solid_#F4E5BD] rounded-32rpx bg-[rgba(255,255,255,0.3)] p-20rpx">
           <view class="text-28rpx text-#FEE3AD font-bold">
             优惠券
           </view>
@@ -176,14 +195,14 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 优惠券{{ userMemberInfo?.couponCount }}张
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="router.push({ name: 'xsb-coupon', params: { type: 'VIP' } })">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="handleRightsClick(() => router.push({ name: 'xsb-coupon', params: { type: 'VIP' } }))">
                 去查看
               </view>
             </view>
-            <image :src="userMemberInfo?.couponConfig[0].icon" class="h-80rpx w-80rpx" />
+            <image :src="userMemberInfo?.couponConfig?.[0]?.icon" class="h-80rpx w-80rpx" />
           </view>
         </view>
-        <view v-if="userMemberInfo?.giftConfig.length > 0" class="w-304rpx border-[1rpx_solid_#F4E5BD] rounded-32rpx bg-[rgba(255,255,255,0.3)] p-20rpx">
+        <view v-if="userMemberInfo?.giftConfig?.length > 0" class="w-304rpx border-[1rpx_solid_#F4E5BD] rounded-32rpx bg-[rgba(255,255,255,0.3)] p-20rpx">
           <view class="text-28rpx text-#FEE3AD font-bold">
             自选赠品
           </view>
@@ -192,11 +211,11 @@ function toShoppingList() {
               <view class="text-28rpx text-#b5b5b5">
                 自选赠品{{ userMemberInfo?.giftCount }}个
               </view>
-              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx bg-#F4E5BD text-center text-24rpx text-#7F5935 line-height-42rpx" @click="toShoppingList">
+              <view class="mt-16rpx h-42rpx w-108rpx rounded-22rpx text-center text-24rpx text-#7F5935 line-height-42rpx" :class="isMemberExpired ? 'bg-#999 text-#ccc' : 'bg-#F4E5BD'" @click="toShoppingList">
                 {{ userMemberInfo?.giftReceived ? '已领取' : '待领取' }}
               </view>
             </view>
-            <image :src="userMemberInfo?.giftConfig[0].icon" class="h-80rpx w-80rpx" />
+            <image :src="userMemberInfo?.giftConfig?.[0]?.icon" class="h-80rpx w-80rpx" />
           </view>
         </view>
       </view>

+ 1 - 1
src/subPack-xsb/commonTab/components/cart.vue

@@ -157,7 +157,7 @@ onMounted(async () => {
                 ¥ {{ totalProduct?.amount || 0 }}
               </view>
               <view v-if="totalProduct?.coupon" class="ml10rpx text-24rpx text-#FF4A39">
-                共减¥{{ totalProduct?.coupon }}
+                共减¥{{ totalProduct?.coupon + (totalProduct?.memberDiscountAmount || 0) }}
               </view>
               <view v-if="totalProduct?.amount" class="ml10rpx flex items-center text-24rpx text-gray" @click="priceDetailPopup = !priceDetailPopup">
                 明细 <view class="flex items-center" :class="[priceDetailPopup ? 'rotate-180' : '']">

+ 1 - 1
src/subPack-xsb/commonTab/components/classfiy.vue

@@ -676,7 +676,7 @@ export default {
                 ¥ {{ totalProduct?.amount || 0 }}
               </view>
               <view v-if="totalProduct?.coupon" class="ml10rpx text-24rpx text-#FF4A39">
-                共减¥{{ totalProduct?.coupon }}
+                共减¥{{ totalProduct?.coupon + (totalProduct?.memberDiscountAmount || 0) }}
               </view>
               <view
                 v-if="totalProduct?.amount" class="ml10rpx flex items-center text-24rpx text-gray"

+ 14 - 4
src/subPack-xsb/confirmOrder/index.vue

@@ -62,9 +62,15 @@ const currentCouponDiscount = computed(() => {
   }
   return Number(orderInfo.value?.coupon || 0)
 })
+const memberDiscountCents = computed(() => {
+  if (!isMemberGiftOrder.value && userMemberInfo.value?.active) {
+    return Math.round(Number(unref(orderInfo)?.memberDiscountAmount || 0) * 100)
+  }
+  return 0
+})
 const offsetPoints = computed(() => {
   const couponCents = Math.round(currentCouponDiscount.value * 100)
-  const money = Math.round(Number(unref(orderInfo)?.transfee) * 100) + Math.round(Number(unref(orderInfo)?.price) * 100) - couponCents
+  const money = Math.round(Number(unref(orderInfo)?.transfee) * 100) + Math.round(Number(unref(orderInfo)?.price) * 100) - couponCents - memberDiscountCents.value
   const cap = Math.max(0, money)
   if (Number(unref(orderInfo)?.offsetPoints) > cap) {
     return cap
@@ -87,9 +93,10 @@ const displayTotalPrice = computed(() => {
   const goodsPrice = Number(orderInfo.value.price || 0)
   const freight = Number(orderInfo.value.transfee || 0)
   const pointsDiscount = offsetPoints.value / 100
-  return Math.max(0, Number((goodsPrice + freight - currentCouponDiscount.value - pointsDiscount).toFixed(2)))
+  const memberDiscount = memberDiscountCents.value / 100
+  return Math.max(0, Number((goodsPrice + freight - currentCouponDiscount.value - pointsDiscount - memberDiscount).toFixed(2)))
 })
-const displayDiscountTotal = computed(() => Number((currentCouponDiscount.value + offsetPoints.value / 100).toFixed(2)))
+const displayDiscountTotal = computed(() => Number((currentCouponDiscount.value + offsetPoints.value / 100 + memberDiscountCents.value / 100).toFixed(2)))
 const giftOriginalTotal = computed(() => {
   if (!isMemberGiftOrder.value)
     return 0
@@ -166,8 +173,9 @@ async function getConfirmOrder() {
     } as ConfirmOrderInfo
   }
   else {
+    const originalSku = orderInfo.value?.skuList?.[0]
     const skuList = res.data.sku
-      ? [{ ...res.data.sku, num: params.num, shopId: params.shopId }]
+      ? [{ ...res.data.sku, id: originalSku?.id, num: params.num, shopId: params.shopId }]
       : (orderInfo.value?.skuList || [])
     orderInfo.value = {
       ...orderInfo.value,
@@ -226,6 +234,7 @@ async function handlePay() {
   isPay.value = true
   try {
     if (isMemberGiftOrder.value) {
+      console.log('=====赠品订单')
       if (!selectedAddress.value) {
         useGlobalToast().show({ msg: '请选择收货地址' })
         return
@@ -262,6 +271,7 @@ async function handlePay() {
         : undefined,
     )
     const res = await useUserStore().handleCommonPayMent(orderNumber)
+    console.log(orderInfo.value, '=====订单信息')
     await useUserStore().clearCart(orderInfo.value.skuList)
     totalProduct.value = null
     if (res.payType !== 1) {

+ 5 - 3
src/subPack-xsb/orderDetaile/index.vue

@@ -39,7 +39,6 @@ const mapTextShop = {
   [OrderStatus.OrderDelivering]: orderInfo.value?.dvyType === 3 ? '骑手配送中' : '待收货',
   [OrderStatus.OrderArrived]: '已送达',
 }
-const { userMemberInfo } = storeToRefs(useUserStore())
 const mapLation = computed(() => {
   const lation = {
     latitude: mapInfo.value?.shopLatitude,
@@ -474,6 +473,9 @@ function handleRefundDetail(item: any) {
             <view class="flex-1">
               <view class="w-full flex items-center justify-between font-semibold">
                 <view class="text-28rpx">
+                  <text v-if="orderInfo?.giftOrder" class="mr-8rpx rounded-8rpx bg-#FF4D3A px-12rpx py-4rpx text-22rpx text-#FFF">
+                    赠品
+                  </text>
                   {{ item.skuName }}
                 </view>
                 <view class="text-32rpx text-[#FF4D3A]">
@@ -511,9 +513,9 @@ function handleRefundDetail(item: any) {
           </view>
         </view>
         <template v-if="!orderInfo?.giftOrder">
-          <view v-if="orderInfo?.giftOrder" class="mt-24rpx flex items-center justify-between">
+          <view v-if="orderInfo?.memberDiscountDesc && orderInfo?.memberDiscountAmount" class="mt-24rpx flex items-center justify-between">
             <view class="text-28rpx">
-              会员权益({{ userMemberInfo?.benefitConfig.mallDiscountRate || '-' }}折)
+              {{ orderInfo?.memberDiscountDesc || '-' }}
             </view>
             <view class="text-[#FF4A39] font-semibold">
               -¥{{ orderInfo?.memberDiscountAmount }}