using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Net.Http; using System.Net.Http.Json; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace VolPro.Warehouse.Services; /// /// 网关 HTTP 客户端。封装 Vol.Pro 调用 IntegrationGateway B 组接口的逻辑。 /// 所有对网关的请求统一经此类发出,便于连接池管理和错误处理。 /// public class GatewayClient { private readonly IHttpClientFactory _httpFactory; private readonly IConfiguration _config; public GatewayClient(IHttpClientFactory httpFactory, IConfiguration config) { _httpFactory = httpFactory; _config = config; } /// 创建带超时和默认头的 HttpClient private HttpClient CreateClient() { var client = _httpFactory.CreateClient("VolPro"); client.Timeout = TimeSpan.FromSeconds(30); return client; } /// /// B3: 手动触发网关全量设备同步。 /// POST {baseUrl}/api/gateway/devices/sync?adapter={adapterTypes} /// public async Task TriggerFullSyncAsync(string baseUrl, string adapterTypes) { var http = CreateClient(); var resp = await http.PostAsync( $"{baseUrl.TrimEnd('/')}/api/gateway/devices/sync?adapter={Uri.EscapeDataString(adapterTypes)}", null); if (!resp.IsSuccessStatusCode) return null; return await resp.Content.ReadFromJsonAsync(); } /// /// B4: 获取设备实时点位值。 /// GET {baseUrl}/api/gateway/realtime/{adapter}/{deviceId} /// public async Task GetRealtimeAsync(string baseUrl, string adapter, string deviceId) { var http = CreateClient(); var resp = await http.GetAsync( $"{baseUrl.TrimEnd('/')}/api/gateway/realtime/{Uri.EscapeDataString(adapter)}/{Uri.EscapeDataString(deviceId)}"); if (!resp.IsSuccessStatusCode) return null; return await resp.Content.ReadFromJsonAsync(); } /// /// B5: 设备反向控制。 /// POST {baseUrl}/api/gateway/realtime/{adapter}/control /// public async Task ControlDeviceAsync(string baseUrl, string adapter, string deviceId, int pointIndex, double value) { var http = CreateClient(); var resp = await http.PostAsJsonAsync( $"{baseUrl.TrimEnd('/')}/api/gateway/realtime/{adapter}/control", new { deviceId, pointIndex, value }); return resp.IsSuccessStatusCode; } }