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, }); 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'; final response = await dio.get( url, queryParameters: { '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, }) async { try { final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/cancelTask'; final response = await dio.post( url, data: { 'deviceId': deviceId, 'taskId': taskId, 'orgId': orgId, 'siteId': siteId, }, ); if (response.statusCode == 200) { final data = response.data as Map; if (data['code'] == 200) { return data['data'] as bool? ?? false; } else { throw Exception(data['msg'] ?? '取消任务失败'); } } else { throw Exception('HTTP ${response.statusCode}'); } } catch (e) { _logger.logWithLevel('❌ 取消任务失败: $e'); rethrow; } } @override Future pauseTask({ required String deviceId, required int taskId, required int orgId, required int siteId, }) async { try { final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/pauseTask'; final response = await dio.post( url, data: { 'deviceId': deviceId, 'taskId': taskId, 'orgId': orgId, 'siteId': siteId, }, ); if (response.statusCode == 200) { final data = response.data as Map; if (data['code'] == 200) { return data['data'] as bool? ?? false; } else { throw Exception(data['msg'] ?? '暂停任务失败'); } } else { throw Exception('HTTP ${response.statusCode}'); } } catch (e) { _logger.logWithLevel('❌ 暂停任务失败: $e'); rethrow; } } @override Future> recoveryTask({ required String deviceId, required int taskId, required int orgId, required int siteId, }) async { try { final url = '${HttpApiConsts.baseUrl}/iot/deviceTask/recoveryTask'; final response = await dio.post( url, data: { 'deviceId': deviceId, 'taskId': taskId, 'orgId': orgId, 'siteId': siteId, }, ); if (response.statusCode == 200) { final data = response.data as Map; if (data['code'] == 200) { return data['data'] as Map? ?? {}; } else { throw Exception(data['msg'] ?? '恢复任务失败'); } } else { throw Exception('HTTP ${response.statusCode}'); } } catch (e) { _logger.logWithLevel('❌ 恢复任务失败: $e'); rethrow; } } }