learshaw 2 місяців тому
батько
коміт
a0cb993efb

Різницю між файлами не показано, бо вона завелика
+ 667 - 952
ems-ui-cloud/src/views/adapter/devc/index.vue


Різницю між файлами не показано, бо вона завелика
+ 732 - 547
ems-ui-cloud/src/views/adapter/gcc/index.vue


Різницю між файлами не показано, бо вона завелика
+ 477 - 362
ems-ui-cloud/src/views/adapter/gczr/index.vue


Різницю між файлами не показано, бо вона завелика
+ 722 - 549
ems-ui-cloud/src/views/adapter/hm/index.vue


Різницю між файлами не показано, бо вона завелика
+ 722 - 549
ems-ui-cloud/src/views/adapter/ljcy/index.vue


+ 88 - 421
ems-ui-cloud/src/views/analysis/power/consume.vue

@@ -9,7 +9,7 @@
             clearable
             size="small"
             prefix-icon="el-icon-search"
-            style="margin-bottom: 20px"
+            style="margin-bottom: 0"
             @input="filterTree"
           />
         </div>
@@ -130,7 +130,6 @@
                         </span>
                         <small>{{ energyType === 'elec' ? 'kW·h' : 't' }}</small>
                       </span>
-                      <span class="card-sub card-sub-placeholder">&nbsp;</span>
                     </div>
                   </div>
                 </el-tooltip>
@@ -219,7 +218,6 @@
                           {{ formattedSummary.totalCost.suffix }}
                         </span>
                       </span>
-                      <span class="card-sub card-sub-placeholder">&nbsp;</span>
                     </div>
                   </div>
                 </el-tooltip>
@@ -236,7 +234,6 @@
                       {{ total }}
                       <small>条</small>
                     </span>
-                    <span class="card-sub card-sub-placeholder">&nbsp;</span>
                   </div>
                 </div>
               </el-col>
@@ -324,7 +321,6 @@
                       }}</span>
                   </template>
                 </el-table-column>
-
                 <el-table-column label="名称" prop="objName" min-width="200" show-overflow-tooltip fixed="left">
                   <template slot-scope="scope">
                     <div class="obj-cell">
@@ -334,106 +330,62 @@
                     </div>
                   </template>
                 </el-table-column>
-
                 <el-table-column label="统计时间" prop="statisticTime" width="140" align="center">
                   <template slot-scope="scope">
-                    <span v-if="formatStatisticTime(scope.row) !== '-'">
-                      {{ formatStatisticTime(scope.row) }}
-                    </span>
-                    <span v-else class="no-data">暂无数据</span>
+                    <span>{{
+                        formatStatisticTime(scope.row) !== '-' ? formatStatisticTime(scope.row) : '暂无数据'
+                      }}</span>
                   </template>
                 </el-table-column>
-
                 <template v-if="energyType === 'elec'">
                   <el-table-column label="总用电量(kW·h)" prop="totalElecQuantity" width="140" align="right">
                     <template slot-scope="scope">
