Prechádzať zdrojové kódy

```
feat(api): 新增会员积分领取相关接口定义

新增 MemberPointsClaimVO 接口类型定义,包含渠道ID、渠道名称、
是否已领取、可领取积分等字段

添加 selectZhUser 和 zhUserReceived 两个API接口定义,
用于查询和领取用户积分

更新全局类型声明,添加对应的API方法类型支持

feat(video-rights): 视频权益页面登录验证增强

将视频权益详情页、订单确认页、提交订单页的登录验证设为必需,
确保用户登录后才能访问相关功能

refactor(index): 首页集成积分领取弹窗功能

在首页onShow生命周期中调用积分领取查询接口,
当满足条件时显示积分领取弹窗

添加积分领取相关的业务逻辑函数和UI组件,
实现用户积分自动检测和手动领取功能

fix(after-sales): 售后页面商品数量显示修复

修正售后页面商品数量计算逻辑,使用prodCount字段替代固定值1

refactor(video-rights): 视频权益列表滚动加载优化

使用onReachBottom替代自定义滚动事件处理,
优化列表滚动到底部的加载逻辑

调整状态提示组件位置,提升用户体验
```

zouzexu 1 deň pred
rodič
commit
850c85538a

+ 20 - 0
src/api/api.type.d.ts

@@ -53,6 +53,26 @@ namespace Api {
     [property: string]: any
   }
 
