2025-09-09 13:35:16 +08:00
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
using AutoMapper;
|
|
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
|
|
|
|
using CommunityToolkit.Mvvm.Messaging;
|
|
|
|
|
|
using DMS.Application.DTOs;
|
2025-09-16 14:42:23 +08:00
|
|
|
|
using DMS.Application.Events;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
using DMS.Application.Interfaces;
|
|
|
|
|
|
using DMS.Core.Enums;
|
2025-09-15 20:54:32 +08:00
|
|
|
|
using DMS.Core.Events;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
using DMS.Core.Models;
|
|
|
|
|
|
using DMS.Message;
|
|
|
|
|
|
using DMS.WPF.Interfaces;
|
2025-10-06 18:17:56 +08:00
|
|
|
|
using DMS.WPF.ItemViewModel;
|
2025-10-02 11:26:50 +08:00
|
|
|
|
using Microsoft.Extensions.Logging;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
|
|
|
|
|
|
namespace DMS.WPF.Services;
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 数据事件服务类,负责处理数据变更事件和消息传递。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public class DataEventService : IDataEventService
|
|
|
|
|
|
{
|
|
|
|
|
|
private readonly IMapper _mapper;
|
2025-10-20 19:39:17 +08:00
|
|
|
|
private readonly IWpfDataService _dataStorageService;
|
2025-09-15 20:54:32 +08:00
|
|
|
|
private readonly IEventService _eventService;
|
2025-10-05 12:11:04 +08:00
|
|
|
|
private readonly INotificationService _notificationService;
|
2025-10-18 17:18:09 +08:00
|
|
|
|
private readonly IAppCenterService _appCenterService;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
private readonly IWPFDataService _wpfDataService;
|
2025-10-02 11:26:50 +08:00
|
|
|
|
private readonly ILogger<DataEventService> _logger;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// DataEventService类的构造函数。
|
|
|
|
|
|
/// </summary>
|
2025-09-14 16:16:10 +08:00
|
|
|
|
public DataEventService(IMapper mapper,
|
2025-10-20 19:39:17 +08:00
|
|
|
|
IWpfDataService dataStorageService,
|
2025-09-15 20:54:32 +08:00
|
|
|
|
IEventService eventService,
|
2025-10-05 12:11:04 +08:00
|
|
|
|
INotificationService notificationService,
|
2025-10-18 17:18:09 +08:00
|
|
|
|
IAppCenterService appCenterService,
|
2025-10-02 11:26:50 +08:00
|
|
|
|
IWPFDataService wpfDataService,
|
|
|
|
|
|
ILogger<DataEventService> logger)
|
2025-09-09 13:35:16 +08:00
|
|
|
|
{
|
|
|
|
|
|
_mapper = mapper;
|
|
|
|
|
|
_dataStorageService = dataStorageService;
|
2025-09-15 20:54:32 +08:00
|
|
|
|
_eventService = eventService;
|
2025-10-05 12:11:04 +08:00
|
|
|
|
_notificationService = notificationService;
|
2025-10-18 17:18:09 +08:00
|
|
|
|
_appCenterService = appCenterService;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService = wpfDataService;
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger = logger;
|
|
|
|
|
|
|
|
|
|
|
|
_logger?.LogInformation("正在初始化 DataEventService");
|
2025-09-09 13:35:16 +08:00
|
|
|
|
|
|
|
|
|
|
// 监听变量值变更事件
|
2025-09-15 20:54:32 +08:00
|
|
|
|
_eventService.OnVariableValueChanged += OnVariableValueChanged;
|
2025-10-05 00:28:25 +08:00
|
|
|
|
_eventService.OnMqttServerChanged += OnMqttServerChanged;
|
2025-10-05 11:21:05 +08:00
|
|
|
|
_eventService.OnLoadDataCompleted += OnLoadDataCompleted;
|
2025-09-09 13:35:16 +08:00
|
|
|
|
// 监听日志变更事件
|
2025-10-18 17:18:09 +08:00
|
|
|
|
// _appCenterService.OnLogChanged += _logDataService.OnNlogChanged;
|
2025-10-02 11:26:50 +08:00
|
|
|
|
|
|
|
|
|
|
_logger?.LogInformation("DataEventService 初始化完成");
|
2025-09-09 13:35:16 +08:00
|
|
|
|
}
|
2025-10-05 00:28:25 +08:00
|
|
|
|
|
|
|
|
|
|
private void OnMqttServerChanged(object? sender, MqttServerChangedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger?.LogDebug("接收到Mqtt服务器状态发生了改变,服务器名称:{mqttName}属性: {mqttProperty}",
|
|
|
|
|
|
e.MqttServer.ServerName, e.PropertyType);
|
|
|
|
|
|
|
|
|
|
|
|
// 在UI线程上更新变量值
|
|
|
|
|
|
App.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
//// 查找并更新对应的变量
|
|
|
|
|
|
if (_dataStorageService.MqttServers.TryGetValue(e.MqttServer.Id, out var mqttServerItem))
|
|
|
|
|
|
{
|
|
|
|
|
|
if (e.ChangeType == ActionChangeType.Updated)
|
|
|
|
|
|
{
|
|
|
|
|
|
switch (e.PropertyType)
|
|
|
|
|
|
{
|
|
|
|
|
|
case MqttServerPropertyType.ServerName:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.ServerUrl:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.Port:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.IsConnect:
|
|
|
|
|
|
mqttServerItem.IsConnect=e.MqttServer.IsConnect;
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.Username:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.Password:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.IsActive:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.SubscribeTopic:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.PublishTopic:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.ClientId:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.MessageFormat:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.MessageHeader:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.MessageContent:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.MessageFooter:
|
|
|
|
|
|
break;
|
|
|
|
|
|
case MqttServerPropertyType.All:
|
|
|
|
|
|
break;
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger?.LogWarning("在Mqtt服务器队列中找不到ID为 {MqttServer} 的变量,无法更新值", e.MqttServer.Id);
|
|
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
private void OnLoadDataCompleted(object? sender, DataLoadCompletedEventArgs e)
|
|
|
|
|
|
{
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("接收到数据加载完成事件,成功: {IsSuccess}", e.IsSuccess);
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
if (e.IsSuccess)
|
|
|
|
|
|
{
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogInformation("开始加载所有数据项");
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.DeviceDataService.LoadAllDevices();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("设备数据加载完成");
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.VariableTableDataService.LoadAllVariableTables();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("变量表数据加载完成");
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.VariableDataService.LoadAllVariables();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("变量数据加载完成");
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.MenuDataService.LoadAllMenus();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("菜单数据加载完成");
|
|
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.MqttDataService.LoadMqttServers();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("MQTT服务器数据加载完成");
|
|
|
|
|
|
|
2025-10-11 18:07:01 +08:00
|
|
|
|
_wpfDataService.MqttAliasDataService.LoadMqttAliases();
|
|
|
|
|
|
_logger?.LogDebug("MQTT别名加载完成");
|
2025-10-19 14:55:09 +08:00
|
|
|
|
_wpfDataService.TriggerDataService.LoadAllTriggers();
|
|
|
|
|
|
_logger?.LogDebug("触发器加载完成");
|
2025-10-11 18:07:01 +08:00
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
_wpfDataService.LogDataService.LoadAllLog();
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("日志数据加载完成");
|
|
|
|
|
|
|
|
|
|
|
|
_logger?.LogInformation("所有数据项加载完成");
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
_logger?.LogWarning("数据加载失败");
|
2025-09-09 13:35:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 处理变量值变更事件。
|
|
|
|
|
|
/// </summary>
|
2025-09-15 13:12:14 +08:00
|
|
|
|
private void OnVariableValueChanged(object? sender, VariableValueChangedEventArgs e)
|
2025-09-09 13:35:16 +08:00
|
|
|
|
{
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("接收到变量值变更事件,变量ID: {VariableId}, 新值: {NewValue}, 更新时间: {UpdateTime}",
|
2025-10-02 18:47:45 +08:00
|
|
|
|
e.Variable.Id, e.Variable.DataValue, e.Variable.UpdatedAt);
|
2025-10-02 11:26:50 +08:00
|
|
|
|
|
2025-09-09 13:35:16 +08:00
|
|
|
|
// 在UI线程上更新变量值
|
|
|
|
|
|
App.Current.Dispatcher.BeginInvoke(new Action(() =>
|
|
|
|
|
|
{
|
|
|
|
|
|
// 查找并更新对应的变量
|
2025-10-02 18:47:45 +08:00
|
|
|
|
if (_dataStorageService.Variables.TryGetValue(e.Variable.Id,out var variableToUpdate))
|
2025-09-09 13:35:16 +08:00
|
|
|
|
{
|
2025-10-02 18:47:45 +08:00
|
|
|
|
variableToUpdate.DataValue = e.Variable.DataValue;
|
|
|
|
|
|
variableToUpdate.DisplayValue = e.Variable.DisplayValue;
|
|
|
|
|
|
variableToUpdate.UpdatedAt = e.Variable.UpdatedAt;
|
2025-10-02 11:26:50 +08:00
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
2025-10-02 18:47:45 +08:00
|
|
|
|
_logger?.LogWarning("在变量存储中找不到ID为 {VariableId} 的变量,无法更新值", e.Variable.Id);
|
2025-09-09 13:35:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 处理LoadMessage消息。
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public async Task Receive(LoadMessage message)
|
|
|
|
|
|
{
|
2025-10-02 11:26:50 +08:00
|
|
|
|
_logger?.LogDebug("接收到LoadMessage消息,消息类型: {MessageType}", message.GetType().Name);
|
|
|
|
|
|
|
|
|
|
|
|
// 这里可以添加加载消息处理的逻辑
|
|
|
|
|
|
// 目前是空实现,但已记录接收到消息的信息
|
|
|
|
|
|
|
|
|
|
|
|
_logger?.LogDebug("LoadMessage消息处理完成");
|
2025-09-09 13:35:16 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|