WmsTaskCallbackService.cs
5.04 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
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; }
}