using Ayay.SerilogLogs; using Newtonsoft.Json.Linq; using Serilog; using SHH.CameraSdk; using SHH.Contracts; namespace SHH.CameraService; /// /// 设备时间同步处理器 /// 响应 gRpc 指令:ProtocolCodes.Time_Sync /// public class TimeSyncHandler : ICommandHandler { private readonly ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core); private readonly CameraManager _cameraManager; // Optimized: 需在 ProtocolCodes 中定义此常量,确保与网关下发的 CmdCode 对应 public string ActionName => ProtocolCodes.Device_TimeSync; public TimeSyncHandler(CameraManager cameraManager) { _cameraManager = cameraManager ?? throw new ArgumentNullException(nameof(cameraManager)); } public async Task ExecuteAsync(JToken payload) { // 1. 解析基础参数 var deviceId = payload["DeviceId"]?.Value() ?? 0; var method = payload["Method"]?.Value()?.ToLower(); // "get" 或 "set" if (deviceId <= 0) { _sysLog.Warning("[TimeSync] 无效指令:设备ID非法"); return; } // 2. 获取设备并校验能力 var device = _cameraManager.GetDevice(deviceId); if (device == null) { _sysLog.Warning($"[TimeSync] 设备 {deviceId} 不存在"); return; } // Modified: 根据 ISyncFeature.cs 校验是否实现 ITimeSyncFeature 接口 if (!(device is ITimeSyncFeature syncFeature)) { _sysLog.Warning($"[TimeSync] 设备 {deviceId} 不支持时间同步功能"); return; } // 3. 业务逻辑分支 try { if (method == "set") { // 解析待设置的时间,若无则默认使用服务器当前系统时间 var targetTime = payload["SyncTime"]?.Value() ?? DateTime.Now; // 调用接口设置时间 await syncFeature.SetTimeAsync(targetTime); _sysLog.Information($"[TimeSync] 设备 {deviceId} 时间已同步为: {targetTime:yyyy-MM-dd HH:mm:ss}"); } else { // 执行获取时间 var deviceTime = await syncFeature.GetTimeAsync(); _sysLog.Information($"[TimeSync] 获取设备 {deviceId} 当前时间成功: {deviceTime:yyyy-MM-dd HH:mm:ss}"); // TODO: 若需要将结果返回给网关,需在此处调用 GatewayService 异步回传 } } catch (Exception ex) { _sysLog.Error(ex, $"[TimeSync] 设备 {deviceId} 操作失败 ({method})"); } } }