-                      <span class="quantity-value"
-                            v-if="scope.row.totalElecQuantity !== null && scope.row.totalElecQuantity !== undefined"
-                      >
-                        {{ formatNumber(scope.row.totalElecQuantity) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="quantity-value">{{ formatNumber(scope.row.totalElecQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="尖峰(kW·h)" prop="sharpPeakQuantity" width="120" align="right">
                     <template slot-scope="scope">
-                      <span class="quantity-sharp"
-                            v-if="scope.row.sharpPeakQuantity !== null && scope.row.sharpPeakQuantity !== undefined"
-                      >
-                        {{ formatNumber(scope.row.sharpPeakQuantity) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="quantity-sharp">{{ formatNumber(scope.row.sharpPeakQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="峰时(kW·h)" prop="peakQuantity" width="120" align="right">
                     <template slot-scope="scope">
-                      <span class="quantity-peak"
-                            v-if="scope.row.peakQuantity !== null && scope.row.peakQuantity !== undefined"
-                      >
-                        {{ formatNumber(scope.row.peakQuantity) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="quantity-peak">{{ formatNumber(scope.row.peakQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="平时(kW·h)" prop="normalQuantity" width="120" align="right">
                     <template slot-scope="scope">
-                      <span class="quantity-normal"
-                            v-if="scope.row.normalQuantity !== null && scope.row.normalQuantity !== undefined"
-                      >
-                        {{ formatNumber(scope.row.normalQuantity) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="quantity-normal">{{ formatNumber(scope.row.normalQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="谷时(kW·h)" prop="valleyQuantity" width="120" align="right">
                     <template slot-scope="scope">
-                      <span class="quantity-valley"
-                            v-if="scope.row.valleyQuantity !== null && scope.row.valleyQuantity !== undefined"
-                      >
-                        {{ formatNumber(scope.row.valleyQuantity) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="quantity-valley">{{ formatNumber(scope.row.valleyQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="电费(元)" prop="totalElecCost" width="120" align="right">
                     <template slot-scope="scope">
-                      <span class="cost-value"
-                            v-if="scope.row.totalElecCost !== null && scope.row.totalElecCost !== undefined"
-                      >
-                        ¥{{ formatNumber(scope.row.totalElecCost) }}
-                      </span>
-                      <span v-else class="no-data">-</span>
+                      <span class="cost-value">¥{{ formatNumber(scope.row.totalElecCost) }}</span>
                     </template>
                   </el-table-column>
                 </template>
-
                 <template v-else>
                   <el-table-column label="总用水量(t)" prop="totalWaterQuantity" width="140" align="right">
                     <template slot-scope="scope">
                       <span class="quantity-value">{{ formatNumber(scope.row.totalWaterQuantity) }}</span>
                     </template>
                   </el-table-column>
-
                   <el-table-column label="水费(元)" prop="totalWaterCost" width="140" align="right">
                     <template slot-scope="scope">
                       <span class="cost-value">¥{{ formatNumber(scope.row.totalWaterCost) }}</span>
                     </template>
                   </el-table-column>
                 </template>
-
                 <el-table-column label="占比" width="150" align="center">
                   <template slot-scope="scope">
                     <div class="percentage-cell">
-                      <el-progress
-                        :percentage="getPercentage(scope.row)"
-                        :stroke-width="8"
-                        :show-text="false"
-                        :color="getProgressColor(getPercentage(scope.row))"
+                      <el-progress :percentage="getPercentage(scope.row)" :stroke-width="8" :show-text="false"
+                                   :color="getProgressColor(getPercentage(scope.row))"
                       />
                       <span class="percentage-text">{{ getPercentage(scope.row).toFixed(1) }}%</span>
                     </div>
@@ -461,7 +413,7 @@
 </template>
 
 <script>
-// 保持原有的 import 和 data
+// 脚本部分逻辑保持一致,仅保留核心逻辑,确保功能正常
 import {
   getAreaElecConsumptionList,
   getAreaElecConsumptionSummary,
@@ -476,7 +428,7 @@ import {
   exportAreaWaterConsumption,
   exportFacsWaterConsumption
 } from '@/api/device/energyConsumption'
-import { areaTreeSelect, areaTreeByFacsCategory } from '@/api/basecfg/area'
+import { areaTreeByFacsCategory } from '@/api/basecfg/area'
 import * as echarts from 'echarts'
 
 export default {
@@ -487,46 +439,26 @@ export default {
     lastMonth.setMonth(lastMonth.getMonth() - 1)
 
     return {
-      // 状态控制
       loading: false,
       summaryLoading: false,
       chartLoading: false,
       exportLoading: false,
-
-      // 分析类型:area-区域分析, facs-设施分析
       analysisType: 'area',
-      // 能源类型:elec-用电, water-用水
       energyType: 'elec',
-      // 视图模式
       viewMode: 'table',
-      // 图表类型
       chartType: 'bar',
-
-      // 树形数据
       searchKeyword: '',
       treeData: [],
-      treeProps: {
-        children: 'children',
-        label: 'label'
-      },
+      treeProps: { children: 'children', label: 'label' },
       defaultExpandedKeys: ['-1'],
       selectedLabel: '全部',
       selectedNode: null,
-
-      // 时间维度选项
       timeDimensions: [
         { label: '日', value: 'day' },
         { label: '月', value: 'month' },
         { label: '年', value: 'year' }
       ],
-
-      // 日期范围
-      dateRange: [
-        this.formatDate(lastMonth),
-        this.formatDate(today)
-      ],
-
-      // 查询参数
+      dateRange: [this.formatDate(lastMonth), this.formatDate(today)],
       queryParams: {
         pageNum: 1,
         pageSize: 10,
@@ -539,8 +471,6 @@ export default {
         endRecTime: null,
         orderFlag: 'desc'
       },
-
-      // 数据
       consumeList: [],
       total: 0,
       summaryData: {
@@ -551,12 +481,8 @@ export default {
         valleyQuantity: 0,
         totalCost: 0
       },
-
-      // 图表实例
       mainChartInstance: null,
       detailChartInstance: null,
-
-      // 日期选择器配置
       datePickerOptions: {
         shortcuts: [
           {
@@ -576,57 +502,24 @@ export default {
               start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
               picker.$emit('pick', [start, end])
             }
-          },
-          {
-            text: '最近三个月',
-            onClick(picker) {
-              const end = new Date()
-              const start = new Date()
-              start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
-              picker.$emit('pick', [start, end])
-            }
-          },
-          {
-            text: '今年',
-            onClick(picker) {
-              const end = new Date()
-              const start = new Date(end.getFullYear(), 0, 1)
-              picker.$emit('pick', [start, end])
-            }
           }
         ]
       }
     }
   },
   computed: {
-    // 日期选择器类型 - 注意:Element UI 不支持 yearrange,需要用 daterange 模拟
     datePickerType() {
-      const typeMap = {
-        day: 'daterange',
-        month: 'monthrange',
-        year: 'daterange' // Element UI 没有 yearrange,用 daterange 替代
-      }
+      const typeMap = { day: 'daterange', month: 'monthrange', year: 'daterange' }
       return typeMap[this.queryParams.timeDimension] || 'daterange'
     },
-    // 日期选择器格式
     datePickerFormat() {
-      const formatMap = {
-        day: 'yyyy-MM-dd',
-        month: 'yyyy-MM',
-        year: 'yyyy' // 显示格式为年份
-      }
+      const formatMap = { day: 'yyyy-MM-dd', month: 'yyyy-MM', year: 'yyyy' }
       return formatMap[this.queryParams.timeDimension] || 'yyyy-MM-dd'
     },
-    // 日期选择器值格式
     datePickerValueFormat() {
-      const formatMap = {
-        day: 'yyyy-MM-dd',
-        month: 'yyyy-MM',
-        year: 'yyyy-MM-dd' // 值格式仍然是完整日期,便于处理
-      }
+      const formatMap = { day: 'yyyy-MM-dd', month: 'yyyy-MM', year: 'yyyy-MM-dd' }
       return formatMap[this.queryParams.timeDimension] || 'yyyy-MM-dd'
     },
-    // 格式化后的汇总数据(使用计算属性缓存,优化性能)
     formattedSummary() {
       return {
         totalQuantity: this.formatSmartNumber(this.summaryData.totalQuantity),
@@ -663,21 +556,14 @@ export default {
     this.disposeCharts()
   },
   methods: {
-    // ... 保留所有其他方法 ...
-
-    /**
-     * 加载树形数据
-     */
     async loadTreeData() {
       try {
-        // 无论分析类型,都加载设施分类为Z的树
         const response = await areaTreeByFacsCategory('Z', '', false)
         this.treeData = [{
           id: '-1',
           label: '全部',
           children: response.data || []
         }]
-
         this.defaultExpandedKeys = ['-1']
         this.$nextTick(() => {
           if (this.$refs.treeRef) {
@@ -686,54 +572,47 @@ export default {
         })
       } catch (error) {
         console.error('加载树形数据失败', error)
-        this.$message.error('加载区域/设施数据失败')
       }
     },
-
-    /**
-     * 获取树节点图标
-     */
     getTreeIcon(data, node) {
-      // 设施节点 (Z类)
-      if (data.facsCategory === 'Z') return 'el-icon-cpu'
-
-      // 根节点
-      if (data.id === '-1') return 'el-icon-s-home'
+      // 1. 设施节点 (Z类 - 保持原样,展示为芯片/设备图标)
+      if (data.facsCategory === 'Z') {
+        return 'el-icon-cpu'
+      }
 
-      // 区域节点 (有子节点或层级较高)
-      if (data.children && data.children.length > 0) return 'el-icon-office-building'
+      // 2. 根节点 (保持原样,展示为首页/房子图标)
+      if (data.id === '-1') {
+        return 'el-icon-s-home'
+      }
 
-      // 叶子区域节点
-      return 'el-icon-location-information'
+      // 3. 区域节点 (修改处:不再区分是否有子节点,统一使用大楼图标,与其他界面保持一致)
+      return 'el-icon-office-building'
     },
-
-    // ... 保留 formatSmartNumber, handleAnalysisTypeChange 等其他方法 ...
-
-    // 智能格式化数字
+    // ... 其他数据加载、图表渲染方法保持不变,此处省略以节省篇幅 ...
     formatSmartNumber(value) {
-      if (value === null || value === undefined) {
-        return { display: '0', suffix: '', full: '0', isShortened: false }
-      }
+      if (value === null || value === undefined) return { display: '0', suffix: '', full: '0', isShortened: false }
       const num = parseFloat(value)
-      if (isNaN(num)) {
-        return { display: '0', suffix: '', full: '0', isShortened: false }
-      }
-      const fullValue = num.toLocaleString('zh-CN', {
-        minimumFractionDigits: 2,
-        maximumFractionDigits: 2
-      })
+      if (isNaN(num)) return { display: '0', suffix: '', full: '0', isShortened: false }
+      const fullValue = num.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
       const absNum = Math.abs(num)
       if (absNum >= 100000000) {
-        return { display: (num / 100000000).toFixed(1), suffix: '亿', full: fullValue, isShortened: true }
+        return {
+          display: (num / 100000000).toFixed(1),
+          suffix: '亿',
+          full: fullValue,
+          isShortened: true
+        }
       } else if (absNum >= 10000) {
-        return { display: (num / 10000).toFixed(1), suffix: '万', full: fullValue, isShortened: true }
-      } else if (absNum >= 1000) {
-        return { display: Math.round(num).toLocaleString('zh-CN'), suffix: '', full: fullValue, isShortened: false }
+        return {
+          display: (num / 10000).toFixed(1),
+          suffix: '万',
+          full: fullValue,
+          isShortened: true
+        }
       } else {
         return { display: num.toFixed(2), suffix: '', full: fullValue, isShortened: false }
       }
     },
-
     initDateRange() {
       const today = new Date()
       if (this.queryParams.timeDimension === 'day') {
@@ -755,13 +634,11 @@ export default {
         this.queryParams.endRecTime = today.getFullYear() + '-12-31 23:59:59'
       }
     },
-
     loadAllData() {
       Promise.all([this.getConsumeList(), this.getSummaryData()]).then(() => {
         this.$nextTick(() => this.renderMainChart())
       })
     },
-
     async getConsumeList() {
       this.loading = true
       try {
@@ -784,12 +661,10 @@ export default {
         }
       } catch (error) {
         console.error('获取数据失败', error)
-        this.$message.error('数据加载失败')
       } finally {
         this.loading = false
       }
     },
-
     async getSummaryData() {
       this.summaryLoading = true
       try {
@@ -825,8 +700,6 @@ export default {
         this.summaryLoading = false
       }
     },
-
-    // ... 其他 renderChart, format 等方法保持不变 ...
     renderMainChart() {
       if (!this.$refs.mainChartRef || this.consumeList.length === 0) return
       if (this.mainChartInstance) this.mainChartInstance.dispose()
@@ -838,7 +711,6 @@ export default {
         this.renderBarLineChart(aggregatedData)
       }
     },
-
     aggregateDataByName() {
       const map = new Map()
       const quantityField = this.energyType === 'elec' ? 'totalElecQuantity' : 'totalWaterQuantity'
@@ -855,7 +727,6 @@ export default {
         value
       })).sort((a, b) => b.value - a.value).slice(0, 15)
     },
-
     renderBarLineChart(data) {
       const names = data.map(item => item.name)
       const values = data.map(item => item.value)
@@ -932,7 +803,6 @@ export default {
       }
       this.mainChartInstance.setOption(option)
     },
-
     renderPieChart(data) {
       const unit = this.energyType === 'elec' ? 'kW·h' : 't'
       const total = data.reduce((sum, item) => sum + item.value, 0)
@@ -975,7 +845,6 @@ export default {
       }
       this.mainChartInstance.setOption(option)
     },
-
     renderDetailChart() {
       if (!this.$refs.detailChartRef || this.consumeList.length === 0) return
       if (this.detailChartInstance) this.detailChartInstance.dispose()
@@ -1034,7 +903,6 @@ export default {
       }
       this.detailChartInstance.setOption(option)
     },
-
     getChartColor(index) {
       const colors = ['#4facfe', '#43e97b', '#fa709a', '#fee140', '#30cfd0', '#667eea', '#f093fb', '#f5576c', '#4facfe', '#00f2fe', '#38f9d7', '#f77062', '#fe5196', '#ff9966', '#00d2ff', '#3a7bd5']
       return colors[index % colors.length]
@@ -1133,16 +1001,12 @@ export default {
           return this.parseTime(row.statisticDate, '{y}-{m}-{d}')
         }
       } else if (this.queryParams.timeDimension === 'month') {
-        if (row.statisticMonth) {
-          return row.statisticMonth
-        }
+        if (row.statisticMonth) return row.statisticMonth
         if (row.statisticDate) {
           return this.parseTime(row.statisticDate, '{y}-{m}')
         }
       } else if (this.queryParams.timeDimension === 'year') {
-        if (row.statisticYear) {
-          return row.statisticYear.toString()
-        }
+        if (row.statisticYear) return row.statisticYear.toString()
         if (row.statisticDate) {
           return this.parseTime(row.statisticDate, '{y}')
         }
@@ -1304,12 +1168,8 @@ export default {
       }
     },
     handleResize() {
-      if (this.mainChartInstance) {
-        this.mainChartInstance.resize()
-      }
-      if (this.detailChartInstance) {
-        this.detailChartInstance.resize()
-      }
+      if (this.mainChartInstance) this.mainChartInstance.resize()
+      if (this.detailChartInstance) this.detailChartInstance.resize()
     },
     disposeCharts() {
       if (this.mainChartInstance) {
@@ -1328,19 +1188,19 @@ export default {
 <style lang="scss" scoped>
 .energy-analysis-container {
   padding: 20px;
-  background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);
+  background: #f5f7fa;
   min-height: calc(100vh - 84px);
 
+  // 统一样式的头部容器(用于搜索框和树结构容器)
   .head-container {
     background: #fff;
     padding: 15px;
     border-radius: 8px;
     margin-bottom: 15px;
     box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
-    border: 1px solid #ebeef5;
 
     &.tree-container {
-      max-height: calc(100vh - 350px);
+      max-height: calc(100vh - 150px);
       overflow-y: auto;
 
       &::-webkit-scrollbar {
@@ -1373,7 +1233,7 @@ export default {
           }
         }
 
-        /* 核心 CSS 修复:仅选中节点高亮 */
+        // 核心 CSS 修复:选中节点高亮颜色与参考界面一致
         .el-tree-node.is-current > .el-tree-node__content {
           background-color: #ecf5ff;
           color: #409eff;
@@ -1403,25 +1263,21 @@ export default {
 
           .tree-tag {
             margin-right: 8px;
-            background: linear-gradient(135deg, #ff9a9e 0%, #fecfef 100%);
-            color: #fff;
-            border: none;
-            font-size: 11px;
+            // 统一样式,如有需要可调整为 warning 类型
           }
         }
       }
     }
   }
 
-  // 右侧主内容区域 (保持不变)
+  // 右侧主内容区域样式统一
   .main-content {
     background: #fff;
     border-radius: 12px;
     padding: 24px;
-    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
-    min-height: calc(100vh - 160px);
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.08);
+    min-height: calc(100vh - 124px);
 
-    // 顶部标题栏
     .content-header {
       display: flex;
       justify-content: space-between;
@@ -1470,8 +1326,9 @@ export default {
         }
 
         ::v-deep .el-radio-button__orig-radio:checked + .el-radio-button__inner {
-          background: linear-gradient(135deg, #409eff 0%, #66b1ff 100%);
+          background: #409eff;
           border-color: #409eff;
+          box-shadow: -1px 0 0 0 #409eff;
         }
       }
     }
@@ -1483,7 +1340,7 @@ export default {
       align-items: center;
       margin-bottom: 24px;
       padding: 16px 20px;
-      background: linear-gradient(135deg, #f5f7fa 0%, #fafbfc 100%);
+      background: #f5f7fa;
       border-radius: 10px;
 
       .filter-left {
@@ -1496,16 +1353,6 @@ export default {
               margin-right: 6px;
             }
           }
-
-          ::v-deep .el-radio-button:first-child .el-radio-button__orig-radio:checked + .el-radio-button__inner {
-            background: linear-gradient(135deg, #f6d365 0%, #fda085 100%);
-            border-color: #fda085;
-          }
-
-          ::v-deep .el-radio-button:last-child .el-radio-button__orig-radio:checked + .el-radio-button__inner {
-            background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
-            border-color: #38f9d7;
-          }
         }
       }
 
@@ -1514,28 +1361,13 @@ export default {
         align-items: center;
         gap: 16px;
 
-        .time-dimension-group {
-          ::v-deep .el-button {
-            padding: 8px 16px;
-
-            &.el-button--primary {
-              background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-              border-color: #667eea;
-            }
-          }
-        }
-
         .date-picker {
           width: 280px;
-
-          ::v-deep .el-range-input {
-            font-size: 13px;
-          }
         }
       }
     }
 
-    // 统计卡片 (样式保持不变)
+    // 统计卡片
     .summary-cards {
       margin-bottom: 24px;
 
@@ -1549,7 +1381,6 @@ export default {
         transition: all 0.3s ease;
         position: relative;
         overflow: hidden;
-        cursor: default;
 
         &::before {
           content: '';
@@ -1563,31 +1394,26 @@ export default {
         &:hover {
           transform: translateY(-4px);
           box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
-
-          .value-suffix {
-            background: rgba(64, 158, 255, 0.15);
-            color: #409eff;
-          }
         }
 
         &.total-card::before {
-          background: linear-gradient(180deg, #4facfe 0%, #00f2fe 100%);
+          background: #4facfe;
         }
 
         &.peak-card::before {
-          background: linear-gradient(180deg, #fa709a 0%, #fee140 100%);
+          background: #fa709a;
         }
 
         &.valley-card::before {
-          background: linear-gradient(180deg, #667eea 0%, #764ba2 100%);
+          background: #667eea;
         }
 
         &.cost-card::before {
-          background: linear-gradient(180deg, #43e97b 0%, #38f9d7 100%);
+          background: #43e97b;
         }
 
         &.count-card::before {
-          background: linear-gradient(180deg, #f093fb 0%, #f5576c 100%);
+          background: #f093fb;
         }
 
         .card-icon {
@@ -1639,7 +1465,7 @@ export default {
           }
 
           .card-value {
-            font-size: 28px;
+            font-size: 24px;
             font-weight: 700;
             color: #303133;
             line-height: 1.2;
@@ -1648,15 +1474,14 @@ export default {
             flex-wrap: wrap;
 
             .value-suffix {
-              font-size: 16px;
+              font-size: 14px;
               font-weight: 600;
               color: #606266;
               margin-left: 2px;
               margin-right: 4px;
-              padding: 2px 8px;
+              padding: 2px 6px;
               background: rgba(0, 0, 0, 0.06);
               border-radius: 4px;
-              transition: all 0.3s ease;
             }
 
             small {
@@ -1671,12 +1496,6 @@ export default {
             font-size: 12px;
             color: #909399;
             margin-top: 6px;
-            min-height: 18px;
-            line-height: 18px;
-
-            &.card-sub-placeholder {
-              visibility: hidden;
-            }
           }
         }
       }
@@ -1684,11 +1503,10 @@ export default {
 
     // 图表区域
     .chart-section {
-      background: linear-gradient(135deg, #f8f9fa 0%, #fff 100%);
+      background: #fff;
       border-radius: 12px;
-      padding: 20px;
+      padding: 0;
       margin-bottom: 24px;
-      border: 1px solid #ebeef5;
 
       .section-header {
         display: flex;
@@ -1710,21 +1528,12 @@ export default {
             font-size: 20px;
           }
         }
-
-        .chart-controls {
-          ::v-deep .el-radio-button__inner {
-            padding: 6px 14px;
-
-            i {
-              font-size: 14px;
-            }
-          }
-        }
       }
 
       .chart-wrapper {
         background: #fff;
         border-radius: 8px;
+        border: 1px solid #ebeef5;
         padding: 16px;
 
         .chart-canvas {
@@ -1765,35 +1574,12 @@ export default {
 
       .table-wrapper {
         .data-table {
-          border-radius: 10px;
-          overflow: hidden;
+          border-radius: 4px;
 
-          ::v-deep .el-table__header {
-            th {
-              background: linear-gradient(180deg, #f5f7fa 0%, #fafbfc 100%);
-              color: #606266;
-              font-weight: 600;
-              border-bottom: 2px solid #ebeef5;
-            }
-          }
-
-          ::v-deep .el-table__body {
-            .even-row td {
-              background: #fff;
-            }
-
-            .odd-row td {
-              background: #fafbfc;
-            }
-          }
-
-          ::v-deep .el-table__footer-wrapper {
-            td {
-              background: linear-gradient(180deg, #e6f4ff 0%, #f0f7ff 100%) !important;
-              font-weight: 600;
-              color: #409eff;
-              border-top: 2px solid #d9ecff;
-            }
+          ::v-deep .el-table__header th {
+            background: #f5f7fa;
+            color: #606266;
+            font-weight: 600;
           }
 
           .row-index {
@@ -1802,11 +1588,10 @@ export default {
             justify-content: center;
             width: 26px;
             height: 26px;
-            background: linear-gradient(135deg, #f5f7fa 0%, #e8ecf1 100%);
-            border-radius: 6px;
+            background: #f5f7fa;
+            border-radius: 4px;
             font-size: 12px;
             color: #909399;
-            font-weight: 600;
           }
 
           .obj-cell {
@@ -1825,35 +1610,25 @@ export default {
             }
           }
 
-          .quantity-value {
-            font-size: 14px;
+          .quantity-value, .cost-value {
             font-weight: 600;
             color: #409eff;
           }
 
           .quantity-sharp {
             color: #f56c6c;
-            font-weight: 500;
           }
 
           .quantity-peak {
             color: #e6a23c;
-            font-weight: 500;
           }
 
           .quantity-normal {
             color: #909399;
-            font-weight: 500;
           }
 
           .quantity-valley {
             color: #67c23a;
-            font-weight: 500;
-          }
-
-          .cost-value {
-            font-weight: 600;
-            color: #67c23a;
           }
 
           .percentage-cell {
@@ -1867,29 +1642,16 @@ export default {
 
             .percentage-text {
               font-size: 12px;
-              font-weight: 600;
-              color: #606266;
-              min-width: 45px;
+              width: 40px;
               text-align: right;
             }
           }
-
-          .no-data {
-            color: #c0c4cc;
-            font-style: italic;
-          }
-        }
-
-        ::v-deep .pagination-container {
-          margin-top: 20px;
-          background: transparent;
-          padding: 0;
         }
       }
 
       .detail-chart-wrapper {
         background: #fff;
-        border-radius: 10px;
+        border-radius: 8px;
         padding: 20px;
         border: 1px solid #ebeef5;
 
@@ -1902,53 +1664,10 @@ export default {
   }
 }
 
-// 优化悬浮提示样式
-::v-deep .el-tooltip__popper {
-  &.is-dark {
-    background: rgba(48, 49, 51, 0.95);
-    border-radius: 8px;
-    padding: 10px 14px;
-    font-size: 13px;
-    line-height: 1.6;
-    box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
-    max-width: 280px;
-  }
-}
-
-// 响应式布局
-@media (max-width: 1400px) {
-  .energy-analysis-container {
-    .main-content {
-      .summary-cards {
-        .el-col {
-          margin-bottom: 16px;
-        }
-      }
-
-      .filter-bar {
-        flex-direction: column;
-        gap: 16px;
-
-        .filter-left, .filter-right {
-          width: 100%;
-        }
-
-        .filter-right {
-          justify-content: flex-start;
-          flex-wrap: wrap;
-        }
-      }
-    }
-  }
-}
-
+// 响应式处理
 @media (max-width: 768px) {
   .energy-analysis-container {
-    padding: 12px;
-
-    .el-col {
-      margin-bottom: 20px;
-    }
+    padding: 10px;
 
     .main-content {
       padding: 16px;
@@ -1958,75 +1677,23 @@ export default {
         align-items: flex-start;
         gap: 16px;
 
-        .header-title {
-          .page-title {
-            font-size: 18px;
-            flex-wrap: wrap;
-
-            i {
-              font-size: 22px;
-            }
-
-            .current-selection {
-              font-size: 16px;
-            }
-          }
-        }
-
         .header-actions {
           width: 100%;
-
-          ::v-deep .el-radio-group {
-            width: 100%;
-            display: flex;
-
-            .el-radio-button {
-              flex: 1;
-
-              .el-radio-button__inner {
-                width: 100%;
-                padding: 10px 12px;
-              }
-            }
-          }
         }
       }
 
       .filter-bar {
-        padding: 12px;
+        flex-direction: column;
+        gap: 16px;
 
         .filter-right {
+          flex-wrap: wrap;
+
           .date-picker {
             width: 100%;
           }
         }
       }
-
-      .summary-cards {
-        .stat-card {
-          padding: 14px;
-
-          .card-icon {
-            width: 44px;
-            height: 44px;
-
-            i {
-              font-size: 20px;
-            }
-          }
-
-          .card-content {
-            .card-value {
-              font-size: 22px;
-
-              .value-suffix {
-                font-size: 14px;
-                padding: 1px 6px;
-              }
-            }
-          }
-        }
-      }
     }
   }
 }

+ 12 - 3
ems-ui-cloud/src/views/mgr/poweruse.vue

@@ -1167,9 +1167,18 @@ export default {
 
     // 树图标逻辑:保持与源网侧一致
     getTreeNodeIcon(data) {
-      if (data.id === '-1') return 'el-icon-s-home'
-      if (data.children && data.children.length > 0) return 'el-icon-office-building'
-      return 'el-icon-location-information'
+      // 1. 设施节点 (Z类 - 保持原样,展示为芯片/设备图标)
+      if (data.facsCategory === 'Z') {
+        return 'el-icon-cpu'
+      }
+
+      // 2. 根节点 (保持原样,展示为首页/房子图标)
+      if (data.id === '-1') {
+        return 'el-icon-s-home'
+      }
+
+      // 3. 区域节点 (修改处:不再区分是否有子节点,统一使用大楼图标,与其他界面保持一致)
+      return 'el-icon-office-building'
     },
 
     handleResize() {

Деякі файли не було показано, через те що забагато файлів було змінено