agent-mine.vue 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. <script setup lang="ts">
  2. import {
  3. getBroker,
  4. getDesignerStatistics,
  5. getFollowStatistics,
  6. getYearTarget,
  7. } from '../../../core/libs/requests'
  8. import { NetImages } from '../../../core/libs/net-images'
  9. import store, { useUserStore } from '../../../store'
  10. import { storeToRefs } from 'pinia'
  11. import qrCode from '@designer-hub/assets/src/libs/assets/qrCode'
  12. import Card from '@designer-hub/app/src/components/card.vue'
  13. const userStore = useUserStore()
  14. const { userInfo } = storeToRefs(userStore)
  15. const { data: agent, run: setAgent } = useRequest(() =>
  16. getBroker({ brokerId: userInfo.value.userId.toString() }),
  17. )
  18. const { data: yearTarget, run: setYearTarget } = useRequest(() => getYearTarget())
  19. const { data: designerData, run: setdesignerData } = useRequest(() => getDesignerStatistics())
  20. const { data: followData, run: setFollowData } = useRequest(() => getFollowStatistics())
  21. const toSettings = () => {
  22. uni.navigateTo({ url: '/pages/mine/agent/settings/index' })
  23. }
  24. const toInvite = () => {
  25. uni.navigateTo({ url: '/pages/mine/agent/invite/index' })
  26. }
  27. onMounted(async () => {
  28. await setAgent()
  29. await Promise.all([setYearTarget(), setdesignerData(), setFollowData()])
  30. })
  31. </script>
  32. <template>
  33. <div>
  34. <div class="aspect-[0.96/1] absolute left-0 right-0 top--1">
  35. <wd-img
  36. width="100%"
  37. height="100%"
  38. :src="NetImages.AgentMineHeaderBg"
  39. custom-class="vertical-bottom"
  40. ></wd-img>
  41. </div>
  42. <!-- <wd-navbar
  43. fixed
  44. safeAreaInsetTop
  45. custom-class="bg-transparent!"
  46. :bordered="false"
  47. placeholder
  48. v-bind="navBarProps"
  49. ></wd-navbar> -->
  50. <div class="p-4 flex flex-col gap-4 relative">
  51. <div class="flex items-center px-4 mb-4" @click="toSettings">
  52. <wd-img
  53. round
  54. width="56"
  55. height="56"
  56. custom-class="border border-solid border-white"
  57. :src="agent.headImgUrl"
  58. />
  59. <div class="mx-4 flex-1">
  60. <div class="text-white text-lg font-normal font-['PingFang_SC'] leading-normal">
  61. {{ agent.brokerName }}
  62. </div>
  63. <div class="text-white text-xs font-normal font-['PingFang_SC'] leading-relaxed">
  64. ID:{{ agent.inviteCode }}
  65. </div>
  66. </div>
  67. <div class="flex flex-col items-center" @click.stop="toInvite">
  68. <div class="w-[29px] h-[29px] relative">
  69. <wd-img width="28" height="28" :src="qrCode"></wd-img>
  70. </div>
  71. <div class="text-white text-[10px] font-normal font-['PingFang_SC'] leading-relaxed">
  72. 邀请码
  73. </div>
  74. </div>
  75. </div>
  76. <Card>
  77. <SectionHeading title="本年目标" size="base"></SectionHeading>
  78. <div class="flex flex-col gap-2.5 mt-3">
  79. <template v-for="(it, i) in yearTarget" :key="i">
  80. <div
  81. class="bg-gradient-to-r from-[#fef3ee] to-[#f0f4f9] rounded-lg flex items-center p-4 gap-6"
  82. >
  83. <div>
  84. <div class="w-[45px] h-[45px] rounded-full border-4 border-[#ffe2d0]">
  85. <div style="width: 50px; height: 50px">
  86. <wd-circle
  87. :model-value="
  88. it.thisYearComplete && it.target
  89. ? (Number(it.thisYearComplete) / Number(it.target)) * 100
  90. : 0
  91. "
  92. :size="50"
  93. :color="['#FF7742', '#FFAA42', '#4271FF', '#C131FF'][i]"
  94. :clockwise="false"
  95. >
  96. <div class="flex flex-col items-center">
  97. <div
  98. class="w-[29.20px] h-[18.39px] text-black text-sm font-medium font-['DIN']"
  99. >
  100. {{
  101. it.thisYearComplete && it.target
  102. ? (Number(it.thisYearComplete) / Number(it.target)) * 100
  103. : 0
  104. }}%
  105. </div>
  106. <div
  107. class="w-[22.71px] h-[10.82px] text-black/60 text-[7px] font-normal font-['PingFang_SC']"
  108. >
  109. 达成率
  110. </div>
  111. </div>
  112. </wd-circle>
  113. </div>
  114. </div>
  115. </div>
  116. <div class="flex-1">
  117. <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">
  118. {{ it.typeName }}
  119. </div>
  120. <div class="flex items-center gap-1">
  121. <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
  122. <!-- 6000 -->
  123. {{ it.target / 10000 }}
  124. </div>
  125. <div class="text-black text-xs font-normal font-['PingFang_SC']">万</div>
  126. </div>
  127. <div class="flex items-center gap-1">
  128. <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">差值</div>
  129. <div class="text-[#ff2d2d] text-xs font-medium font-['DIN'] leading-normal">
  130. <!-- 3000 -->
  131. {{ (it.target - it.thisYearComplete) / 10000 }}
  132. </div>
  133. <div class="text-[#ff2d2d] text-[10px] font-medium font-['DIN'] leading-normal">
  134. </div>
  135. </div>
  136. </div>
  137. <div class="">
  138. <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">当年完成</div>
  139. <div class="flex items-center gap-1">
  140. <div class="text-black/90 text-lg font-medium font-['DIN'] leading-normal">
  141. <!-- 6000 -->
  142. {{ it.thisYearComplete / 10000 }}
  143. </div>
  144. <div class="text-black text-xs font-normal font-['PingFang_SC']">万</div>
  145. </div>
  146. <div class="flex items-center gap-1">
  147. <div class="text-black/60 text-xs font-normal font-['PingFang_SC']">本月</div>
  148. <div class="text-[#0FC187] text-xs font-medium font-['DIN'] leading-normal">
  149. <!-- 3000 -->
  150. {{ it.thisMonthComplete / 10000 }}
  151. </div>
  152. <div class="text-[#0FC187] text-[10px] font-medium font-['DIN'] leading-normal">
  153. </div>
  154. </div>
  155. </div>
  156. </div>
  157. </template>
  158. </div>
  159. </Card>
  160. <Card>
  161. <SectionHeading title="设计师数据" size="base"></SectionHeading>
  162. <div class="mt-3 grid grid-cols-3 gap-2.5">
  163. <template v-for="(it, i) in designerData" :key="i">
  164. <div class="bg-[#f6f7ff] rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
  165. <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
  166. {{ it.typeName }}
  167. </div>
  168. <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
  169. {{ it.quantity }}
  170. </div>
  171. <div class="flex items-center gap-1">
  172. <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
  173. 年新增
  174. </div>
  175. <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN Exp'] leading-normal">
  176. 20
  177. </div>
  178. </div>
  179. </div>
  180. </template>
  181. </div>
  182. </Card>
  183. <Card>
  184. <SectionHeading title="跟进数据" size="base"></SectionHeading>
  185. <div class="mt-3 grid grid-cols-3 gap-2.5">
  186. <template v-for="(it, i) in followData" :key="i">
  187. <div class="bg-[#f6f7ff] rounded-lg aspect-[1/1] flex flex-col justify-around p-2.5">
  188. <div class="text-black/60 text-xs font-normal font-['PingFang_SC'] leading-none">
  189. {{ it.typeName }}
  190. </div>
  191. <div class="text-black/90 text-lg font-bold font-['D-DIN Exp'] leading-normal">
  192. {{ it.quantity }}
  193. </div>
  194. <div class="flex items-center gap-1">
  195. <div class="text-black/40 text-xs font-normal font-['PingFang_SC'] leading-none">
  196. 年新增
  197. </div>
  198. <div class="text-[#ff2d2d] text-xs font-normal font-['D-DIN Exp'] leading-normal">
  199. 20
  200. </div>
  201. </div>
  202. </div>
  203. </template>
  204. </div>
  205. </Card>
  206. </div>
  207. </div>
  208. </template>