Kaynağa Gözat

feat: Abench export

chenlei 19 saat önce
ebeveyn
işleme
52c05fe61e

+ 8 - 0
src/pages/Abench/A1statistics/index.module.scss

@@ -1,5 +1,13 @@
 .A1statistics {
   padding: 24px;
+
+  .A1export {
+    position: absolute;
+    top: -75px;
+    left: 130px;
+    z-index: 1;
+  }
+
   :global {
     .A1_1 {
       display: flex;

+ 99 - 2
src/pages/Abench/A1statistics/index.tsx

@@ -1,7 +1,8 @@
 import React, { useCallback, useEffect, useRef, useState } from 'react'
 import styles from './index.module.scss'
-import { Select } from 'antd'
+import { Button, Select } from 'antd'
 import { iconUrl } from '@/utils/http'
+import * as xlsx from 'xlsx'
 import * as echarts from 'echarts'
 import {
   A1_APIworkCount,
@@ -474,9 +475,105 @@ function A1statistics() {
     binInitFu(categoryData, document.querySelector('#echBox4'))
   }, [binInitFu, categoryData])
 
+  // 数据导出
+  const dataExport = useCallback(() => {
+    const wb = xlsx.utils.book_new()
+
+    // 汇总数据
+    const summaryData = [
+      { 指标: '藏品总数', 数值: totalStats?.totalCount ?? '-', 单位: '件/套' },
+      { 指标: '藏品总数量', 数值: totalStats?.totalPcs ?? '-', 单位: '个' },
+      { 指标: '定级文物数量', 数值: totalStats?.leveledCount ?? '-', 单位: '件/套' },
+      { 指标: '一级文物', 数值: totalStats?.level1 ?? 0, 单位: '件/套' },
+      { 指标: '二级文物', 数值: totalStats?.level2 ?? 0, 单位: '件/套' },
+      { 指标: '三级文物', 数值: totalStats?.level3 ?? 0, 单位: '件/套' },
+      { 指标: '一般文物', 数值: totalStats?.level4 ?? 0, 单位: '件/套' },
+      { 指标: `年度新增产品数量(${yearCountYear}年)`, 数值: yearCount ?? '-', 单位: '件/套' }
+    ]
+    const wsSummary = xlsx.utils.json_to_sheet(summaryData)
+    wsSummary['!cols'] = [{ wpx: 180 }, { wpx: 100 }, { wpx: 80 }]
+    xlsx.utils.book_append_sheet(wb, wsSummary, '汇总')
+
+    // 一级分类
+    const level1SheetData = level1Data.map((it, i) => ({
+      序号: i + 1,
+      分类名称: it.name,
+      数量: it.value
+    }))
+    if (level1SheetData.length) {
+      const ws1 = xlsx.utils.json_to_sheet(level1SheetData)
+      ws1['!cols'] = [{ wpx: 60 }, { wpx: 150 }, { wpx: 80 }]
+      xlsx.utils.book_append_sheet(wb, ws1, '一级分类')
+    }
+
+    // 二级分类
+    const level2SheetData = level2Data.map((it, i) => ({
+      序号: i + 1,
+      分类名称: it.name,
+      数量: it.value
+    }))
+    if (level2SheetData.length) {
+      const ws2 = xlsx.utils.json_to_sheet(level2SheetData)
+      ws2['!cols'] = [{ wpx: 60 }, { wpx: 150 }, { wpx: 80 }]
+      xlsx.utils.book_append_sheet(wb, ws2, '二级分类')
+    }
+
+    // 材质统计(当前筛选)
+    const textureSheetData = textureData.map((it, i) => ({
+      序号: i + 1,
+      材质: it.name,
+      数量: it.value
+    }))
+    if (textureSheetData.length) {
+      const ws3 = xlsx.utils.json_to_sheet(textureSheetData)
+      ws3['!cols'] = [{ wpx: 60 }, { wpx: 150 }, { wpx: 80 }]
+      const tagName = (textureOptions.find(t => t.id === textureTagId)?.name ?? '').replace(
+        /[\\/*?:[\]]/g,
+        ''
+      )
+      xlsx.utils.book_append_sheet(wb, ws3, tagName ? `材质_${tagName.slice(0, 20)}` : '材质统计')
+    }
+
+    // 品类统计(当前筛选)
+    const categorySheetData = categoryData.map((it, i) => ({
+      序号: i + 1,
+      品类: it.name,
+      数量: it.value
+    }))
+    if (categorySheetData.length) {
+      const ws4 = xlsx.utils.json_to_sheet(categorySheetData)
+      ws4['!cols'] = [{ wpx: 60 }, { wpx: 150 }, { wpx: 80 }]
+      const tagName = (categoryOptions.find(c => c.id === categoryTagId)?.name ?? '').replace(
+        /[\\/*?:[\]]/g,
+        ''
+      )
+      xlsx.utils.book_append_sheet(wb, ws4, tagName ? `品类_${tagName.slice(0, 20)}` : '品类统计')
+    }
+
+    const fileName = `数据统计_${new Date().toISOString().slice(0, 10)}.xlsx`
+    xlsx.writeFile(wb, fileName)
+  }, [
+    totalStats,
+    yearCount,
+    yearCountYear,
+    level1Data,
+    level2Data,
+    textureData,
+    textureTagId,
+    textureOptions,
+    categoryData,
+    categoryTagId,
+    categoryOptions
+  ])
+
   return (
     <div className={styles.A1statistics}>
-      <div className='pageTitle'>数据统计</div>
+      <div className={styles.A1header}>
+        <div className='pageTitle'>数据统计</div>
+        <Button className={styles.A1export} type='primary' onClick={dataExport}>
+          数据导出
+        </Button>
+      </div>
 
       <div className='A1_1'>
         <div>