OptionsController.cs 6.6 KB
using Microsoft.AspNetCore.Mvc;
using Rcs.Domain.Entities;
using Rcs.Domain.Enums;
using Rcs.Domain.Repositories;
using Rcs.Shared.Options;

namespace Rcs.Api.Controllers
{
    /// <summary>
    /// 下拉选项控制器
    /// 提供统一的下拉数据接口,支持多语言
    /// @author zzy
    /// </summary>
    [ApiController]
    [Route("api/[controller]")]
    public class OptionsController : ControllerBase
    {
        private readonly IRobotRepository _robotRepository;
        private readonly IStorageLocationRepository _storageLocationRepository;

        public OptionsController(IRobotRepository robotRepository, IStorageLocationRepository storageLocationRepository)
        {
            _robotRepository = robotRepository;
            _storageLocationRepository = storageLocationRepository;
        }
        /// <summary>
        /// 获取所有下拉选项
        /// </summary>
        /// <param name="lang">语言:zh-cn(默认), en</param>
        /// <returns>所有下拉选项</returns>
        [HttpGet]
        public IActionResult GetAllOptions([FromQuery] string lang = "zh-cn")
        {
            var language = EnumOptions.ParseLanguage(lang);
            return Ok(new
            {
                // 机器人管理
                RobotType = EnumOptions.GetOptions<RobotType>(language),
                RobotStatus = EnumOptions.GetOptions<RobotStatus>(language),
                OnlineStatus = EnumOptions.GetOptions<OnlineStatus>(language),
                OperatingMode = EnumOptions.GetOptions<OperatingMode>(language),
                ProtocolType = EnumOptions.GetOptions<ProtocolType>(language),
                // 地图管理
                MapType = EnumOptions.GetOptions<MapTYPE>(language),
                MapNodeType = EnumOptions.GetOptions<MapNodeTYPE>(language),
                MapResourceType = EnumOptions.GetOptions<MapResourcesTYPE>(language),
                // 动作管理
                ActionCategory = EnumOptions.GetOptions<ActionCategory>(language),
                ActionBlockType = EnumOptions.GetOptions<ActionBlockType>(language),
                ExecutionScope = EnumOptions.GetOptions<ExecutionScope>(language),
                ParameterValueType = EnumOptions.GetOptions<ParameterValueType>(language),
                ParameterSourceType = EnumOptions.GetOptions<ParameterSourceType>(language),
                // 任务模板
                TaskStatus = EnumOptions.GetOptions<Rcs.Domain.Entities.TaskStatus>(language),
                TaskStepType = EnumOptions.GetOptions<TaskStepType>(language),
                StepPropertyType = EnumOptions.GetOptions<StepPropertyType>(language),
                AfterActionType = EnumOptions.GetOptions<AfterActionType>(language),
                NodeValueType = EnumOptions.GetOptions<NodeValueType>(language)
            });
        }

        /// <summary>
        /// 获取机器人相关下拉选项
        /// </summary>
        [HttpGet("robot")]
        public IActionResult GetRobotOptions([FromQuery] string lang = "zh-cn")
        {
            var language = EnumOptions.ParseLanguage(lang);
            return Ok(new
            {
                RobotType = EnumOptions.GetOptions<RobotType>(language),
                RobotStatus = EnumOptions.GetOptions<RobotStatus>(language),
                OnlineStatus = EnumOptions.GetOptions<OnlineStatus>(language),
                OperatingMode = EnumOptions.GetOptions<OperatingMode>(language),
                ProtocolType = EnumOptions.GetOptions<ProtocolType>(language)
            });
        }

        /// <summary>
        /// 获取地图相关下拉选项
        /// </summary>
        [HttpGet("map")]
        public IActionResult GetMapOptions([FromQuery] string lang = "zh-cn")
        {
            var language = EnumOptions.ParseLanguage(lang);
            return Ok(new
            {
                MapType = EnumOptions.GetOptions<MapTYPE>(language),
                MapNodeType = EnumOptions.GetOptions<MapNodeTYPE>(language),
                MapResourceType = EnumOptions.GetOptions<MapResourcesTYPE>(language)
            });
        }

        /// <summary>
        /// 获取动作相关下拉选项
        /// </summary>
        [HttpGet("action")]
        public IActionResult GetActionOptions([FromQuery] string lang = "zh-cn")
        {
            var language = EnumOptions.ParseLanguage(lang);
            return Ok(new
            {
                ActionCategory = EnumOptions.GetOptions<ActionCategory>(language),
                ActionBlockType = EnumOptions.GetOptions<ActionBlockType>(language),
                ExecutionScope = EnumOptions.GetOptions<ExecutionScope>(language),
                ParameterValueType = EnumOptions.GetOptions<ParameterValueType>(language),
                ParameterSourceType = EnumOptions.GetOptions<ParameterSourceType>(language)
            });
        }

        /// <summary>
        /// 获取任务模板相关下拉选项
        /// </summary>
        [HttpGet("task")]
        public IActionResult GetTaskOptions([FromQuery] string lang = "zh-cn")
        {
            var language = EnumOptions.ParseLanguage(lang);
            return Ok(new
            {
                TaskStatus = EnumOptions.GetOptions<Rcs.Domain.Entities.TaskStatus>(language),
                TaskStepType = EnumOptions.GetOptions<TaskStepType>(language),
                StepPropertyType = EnumOptions.GetOptions<StepPropertyType>(language),
                AfterActionType = EnumOptions.GetOptions<AfterActionType>(language),
                NodeValueType = EnumOptions.GetOptions<NodeValueType>(language)
            });
        }

        /// <summary>
        /// 获取机器人下拉选项
        /// @author zzy
        /// </summary>
        [HttpGet("robots")]
        public async Task<IActionResult> GetRobotSelectOptions(CancellationToken cancellationToken = default)
        {
            var robots = await _robotRepository.GetActiveRobotsAsync(cancellationToken);
            var options = robots.Select(r => new { value = r.RobotId, text = $"{r.RobotCode} - {r.RobotName}", code = r.RobotCode });
            return Ok(options);
        }

        /// <summary>
        /// 获取库位下拉选项
        /// @author zzy
        /// </summary>
        [HttpGet("locations")]
        public async Task<IActionResult> GetLocationSelectOptions(CancellationToken cancellationToken = default)
        {
            var locations = await _storageLocationRepository.GetAllAsync(cancellationToken);
            var options = locations.Where(l => l.IsActive).Select(l => new { value = l.LocationId, text = $"{l.LocationName}", code = l.LocationId });
            return Ok(options);
        }
    }
}