From 419fcb6c6201d49caaf3cdddc120504968ff73dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A0=82=E7=B3=96?= <2178503051@qq.com> Date: Tue, 28 Apr 2026 10:43:20 +0800 Subject: [PATCH] =?UTF-8?q?feat(ems):=20=E6=B7=BB=E5=8A=A0=E4=BA=A7?= =?UTF-8?q?=E7=BA=BF=E9=80=89=E6=8B=A9=E5=92=8C=E6=80=BB=E8=A1=A8=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=EF=BC=8C=E5=A2=9E=E5=BC=BA=E8=A1=A8=E6=A0=BC=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E9=80=89=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在电表管理页面添加产线选择下拉框和总表开关 - 在能耗表格页面添加配置选项:显示求和行、分表求和、误差计算 - 实现表格汇总行计算功能 - 添加误差和误差率计算功能 --- klp-ui/src/views/ems/meter/manage.vue | 21 +++-- klp-ui/src/views/ems/table/index.vue | 124 +++++++++++++++++++++++++- 2 files changed, 131 insertions(+), 14 deletions(-) diff --git a/klp-ui/src/views/ems/meter/manage.vue b/klp-ui/src/views/ems/meter/manage.vue index 58dac3d4..88917be3 100644 --- a/klp-ui/src/views/ems/meter/manage.vue +++ b/klp-ui/src/views/ems/meter/manage.vue @@ -98,17 +98,6 @@ 安装日期 {{ meter.installDate || '-' }} -
+ + + + + + @@ -164,6 +159,9 @@ + + + 取 消 @@ -181,6 +179,7 @@ import { fetchEnergyLinkMatrix, addEnergyLink } from '@/api/ems/energyLink' export default { name: "MeterManage", + dicts: ['sys_lines'], data() { return { loading: false, diff --git a/klp-ui/src/views/ems/table/index.vue b/klp-ui/src/views/ems/table/index.vue index 7324774c..8f147faf 100644 --- a/klp-ui/src/views/ems/table/index.vue +++ b/klp-ui/src/views/ems/table/index.vue @@ -18,7 +18,7 @@
-
+
- 刷新 + 刷新 +
+ + +
+ 显示求和行 + 对分表求和(排除总表) + 显示误差计算
- + @@ -41,6 +48,24 @@ @change="(e) => handleCellChange(scope.row, meter.meterId, e)" /> + + + + + + + + + + + +
@@ -72,8 +97,21 @@ export default { rightLoading: false, selectedMonth: currentMonth, originalData: [], // 用于存储原始数据 + configOptions: { + showSumRow: false, + sumSubMeters: false, + showError: false + }, + sumRowData: {} // 存储求和行数据 }; }, + computed: { + // 判断是否可以显示误差计算(需要有且仅有一个总表) + canShowError() { + const totalMeters = this.meters.filter(m => m.isTotalMeter === 1); + return totalMeters.length === 1; + } + }, mounted() { this.loadEnergyTypes(); }, @@ -277,6 +315,86 @@ export default { handleAddMeter() { this.$router.push({ path: '/ems/meter/manage' }); }, + + // 计算一行中所有分表的和 + getSubMetersSum(row) { + const subMeters = this.meters.filter(m => m.isTotalMeter !== 1); + return subMeters.reduce((sum, meter) => { + const value = Number(row[`meter_${meter.meterId}`]) || 0; + return sum + value; + }, 0); + }, + + // 计算一行的误差(总表 - 分表合计) + getRowError(row) { + if (!this.canShowError) return 0; + const totalMeter = this.meters.find(m => m.isTotalMeter === 1); + const totalValue = Number(row[`meter_${totalMeter.meterId}`]) || 0; + const subMetersSum = this.getSubMetersSum(row); + return totalValue - subMetersSum; + }, + + // 计算一行的误差百分比 + getRowErrorPercent(row) { + if (!this.canShowError) return 0; + const totalMeter = this.meters.find(m => m.isTotalMeter === 1); + const totalValue = Number(row[`meter_${totalMeter.meterId}`]) || 0; + if (totalValue === 0) return 0; + const error = this.getRowError(row); + return (error / totalValue) * 100; + }, + + // 计算表格汇总行 + getSummaries(param) { + const { columns, data } = param; + const sums = []; + + // 如果不显示求和行,返回空数组 + if (!this.configOptions.showSumRow) { + return sums; + } + + columns.forEach((column, index) => { + if (index === 0) { + sums[index] = '合计'; + return; + } + + // 获取当前列对应的表计 + const prop = column.property; + if (prop && prop.startsWith('meter_')) { + // 计算该列的和 + const values = data.map(item => Number(item[prop]) || 0); + const sum = values.reduce((prev, curr) => prev + curr, 0); + sums[index] = sum.toFixed(2); + return; + } + + // 分表合计列的汇总 + if (column.label === '分表合计' && this.configOptions.sumSubMeters) { + const sum = data.reduce((total, row) => total + this.getSubMetersSum(row), 0); + sums[index] = sum.toFixed(2); + return; + } + + // 误差列的汇总 + if (column.label === '误差' && this.configOptions.showError && this.canShowError) { + const sum = data.reduce((total, row) => total + this.getRowError(row), 0); + sums[index] = sum.toFixed(2); + return; + } + + // 误差率列不进行汇总 + if (column.label === '误差率') { + sums[index] = '-'; + return; + } + + sums[index] = ''; + }); + + return sums; + }, } };