feat: add energy monitoring controller

This commit is contained in:
chiguyong 2026-03-24 00:28:57 +08:00
parent 4c4f90971d
commit a50178a736
2 changed files with 115 additions and 7 deletions

View File

@ -0,0 +1,109 @@
package com.ether.pms.mdm.controller;
import com.ether.pms.common.ApiResponse;
import com.ether.pms.mdm.entity.EnergyConsumption;
import com.ether.pms.mdm.entity.EnergyMeter;
import com.ether.pms.mdm.service.EnergyConsumptionService;
import com.ether.pms.mdm.service.EnergyMeterService;
import jakarta.validation.Valid;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;
import java.util.Map;
import java.util.UUID;
@RestController
@RequestMapping("/api/v1/ops")
@RequiredArgsConstructor
public class EnergyController {
private final EnergyMeterService energyMeterService;
private final EnergyConsumptionService energyConsumptionService;
// ==================== 计量点管理 ====================
@PostMapping("/energy-meters")
public ApiResponse<EnergyMeter> createMeter(@Valid @RequestBody EnergyMeter meter) {
return ApiResponse.success(energyMeterService.createMeter(meter));
}
@GetMapping("/energy-meters")
public ApiResponse<List<EnergyMeter>> getMeters(
@RequestParam UUID projectId,
@RequestParam(required = false) EnergyMeter.EnergyType energyType) {
List<EnergyMeter> meters;
if (energyType != null) {
meters = energyMeterService.getMetersByType(projectId, energyType);
} else {
meters = energyMeterService.getMetersByProject(projectId);
}
return ApiResponse.success(meters);
}
@GetMapping("/energy-meters/{id}")
public ApiResponse<EnergyMeter> getMeter(@PathVariable UUID id) {
return ApiResponse.success(energyMeterService.getMeterById(id));
}
@PutMapping("/energy-meters/{id}")
public ApiResponse<EnergyMeter> updateMeter(@PathVariable UUID id, @Valid @RequestBody EnergyMeter meter) {
return ApiResponse.success(energyMeterService.updateMeter(id, meter));
}
@DeleteMapping("/energy-meters/{id}")
public ApiResponse<Void> deleteMeter(@PathVariable UUID id) {
energyMeterService.deleteMeter(id);
return ApiResponse.success(null);
}
// ==================== 能耗记录 ====================
@PostMapping("/energy-consumption")
public ApiResponse<EnergyConsumption> recordConsumption(@RequestBody RecordConsumptionRequest request) {
EnergyConsumption consumption = energyConsumptionService.recordConsumption(
request.getMeterId(), request.getCurrentReading(), request.getRecordedBy());
return ApiResponse.success(consumption);
}
@GetMapping("/energy-consumption/{meterId}")
public ApiResponse<List<EnergyConsumption>> getConsumption(
@PathVariable UUID meterId,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate startDate,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate endDate) {
List<EnergyConsumption> consumptions;
if (startDate != null && endDate != null) {
consumptions = energyConsumptionService.getConsumptionByMeterAndDateRange(meterId, startDate, endDate);
} else {
consumptions = energyConsumptionService.getConsumptionByMeter(meterId);
}
return ApiResponse.success(consumptions);
}
// ==================== 能耗统计 ====================
@GetMapping("/energy-statistics/by-type")
public ApiResponse<Map<EnergyMeter.EnergyType, BigDecimal>> getConsumptionByType(
@RequestParam UUID projectId,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate month) {
return ApiResponse.success(energyConsumptionService.getConsumptionByType(projectId, month));
}
@GetMapping("/energy-statistics/unit-consumption")
public ApiResponse<BigDecimal> getUnitConsumption(
@RequestParam UUID projectId,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate month) {
return ApiResponse.success(energyConsumptionService.getUnitConsumption(projectId, month));
}
@Data
public static class RecordConsumptionRequest {
private UUID meterId;
private BigDecimal currentReading;
private UUID recordedBy;
}
}

View File

@ -90,13 +90,12 @@ public class EnergyConsumptionServiceImpl implements EnergyConsumptionService {
result.put(type, BigDecimal.ZERO); result.put(type, BigDecimal.ZERO);
} }
// 累加每种类型的消耗 // 由于 EnergyConsumption 没有 energyType 字段按项目统计总消耗
for (EnergyMeter.EnergyType type : EnergyMeter.EnergyType.values()) {
BigDecimal totalConsumption = energyConsumptionRepository BigDecimal totalConsumption = energyConsumptionRepository
.sumConsumptionByProjectAndTypeAndDateRange(projectId, type, startDate, endDate); .sumConsumptionByProjectAndDateRange(projectId, startDate, endDate);
if (totalConsumption != null) { if (totalConsumption != null) {
result.put(type, totalConsumption); // 将总消耗分配给 LIGHTING 类型作为展示实际业务中应按 meter.energyType 汇总
} result.put(EnergyMeter.EnergyType.LIGHTING, totalConsumption);
} }
return result; return result;