learshaw il y a 1 mois
Parent
commit
4ee953c33f
1 fichiers modifiés avec 129 ajouts et 69 suppressions
  1. 129 69
      ems-ui-cloud/src/views/analysis/report/statement-consume.vue

+ 129 - 69
ems-ui-cloud/src/views/analysis/report/statement-consume.vue

@@ -50,14 +50,11 @@
           <el-form-item>
             <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
             <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
-            <el-button type="warning" plain icon="el-icon-download" size="mini" v-hasPermi="['ems:EmsEcoD:export']"
-                       @click="handleExport"
-            >导出
-            </el-button>
+            <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport">导出</el-button>
           </el-form-item>
 
           <el-table v-loading="loading" :data="consumeList">
-            <el-table-column label="对象名称" align="center" prop="objName"/>
+            <el-table-column label="对象名称" align="center" prop="deviceName"/>
             <el-table-column label="日期" align="center" prop="date" width="180">
               <template slot-scope="scope">
                 <span>{{ parseTime(scope.row.date, '{y}-{m}-{d}') }}</span>
@@ -93,8 +90,7 @@ import { getFacsCategoryTree } from '@/api/basecfg/emsfacs'
 import { areaTreeSelect } from '@/api/basecfg/area'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
-import { listAreaMeter } from '@/api/device/elecMeterH'
-
+import { listAreaMeter, listFacsMeter } from '@/api/device/elecMeterH'
 
 export default {
   name: 'consume',
@@ -123,30 +119,49 @@ export default {
         objType: '1',
         objCode: null,
         facsCategory: 'Z',
-        facsSubCategory: '',
-        startRecTime: null,
-        endRecTime: null
+        startRecTime: this.getFirstDayOfMonth(), // 本月1号
+        endRecTime: this.getTodayEndTime(),    // 当天结束时间
       },
       // 时间选择器配置
       startPickerOptions: {
         disabledDate: (time) => {
-          return time.getTime() > Date.now() - 8.64e7 // 禁用未来时间
+          // 禁用未来时间和超过90天前的时间
+          const ninetyDaysAgo = new Date();
+          ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
+          return time.getTime() > Date.now() - 8.64e7 || time.getTime() < ninetyDaysAgo.getTime();
         },
         selectableRange: this.generateHourRanges()
       },
       endPickerOptions: {
         disabledDate: (time) => {
           if (this.queryParams.startRecTime) {
-            return time.getTime() < new Date(this.queryParams.startRecTime).getTime() ||
-                time.getTime() > Date.now() - 8.64e7
+            // 结束时间不能早于开始时间,不能晚于今天,且不能超过开始时间90天后
+            const startDate = new Date(this.queryParams.startRecTime);
+            const endDateLimit = new Date(startDate);
+            endDateLimit.setDate(endDateLimit.getDate() + 90);
+            endDateLimit.setHours(23, 59, 59);
+
+            return time.getTime() < startDate.getTime() ||
+              time.getTime() > endDateLimit.getTime() ||
+              time.getTime() > Date.now() - 8.64e7;
           }
-          return time.getTime() > Date.now() - 8.64e7
+          // 禁用未来时间和超过90天前的时间
+          const ninetyDaysAgo = new Date();
+          ninetyDaysAgo.setDate(ninetyDaysAgo.getDate() - 90);
+          return time.getTime() > Date.now() - 8.64e7 || time.getTime() < ninetyDaysAgo.getTime();
         },
         selectableRange: this.generateHourRanges()
       }
     }
   },
   created() {
+    // 初始化时间格式
+    if (this.queryParams.startRecTime) {
+      this.queryParams.startRecTime = this.formatDateTime(this.queryParams.startRecTime);
+    }
+    if (this.queryParams.endRecTime) {
+      this.queryParams.endRecTime = this.formatDateTime(this.queryParams.endRecTime);
+    }
     this.getAreaList()
     this.getConsumeList()
   },
@@ -173,10 +188,10 @@ export default {
         areaCode: -1,
         objCode: null,
         facsCategory: 'Z',
-        facsSubCategory: '',
-        startRecTime: null,
-        endRecTime: null
+        startRecTime: this.getFirstDayOfMonth(), // 本月1号
+        endRecTime: this.getTodayEndTime(),    // 当天结束时间
       }
+      this.total = 0
       this.consumeList = []
     },
     /** 查询能源区域树列表 */
@@ -222,7 +237,7 @@ export default {
       if (this.activeName === 'areaConsume') {
         this.getAreaConsumeList();
       } else if (this.activeName === 'facsConsume') {
-        this.getFacsConsumeList(); // 调用设施用能数据获取方法
+        this.getFacsConsumeList();
       }
     },
     getAreaConsumeList() {
@@ -233,14 +248,13 @@ export default {
         this.loading = false
       })
     },
-    // 新增:获取设施用能数据
+    // 获取设施用能数据
     getFacsConsumeList() {
       this.loading = true
-      // 假设这里有对应的API
       listFacsMeter(this.queryParams).then(response => {
-        this.consumeList = response.rows
-        this.total = response.total
-        this.loading = false
+        this.consumeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
       })
     },
 
