|
|
@@ -50,7 +50,7 @@
|
|
|
<div class="statistic-cards">
|
|
|
<el-row :gutter="15">
|
|
|
<el-col :span="12" :xs="24">
|
|
|
- <div class="stat-card electricity">
|
|
|
+ <div class="stat-card electricity" v-loading="avgLoading">
|
|
|
<div class="card-header">
|
|
|
<i class="el-icon-s-data card-icon"></i>
|
|
|
<span class="card-title">上月平均日用电</span>
|
|
|
@@ -75,7 +75,7 @@
|
|
|
</div>
|
|
|
</el-col>
|
|
|
<el-col :span="12" :xs="24">
|
|
|
- <div class="stat-card water">
|
|
|
+ <div class="stat-card water" v-loading="avgLoading">
|
|
|
<div class="card-header">
|
|
|
<i class="el-icon-s-opportunity card-icon"></i>
|
|
|
<span class="card-title">上月平均日用水</span>
|
|
|
@@ -212,8 +212,7 @@
|
|
|
|
|
|
<script>
|
|
|
import { listEmsEcoD } from "@/api/ems/EmsEcoD"
|
|
|
-import { getElecDayAvg } from '@/api/device/elecMeterH'
|
|
|
-import { getWaterDayAvg } from '@/api/device/waterMeterH'
|
|
|
+import { getAreaElecConsumptionSummary, getAreaWaterConsumptionSummary } from '@/api/device/energyConsumption'
|
|
|
import { areaTreeByFacsCategory } from '@/api/basecfg/area'
|
|
|
|
|
|
export default {
|
|
|
@@ -222,6 +221,7 @@ export default {
|
|
|
return {
|
|
|
// 遮罩层
|
|
|
loading: true,
|
|
|
+ avgLoading: false, // 平均数据加载状态
|
|
|
// 显示搜索条件
|
|
|
showSearch: true,
|
|
|
// 总条数
|
|
|
@@ -283,11 +283,14 @@ export default {
|
|
|
startRecTime: null,
|
|
|
endRecTime: null
|
|
|
},
|
|
|
+ // 【改动点3】日平均查询参数改为使用统一格式
|
|
|
queryDayAvgParams: {
|
|
|
- areaCode: '-1',
|
|
|
- deviceCode: null,
|
|
|
+ objCode: '-1', // 改为objCode,与新接口保持一致
|
|
|
+ objType: 1, // 1-区域
|
|
|
+ timeDimension: 'day', // 日维度
|
|
|
startRecTime: null,
|
|
|
- endRecTime: null
|
|
|
+ endRecTime: null,
|
|
|
+ orderFlag: 'desc'
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
@@ -336,7 +339,12 @@ export default {
|
|
|
this.queryParams.endRecTime = this.dateRange[1]
|
|
|
},
|
|
|
|
|
|
- // 初始化月平均数据
|
|
|
+ /**
|
|
|
+ * 【改动点4】初始化月平均数据 - 使用新的统一接口
|
|
|
+ * 原来使用 getElecDayAvg 和 getWaterDayAvg
|
|
|
+ * 现在使用 getAreaElecConsumptionSummary 和 getAreaWaterConsumptionSummary
|
|
|
+ * 然后在前端计算日平均值
|
|
|
+ */
|
|
|
async initDayAvg() {
|
|
|
const today = new Date()
|
|
|
const lastMonth = new Date(today)
|
|
|
@@ -345,29 +353,79 @@ export default {
|
|
|
const firstDayOfLastMonth = new Date(lastMonth.getFullYear(), lastMonth.getMonth(), 1)
|
|
|
const lastDayOfLastMonth = new Date(lastMonth.getFullYear(), lastMonth.getMonth() + 1, 0)
|
|
|
|
|
|
- this.queryDayAvgParams.startRecTime = this.formatDate(firstDayOfLastMonth)
|
|
|
- this.queryDayAvgParams.endRecTime = this.formatDate(lastDayOfLastMonth)
|
|
|
+ // 计算上月天数(用于计算日平均)
|
|
|
+ const dayCount = this.calculateDaysBetween(firstDayOfLastMonth, lastDayOfLastMonth)
|
|
|
+
|
|
|
+ // 构建查询参数
|
|
|
+ const queryParams = {
|
|
|
+ objCode: this.queryDayAvgParams.objCode === '-1' ? null : this.queryDayAvgParams.objCode,
|
|
|
+ objType: 1, // 区域
|
|
|
+ timeDimension: 'day',
|
|
|
+ startRecTime: this.formatDate(firstDayOfLastMonth) + ' 00:00:00',
|
|
|
+ endRecTime: this.formatDate(lastDayOfLastMonth) + ' 23:59:59',
|
|
|
+ orderFlag: 'desc'
|
|
|
+ }
|
|
|
|
|
|
+ this.avgLoading = true
|
|
|
try {
|
|
|
+ // 并行请求用电和用水汇总数据
|
|
|
const [elecRes, waterRes] = await Promise.all([
|
|
|
- getElecDayAvg(this.queryDayAvgParams),
|
|
|
- getWaterDayAvg(this.queryDayAvgParams)
|
|
|
+ getAreaElecConsumptionSummary(queryParams),
|
|
|
+ getAreaWaterConsumptionSummary(queryParams)
|
|
|
])
|
|
|
|
|
|
+ // 计算用电日平均
|
|
|
if (elecRes.data) {
|
|
|
- this.lastMonthAvgElec = parseFloat((elecRes.data.quantity || 0).toFixed(2))
|
|
|
- this.lastMonthAvgElecCost = parseFloat((elecRes.data.useCost || 0).toFixed(2))
|
|
|
+ const totalElecQuantity = parseFloat(elecRes.data.totalElecQuantity) || 0
|
|
|
+ const totalElecCost = parseFloat(elecRes.data.totalElecCost) || 0
|
|
|
+ this.lastMonthAvgElec = parseFloat((totalElecQuantity / dayCount).toFixed(2))
|
|
|
+ this.lastMonthAvgElecCost = parseFloat((totalElecCost / dayCount).toFixed(2))
|
|
|
+ } else {
|
|
|
+ this.lastMonthAvgElec = 0
|
|
|
+ this.lastMonthAvgElecCost = 0
|
|
|
}
|
|
|
|
|
|
+ // 计算用水日平均
|
|
|
if (waterRes.data) {
|
|
|
- this.lastMonthAvgWater = parseFloat((waterRes.data.quantity || 0).toFixed(2))
|
|
|
- this.lastMonthAvgWaterCost = parseFloat((waterRes.data.useCost || 0).toFixed(2))
|
|
|
+ const totalWaterQuantity = parseFloat(waterRes.data.totalWaterQuantity) || 0
|
|
|
+ const totalWaterCost = parseFloat(waterRes.data.totalWaterCost) || 0
|
|
|
+ this.lastMonthAvgWater = parseFloat((totalWaterQuantity / dayCount).toFixed(2))
|
|
|
+ this.lastMonthAvgWaterCost = parseFloat((totalWaterCost / dayCount).toFixed(2))
|
|
|
+ } else {
|
|
|
+ this.lastMonthAvgWater = 0
|
|
|
+ this.lastMonthAvgWaterCost = 0
|
|
|
}
|
|
|
} catch (error) {
|
|
|
console.error('加载平均数据失败', error)
|
|
|
+ this.$message.error('加载平均数据失败')
|
|
|
+ // 出错时重置为0
|
|
|
+ this.lastMonthAvgElec = 0
|
|
|
+ this.lastMonthAvgElecCost = 0
|
|
|
+ this.lastMonthAvgWater = 0
|
|
|
+ this.lastMonthAvgWaterCost = 0
|
|
|
+ } finally {
|
|
|
+ this.avgLoading = false
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ /**
|
|
|
+ * 【新增方法】计算两个日期之间的天数
|
|
|
+ * @param {Date} startDate 开始日期
|
|
|
+ * @param {Date} endDate 结束日期
|
|
|
+ * @returns {number} 天数(包含首尾两天)
|
|
|
+ */
|
|
|
+ calculateDaysBetween(startDate, endDate) {
|
|
|
+ const start = new Date(startDate)
|
|
|
+ const end = new Date(endDate)
|
|
|
+ // 清除时间部分,只保留日期
|
|
|
+ start.setHours(0, 0, 0, 0)
|
|
|
+ end.setHours(0, 0, 0, 0)
|
|
|
+ // 计算天数差(包含首尾两天,所以+1)
|
|
|
+ const diffTime = Math.abs(end - start)
|
|
|
+ const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24)) + 1
|
|
|
+ return diffDays
|
|
|
+ },
|
|
|
+
|
|
|
// 格式化日期
|
|
|
formatDate(date) {
|
|
|
const year = date.getFullYear()
|
|
|
@@ -448,7 +506,8 @@ export default {
|
|
|
// 节点单击事件
|
|
|
handleNodeClick(data) {
|
|
|
this.queryParams.areaCode = data.id
|
|
|
- this.queryDayAvgParams.areaCode = data.id
|
|
|
+ // 【改动点5】更新日平均查询参数
|
|
|
+ this.queryDayAvgParams.objCode = data.id
|
|
|
this.selectedLabel = data.label
|
|
|
this.initDayAvg()
|
|
|
this.getList()
|
|
|
@@ -490,6 +549,47 @@ export default {
|
|
|
if (totalSaving > 0) return '节能'
|
|
|
if (totalSaving < 0) return '超支'
|
|
|
return '持平'
|
|
|
+ },
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析时间格式
|
|
|
+ * @param {string|Date} time 时间
|
|
|
+ * @param {string} pattern 格式模式
|
|
|
+ */
|
|
|
+ parseTime(time, pattern) {
|
|
|
+ if (!time) return ''
|
|
|
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
|
|
|
+ let date
|
|
|
+ if (typeof time === 'object') {
|
|
|
+ date = time
|
|
|
+ } else {
|
|
|
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
|
|
|
+ time = parseInt(time)
|
|
|
+ }
|
|
|
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
|
|
|
+ time = time * 1000
|
|
|
+ }
|
|
|
+ date = new Date(time)
|
|
|
+ }
|
|
|
+ const formatObj = {
|
|
|
+ y: date.getFullYear(),
|
|
|
+ m: date.getMonth() + 1,
|
|
|
+ d: date.getDate(),
|
|
|
+ h: date.getHours(),
|
|
|
+ i: date.getMinutes(),
|
|
|
+ s: date.getSeconds(),
|
|
|
+ a: date.getDay()
|
|
|
+ }
|
|
|
+ return format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
|
|
+ let value = formatObj[key]
|
|
|
+ if (key === 'a') {
|
|
|
+ return ['日', '一', '二', '三', '四', '五', '六'][value]
|
|
|
+ }
|
|
|
+ if (result.length > 0 && value < 10) {
|
|
|
+ value = '0' + value
|
|
|
+ }
|
|
|
+ return value || 0
|
|
|
+ })
|
|
|
}
|
|
|
}
|
|
|
}
|