74 lines
2.6 KiB
C#
74 lines
2.6 KiB
C#
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;
|
|
|
|
/// <summary>
|
|
/// 网关 HTTP 客户端。封装 Vol.Pro 调用 IntegrationGateway B 组接口的逻辑。
|
|
/// 所有对网关的请求统一经此类发出,便于连接池管理和错误处理。
|
|
/// </summary>
|
|
public class GatewayClient
|
|
{
|
|
private readonly IHttpClientFactory _httpFactory;
|
|
private readonly IConfiguration _config;
|
|
|
|
public GatewayClient(IHttpClientFactory httpFactory, IConfiguration config)
|
|
{
|
|
_httpFactory = httpFactory;
|
|
_config = config;
|
|
}
|
|
|
|
/// <summary>创建带超时和默认头的 HttpClient</summary>
|
|
private HttpClient CreateClient()
|
|
{
|
|
var client = _httpFactory.CreateClient("VolPro");
|
|
client.Timeout = TimeSpan.FromSeconds(30);
|
|
return client;
|
|
}
|
|
|
|
/// <summary>
|
|
/// B3: 手动触发网关全量设备同步。
|
|
/// POST {baseUrl}/api/gateway/devices/sync?adapter={adapterTypes}
|
|
/// </summary>
|
|
public async Task<JsonDocument?> 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<JsonDocument>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// B4: 获取设备实时点位值。
|
|
/// GET {baseUrl}/api/gateway/realtime/{adapter}/{deviceId}
|
|
/// </summary>
|
|
public async Task<JsonDocument?> 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<JsonDocument>();
|
|
}
|
|
|
|
/// <summary>
|
|
/// B5: 设备反向控制。
|
|
/// POST {baseUrl}/api/gateway/realtime/{adapter}/control
|
|
/// </summary>
|
|
public async Task<bool> 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;
|
|
}
|
|
}
|