@@ -256,9 +270,15 @@ export default {
     },
     /** 导出按钮操作 */
     handleExport() {
-      this.download('ems/prod/pv/hour/export', {
-        ...this.queryParams
-      }, `用能报表_${new Date().getTime()}.xlsx`)
+      if (this.activeName === 'areaConsume') {
+        this.download('ems/elecMeterH/exportAreaMeter', {
+          ...this.queryParams
+        }, `区域用能_${new Date().getTime()}.xlsx`)
+      } else if (this.activeName === 'facsConsume') {
+        this.download('ems/elecMeterH/exportFacsMeter', {
+          ...this.queryParams
+        }, `设施用能_${new Date().getTime()}.xlsx`)
+      }
     },
     // 筛选节点
     filterNode(value, data) {
@@ -267,35 +287,16 @@ export default {
     },
     // 节点点击事件处理
     handleNodeClick(data, node) {
-      console.log('##data:', data)
-      console.log('##node:', node)
+      this.queryParams.areaCode = this.getTopLevelId(node)
+      this.queryParams.objCode = data.id
+      this.queryParams.pageNum = 1
 
       if (this.activeName === 'areaConsume') {
-        this.queryParams.areaCode = data.id
         this.getAreaConsumeList()
-
       } else if (this.activeName === 'facsConsume') {
-        // 检查是否为叶子节点(通过ID判断或通过children长度判断)
-        if (this.isLeafNode(node)) {
-          // 获取顶级区域ID
-          const topLevelId = this.getTopLevelId(node)
-
-          // 设置查询参数
-          this.queryParams.areaCode = topLevelId
-          this.queryParams.facsSubCategory = data.id
-          this.queryParams.pageNum = 1 // 重置为第一页
-
-          // 获取设施用能数据
-          this.getFacsConsumeList()
-        } else {
-          console.log('父节点不可点击,请选择具体设施')
-        }
+        this.getFacsConsumeList()
       }
     },
-    isLeafNode(node) {
-      // 方式1:通过children长度判断
-      return node.parent.data.id !== undefined
-    },
     // 追溯顶级节点ID的辅助函数
     getTopLevelId(node) {
       let id = node.parent.data.id
@@ -306,34 +307,93 @@ export default {
 
       return id
     },
-    // 时间选择处理
+    // 获取本月1号 00:00:00
+    getFirstDayOfMonth() {
+      const date = new Date();
+      date.setDate(1);
+      date.setHours(0, 0, 0, 0);
+      return this.formatDateTime(date);
+    },
+
+    // 获取当天 23:59:59
+    getTodayEndTime() {
+      const date = new Date();
+      date.setHours(23, 59, 59, 999);
+      return this.formatDateTime(date);
+    },
+
+    // 格式化日期时间为 yyyy-MM-dd HH:mm:ss
+    formatDateTime(date) {
+      if (!date) return '';
+      if (typeof date === 'string') {
+        date = new Date(date);
+      }
+
+      const year = date.getFullYear();
+      const month = String(date.getMonth() + 1).padStart(2, '0');
+      const day = String(date.getDate()).padStart(2, '0');
+      const hours = String(date.getHours()).padStart(2, '0');
+      const minutes = String(date.getMinutes()).padStart(2, '0');
+      const seconds = String(date.getSeconds()).padStart(2, '0');
+
+      return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
+    },
+
+    // 时间选择处理(增强版)
     handleTimeChange(field) {
       if (this.queryParams[field]) {
-        const date = new Date(this.queryParams[field])
-        // 手动格式化日期(替代moment.js)
-        const formatDate = (d) => {
-          const pad = (n) => String(n).padStart(2, '0')
-          return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:00:00`
-        }
-        this.queryParams[field] = formatDate(date)
-      }
+        // 格式化时间
+        this.queryParams[field] = this.formatDateTime(this.queryParams[field]);
+
+        // 自动调整另一个时间选择器的范围
+        if (field === 'startRecTime' && this.queryParams.endRecTime) {
+          // 结束时间不能早于开始时间
+          const startDate = new Date(this.queryParams.startRecTime);
+          const endDate = new Date(this.queryParams.endRecTime);
+
+          if (endDate < startDate) {
+            endDate.setTime(startDate.getTime());
+            this.queryParams.endRecTime = this.formatDateTime(endDate);
+          }
+
+          // 结束时间不能超过开始时间90天后
+          const endDateLimit = new Date(startDate);
+          endDateLimit.setDate(endDateLimit.getDate() + 90);
+          endDateLimit.setHours(23, 59, 59);
+
+          if (endDate > endDateLimit) {
+            this.queryParams.endRecTime = this.formatDateTime(endDateLimit);
+          }
+
+          this.$nextTick(() => {
+            this.$refs.queryForm.validateField('endRecTime');
+          });
+        } else if (field === 'endRecTime' && this.queryParams.startRecTime) {
+          // 开始时间不能晚于结束时间
+          const startDate = new Date(this.queryParams.startRecTime);
+          const endDate = new Date(this.queryParams.endRecTime);
 
-      // 自动同步结束时间范围
-      if (field === 'startRecTime' && this.queryParams.endRecTime) {
-        this.$nextTick(() => {
-          this.$refs.queryForm.validateField('endRecTime')
-        })
+          if (startDate > endDate) {
+            startDate.setTime(endDate.getTime());
+            this.queryParams.startRecTime = this.formatDateTime(startDate);
+          }
+
+          this.$nextTick(() => {
+            this.$refs.queryForm.validateField('startRecTime');
+          });
+        }
       }
     },
-    // 生成整点时间范围
+
+    // 生成整点时间范围(优化版)
     generateHourRanges() {
-      const ranges = []
+      const ranges = [];
       for (let i = 0; i < 24; i++) {
-        const start = `${i.toString().padStart(2, '0')}:00:00`
-        const end = `${i.toString().padStart(2, '0')}:59:59`
-        ranges.push(`${start} - ${end}`)
+        const start = `${String(i).padStart(2, '0')}:00:00`;
+        const end = `${String(i).padStart(2, '0')}:59:59`;
+        ranges.push(`${start} - ${end}`);
       }
-      return ranges
+      return ranges;
     }
   }
 }