Files
flutterApp/lib/features/devices/services/path_planning_service.dart

94 lines
3.0 KiB
Dart

// 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<ILoggerService>();
// 🔥 核心:全局唯一的可变队列
final Queue<DeviceAddPathPointModel> locationQueue = Queue();
bool isRunning = false;
int currentIndex = 0;
int totalCount = 0;
/// 🔥 存:生成路径后立即存储
void updateQueue(List<DeviceAddPathPointModel> 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<DeviceAddPathPointModel> getQueue() {
// return Queue.of(locationQueue);
// }
Queue<DeviceAddPathPointModel> getQueue() {
return locationQueue; // 直接返回引用
}
}