From 9f5e836044835351021363824a704674e2789449 Mon Sep 17 00:00:00 2001
From: zss <zss@example.com>
Date: 星期三, 01 四月 2026 17:45:03 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_银川_中盛建材' into dev_银川_中盛建材

---
 src/views/index.vue |  222 ++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 171 insertions(+), 51 deletions(-)

diff --git a/src/views/index.vue b/src/views/index.vue
index c6f00fc..bd0d274 100644
--- a/src/views/index.vue
+++ b/src/views/index.vue
@@ -2,9 +2,9 @@
   <div class="home-page">
     <div class="top-bar">
       <div class="user-box">
-        <!-- <img :src="userStore.avatar"
+        <img :src="userStore.avatar"
              class="avatar"
-             alt="" /> -->
+             alt="" />
         <div>
           <div class="hello">{{ userStore.roleName || "绯荤粺绠$悊鍛�" }}锛屼綘濂�</div>
           <div class="sub">鐧诲綍鏃堕棿锛歿{ userStore.currentLoginTime }}</div>
@@ -16,9 +16,9 @@
                    type="primary"
                    plain
                    @click="refreshDashboardData">鍒锋柊鏁版嵁</el-button>
-        <el-button size="small"
+        <!-- <el-button size="small"
                    plain
-                   @click="configDialogVisible = true">棣栭〉閰嶇疆</el-button>
+                   @click="configDialogVisible = true">棣栭〉閰嶇疆</el-button> -->
       </div>
     </div>
     <div class="content-grid">
@@ -40,7 +40,7 @@
             </el-button>
           </div>
         </section>
-        <section class="section-card">
+        <!-- <section class="section-card">
           <div class="section-title">閲嶇偣寰呭姙</div>
           <div class="todo-row"
                v-for="todo in todos"
@@ -49,7 +49,7 @@
                     :type="todo.type">{{ todo.level }}</el-tag>
             <span>{{ todo.title }}</span>
           </div>
-        </section>
+        </section> -->
         <section class="section-card">
           <div class="section-title">缁忚惀鍏虫敞</div>
           <div class="focus-row"
@@ -61,33 +61,17 @@
         </section>
         <section class="section-card flex-fill-card">
           <div class="section-title-row">
-            <div class="section-title">浠婃棩寰呭鐞�</div>
+            <div class="section-title">浠婂勾閿�鍞噾棰濆垎鏋�</div>
             <el-radio-group v-model="pendingFilter"
                             size="small">
-              <el-radio-button label="all">鍏ㄩ儴</el-radio-button>
-              <el-radio-button label="mine">鎴戠殑</el-radio-button>
-              <el-radio-button label="high">楂樹紭鍏�</el-radio-button>
+              <el-radio-button label="mine">鏉挎潗</el-radio-button>
+              <el-radio-button label="high">鐮屽潡</el-radio-button>
             </el-radio-group>
           </div>
-          <div class="task-row"
-               v-for="task in filteredPendingTasks"
-               :key="task.id">
-            <div class="task-left">
-              <el-tag size="small"
-                      :type="task.type">{{ task.level }}</el-tag>
-              <span class="task-title">{{ task.title }}</span>
-            </div>
-            <el-button link
-                       type="primary"
-                       @click="goTo(task.path)">鍘诲鐞�</el-button>
-          </div>
-          <el-empty v-if="filteredPendingTasks.length === 0"
-                    description="鏆傛棤寰呭鐞嗕簨椤�"
-                    :image-size="80" />
         </section>
       </div>
       <div class="right-col">
-        <section class="section-card"
+        <!-- <section class="section-card"
                  v-if="isSectionVisible('trendCards')">
           <div class="section-title">鏈�杩�7澶╁叧閿寚鏍囪秼鍔�</div>
           <div class="trend-cards">
@@ -111,7 +95,7 @@
               </div>
             </div>
           </div>
-        </section>
+        </section> -->
         <section class="section-card"
                  v-if="isSectionVisible('planTrend')">
           <div class="section-title-row">
@@ -137,35 +121,25 @@
              v-if="isSectionVisible('qualityChart') || isSectionVisible('costChart')">
           <section class="section-card"
                    v-if="isSectionVisible('qualityChart')">
