Files
qhmes/yy-admin-master/YY.Admin.Services/Service/Vehicle/VehicleSyncCoordinator.cs

92 lines
3.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using Prism.Events;
using System.Text.Json;
using YY.Admin.Core;
using YY.Admin.Core.Events;
using YY.Admin.Core.Services;
namespace YY.Admin.Services.Service.Vehicle;
/// <summary>
/// 监听 STOMP 收到的车辆变更信号,转发为桌面端 Prism 事件,触发列表刷新。
/// </summary>
public class VehicleSyncCoordinator : ISingletonDependency
{
private readonly IEventAggregator _eventAggregator;
private readonly ILoggerService _logger;
private SubscriptionToken? _remoteCommandToken;
private SubscriptionToken? _networkStatusToken;
public VehicleSyncCoordinator(
IEventAggregator eventAggregator,
SyncPollManager pollManager,
ILoggerService logger)
{
_eventAggregator = eventAggregator;
_logger = logger;
_remoteCommandToken = _eventAggregator
.GetEvent<RemoteCommandReceivedEvent>()
.Subscribe(OnRemoteCommand, ThreadOption.BackgroundThread);
_networkStatusToken = _eventAggregator
.GetEvent<NetworkStatusChangedEvent>()
.Subscribe(OnNetworkStatusChanged, ThreadOption.BackgroundThread);
pollManager.Register("车辆", () =>
{
_eventAggregator.GetEvent<VehicleChangedEvent>()
.Publish(new VehicleChangedPayload { Action = "poll" });
return Task.CompletedTask;
});
_logger.Information("[车辆推送] VehicleSyncCoordinator 已启动");
}
private void OnNetworkStatusChanged(NetworkStatusChangedPayload payload)
{
if (!payload.IsOnline) return;
_logger.Information("[车辆推送] 网络恢复,触发补偿刷新");
_eventAggregator.GetEvent<VehicleChangedEvent>().Publish(new VehicleChangedPayload { Action = "reconnect" });
}
private void OnRemoteCommand(RemoteCommandPayload payload)
{
try
{
var json = payload.CommandJson ?? string.Empty;
if (string.IsNullOrWhiteSpace(json))
{
_logger.Information("[车辆推送] 收到空命令,忽略");
return;
}
using var doc = JsonDocument.Parse(json);
if (!doc.RootElement.TryGetProperty("cmd", out var cmdEl))
{
_logger.Information("[车辆推送] 命令无cmd字段忽略");
return;
}
var cmd = cmdEl.GetString() ?? string.Empty;
if (!cmd.Equals("MES_VEHICLE_CHANGED", StringComparison.OrdinalIgnoreCase))
{
_logger.Information($"[车辆推送] 非车辆命令 cmd={cmd},忽略");
return;
}
doc.RootElement.TryGetProperty("action", out var actionEl);
doc.RootElement.TryGetProperty("vehicleId", out var idEl);
var changedPayload = new VehicleChangedPayload
{
Action = actionEl.GetString() ?? string.Empty,
VehicleId = idEl.ValueKind == JsonValueKind.String ? idEl.GetString() : null,
};
_logger.Information($"收到车辆变更信号: action={changedPayload.Action}, vehicleId={changedPayload.VehicleId}");
_eventAggregator.GetEvent<VehicleChangedEvent>().Publish(changedPayload);
}
catch (Exception ex)
{
_logger.Warning($"处理 STOMP 车辆变更信号失败: {ex.Message}");
}
}
}