WmsController.cs 6.2 KB
using MassTransit.Mediator;
using Microsoft.AspNetCore.Mvc;
using Rcs.Application.Common;
using Rcs.Application.MessageBus.Commands;
using Rcs.Application.ThirdModels;
using Rcs.Domain.Repositories;

namespace Rcs.Api.OtherControllers;

/// <summary>
/// WMS 接口控制器
/// 用于内部 WMS 系统调用,提供任务创建等接口
/// @author zzy
/// </summary>
[Route("/[controller]")]
[ApiController]
public class WmsController : Controller
{
    private readonly ILogger<WmsController> _logger;
    private readonly IMediator _mediator;
    private readonly IStorageLocationRepository _storageLocationRepository;

    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="logger">日志记录器</param>
    /// <param name="mediator">中介者</param>
    /// <param name="storageLocationRepository">库位仓储</param>
    public WmsController(
        ILogger<WmsController> logger,
        IMediator mediator,
        IStorageLocationRepository storageLocationRepository)
    {
        _logger = logger ?? throw new ArgumentNullException(nameof(logger));
        _mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
        _storageLocationRepository = storageLocationRepository ?? throw new ArgumentNullException(nameof(storageLocationRepository));
    }

    /// <summary>
    /// WMS 任务创建接口
    /// 接收 WMS 系统的任务创建请求,验证参数后创建 AGV 搬运任务
    /// </summary>
    /// <param name="request">WMS 任务创建请求</param>
    /// <param name="cancellationToken">取消令牌</param>
    /// <returns>统一响应模型</returns>
    [HttpPost("task_create")]
    [ProducesResponseType(typeof(ApiResponse<WmsTaskCreateResult>), StatusCodes.Status200OK)]
    [ProducesResponseType(typeof(ValidationProblemDetails), StatusCodes.Status400BadRequest)]
    public async Task<IActionResult> TaskCreate(
        [FromBody] WmsTaskCreateRequest request,
        CancellationToken cancellationToken = default)
    {
        // 1. 优先输出完整请求日志
        _logger.LogInformation(
            "【WMS任务创建】收到请求: TaskNo={TaskNo}, TaskType={TaskType}, ContainerCode={ContainerCode}, " +
            "FromPort={FromPort}, ToPort={ToPort}, NeedEnsure={NeedEnsure}, CarNo={CarNo}, " +
            "Priority={Priority}, CreatedBy={CreatedBy}, CreatedTime={CreatedTime}",
            request.taskNo,
            request.taskType,
            request.containerCode,
            request.fromPort,
            request.toPort,
            request.needEnsure,
            request.carNo,
            request.priority,
            request.createdBy,
            request.createdTime);

        // 2. 校验起点库位是否存在
        var fromLocation = await _storageLocationRepository.GetByLocationCodeAsync(request.fromPort, cancellationToken);
        if (fromLocation == null)
        {
            _logger.LogWarning("【WMS任务创建】起点库位不存在: TaskNo={TaskNo}, FromPort={FromPort}",
                request.taskNo, request.fromPort);
            return BadRequest(ApiResponse<WmsTaskCreateResult>.Failed(
                $"起点库位编码不存在: {request.fromPort}"));
        }

        // 3. 校验终点库位是否存在
        var toLocation = await _storageLocationRepository.GetByLocationCodeAsync(request.toPort, cancellationToken);
        if (toLocation == null)
        {
            _logger.LogWarning("【WMS任务创建】终点库位不存在: TaskNo={TaskNo}, ToPort={ToPort}",
                request.taskNo, request.toPort);
            return BadRequest(ApiResponse<WmsTaskCreateResult>.Failed(
                $"终点库位编码不存在: {request.toPort}"));
        }

        // 4. 构建任务创建命令并发送
        var command = new CreateOrUpdateRobotTaskCommand
        {
            TaskCode = request.taskNo,
            TaskName = $"WMS_{request.taskType}",
            BeginLocationId = fromLocation.LocationId.ToString(),
            EndLocationId = toLocation.LocationId.ToString(),
            ContainerCode = request.containerCode,
            Priority = request.priority,
            CarNo = request.carNo,
            NeedEnsure = request.needEnsure,
            CreatedBy = request.createdBy,
            CreatedTime = request.createdTime,
            Source = "WMS"
        };

        _logger.LogInformation("【WMS任务创建】开始创建任务: TaskNo={TaskNo}", request.taskNo);

        var client = _mediator.CreateRequestClient<CreateOrUpdateRobotTaskCommand>();
        var response = await client.GetResponse<ApiResponse>(command, cancellationToken);

        var result = response.Message;

        // 5. 根据处理结果返回响应
        if (result.Success)
        {
            _logger.LogInformation("【WMS任务创建】任务创建成功: TaskNo={TaskNo}", request.taskNo);

            return Ok(ApiResponse<WmsTaskCreateResult>.Successful(
                new WmsTaskCreateResult
                {
                    TaskNo = request.taskNo,
                    TaskId = result.Data?.ToString()
                },
                "任务创建成功"));
        }

        _logger.LogWarning("【WMS任务创建】任务创建失败: TaskNo={TaskNo}, Reason={Reason}",
            request.taskNo, result.Message);

        return Ok(ApiResponse<WmsTaskCreateResult>.Failed(
            result.Message,
            result.Code,
            new WmsTaskCreateResult
            {
                TaskNo = request.taskNo
            }));
    }
}

public class WmsResponse    
{
    /// <summary>
    /// 响应码
    /// </summary>
    public int code { get; set; }

    /// <summary>
    /// 响应数据
    /// </summary>
    public dynamic? data { get; set; }
    /// <summary>
    /// 响应说明
    /// </summary>
    public string? msg { get; set; }
    public static WmsResponse Failed(string message, int code = 400)
    {
        return new WmsResponse
        {
            code = code,
            msg = message,
            data = null
        };
    }
    public static WmsResponse Successful(dynamic data = null, string message = "操作成功", int code = 200)
    {
        return new WmsResponse
        {
            code = code,
            msg = message,
            data = data
        };
    }
}