// lib/features/devices/domain/services/path_planning_service.dart import 'dart:collection'; import 'package:flutter/cupertino.dart'; import 'package:get_it/get_it.dart'; import '../../../core/logging/i_logger_service.dart'; import '../data/models/device_add_path_point_model.dart'; class PathPlanningService { static final PathPlanningService _instance = PathPlanningService._internal(); factory PathPlanningService() => _instance; PathPlanningService._internal(); final ILoggerService _logger = GetIt.I(); // 🔥 核心:全局唯一的可变队列 final Queue locationQueue = Queue(); bool isRunning = false; int currentIndex = 0; int totalCount = 0; /// 🔥 存:生成路径后立即存储 void updateQueue(List locations) { debugPrint('进入[PathPlanningService]updateQueue方法尝试更新空队列'); _logger.logWithLevel('进入[PathPlanningService]updateQueue方法尝试更新空队列'); if (locations.isEmpty) { debugPrint('⚠️ [PathPlanningService] 尝试更新空队列'); _logger.logWithLevel('⚠️ [PathPlanningService] 尝试更新空队列'); return; } locationQueue.clear(); locationQueue.addAll(locations); currentIndex = 0; totalCount = locations.length; //debugPrint('✅ [PathPlanningService] 队列已更新,共 $totalCount 个点'); _logger.logWithLevel('✅ [PathPlanningService] 队列已更新,共 $totalCount 个点'); } /// 🔥 取:发送时取出第一个点 DeviceAddPathPointModel? removeFirst() { if (locationQueue.isEmpty) { //debugPrint('⚠️ [PathPlanningService] 队列为空'); _logger.logWithLevel('⚠️ [PathPlanningService] 队列为空'); return null; } final point = locationQueue.removeFirst(); currentIndex++; // debugPrint( // '📍 [PathPlanningService] 取出第 $currentIndex/$totalCount 个点:' // '${point.latitude}, ${point.longitude}', // ); _logger.logWithLevel( '📍 [PathPlanningService] 取出第 $currentIndex/$totalCount 个点:' '${point.latitude}, ${point.longitude}', ); return point; } /// 🔥 获取进度 int get remainingCount => locationQueue.length; int get completedCount => currentIndex; double get progress => totalCount == 0 ? 0.0 : currentIndex / totalCount; bool get isEmpty => locationQueue.isEmpty; bool get isNotEmpty => locationQueue.isNotEmpty; /// 🔥 清空(作业完成或停止时) void clear() { locationQueue.clear(); isRunning = false; currentIndex = 0; totalCount = 0; //debugPrint('🧹 [PathPlanningService] 队列已清空'); _logger.logWithLevel('🧹 [PathPlanningService] 队列已清空'); } int get length => locationQueue.length; /// 获取当前队列(供 Cubit 使用) // Queue getQueue() { // return Queue.of(locationQueue); // } Queue getQueue() { return locationQueue; // 直接返回引用 } }