dataSummary.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. <template>
  2. <div class="dataSummary box mt-4">
  3. <div class="box-title">
  4. <div class="box-title-left text-size-in">数据汇总</div>
  5. <div class="box-title-right text-size-small" @click="showPopUpLayer()">
  6. {{ scopeText }}/{{ dateText }}
  7. <van-icon name="play" class="ml-2 rotate-90" color="#747474" />
  8. </div>
  9. </div>
  10. <div class="content w-full overflow-hidden transitionEffect"
  11. :style="`height: ${expandAndCollapse ? usePxToVwView(313) : '0'}`">
  12. <div class="data-item flex flex-row bg-[#F8F8FA]">
  13. <img src="/src/assets/image/kehuhz.png" class="kehu-img">
  14. <div class="flex-1">
  15. <div class="font-bold text-[#000]">客户汇总</div>
  16. <div class="flex mt-2">
  17. <div class="text-size-small text-[#999]" style="width: 40%">
  18. 新增客户 <span class="ml-1 text-[#FFBD27]">
  19. {{ dataSummary?.customDataSummary?.newNum || 0 }}
  20. </span> 人
  21. </div>
  22. <div class="text-size-small text-[#999]" style="width: 60%">
  23. 转成交客户 <span class="ml-1 text-[#FFBD27]">
  24. {{ dataSummary?.closeDealNum?.newNum || 0 }}
  25. </span> 人
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. <div class="data-item flex flex-row bg-[#F8F8FA]">
  31. <img src="/src/assets/image/shangjihz.png" class="businessOpportunity-img">
  32. <div class="flex-1">
  33. <div class="font-bold text-[#000]">商机汇总</div>
  34. <div class="flex mt-2">
  35. <div class="text-size-small text-[#999]" style="width: 40%;">
  36. 新增商机 <span class="ml-1 text-[#51C2FF]">
  37. {{ dataSummary?.businessOpportunityDataSummary?.newNum || 0 }}
  38. </span> 个
  39. </div>
  40. <div class="text-size-small text-[#999]" style="width: 60%;">
  41. 商机赢单 <span class="ml-1 text-[#51C2FF]">
  42. {{ dataSummary?.businessOpportunityDataSummary?.losting || 0 }}
  43. </span> 个
  44. </div>
  45. </div>
  46. <div class="flex mt-2">
  47. <div class="text-size-small text-[#999]" style="width: 40%;">
  48. 输单商机 <span class="ml-1 text-[#51C2FF]">
  49. {{ dataSummary?.businessOpportunityDataSummary?.winning || 0 }}
  50. </span> 个
  51. </div>
  52. <div class="text-size-small text-[#999]" style="width: 60%;">
  53. 商机总金额 <span class="ml-1 text-[#51C2FF]">
  54. {{ dataSummary?.businessOpportunityDataSummary?.allAmountOfMoney || 0 }}
  55. </span> 元
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. <div class="data-item flex flex-row bg-[#F8F8FA]">
  61. <img src="/src/assets/image/xiansuohz.png" class="xiansuo-img">
  62. <div class="flex-1">
  63. <div class="font-bold text-[#000]">线索汇总</div>
  64. <div class="flex mt-2">
  65. <div class="w-1/2 text-size-small text-[#999]">
  66. 新增线索 <span class="ml-1 text-[#28C67E]">
  67. {{ dataSummary?.clueDataSummary?.newNum || 0 }}
  68. </span> 个
  69. </div>
  70. <div class="w-1/2 text-size-small text-[#999]">
  71. 线索转商机 <span class="ml-1 text-[#28C67E]">
  72. {{ dataSummary?.clueDataSummary?.changeNum || 0 }}
  73. </span> 个
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. <div class="w-full flex justify-center mt-2" @click="expandAndCollapseSwitch()">
  80. <van-icon name="arrow-up" color="#AFAFAF"
  81. :class="`${!expandAndCollapse && 'rotate-180'} transitionEffect`" />
  82. </div>
  83. <van-popup v-model:show="filterCriteriaPopUpLayerFlag" position="bottom" :style="{ height: '100%' }" closeable>
  84. <FilterItem :dataFilters="filterCriteria" @submit="FilterItemSubmit" />
  85. </van-popup>
  86. </div>
  87. </template>
  88. <script setup>
  89. import { ref, computed } from 'vue';
  90. import { useLifecycle } from '@hooks/useCommon.js';
  91. import { OBTAIN_DATA_SUMMARY } from '@hooks/useApi.js';
  92. import { fixedFieldPermissionOptions, fixedFieldDateOptions } from '@utility/defaultData.js';
  93. import requests from "@common/requests"
  94. import usePxToVwView from "@hooks/usePxTransform.js";
  95. import FilterItem from './filterItem.vue';
  96. const filterCriteriaPopUpLayerFlag = ref(false);
  97. const expandAndCollapse = ref(true);
  98. const dataSummary = ref({});
  99. const filterCriteria = ref({
  100. scopeSelection: 0,
  101. dateSelection: 0,
  102. customTime: []
  103. })
  104. const scopeText = computed(() => {
  105. return fixedFieldPermissionOptions[filterCriteria.value.scopeSelection].label
  106. })
  107. const dateText = computed(() => {
  108. if(filterCriteria.value.dateSelection == -1) {
  109. const { customTime = [] } = filterCriteria.value
  110. return ` ${customTime[0]} 至 ${customTime[1]}`
  111. }
  112. return fixedFieldDateOptions[filterCriteria.value.dateSelection].label
  113. })
  114. function FilterItemSubmit(val) {
  115. filterCriteria.value = val
  116. filterCriteriaPopUpLayerFlag.value = false;
  117. obtainDataSummary()
  118. }
  119. function showPopUpLayer() {
  120. filterCriteriaPopUpLayerFlag.value = true;
  121. }
  122. function expandAndCollapseSwitch() {
  123. expandAndCollapse.value = !expandAndCollapse.value;
  124. }
  125. function obtainDataSummary() {
  126. const { scopeSelection = 0, dateSelection = 0, customTime = [] } = filterCriteria.value
  127. const formVal = {
  128. queryType: scopeSelection,
  129. ...(dateSelection !== -1 ? { dateType: dateSelection } : { startDate: customTime[0], endDate: customTime[1] })
  130. }
  131. requests.post(OBTAIN_DATA_SUMMARY, {
  132. ...formVal
  133. }).then((res) => {
  134. dataSummary.value = res.data
  135. })
  136. }
  137. useLifecycle({
  138. load: () => {
  139. obtainDataSummary()
  140. },
  141. init: () => {
  142. obtainDataSummary()
  143. }
  144. });
  145. </script>
  146. <style lang='scss' scoped>
  147. /* 样式代码 */
  148. </style>