123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- <template>
- <div class="p-4">
- <GrowCard :loading="loading" class="enter-y" :list="growCardList" />
- <div class="md:flex !my-4 enter-y">
- <lineEcharts
- class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"
- name="chartRef1"
- @change="Search"
- :propsData="echartData"
- @export="handleExport"
- />
- <lineEcharts2 name="chartRef2" class="md:w-1/2 mx-4 w-full" @export="handleExport" @change="Search" :echartData="orderData" />
- </div>
- <sceneEchart title="近半年场景新增趋势" class="!my-4 enter-y" @export="handleExport" @change="Search" :echartData="scenetData" />
- <!-- <SiteAnalysis class="!my-4 enter-y" :loading="loading" /> -->
- <!-- <div class="md:flex enter-y">
- <VisitRadar class="md:w-1/3 w-full" :loading="loading" />
- <VisitSource class="md:w-1/3 !md:mx-4 !md:my-0 !my-4 w-full" :loading="loading" />
- <SalesProductPie class="md:w-1/3 w-full" :loading="loading" />
- </div> -->
- </div>
- </template>
- <script lang="ts" setup>
- import { ref, onMounted, reactive } from 'vue';
- import { userTotal, orderTotal, orderTrend,userTrend,sceneTrend, cameraExport, downExport, incrementExport } from '/@/api/statistics/index';
- import GrowCard from './components/GrowCard.vue';
- import SiteAnalysis from './components/SiteAnalysis.vue';
- import sceneEchart from './components/orderEchart.vue';
- import VisitSource from './components/VisitSource.vue';
- import VisitRadar from './components/VisitRadar.vue';
- import lineEcharts from './components/lineEcharts.vue';
- import lineEcharts2 from './components/lineEcharts2.vue';
- import SalesProductPie from './components/SalesProductPie.vue';
- import { Row, Col } from 'ant-design-vue';
- const loading = ref(true);
- interface GrowCardItem {
- icon: string;
- title: string;
- value: number;
- unit: string;
- color: string;
- action: string;
- }
- const exportData = reactive({
- orderData:[],
- sceneData:[],
- cameraData:[],
- })
- const orderData = reactive({
- xdata:[],
- downOrder:[],
- incrementOrder:[],
- partOrder:[],
- })
- const echartData = reactive({
- xData:[],
- yData:[],
- })
- const scenetData = reactive({
- xdata:[],
- kjList:[],
- kkList:[],
- ssList:[],
- ssobjList:[],
- echartTypr:'bar',
- })
- const SearchData = reactive({
- startTime:'',
- endTime:'',
- orderType:0,
- sceneType:0,
- userType:0,
- })
- onMounted(() => {
- getData();
- getAddUser();
- getOrder()
- getSceneList()
- });
- const growCardList = ref<GrowCardItem[]>([]);
- async function getData() {
- try {
- loading.value = true;
- const { totalUserCount, preMonthAddCount, todayAddCount, todayActiveCount } = await userTotal();
- const { preMonThPowCount, preMonThDownCount, preMonThPartCount } = await orderTotal();
- let list = [
- {
- title: '累计用户',
- // icon: 'fa6-solid:users-gear',
- icon: 'visit-count|svg',
- value: totalUserCount || 0,
- unit: '人',
- color: 'green',
- action: '年',
- },
- {
- title: '上月新增用户',
- icon: 'akar-icons:person-add',
- value: preMonthAddCount || 0,
- unit: '人',
- color: 'blue',
- action: '月',
- },
- {
- title: '今日新增用户',
- icon: 'carbon:user-role',
- value: todayAddCount || 0,
- unit: '人',
- color: 'orange',
- action: '日',
- },
- {
- title: '上月权益订单数',
- icon: 'fxemoji:notchedrightsemi3dot',
- value: preMonThPowCount,
- unit: '笔',
- color: 'blue',
- action: '月',
- },
- {
- title: '上月下载订单数',
- icon: 'download-count|svg',
- value: preMonThDownCount,
- unit: '笔',
- color: 'orange',
- action: '月',
- },
- {
- title: '上月配件订单数',
- icon: 'transaction|svg',
- value: preMonThPartCount,
- unit: '人',
- color: 'blue',
- action: '月',
- },
- ];
- growCardList.value = list;
- loading.value = false;
- } catch (error) {
- loading.value = false;
- }
- }
- async function getAddUser() {
- let xdata = [], yData=[]
- const data = await userTrend({...SearchData,type:SearchData.userType});
- data.map(ele => {
- xdata.push(ele.groupKey)
- yData.push(ele.count)
- })
- echartData.xData = xdata
- echartData.yData = yData
- }
- async function getOrder() {
- let downlist = [],xdata = []
- loading.value = true;
- const {downOrder,incrementOrder,partOrder} = await orderTrend({...SearchData,type:SearchData.orderType});
- downOrder.map(ele => {
- xdata.push(ele.groupKey)
- downlist.push(ele.count)
- })
- orderData.xdata = xdata
- orderData.downOrder = downlist
- orderData.incrementOrder = incrementOrder.map(ele => ele.count)
- orderData.partOrder = partOrder &&partOrder.map(ele => ele.count)|| []
- loading.value = false;
- }
- async function getSceneList() {
- let downlist = [],xdata = []
- loading.value = true;
- const {kjList,kkList,ssList,ssobjList} = await sceneTrend({...SearchData,type:SearchData.sceneType});
- kjList.map(ele => {
- xdata.push(ele.groupKey)
- downlist.push(ele.count)
- })
- scenetData.xdata = xdata
- scenetData.kjList = downlist
- scenetData.kkList = kkList.map(ele => ele.count)
- scenetData.ssList = ssList &&ssList.map(ele => ele.count)|| []
- scenetData.ssobjList = ssobjList.map(ele => ele.count)|| []
- loading.value = false;
- }
- function handleExport(val){
- console.log('handleExport',val)
- let obj = {
- 'user':cameraExport,
- 'order':incrementExport,
- 'scene':downExport,
- }
- }
- function Search(val){
- const {value,type} = val
- console.log('handleChange',value,type)
- if(type){
- switch(type){
- case 'user':
- SearchData.userType = value
- getAddUser()
- break;
- case 'order':
- SearchData.orderType = value
- getOrder()
- break;
- case 'scene':
- SearchData.sceneType = value
- getSceneList()
- break;
- }
- }
- }
- </script>
|