From df07fa2662110d6069071e11915e2f6cea2f400b Mon Sep 17 00:00:00 2001
From: yaowanxin <3588231647@qq.com>
Date: 星期四, 18 九月 2025 13:49:55 +0800
Subject: [PATCH] Merge branch 'dev' into ywx

---
 src/assets/indexViews/TJXMView.png                                     |    0 
 src/views/index.vue                                                    |    1 
 src/assets/BI/yuancailiaoyijianicon@2x.png                             |    0 
 src/views/personnelManagement/payrollManagement/components/formDia.vue |    2 
 src/assets/BI/jiantou@2x.png                                           |    0 
 src/api/financialManagement/expenseManagement.js                       |    7 
 src/assets/BI/shujutongjiicon@2x.png                                   |    0 
 src/assets/indexViews/TJXMLogo.png                                     |    0 
 src/assets/BI/shijianmingxiicon@2x.png                                 |    0 
 src/components/Echarts/echarts.vue                                     |    8 
 src/layout/components/Sidebar/Logo.vue                                 |    2 
 index.html                                                             |    4 
 src/assets/BI/border@2x.png                                            |    0 
 src/assets/BI/hetongjineicon1@2x.png                                   |    0 
 vite.config.js                                                         |  164 +-
 src/assets/indexViews/HHKJLogo.png                                     |    0 
 src/assets/BI/guochengyijianicon@2x.png                                |    0 
 src/assets/indexViews/RZNYView.png                                     |    0 
 src/assets/BI/chuchangyijianicon@2x.png                                |    0 
 src/assets/BI/caiwufenxiback@2x.png                                    |    0 
 src/assets/indexViews/RZNYLogo.png                                     |    0 
 src/assets/indexViews/XYHBLogo.png                                     |    0 
 src/assets/BI/shujutongji@2x.png                                       |    0 
 src/assets/BI/hetongicon.png                                           |    0 
 src/assets/BI/backImage@2x.png                                         |    0 
 src/router/index.js                                                    |   35 
 src/assets/indexViews/XYHBView.png                                     |    0 
 .env.development                                                       |    4 
 public/HHKJIco.ico                                                     |    0 
 src/assets/BI/hetongjineicon@2x.png                                    |    0 
 src/main.js                                                            |  226 +-
 .env.production                                                        |    4 
 public/RZNY.ico                                                        |    0 
 src/assets/indexViews/LCLogo.png                                       |    0 
 src/assets/BI/icon@2x.png                                              |    0 
 src/views/reportAnalysis/dataDashboard/index.vue                       | 1478 ++++++++++++++++++++++++
 src/assets/indexViews/MXSCLogo.png                                     |    0 
 src/assets/BI/zonghetongbingtubiankuang@2x.png                         |    0 
 .env.staging                                                           |    4 
 public/TJXM.ico                                                        |    0 
 src/assets/BI/hetongjineback@2x.png                                    |    0 
 public/MXSCIco.ico                                                     |    0 
 public/XYHBico.ico                                                     |    0 
 src/assets/BI/biaoti.png                                               |    0 
 src/assets/BI/pieback@2x.png                                           |    0 
 src/views/salesManagement/receiptPayment/index.vue                     |   48 
 src/assets/BI/kehuhetongback@2x.png                                    |    0 
 src/assets/indexViews/MXSCBack.png                                     |    0 
 src/assets/BI/shijianmingchengbeijing@2x.png                           |    0 
 src/assets/indexViews/HHKJView.png                                     |    0 
 src/views/login.vue                                                    |    4 
 src/assets/BI/hetongtitleback@2x.png                                   |    0 
 src/views/energyManagement/carbonManagement/index.vue                  | 1553 +++++++++++++++++++++++++
 package.json                                                           |    3 
 54 files changed, 3,299 insertions(+), 248 deletions(-)

diff --git a/.env.development b/.env.development
index 68fafb1..6df7fee 100644
--- a/.env.development
+++ b/.env.development
@@ -1,8 +1,8 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
+VITE_APP_TITLE = 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�
 
 # 寮�鍙戠幆澧冮厤缃�
 VITE_APP_ENV = 'development'
 
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/寮�鍙戠幆澧�
+# 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�/寮�鍙戠幆澧�
 VITE_APP_BASE_API = '/dev-api'
diff --git a/.env.production b/.env.production
index cd8fc96..cd8dfbe 100644
--- a/.env.production
+++ b/.env.production
@@ -1,10 +1,10 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
+VITE_APP_TITLE = 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�
 
 # 鐢熶骇鐜閰嶇疆
 VITE_APP_ENV = 'production'
 
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/鐢熶骇鐜
+# 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�/鐢熶骇鐜
 VITE_APP_BASE_API = '/prod-api'
 
 # 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
diff --git a/.env.staging b/.env.staging
index 22c164d..1f28ac6 100644
--- a/.env.staging
+++ b/.env.staging
@@ -1,10 +1,10 @@
 # 椤甸潰鏍囬
-VITE_APP_TITLE = 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺
+VITE_APP_TITLE = 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�
 
 # 鐢熶骇鐜閰嶇疆
 VITE_APP_ENV = 'staging'
 
-# 鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺/鐢熶骇鐜
+# 娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�/鐢熶骇鐜
 VITE_APP_BASE_API = '/stage-api'
 
 # 鏄惁鍦ㄦ墦鍖呮椂寮�鍚帇缂╋紝鏀寔 gzip 鍜� brotli
diff --git a/index.html b/index.html
index b45cb21..d14eb4b 100644
--- a/index.html
+++ b/index.html
@@ -8,8 +8,8 @@
       name="viewport"
       content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"
     />
-    <link rel="icon" href="/DHDCico.ico" />
-    <title>鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺</title>
+    <link rel="icon" href="/ZQHXico.ico" />
+    <title>娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�</title>
     <!--[if lt IE 11
       ]><script>
         window.location.href = "/html/ie.html";
diff --git a/package.json b/package.json
index ac73018..9f1dc17 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "ruoyi",
   "version": "3.8.9",
-  "description": "鏁︾厡榧庤瘹绠$悊淇℃伅绯荤粺",
+  "description": "娴嬭瘯杩涢攢瀛樼鐞嗙郴缁�",
   "author": "鑻ヤ緷",
   "license": "MIT",
   "type": "module",
@@ -21,6 +21,7 @@
     "@vue-office/excel": "^1.7.14",
     "@vueup/vue-quill": "1.2.0",
     "@vueuse/core": "10.11.0",
+    "autofit.js": "^3.2.8",
     "axios": "0.28.1",
     "clipboard": "2.0.11",
     "dayjs": "^1.11.13",
diff --git a/public/HHKJIco.ico b/public/HHKJIco.ico
new file mode 100644
index 0000000..2554cbf
--- /dev/null
+++ b/public/HHKJIco.ico
Binary files differ
diff --git a/public/MXSCIco.ico b/public/MXSCIco.ico
new file mode 100644
index 0000000..2214848
--- /dev/null
+++ b/public/MXSCIco.ico
Binary files differ
diff --git a/public/RZNY.ico b/public/RZNY.ico
new file mode 100644
index 0000000..c2f4ba5
--- /dev/null
+++ b/public/RZNY.ico
Binary files differ
diff --git a/public/TJXM.ico b/public/TJXM.ico
new file mode 100644
index 0000000..dcc4fa5
--- /dev/null
+++ b/public/TJXM.ico
Binary files differ
diff --git a/public/XYHBico.ico b/public/XYHBico.ico
new file mode 100644
index 0000000..3bee1fc
--- /dev/null
+++ b/public/XYHBico.ico
Binary files differ
diff --git a/src/api/financialManagement/expenseManagement.js b/src/api/financialManagement/expenseManagement.js
index 317dc47..a22af1b 100644
--- a/src/api/financialManagement/expenseManagement.js
+++ b/src/api/financialManagement/expenseManagement.js
@@ -8,6 +8,13 @@
     params,
   });
 };
+export const listPageAnalysis = (params) => {
+  return request({
+    url: "/account/accountExpense/report/analysis",
+    method: "get",
+    params,
+  });
+};
 
 // 鏂板
 export function add(data) {
diff --git a/src/assets/BI/backImage@2x.png b/src/assets/BI/backImage@2x.png
new file mode 100644
index 0000000..5c62ec6
--- /dev/null
+++ b/src/assets/BI/backImage@2x.png
Binary files differ
diff --git a/src/assets/BI/biaoti.png b/src/assets/BI/biaoti.png
new file mode 100644
index 0000000..f905f1c
--- /dev/null
+++ b/src/assets/BI/biaoti.png
Binary files differ
diff --git a/src/assets/BI/border@2x.png b/src/assets/BI/border@2x.png
new file mode 100644
index 0000000..07555cb
--- /dev/null
+++ b/src/assets/BI/border@2x.png
Binary files differ
diff --git a/src/assets/BI/caiwufenxiback@2x.png b/src/assets/BI/caiwufenxiback@2x.png
new file mode 100644
index 0000000..3f242d4
--- /dev/null
+++ b/src/assets/BI/caiwufenxiback@2x.png
Binary files differ
diff --git a/src/assets/BI/chuchangyijianicon@2x.png b/src/assets/BI/chuchangyijianicon@2x.png
new file mode 100644
index 0000000..bc3677a
--- /dev/null
+++ b/src/assets/BI/chuchangyijianicon@2x.png
Binary files differ
diff --git a/src/assets/BI/guochengyijianicon@2x.png b/src/assets/BI/guochengyijianicon@2x.png
new file mode 100644
index 0000000..0c64bdc
--- /dev/null
+++ b/src/assets/BI/guochengyijianicon@2x.png
Binary files differ
diff --git a/src/assets/BI/hetongicon.png b/src/assets/BI/hetongicon.png
new file mode 100644
index 0000000..60c2f0e
--- /dev/null
+++ b/src/assets/BI/hetongicon.png
Binary files differ
diff --git a/src/assets/BI/hetongjineback@2x.png b/src/assets/BI/hetongjineback@2x.png
new file mode 100644
index 0000000..c15ed6a
--- /dev/null
+++ b/src/assets/BI/hetongjineback@2x.png
Binary files differ
diff --git a/src/assets/BI/hetongjineicon1@2x.png b/src/assets/BI/hetongjineicon1@2x.png
new file mode 100644
index 0000000..38c86da
--- /dev/null
+++ b/src/assets/BI/hetongjineicon1@2x.png
Binary files differ
diff --git a/src/assets/BI/hetongjineicon@2x.png b/src/assets/BI/hetongjineicon@2x.png
new file mode 100644
index 0000000..60c2f0e
--- /dev/null
+++ b/src/assets/BI/hetongjineicon@2x.png
Binary files differ
diff --git a/src/assets/BI/hetongtitleback@2x.png b/src/assets/BI/hetongtitleback@2x.png
new file mode 100644
index 0000000..c15ed6a
--- /dev/null
+++ b/src/assets/BI/hetongtitleback@2x.png
Binary files differ
diff --git a/src/assets/BI/icon@2x.png b/src/assets/BI/icon@2x.png
new file mode 100644
index 0000000..267a738
--- /dev/null
+++ b/src/assets/BI/icon@2x.png
Binary files differ
diff --git a/src/assets/BI/jiantou@2x.png b/src/assets/BI/jiantou@2x.png
new file mode 100644
index 0000000..38c86da
--- /dev/null
+++ b/src/assets/BI/jiantou@2x.png
Binary files differ
diff --git a/src/assets/BI/kehuhetongback@2x.png b/src/assets/BI/kehuhetongback@2x.png
new file mode 100644
index 0000000..22a7ead
--- /dev/null
+++ b/src/assets/BI/kehuhetongback@2x.png
Binary files differ
diff --git a/src/assets/BI/pieback@2x.png b/src/assets/BI/pieback@2x.png
new file mode 100644
index 0000000..c8930cc
--- /dev/null
+++ b/src/assets/BI/pieback@2x.png
Binary files differ
diff --git a/src/assets/BI/shijianmingchengbeijing@2x.png b/src/assets/BI/shijianmingchengbeijing@2x.png
new file mode 100644
index 0000000..0ed2813
--- /dev/null
+++ b/src/assets/BI/shijianmingchengbeijing@2x.png
Binary files differ
diff --git a/src/assets/BI/shijianmingxiicon@2x.png b/src/assets/BI/shijianmingxiicon@2x.png
new file mode 100644
index 0000000..3c3a7b7
--- /dev/null
+++ b/src/assets/BI/shijianmingxiicon@2x.png
Binary files differ
diff --git a/src/assets/BI/shujutongji@2x.png b/src/assets/BI/shujutongji@2x.png
new file mode 100644
index 0000000..69b6834
--- /dev/null
+++ b/src/assets/BI/shujutongji@2x.png
Binary files differ
diff --git a/src/assets/BI/shujutongjiicon@2x.png b/src/assets/BI/shujutongjiicon@2x.png
new file mode 100644
index 0000000..780fc22
--- /dev/null
+++ b/src/assets/BI/shujutongjiicon@2x.png
Binary files differ
diff --git a/src/assets/BI/yuancailiaoyijianicon@2x.png b/src/assets/BI/yuancailiaoyijianicon@2x.png
new file mode 100644
index 0000000..dc4a72c
--- /dev/null
+++ b/src/assets/BI/yuancailiaoyijianicon@2x.png
Binary files differ
diff --git a/src/assets/BI/zonghetongbingtubiankuang@2x.png b/src/assets/BI/zonghetongbingtubiankuang@2x.png
new file mode 100644
index 0000000..a322aa5
--- /dev/null
+++ b/src/assets/BI/zonghetongbingtubiankuang@2x.png
Binary files differ
diff --git a/src/assets/indexViews/HHKJLogo.png b/src/assets/indexViews/HHKJLogo.png
new file mode 100644
index 0000000..018abe6
--- /dev/null
+++ b/src/assets/indexViews/HHKJLogo.png
Binary files differ
diff --git a/src/assets/indexViews/HHKJView.png b/src/assets/indexViews/HHKJView.png
new file mode 100644
index 0000000..9c39567
--- /dev/null
+++ b/src/assets/indexViews/HHKJView.png
Binary files differ
diff --git a/src/assets/indexViews/LCLogo.png b/src/assets/indexViews/LCLogo.png
new file mode 100644
index 0000000..d18f9fd
--- /dev/null
+++ b/src/assets/indexViews/LCLogo.png
Binary files differ
diff --git a/src/assets/indexViews/MXSCBack.png b/src/assets/indexViews/MXSCBack.png
new file mode 100644
index 0000000..0beafd5
--- /dev/null
+++ b/src/assets/indexViews/MXSCBack.png
Binary files differ
diff --git a/src/assets/indexViews/MXSCLogo.png b/src/assets/indexViews/MXSCLogo.png
new file mode 100644
index 0000000..1ece4b5
--- /dev/null
+++ b/src/assets/indexViews/MXSCLogo.png
Binary files differ
diff --git a/src/assets/indexViews/RZNYLogo.png b/src/assets/indexViews/RZNYLogo.png
new file mode 100644
index 0000000..5296331
--- /dev/null
+++ b/src/assets/indexViews/RZNYLogo.png
Binary files differ
diff --git a/src/assets/indexViews/RZNYView.png b/src/assets/indexViews/RZNYView.png
new file mode 100644
index 0000000..4905096
--- /dev/null
+++ b/src/assets/indexViews/RZNYView.png
Binary files differ
diff --git a/src/assets/indexViews/TJXMLogo.png b/src/assets/indexViews/TJXMLogo.png
new file mode 100644
index 0000000..0f260e6
--- /dev/null
+++ b/src/assets/indexViews/TJXMLogo.png
Binary files differ
diff --git a/src/assets/indexViews/TJXMView.png b/src/assets/indexViews/TJXMView.png
new file mode 100644
index 0000000..e56a8c7
--- /dev/null
+++ b/src/assets/indexViews/TJXMView.png
Binary files differ
diff --git a/src/assets/indexViews/XYHBLogo.png b/src/assets/indexViews/XYHBLogo.png
new file mode 100644
index 0000000..b7989d8
--- /dev/null
+++ b/src/assets/indexViews/XYHBLogo.png
Binary files differ
diff --git a/src/assets/indexViews/XYHBView.png b/src/assets/indexViews/XYHBView.png
new file mode 100644
index 0000000..5878cd5
--- /dev/null
+++ b/src/assets/indexViews/XYHBView.png
Binary files differ
diff --git a/src/components/Echarts/echarts.vue b/src/components/Echarts/echarts.vue
index d8264ad..a386bb7 100644
--- a/src/components/Echarts/echarts.vue
+++ b/src/components/Echarts/echarts.vue
@@ -76,6 +76,10 @@
     type: Array,
     default: () => []
   },
