1. VariableChangedEventArgs 重构:
- 创建了 ActionChangeType 枚举(与 DataChangeType 相同)
- 创建了 VariablePropertyType 枚举标识变量属性类型
- 重构 VariableChangedEventArgs 类,移除 ChangeTime 和 VariableTable 属性
- 将 ChangeType 从 DataChangeType 改为 ActionChangeType
- 添加了 PropertyType 属性用于标识哪个属性发生变化
This commit is contained in:
@@ -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;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -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.Variables.TryGetValue(variableDto.Id, out var mVariableDto))
|
||||||
if (_appDataStorageService.VariableTables.TryGetValue(variableDto.VariableTableId, out var variableTable))
|
|
||||||
{
|
{
|
||||||
variableTableDto = variableTable;
|
// 比较旧值和新值,确定哪个属性发生了变化
|
||||||
}
|
var changedProperties = GetChangedProperties(mVariableDto, variableDto);
|
||||||
|
|
||||||
if (_appDataStorageService.Variables.TryGetValue(variableDto.Id,out var mVariableDto))
|
// 更新内存中的变量
|
||||||
|
UpdateVariableInMemory(mVariableDto, variableDto);
|
||||||
|
|
||||||
|
// 为每个发生变化的属性触发事件
|
||||||
|
foreach (var property in changedProperties)
|
||||||
{
|
{
|
||||||
_mapper.Map(variableDto, mVariableDto);
|
|
||||||
}
|
|
||||||
|
|
||||||
// _appDataStorageService.Variables.AddOrUpdate(variableDto.Id, variableDto, (key, oldValue) => variableDto);
|
|
||||||
_eventService.RaiseVariableChanged(
|
_eventService.RaiseVariableChanged(
|
||||||
this, new VariableChangedEventArgs(DataChangeType.Updated, variableDto, variableTableDto));
|
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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
33
DMS.Core/Enums/ActionChangeType.cs
Normal file
33
DMS.Core/Enums/ActionChangeType.cs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
118
DMS.Core/Enums/VariablePropertyType.cs
Normal file
118
DMS.Core/Enums/VariablePropertyType.cs
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user