Browse Source

feat(组件): 修改bug

tangning 2 years ago
parent
commit
65fdc1c1b2
33 changed files with 193 additions and 90 deletions
  1. 1 0
      package.json
  2. 1 1
      src/api/product/index.ts
  3. 1 0
      src/components/Upload/src/BasicUpload.vue
  4. 2 0
      src/components/Upload/src/FileList.vue
  5. 8 3
      src/components/Upload/src/UploadModal.vue
  6. 7 5
      src/components/Upload/src/UploadPreviewModal.vue
  7. 5 2
      src/components/Upload/src/data.tsx
  8. 8 1
      src/components/Upload/src/helper.ts
  9. 5 0
      src/components/Upload/src/props.ts
  10. 2 0
      src/locales/lang/zh-CN/routes/product.ts
  11. 32 10
      src/utils/file/download.ts
  12. 8 4
      src/views/customer/modal/InfoModal.vue
  13. 7 4
      src/views/dashboard/analysis/components/lineEcharts.vue
  14. 11 6
      src/views/dashboard/analysis/components/lineEcharts2.vue
  15. 13 7
      src/views/dashboard/analysis/components/orderEchart.vue
  16. 1 2
      src/views/dashboard/analysis/index.vue
  17. 1 6
      src/views/invoice/InvoiceModal.vue
  18. 2 2
      src/views/operate/components/new/addModal.vue
  19. 4 1
      src/views/operate/components/recruit/addModal.vue
  20. 12 0
      src/views/order/cameraList.vue
  21. 2 2
      src/views/order/downloadList.vue
  22. 4 4
      src/views/order/equityList.vue
  23. 2 2
      src/views/product/firmware/AddModal.vue
  24. 3 0
      src/views/product/firmware/EditModal.vue
  25. 2 2
      src/views/productOperation/cameraScene.vue
  26. 7 4
      src/views/statistics/components/activelineEchart.vue
  27. 1 1
      src/views/statistics/components/condition.vue
  28. 11 5
      src/views/statistics/components/orderEchart.vue
  29. 13 7
      src/views/statistics/components/sceneEchart.vue
  30. 8 5
      src/views/statistics/components/scenelineEcharts.vue
  31. 3 3
      src/views/statistics/order/index.vue
  32. 1 1
      src/views/system/menu/menu.data.ts
  33. 5 0
      yarn.lock

+ 1 - 0
package.json

@@ -46,6 +46,7 @@
     "crypto-js": "^4.1.1",
     "dayjs": "^1.11.5",
     "echarts": "^5.2.2",
+    "file-saver": "^2.0.5",
     "lodash-es": "^4.17.21",
     "mockjs": "^1.1.0",
     "moment": "^2.29.1",

+ 1 - 1
src/api/product/index.ts

