1. VariableChangedEventArgs 重构:

- 创建了 ActionChangeType 枚举(与 DataChangeType 相同)
      - 创建了 VariablePropertyType 枚举标识变量属性类型
      - 重构 VariableChangedEventArgs 类,移除 ChangeTime 和 VariableTable 属性
      - 将 ChangeType 从 DataChangeType 改为 ActionChangeType
      - 添加了 PropertyType 属性用于标识哪个属性发生变化
This commit is contained in:
2025-10-02 19:16:44 +08:00
parent 3958275367
commit f3e7793293
4 changed files with 291 additions and 32 deletions

View File

@@ -11,7 +11,7 @@ namespace DMS.Application.Events
/// <summary>
/// 变更类型
/// </summary>
public DataChangeType ChangeType { get; }
public ActionChangeType ChangeType { get; }
/// <summary>
/// 变量DTO
@@ -19,27 +19,21 @@ namespace DMS.Application.Events
public VariableDto Variable { get; }
/// <summary>
/// 关联的变量表DTO
/// 发生变化的属性类型
/// </summary>
public VariableTableDto VariableTable { get; }
/// <summary>
/// 变更时间
/// </summary>
public DateTime ChangeTime { get; }
public VariablePropertyType PropertyType { get; }
/// <summary>
/// 构造函数
/// </summary>
/// <param name="changeType">变更类型</param>
/// <param name="variable">变量DTO</param>
/// <param name="variableTable">关联的变量表DTO</param>
public VariableChangedEventArgs(DataChangeType changeType, VariableDto variable, VariableTableDto variableTable)
/// <param name="propertyType">发生变化的属性类型</param>
public VariableChangedEventArgs(ActionChangeType changeType, VariableDto variable, VariablePropertyType propertyType = VariablePropertyType.All)
{
ChangeType = changeType;
Variable = variable;
VariableTable = variableTable;
ChangeTime = DateTime.Now;
PropertyType = propertyType;
}
}
}

View File

