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; + }, } };