|
@@ -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;
|
|
|
}
|
|
|
}
|
|
|
}
|