123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565 |
- <route lang="yaml">
- style:
- navigationBarTitleText: 设计师详情
- navigationBarBackgroundColor: '#fff'
- navigationStyle: custom
- </route>
- <script setup lang="ts">
- import NavbarEvo from '@/components/navbar-evo.vue'
- import {
- getFollowUpPage,
- getPointsCounts,
- getUserInfoById,
- getPointsOrders,
- getBrowseRecordCount,
- getBrowseRecords,
- getBrowseRecordRemarks,
- } from '@/core/libs/agent-requests'
- import {
- desinTopBg,
- rightArrowIcon,
- vipIcon,
- locationIcon,
- shareIcon,
- praiseIcon,
- messageIcon,
- yinyongIcon,
- } from '@designer-hub/assets/src/svgs'
- import PageHelperEvo from '@/components/page-helper-evo.vue'
- import { dayjs } from 'wot-design-uni'
- import { toHomePage } from '@/core/libs/actions'
- import arcBottomBlue from '@designer-hub/assets/src/libs/assets/arcBottomBlue'
- import link from '@designer-hub/assets/src/libs/assets/link'
- import { useMemberLevelsStore } from '@/store/member-levles'
- import { getDesignerPointsActivities } from '@/core/libs/requests'
- import { useUserStore } from '@/store'
- import { storeToRefs } from 'pinia'
- import Card from '@designer-hub/app/src/components/card.vue'
- import ListHelperEvo from '@/components/list-helper-evo.vue'
- // import { formatDuration } from '@designer-hub/app/src/core/utils/common'
- const userStore = useUserStore()
- const { userInfo } = storeToRefs(userStore)
- const memberLevelsStore = useMemberLevelsStore()
- const { getMemberLevelLogo } = memberLevelsStore
- const id = ref()
- const { data, run: setData } = useRequest(() => getUserInfoById(id.value))
- console.log('getUserInfoById', data)
- const active = ref('integral')
- const tabs = ref([
- { label: '数据动态', value: 'integral' },
- { label: '跟进记录', value: 'followUp' },
- // { label: '圈子动态', value: 'interact' },
- { label: '兑换记录', value: 'product' },
- ])
- const status = ref({ '0': '已报名', '1': '已完成', '2': '未核销', '3': '已取消', '4': '待交付' })
- const followUpQuery = computed(() => ({
- stylistId: id.value,
- }))
- const { data: browseRecordCount, run: setBrowseRecordCount } = useRequest(() =>
- getBrowseRecordCount(id.value),
- )
- console.log('browseRecordCount data', data)
- const browseRecordCountItems = computed(() => [
- {
- title: '打开次数',
- subTitle: '最近',
- value: browseRecordCount.value?.openNumber ?? 0,
- subValue: browseRecordCount.value?.openTime
- ? dayjs(browseRecordCount.value.openTime).format('YY/MM/DD')
- : '暂无',
- },
- {
- title: '浏览时长',
- subTitle: '本年',
- // 浏览时长 小于60秒,显示秒 大于60秒小于1小时,显示分钟 大于1小时小于1天,显示x小时x分钟 大于1天,显示x天x小时x分钟
- value: formatDuration1(browseRecordCount.value?.duration ?? 0),
- subValue: formatDuration1(browseRecordCount.value?.durationYear ?? 0),
- },
- {
- title: '发圈次数',
- subTitle: '本年',
- value: browseRecordCount.value?.circleNumber ?? 0,
- subValue: browseRecordCount.value?.circleNumberYear ?? 0,
- },
- {
- title: '主页分享数',
- subTitle: '本年',
- value: browseRecordCount.value?.homeShareNumber ?? 0,
- subValue: browseRecordCount.value?.homeShareNumberYear ?? 0,
- },
- {
- title: '主页浏览数',
- subTitle: '本年',
- value: browseRecordCount.value?.shareViewNumber ?? 0,
- subValue: browseRecordCount.value?.shareViewNumberYear ?? 0,
- },
- {
- title: '分享获客数',
- subTitle: '本年',
- value: browseRecordCount.value?.customersAcquired ?? 0,
- subValue: browseRecordCount.value?.customersAcquiredYear ?? 0,
- },
- ])
- const recentActivities = computed(() => [
- { label: '最近浏览品牌', value: '' },
- { label: '最近到店品牌', value: '' },
- { label: '最近浏览游学', value: '' },
- { label: '最近浏览活动', value: '' },
- ])
- const pointsActivitiesQuery = computed(() => ({ stylistId: id.value }))
- const toPointsDetails = () => {
- uni.navigateTo({ url: `/pages/agent/designer/points/index?id=${id.value}` })
- }
- const toOrderDetails = (it: any) => {
- uni.navigateTo({ url: `/pages/common/orders/detail/index?id=${it.id}` })
- }
- const toArchives = () => {
- uni.navigateTo({ url: '/pages/agent/designer/archives/index?id=' + id.value })
- }
- const formatDuration = (duration: number) => {
- if (duration < 60) {
- return `${duration}秒`
- } else if (duration < 3600) {
- return `${Math.floor(duration / 60)}分钟`
- } else if (duration < 86400) {
- return `${Math.floor(duration / 3600)}小时${Math.floor((duration % 3600) / 60)}分钟`
- } else {
- return `${Math.floor(duration / 86400)}天${Math.floor((duration % 86400) / 3600)}小时${Math.floor(
- (duration % 3600) / 60,
- )}分钟`
- }
- }
- function formatDuration1(seconds) {
- if (seconds < 60) {
- return `${seconds}秒`;
- } else if (seconds < 3600) {
- const minutes = Math.floor(seconds / 60);
- return `${minutes}分钟`;
- } else if (seconds < 86400) {
- const hours = Math.floor(seconds / 3600);
- return `${hours}小时`;
- } else {
- const days = Math.floor(seconds / 86400);
- return `${days}天`;
- }
- }
- onLoad(async (query) => {
- id.value = query?.id
- await setData()
- await Promise.all([setBrowseRecordCount()])
- console.log(browseRecordCount.value)
- })
- </script>
- <template>
- <view>
- <NavbarEvo placeholder transparent dark></NavbarEvo>
- <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>
- </div>
- <div class="p-4 flex flex-col gap-4 relative">
- <div class="bg-white rounded-2xl shadow flex items-center p-4">
- <div class="relative">
- <wd-img width="64" height="64" round :src="data?.avatar"></wd-img>
- <div v-if="data?.retryStatus === 1" class="absolute right-0 bottom-1">
- <wd-img width="14" height="14" :src="link" round></wd-img>
- </div>
- </div>
- <div class="flex-1 ml-[11px]">
- <div class="flex flex-col w-[100%]">
- <div class="flex-row flex items-center justify-between w-full">
- <div class="flex-row flex items-center">
- <div
- class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[10.18px]"
- >
- <!-- 苏小萌 -->
- {{ data?.name }}
- </div>
- <wd-img
- v-if="data?.levelId"
- width="63"
- height="18.6"
- :src="getMemberLevelLogo(data?.levelId)"
- ></wd-img>
- </div>
- <div
- class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-snug flex items-center"
- @click="toHomePage(id)"
- >
- <div>个人主页</div>
- <wd-img width="13" height="13" :src="rightArrowIcon"></wd-img>
- </div>
- </div>
- </div>
- <div
- class="mt-4 px-1.5 py-1 bg-[#f0f3ff] rounded justify-center items-center gap-px inline-flex"
- @click="toArchives"
- >
- <div class="text-[#2357e9] text-xs font-normal font-['PingFang_SC'] leading-3">
- 个人档案
- </div>
- <wd-icon name="arrow-right" size="13" color="#2357e9"></wd-icon>
- </div>
- </div>
- </div>
- <div>
- <div class="flex items-center justify-around">
- <template v-for="(it, i) in tabs" :key="i">
- <div class="flex flex-col items-center gap-0" @click="active = it.value">
- <div
- class="text-center font-normal font-['PingFang_SC'] visible"
- :class="`${it.value === active ? 'text-black text-lg leading-relaxed ' : 'text-black/60 text-base leading-normal'}`"
- >
- {{ it.label }}
- </div>
- <wd-img
- :style="{ visibility: it.value === active ? 'visible' : 'hidden' }"
- width="17"
- height="5.6"
- :src="arcBottomBlue"
- ></wd-img>
- </div>
- </template>
- </div>
- <view class="content mt-[20px]" v-if="active === 'integral'">
- <Card>
- <div class="flex items-center justify-between">
- <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed">
- 积分动态
- </div>
- <div
- class="text-black/30 text-xs font-normal font-['PingFang_SC'] leading-none"
- @click="toPointsDetails"
- >
- 积分明细
- <wd-icon size="12" name="arrow-right" color="rgba(0,0,0,.3)"></wd-icon>
- </div>
- </div>
- <div class="mt-2 w-full h-.25 bg-[#f9f9f9]"></div>
- <ListHelperEvo
- :request="getPointsCounts"
- :query="{ userId: id }"
- content-class="grid grid-cols-3 gap-7 py-4"
- >
- <template #default="{ item }">
- <div class="rounded-lg aspect-[1/1] flex flex-col justify-around">
- <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
- {{ item.title }}
- </div>
- <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
- {{ item.value }}
- </div>
- <div class="flex items-center gap-1">
- <div
- class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
- >
- {{ item.subTitle }}
- </div>
- <div class="text-black/90 text-xs font-normal font-['D-DIN_Exp'] leading-norma">
- {{ item.subValue }}
- </div>
- </div>
- </div>
- </template>
- </ListHelperEvo>
- </Card>
- <Card custom-class="my-4">
- <div class="flex items-center justify-between">
- <div class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed">
- 使用动态
- </div>
- </div>
- <div class="mt-3">
- <ListHelperEvo
- :content-class="`grid grid-cols-3 gap-2.5`"
- :items="browseRecordCountItems"
- custom-class="grid grid-cols-3 gap-2.5"
- >
- <template #default="{ item }">
- <div class="rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
- <div
- class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none"
- >
- {{ item.title }}
- </div>
- <div class="text-black/90 text-lg font-bold font-['D-DIN_Exp'] leading-normal">
- {{ item.value }}
- </div>
- <div class="flex items-center gap-1 whitespace-nowrap">
- <div
- class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none"
- >
- {{ item.subTitle }}
- </div>
- <div
- class="text-black/90 text-xs font-normal font-['D-DIN_Exp'] leading-norma"
- >
- {{ item.subValue }}
- </div>
- </div>
- </div>
- </template>
- </ListHelperEvo>
- </div>
- </Card>
- <div class="my-4">
- <Card>
- <div class="flex items-center justify-between mb-2">
- <div
- class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed"
- >
- 最近动态
- </div>
- </div>
- <div class="w-full h-.25 bg-[#f9f9f9]"></div>
- <ListHelperEvo
- :request="getBrowseRecordRemarks"
- :query="{ userId: id }"
- custom-class="flex flex-col gap-6"
- >
- <template #default="{ item }">
- <div class="mx-2 flex items-center gap-1 my-6">
- <div class="w-1 h-1 bg-[#2357e9] rounded-full"></div>
- <div
- class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-none"
- >
- {{ item }}
- </div>
- </div>
- </template>
- </ListHelperEvo>
- </Card>
- </div>
- <PageHelperEvo :request="getDesignerPointsActivities" :query="pointsActivitiesQuery">
- <template #default="{ source }">
- <div class="flex flex-col gap-4">
- <template v-for="(it, index) in source?.list" :key="index">
- <Card>
- <div class="">
- <div
- class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-none"
- >
- {{ it.content }}
- </div>
- <div
- class="text-black/30 text-xs font-normal font-['PingFang_SC'] leading-none mt-[10px]"
- >
- {{ dayjs(it.createTime).format('YYYY-MM-DD HH:mm') }}
- </div>
- </div>
- </Card>
- </template>
- </div>
- </template>
- </PageHelperEvo>
- </view>
- <view class="content mt-[20px]" v-if="active === 'followUp'">
- <PageHelperEvo :request="getFollowUpPage" :query="followUpQuery">
- <template #default="{ source }">
- <div class="flex flex-col gap-4">
- <template v-for="(it, index) in source?.list" :key="index">
- <div class="bg-white rounded-2xl shadow pl-[15px] py-[15px] flex-col gap-2 flex">
- <div class="flex items-center justify-between">
- <div
- class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-relaxed"
- >
- {{ dayjs(it.followTime).format('YYYY-MM-DD HH:mm') }}
- </div>
- <div
- class="text-white text-xs font-normal font-['PingFang_SC'] leading-none pa-[8px]"
- :class="`${{ 1: 'bg-[#2357E9]', 2: 'bg-[#f8b344]' }[it.followType]}`"
- style="border-top-left-radius: 15px; border-bottom-left-radius: 5px"
- >
- <div class="flex items-center gap-1">
- <div class="w-1 h-1 bg-white rounded-full border"></div>
- <!-- 线下拜访 -->
- {{ it.followTypeName }}
- </div>
- </div>
- </div>
- <div
- class="text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal mr-[15px] mt-[29px]"
- >
- <!-- 和周老师在工作碰了环球项目,选了瓷砖款式,后天客户交定金,订单金额初步为
- 304958 -->
- {{ it.remark }}
- </div>
- <div class="mt-[15px] flex gap-2.5">
- <template v-for="(src, index) in it?.imgUrl?.split(',')" :key="index">
- <wd-img
- custom-class="rounded-lg overflow-hidden"
- width="70"
- height="70"
- :src="src"
- :enable-preview="true"
- />
- </template>
- </div>
- <div class="flex items-center justify-between mt-[19px] relative">
- <div
- class="h-[25px] px-1.5 bg-[#f4f4f4] rounded-md justify-center items-center gap-1 inline-flex"
- v-if="it?.followType == 1"
- >
- <wd-img width="15px" height="15px" :src="locationIcon"></wd-img>
- <div
- class="text-black/40 text-[10px] font-normal font-['PingFang_SC'] leading-[25px]"
- >
- {{ it?.address.address }}
- </div>
- </div>
- <!-- 渠道 div 固定在右侧 -->
- <div
- class="text-black/90 text-sm font-normal font-['PingFang_SC'] leading-relaxed mr-[15px] absolute right-0"
- v-if="it?.brokerName"
- >
- 渠道:{{ it?.brokerName }}
- </div>
- </div>
- </div>
- </template>
- </div>
- </template>
- </PageHelperEvo>
- </view>
- <view class="content mt-[20px]" v-if="active === ''">
- <div class="bg-white rounded-2xl shadow pa-[15px] mt-[20px] flex-col gap-2 flex">
- <div class="flex-row flex items-center justify-between w-full">
- <div class="flex-row flex items-center">
- <div
- class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[10.18px]"
- >
- 苏小萌
- </div>
- <div
- class="h-4 bg-neutral-100 rounded-[20px] justify-start items-center inline-flex flex-row ml-[9px]"
- >
- <wd-img width="17" height="17" :src="vipIcon"></wd-img>
- <div
- class="text-black/40 text-[10px] font-normal font-['PingFang_SC'] px-[7px] leading-none"
- >
- 白银会员
- </div>
- </div>
- </div>
- <div class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-[10.18px]">
- 4小时前
- </div>
- </div>
- <div class="mt-[26px]">
- <img
- class="w-[165px] h-[220px] rounded-lg"
- src="https://via.placeholder.com/165x220"
- />
- </div>
- <div
- class="text-black/90 text-base font-normal font-['PingFang_SC'] leading-[10.18px] mt-[29px]"
- >
- 用心做好设计,为客户创造美好家居环境
- </div>
- <div
- class="h-7 py-1.5 rounded-[50px] border border-black/20 justify-start items-center gap-[5px] inline-flex mt-[29px]"
- >
- <wd-img width="17" height="17" :src="yinyongIcon"></wd-img>
- <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
- 意大利游学设计班
- </div>
- </div>
- <div class="flex items-center justify-between mt-[19px]">
- <div class="flex items-center gap-[8px]">
- <wd-img width="17" height="17" :src="shareIcon"></wd-img>
- <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
- 232
- </div>
- </div>
- <div class="flex items-center gap-[8px]">
- <wd-img width="17" height="17" :src="messageIcon"></wd-img>
- <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
- 232
- </div>
- </div>
- <div class="flex items-center gap-[8px]">
- <wd-img width="17" height="17" :src="praiseIcon"></wd-img>
- <div class="text-black/90 text-sm font-normal font-['D-DIN_Exp'] leading-snug">
- 232
- </div>
- </div>
- </div>
- </div>
- </view>
- <view class="content mt-[20px]" v-if="active === 'product'">
- <div class="flex-grow flex flex-col gap-4">
- <PageHelperEvo
- ref="pageHelperRef"
- :request="getPointsOrders"
- :query="{ orderType: 2, stylistId: id }"
- class="flex-grow flex flex-col"
- >
- <template #default="{ source }">
- <div class="flex-grow flex flex-col gap-4">
- <template v-for="(it, i) in source?.list" :key="i">
- <div @click="toOrderDetails(it)">
- <Card>
- <div class="flex gap-4">
- <wd-img
- width="94"
- height="94"
- custom-class="rounded-2xl overflow-hidden"
- :src="it.orderImgUrl"
- />
- <div class="flex flex-col flex-1">
- <div
- class="text-black text-base font-normal font-['PingFang_SC'] leading-normal"
- >
- {{ it.projectName }}
- </div>
- <div
- class="text-start text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal"
- >
- x{{ it.orderQuantity || 1 }}
- </div>
- <div class="flex-1"></div>
- <div
- class="text-start text-black/60 text-sm font-normal font-['PingFang_SC'] leading-normal"
- >
- {{ it.points }}积分
- </div>
- </div>
- <div>
- <div
- class="text-black/40 text-sm font-normal font-['PingFang_SC'] leading-normal"
- >
- <!-- 已完成 -->
- {{ status[it.orderStatus] }}
- </div>
- </div>
- </div>
- </Card>
- </div>
- </template>
- </div>
- </template>
- </PageHelperEvo>
- </div>
- </view>
- </div>
- </div>
- </view>
- </template>
- <style scoped lang="scss"></style>
|