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> getDeviceTaskPool({ required String userId, required int siteId, required int orgId, int pageNum = 1, int pageSize = 99999999, }); Future cancelTask({ required String deviceId, required int taskId, required int orgId, required int siteId, bool forceCancel = true, }); Future pauseTask({ required String deviceId, required int taskId, required int orgId, required int siteId, }); Future> 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(); DeviceTaskDatasourceImpl(this.dio); @override Future> 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; if (data['code'] == 200) { final rows = data['rows'] as List? ?? []; return rows .map((item) => DeviceTaskModel.fromJson(item as Map)) .toList(); } else { throw Exception(data['msg'] ?? '获取任务池失败'); } } else { throw Exception('HTTP ${response.statusCode}'); } } catch (e) { _logger.logWithLevel('❌ 获取任务池失败: $e'); rethrow; } } @override Future 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; 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 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; 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> 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; if (data['code'] == 200) { _logger.logWithLevel('[recoveryTask] 结果: 成功, data=${jsonEncode(data['data'])}'); return data['data'] as Map? ?? {}; } 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; } } }