+  interface MemberPointsClaimVO {
+    /**
+     * 所属顶级企业ID
+     */
+    channelId?: number
+    /**
+     * 所属顶级企业名称
+     */
+    channelName?: string
+    /**
+     * 是否领取(true:已领取,false:未领取)
+     */
+    isClaimed?: boolean
+    /**
+     * 可领取积分
+     */
+    points?: number
+    [property: string]: any
+  }
+
   interface xsbCategoriesChildren {
     id: number
     name: string

+ 3 - 0
src/api/apiDefinitions.ts

@@ -34,6 +34,9 @@ export default {
   'sys.addressesDetail': ['GET', '/smqjh-system/app-api/v1/addresses/{addressId}'],
   'sys.uploadFile': ['POST', '/smqjh-system/api/v1/files'],
   'sys.updateUserInfo': ['PUT', '/smqjh-system/app-api/v1/members/{memberId}'],
+  'sys.selectZhUser': ['GET', '/smqjh-system/app-api/v1/claim/select'],
+  'sys.zhUserReceived': ['POST', '/smqjh-system/app-api/v1/claim/received'],
+
   'xsb.categories':['GET', '/smqjh-pms/app-api/v1/categories'],
   'xsb.getCategoryProductList':['POST', '/smqjh-pms/app-api/v1/spu/getCategoryProductList'],
   'xsb.getProductDetail':['GET', '/smqjh-pms/app-api/v1/spu/getProductDetails'],

+ 13 - 0
src/api/globals.d.ts

@@ -181,6 +181,19 @@ declare global {
       >(
         config: Config
       ): Alova2Method<apiResData<Api.addressList>, 'sys.addressesDetail', Config>;
+
+      selectZhUser<
+        Config extends Alova2MethodConfig<apiResData<Api.MemberPointsClaimVO>> & {}
+      >(
+        config: Config
+      ): Alova2Method<apiResData<Api.MemberPointsClaimVO>, 'sys.selectZhUser', Config>;
+
+      zhUserReceived<
+        Config extends Alova2MethodConfig<apiResData<any>> & {}
+      >(
+        config: Config
+      ): Alova2Method<apiResData<any>, 'sys.zhUserReceived', Config>;
+
       dictPage<
         Config extends Alova2MethodConfig<listData<Api.sysDict>> & {
           data: {

+ 3 - 3
src/pages.json

@@ -488,7 +488,7 @@
         {
           "path": "videoRightsDetail/videoRightsDetail",
           "name": "video-rights-detail",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "详情"
           }
@@ -496,7 +496,7 @@
         {
           "path": "videoRightsOrderInfo/videoRightsOrderInfo",
           "name": "video-rights-order-info",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "订单确认"
           }
@@ -504,7 +504,7 @@
         {
           "path": "videoRightsSubmitOrder/videoRightsSubmitOrder",
           "name": "video-rights-submit-order",
-          "islogin": false,
+          "islogin": true,
           "style": {
             "navigationBarTitleText": "订单确认"
           }

+ 33 - 2
src/pages/index/index.vue

@@ -34,11 +34,10 @@ const state = computed(() => {
   return error.value ? 'error' : !isLastPage.value ? 'loading' : 'finished'
 })
 const loading = ref(true)
-
 onShow(async () => {
   useSysStore().getAudit()
   useSmqjhCartStore().getCartList('XSB')
-
+  getSelectZhUser()
   xsbStore.value = await AsyncImport('@/subPack-xsb/store-xsb/sys')
   refresh()
 })
@@ -87,6 +86,21 @@ onShareAppMessage(() => {
     title: '市民请集合',
   }
 })
+const showoverlay = ref(false)
+async function getSelectZhUser() {
+  const res = await Apis.sys.selectZhUser({})
+  if (res.data.channelId === 51 && !res.data.isClaimed) { // 51测试id,上线需修改
+    showoverlay.value = true
+  }
+}
+
+async function getZhUserReceived() {
+  useGlobalLoading().loading({ msg: '领取中...' })
+  await Apis.sys.zhUserReceived({})
+  useGlobalLoading().close()
+  show({ msg: '领取成功 !' })
+}
+
 function handleGo() {
   show({ msg: '敬请期待 !' })
 }
@@ -244,6 +258,23 @@ function handleGo() {
           </view>
         </wd-skeleton>
         <wd-loadmore :state="state" :loading-props="{ color: '#9ED605', size: 20 }" @reload="reload" />
+        <wd-overlay :show="showoverlay" @click="showoverlay = false">
+          <view class="mt-280rpx flex items-center justify-center">
+            <view class="relative h-906rpx w-644rpx flex flex-col justify-center text-center" :style="{ backgroundImage: `url(${StaticUrl}/home-overlay-img.png)`, backgroundSize: 'cover', backgroundPosition: 'center' }">
+              <view>
+                <view class="text-80rpx text-#FF1B51 font-600">
+                  ¥200
+                </view>
+                <view class="text-28rpx font-800">
+                  现金抵扣券
+                </view>
+              </view>
+              <view class="absolute bottom-110rpx left-42% text-60rpx text-#FF1B51 font-bold" @click="getZhUserReceived">
+                领
+              </view>
+            </view>
+          </view>
+        </wd-overlay>
       </view>
     </view>
   </view>

+ 1 - 1
src/subPack-common/afterSales/index.vue

@@ -29,7 +29,7 @@ const remark = ref('')
 onLoad((options: any) => {
   orderList.value = JSON.parse(options.order)
   orderList.value = orderList.value.map((item: Api.xsbOmsOrderItem) => {
-    item.num = 1
+    item.num = item.prodCount as number
     return item
   })
 })

+ 4 - 5
src/subPack-videoRights/commonTab/components/home.vue

@@ -22,12 +22,11 @@ const { data: videoDataList, isLastPage, page, refresh } = usePagination((pageNu
 onShow(() => {
   refresh()
 })
-function scrolltolowerBootom() {
+onReachBottom(() => {
   if (!isLastPage.value) {
     page.value++
-    refresh()
   }
-}
+})
 </script>
 
 <template>
@@ -38,7 +37,7 @@ function scrolltolowerBootom() {
     />
     <view :style="{ paddingTop: `${(Number(statusBarHeight) || 44) + MenuButtonHeight + 12}px` }" />
     <view class="box-border px24rpx">
-      <scroll-view scroll-y type="custom" @scrolltolower="scrolltolowerBootom">
+      <scroll-view scroll-y type="custom">
         <grid-view type="masonry" cross-axis-count="2" main-axis-gap="10" cross-axis-gap="10">
           <view v-for="item in videoDataList" :key="item.id" class="mt-18rpx rounded-16rpx bg-#FFF" @click="router.push({ name: 'video-rights-detail', params: { id: item.id } })">
             <view>
@@ -66,8 +65,8 @@ function scrolltolowerBootom() {
               </view>
             </view>
           </view>
-          <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
         </grid-view>
+        <StatusTip v-if="!videoDataList.length" tip="暂无内容" />
       </scroll-view>
     </view>
   </view>

+ 1 - 1
src/subPack-videoRights/videoRightsDetail/videoRightsDetail.vue

@@ -4,7 +4,7 @@ import router from '@/router'
 
 definePage({
   name: 'video-rights-detail',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '详情',
   },

+ 1 - 1
src/subPack-videoRights/videoRightsOrderInfo/videoRightsOrderInfo.vue

@@ -5,7 +5,7 @@ import router from '@/router'
 
 definePage({
   name: 'video-rights-order-info',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '订单确认',
   },

+ 1 - 1
src/subPack-videoRights/videoRightsSubmitOrder/videoRightsSubmitOrder.vue

@@ -4,7 +4,7 @@ import router from '@/router'
 
 definePage({
   name: 'video-rights-submit-order',
-  islogin: false,
+  islogin: true,
   style: {
     navigationBarTitleText: '订单确认',
   },