diff --git a/lib/pages/analytics/models/occupacy.dart b/lib/pages/analytics/models/occupacy.dart index ab53e5c2..b4b8dac9 100644 --- a/lib/pages/analytics/models/occupacy.dart +++ b/lib/pages/analytics/models/occupacy.dart @@ -1,18 +1,32 @@ import 'package:equatable/equatable.dart'; class Occupacy extends Equatable { - final String date; + final DateTime date; final String occupancy; + final String spaceUuid; + final int occupiedSeconds; - const Occupacy({required this.date, required this.occupancy}); + const Occupacy({ + required this.date, + required this.occupancy, + required this.spaceUuid, + required this.occupiedSeconds, + }); factory Occupacy.fromJson(Map json) { return Occupacy( - date: json['date'] as String, - occupancy: json['occupancy'] as String, + date: DateTime.parse(json['event_date'] as String? ?? '${DateTime.now()}'), + occupancy: (json['occupancy_percentage'] ?? 0).toString(), + spaceUuid: json['space_uuid'] as String? ?? '', + occupiedSeconds: json['occupied_seconds'] as int? ?? 0, ); } @override - List get props => [date, occupancy]; + List get props => [ + date, + occupancy, + spaceUuid, + occupiedSeconds, + ]; } diff --git a/lib/pages/analytics/modules/analytics/views/analytics_page.dart b/lib/pages/analytics/modules/analytics/views/analytics_page.dart index 72cc7d51..18f86a90 100644 --- a/lib/pages/analytics/modules/analytics/views/analytics_page.dart +++ b/lib/pages/analytics/modules/analytics/views/analytics_page.dart @@ -17,7 +17,7 @@ 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/energy_consumption_by_phases/remote_energy_consumption_by_phases_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/fake_occupacy_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/power_clamp_info/remote_power_clamp_info_service.dart'; import 'package:syncrow_web/pages/analytics/services/realtime_device_service/firebase_realtime_device_service.dart'; @@ -75,7 +75,11 @@ class _AnalyticsPageState extends State { FirebaseRealtimeDeviceService(), ), ), - BlocProvider(create: (context) => OccupancyBloc(FakeOccupacyService())), + BlocProvider( + create: (context) => OccupancyBloc( + RemoteOccupancyService(_httpService), + ), + ), BlocProvider( create: (context) => OccupancyHeatMapBloc( RemoteOccupancyHeatMapService(_httpService), diff --git a/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart b/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart index 5882ada5..0b01fda2 100644 --- a/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart +++ b/lib/pages/analytics/modules/occupancy/helpers/fetch_occupancy_data_helper.dart @@ -30,7 +30,6 @@ abstract final class FetchOccupancyDataHelper { loadOccupancyChartData( context, - communityUuid: communityId, spaceUuid: spaceId, date: datePickerState.monthlyDate, ); @@ -59,16 +58,14 @@ abstract final class FetchOccupancyDataHelper { static void loadOccupancyChartData( BuildContext context, { - required String communityUuid, required String spaceUuid, required DateTime date, }) { context.read().add( LoadOccupancyEvent( GetOccupancyParam( - monthDate: '${date.year}-${date.month}', + monthDate: '${date.year}-${date.month.toString().padLeft(2, '0')}', spaceUuid: spaceUuid, - communityUuid: communityUuid, ), ), ); diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart index 8a93ccf1..4a44c5a1 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart.dart @@ -16,10 +16,10 @@ class OccupancyChart extends StatelessWidget { Widget build(BuildContext context) { return BarChart( BarChartData( - maxY: 1.0, + maxY: 100.0, gridData: EnergyManagementChartsHelper.gridData().copyWith( checkToShowHorizontalLine: (value) => true, - horizontalInterval: 0.25, + horizontalInterval: 20, ), borderData: EnergyManagementChartsHelper.borderData(), barTouchData: _barTouchData(context), @@ -39,8 +39,8 @@ class OccupancyChart extends StatelessWidget { groupVertically: true, barRods: [ BarChartRodData( - toY: 1.0, - fromY: double.parse(actual.occupancy) + 0.025, + toY: 100.0, + fromY: double.parse(actual.occupancy) + 2.5, color: ColorsManager.graysColor, width: _chartWidth, borderRadius: BorderRadius.circular(10), @@ -88,7 +88,7 @@ class OccupancyChart extends StatelessWidget { final data = chartData; final occupancyValue = double.parse(data[group.x.toInt()].occupancy); - final percentage = '${(occupancyValue * 100).toStringAsFixed(0)}%'; + final percentage = '${(occupancyValue).toStringAsFixed(0)}%'; return BarTooltipItem( percentage, @@ -108,14 +108,14 @@ class OccupancyChart extends StatelessWidget { final leftTitles = titlesData.leftTitles.copyWith( sideTitles: titlesData.leftTitles.sideTitles.copyWith( reservedSize: 70, - interval: 0.25, + interval: 20, getTitlesWidget: (value, meta) => Padding( padding: const EdgeInsetsDirectional.only(end: 12), child: FittedBox( alignment: AlignmentDirectional.centerStart, fit: BoxFit.scaleDown, child: Text( - '${(value * 100).toStringAsFixed(0)}%', + '${(value).toStringAsFixed(0)}%', style: context.textTheme.bodySmall?.copyWith( fontSize: 12, color: ColorsManager.greyColor, diff --git a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart index 8c41da48..ab1d1699 100644 --- a/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart +++ b/lib/pages/analytics/modules/occupancy/widgets/occupancy_chart_box.dart @@ -50,9 +50,6 @@ class OccupancyChartBox extends StatelessWidget { if (spaceTreeState.selectedSpaces.isNotEmpty) { FetchOccupancyDataHelper.loadOccupancyChartData( context, - communityUuid: - spaceTreeState.selectedCommunities.firstOrNull ?? - '', spaceUuid: spaceTreeState.selectedSpaces.firstOrNull ?? '', date: value, diff --git a/lib/pages/analytics/params/get_occupancy_param.dart b/lib/pages/analytics/params/get_occupancy_param.dart index ed1b9375..79faa18c 100644 --- a/lib/pages/analytics/params/get_occupancy_param.dart +++ b/lib/pages/analytics/params/get_occupancy_param.dart @@ -1,19 +1,15 @@ class GetOccupancyParam { final String monthDate; final String? spaceUuid; - final String communityUuid; GetOccupancyParam({ required this.monthDate, required this.spaceUuid, - required this.communityUuid, }); Map toJson() { return { 'monthDate': monthDate, - 'spaceUuid': spaceUuid, - 'communityUuid': communityUuid, }; } } diff --git a/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart b/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart deleted file mode 100644 index 503a358b..00000000 --- a/lib/pages/analytics/services/occupacy/fake_occupacy_service.dart +++ /dev/null @@ -1,19 +0,0 @@ -import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; -import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; -import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; - -class FakeOccupacyService implements OccupacyService { - @override - Future> load(GetOccupancyParam param) async { - return await Future.delayed( - const Duration(seconds: 1), - () => List.generate( - 30, - (index) => Occupacy( - date: DateTime.now().subtract(Duration(days: index)).toString(), - occupancy: ((index / 100)).toString(), - ), - ), - ); - } -} diff --git a/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart new file mode 100644 index 00000000..7c52733b --- /dev/null +++ b/lib/pages/analytics/services/occupacy/remote_occupancy_service.dart @@ -0,0 +1,33 @@ +import 'package:syncrow_web/pages/analytics/models/occupacy.dart'; +import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart'; +import 'package:syncrow_web/pages/analytics/services/occupacy/occupacy_service.dart'; +import 'package:syncrow_web/services/api/http_service.dart'; + +final class RemoteOccupancyService implements OccupacyService { + const RemoteOccupancyService(this._httpService); + + final HTTPService _httpService; + + @override + Future> load(GetOccupancyParam param) async { + try { + final response = await _httpService.get( + // path: '/occupancy/duration/space/${param.spaceUuid}', + path: '/occupancy/duration/space/25c96044-fadf-44bb-93c7-3c079e527ce6', + showServerMessage: true, + queryParameters: param.toJson(), + expectedResponseModel: (data) { + final json = data as Map? ?? {}; + final mappedData = json['data'] as List? ?? []; + return mappedData.map((e) { + final jsonData = e as Map; + return Occupacy.fromJson(jsonData); + }).toList(); + }, + ); + return response; + } catch (e) { + throw Exception('Failed to load energy consumption per phase: $e'); + } + } +} \ No newline at end of file