using RobotNet10.FleetManager.Script; using RobotNet10.FleetManager.Services.RobotManager; using RobotNet10.FleetManager.Services.TrafficControl; using System.Linq.Expressions; namespace RobotNet10.FleetManager.Services.Script; public class ScriptRobotmanager(IRobotManagerService RobotManager, IServiceScopeFactory ScopeFactory, IOrderControlService OrderControlService) : IRobotManager { public async Task GetRobotById(string robotId) { using var scope = ScopeFactory.CreateScope(); var _robotService = scope.ServiceProvider.GetRequiredService(); var robotDb = await _robotService.GetByRobotIdAsync(robotId); if (robotDb is null) return null; var robotController = RobotManager.GetRobotController(robotId); if (robotController is null) return null; return new ScriptRobot(robotDb.RobotId, robotDb.Name, robotDb.ModelId, robotDb.MapId, robotController); } public Task GetRobotOrderStatus(string robotId) { var orderStatus = OrderControlService.GetRobotOrderStatus(robotId); return orderStatus switch { OrderStatus.IsError => Task.FromResult(RobotOrderStatus.IsError), OrderStatus.IsCompleted => Task.FromResult(RobotOrderStatus.IsCompleted), OrderStatus.IsProccessing => Task.FromResult(RobotOrderStatus.IsProccessing), OrderStatus.IsCanceled => Task.FromResult(RobotOrderStatus.IsCanceled), _ => Task.FromResult(RobotOrderStatus.Empty), }; } public Task GetRobotState(string robotId) { var robotController = RobotManager.GetRobotController(robotId); if (robotController is null || robotController.Data is null || robotController.Data.State is null || robotController.Data.Visualization is null) return Task.FromResult(null); return Task.FromResult(new RobotState(robotController.IsReady, robotController.Data.State.BatteryState.BatteryVoltage ?? 0, robotController.Data.State.Loads, robotController.Data.State.BatteryState.Charging, robotController.Data.Visualization.AgvPosition.X, robotController.Data.Visualization.AgvPosition.Y, robotController.Data.Visualization.AgvPosition.Theta)); } public async Task> SearchRobots(string layout, string version, string level, string model) => await RobotManager.GetAvailableRobots(layout, version, level, model, state => true); public async Task> SearchRobots(string layout, string version, string level, string model, Expression> expr) => await RobotManager.GetAvailableRobots(layout, version, level, model, expr.Compile()); }