-            <div class="section-title-row">
-              <div class="section-title">璐ㄦ寮傚父鍒嗗竷</div>
-              <el-radio-group v-model="chartRangeQuality"
-                              size="small"
-                              @change="loadQualityData">
-                <el-radio-button :label="1">鍛�</el-radio-button>
-                <el-radio-button :label="2">鏈�</el-radio-button>
-                <el-radio-button :label="3">瀛e害</el-radio-button>
-              </el-radio-group>
-            </div>
+            <div class="section-title">浠婂勾鑳借�楃敤閲忚秼鍔�</div>
             <Echarts :chartStyle="chartStyle"
                      :grid="grid"
                      :tooltip="barTooltip"
-                     :xAxis="qualityXAxis"
+                     :xAxis="energyConsumptionXAxis"
                      :yAxis="valueYAxis"
-                     :series="qualitySeries"
+                     :series="energyConsumptionSeries"
                      style="height: 260px" />
           </section>
           <section class="section-card"
                    v-if="isSectionVisible('costChart')">
-            <div class="section-title">鑳借�椾笌鎴愭湰缁撴瀯</div>
+            <div class="section-title">浠婂勾鑳借�楃被鍨嬪崰姣�</div>
             <Echarts :chartStyle="chartStyle"
-                     :legend="costLegend"
                      :tooltip="pieTooltip"
-                     :series="costSeries"
+                     :series="energyTypeSeries"
                      style="height: 260px" />
           </section>
         </div>
-        <section class="section-card"
+        <!-- <section class="section-card"
                  v-if="isSectionVisible('warningCenter')">
           <div class="section-title">寮傚父棰勮涓績</div>
           <div class="warning-row"
@@ -183,7 +157,7 @@
           <el-empty v-if="warningList.length === 0"
                     description="鏆傛棤寮傚父棰勮"
                     :image-size="80" />
-        </section>
+        </section> -->
         <section class="section-card mini-table-wrap"
                  v-if="isSectionVisible('planTable')">
           <div class="section-title">鐢熶骇璁″垝鎵ц鏄庣粏</div>
@@ -299,6 +273,7 @@
     qualityInspectionStatistics,
     nonComplianceWarning,
   } from "@/api/viewIndex.js";
+  import { energyConsumptionDetailStatistics } from "@/api/energyManagement/energyType";
 
   const router = useRouter();
   const userStore = useUserStore();
@@ -542,6 +517,150 @@
       data: [],
     },
   ]);
