Files
feature-next-arch/lib/features/devices/data/datasources/device_task_datasource.dart

204 lines
6.3 KiB
Dart

import 'dart:convert';
import 'package:dio/dio.dart';
import 'package:get_it/get_it.dart';
import '../../../../core/consts/http_api_consts.dart';
import '../../../../core/logging/i_logger_service.dart';
import '../models/device_task_model.dart';
abstract class DeviceTaskDatasource {
Future<List<DeviceTaskModel>> getDeviceTaskPool({
required String userId,
required int siteId,
required int orgId,
int pageNum = 1,
int pageSize = 99999999,
});
Future<bool> cancelTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
bool forceCancel = true,
});
Future<bool> pauseTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
});
Future<Map<String, dynamic>> recoveryTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
});
}
class DeviceTaskDatasourceImpl implements DeviceTaskDatasource {
final Dio dio;
final ILoggerService _logger = GetIt.I<ILoggerService>();
DeviceTaskDatasourceImpl(this.dio);
@override
Future<List<DeviceTaskModel>> getDeviceTaskPool({
required String userId,
required int siteId,
required int orgId,
int pageNum = 1,
int pageSize = 99999999,
}) async {
try {
final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/deviceTaskPool';
_logger.logWithLevel('[getDeviceTaskPool] 请求: POST $url');
_logger.logWithLevel('[getDeviceTaskPool] 参数: userId=$userId, siteId=$siteId, orgId=$orgId');
final response = await dio.post(
url,
data: {
'userId': userId,
'siteId': siteId,
'orgId': orgId,
'pageNum': pageNum,
'pageSize': pageSize,
},
);
if (response.statusCode == 200) {
final data = response.data as Map<String, dynamic>;
if (data['code'] == 200) {
final rows = data['rows'] as List? ?? [];
return rows
.map((item) => DeviceTaskModel.fromJson(item as Map<String, dynamic>))
.toList();
} else {
throw Exception(data['msg'] ?? '获取任务池失败');
}
} else {
throw Exception('HTTP ${response.statusCode}');
}
} catch (e) {
_logger.logWithLevel('❌ 获取任务池失败: $e');
rethrow;
}
}
@override
Future<bool> cancelTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
bool forceCancel = true,
}) async {
final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/cancelTask';
final body = {
'deviceId': deviceId,
'taskId': taskId,
'orgId': orgId,
'siteId': siteId,
'forceCancel': forceCancel,
};
_logger.logWithLevel('[cancelTask] 请求: POST $url');
_logger.logWithLevel('[cancelTask] 参数: ${jsonEncode(body)}');
try {
final response = await dio.post(url, data: body);
_logger.logWithLevel('[cancelTask] 响应: statusCode=${response.statusCode}, body=${jsonEncode(response.data)}');
if (response.statusCode == 200) {
final data = response.data as Map<String, dynamic>;
if (data['code'] == 200) {
_logger.logWithLevel('[cancelTask] 结果: 成功');
return data['data'] as bool? ?? false;
} else {
_logger.logWithLevel('[cancelTask] 业务失败: code=${data['code']}, msg=${data['msg']}');
throw Exception(data['msg'] ?? '取消任务失败');
}
} else {
throw Exception('HTTP ${response.statusCode}');
}
} catch (e) {
_logger.logWithLevel('[cancelTask] 异常: $e');
rethrow;
}
}
@override
Future<bool> pauseTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
}) async {
final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/pauseTask';
final body = {
'deviceId': deviceId,
'taskId': taskId,
'orgId': orgId,
'siteId': siteId,
};
_logger.logWithLevel('[pauseTask] 请求: POST $url');
_logger.logWithLevel('[pauseTask] 参数: ${jsonEncode(body)}');
try {
final response = await dio.post(url, data: body);
_logger.logWithLevel('[pauseTask] 响应: statusCode=${response.statusCode}, body=${jsonEncode(response.data)}');
if (response.statusCode == 200) {
final data = response.data as Map<String, dynamic>;
if (data['code'] == 200) {
_logger.logWithLevel('[pauseTask] 结果: 成功');
return data['data'] as bool? ?? false;
} else {
_logger.logWithLevel('[pauseTask] 业务失败: code=${data['code']}, msg=${data['msg']}');
throw Exception(data['msg'] ?? '暂停任务失败');
}
} else {
throw Exception('HTTP ${response.statusCode}');
}
} catch (e) {
_logger.logWithLevel('[pauseTask] 异常: $e');
rethrow;
}
}
@override
Future<Map<String, dynamic>> recoveryTask({
required String deviceId,
required int taskId,
required int orgId,
required int siteId,
}) async {
final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/recoveryTask';
final body = {
'deviceId': deviceId,
'taskId': taskId,
'orgId': orgId,
'siteId': siteId,
};
_logger.logWithLevel('[recoveryTask] 请求: POST $url');
_logger.logWithLevel('[recoveryTask] 参数: ${jsonEncode(body)}');
try {
final response = await dio.post(url, data: body);
_logger.logWithLevel('[recoveryTask] 响应: statusCode=${response.statusCode}, body=${jsonEncode(response.data)}');
if (response.statusCode == 200) {
final data = response.data as Map<String, dynamic>;
if (data['code'] == 200) {
_logger.logWithLevel('[recoveryTask] 结果: 成功, data=${jsonEncode(data['data'])}');
return data['data'] as Map<String, dynamic>? ?? {};
} else {
_logger.logWithLevel('[recoveryTask] 业务失败: code=${data['code']}, msg=${data['msg']}');
throw Exception(data['msg'] ?? '恢复任务失败');
}
} else {
throw Exception('HTTP ${response.statusCode}');
}
} catch (e) {
_logger.logWithLevel('[recoveryTask] 异常: $e');
rethrow;
}
}
}