mirror of
https://github.com/SyncrowIOT/backend.git
synced 2025-11-26 16:34:55 +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