Files
flutterApp/lib/features/remote_control/data/datasources/remote_http_datasource.dart

143 lines
5.4 KiB
Dart
Raw Normal View History

2026-01-18 20:21:14 +08:00
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:get_it/get_it.dart';
import '../../../../core/consts/http_api_consts.dart';
import '../../../../core/logging/i_logger_service.dart';
import '../../../../core/storage/user_storage.dart';
2026-01-18 20:21:14 +08:00
class RemoteHttpDatasource {
final Dio _dio;
final UserStorage _userStorage; // 🔥 新增字段
final ILoggerService _logger = GetIt.I<ILoggerService>();
2026-01-18 20:21:14 +08:00
RemoteHttpDatasource(this._dio, this._userStorage);
2026-01-18 20:21:14 +08:00
/// 示例:获取控制授权 (对应之前逻辑中的权限申请)
/* Future<Map<String, dynamic>> requestControlAuth(String robotId) async {
2026-01-18 20:21:14 +08:00
try {
final response = await _dio.post(
'/robot/auth/request',
data: {'robotId': robotId},
);
return response.data;
} catch (e) {
rethrow;
}
}*/
2026-06-05 19:06:21 +08:00
/// 🔥 返回完整权限信息: {hasPermission, owner}
Future<Map<String, dynamic>> requestRemoteControlViaHttp(String deviceName, String platform) async {
final logPrefix = '🔑 [RemoteHttp][获取权限接口]';
final user = await _userStorage.getUser();
if (user == null) {
debugPrint('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限');
_logger.logWithLevel('❌ [RemoteHttp] 用户未登录,无法请求远程控制权限', shouldLog: true);
2026-06-05 19:06:21 +08:00
return {'hasPermission': false, 'owner': null};
}
final token = user.token;
debugPrint('$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform');
_logger.logWithLevel(
'$logPrefix 开始请求远程控制权限 - deviceName: $deviceName, platform: $platform',
shouldLog: true,
);
try {
final requestData = {'deviceId': deviceName, 'platform': platform};
debugPrint('$logPrefix 请求地址: POST /forward/device/remoteControl');
debugPrint('$logPrefix 实际请求体: $requestData');
_logger.logWithLevel(
'$logPrefix 请求地址: POST /forward/device/remoteControl, 请求体: $requestData',
shouldLog: true,
);
final response = await _dio.post(
'/forward/device/remoteControl',
options: Options(
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token}',
},
),
data: requestData);
debugPrint("$logPrefix HTTP响应状态码: ${response.statusCode}");
_logger.logWithLevel("$logPrefix HTTP响应状态码: ${response.statusCode}", shouldLog: true);
2026-03-13 20:29:06 +08:00
final responseData = response.data as Map<String, dynamic>;
debugPrint("$logPrefix 完整响应数据:$responseData");
_logger.logWithLevel("$logPrefix 完整响应数据:$responseData", shouldLog: true);
2026-03-13 20:29:06 +08:00
2026-06-05 19:06:21 +08:00
// 🔥 关键:先获取响应的 data 字段,再获取 remoteControl 和 owner
2026-03-13 20:29:06 +08:00
final dataField = responseData['data'] as Map<String, dynamic>?;
if (dataField != null) {
final bool hasRemoteControl = dataField['remoteControl'] as bool? ?? false;
2026-06-05 19:06:21 +08:00
final String? owner = dataField['owner'] as String?;
2026-03-13 20:29:06 +08:00
debugPrint("$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner");
_logger.logWithLevel(
"$logPrefix 解析成功 - remoteControl=$hasRemoteControl, owner=$owner",
shouldLog: true,
);
2026-06-05 19:06:21 +08:00
// 🔥 返回完整权限信息
return {'hasPermission': hasRemoteControl, 'owner': owner};
} else {
debugPrint("$logPrefix 缺少 data 字段,响应结构异常");
_logger.logWithLevel("$logPrefix 缺少 data 字段,响应结构异常", shouldLog: true);
2026-06-05 19:06:21 +08:00
return {'hasPermission': false, 'owner': null};
}
} catch (e) {
debugPrint('$logPrefix 请求远程控制权限失败:$e');
_logger.logWithLevel('$logPrefix 请求远程控制权限失败:$e', level: 'ERROR', shouldLog: true);
2026-06-05 19:06:21 +08:00
return {'hasPermission': false, 'owner': null};
}
2026-01-18 20:21:14 +08:00
}
///app退出远程控制后释放权限
/// [type] 1=从机器人详情页退出释放, 2=退出远程遥控页面释放
Future<bool> releaseRemoteControlViaHttp({
required String deviceId,
required int type,
}) async {
final user = await _userStorage.getUser();
if (user == null) {
debugPrint('❌ [RemoteHttp] releaseControl 未获取到用户信息,跳过释放');
return false;
}
final token = user.token;
final requestData = {
'platform': 'app',
'type': type,
'deviceId': deviceId,
'token': token,
};
debugPrint('📤 [RemoteHttp] releaseControl 实际请求体: $requestData');
try {
final response = await _dio.post(
HttpApiConsts.releaseControlUrl,
options: Options(
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ${token}',
},
),
data: requestData);
final responseData = response.data as Map<String, dynamic>;
debugPrint('📋 [RemoteHttp] releaseControl 响应: $responseData');
if (responseData['code'] == 200) {
return true;
}
debugPrint(
'⚠️ [RemoteHttp] releaseControl 返回 code=${responseData['code']},释放未成功');
return false;
} catch (e) {
debugPrint('❌ [RemoteHttp] releaseControl 请求失败:$e');
_logger.log('❌ [RemoteHttp] releaseControl 请求失败:$e');
return false;
}
}
2026-01-18 20:21:14 +08:00
}