mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-09 22:57:21 +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/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/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/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_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/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/occupacy/remote_occupancy_service.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart';
|
import 'package:syncrow_web/pages/analytics/services/occupancy_heat_map/remote_occupancy_heat_map_service.dart';
|
||||||
@ -69,12 +71,16 @@ class _AnalyticsPageState extends State<AnalyticsPage> {
|
|||||||
),
|
),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (context) => EnergyConsumptionByPhasesBloc(
|
create: (context) => EnergyConsumptionByPhasesBloc(
|
||||||
RemoteEnergyConsumptionByPhasesService(_httpService),
|
EnergyConsumptionByPhasesValueDividerDecorator(
|
||||||
|
RemoteEnergyConsumptionByPhasesService(_httpService),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (context) => EnergyConsumptionPerDeviceBloc(
|
create: (context) => EnergyConsumptionPerDeviceBloc(
|
||||||
RemoteEnergyConsumptionPerDeviceService(_httpService),
|
EnergyConsumptionPerDeviceValueDividerDecorator(
|
||||||
|
RemoteEnergyConsumptionPerDeviceService(_httpService),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
|
@ -13,15 +13,15 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
|||||||
});
|
});
|
||||||
|
|
||||||
final List<PhasesEnergyConsumption> energyData;
|
final List<PhasesEnergyConsumption> energyData;
|
||||||
|
static const _kLeftTitlesInterval = 4.0;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return BarChart(
|
return BarChart(
|
||||||
BarChartData(
|
BarChartData(
|
||||||
|
|
||||||
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
||||||
checkToShowHorizontalLine: (value) => true,
|
checkToShowHorizontalLine: (value) => true,
|
||||||
horizontalInterval: 250,
|
horizontalInterval: _kLeftTitlesInterval,
|
||||||
),
|
),
|
||||||
borderData: EnergyManagementChartsHelper.borderData(),
|
borderData: EnergyManagementChartsHelper.borderData(),
|
||||||
barTouchData: _barTouchData(context),
|
barTouchData: _barTouchData(context),
|
||||||
@ -100,11 +100,11 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
|||||||
}) {
|
}) {
|
||||||
final data = energyData;
|
final data = energyData;
|
||||||
|
|
||||||
final date = DateFormat('dd/MM/yyyy').format(data[group.x.toInt()].date);
|
final date = DateFormat('dd/MM/yyyy').format(data[group.x].date);
|
||||||
final phaseA = data[group.x.toInt()].energyConsumedA;
|
final phaseA = data[group.x].energyConsumedA;
|
||||||
final phaseB = data[group.x.toInt()].energyConsumedB;
|
final phaseB = data[group.x].energyConsumedB;
|
||||||
final phaseC = data[group.x.toInt()].energyConsumedC;
|
final phaseC = data[group.x].energyConsumedC;
|
||||||
final total = data[group.x.toInt()].energyConsumedKw;
|
final total = data[group.x].energyConsumedKw;
|
||||||
|
|
||||||
return BarTooltipItem(
|
return BarTooltipItem(
|
||||||
'$date\n',
|
'$date\n',
|
||||||
@ -149,7 +149,7 @@ class EnergyConsumptionByPhasesChart extends StatelessWidget {
|
|||||||
FlTitlesData _titlesData(BuildContext context) {
|
FlTitlesData _titlesData(BuildContext context) {
|
||||||
final titlesData = EnergyManagementChartsHelper.titlesData(
|
final titlesData = EnergyManagementChartsHelper.titlesData(
|
||||||
context,
|
context,
|
||||||
leftTitlesInterval: 250,
|
leftTitlesInterval: _kLeftTitlesInterval,
|
||||||
);
|
);
|
||||||
|
|
||||||
final leftTitles = titlesData.leftTitles.copyWith(
|
final leftTitles = titlesData.leftTitles.copyWith(
|
||||||
|
@ -7,6 +7,7 @@ class EnergyConsumptionPerDeviceChart extends StatelessWidget {
|
|||||||
const EnergyConsumptionPerDeviceChart({super.key, required this.chartData});
|
const EnergyConsumptionPerDeviceChart({super.key, required this.chartData});
|
||||||
|
|
||||||
final List<DeviceEnergyDataModel> chartData;
|
final List<DeviceEnergyDataModel> chartData;
|
||||||
|
static const _kLeftTitlesInterval = 2.5;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
@ -15,12 +16,11 @@ class EnergyConsumptionPerDeviceChart extends StatelessWidget {
|
|||||||
clipData: const FlClipData.vertical(),
|
clipData: const FlClipData.vertical(),
|
||||||
titlesData: EnergyManagementChartsHelper.titlesData(
|
titlesData: EnergyManagementChartsHelper.titlesData(
|
||||||
context,
|
context,
|
||||||
leftTitlesInterval: 250,
|
leftTitlesInterval: _kLeftTitlesInterval,
|
||||||
),
|
),
|
||||||
|
|
||||||
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
gridData: EnergyManagementChartsHelper.gridData().copyWith(
|
||||||
checkToShowHorizontalLine: (value) => true,
|
checkToShowHorizontalLine: (value) => true,
|
||||||
horizontalInterval: 250,
|
horizontalInterval: _kLeftTitlesInterval,
|
||||||
),
|
),
|
||||||
borderData: EnergyManagementChartsHelper.borderData(),
|
borderData: EnergyManagementChartsHelper.borderData(),
|
||||||
lineTouchData: EnergyManagementChartsHelper.lineTouchData(),
|
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),
|
color: const Color(0xFF0026A2),
|
||||||
),
|
),
|
||||||
HomeItemModel(
|
HomeItemModel(
|
||||||
title: 'Devices Management',
|
title: 'Device Management',
|
||||||
icon: Assets.devicesIcon,
|
icon: Assets.devicesIcon,
|
||||||
active: true,
|
active: true,
|
||||||
onPress: (context) {
|
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