@@ -71,7 +71,7 @@ public class VariableManagementService : IVariableManagementService
if (_appDataStorageService.Variables.TryAdd(result.Id, result))
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Added, result, variableTableDto));
this, new VariableChangedEventArgs(ActionChangeType.Added, result));
}
}
@@ -88,15 +88,35 @@ public class VariableManagementService : IVariableManagementService
// 更新成功后,更新内存中的变量
if (result > 0 && variableDto != null)
{
VariableTableDto variableTableDto = null;
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable))
if (_appDataStorageService.Variables.TryGetValue(variableDto.Id, out var mVariableDto))
{
variableTableDto = variableTable;
}
// 比较旧值和新值,确定哪个属性发生了变化
var changedProperties = GetChangedProperties(mVariableDto, variableDto);
// 更新内存中的变量
UpdateVariableInMemory(mVariableDto, variableDto);
_appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto);
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto));
// 为每个发生变化的属性触发事件
foreach (var property in changedProperties)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, property));
}
// 如果没有任何属性发生变化,至少触发一次更新事件
if (changedProperties.Count == 0)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, VariablePropertyType.All));
}
}
else
{
// 如果内存中不存在该变量,则直接添加
_appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto);
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Added, variableDto, VariablePropertyType.All));
}
}
return result;
@@ -114,20 +134,35 @@ public class VariableManagementService : IVariableManagementService
{
foreach (var variableDto in variableDtos)
{
VariableTableDto variableTableDto = null;
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable))
if (_appDataStorageService.Variables.TryGetValue(variableDto.Id, out var mVariableDto))
{
variableTableDto = variableTable;
}
// 比较旧值和新值,确定哪个属性发生了变化
var changedProperties = GetChangedProperties(mVariableDto, variableDto);
// 更新内存中的变量
UpdateVariableInMemory(mVariableDto, variableDto);
if (_appDataStorageService.Variables.TryGetValue(variableDto.Id,out var mVariableDto))
// 为每个发生变化的属性触发事件
foreach (var property in changedProperties)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, property));
}
// 如果没有任何属性发生变化,至少触发一次更新事件
if (changedProperties.Count == 0)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, VariablePropertyType.All));
}
}
else
{
_mapper.Map(variableDto, mVariableDto);
// 如果内存中不存在该变量,则直接添加
_appDataStorageService.Variables.TryAdd(variableDto.Id, variableDto);
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Added, variableDto, VariablePropertyType.All));
}
// _appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto);
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto));
}
}
@@ -155,7 +190,7 @@ public class VariableManagementService : IVariableManagementService
}
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Deleted, variableDto, variableTableDto));
this, new VariableChangedEventArgs(ActionChangeType.Deleted, variableDto));
}
}
@@ -192,6 +227,85 @@ public class VariableManagementService : IVariableManagementService
return await _variableAppService.FindExistingVariablesAsync(variablesToCheck);
}
/// <summary>
/// 获取发生变化的属性列表
/// </summary>
/// <param name="oldVariable">旧变量值</param>
/// <param name="newVariable">新变量值</param>
/// <returns>发生变化的属性列表</returns>
private List<VariablePropertyType> GetChangedProperties(VariableDto oldVariable, VariableDto newVariable)
{
var changedProperties = new List<VariablePropertyType>();
if (oldVariable.Name != newVariable.Name)
changedProperties.Add(VariablePropertyType.Name);
if (oldVariable.S7Address != newVariable.S7Address)
changedProperties.Add(VariablePropertyType.S7Address);
if (oldVariable.DataType != newVariable.DataType)
changedProperties.Add(VariablePropertyType.DataType);
if (oldVariable.ConversionFormula != newVariable.ConversionFormula)
changedProperties.Add(VariablePropertyType.ConversionFormula);
if (oldVariable.OpcUaUpdateType != newVariable.OpcUaUpdateType)
changedProperties.Add(VariablePropertyType.OpcUaUpdateType);
if (oldVariable.MqttAliases != newVariable.MqttAliases)
changedProperties.Add(VariablePropertyType.MqttAlias);
if (oldVariable.Description != newVariable.Description)
changedProperties.Add(VariablePropertyType.Description);
if (oldVariable.VariableTableId != newVariable.VariableTableId)
changedProperties.Add(VariablePropertyType.VariableTableId);
if (oldVariable.DataValue != newVariable.DataValue)
changedProperties.Add(VariablePropertyType.Value);
if (oldVariable.IsActive != newVariable.IsActive)
changedProperties.Add(VariablePropertyType.IsActive);
if (oldVariable.OpcUaNodeId != newVariable.OpcUaNodeId)
changedProperties.Add(VariablePropertyType.OpcUaNodeId);
if (oldVariable.PollingInterval != newVariable.PollingInterval)
changedProperties.Add(VariablePropertyType.PollingInterval);
if (oldVariable.SignalType != newVariable.SignalType)
changedProperties.Add(VariablePropertyType.SignalType);
if (oldVariable.Protocol != newVariable.Protocol)
changedProperties.Add(VariablePropertyType.Protocol);
return changedProperties;
}
/// <summary>
/// 更新内存中的变量
/// </summary>
/// <param name="oldVariable">内存中的变量</param>
/// <param name="newVariable">更新后的变量</param>
private void UpdateVariableInMemory(VariableDto oldVariable, VariableDto newVariable)
{
oldVariable.Name = newVariable.Name;
oldVariable.S7Address = newVariable.S7Address;
oldVariable.DataType = newVariable.DataType;
oldVariable.ConversionFormula = newVariable.ConversionFormula;
oldVariable.OpcUaUpdateType = newVariable.OpcUaUpdateType;
oldVariable.MqttAliases = newVariable.MqttAliases;
oldVariable.Description = newVariable.Description;
oldVariable.VariableTableId = newVariable.VariableTableId;
oldVariable.DataValue = newVariable.DataValue;
oldVariable.UpdatedAt = newVariable.UpdatedAt;
oldVariable.IsActive = newVariable.IsActive;
oldVariable.OpcUaNodeId = newVariable.OpcUaNodeId;
oldVariable.PollingInterval = newVariable.PollingInterval;
oldVariable.SignalType = newVariable.SignalType;
oldVariable.Protocol = newVariable.Protocol;
}
/// <summary>
/// 异步批量删除变量。
/// </summary>
@@ -214,7 +328,7 @@ public class VariableManagementService : IVariableManagementService
}
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Deleted, variableDto, variableTableDto));
this, new VariableChangedEventArgs(ActionChangeType.Deleted, variableDto));
}
}
}