diff --git a/libs/common/src/helper/services/power.clamp.service.ts b/libs/common/src/helper/services/power.clamp.service.ts new file mode 100644 index 0000000..258a40b --- /dev/null +++ b/libs/common/src/helper/services/power.clamp.service.ts @@ -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 { + 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 { + 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 = {}; + + 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[]; +}