机器人的列表接口
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
import 'package:dio/dio.dart';
|
||||
import '../../../../../core/consts/http_api_consts.dart';
|
||||
import '../../domain/entities/device_entity.dart';
|
||||
import '../../domain/entities/device_status_entity.dart';
|
||||
import '../models/device_data_model.dart';
|
||||
@@ -6,17 +8,22 @@ import '../models/device_status_data_model.dart';
|
||||
/// 设备远程数据源抽象接口
|
||||
abstract class DeviceRemoteDataSource {
|
||||
Future<DeviceStatusDataModel> getDeviceStatus();
|
||||
Future<List<DeviceDataModel>> getDeviceList({String? typeFilter});
|
||||
Future<List<DeviceDataModel>> getDeviceList({
|
||||
int? siteId,
|
||||
String? typeFilter,
|
||||
});
|
||||
}
|
||||
|
||||
/// 设备远程数据源实现类 - 模拟从 API 获取数据
|
||||
/// 设备远程数据源实现类 - 从真实 API 获取数据
|
||||
class DeviceRemoteDataSourceImpl implements DeviceRemoteDataSource {
|
||||
final Dio dio;
|
||||
|
||||
DeviceRemoteDataSourceImpl(this.dio);
|
||||
|
||||
@override
|
||||
Future<DeviceStatusDataModel> getDeviceStatus() async {
|
||||
// 模拟网络延迟
|
||||
await Future.delayed(const Duration(seconds: 1));
|
||||
|
||||
// 模拟数据
|
||||
return const DeviceStatusDataModel(
|
||||
total: 136,
|
||||
online: 122,
|
||||
@@ -26,11 +33,119 @@ class DeviceRemoteDataSourceImpl implements DeviceRemoteDataSource {
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<DeviceDataModel>> getDeviceList({String? typeFilter}) async {
|
||||
// 模拟网络延迟
|
||||
await Future.delayed(const Duration(milliseconds: 500));
|
||||
Future<List<DeviceDataModel>> getDeviceList({
|
||||
int? siteId,
|
||||
String? typeFilter,
|
||||
}) async {
|
||||
if (siteId == null) {
|
||||
return _getMockDevices(typeFilter);
|
||||
}
|
||||
|
||||
// 模拟数据 - 根据设计图
|
||||
try {
|
||||
final List<Future<List<DeviceDataModel>>> futures = [
|
||||
_fetchDevicesFromAPI(siteId),
|
||||
_fetchUAVDevicesFromAPI(siteId),
|
||||
];
|
||||
|
||||
final results = await Future.wait(futures);
|
||||
|
||||
final allDevices = <DeviceDataModel>[];
|
||||
for (var result in results) {
|
||||
allDevices.addAll(result);
|
||||
}
|
||||
|
||||
if (typeFilter != null && typeFilter != '全部') {
|
||||
return allDevices.where((device) => device.type == typeFilter).toList();
|
||||
}
|
||||
|
||||
return allDevices;
|
||||
} catch (e) {
|
||||
return _getMockDevices(typeFilter);
|
||||
}
|
||||
}
|
||||
|
||||
Future<List<DeviceDataModel>> _fetchDevicesFromAPI(int siteId) async {
|
||||
final response = await dio.get(
|
||||
HttpApiConsts.getSiteDeviceList,
|
||||
queryParameters: {'siteId': siteId, 'pageSize': 9999, 'pageNum': 1},
|
||||
);
|
||||
|
||||
if (response.statusCode != 200) {
|
||||
throw Exception('网络请求失败: ${response.statusCode}');
|
||||
}
|
||||
|
||||
final responseData = response.data;
|
||||
|
||||
if (responseData['code'] != 200) {
|
||||
throw Exception(responseData['msg'] ?? '业务异常');
|
||||
}
|
||||
|
||||
final List<dynamic> rows = responseData['rows'] ?? [];
|
||||
return rows.map((item) => _parseDeviceFromJson(item)).toList();
|
||||
}
|
||||
|
||||
Future<List<DeviceDataModel>> _fetchUAVDevicesFromAPI(int siteId) async {
|
||||
final response = await dio.get(
|
||||
HttpApiConsts.getSiteUAVList,
|
||||
queryParameters: {'siteId': siteId},
|
||||
);
|
||||
|
||||
if (response.statusCode != 200) {
|
||||
throw Exception('网络请求失败: ${response.statusCode}');
|
||||
}
|
||||
|
||||
final responseData = response.data;
|
||||
|
||||
if (responseData['code'] != 200) {
|
||||
throw Exception(responseData['msg'] ?? '业务异常');
|
||||
}
|
||||
|
||||
final List<dynamic> rows = responseData['rows'] ?? [];
|
||||
return rows.map((item) => _parseUAVDeviceFromJson(item)).toList();
|
||||
}
|
||||
|
||||
DeviceDataModel _parseDeviceFromJson(Map<String, dynamic> json) {
|
||||
return DeviceDataModel(
|
||||
deviceId: json['deviceId']?.toString() ?? '',
|
||||
name: json['deviceName'] ?? json['name'] ?? '',
|
||||
type: json['deviceTypeName'] ?? json['type'] ?? '未知设备',
|
||||
status: _getStatusText(json['status'] ?? 0),
|
||||
power: (json['power'] as num?)?.toDouble() ?? 0,
|
||||
todayEnergy: (json['todayEnergy'] as num?)?.toDouble() ?? 0,
|
||||
temperature: (json['temperature'] as num?)?.toDouble(),
|
||||
current: (json['current'] as num?)?.toDouble(),
|
||||
voltage: (json['voltage'] as num?)?.toDouble(),
|
||||
radiation: (json['radiation'] as num?)?.toDouble(),
|
||||
);
|
||||
}
|
||||
|
||||
DeviceDataModel _parseUAVDeviceFromJson(Map<String, dynamic> json) {
|
||||
final onlineStatus = json['onlineStatus'] ?? 0;
|
||||
return DeviceDataModel(
|
||||
deviceId: json['device_sn']?.toString() ?? '',
|
||||
name: json['callsign'] ?? '无人机机场',
|
||||
type: '无人机机场',
|
||||
status: onlineStatus == 1 ? '在线' : '离线',
|
||||
power: (json['capacity_percent'] as num?)?.toDouble() ?? 0,
|
||||
todayEnergy: 0,
|
||||
temperature: (json['environment_temperature'] as num?)?.toDouble(),
|
||||
);
|
||||
}
|
||||
|
||||
String _getStatusText(int status) {
|
||||
switch (status) {
|
||||
case 1:
|
||||
return '在线';
|
||||
case 2:
|
||||
return '离线';
|
||||
case 3:
|
||||
return '异常';
|
||||
default:
|
||||
return '未知';
|
||||
}
|
||||
}
|
||||
|
||||
List<DeviceDataModel> _getMockDevices(String? typeFilter) {
|
||||
final allDevices = [
|
||||
const DeviceDataModel(
|
||||
deviceId: '10001',
|
||||
@@ -85,7 +200,6 @@ class DeviceRemoteDataSourceImpl implements DeviceRemoteDataSource {
|
||||
),
|
||||
];
|
||||
|
||||
// 根据类型过滤
|
||||
if (typeFilter != null && typeFilter != '全部') {
|
||||
return allDevices.where((device) => device.type == typeFilter).toList();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user