+  visualMap: {
+    type: Object,
+    default: () => ({})
+  },
 	option: {
 		type: Object,
 		default: () => ({})
@@ -113,6 +117,7 @@
   const option = {
     color: props.color.length ? props.color : undefined,
     backgroundColor: props.options.backgroundColor || '#fff',
+    textStyle: props.options.textStyle || { color: '#333' },
     xAxis: props.xAxis,
     yAxis: props.yAxis,
     dataset: props.dataset,
@@ -120,6 +125,7 @@
     grid: props.grid,
     legend: props.legend,
     tooltip: props.tooltip,
+    visualMap: Object.keys(props.visualMap).length ? props.visualMap : undefined,
   }
   
   chartInstance.clear()
@@ -148,7 +154,7 @@
 
 // Watch all reactive props that affect the chart
 watch(
-    () => [props.xAxis, props.series, props.legend, props.tooltip],
+    () => [props.xAxis, props.yAxis, props.series, props.legend, props.tooltip, props.visualMap],
     () => {
       if (chartInstance) {
         renderChart()
diff --git a/src/layout/components/Sidebar/Logo.vue b/src/layout/components/Sidebar/Logo.vue
index c90dcae..c6aa445 100644
--- a/src/layout/components/Sidebar/Logo.vue
+++ b/src/layout/components/Sidebar/Logo.vue
@@ -16,7 +16,7 @@
 <script setup>
 import { ref, computed, onMounted, watch } from 'vue'
 import useUserStore from '@/store/modules/user'
-import defaultLogo from '@/assets/logo/鏁︾厡榧庤瘹.png' // 瀵煎叆榛樿logo
+import defaultLogo from '@/assets/indexViews/ZQHXLogo.png' // 瀵煎叆榛樿logo
 
 defineProps({
   collapse: {
diff --git a/src/main.js b/src/main.js
index ef7b341..da4c54d 100644
--- a/src/main.js
+++ b/src/main.js
@@ -1,113 +1,113 @@
-import { createApp } from "vue";
-
-import Cookies from "js-cookie";
-
-import ElementPlus from "element-plus";
-import "element-plus/dist/index.css";
-import "element-plus/theme-chalk/dark/css-vars.css";
-import locale from "element-plus/es/locale/lang/zh-cn";
-
-import "@/assets/styles/index.scss"; // global css
-
-import App from "./App";
-import store from "./store";
-import router from "./router";
-import directive from "./directive"; // directive
-
-// 娉ㄥ唽鎸囦护
-import plugins from "./plugins"; // plugins
-import { download } from "@/utils/request";
-
-// svg鍥炬爣
-import "virtual:svg-icons-register";
-import SvgIcon from "@/components/SvgIcon";
-import elementIcons from "@/components/SvgIcon/svgicon";
-import "./assets/fonts/font.css";
-
-import "./permission"; // permission control
-
-import { useDict } from "@/utils/dict";
-import {
-  parseTime,
-  resetForm,
-  addDateRange,
-  handleTree,
-  selectDictLabel,
-  selectDictLabels,
-} from "@/utils/ruoyi";
-
-// 鍒嗛〉缁勪欢
-import Pagination from "@/components/Pagination";
-// 鑷畾涔夎〃鏍煎伐鍏风粍浠�
-import RightToolbar from "@/components/RightToolbar";
-// 瀵屾枃鏈粍浠�
-import Editor from "@/components/Editor";
-// 鏂囦欢涓婁紶缁勪欢
-import FileUpload from "@/components/FileUpload";
-// 鍥剧墖涓婁紶缁勪欢
-import ImageUpload from "@/components/ImageUpload";
-// 鍥剧墖棰勮缁勪欢
-import ImagePreview from "@/components/ImagePreview";
-// 瀛楀吀鏍囩缁勪欢
-import DictTag from "@/components/DictTag";
-// 琛ㄦ牸缁勪欢
-import PIMTable from "@/components/PIMTable/PIMTable.vue";
-
-import { getToken } from "@/utils/auth";
-import {
-  calculateTaxExclusiveTotalPrice,
-  summarizeTable,
-  calculateTaxIncludeTotalPrice,
-} from "@/utils/summarizeTable.js";
-
-const app = createApp(App);
-
-// 鍏ㄥ眬鏂规硶鎸傝浇
-app.config.globalProperties.useDict = useDict;
-app.config.globalProperties.download = download;
-app.config.globalProperties.parseTime = parseTime;
-app.config.globalProperties.resetForm = resetForm;
-app.config.globalProperties.summarizeTable = summarizeTable;
-app.config.globalProperties.calculateTaxExclusiveTotalPrice =
-  calculateTaxExclusiveTotalPrice;
-app.config.globalProperties.calculateTaxIncludeTotalPrice =
-  calculateTaxIncludeTotalPrice;
-app.config.globalProperties.handleTree = handleTree;
-app.config.globalProperties.addDateRange = addDateRange;
-app.config.globalProperties.selectDictLabel = selectDictLabel;
-app.config.globalProperties.selectDictLabels = selectDictLabels;
-app.config.globalProperties.javaApi = "http://114.132.189.42:9033";
-app.config.globalProperties.HaveJson = (val) => {
-  return JSON.parse(JSON.stringify(val));
-};
-app.config.globalProperties.uploadHeader = {
-  Authorization: "Bearer " + getToken(),
-};
-
-// 鍏ㄥ眬缁勪欢鎸傝浇
-app.component("DictTag", DictTag);
-app.component("Pagination", Pagination);
-app.component("FileUpload", FileUpload);
-app.component("ImageUpload", ImageUpload);
-app.component("ImagePreview", ImagePreview);
-app.component("RightToolbar", RightToolbar);
-app.component("Editor", Editor);
-app.component("PIMTable", PIMTable);
-
-app.use(router);
-app.use(store);
-app.use(plugins);
-app.use(elementIcons);
-app.component("svg-icon", SvgIcon);
-
-directive(app);
-
-// 浣跨敤element-plus 骞朵笖璁剧疆鍏ㄥ眬鐨勫ぇ灏�
-app.use(ElementPlus, {
-  locale: locale,
-  // 鏀寔 large銆乨efault銆乻mall
-  size: Cookies.get("size") || "default",
-});
-app._context.components.ElDialog.props.closeOnClickModal.default = false;
-
-app.mount("#app");
+import { createApp } from "vue";
+
+import Cookies from "js-cookie";
+
+import ElementPlus from "element-plus";
+import "element-plus/dist/index.css";
+import "element-plus/theme-chalk/dark/css-vars.css";
+import locale from "element-plus/es/locale/lang/zh-cn";
+
+import "@/assets/styles/index.scss"; // global css
+
+import App from "./App";
+import store from "./store";
+import router from "./router";
+import directive from "./directive"; // directive
+
+// 娉ㄥ唽鎸囦护
+import plugins from "./plugins"; // plugins
+import { download } from "@/utils/request";
+
+// svg鍥炬爣
+import "virtual:svg-icons-register";
+import SvgIcon from "@/components/SvgIcon";
+import elementIcons from "@/components/SvgIcon/svgicon";
+import "./assets/fonts/font.css";
+
+import "./permission"; // permission control
+
+import { useDict } from "@/utils/dict";
+import {
+  parseTime,
+  resetForm,
+  addDateRange,
+  handleTree,
+  selectDictLabel,
+  selectDictLabels,
+} from "@/utils/ruoyi";
+
+// 鍒嗛〉缁勪欢
+import Pagination from "@/components/Pagination";
+// 鑷畾涔夎〃鏍煎伐鍏风粍浠�
+import RightToolbar from "@/components/RightToolbar";
+// 瀵屾枃鏈粍浠�
+import Editor from "@/components/Editor";
+// 鏂囦欢涓婁紶缁勪欢
+import FileUpload from "@/components/FileUpload";
+// 鍥剧墖涓婁紶缁勪欢
+import ImageUpload from "@/components/ImageUpload";
+// 鍥剧墖棰勮缁勪欢
+import ImagePreview from "@/components/ImagePreview";
+// 瀛楀吀鏍囩缁勪欢
+import DictTag from "@/components/DictTag";
+// 琛ㄦ牸缁勪欢
+import PIMTable from "@/components/PIMTable/PIMTable.vue";
+
+import { getToken } from "@/utils/auth";
+import {
+  calculateTaxExclusiveTotalPrice,
+  summarizeTable,
+  calculateTaxIncludeTotalPrice,
+} from "@/utils/summarizeTable.js";
+
+const app = createApp(App);
+
+// 鍏ㄥ眬鏂规硶鎸傝浇
+app.config.globalProperties.useDict = useDict;
+app.config.globalProperties.download = download;
+app.config.globalProperties.parseTime = parseTime;
+app.config.globalProperties.resetForm = resetForm;
+app.config.globalProperties.summarizeTable = summarizeTable;
+app.config.globalProperties.calculateTaxExclusiveTotalPrice =
+  calculateTaxExclusiveTotalPrice;
+app.config.globalProperties.calculateTaxIncludeTotalPrice =
+  calculateTaxIncludeTotalPrice;
+app.config.globalProperties.handleTree = handleTree;
+app.config.globalProperties.addDateRange = addDateRange;
+app.config.globalProperties.selectDictLabel = selectDictLabel;
+app.config.globalProperties.selectDictLabels = selectDictLabels;
+app.config.globalProperties.javaApi = "http://114.132.189.42:9037";
+app.config.globalProperties.HaveJson = (val) => {
+  return JSON.parse(JSON.stringify(val));
+};
+app.config.globalProperties.uploadHeader = {
+  Authorization: "Bearer " + getToken(),
+};
+
+// 鍏ㄥ眬缁勪欢鎸傝浇
+app.component("DictTag", DictTag);
+app.component("Pagination", Pagination);
+app.component("FileUpload", FileUpload);
+app.component("ImageUpload", ImageUpload);
+app.component("ImagePreview", ImagePreview);
+app.component("RightToolbar", RightToolbar);
+app.component("Editor", Editor);
+app.component("PIMTable", PIMTable);
+
+app.use(router);
+app.use(store);
+app.use(plugins);
+app.use(elementIcons);
+app.component("svg-icon", SvgIcon);
+
+directive(app);
+
+// 浣跨敤element-plus 骞朵笖璁剧疆鍏ㄥ眬鐨勫ぇ灏�
+app.use(ElementPlus, {
+  locale: locale,
+  // 鏀寔 large銆乨efault銆乻mall
+  size: Cookies.get("size") || "default",
+});
+app._context.components.ElDialog.props.closeOnClickModal.default = false;
+
+app.mount("#app");
diff --git a/src/router/index.js b/src/router/index.js
index 9cfde33..437e523 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -76,20 +76,20 @@
       }
     ]
   },
-  {
-    path: '/main/MobileChat',
-    component: Layout,
-    redirect: '',
-    hidden: true,
-    children: [
-      {
-        path: '',
-        component: () => import('@/views/chatHome/chatHomeIndex/MobileChat'),
-        name: 'MobileChat',
-        meta: { title: 'AI瀵硅瘽', icon: 'dashboard', affix: true}
-      }
-    ]
-  },
+  // {
+  //   path: '/main/MobileChat',
+  //   component: Layout,
+  //   redirect: '',
+  //   hidden: true,
+  //   children: [
+  //     {
+  //       path: '',
+  //       component: () => import('@/views/chatHome/chatHomeIndex/MobileChat'),
+  //       name: 'MobileChat',
+  //       meta: { title: 'AI瀵硅瘽', icon: 'dashboard', affix: true}
+  //     }
+  //   ]
+  // },
   {
     path: '/user',
     component: Layout,
@@ -111,6 +111,13 @@
     name: "DeviceInfo",
     meta: { title: "璁惧淇℃伅", icon: "monitor" },
   },
+  {
+    path: "/data-dashboard",
+    component: () => import("@/views/reportAnalysis/dataDashboard/index.vue"),
+    hidden: true,
+    name: "DataDashboard",
+    meta: { title: "鏁版嵁澶у睆", icon: "dashboard" },
+  },
 ];
 
 // 鍔ㄦ�佽矾鐢憋紝鍩轰簬鐢ㄦ埛鏉冮檺鍔ㄦ�佸幓鍔犺浇
diff --git a/src/views/energyManagement/carbonManagement/index.vue b/src/views/energyManagement/carbonManagement/index.vue
new file mode 100644
index 0000000..5a4be25
--- /dev/null
+++ b/src/views/energyManagement/carbonManagement/index.vue
@@ -0,0 +1,1553 @@
+<template>
+  <div class="carbon-management">
+    <!-- 椤甸潰澶撮儴 -->
+    <div class="page-header">
+      <div class="header-content">
+        <h1 class="page-title">纰虫帓鏀剧鐞嗙郴缁�</h1>
+        <p class="page-subtitle">鍩轰簬ISO 14064鏍囧噯 路 GHG Protocol鏍哥畻鏍囧噯</p>
+      </div>
+      <div class="header-stats">
+        <div class="stat-item">
+          <span class="stat-label">鎬荤⒊鎺掓斁閲�</span>
+          <span class="stat-value">{{totalEmissions}} tCO鈧俥</span>
+        </div>
+        <div class="stat-item">
+          <span class="stat-label">鏈湀鍑忔帓</span>
+          <span class="stat-value reduction">-{{monthlyReduction}}%</span>
+        </div>
+        <div class="stat-item">
+          <span class="stat-label">纰充腑鍜岃繘搴�</span>
+          <span class="stat-value">{{neutralProgress}}%</span>
+        </div>
+      </div>
+    </div>
+
+    <!-- 涓昏鍐呭鍖哄煙 -->
+    <div class="dashboard-content">
+      <!-- 椤堕儴鏁版嵁闈㈡澘 -->
+      <div class="top-panels">
+        <div class="data-panel top-left">
+          <div class="panel-title">褰撳墠纰虫帓鏀�</div>
+          <div class="panel-value">{{carbonData.scope1}} <span class="unit">tCO鈧俥</span></div>
+          <div class="panel-subtitle">鑼冨洿1鐩存帴鎺掓斁</div>
+        </div>
+        <div class="data-panel top-center">
+          <div class="panel-title">鑳借�楃洃娴�</div>
+          <div class="panel-value">{{carbonData.scope2}} <span class="unit">tCO鈧俥</span></div>
+          <div class="panel-subtitle">鑼冨洿2闂存帴鎺掓斁</div>
+        </div>
+        <div class="data-panel top-right">
+          <div class="panel-title">渚涘簲閾炬帓鏀�</div>
+          <div class="panel-value">{{carbonData.scope3}} <span class="unit">tCO鈧俥</span></div>
+          <div class="panel-subtitle">鑼冨洿3渚涘簲閾炬帓鏀�</div>
+        </div>
+        <div class="data-panel top-far-right">
+          <div class="panel-title">鍑忔帓杩涘害</div>
+          <div class="panel-value">{{neutralProgress}} <span class="unit">%</span></div>
+          <div class="panel-subtitle">纰充腑鍜岀洰鏍�</div>
+        </div>
+      </div>
+
+      <!-- 涓績涓昏鍥惧尯鍩� -->
+      <div class="center-main-view">
+        <!-- 宸︿晶鎺у埗闈㈡澘 -->
+        <div class="left-control-panel">
+          <div class="control-section">
+            <div class="section-title">纰虫帓鏀捐寖鍥�</div>
+            <el-radio-group v-model="selectedScope" @change="updateScopeData" class="vertical-radio">
+              <el-radio-button :value="'all'">鍏ㄩ儴鑼冨洿</el-radio-button>
+              <el-radio-button :value="'scope1'">鑼冨洿1</el-radio-button>
+              <el-radio-button :value="'scope2'">鑼冨洿2</el-radio-button>
+              <el-radio-button :value="'scope3'">鑼冨洿3</el-radio-button>
+            </el-radio-group>
+          </div>
+          <div class="control-section">
+            <div class="section-title">鐩戞祴灞傜骇</div>
+            <el-radio-group v-model="heatmapLevel" @change="updateHeatmapLevel" class="vertical-radio">
+              <el-radio-button :value="'device'">璁惧绾�</el-radio-button>
+              <el-radio-button :value="'line'">浜х嚎绾�</el-radio-button>
+              <el-radio-button :value="'enterprise'">浼佷笟绾�</el-radio-button>
+            </el-radio-group>
+          </div>
+        </div>
+
+        <!-- 涓績鐑姏鍥� -->
+        <div class="main-heatmap">
+          <div class="heatmap-header">
+            <h2 class="main-title">纰宠冻杩圭儹鍔涘浘鍒嗘瀽</h2>
+            <div class="date-selector">
+              <el-date-picker
+                v-model="selectedDate"
+                type="date"
+                placeholder="閫夋嫨鏃ユ湡"
+                size="small"
+                @change="updateHeatmapData"
+              />
+            </div>
+          </div>
+          <div class="heatmap-view">
+            <Echarts ref="heatmapChart"
+                     :series="heatmapSeries"
+                     :xAxis="heatmapXAxis"
+                     :yAxis="heatmapYAxis"
+                     :tooltip="heatmapTooltip"
+                     :visualMap="heatmapVisualMap"
+                     :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+                     style="height: 450px"></Echarts>
+          </div>
+        </div>
+
+        <!-- 鍙充晶鏁版嵁闈㈡澘 -->
+        <div class="right-data-panel">
+          <div class="data-section">
+            <div class="section-title">瀹炴椂鐩戞帶</div>
+            <div class="mini-chart">
+              <Echarts ref="realtimeChart"
+                       :series="realtimeSeries"
+                       :xAxis="realtimeXAxis"
+											 :chartStyle="chartStyle"
+                       :yAxis="realtimeYAxis"
+                       :tooltip="realtimeTooltip"
+                       :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+                       style="height: 300px"></Echarts>
+            </div>
+          </div>
+          <div class="data-section">
+            <div class="section-title">瓒嬪娍鍒嗘瀽</div>
+            <div class="trend-controls">
+              <el-radio-group v-model="trendPeriod" size="small" @change="updateTrendData">
+                <el-radio-button :value="'week'">鍛�</el-radio-button>
+                <el-radio-button :value="'month'">鏈�</el-radio-button>
+                <el-radio-button :value="'year'">骞�</el-radio-button>
+              </el-radio-group>
+            </div>
+            <div class="mini-chart">
+              <Echarts ref="trendChart"
+                       :series="trendSeries"
+                       :xAxis="trendXAxis"
+                       :yAxis="trendYAxis"
+                       :tooltip="trendTooltip"
+											 :chartStyle="chartStyle"
+                       :legend="trendLegend"
+                       :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+                       style="height: 200px"></Echarts>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 搴曢儴杩涘害闈㈡澘 -->
+      <div class="bottom-progress-panel">
+        <div class="progress-section">
+          <div class="progress-title">2024骞村噺鎺掔洰鏍�</div>
+          <div class="progress-data">
+            <span class="current">{{reductionTarget.current}}</span>
+            <span class="separator">/</span>
+            <span class="target">{{reductionTarget.target}} tCO鈧俥</span>
+          </div>
+          <el-progress :percentage="reductionTarget.percentage" :stroke-width="6" color="#00E676"/>
+        </div>
+        <div class="progress-section">
+          <div class="progress-title">纰充腑鍜岃繘搴�</div>
+          <div class="progress-data">
+            <span class="current">{{neutralTarget.current}}</span>
+            <span class="separator">/</span>
+            <span class="target">{{neutralTarget.target}} tCO鈧俥</span>
+          </div>
+          <el-progress :percentage="neutralTarget.percentage" :stroke-width="6" color="#00D4FF"/>
+        </div>
+      </div>
+
+      <!-- 搴曢儴鏁版嵁琛ㄦ牸 -->
+      <div class="bottom-data-table">
+        <div class="table-panel">
+          <div class="table-header">
+            <h3 class="table-title">纰虫帓鏀捐缁嗘暟鎹�</h3>
+            <div class="table-controls">
+              <el-input
+                v-model="searchKeyword"
+                placeholder="鎼滅储璁惧鎴栦骇绾�"
+                size="small"
+                style="width: 200px; margin-right: 10px;"
+              />
+              <el-button type="primary" size="small" @click="exportData">瀵煎嚭鏁版嵁</el-button>
+            </div>
+          </div>
+          <el-table :data="filteredTableData" style="width: 100%" height="180">
+            <el-table-column prop="name" label="璁惧/浜х嚎" width="150"/>
+            <el-table-column prop="type" label="绫诲瀷" width="100"/>
+            <el-table-column prop="scope1" label="鑼冨洿1鎺掓斁" width="120"/>
+            <el-table-column prop="scope2" label="鑼冨洿2鎺掓斁" width="120"/>
+            <el-table-column prop="scope3" label="鑼冨洿3鎺掓斁" width="120"/>
+            <el-table-column prop="total" label="鎬绘帓鏀鹃噺" width="120"/>
+            <el-table-column prop="efficiency" label="纰虫晥鐜�" width="100"/>
+            <el-table-column prop="status" label="鐘舵��" width="100">
+              <template #default="scope">
+                <el-tag :type="getStatusType(scope.row.status)">{{scope.row.status}}</el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, onBeforeUnmount, computed } from 'vue'
+import * as echarts from 'echarts'
+import Echarts from '@/components/Echarts/echarts.vue'
+
+// 鍝嶅簲寮忔暟鎹�
+const selectedScope = ref('all')
+const heatmapLevel = ref('device')
+const selectedDate = ref(new Date())
+const trendPeriod = ref('week')
+const searchKeyword = ref('')
+
+// 纰虫帓鏀炬暟鎹�
+const carbonData = ref({
+  scope1: 125.6,
+  scope2: 89.3,
+  scope3: 234.7
+})
+const chartStyle = {
+	width: '96%',
+	height: '110%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
+}
+// 璁$畻灞炴��
+const totalEmissions = computed(() => {
+  return (carbonData.value.scope1 + carbonData.value.scope2 + carbonData.value.scope3).toFixed(1)
+})
+
+const monthlyReduction = ref(8.5)
+
+// 璁$畻纰充腑鍜岃繘搴︾櫨鍒嗘瘮
+const neutralProgress = computed(() => {
+  return Math.round(neutralTarget.value.percentage)
+})
+
+// 鍑忔帓鐩爣鏁版嵁
+const reductionTarget = ref({
+  current: 320.5,
+  target: 500,
+  percentage: 64.1
+})
+
+const neutralTarget = ref({
+  current: 1250,
+  target: 3800,
+  percentage: 32.9
+})
+
+// 瀹炴椂鐩戞帶鍥捐〃閰嶇疆
+const realtimeSeries = ref([
+  {
+    name: '瀹炴椂纰虫帓鏀�',
+    type: 'line',
+    smooth: true,
+    data: generateRealtimeData(),
+    itemStyle: {
+      color: '#FF6B6B'
+    },
+    areaStyle: {
+      color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: 'rgba(255, 107, 107, 0.3)' },
+        { offset: 1, color: 'rgba(255, 107, 107, 0.1)' }
+      ])
+    }
+  }
+])
+
+const realtimeXAxis = [{
+  type: 'category',
+  data: Array.from({length: 24}, (_, i) => `${i.toString().padStart(2, '0')}:00`),
+  axisLabel: { color: '#B8C8E0' }
+}]
+
+const realtimeYAxis = [{
+  type: 'value',
+  name: 'tCO鈧俥/h',
+  axisLabel: { color: '#B8C8E0' },
+  nameTextStyle: { color: '#B8C8E0' }
+}]
+
+const realtimeTooltip = {
+  trigger: 'axis',
+  formatter: '{b}: {c} tCO鈧俥/h'
+}
+
+// 鐑姏鍥鹃厤缃�
+const heatmapSeries = ref([
+  {
+    name: '纰虫帓鏀鹃噺',
+    type: 'heatmap',
+    data: generateHeatmapData(),
+    label: {
+      show: false
+    },
+    emphasis: {
+      itemStyle: {
+        shadowBlur: 10,
+        shadowColor: 'rgba(0, 0, 0, 0.5)'
+      }
+    }
+  }
+])
+
+const heatmapXAxis = [{
+  type: 'category',
+  data: Array.from({length: 24}, (_, i) => `${i}:00`),
+  splitArea: { show: true },
+  axisLabel: { color: '#B8C8E0' }
+}]
+
+const heatmapYAxis = [{
+  type: 'category',
+  data: ['璁惧A', '璁惧B', '璁惧C', '璁惧D', '璁惧E', '璁惧F', '璁惧G'],
+  splitArea: { show: true },
+  axisLabel: { color: '#B8C8E0' }
+}]
+
+const heatmapTooltip = {
+  trigger: 'item',
+  formatter: function (params) {
+    const [hour, device] = params.data
+    const value = params.value[2]
+    return `璁惧: ${heatmapYAxis[0].data[device]}<br/>鏃堕棿: ${hour}:00<br/>纰虫帓鏀鹃噺: ${value} tCO鈧俥`
+  }
+}
+
+const heatmapVisualMap = ref({
+  min: 0,
+  max: 50,
+  calculable: true,
+  orient: 'horizontal',
+  left: 'center',
+  bottom: '5%',
+  inRange: {
+    color: ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf', '#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
+  },
+  textStyle: { color: '#B8C8E0' }
+})
+
+// 瓒嬪娍鍒嗘瀽鍥捐〃閰嶇疆
+const trendSeries = ref([
+  {
+    name: '鑼冨洿1',
+    type: 'line',
+    data: [120, 132, 101, 134, 90, 230, 210],
+    itemStyle: { color: '#FF6B6B' }
+  },
+  {
+    name: '鑼冨洿2',
+    type: 'line',
+    data: [220, 182, 191, 234, 290, 330, 310],
+    itemStyle: { color: '#4ECDC4' }
+  },
+  {
+    name: '鑼冨洿3',
+    type: 'line',
+    data: [150, 232, 201, 154, 190, 330, 410],
+    itemStyle: { color: '#45B7D1' }
+  }
+])
+
+const trendXAxis = [{
+  type: 'category',
+  data: ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩'],
+  axisLabel: { color: '#B8C8E0' }
+}]
+
+const trendYAxis = [{
+  type: 'value',
+  name: 'tCO鈧俥',
+  axisLabel: { color: '#B8C8E0' },
+  nameTextStyle: { color: '#B8C8E0' }
+}]
+
+const trendTooltip = {
+  trigger: 'axis'
+}
+
+const trendLegend = {
+  data: ['鑼冨洿1', '鑼冨洿2', '鑼冨洿3'],
+  textStyle: { color: '#B8C8E0' }
+}
+
+// 琛ㄦ牸鏁版嵁
+const carbonTableData = ref([
+  { name: '鐢熶骇绾緼', type: '浜х嚎', scope1: 45.2, scope2: 32.1, scope3: 18.7, total: 96.0, efficiency: '鑹ソ', status: '姝e父' },
+  { name: '璁惧B-01', type: '璁惧', scope1: 12.5, scope2: 8.3, scope3: 5.2, total: 26.0, efficiency: '浼樼', status: '姝e父' },
+  { name: '鐢熶骇绾緾', type: '浜х嚎', scope1: 38.7, scope2: 28.9, scope3: 15.4, total: 83.0, efficiency: '鑹ソ', status: '鍛婅' },
+  { name: '璁惧D-02', type: '璁惧', scope1: 15.8, scope2: 11.2, scope3: 7.1, total: 34.1, efficiency: '涓�鑸�', status: '姝e父' },
+  { name: '鐢熶骇绾縀', type: '浜х嚎', scope1: 52.3, scope2: 39.6, scope3: 22.8, total: 114.7, efficiency: '寰呬紭鍖�', status: '鍛婅' }
+])
+
+// 鐢熸垚瀹炴椂鏁版嵁
+function generateRealtimeData() {
+  return Array.from({length: 24}, () => (Math.random() * 20 + 10).toFixed(1))
+}
+
+// 鐢熸垚鐑姏鍥炬暟鎹�
+function generateHeatmapData() {
+  const data = []
+  let yAxisLength = 7 // 榛樿璁惧绾�
+  let baseMultiplier = 1 // 鍩虹鍊嶆暟
+  
+  // 鏍规嵁灞傜骇纭畾Y杞撮暱搴﹀拰鏁版嵁鑼冨洿
+  if (heatmapLevel.value === 'line') {
+    yAxisLength = 5
+    baseMultiplier = 2 // 浜х嚎绾ф暟鎹洿澶�
+  } else if (heatmapLevel.value === 'enterprise') {
+    yAxisLength = 3
+    baseMultiplier = 4 // 浼佷笟绾ф暟鎹渶澶�
+  }
+  
+  for (let i = 0; i < yAxisLength; i++) {
+    for (let j = 0; j < 24; j++) {
+      let value
+      // 绠�鍖栫殑鏃堕棿娈甸�昏緫
+      if (j >= 8 && j <= 18) {
+        // 宸ヤ綔鏃堕棿鎺掓斁閲忚緝楂�
+        value = Math.random() * 30 + 20
+      } else if (j >= 19 && j <= 22) {
+        // 鏅氶棿鎺掓斁閲忎腑绛�
+        value = Math.random() * 20 + 10
+      } else {
+        // 娣卞鍜屽噷鏅ㄦ帓鏀鹃噺杈冧綆
+        value = Math.random() * 10 + 2
+      }
+      
+      // 娣诲姞璁惧宸紓鍜屽眰绾у�嶆暟
+      value *= (0.8 + i * 0.1) * baseMultiplier
+      
+      data.push([j, i, Math.round(value * 10) / 10])
+    }
+  }
+  return data
+}
+
+// 鏇存柊鑼冨洿鏁版嵁
+function updateScopeData() {
+  // 鏍规嵁閫夋嫨鐨勮寖鍥存洿鏂版墍鏈夌浉鍏冲浘琛ㄦ暟鎹�
+  const scopeMultiplier = {
+    'all': 1,
+    'scope1': 0.3,
+    'scope2': 0.4,
+    'scope3': 0.3
+  }
+  
+  const multiplier = scopeMultiplier[selectedScope.value] || 1
+  
+  // 鏇存柊纰虫帓鏀炬暟鎹樉绀�
+  if (selectedScope.value === 'all') {
+    carbonData.value = {
+      scope1: 125.6,
+      scope2: 89.3,
+      scope3: 234.7
+    }
+  } else {
+    const baseTotal = 125.6 + 89.3 + 234.7
+    carbonData.value = {
+      scope1: selectedScope.value === 'scope1' ? 125.6 : 0,
+      scope2: selectedScope.value === 'scope2' ? 89.3 : 0,
+      scope3: selectedScope.value === 'scope3' ? 234.7 : 0
+    }
+  }
+  
+  // 鏇存柊鐑姏鍥炬暟鎹�
+  heatmapSeries.value[0].data = generateHeatmapData().map(item => [
+    item[0], item[1], Math.round(item[2] * multiplier * 10) / 10
+  ])
+  
+  // 鏇存柊瀹炴椂鐩戞帶鏁版嵁
+  realtimeSeries.value[0].data = generateRealtimeData().map(val => 
+    Math.round(parseFloat(val) * multiplier * 10) / 10
+  )
+}
+
+// 鏇存柊鐑姏鍥惧眰绾�
+function updateHeatmapLevel() {
+  // 鏍规嵁灞傜骇鏇存柊Y杞存暟鎹拰visualMap鑼冨洿
+  if (heatmapLevel.value === 'device') {
+    heatmapYAxis[0].data = ['閿呯倝A', '鍘嬬缉鏈築', '鍐峰嵈濉擟', '椋庢満D', '娉礒', '鍙樺帇鍣‵', '鐢垫満G']
+    heatmapVisualMap.value.max = 50
+  } else if (heatmapLevel.value === 'line') {
+    heatmapYAxis[0].data = ['鐢熶骇绾�1', '鐢熶骇绾�2', '鐢熶骇绾�3', '鐢熶骇绾�4', '鐢熶骇绾�5']
+    heatmapVisualMap.value.max = 100
+  } else {
+    heatmapYAxis[0].data = ['鍘傚尯A', '鍘傚尯B', '鍘傚尯C']
+    heatmapVisualMap.value.max = 200
+  }
+  
+  // 鏇存柊鐑姏鍥炬暟鎹�
+  heatmapSeries.value[0].data = generateHeatmapData()
+  
+  // 鏇存柊琛ㄦ牸鏁版嵁浠ュ尮閰嶅綋鍓嶅眰绾�
+  updateTableDataForLevel()
+}
+
+// 鏍规嵁灞傜骇鏇存柊琛ㄦ牸鏁版嵁
+function updateTableDataForLevel() {
+  const levelConfigs = {
+    device: [
+      { name: '閿呯倝A', type: '璁惧', scope1: 45.2, scope2: 32.1, scope3: 18.7, total: 96.0, efficiency: '鑹ソ', status: '姝e父' },
+      { name: '鍘嬬缉鏈築', type: '璁惧', scope1: 38.5, scope2: 28.3, scope3: 15.2, total: 82.0, efficiency: '浼樼', status: '姝e父' },
+      { name: '鍐峰嵈濉擟', type: '璁惧', scope1: 22.8, scope2: 18.9, scope3: 12.3, total: 54.0, efficiency: '鑹ソ', status: '鍛婅' },
+      { name: '椋庢満D', type: '璁惧', scope1: 15.6, scope2: 12.4, scope3: 8.1, total: 36.1, efficiency: '涓�鑸�', status: '姝e父' },
+      { name: '娉礒', type: '璁惧', scope1: 12.3, scope2: 9.8, scope3: 6.4, total: 28.5, efficiency: '浼樼', status: '姝e父' }
+    ],
+    line: [
+      { name: '鐢熶骇绾�1', type: '浜х嚎', scope1: 125.6, scope2: 89.3, scope3: 56.8, total: 271.7, efficiency: '鑹ソ', status: '姝e父' },
+      { name: '鐢熶骇绾�2', type: '浜х嚎', scope1: 98.4, scope2: 72.1, scope3: 45.2, total: 215.7, efficiency: '浼樼', status: '姝e父' },
+      { name: '鐢熶骇绾�3', type: '浜х嚎', scope1: 87.2, scope2: 65.8, scope3: 41.6, total: 194.6, efficiency: '鑹ソ', status: '鍛婅' },
+      { name: '鐢熶骇绾�4', type: '浜х嚎', scope1: 76.9, scope2: 58.3, scope3: 37.1, total: 172.3, efficiency: '涓�鑸�', status: '姝e父' },
+      { name: '鐢熶骇绾�5', type: '浜х嚎', scope1: 65.7, scope2: 49.2, scope3: 31.8, total: 146.7, efficiency: '寰呬紭鍖�', status: '鍛婅' }
+    ],
+    enterprise: [
+      { name: '鍘傚尯A', type: '鍘傚尯', scope1: 456.8, scope2: 334.7, scope3: 212.5, total: 1004.0, efficiency: '鑹ソ', status: '姝e父' },
+      { name: '鍘傚尯B', type: '鍘傚尯', scope1: 387.2, scope2: 289.6, scope3: 184.3, total: 861.1, efficiency: '浼樼', status: '姝e父' },
+      { name: '鍘傚尯C', type: '鍘傚尯', scope1: 298.5, scope2: 223.8, scope3: 142.7, total: 665.0, efficiency: '鑹ソ', status: '鍛婅' }
+    ]
+  }
+  
+  carbonTableData.value = levelConfigs[heatmapLevel.value] || levelConfigs.device
+}
+
+// 鏇存柊鐑姏鍥炬暟鎹紙鏃ユ湡鍙樺寲鏃讹級
+function updateHeatmapData() {
+  heatmapSeries.value[0].data = generateHeatmapData()
+  
+  // 鍚屾椂鏇存柊鍏朵粬鐩稿叧鏁版嵁
+  updateScopeData()
+}
+
+// 鏇存柊瓒嬪娍鏁版嵁
+function updateTrendData() {
+  const trendDataConfigs = {
+    week: {
+      xAxisData: ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩'],
+      scope1Data: [120, 132, 101, 134, 90, 80, 75],
+      scope2Data: [220, 182, 191, 234, 190, 150, 140],
+      scope3Data: [150, 232, 201, 154, 190, 120, 110]
+    },
+    month: {
+      xAxisData: ['1鏈�', '2鏈�', '3鏈�', '4鏈�', '5鏈�', '6鏈�', '7鏈�', '8鏈�', '9鏈�', '10鏈�', '11鏈�', '12鏈�'],
+      scope1Data: [1200, 1150, 1300, 1250, 1180, 1320, 1280, 1350, 1220, 1290, 1160, 1100],
+      scope2Data: [2200, 2100, 2350, 2280, 2150, 2400, 2320, 2450, 2180, 2380, 2120, 2050],
+      scope3Data: [1800, 1750, 1950, 1880, 1820, 2000, 1920, 2100, 1850, 1980, 1780, 1720]
+    },
+    year: {
+      xAxisData: ['2019', '2020', '2021', '2022', '2023', '2024'],
+      scope1Data: [14500, 14200, 13800, 13500, 13100, 12800],
+      scope2Data: [26800, 26200, 25600, 25000, 24400, 23800],
+      scope3Data: [22400, 21800, 21200, 20600, 20000, 19400]
+    }
+  }
+  
+  const config = trendDataConfigs[trendPeriod.value] || trendDataConfigs.week
+  
+  // 鏇存柊X杞存暟鎹�
+  trendXAxis[0].data = config.xAxisData
+  
+  // 鏇存柊绯诲垪鏁版嵁
+  trendSeries.value = [
+    {
+      name: '鑼冨洿1',
+      type: 'line',
+      data: config.scope1Data,
+      itemStyle: { color: '#FF6B6B' },
+      smooth: true
+    },
+    {
+      name: '鑼冨洿2',
+      type: 'line',
+      data: config.scope2Data,
+      itemStyle: { color: '#4ECDC4' },
+      smooth: true
+    },
+    {
+      name: '鑼冨洿3',
+      type: 'line',
+      data: config.scope3Data,
+      itemStyle: { color: '#45B7D1' },
+      smooth: true
+    }
+  ]
+}
+
+// 鑾峰彇鐘舵�佺被鍨�
+function getStatusType(status) {
+  switch (status) {
+    case '姝e父': return 'success'
+    case '鍛婅': return 'warning'
+    case '寮傚父': return 'danger'
+    default: return 'info'
+  }
+}
+
+// 瀵煎嚭鏁版嵁
+function exportData() {
+  // 鍑嗗瀵煎嚭鏁版嵁
+  const exportDataSet = {
+    鍩烘湰淇℃伅: {
+      瀵煎嚭鏃堕棿: new Date().toLocaleString('zh-CN'),
+      鏁版嵁灞傜骇: heatmapLevel.value === 'device' ? '璁惧绾�' : heatmapLevel.value === 'line' ? '浜х嚎绾�' : '浼佷笟绾�',
+      閫夋嫨鑼冨洿: selectedScope.value === 'all' ? '鍏ㄩ儴鑼冨洿' : `鑼冨洿${selectedScope.value.slice(-1)}`,
+      閫夋嫨鏃ユ湡: selectedDate.value ? selectedDate.value.toLocaleDateString('zh-CN') : '浠婃棩'
+    },
+    纰虫帓鏀剧粺璁�: {
+      鑼冨洿1鐩存帴鎺掓斁: carbonData.value.scope1 + ' tCO鈧俥',
+      鑼冨洿2闂存帴鎺掓斁: carbonData.value.scope2 + ' tCO鈧俥',
+      鑼冨洿3渚涘簲閾炬帓鏀�: carbonData.value.scope3 + ' tCO鈧俥',
+      鎬绘帓鏀鹃噺: totalEmissions.value + ' tCO鈧俥'
+    },
+    璇︾粏鏁版嵁: carbonTableData.value,
+    鐑姏鍥炬暟鎹�: heatmapSeries.value[0].data.map(item => ({
+      鏃堕棿: `${item[0]}:00`,
+      璁惧搴忓彿: item[1],
+      璁惧鍚嶇О: heatmapYAxis.data[item[1]],
+      纰虫帓鏀鹃噺: item[2] + ' tCO鈧俥'
+    }))
+  }
+  
+  // 鍒涘缓CSV鍐呭
+  let csvContent = '\uFEFF' // BOM for UTF-8
+  
+  // 鍩烘湰淇℃伅
+  csvContent += '鍩烘湰淇℃伅\n'
+  Object.entries(exportDataSet.鍩烘湰淇℃伅).forEach(([key, value]) => {
+    csvContent += `${key},${value}\n`
+  })
+  csvContent += '\n'
+  
+  // 纰虫帓鏀剧粺璁�
+  csvContent += '纰虫帓鏀剧粺璁n'
+  Object.entries(exportDataSet.纰虫帓鏀剧粺璁�).forEach(([key, value]) => {
+    csvContent += `${key},${value}\n`
+  })
+  csvContent += '\n'
+  
+  // 璇︾粏鏁版嵁琛ㄦ牸
+  csvContent += '璇︾粏鏁版嵁\n'
+  csvContent += '鍚嶇О,绫诲瀷,鑼冨洿1鎺掓斁,鑼冨洿2鎺掓斁,鑼冨洿3鎺掓斁,鎬绘帓鏀鹃噺,纰虫晥鐜�,鐘舵�乗n'
+  exportDataSet.璇︾粏鏁版嵁.forEach(row => {
+    csvContent += `${row.name},${row.type},${row.scope1},${row.scope2},${row.scope3},${row.total},${row.efficiency},${row.status}\n`
+  })
+  csvContent += '\n'
+  
+  // 鐑姏鍥炬暟鎹紙鍓�50鏉★級
+  csvContent += '鐑姏鍥炬暟鎹紙鍓�50鏉★級\n'
+  csvContent += '鏃堕棿,璁惧鍚嶇О,纰虫帓鏀鹃噺\n'
+  exportDataSet.鐑姏鍥炬暟鎹�.slice(0, 50).forEach(row => {
+    csvContent += `${row.鏃堕棿},${row.璁惧鍚嶇О},${row.纰虫帓鏀鹃噺}\n`
+  })
+  
+  // 鍒涘缓涓嬭浇閾炬帴
+  const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' })
+  const link = document.createElement('a')
+  const url = URL.createObjectURL(blob)
+  link.setAttribute('href', url)
+  link.setAttribute('download', `纰虫帓鏀炬暟鎹甠${new Date().toISOString().slice(0, 10)}.csv`)
+  link.style.visibility = 'hidden'
+  document.body.appendChild(link)
+  link.click()
+  document.body.removeChild(link)
+  
+  // 鏄剧ず鎴愬姛娑堟伅
+  console.log('纰虫帓鏀炬暟鎹鍑烘垚鍔�')
+}
+
+// 鎼滅储杩囨护鍔熻兘
+const filteredTableData = computed(() => {
+  if (!searchKeyword.value) {
+    return carbonTableData.value
+  }
+  return carbonTableData.value.filter(item => 
+    item.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
+    item.type.toLowerCase().includes(searchKeyword.value.toLowerCase())
+  )
+})
+
+// 鐑姏鍥剧偣鍑讳簨浠跺鐞�
+function handleHeatmapClick(params) {
+  if (params.componentType === 'series') {
+    const [hour, deviceIndex, value] = params.data
+    const deviceName = heatmapYAxis.data[deviceIndex]
+    console.log(`鐐瑰嚮浜嗚澶�: ${deviceName}, 鏃堕棿: ${hour}:00, 鎺掓斁閲�: ${value} tCO鈧俥`)
+    
+    // 鍙互鍦ㄨ繖閲屾坊鍔犺缁嗕俊鎭脊绐楁垨璺宠浆鍒拌缁嗛〉闈�
+  }
+}
+
+onMounted(() => {
+  // 椤甸潰鍔犺浇瀹屾垚鍚庣殑鍒濆鍖栨搷浣�
+  console.log('纰崇鐞嗛〉闈㈠凡鍔犺浇')
+  
+  // 鍒濆鍖栫儹鍔涘浘鏁版嵁
+  updateHeatmapLevel()
+  
+  // 鍒濆鍖栬秼鍔挎暟鎹�
+  updateTrendData()
+  
+  // 鍒濆鍖栬寖鍥存暟鎹�
+  updateScopeData()
+  
+  // 璁剧疆瀹氭椂鍣紝姣�30绉掓洿鏂颁竴娆″疄鏃舵暟鎹�
+  const timer = setInterval(() => {
+    realtimeSeries.value[0].data = generateRealtimeData()
+  }, 30000)
+  
+  // 娓呯悊瀹氭椂鍣�
+  onBeforeUnmount(() => {
+    clearInterval(timer)
+  })
+})
+
+// 娣诲姞鐑姏鍥剧偣鍑讳簨浠剁粦瀹�
+function bindHeatmapEvents() {
+  // 杩欎釜鍑芥暟鍙互鐢ㄦ潵缁戝畾鐑姏鍥剧殑鐐瑰嚮浜嬩欢
+  // 鍦ㄥ疄闄呬娇鐢ㄤ腑锛屽彲浠ラ�氳繃ECharts鐨勪簨浠剁郴缁熸潵瀹炵幇
+}
+</script>
+
+<style scoped>
+.carbon-management {
+  min-height: 100vh;
+  background: 
+    radial-gradient(ellipse at top, rgba(29, 78, 216, 0.15), transparent 50%),
+    radial-gradient(ellipse at bottom, rgba(139, 92, 246, 0.15), transparent 50%),
+    linear-gradient(135deg, #0a0f1c 0%, #1e293b 25%, #0f172a 50%, #1e293b 75%, #0a0f1c 100%);
+  padding: 20px;
+  font-family: 'Inter', 'Microsoft YaHei', sans-serif;
+  overflow: hidden;
+  position: relative;
+}
+
+.carbon-management::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: 
+    radial-gradient(circle at 20% 80%, rgba(120, 119, 198, 0.1) 0%, transparent 50%),
+    radial-gradient(circle at 80% 20%, rgba(255, 119, 198, 0.1) 0%, transparent 50%),
+    radial-gradient(circle at 40% 40%, rgba(120, 219, 255, 0.05) 0%, transparent 50%);
+  pointer-events: none;
+
+}
+
+
+
+.page-header {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.95) 0%, rgba(30, 41, 59, 0.9) 100%),
+    radial-gradient(circle at top right, rgba(59, 130, 246, 0.1), transparent 50%);
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  border-radius: 20px;
+  padding: 40px;
+  margin-bottom: 30px;
+  box-shadow: 
+    0 25px 50px -12px rgba(0, 0, 0, 0.4),
+    0 0 0 1px rgba(255, 255, 255, 0.05),
+    inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  position: relative;
+  overflow: hidden;
+  backdrop-filter: blur(20px);
+
+}
+
+.page-header:hover {
+  transform: translateY(-2px);
+  box-shadow: 
+    0 32px 64px -12px rgba(0, 0, 0, 0.5),
+    0 0 0 1px rgba(255, 255, 255, 0.1),
+    inset 0 1px 0 rgba(255, 255, 255, 0.15);
+}
+
+.page-header::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: 
+    linear-gradient(45deg, rgba(59, 130, 246, 0.08) 0%, rgba(147, 51, 234, 0.08) 50%, rgba(236, 72, 153, 0.08) 100%);
+  pointer-events: none;
+
+}
+
+
+
+.header-content {
+  flex: 1;
+  position: relative;
+  z-index: 1;
+}
+
+.page-title {
+  font-size: 28px;
+  font-weight: bold;
+  color: #ffffff;
+  margin: 0 0 8px 0;
+  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.page-subtitle {
+  font-size: 14px;
+  color: #B8C8E0;
+  margin: 0;
+}
+
+.header-stats {
+  display: flex;
+  gap: 40px;
+  position: relative;
+  z-index: 1;
+}
+
+.stat-item {
+  text-align: center;
+  padding: 20px;
+  background: 
+    linear-gradient(135deg, rgba(59, 130, 246, 0.15) 0%, rgba(147, 51, 234, 0.15) 100%),
+    radial-gradient(circle at center, rgba(255, 255, 255, 0.05), transparent 70%);
+  border-radius: 12px;
+  border: 1px solid rgba(148, 163, 184, 0.2);
+  position: relative;
+  overflow: hidden;
+
+  backdrop-filter: blur(10px);
+}
+
+.stat-item:hover {
+  transform: translateY(-2px) scale(1.05);
+  box-shadow: 
+    0 20px 25px -5px rgba(59, 130, 246, 0.3),
+    0 10px 10px -5px rgba(59, 130, 246, 0.2);
+}
+
+.stat-item::before {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: -100%;
+  width: 100%;
+  height: 100%;
+  background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.1), transparent);
+
+}
+
+.stat-item:hover::before {
+  left: 100%;
+}
+
+.stat-label {
+  display: block;
+  font-size: 12px;
+  color: #94A3B8;
+  margin-bottom: 8px;
+  font-weight: 500;
+  letter-spacing: 0.5px;
+  text-transform: uppercase;
+}
+
+.stat-value {
+  display: block;
+  font-size: 28px;
+  font-weight: 700;
+  color: #00D4FF;
+  text-shadow: 
+    0 0 20px rgba(0, 212, 255, 0.6),
+    0 0 40px rgba(0, 212, 255, 0.3);
+  position: relative;
+  z-index: 1;
+}
+
+.stat-value.reduction {
+  color: #00E676;
+  text-shadow: 
+    0 0 20px rgba(0, 230, 118, 0.6),
+    0 0 40px rgba(0, 230, 118, 0.3);
+}
+
+.dashboard-content {
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+  min-height: calc(100vh - 200px);
+}
+
+.top-panels {
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr 1fr;
+  gap: 20px;
+  height: 120px;
+}
+
+.data-panel {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%),
+    radial-gradient(circle at bottom left, rgba(59, 130, 246, 0.08), transparent 50%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 10px 10px -5px rgba(0, 0, 0, 0.2),
+    0 0 0 1px rgba(255, 255, 255, 0.05);
+  backdrop-filter: blur(16px);
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  text-align: center;
+}
+
+.panel-title {
+  font-size: 12px;
+  color: #94A3B8;
+  margin-bottom: 8px;
+  font-weight: 500;
+  letter-spacing: 0.5px;
+  text-transform: uppercase;
+}
+
+.panel-value {
+  font-size: 24px;
+  font-weight: 700;
+  color: #00D4FF;
+  text-shadow: 
+    0 0 20px rgba(0, 212, 255, 0.6),
+    0 0 40px rgba(0, 212, 255, 0.3);
+  margin-bottom: 4px;
+}
+
+.panel-subtitle {
+  font-size: 11px;
+  color: #B8C8E0;
+  font-weight: 400;
+}
+
+.unit {
+  font-size: 16px;
+  color: #94A3B8;
+}
+
+.center-main-view {
+  display: grid;
+  grid-template-columns: 200px 1fr 300px;
+  gap: 20px;
+  flex: 1;
+}
+
+.left-control-panel {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 0 0 1px rgba(255, 255, 255, 0.05);
+  backdrop-filter: blur(16px);
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+
+.control-section {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.section-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: #ffffff;
+  margin-bottom: 8px;
+}
+
+.vertical-radio {
+  display: flex;
+  flex-direction: column;
+  gap: 8px;
+}
+
+.main-heatmap {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 0 0 1px rgba(255, 255, 255, 0.05);
+  backdrop-filter: blur(16px);
+  display: flex;
+  flex-direction: column;
+}
+
+.heatmap-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  padding-bottom: 15px;
+  border-bottom: 1px solid rgba(148, 163, 184, 0.2);
+}
+
+.main-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #ffffff;
+  margin: 0;
+}
+
+.date-selector {
+  display: flex;
+  align-items: center;
+}
+
+.heatmap-view {
+  flex: 1;
+}
+
+.right-data-panel {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 0 0 1px rgba(255, 255, 255, 0.05);
+  backdrop-filter: blur(16px);
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+
+.data-section {
+  display: flex;
+  flex-direction: column;
+  gap: 10px;
+}
+
+.mini-chart {
+  width: 100%;
+}
+
+.trend-controls {
+  margin-bottom: 10px;
+}
+
+.bottom-progress-panel {
+  display: grid;
+  grid-template-columns: 1fr 1fr;
+  gap: 40px;
+  height: 100px;
+}
+
+.progress-section {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 0 0 1px rgba(255, 255, 255, 0.05);
+  backdrop-filter: blur(16px);
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+}
+
+.progress-title {
+  font-size: 14px;
+  font-weight: 600;
+  color: #ffffff;
+  margin-bottom: 8px;
+}
+
+.progress-data {
+  display: flex;
+  align-items: baseline;
+  gap: 4px;
+  margin-bottom: 12px;
+}
+
+.progress-data .current {
+  font-size: 20px;
+  font-weight: 700;
+  color: #00D4FF;
+}
+
+.progress-data .separator {
+  font-size: 16px;
+  color: #94A3B8;
+}
+
+.progress-data .target {
+  font-size: 14px;
+  color: #B8C8E0;
+}
+
+.bottom-data-table {
+  margin-top: 20px;
+}
+
+.table-panel {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%),
+    radial-gradient(circle at bottom left, rgba(59, 130, 246, 0.08), transparent 50%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 20px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 10px 10px -5px rgba(0, 0, 0, 0.2),
+    0 0 0 1px rgba(255, 255, 255, 0.05),
+    inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  backdrop-filter: blur(16px);
+}
+
+.table-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 15px;
+  padding-bottom: 10px;
+  border-bottom: 1px solid rgba(148, 163, 184, 0.2);
+}
+
+.table-title {
+  font-size: 16px;
+  font-weight: 600;
+  color: #ffffff;
+  margin: 0;
+}
+
+.table-controls {
+  display: flex;
+  align-items: center;
+  gap: 10px;
+}
+
+.panel-card {
+  background: 
+    linear-gradient(135deg, rgba(15, 27, 46, 0.9) 0%, rgba(30, 41, 59, 0.85) 100%),
+    radial-gradient(circle at bottom left, rgba(59, 130, 246, 0.08), transparent 50%);
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  border-radius: 16px;
+  padding: 24px;
+  box-shadow: 
+    0 20px 25px -5px rgba(0, 0, 0, 0.3),
+    0 10px 10px -5px rgba(0, 0, 0, 0.2),
+    0 0 0 1px rgba(255, 255, 255, 0.05),
+    inset 0 1px 0 rgba(255, 255, 255, 0.1);
+  position: relative;
+  overflow: hidden;
+  backdrop-filter: blur(16px);
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+}
+
+
+
+.heatmap-card {
+  height: 500px;
+}
+
+.card-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  padding-bottom: 15px;
+  border-bottom: 1px solid rgba(81, 129, 219, 0.3);
+  position: relative;
+  z-index: 1;
+}
+
+.card-title {
+  font-size: 18px;
+  font-weight: bold;
+  color: #ffffff;
+  margin: 0;
+  text-shadow: 0 2px 4px rgba(0, 0, 0, 0.5);
+}
+
+.heatmap-controls {
+  display: flex;
+  align-items: center;
+}
+
+.scope-stats {
+  display: flex;
+  flex-direction: column;
+  gap: 15px;
+  position: relative;
+  z-index: 1;
+}
+
+.scope-item {
+  display: flex;
+  align-items: center;
+  padding: 20px;
+  border-radius: 12px;
+  background: 
+    linear-gradient(135deg, rgba(59, 130, 246, 0.12) 0%, rgba(147, 51, 234, 0.12) 100%),
+    radial-gradient(circle at top, rgba(255, 255, 255, 0.05), transparent 60%);
+  border-left: 4px solid #00D4FF;
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  position: relative;
+  overflow: hidden;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  backdrop-filter: blur(8px);
+}
+
+.scope-item:hover {
+  transform: translateY(-3px);
+  box-shadow: 
+    0 15px 30px -5px rgba(59, 130, 246, 0.25),
+    0 0 0 1px rgba(255, 255, 255, 0.1);
+}
+
+.scope-item::after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 2px;
+  background: linear-gradient(90deg, #3B82F6, #8B5CF6, #EC4899);
+  opacity: 0;
+  transition: opacity 0.3s ease;
+}
+
+.scope-item:hover::after {
+  opacity: 1;
+}
+
+/* 纰虫帓鏀剧粺璁℃牱寮� */
+.carbon-stats {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 20px;
+  gap: 15px;
+}
+
+.carbon-stat-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 12px;
+  padding: 20px;
+  background: 
+    linear-gradient(135deg, rgba(59, 130, 246, 0.12) 0%, rgba(147, 51, 234, 0.12) 100%),
+    radial-gradient(circle at top, rgba(255, 255, 255, 0.05), transparent 60%);
+  border-radius: 12px;
+  border: 1px solid rgba(148, 163, 184, 0.15);
+  flex: 1;
+  position: relative;
+  overflow: hidden;
+  transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+  backdrop-filter: blur(8px);
+}
+
+.carbon-stat-item:hover {
+  transform: translateY(-3px);
+  box-shadow: 
+    0 15px 30px -5px rgba(59, 130, 246, 0.25),
+    0 0 0 1px rgba(255, 255, 255, 0.1);
+}
+
+.carbon-stat-item::after {
+  content: '';
+  position: absolute;
+  top: 0;
+  left: 0;
+  right: 0;
+  height: 2px;
+  background: linear-gradient(90deg, #3B82F6, #8B5CF6, #EC4899);
+  opacity: 0;
+  transition: opacity 0.3s ease;
+}
+
+.carbon-stat-item:hover::after {
+  opacity: 1;
+}
+
+.carbon-label {
+  color: #94A3B8;
+  font-size: 11px;
+  text-align: center;
+  font-weight: 500;
+  letter-spacing: 0.5px;
+  text-transform: uppercase;
+}
+
+.carbon-value {
+  color: #00D4FF;
+  font-size: 18px;
+  font-weight: 700;
+  text-shadow: 
+    0 0 15px rgba(0, 212, 255, 0.6),
+    0 0 30px rgba(0, 212, 255, 0.3);
+  position: relative;
+}
+
+.scope-item.scope1 {
+  border-left-color: #FF6B6B;
+}
+
+.scope-item.scope2 {
+  border-left-color: #FFD93D;
+}
+
+.scope-item.scope3 {
+  border-left-color: #6BCF7F;
+}
+
+.scope-icon {
+  font-size: 24px;
+  margin-right: 15px;
+}
+
+.scope-info {
+  flex: 1;
+}
+
+.scope-name {
+  display: block;
+  font-weight: bold;
+  color: #ffffff;
+  margin-bottom: 5px;
+}
+
+.scope-value {
+  display: block;
+  font-size: 20px;
+  font-weight: bold;
+  color: #00D4FF;
+  margin-bottom: 3px;
+  text-shadow: 0 0 8px rgba(0, 212, 255, 0.5);
+}
+
+.scope-desc {
+  display: block;
+  font-size: 12px;
+  color: #B8C8E0;
+}
+
+.target-progress {
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+  position: relative;
+  z-index: 1;
+}
+
+.progress-item {
+  padding: 15px;
+  background: rgba(81, 129, 219, 0.1);
+  border-radius: 8px;
+  border: 1px solid rgba(81, 129, 219, 0.2);
+}
+
+.progress-info {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 10px;
+}
+
+.progress-label {
+  font-weight: bold;
+  color: #ffffff;
+}
+
+.progress-value {
+  color: #B8C8E0;
+  font-size: 14px;
+}
+
+.bottom-panel {
+  margin-top: 20px;
+}
+
+.table-controls {
+  display: flex;
+  align-items: center;
+}
+
+/* Element Plus 缁勪欢娣辫壊涓婚鏍峰紡 */
+:deep(.el-table) {
+  background: transparent !important;
+  color: #ffffff !important;
+}
+
+:deep(.el-table th) {
+  background: rgba(81, 129, 219, 0.2) !important;
+  color: #ffffff !important;
+  border-bottom: 1px solid rgba(81, 129, 219, 0.3) !important;
+}
+
+:deep(.el-table td) {
+  background: transparent !important;
+  color: #B8C8E0 !important;
+  border-bottom: 1px solid rgba(81, 129, 219, 0.1) !important;
+}
+
+:deep(.el-table tr:hover > td) {
+  background: rgba(81, 129, 219, 0.1) !important;
+}
+
+:deep(.el-input__wrapper) {
+  background: rgba(15, 27, 46, 0.8) !important;
+  border: 1px solid rgba(81, 129, 219, 0.3) !important;
+  color: #ffffff !important;
+}
+
+:deep(.el-input__inner) {
+  color: #ffffff !important;
+}
+
+:deep(.el-button--primary) {
+  background: linear-gradient(135deg, #5181DB, #D369E0) !important;
+  border: none !important;
+  box-shadow: 0 0 10px rgba(81, 129, 219, 0.5) !important;
+}
+
+/* 鍨傜洿鍗曢�夋寜閽粍鏍峰紡 */
+:deep(.vertical-radio) {
+  display: flex !important;
+  flex-direction: column !important;
+  gap: 6px !important;
+}
+
+:deep(.vertical-radio .el-radio-button) {
+  margin: 0 !important;
+  width: 100% !important;
+}
+
+:deep(.vertical-radio .el-radio-button__inner) {
+  background: rgba(59, 130, 246, 0.1) !important;
+  border: 1px solid rgba(148, 163, 184, 0.2) !important;
+  color: #B8C8E0 !important;
+  border-radius: 8px !important;
+  padding: 10px 16px !important;
+  width: 100% !important;
+  text-align: center !important;
+  font-size: 12px !important;
+  font-weight: 500 !important;
+}
+
+:deep(.vertical-radio .el-radio-button__inner:hover) {
+  background: rgba(59, 130, 246, 0.2) !important;
+  border-color: rgba(59, 130, 246, 0.4) !important;
+  color: #ffffff !important;
+}
+
+:deep(.vertical-radio .el-radio-button.is-active .el-radio-button__inner) {
+  background: linear-gradient(135deg, #3B82F6, #8B5CF6) !important;
+  border-color: #3B82F6 !important;
+  color: #ffffff !important;
+  box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3) !important;
+}
+
+:deep(.vertical-radio .el-radio-button:first-child .el-radio-button__inner) {
+  border-left: 1px solid rgba(148, 163, 184, 0.2) !important;
+}
+
+:deep(.el-radio-group .el-radio-button__inner) {
+  background: rgba(59, 130, 246, 0.1) !important;
+  border: 1px solid rgba(148, 163, 184, 0.2) !important;
+  color: #B8C8E0 !important;
+  border-radius: 6px !important;
+  padding: 6px 12px !important;
+  margin: 0 2px !important;
+  font-size: 12px !important;
+}
+
+:deep(.el-radio-group .el-radio-button__inner:hover) {
+  background: rgba(59, 130, 246, 0.2) !important;
+  border-color: rgba(59, 130, 246, 0.4) !important;
+  color: #ffffff !important;
+}
+
+:deep(.el-radio-group .el-radio-button.is-active .el-radio-button__inner) {
+  background: linear-gradient(135deg, #3B82F6, #8B5CF6) !important;
+  border-color: #3B82F6 !important;
+  color: #ffffff !important;
+  box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3) !important;
+}
+
+:deep(.el-date-editor .el-input__wrapper) {
+  background: rgba(15, 27, 46, 0.8) !important;
+  border: 1px solid rgba(81, 129, 219, 0.3) !important;
+}
+
+:deep(.el-progress-bar__outer) {
+  background: rgba(81, 129, 219, 0.2) !important;
+}
+
+:deep(.el-tag) {
+  background: rgba(81, 129, 219, 0.2) !important;
+  border: 1px solid rgba(81, 129, 219, 0.3) !important;
+  color: #ffffff !important;
+}
+
+:deep(.el-tag.el-tag--success) {
+  background: rgba(0, 230, 118, 0.2) !important;
+  border-color: rgba(0, 230, 118, 0.3) !important;
+  color: #00E676 !important;
+}
+
+:deep(.el-tag.el-tag--warning) {
+  background: rgba(255, 193, 7, 0.2) !important;
+  border-color: rgba(255, 193, 7, 0.3) !important;
+  color: #FFC107 !important;
+}
+
+:deep(.el-tag.el-tag--danger) {
+  background: rgba(244, 67, 54, 0.2) !important;
+  border-color: rgba(244, 67, 54, 0.3) !important;
+  color: #F44336 !important;
+}
+
+/* 鍝嶅簲寮忚璁� */
+@media (max-width: 1200px) {
+  .main-content {
+    flex-direction: column;
+  }
+  
+  .header-stats {
+    gap: 20px;
+  }
+}
+
+@media (max-width: 768px) {
+  .page-header {
+    flex-direction: column;
+    text-align: center;
+    gap: 20px;
+  }
+  
+  .header-stats {
+    justify-content: center;
+  }
+  
+  .carbon-management {
+    padding: 10px;
+  }
+}
+</style>
\ No newline at end of file
diff --git a/src/views/index.vue b/src/views/index.vue
index 0e7fdcf..2888b16 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -386,7 +386,6 @@
 }
 // 搴斾粯搴旀敹缁熻
 const statisticsReceivable = (type) => {
-	console.log(type)
 	statisticsReceivablePayable({type: radio1.value}).then((res) => {
 		barSeries.value[0].data = [
 			// { value: res.data.prepayMoney, itemStyle: { color: barColors2[0] } },
diff --git a/src/views/login.vue b/src/views/login.vue
index 968a932..960f097 100644
--- a/src/views/login.vue
+++ b/src/views/login.vue
@@ -181,8 +181,8 @@
 <style lang='scss' scoped>
 .login {
   height: 100%;
-  background-image: url("../assets/indexViews/DHDCView.png");
-  background-size: 100% 100%;
+  background-image: url("../assets/indexViews/JZYJView.png");
+  background-size: cover;
   position: relative;
 }
 .title {
diff --git a/src/views/personnelManagement/payrollManagement/components/formDia.vue b/src/views/personnelManagement/payrollManagement/components/formDia.vue
index 6dbc326..e4cf0b3 100644
--- a/src/views/personnelManagement/payrollManagement/components/formDia.vue
+++ b/src/views/personnelManagement/payrollManagement/components/formDia.vue
@@ -2,7 +2,7 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        :title="operationType === 'add' ? '鏂板鍏ヨ亴' : '缂栬緫浜哄憳'"
+        :title="operationType === 'add' ? '鏂板钖祫' : '缂栬緫钖祫'"
         width="50%"
         @close="closeDia"
     >
diff --git a/src/views/reportAnalysis/dataDashboard/index.vue b/src/views/reportAnalysis/dataDashboard/index.vue
new file mode 100644
index 0000000..6fe840b
--- /dev/null
+++ b/src/views/reportAnalysis/dataDashboard/index.vue
@@ -0,0 +1,1478 @@
+<template>
+    <div class="data-dashboard">
+      <!-- 鍏ㄥ睆鎸夐挳 - 绉诲姩鍒板乏涓婅 -->
+      <button class="fullscreen-btn" @click="toggleFullscreen" :title="isFullscreen ? '閫�鍑哄叏灞�' : '鍏ㄥ睆鏄剧ず'">
+        <svg v-if="!isFullscreen" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
+          <path d="M8 3v3a2 2 0 0 1-2 2H3m18 0h-3a2 2 0 0 1-2-2V3m0 18v-3a2 2 0 0 1 2-2h3M3 16h3a2 2 0 0 1 2 2v3"/>
+        </svg>
+        <svg v-else width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
+          <path d="M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3"/>
+        </svg>
+      </button>
+
+      <!-- 椤堕儴鏍囬鏍� -->
+      <div class="dashboard-header">
+      </div>
+
+      <!-- 涓昏鍐呭鍖哄煙 -->
+      <div class="dashboard-content">
+      <!-- 宸︿晶鍖哄煙 -->
+      <div class="left-panel">
+        <!-- 瀹㈡埛淇℃伅缁熻鍒嗘瀽 -->
+				<div class="panel-header">
+					<span class="panel-title">瀹㈡埛淇℃伅缁熻鍒嗘瀽</span>
+				</div>
+        <div class="panel-item-customers">
+					<div class="panel-title-second">
+						<div class="panel-title-icon"></div>
+						<div class="total-customers">
+							<span class="label">鎬诲悎鍚岄噾棰�(鍏�)</span>
+							<span class="value">{{sum}}</span>
+						</div>
+<!--						<div class="jiantou"></div>-->
+					</div>
+					<!-- 楗煎浘鍖哄煙 -->
+					<div style="display: flex;align-items: center;gap: 20px;justify-content: space-evenly;height: 82%;margin-top: 20px">
+						<div style="width: 240px; height: 240px; background-image: url('/src/assets/BI/zonghetongbingtubiankuang@2x.png'); background-size: contain; background-position: center; background-repeat: no-repeat; display: flex; align-items: center; justify-content: center;">
+							<Echarts ref="chart" :legend="pieLegend" :chartStyle="chartStylePie"
+											 :series="materialPieSeries"
+											 :tooltip="pieTooltip"
+											 :options="{backgroundColor: 'transparent'}"
+											 style="margin-left: 5px;"></Echarts>
+						</div>
+						<ul class="contract-list" style="margin: 0; padding: 0; display: flex; flex-direction: column;justify-content: space-around; height: 100%; overflow-y: auto; scroll-behavior: smooth;" ref="refContractList">
+							<li v-for="item in materialPieSeries[0].data" :key="item.name" style="list-style: none; margin-bottom: 12px;">
+								<div style="display: flex;align-items: center;justify-content: space-between;width: 100%">
+									<div class="line" :style="{color: item.itemStyle.color}">鈻� {{item.name}}</div>
+									<div style="font-weight: 700;font-size: 16px;color: #85B1E4;">锟{item.value}}</div>
+								</div>
+							</li>
+						</ul>
+					</div>
+        </div>
+
+        <!-- 璐ㄩ噺缁熻 -->
+				<div class="panel-header">
+					<span class="panel-title">璐ㄩ噺缁熻</span>
+				</div>
+				<div class="main-panel">
+					<div class="panel-item-customers">
+						<div class="quality-cards">
+							<div class="quality-cardSec">
+								<div class="quality-card one"></div>
+								<div class="quality-cardTitle">
+									<div>鍘熸潗鏂欏凡妫�娴嬫暟</div>
+									<div>{{qualityStatisticsObject.supplierNum}}浠�</div>
+								</div>
+							</div>
+							<div class="quality-cardSec">
+								<div class="quality-card two"></div>
+								<div class="quality-cardTitle">
+									<div>杩囩▼妫�楠屾暟閲�</div>
+									<div>{{qualityStatisticsObject.processNum}}浠�</div>
+								</div>
+							</div>
+							<div class="quality-cardSec">
+								<div class="quality-card three"></div>
+								<div class="quality-cardTitle">
+									<div>鍑哄巶宸叉鏁伴噺</div>
+									<div>{{qualityStatisticsObject.factoryNum}}浠�</div>
+								</div>
+							</div>
+						</div>
+						<Echarts ref="chart"
+										 :chartStyle="chartStyle"
+										 :grid="grid"
+										 :legend="barLegend"
+										 :series="barSeries1"
+										 :tooltip="tooltip"
+										 :xAxis="xAxis1"
+										 :yAxis="yAxis1"
+										 :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+										 style="height: 260px"></Echarts>
+					</div>
+				</div>
+      </div>
+
+      <!-- 涓棿鍖哄煙 -->
+      <div class="center-panel">
+        <!-- 椤堕儴缁熻鍗$墖 -->
+        <div class="stats-cards">
+          <div class="stat-card">
+            <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
+            <div class="card-content">
+              <span class="card-label">鍛樺伐鎬绘暟</span>
+              <span class="card-value">{{totalStaff}}</span>
+            </div>
+          </div>
+          <div class="stat-card">
+            <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
+            <div class="card-content">
+              <span class="card-label">瀹㈡埛鎬绘暟</span>
+              <span class="card-value">{{totalCustomers}}</span>
+            </div>
+          </div>
+          <div class="stat-card">
+            <img src="@/assets/BI/icon@2x.png" alt="鍥炬爣" class="card-icon" />
+            <div class="card-content">
+              <span class="card-label">渚涘簲鍟嗘�绘暟</span>
+              <span class="card-value">{{totalSuppliers}}</span>
+            </div>
+          </div>
+        </div>
+
+        <!-- 璁惧缁熻 -->
+        <div class="equipment-stats">
+          <div class="equipment-header">
+						<img src="@/assets/BI/shujutongjiicon@2x.png" alt="鍥炬爣" class="equipment-icon" />
+            <span class="equipment-title">璁惧缁熻</span>
+          </div>
+          <div class="equipment-items">
+            <div class="equipment-item">
+              <span class="equipment-value">{{equipmentNum}}</span>
+              <span class="equipment-label">璁惧鎬绘暟</span>
+            </div>
+            <div class="equipment-item">
+              <span class="equipment-value">{{equipmentRepair}}</span>
+              <span class="equipment-label">寰呯淮淇澶�</span>
+            </div>
+            <div class="equipment-item">
+              <span class="equipment-value">{{equipmentMaintain}}</span>
+              <span class="equipment-label">寰呬繚鍏昏澶�</span>
+            </div>
+            <div class="equipment-item">
+              <span class="equipment-value">{{totalMeasuring}}</span>
+              <span class="equipment-label">璁¢噺鍣ㄥ叿鎬绘暟</span>
+            </div>
+          </div>
+        </div>
+
+        <!-- 浜嬩欢鍚嶇О -->
+        <div class="event-info">
+          <div class="event-header">
+						<img src="@/assets/BI/shijianmingxiicon@2x.png" alt="鍥炬爣" class="event-icon" />
+            <span class="event-title">浜嬩欢鍚嶇О</span>
+          </div>
+          <div class="event-content">
+						<ul class="todo-list" v-if="todoList.length > 0" ref="refTodoList"> 
+   <li v-for="item in todoList" :key="item.id"> 
+    <div style="display: flex;flex-direction: column;justify-content: space-between;width: 100%;gap: 20px"> 
+     <div style="display: flex;justify-content: space-between;align-items: center;"> 
+      <div class="todo-title">寰呭姙缂栧彿锛歿{item.approveId}}</div> 
+      <div class="todo-division">閮ㄩ棬锛歿{item.approveDeptName}}</div> 
+      <div class="todo-time">{{item.approveTime}}</div> 
+     </div> 
+     <div class="todo-division">寰呭姙浜嬬敱锛歿{item.approveReason}}</div> 
+    </div> 
+   </li> 
+ </ul>
+						<div v-else style="text-align: center">
+							鏆傛棤鏁版嵁
+						</div>
+          </div>
+        </div>
+				
+				<div class="financial-header">
+					<span class="financial-title">璐㈠姟鍒嗘瀽</span>
+				</div>
+				<div class="main-panel">
+					<div class="panel-item-customers">
+						<div class="event-header">
+							<img src="@/assets/BI/shijianmingxiicon@2x.png" alt="鍥炬爣" class="event-icon" />
+							<span class="event-title">缁忚惀鎴愭灉鍒嗘瀽</span>
+						</div>
+						<Echarts ref="chart"
+										 :chartStyle="chartStyle"
+										 :grid="grid"
+										 :legend="barLegend1"
+										 :series="barSeries11"
+										 :tooltip="tooltip"
+										 :xAxis="xAxis3"
+										 :yAxis="yAxis3"
+										 :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+										 style="height: 300px"></Echarts>
+					</div>
+				</div>
+      </div>
+
+      <!-- 鍙充晶鍖哄煙 -->
+      <div class="right-panel">
+        <!-- 搴旀敹搴斾粯缁熻 -->
+				<div class="panel-header">
+					<span class="panel-title">搴旀敹搴斾粯缁熻</span>
+				</div>
+				<div class="panel-item-customers">
+					<div style="display: flex;justify-content: space-between;margin-bottom: 20px;">
+						<div class="section-title">搴旀敹搴斾粯缁熻</div>
+						<el-radio-group v-model="radio1" size="large" @change="statisticsReceivable" class="custom-radio-group">
+							<el-radio-button label="鎸夊懆" :value="1" />
+							<el-radio-button label="鎸夋湀" :value="2" />
+							<el-radio-button label="鎸夊搴�" :value="3" />
+						</el-radio-group>
+					</div>
+					<Echarts ref="chart"
+									 :color="barColors2"
+									 :chartStyle="chartStyle"
+									 :grid="grid"
+                   :legend="barLegend2"
+									 :series="barSeries"
+									 :tooltip="tooltip"
+									 :xAxis="xAxis"
+									 :yAxis="yAxis"
+									 :options="{backgroundColor: 'transparent', textStyle: {color: '#B8C8E0'}}"
+									 style="height: 260px"></Echarts>
+				</div>
+
+        <!-- 鍥炴涓庡紑绁ㄥ垎鏋� -->
+         <div class="panel-header">
+					<span class="panel-title">鍥炴涓庡紑绁ㄥ垎鏋�</span>
+				</div>
+        <div class="panel-item-customers" style="padding-top: 60px;">
+					<Echarts ref="chart" :chartStyle="chartStyle" :grid="grid" :legend="lineLegend" :series="lineSeries"
+								 :tooltip="tooltipLine" :xAxis="xAxis2" :yAxis="yAxis2" :options="{backgroundColor: 'transparent', textStyle: {color: '#FFFFFF'}}" style="height: 270px;"></Echarts>
+				</div>
+      </div>
+      </div>
+    </div>
+</template>
+
+<script setup>
+import * as echarts from 'echarts'
+import { ref, onMounted, onBeforeUnmount, nextTick } from 'vue'
+import autofit from 'autofit.js'
+import Echarts from "@/components/Echarts/echarts.vue";
+import {
+	analysisCustomerContractAmounts, getAmountHalfYear,
+	homeTodos,
+	qualityStatistics,
+	statisticsReceivablePayable
+} from "@/api/viewIndex.js";
+import {staffOnJobListPage} from "@/api/personnelManagement/employeeRecord.js";
+import {listCustomer} from "@/api/basicData/customerFile.js";
+import {listSupplier} from "@/api/basicData/supplierManageFile.js";
+import {getLedgerPage} from "@/api/equipmentManagement/ledger.js";
+import {getRepairPage} from "@/api/equipmentManagement/repair.js";
+import {getUpkeepPage} from "@/api/equipmentManagement/upkeep.js";
+import {measuringInstrumentListPage} from "@/api/equipmentManagement/measurementEquipment.js";
+import {listPageAnalysis} from "@/api/financialManagement/expenseManagement.js";
+
+// 鍏ㄥ睆鐩稿叧鐘舵��
+const isFullscreen = ref(false);
+
+// 鍝嶅簲寮忔暟鎹�
+const currentTime = ref('')
+const currentDate = ref('')
+const timer = ref(null)
+const charts = ref([])
+
+// 鍥捐〃寮曠敤
+const customerPieChartRef = ref(null)
+const salesBarChartRef = ref(null)
+const dataBarChartRef = ref(null)
+const financialAreaChartRef = ref(null)
+const realtimeLineChartRef = ref(null)
+const refContractList = ref(null)
+const refTodoList = ref(null)
+const timerScroll = ref(null)
+
+const chartStylePie = {
+	width: '140%',
+	height: '140%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
+}
+const materialPieSeries = ref([
+	{
+		type: 'pie',
+		radius: ['0%', '90%'],
+		avoidLabelOverlap: false,
+		itemStyle: {
+			borderColor: '#fff',
+			borderWidth: 0
+		},
+		label: {
+			show: false
+		},
+		data: []
+	}
+])
+const pieLegend = reactive({
+	show: false,
+})
+const sum = ref(0)
+const totalStaff = ref(0)
+const totalCustomers = ref(0)
+const totalSuppliers = ref(0)
+const yny = ref(0)
+const chain = ref(0)
+const equipmentNum = ref(0)
+const equipmentRepair = ref(0)
+const equipmentMaintain = ref(0)
+const totalMeasuring = ref(0)
+const pieTooltip = reactive({
+	trigger: 'item',
+	formatter: function (params) {
+		// 鍔ㄦ�佺敓鎴愭彁绀轰俊鎭紝鍩轰簬鏁版嵁椤圭殑 name 灞炴��
+		const description = params.name === '鏈湀鍥炴閲戦' ? '鏈湀鍥炴閲戦' : '搴旀敹娆鹃噾棰�';
+		return `<div style="color: #B8C8E0">${description} ${params.value}鍏� ${params.percent}%</div>`;
+	},
+	position: 'right'
+})
+
+const qualityStatisticsObject = ref({
+	supplierNum: 0,
+	processNum: 0,
+	factoryNum: 0,
+})
+const chartStyle = {
+	width: '100%',
+	height: '150%' // 璁剧疆鍥捐〃瀹瑰櫒鐨勯珮搴�
+}
+const barSeries = ref([
+	{
+		name: '搴斾粯閲戦',
+		type: 'bar',
+		data: [],
+		label: {
+			show: true,
+		},
+		itemStyle: {
+			color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+				{ offset: 0, color: '#00A4ED' },
+				{ offset: 1, color: '#4EE4FF' }
+			])
+		}
+	},
+	{
+		name: '搴旀敹閲戦',
+		type: 'bar',
+		data: [],
+		label: {
+			show: true,
+		},
+		itemStyle: {
+			color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+				{ offset: 0, color: '#537EF5' },
+				{ offset: 1, color: '#9061F8' }
+			])
+		}
+	}
+])
+const radio1 = ref(1)
+const barColors2 = ['#5181DB', '#D369E0', '#F2CA6D', '#60CCA8']
+const grid = {
+	left: '3%',
+	right: '4%',
+	bottom: '3%',
+	containLabel: true
+}
+const lineLegend = {
+	show: true,
+  textStyle: { color: '#B8C8E0' },
+	data: ['寮�绁�', '鍥炴']
+}
+const lineSeries = ref([
+	{
+		type: 'line',
+		data: [],
+		label: {
+			show: true
+		},
+		showSymbol: true, // 鏄剧ず鍦嗙偣
+	},
+])
+const tooltipLine = {
+	trigger: 'axis',
+}
+const yAxis2 = ref([
+	{
+		type: 'value',
+	}
+])
+const xAxis2 = ref([
+	{
+		type: 'category',
+		data: [],
+		axisLabel: {
+			interval: 0,
+			formatter: function(value) {
+				return value.replace(/~/g, '\n');
+			},
+		}
+	}
+])
+const barLegend2 = {
+	show: true,
+	textStyle: { color: '#B8C8E0' },
+	data: ['搴斾粯閲戦', '搴旀敹閲戦']
+}
+const barLegend = {
+	show: true,
+	textStyle: { color: '#B8C8E0' },
+	data: ['鍘熸潗鏂欎笉鍚堟牸鏁�', '杩囩▼涓嶅悎鏍兼暟', '鍑哄巶涓嶅悎鏍兼暟']
+}
+const barLegend1 = {
+	show: true,
+	textStyle: { color: '#B8C8E0' },
+	data: ['鎬绘敹鍏�', '鎬绘敮鍑�', '鍑�鏀跺叆']
+}
+const barSeries11 = ref([
+	{
+		name: '鎬绘敹鍏�',
+		type: 'bar',
+		barGap: 0,
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#00A4ED' },
+					{ offset: 0, color: '#4EE4FF' }
+				]
+			}
+		},
+		data: []
+	},
+	{
+		name: '鎬绘敮鍑�',
+		type: 'bar',
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#3378FF' },
+					{ offset: 0, color: '#4E8AFF' }
+				]
+			}
+		},
+		data: []
+	},
+	{
+		name: '鍑�鏀跺叆',
+		type: 'bar',
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#537EF5' },
+					{ offset: 0, color: '#9061F8' }
+				]
+			}
+		},
+		data: []
+	},
+])
+const barSeries1 = ref([
+	{
+		name: '鍘熸潗鏂欎笉鍚堟牸鏁�',
+		type: 'bar',
+		barGap: 0,
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#00A4ED' },
+					{ offset: 0, color: '#4EE4FF' }
+				]
+			}
+		},
+		data: []
+	},
+	{
+		name: '杩囩▼涓嶅悎鏍兼暟',
+		type: 'bar',
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#3378FF' },
+					{ offset: 0, color: '#4E8AFF' }
+				]
+			}
+		},
+		data: []
+	},
+	{
+		name: '鍑哄巶涓嶅悎鏍兼暟',
+		type: 'bar',
+		emphasis: {
+			focus: 'series'
+		},
+		itemStyle: {
+			color: {
+				type: 'linear',
+				x: 0,
+				y: 0,
+				x2: 0,
+				y2: 1,
+				colorStops: [
+					{ offset: 1, color: '#537EF5' },
+					{ offset: 0, color: '#9061F8' }
+				]
+			}
+		},
+		data: []
+	},
+])
+const tooltip = {
+	trigger: 'axis',
+	axisPointer: {
+		type: 'shadow'
+	},
+	formatter: function (params) {
+		let result = params[0].axisValueLabel + '<br/>';
+		params.forEach(item => {
+			result += `<div style="color: #B8C8E0">${item.marker} ${item.seriesName}: ${item.value}</div>`;
+		});
+		return result;
+	}
+}
+const xAxis = [{
+	type: 'value',
+}]
+const yAxis = [{
+	type: 'category',
+	data: ['搴旀敹搴斾粯缁熻']
+}]
+const xAxis1 = ref([{
+	type: 'category',
+	axisTick: { show: false },
+	axisLabel: { color: '#B8C8E0' },
+	data: []
+}])
+const yAxis1 = [{
+	type: 'value',
+	axisLabel: { color: '#B8C8E0' }
+}]
+const xAxis3 = ref([{
+	type: 'category',
+	axisTick: { show: false },
+	axisLabel: { color: '#B8C8E0' },
+	data: []
+}])
+const yAxis3 = [{
+	type: 'value',
+	axisLabel: { color: '#B8C8E0' }
+}]
+
+// 寰呭姙浜嬮」
+const todoList = ref([])
+
+// 绐楀彛澶у皬鍙樺寲澶勭悊
+const handleResize = () => {
+  charts.value.forEach(chart => {
+    if (chart && chart.resize) {
+      chart.resize()
+    }
+  })
+}
+
+// 閿�姣佸浘琛ㄥ疄渚�
+const disposeCharts = () => {
+  charts.value.forEach(chart => {
+    if (chart && chart.dispose) {
+      chart.dispose()
+    }
+  })
+  charts.value = []
+}
+// 鍚堝悓閲戦
+const analysisCustomer = () => {
+	analysisCustomerContractAmounts().then((res) => {
+		sum.value = res.data.sum
+		yny.value = res.data.yny
+		chain.value = res.data.chain
+		// 涓烘瘡涓暟鎹」鍒嗛厤闅忔満棰滆壊
+		materialPieSeries.value[0].data = res.data.item.map(item => ({
+			...item,
+			itemStyle: { color: getRandomColor() }
+		}))
+	})
+}
+// 璐ㄦ缁熻
+const qualityStatisticsInfo = () => {
+	qualityStatistics().then((res) => {
+		res.data.item.forEach(item => {
+			xAxis1.value[0].data.push(item.date)
+			barSeries1.value[0].data.push(item.supplierNum)
+			barSeries1.value[1].data.push(item.processNum)
+			barSeries1.value[2].data.push(item.factoryNum)
+		})
+		qualityStatisticsObject.value.supplierNum = res.data.supplierNum
+		qualityStatisticsObject.value.processNum = res.data.processNum
+		qualityStatisticsObject.value.factoryNum = res.data.factoryNum
+	})
+}
+// 璐㈠姟缁熻
+const accountStatisticsInfo = () => {
+	listPageAnalysis().then((res) => {
+		xAxis3.value[0].data = res.data.days
+		barSeries11.value[0].data = res.data.totalIncome
+		barSeries11.value[1].data = res.data.totalExpense
+		barSeries11.value[2].data = res.data.netIncome
+	})
+}
+const getNum = () => {
+	const params = {
+		pageNum: -1,
+		pageSize: -1,
+	}
+	staffOnJobListPage({...params, staffState: 1}).then(res => {
+		totalStaff.value = res.data.total
+	})
+	listCustomer(params).then((res) => {
+		totalCustomers.value = res.total;
+	});
+	listSupplier(params).then((res) => {
+		totalSuppliers.value = res.data.total
+	});
+}
+const getLedgerNum = () => {
+	const params = {
+		pageNum: -1,
+		pageSize: -1,
+	}
+	getLedgerPage(params).then((res) => {
+		equipmentNum.value = res.data.total
+	});
+	getRepairPage(params).then((res) => {
+		equipmentRepair.value = res.data.total
+	});
+	getUpkeepPage(params).then((res) => {
+		equipmentMaintain.value = res.data.total
+	});
+	measuringInstrumentListPage(params).then((res) => {
+		totalMeasuring.value = res.data.total
+	});
+}
+// 寰呭姙浜嬮」
+const todoInfoS = () => {
+	homeTodos().then((res) => {
+		todoList.value = res.data
+		// 鍦ㄨ幏鍙栧埌寰呭姙浜嬮」鏁版嵁鍚庯紝鍒濆鍖栨粴鍔ㄥ姛鑳�
+		nextTick(() => {
+			initTodoListScroll()
+		})
+	})
+}
+// 搴斾粯搴旀敹缁熻
+const statisticsReceivable = (type) => {
+	statisticsReceivablePayable({type: radio1.value}).then((res) => {
+		// 璁剧疆搴斾粯閲戦鏁版嵁
+		barSeries.value[0].data = [
+			{ value: res.data.payableMoney }
+		]
+		// 璁剧疆搴旀敹閲戦鏁版嵁
+		barSeries.value[1].data = [
+			{ value: res.data.receivableMoney }
+		]
+	})
+}
+const getAmountHalfYearNum = async () => {
+	const res = await getAmountHalfYear()
+	console.log(res)
+	const monthName = []
+	const receiptAmount = []
+	const invoiceAmount = []
+	res.data.forEach(item => {
+		monthName.push(item.month)
+		receiptAmount.push(item.receiptAmount)
+		invoiceAmount.push(item.invoiceAmount)
+	})
+	// 姝g‘鍝嶅簲寮忚祴鍊硷細鍒涘缓鏂扮殑 xAxis 鍜� series 瀵硅薄
+	xAxis2.value[0].data = monthName
+	xAxis2.value[0].data = monthName.map(item => item.replace(/~/g, '\n~'));
+	lineSeries.value = [
+		{
+			name: '寮�绁�',
+			type: 'line',
+			data: receiptAmount,
+			stack: 'Total',
+			areaStyle: {
+				color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+					{
+						offset: 0,
+						color: 'rgba(131, 207, 255, 1)'
+					},
+					{
+						offset: 1,
+						color: 'rgba(186, 228, 255, 1)'
+					}
+				])
+			},
+			itemStyle: {
+				color: '#2D99FF',
+				borderColor: '#2D99FF'
+			},
+			emphasis: {
+				focus: 'series'
+			},
+			lineStyle: {
+				width: 0
+			},
+			showSymbol: true,
+		},
+		{
+			name: '鍥炴',
+			type: 'line',
+			data: invoiceAmount,
+			stack: 'Total',
+			lineStyle: {
+				width: 0
+			},
+			itemStyle: {
+				color: '#83CFFF',
+				borderColor: '#83CFFF'
+			},
+			showSymbol: true,
+			areaStyle: {
+				color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+					{
+						offset: 0,
+						color: 'rgba(54, 153, 255, 1)'
+					},
+					{
+						offset: 1,
+						color: 'rgba(89, 169, 254, 1)'
+					}
+				])
+			},
+			emphasis: {
+				focus: 'series'
+			},
+		}
+	]
+}
+
+// 鑷姩杞崲鍛ㄣ�佹湀銆佸搴︾殑瀹氭椂鍣�
+const autoSwitchTimer = ref(null)
+// 鍒濆鍖栧緟鍔炰簨椤瑰垪琛ㄦ粴鍔ㄥ姛鑳�
+const initTodoListScroll = () => {
+	const todoList = refTodoList.value
+	// 寮哄埗鍚敤婊氬姩锛屼笉妫�鏌ヤ换浣曟潯浠�
+	if (todoList) {
+		// 鍒涘缓涓�涓厠闅嗛」锛岀敤浜庡疄鐜版棤缂濇粴鍔�
+		const scrollItems = Array.from(todoList.querySelectorAll('li'))
+		if (scrollItems.length > 0) {
+			// 纭繚鏈夎冻澶熺殑椤圭洰鐢ㄤ簬婊氬姩
+			// 濡傛灉椤圭洰澶皯锛屽澶嶅埗鍑犳浠ョ‘淇濇粴鍔ㄦ晥鏋�
+			if (scrollItems.length < 4) {
+				const originalItems = [...scrollItems]
+				for (let i = 0; i < 4; i++) {
+					originalItems.forEach(item => {
+						const clone = item.cloneNode(true)
+						todoList.appendChild(clone)
+					})
+				}
+				// 閲嶆柊鑾峰彇鎵�鏈夐」鐩�
+				scrollItems.push(...Array.from(todoList.querySelectorAll('li')).slice(scrollItems.length));
+			}
+			const itemHeight = scrollItems[0]?.offsetHeight || 0
+			const containerHeight = todoList.clientHeight
+			const cloneCount = Math.ceil(containerHeight / itemHeight) + 2
+			
+			// 鍏嬮殕鍓嶅嚑涓」鐩苟娣诲姞鍒板垪琛ㄦ湯灏撅紝瀹炵幇鏃犵紳婊氬姩
+			for (let i = 0; i < cloneCount; i++) {
+				const clone = scrollItems[i % scrollItems.length].cloneNode(true)
+				todoList.appendChild(clone)
+			}
+			
+			let scrollPosition = 0
+			const scrollSpeed = 1.5 // 澧炲姞婊氬姩閫熷害锛屼娇婊氬姩鏇村姞鏄庢樉
+			const pauseTime = 3000 // 婊氬姩鏆傚仠鏃堕棿
+			let isPaused = false
+			let lastTimestamp = 0
+			
+			// 杩炵画婊氬姩鍔ㄧ敾鍑芥暟
+			function scrollAnimation(timestamp) {
+				if (!lastTimestamp) lastTimestamp = timestamp
+				const deltaTime = timestamp - lastTimestamp
+				lastTimestamp = timestamp
+				
+				if (!isPaused) {
+					scrollPosition += scrollSpeed * (deltaTime / 16) // 鏍囧噯鍖栦负60fps鐨勯�熷害
+					
+					// 褰撴粴鍔ㄨ秴杩囧師濮嬪唴瀹归暱搴︽椂锛岄噸缃綅缃疄鐜版棤缂濇粴鍔�
+					const maxScroll = Math.max(todoList.scrollHeight - containerHeight - cloneCount * itemHeight, itemHeight * scrollItems.length)
+					if (scrollPosition >= maxScroll) {
+						scrollPosition = 0
+						todoList.scrollTop = 0
+					} else {
+						todoList.scrollTop = scrollPosition
+					}
+				}
+				
+				todoList._animationFrame = requestAnimationFrame(scrollAnimation)
+			}
+			
+			// 鍚姩婊氬姩鍔ㄧ敾
+			todoList._animationFrame = requestAnimationFrame(scrollAnimation)
+			
+			// 璁剧疆婊氬姩-鏆傚仠-婊氬姩鐨勫惊鐜晥鏋�
+			const pauseTimer = setInterval(() => {
+				isPaused = !isPaused
+			}, pauseTime)
+			
+			// 娓呯悊瀹氭椂鍣�
+			todoList._pauseTimer = pauseTimer
+		}
+	}
+}
+const getRandomColor = () => {
+	// 鐢熸垚娴呰壊锛歊銆丟銆丅 鍒嗛噺閮藉湪 150-255 涔嬮棿
+	const r = Math.floor(Math.random() * 106) + 150; // 150-255
+	const g = Math.floor(Math.random() * 106) + 150; // 150-255
+	const b = Math.floor(Math.random() * 106) + 150; // 150-255
+	// 灏� RGB 杞崲涓哄崄鍏繘鍒堕鑹�
+	return '#' + r.toString(16).padStart(2, '0') + g.toString(16).padStart(2, '0') + b.toString(16).padStart(2, '0');
+}
+
+// 鏇存柊鏃堕棿
+const updateTime = () => {
+  const now = new Date()
+  currentTime.value = now.toLocaleTimeString('zh-CN', { hour12: false })
+  currentDate.value = now.toLocaleDateString('zh-CN', {
+    year: 'numeric',
+    month: '2-digit',
+    day: '2-digit',
+    weekday: 'long'
+  })
+}
+
+// 鍒濆鍖栨椂闂�
+const initTime = () => {
+  updateTime()
+  timer.value = setInterval(updateTime, 1000)
+}
+// 鍏ㄥ睆鍔熻兘瀹炵幇 - 閽堝data-dashboard鍏冪礌
+const toggleFullscreen = () => {
+	const element = document.querySelector('.data-dashboard')
+	
+	if (!element) return
+	
+	if (!isFullscreen.value) {
+		if (element.requestFullscreen) {
+			element.requestFullscreen()
+		} else if (element.webkitRequestFullscreen) {
+			element.webkitRequestFullscreen()
+		} else if (element.msRequestFullscreen) {
+			element.msRequestFullscreen()
+		}
+	} else {
+		if (document.exitFullscreen) {
+			document.exitFullscreen()
+		} else if (document.webkitExitFullscreen) {
+			document.webkitExitFullscreen()
+		} else if (document.msExitFullscreen) {
+			document.msExitFullscreen()
+		}
+	}
+}
+
+// 鐩戝惉鍏ㄥ睆鍙樺寲浜嬩欢
+const handleFullscreenChange = () => {
+  const fullscreenElement = document.fullscreenElement || 
+                           document.webkitFullscreenElement || 
+                           document.msFullscreenElement
+  isFullscreen.value = fullscreenElement && fullscreenElement.classList.contains('data-dashboard')
+}
+
+// 鐢熷懡鍛ㄦ湡閽╁瓙
+onMounted(() => {
+  initTime()
+  // 浣跨敤nextTick纭繚DOM瀹屽叏娓叉煋鍚庡啀鍒濆鍖栧浘琛�
+  nextTick(() => {
+    // 鍒濆鍖朼utofit鑷�傚簲
+    autofit.init({ dh: 1440, dw: 2560, el: '.data-dashboard', resize: true }, false)
+    
+    // 娣诲姞鑷姩婊氬姩鍔ㄧ敾鏁堟灉 - 瀹㈡埛淇℃伅鍒楄〃
+    const contractList = refContractList.value
+    if (contractList && contractList.scrollHeight > contractList.clientHeight) {
+      // 鍒涘缓涓�涓厠闅嗛」锛岀敤浜庡疄鐜版棤缂濇粴鍔�
+      const scrollItems = Array.from(contractList.querySelectorAll('li'))
+      const itemHeight = scrollItems[0]?.offsetHeight || 0
+      const containerHeight = contractList.clientHeight
+      const cloneCount = Math.ceil(containerHeight / itemHeight) + 2
+      
+      // 鍏嬮殕鍓嶅嚑涓」鐩苟娣诲姞鍒板垪琛ㄦ湯灏撅紝瀹炵幇鏃犵紳婊氬姩
+      for (let i = 0; i < cloneCount; i++) {
+        const clone = scrollItems[i % scrollItems.length].cloneNode(true)
+        contractList.appendChild(clone)
+      }
+      
+      let scrollPosition = 0
+      const scrollSpeed = 1.5 // 澧炲姞婊氬姩閫熷害锛屼娇婊氬姩鏇村姞鏄庢樉
+      const pauseTime = 3000 // 婊氬姩鏆傚仠鏃堕棿
+      let isPaused = false
+      let lastTimestamp = 0
+      
+      // 杩炵画婊氬姩鍔ㄧ敾鍑芥暟
+      function scrollAnimation(timestamp) {
+        if (!lastTimestamp) lastTimestamp = timestamp
+        const deltaTime = timestamp - lastTimestamp
+        lastTimestamp = timestamp
+        
+        if (!isPaused) {
+          scrollPosition += scrollSpeed * (deltaTime / 16) // 鏍囧噯鍖栦负60fps鐨勯�熷害
+          
+          // 褰撴粴鍔ㄨ秴杩囧師濮嬪唴瀹归暱搴︽椂锛岄噸缃綅缃疄鐜版棤缂濇粴鍔�
+          if (scrollPosition >= contractList.scrollHeight - containerHeight - cloneCount * itemHeight) {
+            scrollPosition = 0
+            contractList.scrollTop = 0
+          } else {
+            contractList.scrollTop = scrollPosition
+          }
+        }
+        
+        timerScroll.value = requestAnimationFrame(scrollAnimation)
+      }
+      
+      // 鍚姩婊氬姩鍔ㄧ敾
+      timerScroll.value = requestAnimationFrame(scrollAnimation)
+      
+      // 璁剧疆婊氬姩-鏆傚仠-婊氬姩鐨勫惊鐜晥鏋�
+      const pauseTimer = setInterval(() => {
+        isPaused = !isPaused
+      }, pauseTime)
+      
+      // 娓呯悊瀹氭椂鍣�
+      contractList._pauseTimer = pauseTimer
+    }
+    
+    // 寰呭姙浜嬮」鍒楄〃婊氬姩鍔熻兘宸茬Щ鑷硉odoInfoS鍑芥暟涓紝鍦ㄨ幏鍙栨暟鎹悗鍒濆鍖�
+  })
+  
+  window.addEventListener('resize', handleResize)
+  analysisCustomer()
+  qualityStatisticsInfo()
+	accountStatisticsInfo()
+  getNum()
+  getLedgerNum()
+  todoInfoS()
+	statisticsReceivable()
+	getAmountHalfYearNum()
+  
+  // 璁剧疆鑷姩杞崲鍛ㄣ�佹湀銆佸搴︾殑瀹氭椂鍣紝姣�10绉掑垏鎹竴娆�
+  autoSwitchTimer.value = setInterval(() => {
+    // 寰幆鍒囨崲锛�1(鍛�) -> 2(鏈�) -> 3(瀛e害) -> 1(鍛�)
+    radio1.value = radio1.value === 3 ? 1 : radio1.value + 1
+    statisticsReceivable()
+  }, 10000) // 10绉掑垏鎹竴娆�
+})
+
+onBeforeUnmount(() => {
+  if (timer.value) {
+    clearInterval(timer.value)
+  }
+  if (timerScroll.value) {
+    cancelAnimationFrame(timerScroll.value)
+  }
+  // 娓呯悊婊氬姩鍒楄〃鐨勬殏鍋滃畾鏃跺櫒
+  const contractList = refContractList.value
+  if (contractList && contractList._pauseTimer) {
+    clearInterval(contractList._pauseTimer)
+  }
+  
+  // 娓呯悊寰呭姙浜嬮」鍒楄〃鐨勫姩鐢诲拰瀹氭椂鍣�
+  const todoList = refTodoList.value
+  if (todoList) {
+    if (todoList._animationFrame) {
+      cancelAnimationFrame(todoList._animationFrame)
+      todoList._animationFrame = null
+    }
+    if (todoList._pauseTimer) {
+      clearInterval(todoList._pauseTimer)
+      todoList._pauseTimer = null
+    }
+  }
+  
+  // 娓呯悊鑷姩杞崲鍛ㄣ�佹湀銆佸搴︾殑瀹氭椂鍣�
+  if (autoSwitchTimer.value) {
+    clearInterval(autoSwitchTimer.value)
+    autoSwitchTimer.value = null
+  }
+  
+  window.removeEventListener('resize', handleResize)
+  window.removeEventListener('fullscreenchange', handleFullscreenChange)
+  window.removeEventListener('webkitfullscreenchange', handleFullscreenChange)
+  window.removeEventListener('MSFullscreenChange', handleFullscreenChange)
+  // 绉婚櫎鎴戜滑娣诲姞鐨刟utofit鍔ㄦ�佽皟鏁寸洃鍚櫒
+  if (window._autofitUpdateHandler) {
+    window.removeEventListener('resize', window._autofitUpdateHandler)
+    delete window._autofitUpdateHandler
+  }
+  disposeCharts()
+  // 鍏抽棴autofit
+  autofit.off()
+})
+</script>
+
+<style scoped>
+.data-dashboard {
+  position: relative;
+  width: 100%;
+	height: 100%;
+  overflow: hidden;
+	background-image: url("@/assets/BI/backImage@2x.png");
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+/* 鍏ㄥ睆鐘舵�佺殑鏍峰紡 */
+.data-dashboard:fullscreen {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  background-color: inherit;
+  z-index: 9999;
+}
+
+/* Webkit娴忚鍣ㄥ墠缂� */
+.data-dashboard:-webkit-full-screen {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  background-color: inherit;
+  z-index: 9999;
+}
+
+/* MS娴忚鍣ㄥ墠缂� */
+.data-dashboard:-ms-fullscreen {
+  width: 100%;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  background-color: inherit;
+  z-index: 9999;
+}
+
+
+.dashboard-header {
+  position: relative;
+  z-index: 1;
+  height: 170px;
+	background-image: url("@/assets/BI/biaoti.png");
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+.fullscreen-btn {
+  position: absolute;
+  top: 10px;
+  left: 20px;
+  width: 40px;
+  height: 40px;
+  background: rgba(0, 20, 60, 0.8);
+  border: 1px solid rgba(0, 212, 255, 0.3);
+  border-radius: 6px;
+  color: #00d4ff;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  transition: all 0.3s;
+  z-index: 10000;
+}
+
+.fullscreen-btn:hover {
+  background: rgba(0, 30, 90, 0.9);
+  border-color: rgba(0, 212, 255, 0.5);
+}
+
+.dashboard-content {
+  position: relative;
+  z-index: 1;
+  display: flex;
+  gap: 30px;
+  padding: 0 30px;
+  height: calc(100% - 120px);
+  overflow: hidden;
+}
+
+/* 纭繚鍚勯潰鏉胯兘澶熸纭樉绀� */
+.left-panel, .center-panel, .right-panel {
+  overflow: hidden;
+}
+
+.left-panel,
+.right-panel {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  gap: 24px;
+	width: 520px;
+}
+
+.center-panel {
+  flex: 1.5;
+  display: flex;
+  flex-direction: column;
+  gap: 20px;
+}
+.panel-item-customers {
+	border: 1px solid #1A58B0;
+	padding: 18px;
+	width: 100%;
+	height: 540px;
+}
+.panel-title-second {
+	height: 60px;
+	display: flex;
+	gap: 12px;
+	margin-bottom: 20px;
+	align-items: center;
+}
+.quality-cards {
+	display: flex;
+	gap: 12px;
+	width: 100%;
+	height: 94px;
+	justify-content: space-between;
+	align-items: center;
+}
+.quality-cardSec {
+	display: flex;
+}
+.quality-cardTitle {
+	font-weight: 400;
+	font-size: 14px;
+	color: #FFFFFF;
+	display: flex;
+	align-items: flex-start;
+	flex-direction: column;
+}
+.quality-card {
+	width: 80px;
+	height: 60px;
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+.quality-card.one {
+	background-image: url("@/assets/BI/yuancailiaoyijianicon@2x.png");
+}
+.quality-card.two {
+	background-image: url("@/assets/BI/guochengyijianicon@2x.png");
+}
+.quality-card.three {
+	background-image: url("@/assets/BI/chuchangyijianicon@2x.png");
+	
+}
+.panel-title-icon {
+	width: 60px;
+	height: 60px;
+	background-image: url("@/assets/BI/hetongicon.png");
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+.panel-header {
+	background-image: url("@/assets/BI/kehuhetongback@2x.png");
+	background-size: 100% 100%;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+
+.panel-title {
+	width: 100%;
+	font-weight: 500;
+	font-size: 16px;
+	color: #D9ECFF;
+	padding-left: 46px;
+	line-height: 36px;
+}
+.total-customers {
+	background-image: url("@/assets/BI/hetongjineback@2x.png");
+	background-size: cover;
+	background-position: center;
+	background-repeat: no-repeat;
+	width: 90%;
+	height: 60px;
+	display: flex;
+	align-items: center;
+	padding: 0 20px;
+	gap: 20px;
+}
+
+.total-customers .label {
+	font-weight: 500;
+	font-size: 16px;
+	color: #FFFFFF;
+}
+
+.total-customers .value {
+	font-weight: 500;
+	font-size: 40px;
+	background: linear-gradient(360deg, #008BFD 0%, #FFFFFF 100%);
+	-webkit-background-clip: text;
+	-webkit-text-fill-color: transparent;
+	background-clip: text;
+}
+
+.contract-list {
+	margin-top: 16px;
+	font-size: 14px;
+	color: #666;
+	list-style: none;
+	padding: 0;
+	height: 82%;
+	overflow-y: auto;
+	width: 460px;
+	/* 闅愯棌婊氬姩鏉′絾淇濈暀婊氬姩鍔熻兘 */
+	scrollbar-width: none; /* Firefox */
+	-ms-overflow-style: none; /* IE鍜孍dge */
+}
+
+/* Chrome銆丼afari鍜孫pera */
+.contract-list::-webkit-scrollbar {
+	display: none;
+}
+.line {
+	position: relative;
+	width: 230px;
+}
+.line::after {
+	content: '';
+	position: absolute;
+	right: 2px;
+	top: 0;
+	bottom: 0;
+	width: 1px;
+	background-color: #C9C5C5;
+	border-radius: 2px;
+}
+.contract-list li {
+	margin-top: 10px;
+}
+.stats-cards {
+  display: flex;
+  gap: 30px;
+}
+
+.stat-card {
+  flex: 1;
+  display: flex;
+  align-items: center;
+	background-image: url("@/assets/BI/border@2x.png");
+	background-size: 100% 100%;
+	background-position: center;
+	background-repeat: no-repeat;
+  height: 142px;
+}
+
+.card-icon {
+  width: 100px;
+  height: 100px;
+  margin: 20px 20px 0 10px;
+}
+
+.card-content {
+  display: flex;
+  flex-direction: column;
+	gap: 10px;
+}
+
+.card-value {
+	font-weight: 500;
+	font-size: 40px;
+  background: linear-gradient(360deg, #008BFD 0%, #FFFFFF 100%);
+  -webkit-background-clip: text;
+  -webkit-text-fill-color: transparent;
+  background-clip: text;
+}
+
+.card-label {
+	font-weight: 400;
+	font-size: 19px;
+	color: rgba(208,231,255,0.7);
+}
+
+.equipment-stats {
+	border: 1px solid #1A58B0;
+  padding: 18px;
+  height: 240px;
+}
+.equipment-header {
+	font-weight: 500;
+	font-size: 21px;
+	display: flex;
+	border-bottom: 1px solid;
+	border-image: linear-gradient( 270deg, rgba(0,126,255,0) 0%, rgba(0,126,255,0.4549) 35%, #007EFF 78%, #007EFF 100%) 1;
+	padding-bottom: 2px;
+}
+.equipment-title {
+	font-weight: 500;
+	font-size: 21px;
+	background: linear-gradient(360deg, #056DFF 0%, #43E8FC 100%);
+	-webkit-background-clip: text;
+	-webkit-text-fill-color: transparent;
+	background-clip: text;
+	line-height: 50px;
+}
+.equipment-icon {
+	width: 50px;
+	height: 50px;
+}
+.equipment-items {
+  display: flex;
+  justify-content: space-around;
+  gap: 30px;
+}
+
+.equipment-item {
+  text-align: center;
+}
+
+.equipment-value {
+  display: block;
+	font-weight: 500;
+	font-size: 40px;
+	color: #FFFFFF;
+	width: 120px;
+	height: 110px;
+	line-height: 110px;
+	background-image: url("@/assets/BI/shujutongji@2x.png");
+	background-size: 100% 100%;
+	background-position: center;
+	background-repeat: no-repeat;
+  margin-bottom: 8px;
+}
+
+.equipment-label {
+	font-weight: 500;
+	font-size: 21px;
+	color: #FFFFFE;
+}
+
+.event-info {
+	background-image: url("@/assets/BI/shijianmingchengbeijing@2x.png");
+	background-size: 100% 100%;
+	background-position: center;
+	background-repeat: no-repeat;
+  padding: 20px;
+  height: 186px;
+}
+.event-header {
+	display: flex;
+	align-items: center;
+}
+.event-icon {
+	width: 40px;
+	height: 40px;
+}
+.event-title {
+	font-weight: 500;
+	font-size: 24px;
+	color: #FFFFFE;
+	line-height: 30px;
+}
+.todo-list {
+  list-style: none;
+  padding: 0;
+  margin: 0;
+  height: 120px; /* 鎸夌敤鎴疯姹傝皟鏁撮珮搴� */
+  overflow: hidden;
+  font-size: 15px;
+}
+.todo-list li {
+	border-radius: 8px;
+	margin-bottom: 12px;
+	padding: 12px 40px;
+	height: 74px;
+	display: flex;
+	justify-content: space-between;
+	align-items: center;
+}
+.todo-title {
+	font-weight: 400;
+	font-size: 20px;
+	color: #FFFFFE;
+	position: relative;
+}
+.todo-title::before {
+	content: ''; /* 蹇呴渶锛岃〃绀鸿繖閲屾湁涓�涓唴瀹� */
+	position: absolute;
+	left: -10px; /* 瀹氫綅鍒板乏渚� */
+	top: 50%; /* 鍨傜洿灞呬腑 */
+	transform: translateY(-50%); /* 寰皟鍨傜洿灞呬腑 */
+	width: 6px; /* 鍦嗙殑鐩村緞 */
+	height: 6px; /* 鍦嗙殑鐩村緞 */
+	background: #498CEB;
+	border-radius: 50%; /* 璁╁叾鍙樻垚鍦嗗舰 */
+}
+.todo-division {
+	font-weight: 400;
+	font-size: 20px;
+	color: #FFFFFE;
+}
+.todo-time {
+	font-weight: 400;
+	font-size: 20px;
+	color: #FFFFFE;
+}
+.financial-header {
+	background-image: url("@/assets/BI/caiwufenxiback@2x.png");
+	background-size: 100% 100%;
+	background-position: center;
+	background-repeat: no-repeat;
+}
+.financial-title {
+	width: 100%;
+	font-weight: 500;
+	font-size: 16px;
+	color: #D9ECFF;
+	padding-left: 46px;
+	line-height: 36px;
+}
+
+/* 鑷畾涔夊崟閫夋寜閽粍鏍峰紡 */
+.custom-radio-group :deep(.el-radio-button__inner) {
+  background-color: transparent;
+  color: white;
+  border-color: rgba(255, 255, 255, 0.3);
+}
+
+.custom-radio-group :deep(.el-radio-button__original-radio:checked + .el-radio-button__inner) {
+  background-color: rgba(255, 255, 255, 0.2);
+  color: white;
+  border-color: rgba(255, 255, 255, 0.5);
+  box-shadow: -1px 0 0 0 rgba(255, 255, 255, 0.5);
+}
+</style>
\ No newline at end of file
diff --git a/src/views/salesManagement/receiptPayment/index.vue b/src/views/salesManagement/receiptPayment/index.vue
index 0799d8f..e8b8b3b 100644
--- a/src/views/salesManagement/receiptPayment/index.vue
+++ b/src/views/salesManagement/receiptPayment/index.vue
@@ -224,7 +224,7 @@
     </div>
     <el-dialog
       v-model="dialogFormVisible"
-      title="鏂板鍙戠エ鍙烽〉闈�"
+      title="鏂板鍥炴椤甸潰"
       width="70%"
       @close="closeDia"
     >
@@ -317,31 +317,31 @@
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12">
-            <el-form-item label="鐧昏浜猴細" prop="registrant">
-              <el-input
-                v-model="form.registrant"
-                placeholder="璇疯緭鍏�"
-                clearable
-                disabled
-              />
-            </el-form-item>
-          </el-col>
+					<el-col :span="12">
+						<el-form-item label="鍥炴鏃ユ湡锛�" prop="receiptPaymentDate">
+							<el-date-picker
+								style="width: 100%"
+								v-model="form.receiptPaymentDate"
+								value-format="YYYY-MM-DD"
+								format="YYYY-MM-DD"
+								type="date"
+								placeholder="璇烽�夋嫨"
+								clearable
+							/>
+						</el-form-item>
+					</el-col>
         </el-row>
         <el-row :gutter="30">
-          <el-col :span="12">
-            <el-form-item label="鏉ユ鏃ユ湡锛�" prop="receiptPaymentDate">
-              <el-date-picker
-                style="width: 100%"
-                v-model="form.receiptPaymentDate"
-                value-format="YYYY-MM-DD"
-                format="YYYY-MM-DD"
-                type="date"
-                placeholder="璇烽�夋嫨"
-                clearable
-              />
-            </el-form-item>
-          </el-col>
+					<el-col :span="12">
+						<el-form-item label="鐧昏浜猴細" prop="registrant">
+							<el-input
+								v-model="form.registrant"
+								placeholder="璇疯緭鍏�"
+								clearable
+								disabled
+							/>
+						</el-form-item>
+					</el-col>
         </el-row>
       </el-form>
       <template #footer>
diff --git a/vite.config.js b/vite.config.js
index 061360c..b4b6129 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -1,82 +1,82 @@
-import { defineConfig, loadEnv } from "vite";
-import path from "path";
-import createVitePlugins from "./vite/plugins";
-
-// https://vitejs.dev/config/
-export default defineConfig(({ mode, command }) => {
-  const env = loadEnv(mode, process.cwd());
-  const { VITE_APP_ENV } = env;
-  const baseUrl =
-    VITE_APP_ENV == "development"
-      ? "http://114.132.189.42:8089" // 寮�鍙戠幆澧冨悗绔帴鍙�
-      : "http://114.132.189.42:9032"; // 鐢熶骇鐜鍚庣鎺ュ彛
-
-  return {
-    // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
-    // 榛樿鎯呭喌涓嬶紝vite 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂
-    // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
-    base: VITE_APP_ENV === "production" ? "/" : "/",
-    plugins: createVitePlugins(env, command === "build"),
-    resolve: {
-      // https://cn.vitejs.dev/config/#resolve-alias
-      alias: {
-        // 璁剧疆璺緞
-        "~": path.resolve(__dirname, "./"),
-        // 璁剧疆鍒悕
-        "@": path.resolve(__dirname, "./src"),
-      },
-      // https://cn.vitejs.dev/config/#resolve-extensions
-      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
-    },
-    // 鎵撳寘閰嶇疆
-    build: {
-      // https://vite.dev/config/build-options.html
-      sourcemap: command === "build" ? false : "inline",
-      outDir: "dist",
-      assetsDir: "assets",
-      chunkSizeWarningLimit: 2000,
-      rollupOptions: {
-        output: {
-          chunkFileNames: "static/js/[name]-[hash].js",
-          entryFileNames: "static/js/[name]-[hash].js",
-          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
-        },
-      },
-    },
-    // vite 鐩稿叧閰嶇疆
-    server: {
-      port: 8001,
-      host: true,
-      open: true,
-      proxy: {
-        // https://cn.vitejs.dev/config/#server-proxy
-        "/dev-api": {
-          target: baseUrl,
-          changeOrigin: true,
-          rewrite: (p) => p.replace(/^\/dev-api/, ""),
-        },
-        // springdoc proxy
-        "^/v3/api-docs/(.*)": {
-          target: baseUrl,
-          changeOrigin: true,
-        },
-      },
-    },
-    css: {
-      postcss: {
-        plugins: [
-          {
-            postcssPlugin: "internal:charset-removal",
-            AtRule: {
-              charset: (atRule) => {
-                if (atRule.name === "charset") {
-                  atRule.remove();
-                }
-              },
-            },
-          },
-        ],
-      },
-    },
-  };
-});
+import { defineConfig, loadEnv } from "vite";
+import path from "path";
+import createVitePlugins from "./vite/plugins";
+
+// https://vitejs.dev/config/
+export default defineConfig(({ mode, command }) => {
+  const env = loadEnv(mode, process.cwd());
+  const { VITE_APP_ENV } = env;
+  const baseUrl =
+    VITE_APP_ENV == "development"
+      ? "http://114.132.189.42:9036" // 寮�鍙戠幆澧冨悗绔帴鍙�
+      : "http://114.132.189.42:9036"; // 鐢熶骇鐜鍚庣鎺ュ彛
+
+  return {
+    // 閮ㄧ讲鐢熶骇鐜鍜屽紑鍙戠幆澧冧笅鐨刄RL銆�
+    // 榛樿鎯呭喌涓嬶紝vite 浼氬亣璁句綘鐨勫簲鐢ㄦ槸琚儴缃插湪涓�涓煙鍚嶇殑鏍硅矾寰勪笂
+    // 渚嬪 https://www.ruoyi.vip/銆傚鏋滃簲鐢ㄨ閮ㄧ讲鍦ㄤ竴涓瓙璺緞涓婏紝浣犲氨闇�瑕佺敤杩欎釜閫夐」鎸囧畾杩欎釜瀛愯矾寰勩�備緥濡傦紝濡傛灉浣犵殑搴旂敤琚儴缃插湪 https://www.ruoyi.vip/admin/锛屽垯璁剧疆 baseUrl 涓� /admin/銆�
+    base: VITE_APP_ENV === "production" ? "/" : "/",
+    plugins: createVitePlugins(env, command === "build"),
+    resolve: {
+      // https://cn.vitejs.dev/config/#resolve-alias
+      alias: {
+        // 璁剧疆璺緞
+        "~": path.resolve(__dirname, "./"),
+        // 璁剧疆鍒悕
+        "@": path.resolve(__dirname, "./src"),
+      },
+      // https://cn.vitejs.dev/config/#resolve-extensions
+      extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
+    },
+    // 鎵撳寘閰嶇疆
+    build: {
+      // https://vite.dev/config/build-options.html
+      sourcemap: command === "build" ? false : "inline",
+      outDir: "dist",
+      assetsDir: "assets",
+      chunkSizeWarningLimit: 2000,
+      rollupOptions: {
+        output: {
+          chunkFileNames: "static/js/[name]-[hash].js",
+          entryFileNames: "static/js/[name]-[hash].js",
+          assetFileNames: "static/[ext]/[name]-[hash].[ext]",
+        },
+      },
+    },
+    // vite 鐩稿叧閰嶇疆
+    server: {
+      port: 80,
+      host: true,
+      open: true,
+      proxy: {
+        // https://cn.vitejs.dev/config/#server-proxy
+        "/dev-api": {
+          target: baseUrl,
+          changeOrigin: true,
+          rewrite: (p) => p.replace(/^\/dev-api/, ""),
+        },
+        // springdoc proxy
+        "^/v3/api-docs/(.*)": {
+          target: baseUrl,
+          changeOrigin: true,
+        },
+      },
+    },
+    css: {
+      postcss: {
+        plugins: [
+          {
+            postcssPlugin: "internal:charset-removal",
+            AtRule: {
+              charset: (atRule) => {
+                if (atRule.name === "charset") {
+                  atRule.remove();
+                }
+              },
+            },
+          },
+        ],
+      },
+    },
+  };
+});

--
Gitblit v1.9.3