mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-11-26 08:44:54 +00:00
feat: implement PowerClampService for managing hourly energy consumption data
This commit is contained in:
109
libs/common/src/helper/services/power.clamp.service.ts
Normal file
109
libs/common/src/helper/services/power.clamp.service.ts
Normal 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[];
|
||||
}
|
||||
Reference in New Issue
Block a user