WmsTaskCallbackService.cs 5.04 KB
using System.Text.Json;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Rcs.Application.DTOs;
using Rcs.Application.Services;
using Rcs.Application.Shared;
using Rcs.Domain.Settings;

namespace Rcs.Infrastructure.Services;

/// <summary>
/// WMS任务状态回传服务实现
/// @author zzy
/// </summary>
public class WmsTaskCallbackService : IWmsTaskCallbackService
{
    private readonly IHttpClientService _httpClientService;
    private readonly ILogger<WmsTaskCallbackService> _logger;
    private readonly AppSettings _settings;

    // 任务状态常量
    private const int StatusExecuting = 20;   // 任务执行中
    private const int StatusPickupCompleted = 50;  // 取货完成
    private const int StatusTaskCompleted = 100;   // 任务完成

    public WmsTaskCallbackService(
        IHttpClientService httpClientService,
        ILogger<WmsTaskCallbackService> logger,
        IOptions<AppSettings> settings)
    {
        _httpClientService = httpClientService;
        _logger = logger;
        _settings = settings.Value;
    }

    /// <summary>
    /// 发送任务状态到WMS系统
    /// </summary>
    public async Task<bool> SendTaskStatusAsync(WmsTaskStatusDto taskStatus, CancellationToken cancellationToken = default)
    {
        try
        {
            if (!(_settings.WmsSettings?.Enabled ?? false))
            {
                _logger.LogInformation("[WmsTaskCallback] WMS回调已禁用,跳过任务状态回传,任务号: {TaskNo}", taskStatus.taskNo);
                return true;
            }
            if (string.IsNullOrWhiteSpace(taskStatus.taskNo))
            {
                _logger.LogWarning("[WmsTaskCallback] 任务号不能为空");
                return false;
            }

            // 获取WMS回调完整URL
            var url = GetWmsCallbackUrl();
            if (string.IsNullOrWhiteSpace(url))
            {
                _logger.LogWarning("[WmsTaskCallback] WMS回调地址未配置");
                return false;
            }

            _logger.LogInformation("[WmsTaskCallback] WMS callback URL: {CallbackUrl}", url);
            _logger.LogInformation(
                "[WmsTaskCallback] 发送任务状态到WMS,任务号: {TaskNo}, 车号: {CarNo}, 状态: {Status}, 数据: {Data}",
                taskStatus.taskNo,
                taskStatus.carNo,
                taskStatus.status,
                JsonSerializer.Serialize(taskStatus));

            var response = await _httpClientService.PostAsync<WmsTaskStatusDto, WmsCallbackResponse>(
                url,
                taskStatus,
                cancellationToken: cancellationToken);

            if (response != null && response.Success)
            {
                _logger.LogInformation(
                    "[WmsTaskCallback] 任务状态发送成功,任务号: {TaskNo}",
                    taskStatus.taskNo);
                return true;
            }
            else
            {
                _logger.LogWarning(
                    "[WmsTaskCallback] 任务状态发送失败,任务号: {TaskNo}, 响应: {Response}",
                    taskStatus.taskNo,
                    response?.Message ?? "未知错误");
                return false;
            }
        }
        catch (Exception ex)
        {
            _logger.LogError(
                ex,
                "[WmsTaskCallback] 发送任务状态时发生异常,任务号: {TaskNo}",
                taskStatus.taskNo);
            return false;
        }
    }

    /// <summary>
    /// 发送任务完成状态
    /// </summary>
    public async Task<bool> SendTaskCompletedAsync(string taskNo, int carNo, string updatedBy, CancellationToken cancellationToken = default)
    {
        var taskStatus = new WmsTaskStatusDto
        {
            taskNo = taskNo,
            carNo = carNo,
            status = StatusTaskCompleted,
            updatedBy = updatedBy,
            updatedTime = DateTime.Now
        };

        return await SendTaskStatusAsync(taskStatus, cancellationToken);
    }

    /// <summary>
    /// 获取WMS回调完整URL
    /// </summary>
    private string GetWmsCallbackUrl()
    {
        var baseUrl = _settings.WmsSettings?.BaseUrl ?? _settings.ExternalBaseUrl ?? string.Empty;
        var endpoint = _settings.WmsSettings?.Endpoints?.TaskStatusCallback ?? string.Empty;
        
        if (string.IsNullOrWhiteSpace(baseUrl) || string.IsNullOrWhiteSpace(endpoint))
        {
            return string.Empty;
        }

        if (Uri.TryCreate(endpoint, UriKind.Absolute, out var absoluteEndpoint))
        {
            return absoluteEndpoint.ToString();
        }

        return $"{baseUrl.TrimEnd('/')}/{endpoint.TrimStart('/')}";
    }
}

/// <summary>
/// WMS回调响应模型
/// </summary>
public class WmsCallbackResponse
{
    /// <summary>
    /// 是否成功
    /// </summary>
    public bool Success { get; set; }

    /// <summary>
    /// 响应消息
    /// </summary>
    public string? Message { get; set; }

    /// <summary>
    /// 响应数据
    /// </summary>
    public object? Data { get; set; }
}