Explorar o código

feat: 添加获取本年目标接口,更新用户状态逻辑,优化个人主页展示

EvilDragon hai 3 meses
pai
achega
95c275e1b0

+ 1 - 0
packages/merchant/src/core/libs/net-images.ts

@@ -12,4 +12,5 @@ export enum NetImages {
   Stars = 'https://image.zhuchaohui.com/zhucaohui/dc15a86a2034ddc17e2825b56319902af1635c20e065919750ebbe51ee95f635.png',
   HonorsHeader = 'https://image.zhuchaohui.com/zhucaohui/3945d2a7643317aca126c4b766139c4560c6ce2c051b7e03ee0ac664abe966c3.png',
   CyclingRankingsHeaderBg = 'https://image.zhuchaohui.com/zhucaohui/2351014a57a0df427516c4993876ade7e3695ce33b1f227c52c8381aa631ba02.png',
+  AgentMineHeaderBg = 'https://image.zhuchaohui.com/zhucaohui/41b23de6a07428168216ecd366548711dd299cf23f9d5244492777bdd007c576.png',
 }

+ 18 - 0
packages/merchant/src/core/libs/requests.ts

@@ -3,6 +3,7 @@ import { Schedule } from '../models/schedule'
 import { Moment } from '../models/moment'
 import dayjs from 'dayjs'
 import { PointsOrder, ResPageData, Todo } from '@designer-hub/app/src/core/libs/models'
