From 5500238be35ba6ff70db033c9d2c392ba899e3d5 Mon Sep 17 00:00:00 2001 From: chiguyong Date: Tue, 24 Mar 2026 00:34:43 +0800 Subject: [PATCH] feat: add energy monitoring frontend pages --- src/api/energy.ts | 93 ++++++ src/router/index.ts | 18 ++ src/views/Layout.vue | 11 + src/views/energy/ConsumptionRecord.vue | 417 +++++++++++++++++++++++++ src/views/energy/EnergyStatistics.vue | 352 +++++++++++++++++++++ src/views/energy/MeterList.vue | 380 ++++++++++++++++++++++ 6 files changed, 1271 insertions(+) create mode 100644 src/api/energy.ts create mode 100644 src/views/energy/ConsumptionRecord.vue create mode 100644 src/views/energy/EnergyStatistics.vue create mode 100644 src/views/energy/MeterList.vue diff --git a/src/api/energy.ts b/src/api/energy.ts new file mode 100644 index 00000000..6ed42e88 --- /dev/null +++ b/src/api/energy.ts @@ -0,0 +1,93 @@ +import request from '@/utils/request' + +export interface EnergyMeter { + id?: string + meterCode: string + meterName: string + energyType: string + installationLocation?: string + ratedCapacity?: number + unitPrice?: number + status?: string +} + +export interface EnergyConsumption { + id?: string + meterId: string + consumptionDate: string + previousReading: number + currentReading: number + consumption: number + amount?: number + recordMethod?: string +} + +export function getEnergyMeters(projectId: string, energyType?: string) { + return request({ + url: '/api/v1/ops/energy-meters', + method: 'get', + params: { projectId, energyType } + }) +} + +export function getEnergyMeter(id: string) { + return request({ + url: `/api/v1/ops/energy-meters/${id}`, + method: 'get' + }) +} + +export function createEnergyMeter(data: EnergyMeter) { + return request({ + url: '/api/v1/ops/energy-meters', + method: 'post', + data + }) +} + +export function updateEnergyMeter(id: string, data: EnergyMeter) { + return request({ + url: `/api/v1/ops/energy-meters/${id}`, + method: 'put', + data + }) +} + +export function deleteEnergyMeter(id: string) { + return request({ + url: `/api/v1/ops/energy-meters/${id}`, + method: 'delete' + }) +} + +export function recordEnergyConsumption(data: { meterId: string; currentReading: number; recordedBy?: string }) { + return request({ + url: '/api/v1/ops/energy-consumption', + method: 'post', + data + }) +} + +export function getEnergyConsumption(meterId: string, startDate?: string, endDate?: string) { + return request({ + url: `/api/v1/ops/energy-consumption/${meterId}`, + method: 'get', + params: { startDate, endDate } + }) +} + +export function getConsumptionByType(projectId: string, month: string) { + return request({ + url: '/api/v1/ops/energy-statistics/by-type', + method: 'get', + params: { projectId, month } + }) +} + +export function getUnitConsumption(projectId: string, month: string) { + return request({ + url: '/api/v1/ops/energy-statistics/unit-consumption', + method: 'get', + params: { projectId, month } + }) +} \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts index c3ea0afa..c1545a89 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -92,6 +92,24 @@ const router = createRouter({ name: 'MaintenanceTasks', component: () => import('@/views/maintenance/TaskList.vue'), meta: { title: '维保任务' } + }, + { + path: 'energy/meters', + name: 'EnergyMeters', + component: () => import('@/views/energy/MeterList.vue'), + meta: { title: '计量点管理' } + }, + { + path: 'energy/consumption', + name: 'EnergyConsumption', + component: () => import('@/views/energy/ConsumptionRecord.vue'), + meta: { title: '能耗录入' } + }, + { + path: 'energy/statistics', + name: 'EnergyStatistics', + component: () => import('@/views/energy/EnergyStatistics.vue'), + meta: { title: '能耗统计' } } ] } diff --git a/src/views/Layout.vue b/src/views/Layout.vue index 18f6b88d..b3e84a78 100644 --- a/src/views/Layout.vue +++ b/src/views/Layout.vue @@ -10,6 +10,7 @@ import { TeamOutlined, AppstoreOutlined, BuildOutlined, + HeatMapOutlined, LogoutOutlined, AuditOutlined, SettingOutlined, @@ -55,6 +56,16 @@ const menuItems: MenuProps['items'] = [ key: '/maintenance/tasks', icon: () => h(ToolOutlined), label: '维保任务' + }, + { + key: 'energy', + icon: () => h(HeatMapOutlined), + label: '能耗管理', + children: [ + { key: '/energy/meters', label: '计量点管理' }, + { key: '/energy/consumption', label: '能耗录入' }, + { key: '/energy/statistics', label: '能耗统计' } + ] } ] }, diff --git a/src/views/energy/ConsumptionRecord.vue b/src/views/energy/ConsumptionRecord.vue new file mode 100644 index 00000000..e44d9e5a --- /dev/null +++ b/src/views/energy/ConsumptionRecord.vue @@ -0,0 +1,417 @@ + + + + + \ No newline at end of file diff --git a/src/views/energy/EnergyStatistics.vue b/src/views/energy/EnergyStatistics.vue new file mode 100644 index 00000000..6980c10d --- /dev/null +++ b/src/views/energy/EnergyStatistics.vue @@ -0,0 +1,352 @@ + + + + + \ No newline at end of file diff --git a/src/views/energy/MeterList.vue b/src/views/energy/MeterList.vue new file mode 100644 index 00000000..c61c3f47 --- /dev/null +++ b/src/views/energy/MeterList.vue @@ -0,0 +1,380 @@ + + + + + \ No newline at end of file