+
+  // 鑳借�楃被鍨嬪崰姣旀暟鎹�
+  const energyTypeSeries = reactive([
+    {
+      type: "pie",
+      radius: ["40%", "70%"],
+      center: ["50%", "50%"],
+      avoidLabelOverlap: false,
+      itemStyle: {
+        borderRadius: 10,
+        borderColor: "#fff",
+        borderWidth: 2,
+      },
+      label: {
+        show: true,
+        formatter: "{b}: {d}%",
+      },
+      data: [
+        { value: 0, name: "姘�", itemStyle: { color: "#409EFF" } },
+        { value: 0, name: "鐢�", itemStyle: { color: "#E6A23C" } },
+        { value: 0, name: "姘�", itemStyle: { color: "#F56C6C" } },
+      ],
+    },
+  ]);
+
+  // 鑳借�楃敤閲忚秼鍔垮浘琛�
+  const energyConsumptionXAxis = reactive({
+    type: "category",
+    data: [],
+    axisLabel: {
+      rotate: 45,
+    },
+  });
+
+  const energyConsumptionSeries = reactive([
+    {
+      name: "鐢ㄦ按閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#409EFF" },
+    },
+    {
+      name: "鐢ㄧ數閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#E6A23C" },
+    },
+    {
+      name: "鐢ㄦ皵閲�",
+      type: "bar",
+      data: [],
+      itemStyle: { color: "#67C23A" },
+    },
+  ]);
+
+  // 妯℃嫙鑳借�楁暟鎹�
+  const energyData = reactive({
+    water: 120,
+    electricity: 350,
+    gas: 80,
+  });
+
+  // 鏇存柊鑳借�楃被鍨嬪崰姣斿浘琛ㄥ拰鑳借�楃敤閲忚秼鍔垮浘琛�
+  const updateEnergyTypeChart = () => {
+    // 鏋勫缓鍙傛暟锛氫粖骞寸殑骞村垵鍒板勾鏈互鍙婂ぉ鏁�
+    const currentYear = new Date().getFullYear();
+    const params = {
+      startDate: `${currentYear}-01-01`,
+      endDate: `${currentYear}-12-31`,
+      days: 365,
+      state: "骞�",
+    };
+
+    // 璋冪敤鎺ュ彛鑾峰彇鏁版嵁
+    energyConsumptionDetailStatistics(params)
+      .then(res => {
+        if (res.code === 200) {
+          const data = res.data;
+          // 澶勭悊鑳借�楃被鍨嬪崰姣旀暟鎹�
+          const energyTypeData = data.energyCostDtos || [];
+
+          // 璁$畻鍚勮兘鑰楃被鍨嬬殑鎬绘秷鑰楅噺
+          let total = 0;
+          const typeMap = {
+            姘�: 0,
+            鐢�: 0,
+            姘�: 0,
+          };
+
+          // 鍑嗗鑳借�楃敤閲忚秼鍔垮浘琛ㄦ暟鎹�
+          const dates = [];
+          const waterConsumptionData = [];
+          const electricityConsumptionData = [];
+          const gasConsumptionData = [];
+
+          energyTypeData.forEach(item => {
+            // 鏀堕泦鏃ユ湡鍜屽悇鑳借�楃被鍨嬫暟鎹�
+            if (item.meterReadingDate) {
+              dates.push(item.meterReadingDate);
+              waterConsumptionData.push(item.waterConsumption || 0);
+              electricityConsumptionData.push(item.electricityConsumption || 0);
+              gasConsumptionData.push(item.gasConsumption || 0);
+            }
+
+            // 璁$畻鎬绘秷鑰楅噺
+            if (item.waterConsumption)
+              typeMap.姘� += Number(item.waterConsumption);
+            if (item.electricityConsumption)
+              typeMap.鐢� += Number(item.electricityConsumption);
+            if (item.gasConsumption) typeMap.姘� += Number(item.gasConsumption);
+          });
+
+          total = typeMap.姘� + typeMap.鐢� + typeMap.姘�;
+
+          // 鏇存柊鑳借�楃被鍨嬪崰姣斿浘琛ㄦ暟鎹�
+          energyTypeSeries[0].data = [
+            {
+              value: total > 0 ? ((typeMap.姘� / total) * 100).toFixed(2) : 0,
+              name: "姘�",
+              itemStyle: { color: "#409EFF" },
+            },
+            {
+              value: total > 0 ? ((typeMap.鐢� / total) * 100).toFixed(2) : 0,
+              name: "鐢�",
+              itemStyle: { color: "#E6A23C" },
+            },
+            {
+              value: total > 0 ? ((typeMap.姘� / total) * 100).toFixed(2) : 0,
+              name: "姘�",
+              itemStyle: { color: "#F56C6C" },
+            },
+          ];
+
+          // 鏇存柊鑳借�楃敤閲忚秼鍔垮浘琛ㄦ暟鎹�
+          energyConsumptionXAxis.data = dates;
+          energyConsumptionSeries[0].data = waterConsumptionData;
+          energyConsumptionSeries[1].data = electricityConsumptionData;
+          energyConsumptionSeries[2].data = gasConsumptionData;
+        }
+      })
+      .catch(err => {
+        console.error("鑾峰彇鑳借�楁暟鎹紓甯革細", err);
+      });
+  };
 
   const planTable = reactive([]);
   const recentTrendCards = reactive([
@@ -976,18 +1095,19 @@
   };
 
   const refreshDashboardData = () => {
-    loadHomeTodos();
-    loadOrderAndProgress();
-    loadPlanTrend();
-    loadQualityData();
-    loadCostComposition();
-    loadWarningCenter();
+    // loadHomeTodos();
+    // loadOrderAndProgress();
+    // loadPlanTrend();
+    // loadQualityData();
+    // loadCostComposition();
+    // loadWarningCenter();
+    updateEnergyTypeChart();
     lastUpdatedAt.value = new Date().toLocaleString();
   };
 
   onMounted(() => {
     // initSectionConfig();
-    // refreshDashboardData();
+    refreshDashboardData();
   });
 </script>
 

--
Gitblit v1.9.3