Initial commit

This commit is contained in:
2026-07-03 16:37:12 +07:00
commit 63b8c1ea8b
1931 changed files with 640587 additions and 0 deletions

View File

@@ -0,0 +1,149 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using RobotNet10.FleetManager.Data;
using RobotNet10.FleetManager.Services;
using RobotNet10.FleetManager.Services.RobotManager;
using RobotNet10.FleetManager.Services.RobotManager.Models;
using RobotNet10.FleetManager.Shared.Models;
using RobotNet10.MapManager.Services;
using RobotNet10.Shared;
namespace RobotNet10.FleetManager.Controllers;
[Route("api/[controller]")]
[ApiController]
[AllowAnonymous]
public class RobotManagerController(IRobotService RobotService, ILayoutDataService LayoutManager, IRobotManagerService RobotManager, Services.Logger<RobotManagerController> Logger) : ControllerBase
{
[HttpPost]
[Route("MoveToNode")]
public async Task<MessageResult> MoveToNode([FromBody] RobotMoveToNodeModel model)
{
try
{
if (string.IsNullOrEmpty(model.NodeName)) return new(false, "NodeName cannot be empty..");
var robot = await RobotService.GetByRobotIdAsync(model.RobotId);
if (robot is null) return new(false, "RobotId does not exist.");
if (robot.MapId is null || robot.MapId == Guid.Empty) return new(false, "The robot has not been assigned a map.");
var robotController = RobotManager.GetRobotController(model.RobotId);
if (robotController is null || !robotController.IsOnline) return new(false, "The robot is not online.");
if (robotController.Data is null || robotController.Data.State is null) return new(false, "The robot is broken connection.");
var map = await LayoutManager.GetLayoutDataAsync(robot.MapId ?? Guid.Empty);
var node = map.Nodes.FirstOrDefault(n => n.NodeName == model.NodeName && n.LevelId == map.LayoutLevelId);
if (node is null) return new(false, "This Node does not exist.");
if (!robotController.IsReady) return new(false, "The robot is busy.");
var move = await robotController.MoveToNodeAsync(model.NodeName, model.LastAngle);
if (move.IsSuccess) return new(true);
Logger.Warning($"RobotManager API: MoveToNode for robot {model.RobotId} to node {model.NodeName} failed: {move.Message}");
return new(false, "Request failed.");
}
catch (Exception ex)
{
Logger.Error($"RobotManager API: MoveToNode for robot {model.RobotId} to node {model.NodeName} error: {ex.Message}");
return new(false, "An error occurred.");
}
}
[HttpDelete]
[Route("MoveToNode/{robotId}")]
public async Task<MessageResult> Cancel(string robotId)
{
try
{
var robot = await RobotService.GetByRobotIdAsync(robotId);
if (robot is null) return new(false, "RobotId does not exist.");
var robotController = RobotManager.GetRobotController(robotId);
if (robotController is null || !robotController.IsOnline) return new(false, "The robot is not online.");
if (robotController.Data is null || robotController.Data.State is null) return new(false, "The robot is broken connection.");
var cancel = await robotController.CancelOrderAsync();
if (cancel.IsSuccess) return new(true);
Logger.Warning($"RobotManager API: Cancel order for robot {robotId} failed: {cancel.Message}");
return new(false, "Request failed.");
}
catch (Exception ex)
{
Logger.Error($"RobotManager API: Cancel order for robot {robotId} error: {ex.Message}");
return new(false, "An error occurred.");
}
}
[HttpPost]
[Route("InstantActions")]
public async Task<MessageResult> InstantAction([FromBody] RobotInstantActionModel model)
{
try
{
var robot = await RobotService.GetByRobotIdAsync(model.RobotId);
if (robot is null) return new(false, "RobotId does not exist.");
if (robot.MapId is null || robot.MapId == Guid.Empty) return new(false, "The robot has not been assigned a map.");
var robotController = RobotManager.GetRobotController(model.RobotId);
if (robotController is null || !robotController.IsOnline) return new(false, "The robot is not online.");
if (robotController.Data is null || robotController.Data.State is null) return new(false, "The robot is broken connection.");
var instantAction = await robotController.SendInstantActionAsync(model.Action);
if (instantAction.IsSuccess) return new(true);
Logger.Warning($"RobotManager API: Send instant action for robot {model.RobotId} failed: {instantAction.Message}");
return new(false, "Request failed.");
}
catch (Exception ex)
{
Logger.Error($"RobotManager API: Send instant action for robot {model.RobotId}, action type {model.Action.ActionType} error: {ex.Message}");
return new(false, "An error occurred.");
}
}
[HttpGet]
[Route("State/{robotId}")]
public async Task<MessageResult<RobotData>> GetState(string robotId)
{
try
{
var robot = await RobotService.GetByRobotIdAsync(robotId);
if (robot is null) return new(false, null, "RobotId does not exist.");
if (robot.MapId is null || robot.MapId == Guid.Empty) return new(false, null, "The robot has not been assigned a map.");
var robotController = RobotManager.GetRobotController(robotId);
if (robotController is null || !robotController.IsOnline) return new(false, null, "The robot is not online.");
if (robotController.Data is null || robotController.Data.State is null) return new(false, null, "The robot is broken connection.");
return new(true, robotController.Data, "");
}
catch (Exception ex)
{
Logger.Error($"RobotManager API: GetState for robot {robotId} error: {ex.Message}");
return new(false, null, "An error occurred.");
}
}
[HttpGet]
[Route("OnlineStatus/{robotId}")]
public async Task<MessageResult<bool>> GetOnlineStatus(string robotId)
{
try
{
var robot = await RobotService.GetByRobotIdAsync(robotId);
if (robot is null) return new(false, false, "RobotId does not exist.");
var robotController = RobotManager.GetRobotController(robotId);
var isOnline = robotController?.IsOnline ?? false;
return new(true, isOnline, "");
}
catch (Exception ex)
{
Logger.Error($"RobotManager API: GetOnlineStatus for robot {robotId} error: {ex.Message}");
return new(false, false, "An error occurred.");
}
}
}