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

View File

@@ -71,7 +71,7 @@ public class VariableManagementService : IVariableManagementService
if (_appDataStorageService.Variables.TryAdd(result.Id, result)) if (_appDataStorageService.Variables.TryAdd(result.Id, result))
{ {
_eventService.RaiseVariableChanged( _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) if (result > 0 && variableDto != null)
{ {
VariableTableDto variableTableDto = null; if (_appDataStorageService.Variables.TryGetValue(variableDto.Id, out var mVariableDto))
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable))
{ {
variableTableDto = variableTable; // 比较旧值和新值,确定哪个属性发生了变化
var changedProperties = GetChangedProperties(mVariableDto, variableDto);
// 更新内存中的变量
UpdateVariableInMemory(mVariableDto, variableDto);
// 为每个发生变化的属性触发事件
foreach (var property in changedProperties)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, property));
} }
_appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto); // 如果没有任何属性发生变化,至少触发一次更新事件
if (changedProperties.Count == 0)
{
_eventService.RaiseVariableChanged( _eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto)); 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; return result;
@@ -114,20 +134,35 @@ public class VariableManagementService : IVariableManagementService
{ {
foreach (var variableDto in variableDtos) foreach (var variableDto in variableDtos)
{ {
VariableTableDto variableTableDto = null;
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable))
{
variableTableDto = variableTable;
}
if (_appDataStorageService.Variables.TryGetValue(variableDto.Id, out var mVariableDto)) if (_appDataStorageService.Variables.TryGetValue(variableDto.Id, out var mVariableDto))
{ {
_mapper.Map(variableDto, mVariableDto); // 比较旧值和新值,确定哪个属性发生了变化
var changedProperties = GetChangedProperties(mVariableDto, variableDto);
// 更新内存中的变量
UpdateVariableInMemory(mVariableDto, variableDto);
// 为每个发生变化的属性触发事件
foreach (var property in changedProperties)
{
_eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(ActionChangeType.Updated, variableDto, property));
} }
// _appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto); // 如果没有任何属性发生变化,至少触发一次更新事件
if (changedProperties.Count == 0)
{
_eventService.RaiseVariableChanged( _eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto)); 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));
}
} }
} }
@@ -155,7 +190,7 @@ public class VariableManagementService : IVariableManagementService
} }
_eventService.RaiseVariableChanged( _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); 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>
/// 异步批量删除变量。 /// 异步批量删除变量。
/// </summary> /// </summary>
@@ -214,7 +328,7 @@ public class VariableManagementService : IVariableManagementService
} }
_eventService.RaiseVariableChanged( _eventService.RaiseVariableChanged(
this, new VariableChangedEventArgs(DataChangeType.Deleted, variableDto, variableTableDto)); this, new VariableChangedEventArgs(ActionChangeType.Deleted, variableDto));
} }
} }
} }

View File

@@ -0,0 +1,33 @@
namespace DMS.Core.Enums
{
/// <summary>
/// 操作变更类型枚举
/// </summary>
public enum ActionChangeType
{
/// <summary>
/// 添加
/// </summary>
Added,
/// <summary>
/// 更新
/// </summary>
Updated,
/// <summary>
/// 删除
/// </summary>
Deleted,
/// <summary>
/// 加载
/// </summary>
Loaded,
/// <summary>
/// 批量操作
/// </summary>
BatchOperation
}
}

View File

@@ -0,0 +1,118 @@
namespace DMS.Core.Enums
{
/// <summary>
/// 变量属性类型枚举
/// </summary>
public enum VariablePropertyType
{
/// <summary>
/// 名称
/// </summary>
Name,
/// <summary>
/// 地址
/// </summary>
Address,
/// <summary>
/// 数据类型
/// </summary>
DataType,
/// <summary>
/// 转换公式
/// </summary>
ConversionFormula,
/// <summary>
/// OPC UA 更新类型
/// </summary>
OpcUaUpdateType,
/// <summary>
/// MQTT 别名
/// </summary>
MqttAlias,
/// <summary>
/// 描述
/// </summary>
Description,
/// <summary>
/// 单位
/// </summary>
Unit,
/// <summary>
/// 最小值
/// </summary>
MinValue,
/// <summary>
/// 最大值
/// </summary>
MaxValue,
/// <summary>
/// 默认值
/// </summary>
DefaultValue,
/// <summary>
/// 是否激活
/// </summary>
IsActive,
/// <summary>
/// 访问类型
/// </summary>
AccessType,
/// <summary>
/// 读写类型
/// </summary>
ReadWriteType,
/// <summary>
/// 变量表ID
/// </summary>
VariableTableId,
/// <summary>
/// 值
/// </summary>
Value,
/// <summary>
/// S7地址
/// </summary>
S7Address,
/// <summary>
/// OPC UA节点ID
/// </summary>
OpcUaNodeId,
/// <summary>
/// 轮询间隔
/// </summary>
PollingInterval,
/// <summary>
/// 信号类型
/// </summary>
SignalType,
/// <summary>
/// 协议类型
/// </summary>
Protocol,
/// <summary>
/// 所有属性
/// </summary>
All
}
}