feat: implement PowerClampService for managing hourly energy consumption data

This commit is contained in:
faris Aljohari
2025-04-24 02:15:45 +03:00
parent 7f43ef5de5
commit 92f908c0fb

View File

@ -0,0 +1,109 @@
import { Injectable } from '@nestjs/common';
import {
PowerClampDailyRepository,
PowerClampHourlyRepository,
PowerClampMonthlyRepository,
} from '@app/common/modules/power-clamp/repositories';
@Injectable()
export class PowerClampService {
constructor(
private readonly powerClampHourlyRepository: PowerClampHourlyRepository,
private readonly powerClampDailyRepository: PowerClampDailyRepository,
private readonly powerClampMonthlyRepository: PowerClampMonthlyRepository,
) {}
async insertOrUpdatePowerClamp(
deviceUuid: string,
logData: any,
): Promise<void> {
try {
await this.insertOrUpdateHourly(deviceUuid, logData);
} catch (err) {
console.error('Failed to insert or update hourly data', err);
throw err;
}
}
async insertOrUpdateHourly(
deviceUuid: string,
logData: LogData,
): Promise<void> {
try {
const currentDate = new Date().toLocaleDateString('en-CA');
const currentHour = new Date().getHours().toString();
// First try to update existing record
const existingData = await this.powerClampHourlyRepository.findOne({
where: {
deviceUuid,
date: currentDate,
hour: currentHour,
},
});
if (existingData) {
// Create update object only with values that exist in logData
const updateData: Partial<any> = {};
const hasProperty = (code: string) =>
logData.properties.some((p) => p.code === code);
const getValue = (code: string) => {
const prop = logData.properties.find((p) => p.code === code);
return prop ? Number(prop.value) : undefined;
};
if (hasProperty('EnergyConsumedA')) {
updateData.energyConsumedA = String(getValue('EnergyConsumedA'));
}
if (hasProperty('EnergyConsumedB')) {
updateData.energyConsumedB = String(getValue('EnergyConsumedB'));
}
if (hasProperty('EnergyConsumedC')) {
updateData.energyConsumedC = String(getValue('EnergyConsumedC'));
}
if (hasProperty('EnergyConsumed')) {
updateData.energyConsumedKw = String(getValue('EnergyConsumed'));
}
if (Object.keys(updateData).length > 0) {
await this.powerClampHourlyRepository.update(
existingData.uuid,
updateData,
);
}
} else {
// Insert new record with all required fields
const getValue = (code: string) => {
const prop = logData.properties.find((p) => p.code === code);
return prop ? Number(prop.value) : 0; // Default to 0 for required fields
};
await this.powerClampHourlyRepository.insert({
deviceUuid,
date: currentDate,
hour: currentHour,
energyConsumedA: String(getValue('EnergyConsumedA')),
energyConsumedB: String(getValue('EnergyConsumedB')),
energyConsumedC: String(getValue('EnergyConsumedC')),
energyConsumedKw: String(getValue('EnergyConsumed')),
});
}
} catch (err) {
console.error('Failed to insert or update hourly data', err);
throw err;
}
}
}
interface EnergyProperties {
code: string;
dpId: number;
time: number;
value: string | number;
}
interface LogData {
devId: string;
dataId: string;
productId: string;
properties: EnergyProperties[];
}