feature: Ward Gateway Service (Local-First Clinical Path)

This commit is contained in:
voltsrage
2026-06-23 16:45:38 +08:00
parent d8e142fffe
commit 1bf8359097
100 changed files with 5474 additions and 4 deletions
@@ -0,0 +1,58 @@
using System.Text;
using System.Text.Json;
using Microsoft.Extensions.Options;
using RabbitMQ.Client;
public sealed class LocalPagingPublisher
{
private readonly RabbitMqOptions _opts;
private readonly ILogger<LocalPagingPublisher> _logger;
public LocalPagingPublisher(IOptions<RabbitMqOptions> opts, ILogger<LocalPagingPublisher> logger)
{
_opts = opts.Value;
_logger = logger;
}
public Task PublishCriticalAsync(LocalClinicalAlert alert, ReplicaEncounter encounter)
{
try
{
var factory = new ConnectionFactory
{
HostName = _opts.Host,
Port = _opts.Port,
UserName = _opts.Username,
Password = _opts.Password
};
using var conn = factory.CreateConnection("gateway-publisher");
using var channel = conn.CreateModel();
var payload = JsonSerializer.Serialize(new
{
alertId = alert.Id,
encounterId = alert.EncounterId,
details = alert.Details,
attendingPhysician = encounter.AttendingPhysician
});
var body = Encoding.UTF8.GetBytes(payload);
channel.BasicPublish(
RabbitMqTopologyProvisioner.Exchange,
RabbitMqTopologyProvisioner.PagingKey,
body: body);
_logger.LogInformation(
"Published critical alert {AlertId} to paging queue for encounter {EncounterId}",
alert.Id, alert.EncounterId);
}
catch (Exception ex)
{
_logger.LogError(ex,
"Failed to publish critical alert {AlertId} to paging queue — alert persisted locally",
alert.Id);
}
return Task.CompletedTask;
}
}