Browse Source

feat(组件):

数据看板
tangning 2 years ago
parent
commit
d7a61fc33a

+ 45 - 4
src/api/statistics/index.ts

@@ -1,6 +1,6 @@
 import { defHttp } from '/@/utils/http/axios';
-import { PageParams, ListGetResultModel, DelParams, roleParams } from './model';
-import { Result } from '/#/axios';
+import { PageParams, ListGetResultModel, DelParams, roleParams, companyExcelParams } from './model';
+import { Result, FileStream } from '/#/axios';
 
 enum Api {
   buryPointList = '/service/manage/buryPoint/list',
@@ -12,6 +12,9 @@ enum Api {
   orderTrend = '/service/manage/data/orderTrend',
   cameraTrend = '/service/manage/data/cameraTrend',
   sceneTrend = '/service/manage/data/sceneTrend',
+  cameraExport = '/service/manage/order/camera/export',
+  downExport = '/service/manage/order/down/export',
+  incrementExport = '/service/manage/order/increment/export',
 }
 
 /**
@@ -57,9 +60,11 @@ export const buryPointList = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
-  export const userTrend = () =>
+  export const userTrend = (params) =>
   defHttp.get<Result>({
     url: Api.userTrend,
+    params,
+    data: params,
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
@@ -106,4 +111,40 @@ export const buryPointList = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
-  
+  
+    
+  export const cameraExport = (params) =>
+  defHttp.downloadFile<FileStream>({
+    url: Api.cameraExport,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+    responseType: 'blob'
+  });
+
+  export const downExport = (params) =>
+  defHttp.downloadFile<FileStream>({
+    url: Api.downExport,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+    responseType: 'blob'
+  });
+
+  export const incrementExport = (params) =>
+  defHttp.downloadFile<FileStream>({
+    url: Api.incrementExport,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+    responseType: 'blob'
+  });

+ 6 - 0
src/api/statistics/model.ts

@@ -24,6 +24,12 @@ export interface StaffListItem {
   role: string;
   createTime: string;
 }
+
+export interface companyExcelParams {
+  file?: File | Blob;
+  type?: Number;
+}
+
 /**
  * @description: Request list return value
  */

+ 1 - 1
src/enums/httpEnum.ts

@@ -4,7 +4,7 @@
 export enum ResultEnum {
   SUCCESS = 0,
   ERROR = 1,
-  TIMEOUT = -1,
+  TIMEOUT = 4008,
   TYPE = 'success',
 }
 

+ 6 - 2
src/views/dashboard/analysis/components/GrowCard.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="md:flex">
-    <template v-for="(item, index) in growCardList" :key="item.title">
+    <template v-for="(item, index) in list" :key="item.title">
       <Card
         size="small"
         :loading="loading"
@@ -30,11 +30,15 @@
   import { CountTo } from '/@/components/CountTo/index';
   import { Icon } from '/@/components/Icon';
   import { Tag, Card } from 'ant-design-vue';
-  import { growCardList } from '../data';
+  import { growCardList, GrowCardItem } from '../data';
 
   defineProps({
     loading: {
       type: Boolean,
     },
+    list: {
+      type: Array as PropType<Array<GrowCardItem>>,
+      default: [],
+    },
   });
 </script>

+ 27 - 28
src/views/dashboard/analysis/components/lineEcharts.vue

@@ -1,19 +1,18 @@
 <template>
-  <Card title="成交占比" :loading="loading">
+  <Card title="近半年用户新增趋势" :loading="loading">
     <template #extra>
       <div class="condition">
           <div class="selct" style="display: inline-block;">
             <span style="margin-right:15px">颗粒度</span>
             <Select
             v-model:value="value"
-            label-in-value
             style="width: 100px;margin-right:30px"
             placeholder="请选择颗粒度"
             :options="options"
             @change="handleChange"
           ></Select>
           </div>
-          <a-button type="primary" >导出</a-button>
+          <a-button type="primary" @click="handleExport" >导出</a-button>
       </div>
     </template>
     <div ref="chartRef1" :style="{ width, height }"></div>
@@ -24,8 +23,9 @@ import type { SelectProps } from 'ant-design-vue';
 import { Ref, ref, watch } from 'vue';
 import { Card, Select } from 'ant-design-vue';
 import { useECharts } from '/@/hooks/web/useECharts';
-const colorList = ['#9E87FF', '#73DDFF', '#fe9a8b', '#F56948', '#9E87FF'];
+const colorList = ['#38a0ff', '#73DDFF', '#fe9a8b', '#F56948', '#9E87FF'];
 const shadowColor = ['rgba(158,135,255, 0.3)','rgba(115,221,255, 0.3)','rgba(254,154,139, 0.3)']
+const emit = defineEmits(["alertSome"])
 const props = defineProps({
   loading: Boolean,
   width: {
@@ -44,27 +44,32 @@ const props = defineProps({
     }
   }
 });
-const value = ref('a1');
+const value = ref('0');
 const options = ref<SelectProps['options']>([
-      {
-        value: 'jack',
-        label: 'Jack (100)',
-      },
-      {
-        value: 'lucy',
-        label: 'Lucy (101)',
-      },
+    {
+      value: '0',
+      label: '日',
+    },
+    {
+      value: '1',
+      label: '周',
+    },
+    {
+      value: '2',
+      label: '月',
+    },
     ]);
 const chartRef1 = ref<HTMLDivElement | null>(null);
-const xData = ref<string[]>(['北京', '上海', '广州', '深圳', '香港', '澳门', '台湾']);
-const yData = ref<number[]>([10, 10, 30, 12, 15, 3, 7]);
 const { setOptions } = useECharts(chartRef1 as Ref<HTMLDivElement>);
 function handleChange(val){
-  console.log('handleChange',val)
+    emit('change',{type:'user',value:val})
+}
+function handleExport(){
+  emit('export','user')
 }
 watch(
-  () => props.loading,
-  () => {
+  () => props.propsData,
+  (propsData) => {
     setOptions({
       tooltip: {
         trigger: 'axis',
@@ -92,7 +97,7 @@ watch(
       xAxis: [
         {
           type: 'category',
-          data: xData.value,
+          data: propsData.xData,
           axisLine: {
             lineStyle: {
               color: '#DCE2E8',
@@ -115,7 +120,7 @@ watch(
             label: {
               // padding: [11, 5, 7],
               padding: [0, 0, 10, 0],
-              margin: 15,
+              margin: 10,
               // 移入时的字体大小
               fontSize: 12,
               backgroundColor: {
@@ -182,25 +187,19 @@ watch(
         {
           name: 'Adidas',
           type: 'line',
-          data: yData.value,
+          data: propsData.yData,
           symbolSize: 1,
           smooth: true,
           symbol:'none', //加这个
           // yAxisIndex: 0,
           showSymbol: false,
           lineStyle: {
-            width: 5,
+            width: 2,
             color: colorList[0],
             shadowColor: shadowColor[0],
             shadowBlur: 10,
             shadowOffsetY: 20,
           },
-          itemStyle: {
-            // normal: {
-            //     color: colorList[0],
-            //     borderColor: colorList[0]
-            // }
-          },
         },
       ],
     });

+ 55 - 45
src/views/dashboard/analysis/components/lineEcharts2.vue

@@ -1,19 +1,18 @@
 <template>
-  <Card title="成交占比" :loading="loading">
+  <Card title="近半年线上订单趋势" :loading="loading">
     <template #extra>
       <div class="condition">
           <div class="selct" style="display: inline-block;">
             <span style="margin-right:15px">颗粒度</span>
             <Select
             v-model:value="value"
-            label-in-value
             style="width: 100px;margin-right:30px"
             placeholder="请选择颗粒度"
             :options="options"
             @change="handleChange"
           ></Select>
           </div>
-          <a-button type="primary" >导出</a-button>
+          <a-button type="primary" @click="handleExport">导出</a-button>
       </div>
     </template>
       <div ref="chartRef" :style="{ height, width }"></div>
@@ -25,32 +24,43 @@
   import { Card, Select } from 'ant-design-vue';
 </script>
 <script lang="ts" setup>
-  import { ref, Ref, watch } from 'vue';
+  import { ref, Ref, watch, defineEmits } from 'vue';
   // import type { dataItemType } from './props';
   import { useECharts } from '/@/hooks/web/useECharts';
   const props = defineProps({
   loading: Boolean,
     ...basicProps,
   });
-  const value = ref('a1');
+  const value = ref('0');
   const options = ref<SelectProps['options']>([
-        {
-          value: 'jack',
-          label: 'Jack (100)',
-        },
-        {
-          value: 'lucy',
-          label: 'Lucy (101)',
-        },
-      ]);
-  const viewStaticsData = ref<number[]>([1,5,6,8,55,1,5,6,8,1]);
-  const shareStaticsData = ref<number[]>([2,55,10,2,6,1,5,6,8,1]);
-  const yixStringData = ref<string[]>(['11','22','33','44','ss','11','22','33','44','ss']);
+    {
+      value: '0',
+      label: '日',
+    },
+    {
+      value: '1',
+      label: '周',
+    },
+    {
+      value: '2',
+      label: '月',
+    },
+    ]);
+  const emit = defineEmits(["alertSome"])
+  const downOrderData = ref<number[]>([]);
+  const incrementOrderData = ref<number[]>([]);
+  const partsOrderData = ref<number[]>([]);
+  const yixStringData = ref<string[]>([]);
+  const echartTypr = ref('line')
+  const nameList = ref<string[]>(['下载订单','权益订单','配件订单']);
   const maxSize = ref(0);
   const chartRef = ref<HTMLDivElement | null>(null);
   const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>);
   function handleChange(val){
-    console.log('handleChange',val)
+    emit('change',{type:'order',value:val})
+  }
+  function handleExport(){
+    emit('export','order')
   }
   function handlesetOptions() {
     setOptions({
@@ -80,47 +90,47 @@
       },
       series: [
         {
-          data: viewStaticsData.value,
-          type: 'bar',
+          data: downOrderData.value,
+          type: echartTypr.value,
           itemStyle: { color: '#38a0ff' },
           barMaxWidth: 80,
-          name: '用户浏览量',
+          name: nameList.value[0],
         },
         {
-          data: shareStaticsData.value,
-          type: 'bar',
+          data: incrementOrderData.value,
+          type: echartTypr.value,
           itemStyle: { color: '#4cca73' },
           barMaxWidth: 80,
-          name: '用户分享数',
+          name: nameList.value[1],
+        },
+        {
+          data: partsOrderData.value,
+          type: echartTypr.value,
+          itemStyle: { color: '#FDD56A' },
+          barMaxWidth: 80,
+          name: nameList.value[2],
         },
       ],
     });
   }
   // props.viewStatics,
+  
   watch(
-    // () => [props.viewStatics, props.shareStatics],
-    // ([data1, data2]) => {
-    () => props.loading,
-    () => {
-      console.log('viewStatics-data');
-      // viewStaticsData.value = data1.reduce<number[]>(
-      //   (prev: number[], current) => prev.concat(Number(current.amount)),
-      //   [],
-      // );
-
-      // yixStringData.value = data1.reduce<string[]>(
-      //   (prev: string[], current) => prev.concat(current.date),
-      //   [],
-      // );
-      // shareStaticsData.value = data2.reduce<number[]>(
-      //   (prev: number[], current) => prev.concat(Number(current.amount)),
-      //   [],
-      // );
-
-      const maxNumber = Math.max(...viewStaticsData.value.concat(shareStaticsData.value));
+    () => props.echartData,
+    (echartData) => {
+      downOrderData.value = echartData.downOrder ||[]
+      incrementOrderData.value = echartData.incrementOrder ||[]
+      partsOrderData.value = echartData.partOrder ||[]
+      yixStringData.value = echartData.xdata ||[]
+      if(echartData.nameList){
+        nameList.value = echartData.nameList
+      }
+      if(echartData.echartTypr){
+        echartTypr.value = echartData.echartTypr
+      }
+      const maxNumber = Math.max(...echartData.downOrder.concat(echartData.incrementOrder));
       const pow = Math.pow(10, maxNumber.toString().length - 1);
       maxSize.value = maxNumber > 10 ? Math.floor(maxNumber / 10) * 10 + pow * 2 : 10;
-      console.log('maxSize', maxSize.value);
       handlesetOptions();
     },
     {

+ 140 - 0
src/views/dashboard/analysis/components/orderEchart.vue

@@ -0,0 +1,140 @@
+<template>
+  <Card :title="title||'订单数据统计'">
+    <template #extra>
+      <div class="condition">
+          <div class="selct" style="display: inline-block;">
+            <span style="margin-right:15px">颗粒度</span>
+            <Select
+            v-model:value="value"
+            style="width: 100px;margin-right:30px"
+            placeholder="请选择颗粒度"
+            :options="options"
+            @change="handleChange"
+          ></Select>
+          </div>
+          <a-button type="primary" @click="handleExport">导出</a-button>
+      </div>
+    </template>
+    <div ref="chartRef" :style="{ height, width }"></div>
+  </Card>
+</template>
+<script lang="ts" setup>
+  import { basicProps } from './props';
+  import type { SelectProps } from 'ant-design-vue';
+  import { Card, DatePicker, Select } from 'ant-design-vue';
+  import { ref, Ref, watch, defineEmits } from 'vue';
+  import { useECharts } from '/@/hooks/web/useECharts';
+  const props = defineProps({
+  loading: Boolean,
+    ...basicProps,
+  });
+  const value = ref('0');
+  const options = ref<SelectProps['options']>([
+    {
+      value: '0',
+      label: '日',
+    },
+    {
+      value: '1',
+      label: '周',
+    },
+    {
+      value: '2',
+      label: '月',
+    },
+    ]);
+  const emit = defineEmits(["alertSome"])
+  const downOrderData = ref<number[]>([]);
+  const incrementOrderData = ref<number[]>([]);
+  const partsOrderData = ref<number[]>([]);
+  const yixStringData = ref<string[]>([]);
+  const echartTypr = ref('line')
+  const nameList = ref<string[]>(['下载订单','权益订单','配件订单']);
+  const maxSize = ref(0);
+  const chartRef = ref<HTMLDivElement | null>(null);
+  const { setOptions } = useECharts(chartRef as Ref<HTMLDivElement>)
+
+  function handleChange(val){
+    emit('change',{type:'scene',value:val})
+  }
+  
+  function handleExport(){
+    emit('export','scene')
+  }
+
+  function handlesetOptions() {
+    console.log('handlesetOptions',downOrderData.value,partsOrderData.value,partsOrderData.value,yixStringData.value)
+    setOptions({
+      tooltip: {
+        trigger: 'axis',
+        axisPointer: {
+          lineStyle: {
+            width: 1,
+            color: '#019680',
+          },
+        },
+      },
+      legend: {
+        orient: 'horizontal',
+        bottom: 0,
+      },
+      // grid: { left: '2%', right: '2%', top: '10%', bottom: '10%', containLabel: true },
+      xAxis: {
+        type: 'category',
+        // data: [...new Array(30)].map((_item, index) => `${index + 1}日`),
+        data: yixStringData.value,
+      },
+      yAxis: {
+        type: 'value',
+        max: maxSize.value,
+        splitNumber: 4,
+      },
+      series: [
+        {
+          data: downOrderData.value,
+          type: echartTypr.value,
+          itemStyle: { color: '#38a0ff' },
+          barMaxWidth: 80,
+          name: nameList.value[0],
+        },
+        {
+          data: incrementOrderData.value,
+          type: echartTypr.value,
+          itemStyle: { color: '#4cca73' },
+          barMaxWidth: 80,
+          name: nameList.value[1],
+        },
+        {
+          data: partsOrderData.value,
+          type: echartTypr.value,
+          itemStyle: { color: '#FDD56A' },
+          barMaxWidth: 80,
+          name: nameList.value[2],
+        },
+      ],
+    });
+  }
+  watch(
+    () => props.echartData,
+    (echartData) => {
+      downOrderData.value = echartData.downOrder ||[]
+      incrementOrderData.value = echartData.incrementOrder ||[]
+      partsOrderData.value = echartData.partOrder ||[]
+      yixStringData.value = echartData.xdata ||[]
+      if(echartData.nameList){
+        nameList.value = echartData.nameList
+      }
+      if(echartData.echartTypr){
+        echartTypr.value = echartData.echartTypr
+      }
+      const maxNumber = Math.max(...echartData.downOrder.concat(echartData.incrementOrder));
+      const pow = Math.pow(10, maxNumber.toString().length - 1);
+      maxSize.value = maxNumber > 10 ? Math.floor(maxNumber / 10) * 10 + pow * 2 : 10;
+      handlesetOptions();
+    },
+    {
+      immediate: true,
+      deep: true,
+    },
+  );
+</script>

+ 12 - 0
src/views/dashboard/analysis/components/props.ts

@@ -8,6 +8,14 @@ export type dataItemType = {
   date: string;
   amount: string | number;
 };
+export type echartData = {
+  xdata: string[];
+  downOrder: number[];
+  incrementOrder: number[];
+  partOrder: number[];
+  nameList?:string[];
+  echartTypr?:string;
+};
 export const basicProps = {
   width: {
     type: String as PropType<string>,
@@ -33,4 +41,8 @@ export const basicProps = {
     type: Array as PropType<Array<dataItemType>>,
     default: [],
   },
+  echartData: {
+    type: Object as PropType<echartData>,
+    default: {},
+  },
 };

+ 198 - 39
src/views/dashboard/analysis/index.vue

@@ -1,53 +1,212 @@
 <template>
   <div class="p-4">
-    <GrowCard :loading="loading" class="enter-y" :list="list" />
+    <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" :loading="loading"  />
-      <lineEcharts2  name="chartRef2" class="md:w-1/2 mx-4 w-full" :loading="loading" />
+      <lineEcharts
+        class="md:w-1/2 w-full !md:mt-0 !mt-4 !md:mr-4"
+        name="chartRef1"
+        :loading="loading"
+        @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>
-    <SiteAnalysis class="!my-4 enter-y" :loading="loading" />
-    <div class="md:flex enter-y">
+    <sceneEchart title="近半年场景新增趋势" class="!my-4 enter-y" @export="handleExport" @change="Search" :echartData="scenetData" :loading="loading" />
+    <!-- <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> -->
   </div>
 </template>
 <script lang="ts" setup>
-  import { ref, onMounted } from 'vue';
-  import { userTotal } from '/@/api/statistics/index';
-  import GrowCard from './components/GrowCard.vue';
-  import SiteAnalysis from './components/SiteAnalysis.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;
+import { ref, onMounted, reactive } from 'vue';
+import { userTotal, orderTotal, orderTrend,userTrend, 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 { downloadByData, } from '/@/utils/file/download';
+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 orderData = reactive({
+    xdata:[],
+    downOrder:[],
+    incrementOrder:[],
+    partOrder:[],
+  })
+const echartData = reactive({
+    xData:[],
+    yData:[],
+  })
+const scenetData = reactive({
+    xdata:[],
+    downOrder:[],
+    incrementOrder:[],
+    partOrder:[],
+    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;
   }
-  onMounted(() => {
-    getData();
-  });
-  const list = ref<GrowCardItem[]>([]);
-  async function getData() {
-    try {
-      loading.value = true;
-      const Total = await userTotal();
-      console.log('sData', Total);
-      loading.value = false;
-    } catch (error) {
-      loading.value = false;
-    }
+}
+async function getAddUser() {
+  let xdata = []
+    loading.value = true;
+    const {downOrder,incrementOrder,partOrder} = await userTrend({...SearchData,type:SearchData.userType});
+    echartData.xData = xdata
+    echartData.yData = incrementOrder.map(ele => ele.count)
+    loading.value = false;
+}
+
+
+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)|| []
+    console.log('getList',orderData)
+    loading.value = false;
   }
-  setTimeout(() => {
+  async function getSceneList() {
+    let downlist = [],xdata = []
+    loading.value = true;
+    const {downOrder,incrementOrder,partOrder} = await orderTrend({...SearchData,type:SearchData.sceneType});
+    downOrder.map(ele => {
+      xdata.push(ele.groupKey)
+      downlist.push(ele.count)
+    })
+    scenetData.xdata = xdata
+    scenetData.downOrder = downlist
+    scenetData.incrementOrder = incrementOrder.map(ele => ele.count)
+    scenetData.partOrder = partOrder &&partOrder.map(ele => ele.count)|| []
     loading.value = false;
-  }, 1500);
+  }
+  function handleExport(val){
+    console.log('handleExport',val)
+    let obj = {
+      'user':cameraExport,
+      'order':incrementExport,
+      'scene':downExport,
+    }
+    let apiSrc = obj[val] || cameraExport
+    apiSrc({}).then(res => {
+      console.log('handlerowClick',res)
+      downloadByData(res.data,'导出文件.xls')
+    })
+  }
+
+  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>

+ 1 - 1
src/views/statistics/components/lineEcharts.vue

@@ -13,7 +13,7 @@
             @change="handleChange"
           ></Select>
           </div>
-          <a-button type="primary" >导出</a-button>
+          <a-button @click="export" type="primary" >导出</a-button>
       </div>
     </template>
     <div ref="chartRef1" :style="{ width, height }"></div>