mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 07:07:19 +00:00
Created decorators for energy management charts to divide values by 100, and modified the intervals.
This commit is contained in:
@ -22,7 +22,9 @@ import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_en
|
||||
import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_occupancy_analytics_devices_service.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/device_location/device_location_details_service_decorator.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/device_location/remote_device_location_service.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/energy_consumption_by_phases_value_divider_decorator.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/remote_energy_consumption_by_phases_service.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/energy_consumption_per_device_value_divider_decorator.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/remote_energy_consumption_per_device_service.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/occupacy/remote_occupancy_service.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart';
|
||||
@ -69,14 +71,18 @@ class _AnalyticsPageState extends State<AnalyticsPage> {
|
||||
),
|
||||
BlocProvider(
|
||||
create: (context) => EnergyConsumptionByPhasesBloc(
|
||||
EnergyConsumptionByPhasesValueDividerDecorator(
|
||||
RemoteEnergyConsumptionByPhasesService(_httpService),
|
||||
),
|
||||
),
|
||||
),
|
||||
BlocProvider(
|
||||
create: (context) => EnergyConsumptionPerDeviceBloc(
|
||||
EnergyConsumptionPerDeviceValueDividerDecorator(
|
||||
RemoteEnergyConsumptionPerDeviceService(_httpService),
|
||||
),
|
||||
),
|
||||
),
|
||||
BlocProvider(
|
||||
create: (context) => PowerClampInfoBloc(
|
||||
RemotePowerClampInfoService(_httpService),
|
||||
|
@ -13,15 +13,15 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
||||
});
|
||||
|
||||
final List<PhasesEnergyConsumption> energyData;
|
||||
static const _kLeftTitlesInterval = 4.0;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return BarChart(
|
||||
BarChartData(
|
||||
|
||||
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
||||
checkToShowHorizontalLine: (value) => true,
|
||||
horizontalInterval: 250,
|
||||
horizontalInterval: _kLeftTitlesInterval,
|
||||
),
|
||||
borderData: EnergyManagementChartsHelper.borderData(),
|
||||
barTouchData: _barTouchData(context),
|
||||
@ -100,11 +100,11 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
||||
}) {
|
||||
final data = energyData;
|
||||
|
||||
final date = DateFormat('dd/MM/yyyy').format(data[group.x.toInt()].date);
|
||||
final phaseA = data[group.x.toInt()].energyConsumedA;
|
||||
final phaseB = data[group.x.toInt()].energyConsumedB;
|
||||
final phaseC = data[group.x.toInt()].energyConsumedC;
|
||||
final total = data[group.x.toInt()].energyConsumedKw;
|
||||
final date = DateFormat('dd/MM/yyyy').format(data[group.x].date);
|
||||
final phaseA = data[group.x].energyConsumedA;
|
||||
final phaseB = data[group.x].energyConsumedB;
|
||||
final phaseC = data[group.x].energyConsumedC;
|
||||
final total = data[group.x].energyConsumedKw;
|
||||
|
||||
return BarTooltipItem(
|
||||
'$date\n',
|
||||
@ -149,7 +149,7 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
||||
FlTitlesData _titlesData(BuildContext context) {
|
||||
final titlesData = EnergyManagementChartsHelper.titlesData(
|
||||
context,
|
||||
leftTitlesInterval: 250,
|
||||
leftTitlesInterval: _kLeftTitlesInterval,
|
||||
);
|
||||
|
||||
final leftTitles = titlesData.leftTitles.copyWith(
|
||||
|
@ -7,6 +7,7 @@ class EnergyConsumptionPerDeviceChart extends StatelessWidget {
|
||||
const EnergyConsumptionPerDeviceChart({super.key, required this.chartData});
|
||||
|
||||
final List<DeviceEnergyDataModel> chartData;
|
||||
static const _kLeftTitlesInterval = 2.5;
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
@ -15,12 +16,11 @@ class EnergyConsumptionPerDeviceChart extends StatelessWidget {
|
||||
clipData: const FlClipData.vertical(),
|
||||
titlesData: EnergyManagementChartsHelper.titlesData(
|
||||
context,
|
||||
leftTitlesInterval: 250,
|
||||
leftTitlesInterval: _kLeftTitlesInterval,
|
||||
),
|
||||
|
||||
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
||||
checkToShowHorizontalLine: (value) => true,
|
||||
horizontalInterval: 250,
|
||||
horizontalInterval: _kLeftTitlesInterval,
|
||||
),
|
||||
borderData: EnergyManagementChartsHelper.borderData(),
|
||||
lineTouchData: EnergyManagementChartsHelper.lineTouchData(),
|
||||
|
@ -0,0 +1,34 @@
|
||||
import 'package:syncrow_web/pages/analytics/models/phases_energy_consumption.dart';
|
||||
import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_by_phases_param.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/energy_consumption_by_phases_service.dart';
|
||||
import 'package:syncrow_web/utils/helpers/safe_division_helper.dart';
|
||||
|
||||
class EnergyConsumptionByPhasesValueDividerDecorator
|
||||
implements EnergyConsumptionByPhasesService {
|
||||
const EnergyConsumptionByPhasesValueDividerDecorator(
|
||||
this._decoratee, {
|
||||
this.divider = 100,
|
||||
});
|
||||
|
||||
final EnergyConsumptionByPhasesService _decoratee;
|
||||
final double divider;
|
||||
|
||||
@override
|
||||
Future<List<PhasesEnergyConsumption>> load(
|
||||
GetEnergyConsumptionByPhasesParam param) async {
|
||||
final result = await _decoratee.load(param);
|
||||
return result.map((e) {
|
||||
return PhasesEnergyConsumption(
|
||||
date: e.date,
|
||||
energyConsumedA: SafeDivisionHelper.divide(e.energyConsumedA, divider),
|
||||
energyConsumedB: SafeDivisionHelper.divide(e.energyConsumedB, divider),
|
||||
energyConsumedC: SafeDivisionHelper.divide(e.energyConsumedC, divider),
|
||||
energyConsumedKw: SafeDivisionHelper.divide(e.energyConsumedKw, divider),
|
||||
uuid: e.uuid,
|
||||
createdAt: e.createdAt,
|
||||
updatedAt: e.updatedAt,
|
||||
deviceUuid: e.deviceUuid,
|
||||
);
|
||||
}).toList();
|
||||
}
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
import 'package:syncrow_web/pages/analytics/models/device_energy_data_model.dart';
|
||||
import 'package:syncrow_web/pages/analytics/models/energy_data_model.dart';
|
||||
import 'package:syncrow_web/pages/analytics/params/get_energy_consumption_per_device_param.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/energy_consumption_per_device_service.dart';
|
||||
import 'package:syncrow_web/utils/helpers/safe_division_helper.dart';
|
||||
|
||||
class EnergyConsumptionPerDeviceValueDividerDecorator
|
||||
implements EnergyConsumptionPerDeviceService {
|
||||
const EnergyConsumptionPerDeviceValueDividerDecorator(
|
||||
this._decoratee, {
|
||||
this.divider = 100,
|
||||
});
|
||||
|
||||
final EnergyConsumptionPerDeviceService _decoratee;
|
||||
final double divider;
|
||||
|
||||
@override
|
||||
Future<List<DeviceEnergyDataModel>> load(
|
||||
GetEnergyConsumptionPerDeviceParam param,
|
||||
) async {
|
||||
final result = await _decoratee.load(param);
|
||||
return result.map((device) {
|
||||
return DeviceEnergyDataModel(
|
||||
deviceId: device.deviceId,
|
||||
deviceName: device.deviceName,
|
||||
color: device.color,
|
||||
energy: device.energy.map((e) {
|
||||
return EnergyDataModel(
|
||||
date: e.date,
|
||||
value: SafeDivisionHelper.divide(e.value, divider),
|
||||
);
|
||||
}).toList(),
|
||||
);
|
||||
}).toList();
|
||||
}
|
||||
}
|
@ -0,0 +1,26 @@
|
||||
import 'package:syncrow_web/pages/analytics/models/energy_data_model.dart';
|
||||
import 'package:syncrow_web/pages/analytics/params/get_total_energy_consumption_param.dart';
|
||||
import 'package:syncrow_web/pages/analytics/services/total_energy_consumption/total_energy_consumption_service.dart';
|
||||
import 'package:syncrow_web/utils/helpers/safe_division_helper.dart';
|
||||
|
||||
class DividedTotalEnergyConsumptionDecorator
|
||||
implements TotalEnergyConsumptionService {
|
||||
const DividedTotalEnergyConsumptionDecorator(
|
||||
this._decoratee, {
|
||||
this.divider = 100,
|
||||
});
|
||||
|
||||
final TotalEnergyConsumptionService _decoratee;
|
||||
final double divider;
|
||||
|
||||
@override
|
||||
Future<List<EnergyDataModel>> load(GetTotalEnergyConsumptionParam param) async {
|
||||
final result = await _decoratee.load(param);
|
||||
return result.map((e) {
|
||||
return EnergyDataModel(
|
||||
date: e.date,
|
||||
value: SafeDivisionHelper.divide(e.value, divider),
|
||||
);
|
||||
}).toList();
|
||||
}
|
||||
}
|
@ -105,7 +105,7 @@ class HomeBloc extends Bloc<HomeEvent, HomeState> {
|
||||
color: const Color(0xFF0026A2),
|
||||
),
|
||||
HomeItemModel(
|
||||
title: 'Devices Management',
|
||||
title: 'Device Management',
|
||||
icon: Assets.devicesIcon,
|
||||
active: true,
|
||||
onPress: (context) {
|
||||
|
8
lib/utils/helpers/safe_division_helper.dart
Normal file
8
lib/utils/helpers/safe_division_helper.dart
Normal file
@ -0,0 +1,8 @@
|
||||
abstract final class SafeDivisionHelper {
|
||||
const SafeDivisionHelper._();
|
||||
|
||||
static double divide(num value, num divider) {
|
||||
if (divider == 0) return 0;
|
||||
return value / divider;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user