mirror of
https://github.com/SyncrowIOT/web.git
synced 2025-07-10 15:17:31 +00:00
analytics devices integtation.
This commit is contained in:
@ -1,11 +1,13 @@
|
|||||||
class AnalyticsDevice {
|
class AnalyticsDevice {
|
||||||
const AnalyticsDevice(this.uuid);
|
const AnalyticsDevice({required this.name, required this.uuid});
|
||||||
|
|
||||||
final String uuid;
|
final String uuid;
|
||||||
|
final String name;
|
||||||
|
|
||||||
factory AnalyticsDevice.fromJson(Map<String, dynamic> json) {
|
factory AnalyticsDevice.fromJson(Map<String, dynamic> json) {
|
||||||
return AnalyticsDevice(
|
return AnalyticsDevice(
|
||||||
json['uuid'] as String? ?? '',
|
uuid: json['uuid'] as String? ?? '',
|
||||||
|
name: json['name'] as String? ?? '',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,9 @@ import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/real
|
|||||||
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/total_energy_consumption/total_energy_consumption_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_analytics_devices_service.dart';
|
import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service_delagate.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/services/analytics_devices/remote_energy_management_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/energy_consumption_by_phases/fake_energy_consumption_by_phases_service.dart';
|
import 'package:syncrow_web/pages/analytics/services/energy_consumption_by_phases/fake_energy_consumption_by_phases_service.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/fake_energy_consumption_per_device_service.dart';
|
import 'package:syncrow_web/pages/analytics/services/energy_consumption_per_device/fake_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/fake_occupacy_service.dart';
|
||||||
@ -82,7 +84,10 @@ class _AnalyticsPageState extends State<AnalyticsPage> {
|
|||||||
BlocProvider(create: (context) => AnalyticsDatePickerBloc()),
|
BlocProvider(create: (context) => AnalyticsDatePickerBloc()),
|
||||||
BlocProvider(
|
BlocProvider(
|
||||||
create: (context) => AnalyticsDevicesBloc(
|
create: (context) => AnalyticsDevicesBloc(
|
||||||
RemoteAnalyticsDevicesService(_httpService),
|
AnalyticsDevicesServiceDelegate(
|
||||||
|
RemoteOccupancyAnalyticsDevicesService(_httpService),
|
||||||
|
RemoteEnergyManagementAnalyticsDevicesService(_httpService),
|
||||||
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
@ -111,7 +111,8 @@ abstract final class FetchEnergyManagementDataHelper {
|
|||||||
GetAnalyticsDevicesParam(
|
GetAnalyticsDevicesParam(
|
||||||
communityUuid: communityUuid,
|
communityUuid: communityUuid,
|
||||||
spaceUuid: spaceUuid,
|
spaceUuid: spaceUuid,
|
||||||
deviceType: 'PC',
|
deviceTypes: ['PC'],
|
||||||
|
requestType: AnalyticsDeviceRequestType.energyManagement,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
@ -1,9 +1,12 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/models/analytics_device.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_date_picker_bloc/analytics_date_picker_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_date_picker_bloc/analytics_date_picker_bloc.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/modules/analytics/blocs/analytics_devices/analytics_devices_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/realtime_device_changes/realtime_device_changes_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/energy_management/blocs/realtime_device_changes/realtime_device_changes_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy/occupancy_bloc.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart';
|
import 'package:syncrow_web/pages/analytics/modules/occupancy/blocs/occupancy_heat_map/occupancy_heat_map_bloc.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.dart';
|
import 'package:syncrow_web/pages/analytics/params/get_occupancy_heat_map_param.dart';
|
||||||
import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart';
|
import 'package:syncrow_web/pages/analytics/params/get_occupancy_param.dart';
|
||||||
|
|
||||||
@ -21,6 +24,9 @@ abstract final class FetchOccupancyDataHelper {
|
|||||||
|
|
||||||
final datePickerState = context.read<AnalyticsDatePickerBloc>().state;
|
final datePickerState = context.read<AnalyticsDatePickerBloc>().state;
|
||||||
|
|
||||||
|
loadAnalyticsDevices(context, communityUuid: communityId, spaceUuid: spaceId);
|
||||||
|
final selectedDevice = context.read<AnalyticsDevicesBloc>().state.selectedDevice;
|
||||||
|
|
||||||
context.read<OccupancyBloc>().add(
|
context.read<OccupancyBloc>().add(
|
||||||
LoadOccupancyEvent(
|
LoadOccupancyEvent(
|
||||||
GetOccupancyParam(
|
GetOccupancyParam(
|
||||||
@ -41,11 +47,30 @@ abstract final class FetchOccupancyDataHelper {
|
|||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
context.read<RealtimeDeviceChangesBloc>()
|
if (selectedDevice case final AnalyticsDevice device) {
|
||||||
..add(const RealtimeDeviceChangesClosed())
|
context.read<RealtimeDeviceChangesBloc>()
|
||||||
..add(
|
..add(const RealtimeDeviceChangesClosed())
|
||||||
const RealtimeDeviceChangesStarted('14fe6e7e-47af-4a07-ae0a-7c4a26ef8135'),
|
..add(
|
||||||
);
|
RealtimeDeviceChangesStarted(device.uuid),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void loadAnalyticsDevices(
|
||||||
|
BuildContext context, {
|
||||||
|
required String communityUuid,
|
||||||
|
required String spaceUuid,
|
||||||
|
}) {
|
||||||
|
context.read<AnalyticsDevicesBloc>().add(
|
||||||
|
LoadAnalyticsDevicesEvent(
|
||||||
|
GetAnalyticsDevicesParam(
|
||||||
|
communityUuid: communityUuid,
|
||||||
|
spaceUuid: spaceUuid,
|
||||||
|
deviceTypes: ['WPS', 'CPS'],
|
||||||
|
requestType: AnalyticsDeviceRequestType.occupancy,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clearAllData(BuildContext context) {
|
static void clearAllData(BuildContext context) {
|
||||||
@ -58,5 +83,9 @@ abstract final class FetchOccupancyDataHelper {
|
|||||||
context.read<RealtimeDeviceChangesBloc>().add(
|
context.read<RealtimeDeviceChangesBloc>().add(
|
||||||
const RealtimeDeviceChangesClosed(),
|
const RealtimeDeviceChangesClosed(),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
context.read<AnalyticsDevicesBloc>().add(
|
||||||
|
const ClearAnalyticsDeviceEvent(),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,20 @@
|
|||||||
|
enum AnalyticsDeviceRequestType { energyManagement, occupancy }
|
||||||
|
|
||||||
class GetAnalyticsDevicesParam {
|
class GetAnalyticsDevicesParam {
|
||||||
final String? spaceUuid;
|
final String? spaceUuid;
|
||||||
final String deviceType;
|
final List<String> deviceTypes;
|
||||||
final String? communityUuid;
|
final String? communityUuid;
|
||||||
|
final AnalyticsDeviceRequestType requestType;
|
||||||
|
|
||||||
const GetAnalyticsDevicesParam({
|
const GetAnalyticsDevicesParam({
|
||||||
|
required this.requestType,
|
||||||
required this.spaceUuid,
|
required this.spaceUuid,
|
||||||
required this.deviceType,
|
required this.deviceTypes,
|
||||||
required this.communityUuid,
|
required this.communityUuid,
|
||||||
});
|
});
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
return <String, dynamic>{
|
return <String, dynamic>{
|
||||||
'deviceType': deviceType,
|
|
||||||
if (spaceUuid != null) 'spaceUuid': spaceUuid,
|
if (spaceUuid != null) 'spaceUuid': spaceUuid,
|
||||||
if (communityUuid != null) 'communityUuid': communityUuid,
|
if (communityUuid != null) 'communityUuid': communityUuid,
|
||||||
};
|
};
|
||||||
|
@ -0,0 +1,24 @@
|
|||||||
|
import 'package:syncrow_web/pages/analytics/models/analytics_device.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart';
|
||||||
|
|
||||||
|
class AnalyticsDevicesServiceDelegate implements AnalyticsDevicesService {
|
||||||
|
const AnalyticsDevicesServiceDelegate(
|
||||||
|
this._occupancyService,
|
||||||
|
this._energyManagementService,
|
||||||
|
);
|
||||||
|
|
||||||
|
final AnalyticsDevicesService _occupancyService;
|
||||||
|
final AnalyticsDevicesService _energyManagementService;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<AnalyticsDevice>> getDevices(
|
||||||
|
GetAnalyticsDevicesParam param,
|
||||||
|
) {
|
||||||
|
return switch (param.requestType) {
|
||||||
|
AnalyticsDeviceRequestType.occupancy => _occupancyService.getDevices(param),
|
||||||
|
AnalyticsDeviceRequestType.energyManagement =>
|
||||||
|
_energyManagementService.getDevices(param),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -3,8 +3,9 @@ import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.d
|
|||||||
import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart';
|
import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart';
|
||||||
import 'package:syncrow_web/services/api/http_service.dart';
|
import 'package:syncrow_web/services/api/http_service.dart';
|
||||||
|
|
||||||
final class RemoteAnalyticsDevicesService implements AnalyticsDevicesService {
|
final class RemoteEnergyManagementAnalyticsDevicesService
|
||||||
const RemoteAnalyticsDevicesService(this._httpService);
|
implements AnalyticsDevicesService {
|
||||||
|
const RemoteEnergyManagementAnalyticsDevicesService(this._httpService);
|
||||||
|
|
||||||
final HTTPService _httpService;
|
final HTTPService _httpService;
|
||||||
|
|
||||||
@ -12,8 +13,9 @@ final class RemoteAnalyticsDevicesService implements AnalyticsDevicesService {
|
|||||||
Future<List<AnalyticsDevice>> getDevices(GetAnalyticsDevicesParam param) async {
|
Future<List<AnalyticsDevice>> getDevices(GetAnalyticsDevicesParam param) async {
|
||||||
try {
|
try {
|
||||||
final response = await _httpService.get(
|
final response = await _httpService.get(
|
||||||
path: '/devices/recursive-child',
|
path: '/devices-space-community/recursive-child',
|
||||||
queryParameters: param.toJson(),
|
queryParameters: param.toJson()
|
||||||
|
..addAll({'productType': param.deviceTypes.first}),
|
||||||
expectedResponseModel: (response) {
|
expectedResponseModel: (response) {
|
||||||
final json = response as Map<String, dynamic>;
|
final json = response as Map<String, dynamic>;
|
||||||
final dailyData = json['data'] as List<dynamic>? ?? <dynamic>[];
|
final dailyData = json['data'] as List<dynamic>? ?? <dynamic>[];
|
||||||
@ -28,7 +30,7 @@ final class RemoteAnalyticsDevicesService implements AnalyticsDevicesService {
|
|||||||
|
|
||||||
return response;
|
return response;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
throw Exception('Failed to load total energy consumption:');
|
throw Exception('Failed to load total energy consumption: $e');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
import 'package:syncrow_web/pages/analytics/models/analytics_device.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/params/get_analytics_devices_param.dart';
|
||||||
|
import 'package:syncrow_web/pages/analytics/services/analytics_devices/analytics_devices_service.dart';
|
||||||
|
import 'package:syncrow_web/pages/common/bloc/project_manager.dart';
|
||||||
|
import 'package:syncrow_web/services/api/http_service.dart';
|
||||||
|
|
||||||
|
class RemoteOccupancyAnalyticsDevicesService implements AnalyticsDevicesService {
|
||||||
|
const RemoteOccupancyAnalyticsDevicesService(this._httpService);
|
||||||
|
|
||||||
|
final HTTPService _httpService;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<AnalyticsDevice>> getDevices(GetAnalyticsDevicesParam param) async {
|
||||||
|
try {
|
||||||
|
final requests = await Future.wait<List<AnalyticsDevice>>(
|
||||||
|
param.deviceTypes.map((e) {
|
||||||
|
final mappedParam = GetAnalyticsDevicesParam(
|
||||||
|
requestType: AnalyticsDeviceRequestType.occupancy,
|
||||||
|
spaceUuid: param.spaceUuid,
|
||||||
|
deviceTypes: [e],
|
||||||
|
communityUuid: param.communityUuid,
|
||||||
|
);
|
||||||
|
return _makeRequest(mappedParam);
|
||||||
|
}).toList(),
|
||||||
|
);
|
||||||
|
|
||||||
|
final result = requests.map((e) => e.first).toList();
|
||||||
|
return result;
|
||||||
|
} catch (e) {
|
||||||
|
throw Exception('Failed to load total energy consumption: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Future<List<AnalyticsDevice>> _makeRequest(GetAnalyticsDevicesParam param) async {
|
||||||
|
try {
|
||||||
|
final projectUuid = await ProjectManager.getProjectUUID();
|
||||||
|
|
||||||
|
final response = await _httpService.get(
|
||||||
|
path:
|
||||||
|
'/projects/$projectUuid/communities/${param.communityUuid}/spaces/${param.spaceUuid}/devices',
|
||||||
|
queryParameters: {
|
||||||
|
'requestType': param.requestType.name,
|
||||||
|
'communityUuid': param.communityUuid,
|
||||||
|
'spaceUuid': param.spaceUuid,
|
||||||
|
'productType': param.deviceTypes.first,
|
||||||
|
},
|
||||||
|
expectedResponseModel: (response) {
|
||||||
|
final json = response as Map<String, dynamic>;
|
||||||
|
final dailyData = json['data'] as List<dynamic>? ?? <dynamic>[];
|
||||||
|
|
||||||
|
final result = dailyData.map(
|
||||||
|
(json) => AnalyticsDevice.fromJson(json as Map<String, dynamic>),
|
||||||
|
);
|
||||||
|
return result.toList();
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return response;
|
||||||
|
} catch (e) {
|
||||||
|
rethrow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user