index.vue 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. <template>
  2. <div class="p-4">
  3. <GrowCard :loading="loading" class="enter-y" :list="growCardList" />
  4. <div class="md:flex !my-4 enter-y">
  5. <lineEcharts
  6. class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"
  7. name="chartRef1"
  8. @change="Search"
  9. :propsData="echartData"
  10. @export="handleExport"
  11. />
  12. <lineEcharts2 name="chartRef2" class="md:w-1/2 mx-4 w-full" @export="handleExport" @change="Search" :echartData="orderData" />
  13. </div>
  14. <sceneEchart title="近半年场景新增趋势" class="!my-4 enter-y" @export="handleExport" @change="Search" :echartData="scenetData" />
  15. <!-- <SiteAnalysis class="!my-4 enter-y" :loading="loading" /> -->
  16. <!-- <div class="md:flex enter-y">
  17. <VisitRadar class="md:w-1/3 w-full" :loading="loading" />
  18. <VisitSource class="md:w-1/3 !md:mx-4 !md:my-0 !my-4 w-full" :loading="loading" />
  19. <SalesProductPie class="md:w-1/3 w-full" :loading="loading" />
  20. </div> -->
  21. </div>
  22. </template>
  23. <script lang="ts" setup>
  24. import { ref, onMounted, reactive } from 'vue';
  25. import { userTotal, orderTotal, orderTrend,userTrend,sceneTrend, cameraExport, downExport, incrementExport } from '/@/api/statistics/index';
  26. import GrowCard from './components/GrowCard.vue';
  27. import SiteAnalysis from './components/SiteAnalysis.vue';
  28. import sceneEchart from './components/orderEchart.vue';
  29. import VisitSource from './components/VisitSource.vue';
  30. import VisitRadar from './components/VisitRadar.vue';
  31. import lineEcharts from './components/lineEcharts.vue';
  32. import lineEcharts2 from './components/lineEcharts2.vue';
  33. import SalesProductPie from './components/SalesProductPie.vue';
  34. import { Row, Col } from 'ant-design-vue';
  35. const loading = ref(true);
  36. interface GrowCardItem {
  37. icon: string;
  38. title: string;
  39. value: number;
  40. unit: string;
  41. color: string;
  42. action: string;
  43. }
  44. const exportData = reactive({
  45. orderData:[],
  46. sceneData:[],
  47. cameraData:[],
  48. })
  49. const orderData = reactive({
  50. xdata:[],
  51. downOrder:[],
  52. incrementOrder:[],
  53. partOrder:[],
  54. })
  55. const echartData = reactive({
  56. xData:[],
  57. yData:[],
  58. })
  59. const scenetData = reactive({
  60. xdata:[],
  61. kjList:[],
  62. kkList:[],
  63. ssList:[],
  64. ssobjList:[],
  65. echartTypr:'bar',
  66. })
  67. const SearchData = reactive({
  68. startTime:'',
  69. endTime:'',
  70. orderType:0,
  71. sceneType:0,
  72. userType:0,
  73. })
  74. onMounted(() => {
  75. getData();
  76. getAddUser();
  77. getOrder()
  78. getSceneList()
  79. });
  80. const growCardList = ref<GrowCardItem[]>([]);
  81. async function getData() {
  82. try {
  83. loading.value = true;
  84. const { totalUserCount, preMonthAddCount, todayAddCount, todayActiveCount } = await userTotal();
  85. const { preMonThPowCount, preMonThDownCount, preMonThPartCount } = await orderTotal();
  86. let list = [
  87. {
  88. title: '累计用户',
  89. // icon: 'fa6-solid:users-gear',
  90. icon: 'visit-count|svg',
  91. value: totalUserCount || 0,
  92. unit: '人',
  93. color: 'green',
  94. action: '年',
  95. },
  96. {
  97. title: '上月新增用户',
  98. icon: 'akar-icons:person-add',
  99. value: preMonthAddCount || 0,
  100. unit: '人',
  101. color: 'blue',
  102. action: '月',
  103. },
  104. {
  105. title: '今日新增用户',
  106. icon: 'carbon:user-role',
  107. value: todayAddCount || 0,
  108. unit: '人',
  109. color: 'orange',
  110. action: '日',
  111. },
  112. {
  113. title: '上月权益订单数',
  114. icon: 'fxemoji:notchedrightsemi3dot',
  115. value: preMonThPowCount,
  116. unit: '笔',
  117. color: 'blue',
  118. action: '月',
  119. },
  120. {
  121. title: '上月下载订单数',
  122. icon: 'download-count|svg',
  123. value: preMonThDownCount,
  124. unit: '笔',
  125. color: 'orange',
  126. action: '月',
  127. },
  128. {
  129. title: '上月配件订单数',
  130. icon: 'transaction|svg',
  131. value: preMonThPartCount,
  132. unit: '人',
  133. color: 'blue',
  134. action: '月',
  135. },
  136. ];
  137. growCardList.value = list;
  138. loading.value = false;
  139. } catch (error) {
  140. loading.value = false;
  141. }
  142. }
  143. async function getAddUser() {
  144. let xdata = [], yData=[]
  145. const data = await userTrend({...SearchData,type:SearchData.userType});
  146. data.map(ele => {
  147. xdata.push(ele.groupKey)
  148. yData.push(ele.count)
  149. })
  150. echartData.xData = xdata
  151. echartData.yData = yData
  152. }
  153. async function getOrder() {
  154. let downlist = [],xdata = []
  155. loading.value = true;
  156. const {downOrder,incrementOrder,partOrder} = await orderTrend({...SearchData,type:SearchData.orderType});
  157. downOrder.map(ele => {
  158. xdata.push(ele.groupKey)
  159. downlist.push(ele.count)
  160. })
  161. orderData.xdata = xdata
  162. orderData.downOrder = downlist
  163. orderData.incrementOrder = incrementOrder.map(ele => ele.count)
  164. orderData.partOrder = partOrder &&partOrder.map(ele => ele.count)|| []
  165. loading.value = false;
  166. }
  167. async function getSceneList() {
  168. let downlist = [],xdata = []
  169. loading.value = true;
  170. const {kjList,kkList,ssList,ssobjList} = await sceneTrend({...SearchData,type:SearchData.sceneType});
  171. kjList.map(ele => {
  172. xdata.push(ele.groupKey)
  173. downlist.push(ele.count)
  174. })
  175. scenetData.xdata = xdata
  176. scenetData.kjList = downlist
  177. scenetData.kkList = kkList.map(ele => ele.count)
  178. scenetData.ssList = ssList &&ssList.map(ele => ele.count)|| []
  179. scenetData.ssobjList = ssobjList.map(ele => ele.count)|| []
  180. loading.value = false;
  181. }
  182. function handleExport(val){
  183. console.log('handleExport',val)
  184. let obj = {
  185. 'user':cameraExport,
  186. 'order':incrementExport,
  187. 'scene':downExport,
  188. }
  189. }
  190. function Search(val){
  191. const {value,type} = val
  192. console.log('handleChange',value,type)
  193. if(type){
  194. switch(type){
  195. case 'user':
  196. SearchData.userType = value
  197. getAddUser()
  198. break;
  199. case 'order':
  200. SearchData.orderType = value
  201. getOrder()
  202. break;
  203. case 'scene':
  204. SearchData.sceneType = value
  205. getSceneList()
  206. break;
  207. }
  208. }
  209. }
  210. </script>