@@ -5,7 +5,7 @@ import { ContentTypeEnum } from '/@/enums/httpEnum';
 
 enum Api {
   cameraVersionList = '/service/manage/cameraVersion/list',
-  upload = '/upload',
+  upload = '/service/manage/common/upload/files',
   spaceSdkList = '/service/manage/spaceSdk/list',
   spaceSdkUpdate = '/service/manage/spaceSdk/update',
   spaceSdkOnline = '/service/manage/spaceSdk/online',

+ 1 - 0
src/components/Upload/src/BasicUpload.vue

@@ -29,6 +29,7 @@
     />
 
     <UploadPreviewModal
+      v-bind="bindValue"
       :value="fileList"
       @register="registerPreviewModal"
       @list-change="handlePreviewChange"

+ 2 - 0
src/components/Upload/src/FileList.vue

@@ -12,6 +12,7 @@
       watch(
         () => props.dataSource,
         () => {
+          console.log('dataSource',props)
           nextTick(() => {
             modalFn?.redoModalHeight?.();
           });
@@ -20,6 +21,7 @@
       return () => {
         const { columns, actionColumn, dataSource } = props;
         const columnList = [...columns, actionColumn];
+        console.log('createPreviewActionColumn',columnList,props)
         return (
           <table class="file-table">
             <colgroup>

+ 8 - 3
src/components/Upload/src/UploadModal.vue

@@ -208,7 +208,7 @@
             isZh = true;
           }
           item.status = UploadResultStatus.UPLOADING;
-          const { data } = await props.api?.(
+          const data = await props.api?.(
             {
               data: {
                 ...(props.uploadParams || {}),
@@ -222,6 +222,7 @@
               item.percent = complete;
             },
           );
+          console.log('item',item,data)
           item.status = UploadResultStatus.SUCCESS;
           item.responseData = data;
 
@@ -275,6 +276,7 @@
       // 点击开始上传
       async function handleStartUpload() {
         const { maxNumber,fileFlow } = props;
+        console.log('uploadApiByItem',props)
         if ((fileListRef.value.length + props.previewFileList?.length ?? 0) > maxNumber) {
           return createMessage.warning(t('component.upload.maxNumber', [maxNumber]));
         }
@@ -320,9 +322,12 @@
           console.log('responseData', item);
           if (status === UploadResultStatus.SUCCESS && responseData) {
             if(fileFlow){
-              fileList.push(responseData.name);
+              fileList.push({
+                name:responseData.name,
+                url:item.thumbUrl,
+              });
             }else{
-              fileList.push(responseData.url);
+              fileList.push(responseData);
             }
           }
         }

+ 7 - 5
src/components/Upload/src/UploadPreviewModal.vue

@@ -11,7 +11,7 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, watch, ref } from 'vue';
+  import { defineComponent, watch, ref, toRefs } from 'vue';
   //   import { BasicTable, useTable } from '/@/components/Table';
   import FileList from './FileList.vue';
   import { BasicModal, useModalInner } from '/@/components/Modal';
@@ -34,14 +34,16 @@
       watch(
         () => props.value,
         (value) => {
+          console.log('watch',value,props)
           if (!isArray(value)) value = [];
+          const fileFlow = toRefs(props)?.fileFlow
           fileListRef.value = value
             .filter((item) => !!item)
             .map((item) => {
               return {
-                url: item,
-                type: item.split('.').pop() || '',
-                name: item.split('/').pop() || '',
+                url: fileFlow?item.url:item,
+                type: fileFlow?'':item.split('.').pop() || '',
+                name: fileFlow?item.name:item.split('/').pop() || '',
               };
             });
         },
@@ -80,7 +82,7 @@
         register,
         closeModal,
         fileListRef,
-        columns: createPreviewColumns() as any[],
+        columns: createPreviewColumns(props.fileFlow) as any[],
         actionColumn: createPreviewActionColumn({ handleRemove, handleDownload }) as any,
       };
     },

+ 5 - 2
src/components/Upload/src/data.tsx

@@ -2,7 +2,7 @@ import type { BasicColumn, ActionItem } from '/@/components/Table';
 import { FileItem, PreviewFileItem, UploadResultStatus } from './typing';
 import {
   // checkImgType,
-  isImgTypeByName,
+  isImgTypeByName,validateBase64
 } from './helper';
 import { Progress, Tag } from 'ant-design-vue';
 import TableAction from '/@/components/Table/src/components/TableAction.vue';
@@ -103,7 +103,7 @@ export function createActionColumn(handleRemove: Function): BasicColumn {
   };
 }
 // 文件预览列表
-export function createPreviewColumns(): BasicColumn[] {
+export function createPreviewColumns(fileFlow:Boolean): BasicColumn[] {
   return [
     {
       dataIndex: 'url',
@@ -111,6 +111,9 @@ export function createPreviewColumns(): BasicColumn[] {
       width: 100,
       customRender: ({ record }) => {
         const { url } = (record as PreviewFileItem) || {};
+        if(validateBase64(url)){
+          return <ThumbUrl fileUrl={url} />
+        }
         return isImgTypeByName(url) && <ThumbUrl fileUrl={url} />;
       },
     },

+ 8 - 1
src/components/Upload/src/helper.ts

@@ -13,7 +13,14 @@ export function checkImgType(file: File) {
 export function isImgTypeByName(name: string) {
   // return /\.(jpg|jpeg|png|gif)$/i.test(name);
   // return /\.(jpg|jpeg|png|gif)$/i.test(name.split('?').shift());
-  return /\.(jpg|jpeg|png|gif)$/i.test(name.split('?').shift());
+  return /\.(jpg|jpeg|png|gif)|:image$/i.test(name.split('?').shift());
+}
+
+// 校验内容是否包含base64格式的图片
+export function validateBase64(str){
+  let imgReg = RegExp(/data:image\/.*;base64,/)
+  const res = imgReg.test(str)
+  return res
 }
 
 export function getBase64WithFile(file: File) {

+ 5 - 0
src/components/Upload/src/props.ts

@@ -74,6 +74,11 @@ export const previewProps = {
     type: Array as PropType<string[]>,
     default: () => [],
   },
+  // 上传文件流
+  fileFlow: {
+    type: Boolean as PropType<boolean>,
+    default: false,
+  },
 };
 
 export const fileListProps = {

+ 2 - 0
src/locales/lang/zh-CN/routes/product.ts

@@ -9,6 +9,8 @@ export default {
   types:'设备类型',
   minVersion:'最低版本号',
   version:'版本号',
+  versionPlaceholder:'最新版本号',
+  versionTips:'(低于此版本号强制更新)',
   description:'版本更新说明',
   description_zh:'中文更新说明',
   description_en:'英文更新说明',

+ 32 - 10
src/utils/file/download.ts

@@ -1,22 +1,44 @@
 import { openWindow } from '..';
 import { dataURLtoBlob, urlToBase64 } from './base64Conver';
 import * as XLSX from 'xlsx' // Vue3 版本
+import fs from 'file-saver'
 /**
  * Download online pictures
  * @param data
  * @param filename
  */
- export function exportElsxFile(handle:string[],list: Array, filename: string) {
-  // 创建工作表
-  const data = XLSX.utils.json_to_sheet(list,{
-    header:handle
+ export function exportElsxFile(json, fields, filename = '表格.xlsx') {
+  json.forEach(item => {
+      for (let i in item) {
+          if (fields.hasOwnProperty(i)) {
+              item[fields[i]] = item[i];
+          }
+          delete item[i]; //删除原先的对象属性
+      }
   })
-  // 创建工作簿
-  const wb = XLSX.utils.book_new()
-  // 将工作表放入工作簿中
-  XLSX.utils.book_append_sheet(wb, data, 'data')
-  // 生成文件并下载
-  XLSX.writeFile(wb, filename+'.xlsxx')
+
+  let sheetName = filename //excel的文件名称
+  let wb = XLSX.utils.book_new()  //工作簿对象包含一SheetNames数组,以及一个表对象映射表名称到表对象。XLSX.utils.book_new实用函数创建一个新的工作簿对象。
+  let ws = XLSX.utils.json_to_sheet(json, { header: Object.values(fields) }) //将JS对象数组转换为工作表。
+  wb.SheetNames.push(sheetName)
+  wb.Sheets[sheetName] = ws
+  const defaultCellStyle = { font: { name: "Verdana", sz: 13, color: "FF00FF88" }, fill: { fgColor: { rgb: "FFFFAA00" } } };//设置表格的样式
+  let wopts = { bookType: 'xlsx', bookSST: false, type: 'binary', cellStyles: true, defaultCellStyle: defaultCellStyle, showGridLines: false }  //写入的样式
+  let wbout = XLSX.write(wb, wopts)
+  let blob = new Blob([s2ab(wbout)], { type: 'application/octet-stream' })
+  fs.saveAs(blob, filename + '.xlsx')
+}
+const s2ab = s => {
+  if (typeof ArrayBuffer !== 'undefined') {
+      var buf = new ArrayBuffer(s.length)
+      var view = new Uint8Array(buf)
+      for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
+      return buf
+  } else {
+      var buf = new Array(s.length);
+      for (var i = 0; i != s.length; ++i) buf[i] = s.charCodeAt(i) & 0xFF;
+      return buf;
+  }
 }
 
 /**

+ 8 - 4
src/views/customer/modal/InfoModal.vue

@@ -2,14 +2,14 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="新增客户"
+    :title="title"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
     :min-height="0"
   >
     <div class="pt-2px pr-3px">
-      <BasicForm @register="registerForm" :model="model">
+      <BasicForm @register="registerForm" >
         <template #text="{ model, field }">
           {{ model[field] }}
         </template>
@@ -39,7 +39,7 @@
         file: null,
       });
       const { createMessage } = useMessage();
-
+      const title = ref('新增客户')
       const schemas: FormSchema[] = [
         {
           component: 'Divider',
@@ -198,6 +198,7 @@
       let addListFunc = () => {};
       const [register, { closeModal }] = useModalInner((data) => {
         if (data) {
+          title.value ='编辑客户'
           modelRef.value = data;
           setFieldsValue({
             ...data,
@@ -205,6 +206,8 @@
             qrLogo: data.qrLogo ? [data.qrLogo] : [],
             topLogo: data.topLogo ? [data.topLogo] : [],
           });
+        }else{
+          title.value ='新增客户'
         }
       });
 
@@ -251,12 +254,13 @@
         register,
         schemas,
         registerForm,
-        model: modelRef,
+        modelRef,
         fileFlow,
         handleVisibleChange,
         handleSubmit,
         addListFunc,
         resetFields,
+        title,
         t,
       };
     },

+ 7 - 4
src/views/dashboard/analysis/components/lineEcharts.vue

@@ -67,14 +67,17 @@ function handleChange(val){
 }
 function handleExport(){
   console.log('props',props.propsData)
-  let hader = ['日期', '数量']
+  let fields  = {
+    'time':'日期',
+    'num':'数量',
+  }
     let data = props.propsData.xData.map((ele,index) => {
       return {
-        '日期':ele,
-        '数量':props.propsData.yData && props.propsData.yData[index] || 0,
+        'time':ele,
+        'num':props.propsData.yData && props.propsData.yData[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'用户趋势')
+    exportElsxFile(data, fields,'用户趋势')
 }
 watch(
   () => props.propsData,

+ 11 - 6
src/views/dashboard/analysis/components/lineEcharts2.vue

@@ -61,16 +61,21 @@
     emit('change',{type:'order',value:val})
   }
   function handleExport(){
-    let hader = ['时间', ...nameList.value]
+    let fields  = {
+    'time':'日期',
+    'd':'下载订单',
+    'e':'权益订单',
+    'p':'配件订单',
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '时间':ele,
-        '下载订单':downOrderData.value && downOrderData.value[index] || 0,
-        '权益订单':incrementOrderData.value && incrementOrderData.value[index] || 0,
-        '配件订单':partsOrderData.value && partsOrderData.value[index] || 0,
+        'time':ele,
+        'd':downOrderData.value && downOrderData.value[index] || 0,
+        'e':incrementOrderData.value && incrementOrderData.value[index] || 0,
+        'p':partsOrderData.value && partsOrderData.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'订单趋势')
+    exportElsxFile(data, fields,'订单趋势')
   }
   function handlesetOptions() {
     setOptions({

+ 13 - 7
src/views/dashboard/analysis/components/orderEchart.vue

@@ -61,17 +61,23 @@
   }
   
   function handleExport(){
-    let hader = ['时间', '看见场景','看看场景','深时场景','点云场景']
+    let fields  = {
+    'time':'日期',
+    'kj':'看见场景',
+    'kk':'看看场景',
+    'ss':'深时场景',
+    'dy':'点云场景',
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '时间':ele,
-        '看见场景':kjList.value && kjList.value[index] || 0,
-        '看看场景':kkList.value && kkList.value[index] || 0,
-        '深时场景':ssList.value && ssList.value[index] || 0,
-        '点云场景':ssobjList.value && ssobjList.value[index] || 0,
+        'time':ele,
+        'kj':kjList.value && kjList.value[index] || 0,
+        'kk':kkList.value && kkList.value[index] || 0,
+        'ss':ssList.value && ssList.value[index] || 0,
+        'dy':ssobjList.value && ssobjList.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'场景趋势')
+    exportElsxFile(data,fields,'场景趋势')
   }
 
   function handlesetOptions() {

+ 1 - 2
src/views/dashboard/analysis/index.vue

@@ -129,7 +129,7 @@ async function getData() {
         title: '上月配件订单数',
         icon: 'transaction|svg',
         value: preMonThPartCount,
-        unit: '',
+        unit: '',
         color: 'blue',
         action: '月',
       },
@@ -188,7 +188,6 @@ async function getOrder() {
       'order':incrementExport,
       'scene':downExport,
     }
-    console.log('exportElsxFile',obj[val])
   }
 
   function Search(val){

+ 1 - 6
src/views/invoice/InvoiceModal.vue

@@ -150,16 +150,11 @@
             }
           }
           console.log('res', apiData,params);
-          const {data} = await InvoiceRegister(apiData);
-          console.log('res', data);
-          if(data.code !== ResultEnum.SUCCESS){
-            createMessage.error(  data.message  ||  t('common.optFail'))
-          }else{
+          await InvoiceRegister(apiData);
           closeModal();
           resetFields();
           createMessage.success(t('common.optSuccess'));
           emit('update');
-          }
         } catch (error) {
           console.log('not passing', error);
         }

+ 2 - 2
src/views/operate/components/new/addModal.vue

@@ -82,8 +82,8 @@
             accept: ['jpeg','jpg','png'],
             afterFetch: function (data) {
               console.log('uploadApi',data)
-              Reflect.set(data, 'url', data.data);
-              fileFlow.coverImageUrl = data.data
+              // Reflect.set(data, 'url', data);
+              fileFlow.coverImageUrl = data
               return data;
             },
           },

+ 4 - 1
src/views/operate/components/recruit/addModal.vue

@@ -2,7 +2,7 @@
   <BasicModal
     v-bind="$attrs"
     @register="register"
-    title="新增职位"
+    :title="title"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
     @ok="handleSubmit"
@@ -35,6 +35,7 @@
     emits: ['update', 'register'],
     setup(props, { emit }) {
       const modelRef = ref({});
+      const title = ref('新增职位');
       const fileFlow = reactive({
         coverImageUrl:''
       })
@@ -134,6 +135,7 @@
       });
       async function onDataReceive(data) {
         modelRef.value = data
+        title.value = data?'编辑职位':'新增职位'
         resetFields();
         setFieldsValue(data);
       }
@@ -167,6 +169,7 @@
       return {
         register,
         schemas,
+        title,
         registerForm,
         model: modelRef,
         fileFlow,

+ 12 - 0
src/views/order/cameraList.vue

@@ -131,6 +131,7 @@
       ];
       const searchForm: Partial<FormProps> = {
         labelWidth: 80,
+        autoAdvancedLine:1,
         autoSubmitOnEnter:true,
         schemas: [
           {
@@ -173,6 +174,17 @@
               xl: 6,
               xxl: 6,
             },
+          },{
+            field: 'tradeNum',
+            label: '交易号',
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 7,
+              xxl: 7,
+            },
           },
         ],
       };

+ 2 - 2
src/views/order/downloadList.vue

@@ -145,7 +145,7 @@
             },
           },{
             field: 'userName',
-            label: '手机号',
+            label: '用户账号',
             component: 'Input',
             componentProps: {
               maxLength: 100,
@@ -156,7 +156,7 @@
             },
           },{
             field: 'tradeNum',
-            label: '支付平台交易号',
+            label: '交易号',
             component: 'Input',
             componentProps: {
               maxLength: 100,

+ 4 - 4
src/views/order/equityList.vue

@@ -76,7 +76,7 @@
           width: 180,
         },
         {
-          title: '用户',
+          title: '用户账号',
           dataIndex: 'userName',
           width: 100,
         },
@@ -142,7 +142,7 @@
             },
           },{
             field: 'userName',
-            label: '手机号',
+            label: '用户账号',
             component: 'Input',
             componentProps: {
               maxLength: 100,
@@ -152,8 +152,8 @@
               xxl: 7,
             },
           },{
-            field: 'sceneName',
-            label: '支付平台交易号',
+            field: 'tradeNum',
+            label: '交易号',
             component: 'Input',
             componentProps: {
               maxLength: 100,

+ 2 - 2
src/views/product/firmware/AddModal.vue

@@ -58,7 +58,7 @@
           },
           componentProps:{
             maxLength: 15,
-            placeholder:t('common.inputText')+t('routes.product.version'),
+            placeholder:t('common.inputText')+t('routes.product.versionPlaceholder'),
           },
           rules: [
             {
@@ -91,7 +91,7 @@
           required: true,
           componentProps:{
             maxLength: 15,
-            placeholder:t('common.inputText')+t('routes.product.version'),
+            placeholder:t('common.inputText')+t('routes.product.minVersion')+t('routes.product.versionTips'),
           },
           rules: [
             {

+ 3 - 0
src/views/product/firmware/EditModal.vue

@@ -102,6 +102,9 @@
           component: 'Input',
           label: t('routes.product.minVersion'),
           required: true,
+          componentProps: {
+            
+          },
           rules: [
             {
               required: true,

+ 2 - 2
src/views/productOperation/cameraScene.vue

@@ -335,12 +335,12 @@
             sceneCopy({ num: record.num })
               .then(() => {
                 message.success({
-                  content: '删除成功',
+                  content: '复制成功',
                 });
               })
               .catch(() => {
                 message.success({
-                  content: '删除失败',
+                  content: '复制失败',
                 });
               });
           },

+ 7 - 4
src/views/statistics/components/activelineEchart.vue

@@ -83,14 +83,17 @@
   }
   function handleExport(){
   console.log('props',props.propsData)
-  let hader = ['日期', '数量']
+  let fields  = {
+    'time':'日期',
+    'num':'数量',
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '日期':ele,
-        '数量':viewStaticsData.value && viewStaticsData.value[index] || 0,
+        'time':ele,
+        'num':viewStaticsData.value && viewStaticsData.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'用户趋势')
+    exportElsxFile(data, fields,'用户趋势')
 }
   async function getAddUser() {
     let xdata = [], yData=[]

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

@@ -69,7 +69,7 @@ const typeOptions = ref<SelectProps['options']>([
   },
   {
     value: '1',
-    label: props.name && props.name[1] || '累',
+    label: props.name && props.name[1] || '累',
   },
 ]);
 function handleData(val) {

+ 11 - 5
src/views/statistics/components/orderEchart.vue

@@ -34,15 +34,21 @@
   function expor(val){
     // emit('expor',val)
     let hader = ['时间', ...nameList.value]
+    let fields  = {
+    'time':'日期',
+    '1':hader[1],
+    '2':hader[2],
+    '3':hader[3],
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '时间':ele,
-        [hader[1]]:downOrderData.value && downOrderData.value[index] || 0,
-        [hader[2]]:incrementOrderData.value && incrementOrderData.value[index] || 0,
-        [hader[3]]:partsOrderData.value && partsOrderData.value[index] || 0,
+        'time':ele,
+        '1':downOrderData.value && downOrderData.value[index] || 0,
+        '2':incrementOrderData.value && incrementOrderData.value[index] || 0,
+        '3':partsOrderData.value && partsOrderData.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,props.title)
+    exportElsxFile(data,fields,props.title)
   }
   function handlesetOptions() {
     console.log('handlesetOptions',downOrderData.value,partsOrderData.value,partsOrderData.value,yixStringData.value)

+ 13 - 7
src/views/statistics/components/sceneEchart.vue

@@ -34,17 +34,23 @@
   }
   function expor(val){
     // emit('expor',val)
-    let hader = ['时间', ...nameList.value]
+    let fields  = {
+    'time':'日期',
+    'kj':'看见场景',
+    'kk':'看看场景',
+    'ss':'深时场景',
+    'dy':'点云场景',
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '时间':ele,
-        '看见场景':kjList.value && kjList.value[index] || 0,
-        '看看场景':kkList.value && kkList.value[index] || 0,
-        '深时场景':ssList.value && ssList.value[index] || 0,
-        '点云场景':ssobjList.value && ssobjList.value[index] || 0,
+        'time':ele,
+        'kj':kjList.value && kjList.value[index] || 0,
+        'kk':kkList.value && kkList.value[index] || 0,
+        'ss':ssList.value && ssList.value[index] || 0,
+        'dy':ssobjList.value && ssobjList.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'订单数据')
+    exportElsxFile(data,fields,'订单数据')
   }
   function handlesetOptions() {
     setOptions({

+ 8 - 5
src/views/statistics/components/scenelineEcharts.vue

@@ -1,5 +1,5 @@
 <template>
-  <Card title="成交占比" :loading="loading">
+  <Card title="用户趋势分析" :loading="loading">
     <template #extra>
       <condition type="2" @change="Search"  @expor="handleExport" />
       <!-- <div class="condition">
@@ -83,14 +83,17 @@
   }
   function handleExport(){
   console.log('props',props.propsData)
-  let hader = ['日期', '数量']
+  let fields  = {
+    'time':'日期',
+    'num':'数量',
+  }
     let data = yixStringData.value.map((ele,index) => {
       return {
-        '日期':ele,
-        '数量':viewStaticsData.value && viewStaticsData.value[index] || 0,
+        'time':ele,
+        'num':viewStaticsData.value && viewStaticsData.value[index] || 0,
       }
     })
-    exportElsxFile(hader,data,'用户趋势')
+    exportElsxFile(data, fields,'用户趋势')
 }
   async function getAddUser() {
     let xdata = [], yData=[]

+ 3 - 3
src/views/statistics/order/index.vue

@@ -58,7 +58,7 @@
         title: '上月权益订单数',
         icon: 'fxemoji:notchedrightsemi3dot',
         value: preMonThPowCount,
-        unit: '',
+        unit: '',
         color: 'blue',
         action: '月',
       },
@@ -66,7 +66,7 @@
         title: '上月下载订单数',
         icon: 'download-count|svg',
         value: preMonThDownCount,
-        unit: '',
+        unit: '',
         color: 'orange',
         action: '月',
       },
@@ -74,7 +74,7 @@
         title: '上月配件订单数',
         icon: 'transaction|svg',
         value: preMonThPartCount,
-        unit: '',
+        unit: '',
         color: 'blue',
         action: '月',
       },

+ 1 - 1
src/views/system/menu/menu.data.ts

@@ -201,7 +201,7 @@ export const formSchema: FormSchema[] = [
   {
     field: 'sort',
     label: t('routes.system.sortOrder'),
-    defaultValue: 0,
+    defaultValue: 1,
     component: 'InputNumber',
     componentProps: {
       min:0

+ 5 - 0
yarn.lock

@@ -5247,6 +5247,11 @@ file-entry-cache@^6.0.1:
   dependencies:
     flat-cache "^3.0.4"
 
+file-saver@^2.0.5:
+  version "2.0.5"
+  resolved "http://192.168.0.47:4873/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38"
+  integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
+
 file-type@5.2.0, file-type@^5.2.0:
   version "5.2.0"
   resolved "https://registry.npmmirror.com/file-type/-/file-type-5.2.0.tgz"