+import { get } from 'radash'
 
 export const getUserInfo = () =>
   httpGetMock<any>({
@@ -352,6 +353,23 @@ export const getDeignerPointsActivities = (query) =>
       createTime: number
     }>
   >('/app-api/member/points-order/getPointsDynamics', query)
+/**
+ * 渠道端-获取本年目标
+ */
+export const getYearTarget = (query?: { brokerId?: string }) =>
+  httpPost<
+    {
+      id: any
+      brokerId: any
+      type: number
+      typeName: string
+      year: any
+      target: any
+      thisYearComplete?: number
+      thisMonthComplete?: number
+      remark: any
+    }[]
+  >('/app-api/member/app-broker/statisticsThisYearTask')
 export const httpGetMock = <T>(data: T) =>
   new Promise<IResData<T>>((resolve) => resolve({ code: 1, msg: '', data } as IResData<T>))
 export interface Circle {

+ 4 - 3
packages/merchant/src/layouts/tabbar.vue

@@ -2,7 +2,8 @@
 import TabbarEvo from '@/components/tabbar-evo.vue'
 import { currRoute } from '../utils'
 import { defaultThemeVars } from '../core/themes/default'
-import DataForm from '@designer-hub/app/src/components/data-form.vue'
+// import DataForm from '@designer-hub/app/src/components/data-form.vue'
+import DataForm from '@/components/data-form.vue'
 import { useUserStore } from '../store'
 import { storeToRefs } from 'pinia'
 import {
@@ -14,10 +15,10 @@ import {
 } from '@designer-hub/assets/src/assets/svgs'
 
 const userStore = useUserStore()
-const { userInfo, isChannel, isMerchant } = storeToRefs(userStore)
+const { userInfo, isAgent, isMerchant } = storeToRefs(userStore)
 const publishState = ref(false)
 const items = computed(() => {
-  if (isChannel?.value) {
+  if (isAgent.value) {
     return [
       {
         title: '首页',

+ 27 - 25
packages/merchant/src/pages/mine/index.vue

@@ -4,8 +4,8 @@
 
 <script setup lang="ts">
 import { onMounted, ref } from 'vue'
-import { getOrders, getVendorAppInfo } from '../../core/libs/requests'
-import { useUserStore } from '../../store'
+import { getOrders, getVendorAppInfo, getYearTarget } from '../../core/libs/requests'
+
 import { storeToRefs } from 'pinia'
 import { isEmpty } from 'radash'
 import Card from '@designer-hub/app/src/components/card.vue'
@@ -13,18 +13,18 @@ import SectionHeading from '@designer-hub/app/src/components/section-heading.vue
 import { merchantPageHeaderBg, desinTopBg } from '@designer-hub/assets/src/svgs'
 import NavBarEvo from '@designer-hub/app/src/components/navbar-evo.vue'
 import dayjs from 'dayjs'
-import { useRouter } from '@designer-hub/app/src/core/utils/router'
 import PageHelper from '../../components/page-helper.vue'
+import { NetImages } from '../../core/libs/net-images'
+import { useUserStore } from '../../store'
 
-const router = useRouter()
 const userStore = useUserStore()
-
-const { isLogined, userInfo } = storeToRefs(userStore)
+const { isLogined, userInfo, isMerchant, isAgent } = storeToRefs(userStore)
 const avatar = computed(() =>
   !isEmpty(userInfo.value.avatar) ? userInfo.value.avatar : 'https://via.placeholder.com/72x72',
 )
 const { data, run: setData } = useRequest(() => getVendorAppInfo())
 const { data: orders, run: setOrders } = useRequest(() => getOrders())
+const { data: yearTarget, run: setYearTarget } = useRequest(() => getYearTarget())
 const nickNameClickHandle = async () => {
   if (isLogined.value) return
 
@@ -35,10 +35,15 @@ const toInfoSeting = () => {
   uni.navigateTo({ url: '/pages/mine/merchant/merchant_settings' })
 }
 onShow(async () => {
-  if (isLogined.value) {
+  if (isLogined.value && isMerchant?.value) {
     await setData()
     await setOrders()
   }
+
+  if (isLogined.value && isAgent?.value) {
+    // await setData()
+    await Promise.all([setYearTarget()])
+  }
 })
 onMounted(async () => {
   // await run()
@@ -55,12 +60,12 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
 <template>
   <view>
     <NavBarEvo title="我的" transparent dark placeholder></NavBarEvo>
-    <template v-if="userInfo.appLoginType === 1">
+    <template v-if="isAgent">
       <div class="aspect-[0.96/1] absolute left-0 right-0 top--1">
         <wd-img
           width="100%"
           height="100%"
-          :src="merchantPageHeaderBg"
+          :src="NetImages.AgentMineHeaderBg"
           custom-class="vertical-bottom"
         ></wd-img>
       </div>
@@ -80,7 +85,8 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
           />
           <div class="mx-4 flex-1">
             <div class="text-white text-lg font-normal font-['PingFang_SC'] leading-normal">
-              李晓东
+              <!-- 李晓东 -->
+              {{ userInfo.nickname }}
             </div>
             <div class="text-white text-xs font-normal font-['PingFang_SC'] leading-relaxed">
               ID:1023621
@@ -96,15 +102,7 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
         <Card>
           <SectionHeading title="本年目标" size="base"></SectionHeading>
           <div class="flex flex-col gap-2.5 mt-3">
-            <template
-              v-for="{ name } of [
-                { name: 'Imola订单金额目标' },
-                { name: '平台订单金额目标' },
-                { name: '拜访次数' },
-                { name: '到店次数' },
-              ]"
-              :key="name"
-            >
+            <template v-for="(it, i) in yearTarget" :key="i">
               <div
                 class="bg-gradient-to-r from-[#fef3ee] to-[#f0f4f9] rounded-lg flex items-center p-4 gap-6"
               >
@@ -115,18 +113,20 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
                 </div>
                 <div class="flex-1">
                   <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">
-                    {{ name }}
+                    {{ it.typeName }}
                   </div>
                   <div class="flex items-center gap-1">
                     <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
-                      6000
+                      <!-- 6000 -->
+                      {{ it.target / 10000 }}
                     </div>
                     <div class="text-black text-xs font-normal font-['PingFang_SC']">万</div>
                   </div>
                   <div class="flex items-center gap-1">
                     <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">差值</div>
                     <div class="text-[#ff2d2d] text-xs font-medium font-['DIN'] leading-normal">
-                      3000
+                      <!-- 3000 -->
+                      {{ (it.target - it.thisYearComplete) / 10000 }}
                     </div>
                     <div class="text-[#ff2d2d] text-[10px] font-medium font-['DIN'] leading-normal">
@@ -137,14 +137,16 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
                   <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">当年完成</div>
                   <div class="flex items-center gap-1">
                     <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
-                      6000
+                      <!-- 6000 -->
+                      {{ it.thisYearComplete / 10000 }}
                     </div>
                     <div class="text-black text-xs font-normal font-['PingFang_SC']">万</div>
                   </div>
                   <div class="flex items-center gap-1">
                     <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">本月</div>
                     <div class="text-[#0FC187] text-xs font-medium font-['DIN'] leading-normal">
-                      3000
+                      <!-- 3000 -->
+                      {{ it.thisMonthComplete / 10000 }}
                     </div>
                     <div class="text-[#0FC187] text-[10px] font-medium font-['DIN'] leading-normal">
@@ -220,7 +222,7 @@ onPageScroll(({ scrollTop }: { scrollTop: number }) => {
         </Card>
       </div>
     </template>
-    <template v-if="userInfo.appLoginType === 2">
+    <template v-if="isMerchant">
       <view class="p-[16px]">
         <div class="aspect-[1.575/1] absolute left-0 right-0 top-0">
           <wd-img width="100%" height="100%" :src="desinTopBg" custom-class="vertical-top"></wd-img>

+ 3 - 4
packages/merchant/src/store/user.ts

@@ -1,5 +1,4 @@
 import { defineStore } from 'pinia'
-import { ref } from 'vue'
 
 const initState = { nickname: '', avatar: '' }
 
@@ -20,15 +19,15 @@ export const useUserStore = defineStore(
       userInfo.value = { ...initState }
     }
     const isLogined = computed(() => !!userInfo.value.accessToken)
-    const isChannel = computed(() => userInfo.value?.appLoginType === 1)
-    const isMerchant = computed(() => userInfo.value?.appLoginType === 2)
+    const isMerchant = computed(() => userInfo.value.appLoginType === 4)
+    const isAgent = computed(() => userInfo.value.appLoginType === 3)
     return {
       userInfo,
       setUserInfo,
       clearUserInfo,
       isLogined,
-      isChannel,
       isMerchant,
+      isAgent,
       reset,
     }
   },

+ 2 - 2
packages/merchant/src/typings.ts

@@ -33,8 +33,8 @@ type IUserInfo = {
 }
 
 enum AppLoginType {
-  channel = 1,
-  merchant = 2,
+  merchant = 4,
+  agent = 3,
 }
 enum TestEnum {
   A = 'a',