机器人的列表接口

This commit is contained in:
2026-06-01 17:33:16 +08:00
parent 9154174614
commit 93e69a5e4b
23 changed files with 1312 additions and 269 deletions

View File

@@ -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();
}

View File

@@ -16,8 +16,8 @@ class DeviceRepositoryImpl implements DeviceRepository {
}
@override
Future<List<DeviceEntity>> getDeviceList({String? typeFilter}) async {
final dataModels = await remoteDataSource.getDeviceList(typeFilter: typeFilter);
Future<List<DeviceEntity>> getDeviceList({int? siteId, String? typeFilter}) async {
final dataModels = await remoteDataSource.getDeviceList(siteId: siteId, typeFilter: typeFilter);
return dataModels.map((model) => model.toEntity()).toList();
}
}