Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/types/components.d.ts
yangyuxuan 4 месяцев назад
Родитель
Сommit
c147f4f2f1

+ 14 - 0
src/types/components.d.ts

@@ -27,6 +27,9 @@ declare module 'vue' {
     ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
+    ElCheckboxButton: typeof import('element-plus/es')['ElCheckboxButton']
+    ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
@@ -43,6 +46,7 @@ declare module 'vue' {
     ElIcon: typeof import('element-plus/es')['ElIcon']
     ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
+    ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
@@ -51,15 +55,25 @@ declare module 'vue' {
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSkeleton: typeof import('element-plus/es')['ElSkeleton']
+    ElSkeletonItem: typeof import('element-plus/es')['ElSkeletonItem']
+    ElSlider: typeof import('element-plus/es')['ElSlider']
+    ElStep: typeof import('element-plus/es')['ElStep']
+    ElSteps: typeof import('element-plus/es')['ElSteps']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
+    ElTimeline: typeof import('element-plus/es')['ElTimeline']
+    ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
     ElTimePicker: typeof import('element-plus/es')['ElTimePicker']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
     ElTree: typeof import('element-plus/es')['ElTree']
+    ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
     ElUpload: typeof import('element-plus/es')['ElUpload']
     ExcelEditor: typeof import('./../components/ExcelEditor/index.vue')['default']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']

+ 37 - 1
src/views/globalMap/RightMenu/SpatialAnalysis.vue

@@ -29,7 +29,8 @@
         <div v-for="(item, index) in filteredList" :key="index" class="item2">{{ item.name + '(' + item.list.length + ')' }}</div>
       </div>
     </div>
-    <Dialog v-model="showDetail" title="空间分析" height="760px" hide-footer>
+    <Dialog v-if="showDetail" v-model="showDetail" title="空间分析" height="760px" hide-footer>
+      <div class="common-btn-primary export-btn" @click="exportData">导出</div>
       <div class="common-table">
         <div class="table-header">
           <div class="td">序号</div>
@@ -56,6 +57,7 @@
 import { validateNum } from '@/utils/ruoyi';
 import { getSpatialAnalysis } from '@/api/globalMap';
 import { deepClone } from '@/utils';
+import * as XLSX from 'xlsx';
 
 const props = defineProps({
   updateLocation: []
@@ -147,6 +149,35 @@ let showDetail = ref(false);
 const handleShowDetail = () => {
   showDetail.value = true;
 };
+// 导出
+const exportData = () => {
+  let jsonData = [];
+  const headerMap = {
+    townName: '行政镇',
+    villageName: '行政村',
+    populationSize: '常住人口(万)',
+    areaSize: '面积(km2)',
+    GDP: 'GDP(亿元)'
+  };
+  const orderedKeys = Object.keys(headerMap);
+  analysisData.value.townData.forEach((item) => {
+    const newItem = {};
+    Object.keys(item).forEach((key) => {
+      if (headerMap[key]) {
+        newItem[headerMap[key]] = item[key];
+      }
+    });
+    jsonData.push(newItem);
+  });
+  const worksheet = XLSX.utils.json_to_sheet(jsonData, {
+    header: orderedKeys.map((key) => headerMap[key]) // 按 headerMap 顺序传递中文表头
+  });
+  // 创建工作簿并添加工作表
+  const workbook = XLSX.utils.book_new();
+  XLSX.utils.book_append_sheet(workbook, worksheet, 'Sheet1');
+  // 导出文件
+  XLSX.writeFile(workbook, '空间分析数据.xlsx');
+};
 </script>
 
 <style lang="scss" scoped>
@@ -200,4 +231,9 @@ const handleShowDetail = () => {
   border-radius: 4px;
   margin-top: 5px;
 }
+.export-btn {
+  position: absolute;
+  right: 20px;
+  top: 55px;
+}
 </style>

+ 7 - 1
src/views/globalMap/index.vue

@@ -295,7 +295,13 @@ const handleHideCommunicationSupport = () => {
 const findChecked = (dataList, name) => {
   let index = 0;
   dataList.forEach((item) => {
-    if (!['易涝隐患点', '省政务无人机', '铁塔运行监测', '通讯保障', '救援队伍', '重点车辆', '附近视频'].includes(item.name) && item.name !== name && !item.isVideo && item.path === '2' && !!item.checked) {
+    if (
+      !['易涝隐患点', '省政务无人机', '铁塔运行监测', '通讯保障', '救援队伍', '重点车辆', '附近视频'].includes(item.name) &&
+      item.name !== name &&
+      !item.isVideo &&
+      item.path === '2' &&
+      !!item.checked
+    ) {
       index++;
     }
     if (item.children && item.children.length > 0) {