refactor:完成重构设备的添加,删除,更新。

This commit is contained in:
2025-10-22 14:06:16 +08:00
parent e995ec7207
commit 54d040b45f
76 changed files with 1028 additions and 1161 deletions

View File

@@ -31,7 +31,7 @@ namespace DMS.Infrastructure.Repositories
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(AlarmHistory entity)
{
return await base.DeleteAsync(new List<AlarmHistory> { entity });
return await base.DeleteAsync( entity);
}
/// <summary>

View File

@@ -83,6 +83,16 @@ public abstract class BaseRepository<TEntity>
_logger.LogInformation($"DeleteAsync Batch {typeof(TEntity).Name}, Count: {entities.Count}, 耗时:{stopwatch.ElapsedMilliseconds}ms");
return result;
}
/// <summary>
/// 异步批量删除实体。
/// </summary>
/// <param name="entities">要删除的实体列表。</param>
/// <returns>返回受影响的行数。</returns>
public virtual async Task<int> DeleteAsync(TEntity entity)
{
return await _dbContext.GetInstance().Deleteable(entity)
.ExecuteCommandAsync(); ;
}
/// <summary>
@@ -171,18 +181,12 @@ public abstract class BaseRepository<TEntity>
public async Task<List<TEntity>> AddAsync(List<TEntity> entities)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
var retrunEntities = new List<TEntity>();
foreach (var entity in entities)
{
var result = await _dbContext.GetInstance().Insertable(entity).ExecuteReturnEntityAsync();
retrunEntities.Add(result);
}
stopwatch.Stop();
_logger.LogInformation($"AddBatchAsync {typeof(TEntity).Name}耗时:{stopwatch.ElapsedMilliseconds}ms");
return retrunEntities;
}

View File

@@ -73,7 +73,7 @@ public class DeviceRepository : BaseRepository<DbDevice>, IDeviceRepository
/// </summary>
/// <param name="model">要删除的设备实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(Device model) => await base.DeleteAsync(new List<DbDevice> { _mapper.Map<DbDevice>(model) });
public async Task<int> DeleteAsync(Device model) => await base.DeleteAsync(_mapper.Map<DbDevice>(model));
public async Task<List<Device>> AddAsync(List<Device> entities)

View File

@@ -29,20 +29,6 @@ public class MenuRepository : BaseRepository<DbMenu>, IMenuRepository
_mapper = mapper;
}
/// <summary>
/// 异步获取所有菜单树结构。
/// </summary>
/// <returns>包含所有菜单树结构的列表。</returns>
public async Task<List<MenuBean>> GetMenuTreesAsync()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
var dbMenuTree = await _dbContext.GetInstance().Queryable<DbMenu>()
.ToTreeAsync(dm => dm.Childrens, dm => dm.ParentId, 0);
stopwatch.Stop();
_logger.LogInformation($"获取菜单树耗时:{stopwatch.ElapsedMilliseconds}ms");
return _mapper.Map<List<MenuBean>>(dbMenuTree);
}
/// <summary>
/// 异步根据ID获取单个菜单。
@@ -88,64 +74,21 @@ public class MenuRepository : BaseRepository<DbMenu>, IMenuRepository
/// </summary>
/// <param name="entity">要删除的菜单实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(MenuBean entity) => await base.DeleteAsync(new List<DbMenu> { _mapper.Map<DbMenu>(entity) });
/// <summary>
/// 异步根据菜单ID删除菜单树包括子菜单
/// </summary>
/// <param name="id">要删除菜单树的根菜单ID。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteMenuTreeByIdAsync(int id)
public async Task<int> DeleteAsync(MenuBean entity)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
int delConut = 0;
var childList = await _dbContext.GetInstance().Queryable<DbMenu>()
.ToChildListAsync(c => c.ParentId, id);
delConut = await _dbContext.GetInstance().Deleteable<DbMenu>(childList)
.ExecuteCommandAsync();
delConut += await _dbContext.GetInstance().Deleteable<DbMenu>()
.Where(m => m.Id == id)
.ExecuteCommandAsync();
stopwatch.Stop();
_logger.LogInformation($"Delete {typeof(DbMenu)},ID={id},耗时:{stopwatch.ElapsedMilliseconds}ms");
return delConut;
var menuToDeleteList =new List<MenuBean>();
foreach (var item in entity.Children)
{
menuToDeleteList.Add(item);
foreach (var menu in item.Children)
{
menuToDeleteList.Add(menu);
}
}
menuToDeleteList.Add(entity);
return await base.DeleteAsync( _mapper.Map<List<DbMenu>>(menuToDeleteList) );
}
/// <summary>
/// 异步根据菜单类型和目标ID删除菜单树。
/// </summary>
/// <param name="menuType">菜单类型。</param>
/// <param name="targetId">目标ID。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteMenuTreeByTargetIdAsync(MenuType menuType, int targetId)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
var menu = await _dbContext.GetInstance().Queryable<DbMenu>().FirstAsync(m => m.MenuType == menuType && m.TargetId == targetId);
if (menu == null) return 0;
var childList = await _dbContext.GetInstance().Queryable<DbMenu>()
.ToChildListAsync(c => c.ParentId, menu.Id);
var delConut = await _dbContext.GetInstance().Deleteable<DbMenu>(childList)
.ExecuteCommandAsync();
stopwatch.Stop();
_logger.LogInformation($"Delete {typeof(DbMenu)},TargetId={targetId},耗时:{stopwatch.ElapsedMilliseconds}ms");
return delConut;
}
/// <summary>
/// 异步根据菜单类型和目标ID获取菜单。
/// </summary>
/// <param name="menuType">菜单类型。</param>
/// <param name="targetId">目标ID。</param>
/// <returns>对应的菜单实体如果不存在则为null。</returns>
public async Task<MenuBean> GetMenuByTargetIdAsync(MenuType menuType, int targetId)
{
var dbMenu = await _dbContext.GetInstance().Queryable<DbMenu>().FirstAsync(m => m.MenuType == menuType && m.TargetId == targetId);
return _mapper.Map<MenuBean>(dbMenu);
}
public async Task<List<MenuBean>> AddAsync(List<MenuBean> entities)
@@ -165,7 +108,7 @@ public class MenuRepository : BaseRepository<DbMenu>, IMenuRepository
var dbEntities = _mapper.Map<List<DbMenu>>(entities);
return await base.UpdateAsync(dbEntities);
}
/// <summary>
/// 异步根据实体列表批量删除菜单。
@@ -174,6 +117,8 @@ public class MenuRepository : BaseRepository<DbMenu>, IMenuRepository
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(List<MenuBean> entities)
{
var deleteList = entities.SelectMany(c => c.Children).ToList();
deleteList.AddRange(entities);
var dbEntities = _mapper.Map<List<DbMenu>>(entities);
return await base.DeleteAsync(dbEntities);
}

View File

@@ -75,7 +75,7 @@ public class MqttAliasRepository : BaseRepository<DbMqttAlias>, IMqttAliasReposi
/// </summary>
/// <param name="entity">要删除的变量与MQTT别名关联实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(MqttAlias entity) => await base.DeleteAsync(new List<DbMqttAlias> { _mapper.Map<DbMqttAlias>(entity) });
public async Task<int> DeleteAsync(MqttAlias entity) => await base.DeleteAsync(_mapper.Map<DbMqttAlias>(entity));

View File

@@ -72,7 +72,7 @@ public class MqttServerRepository : BaseRepository<DbMqttServer>, IMqttServerRep
/// </summary>
/// <param name="entity">要删除的MQTT服务器实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(MqttServer entity) => await base.DeleteAsync(new List<DbMqttServer> { _mapper.Map<DbMqttServer>(entity) });
public async Task<int> DeleteAsync(MqttServer entity) => await base.DeleteAsync(_mapper.Map<DbMqttServer>(entity));

View File

@@ -97,7 +97,7 @@ public class NlogRepository : BaseRepository<DbNlog>, INlogRepository
public new async Task<int> DeleteAsync(Core.Models.Nlog entity)
{
var dbEntity = _mapper.Map<DbNlog>(entity);
return await base.DeleteAsync(new List<DbNlog> { dbEntity });
return await base.DeleteAsync(dbEntity);
}

View File

@@ -82,7 +82,7 @@ namespace DMS.Infrastructure.Repositories
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(Trigger entity)
{
return await base.DeleteAsync(new List<DbTrigger> { _mapper.Map<DbTrigger>(entity) });
return await base.DeleteAsync(_mapper.Map<DbTrigger>(entity));
}

View File

@@ -75,7 +75,7 @@ public class TriggerVariableRepository : BaseRepository<DbTriggerVariable>, ITri
/// </summary>
/// <param name="entity">要删除的触发器与变量关联实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(TriggerVariable entity) => await base.DeleteAsync(new List<DbTriggerVariable> { _mapper.Map<DbTriggerVariable>(entity) });
public async Task<int> DeleteAsync(TriggerVariable entity) => await base.DeleteAsync(_mapper.Map<DbTriggerVariable>(entity));

View File

@@ -75,7 +75,7 @@ public class UserRepository : BaseRepository<DbUser>, IUserRepository
/// </summary>
/// <param name="entity">要删除的用户实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(User entity) => await base.DeleteAsync(new List<DbUser> { _mapper.Map<DbUser>(entity) });
public async Task<int> DeleteAsync(User entity) => await base.DeleteAsync(_mapper.Map<DbUser>(entity));
public async Task<int> UpdateAsync(List<User> entities)
{

View File

@@ -74,7 +74,7 @@ public class VariableHistoryRepository : BaseRepository<DbVariableHistory>, IVar
/// </summary>
/// <param name="entity">要删除的变量历史实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(VariableHistory entity) => await base.DeleteAsync(new List<DbVariableHistory> { _mapper.Map<DbVariableHistory>(entity) });
public async Task<int> DeleteAsync(VariableHistory entity) => await base.DeleteAsync(_mapper.Map<DbVariableHistory>(entity));
public async Task<int> UpdateAsync(List<VariableHistory> entities)
{

View File

@@ -73,7 +73,7 @@ public class VariableRepository : BaseRepository<DbVariable>, IVariableRepositor
/// </summary>
/// <param name="entity">要删除的变量实体。</param>
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(Variable entity) => await base.DeleteAsync(new List<DbVariable> { _mapper.Map<DbVariable>(entity) });
public async Task<int> DeleteAsync(Variable entity) => await base.DeleteAsync(_mapper.Map<DbVariable>(entity));
/// <summary>

View File

@@ -93,13 +93,12 @@ public class VariableTableRepository : BaseRepository<DbVariableTable>, IVariabl
public async Task<int> DeleteAsync(VariableTable entity)
{
//删除变量表中的所有变量
await _variableRepository.DeleteByVariableTableIdAsync(entity.Id);
await _variableRepository.DeleteAsync(entity.Variables);
//删除变量表
return await base.DeleteAsync(new List<DbVariableTable> { _mapper.Map<DbVariableTable>(entity) });
return await base.DeleteAsync( _mapper.Map<DbVariableTable>(entity));
}
public async Task<List<VariableTable>> AddAsync(List<VariableTable> entities)
{
var dbEntities = _mapper.Map<List<DbVariableTable>>(entities);
@@ -127,6 +126,18 @@ public class VariableTableRepository : BaseRepository<DbVariableTable>, IVariabl
/// <returns>受影响的行数。</returns>
public async Task<int> DeleteAsync(List<VariableTable> entities)
{
//删除所有变量
List<Variable> deleteVariableList = new List<Variable>();
foreach (var table in entities)
{
foreach (var variable in table.Variables)
{
deleteVariableList.Add(variable);
}
}
await _variableRepository.DeleteAsync(deleteVariableList);
var dbEntities = _mapper.Map<List<DbVariableTable>>(entities);
return await base.DeleteAsync(dbEntities);
}

View File

@@ -17,7 +17,7 @@ namespace DMS.Infrastructure.Services.Mqtt
private readonly ILogger<MqttBackgroundService> _logger;
private readonly IMqttServiceManager _mqttServiceManager;
private readonly IEventService _eventService;
private readonly IAppStorageService _appStorageService;
private readonly IAppDataService _appDataService;
private readonly IAppCenterService _appCenterService;
private readonly ConcurrentDictionary<int, MqttServer> _mqttServers;
private readonly SemaphoreSlim _reloadSemaphore = new(0);
@@ -26,13 +26,13 @@ namespace DMS.Infrastructure.Services.Mqtt
ILogger<MqttBackgroundService> logger,
IMqttServiceManager mqttServiceManager,
IEventService eventService,
IAppStorageService appStorageService,
IAppDataService appStorageService,
IAppCenterService appCenterService)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_mqttServiceManager = mqttServiceManager ?? throw new ArgumentNullException(nameof(mqttServiceManager));
_eventService = eventService;
_appStorageService = appStorageService;
_appDataService = appStorageService;
_appCenterService = appCenterService ?? throw new ArgumentNullException(nameof(appCenterService));
_mqttServers = new ConcurrentDictionary<int, MqttServer>();
@@ -186,7 +186,7 @@ namespace DMS.Infrastructure.Services.Mqtt
_mqttServers.Clear();
// 从数据服务中心获取所有激活的MQTT服务器
var mqttServers = _appStorageService.MqttServers.Values.ToList();
var mqttServers = _appDataService.MqttServers.Values.ToList();
foreach (var mqttServer in mqttServers)
{

View File

@@ -15,7 +15,7 @@ namespace DMS.Infrastructure.Services.OpcUa
public class OptimizedOpcUaBackgroundService : BackgroundService
{
private readonly IAppCenterService _appCenterService;
private readonly IAppStorageService _appStorageService;
private readonly IAppDataService _appDataService;
private readonly IEventService _eventService;
private readonly IOpcUaServiceManager _opcUaServiceManager;
private readonly ILogger<OptimizedOpcUaBackgroundService> _logger;
@@ -23,13 +23,13 @@ namespace DMS.Infrastructure.Services.OpcUa
public OptimizedOpcUaBackgroundService(
IAppCenterService appCenterService,
IAppStorageService appStorageService,
IAppDataService appStorageService,
IEventService eventService,
IOpcUaServiceManager opcUaServiceManager,
ILogger<OptimizedOpcUaBackgroundService> logger)
{
_appCenterService = appCenterService ?? throw new ArgumentNullException(nameof(appCenterService));
_appStorageService = appStorageService;
_appDataService = appStorageService;
_opcUaServiceManager = opcUaServiceManager ?? throw new ArgumentNullException(nameof(opcUaServiceManager));
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_eventService = eventService;
@@ -60,7 +60,7 @@ namespace DMS.Infrastructure.Services.OpcUa
if (stoppingToken.IsCancellationRequested)
break;
if (_appStorageService.Devices.IsEmpty)
if (_appDataService.Devices.IsEmpty)
{
_logger.LogInformation("没有可用的OPC UA设备等待设备列表更新...");
continue;
@@ -96,7 +96,7 @@ namespace DMS.Infrastructure.Services.OpcUa
try
{
// 获取所有活动的OPC UA设备
var opcUaDevices = _appStorageService.Devices.Values
var opcUaDevices = _appDataService.Devices.Values
.Where(d => d.Protocol == ProtocolType.OpcUa )
.ToList();

View File

@@ -20,7 +20,7 @@ namespace DMS.Infrastructure.Services.S7;
public class OptimizedS7BackgroundService : BackgroundService
{
private readonly IAppCenterService _appCenterService;
private readonly IAppStorageService _appStorageService;
private readonly IAppDataService _appDataService;
private readonly IEventService _eventService;
private readonly IDataProcessingService _dataProcessingService;
private readonly IS7ServiceManager _s7ServiceManager;
@@ -39,14 +39,14 @@ public class OptimizedS7BackgroundService : BackgroundService
/// </summary>
public OptimizedS7BackgroundService(
IAppCenterService appCenterService,
IAppStorageService appStorageService,
IAppDataService appStorageService,
IEventService eventService,
IDataProcessingService dataProcessingService,
IS7ServiceManager s7ServiceManager,
ILogger<OptimizedS7BackgroundService> logger)
{
_appCenterService = appCenterService;
_appStorageService = appStorageService;
_appDataService = appStorageService;
_eventService = eventService;
_dataProcessingService = dataProcessingService;
_s7ServiceManager = s7ServiceManager;
@@ -76,7 +76,7 @@ public class OptimizedS7BackgroundService : BackgroundService
break;
}
if (_appStorageService.Devices.IsEmpty)
if (_appDataService.Devices.IsEmpty)
{
_logger.LogInformation("没有可用的S7设备等待设备列表更新...");
continue;
@@ -124,7 +124,7 @@ public class OptimizedS7BackgroundService : BackgroundService
_variablesByPollingInterval.Clear();
_logger.LogInformation("开始加载S7变量....");
var s7Devices = _appStorageService
var s7Devices = _appDataService
.Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true)
.ToList();
@@ -161,7 +161,7 @@ public class OptimizedS7BackgroundService : BackgroundService
/// </summary>
private async Task ConnectS7ServiceAsync(CancellationToken stoppingToken)
{
var s7Devices = _appStorageService
var s7Devices = _appDataService
.Devices.Values.Where(d => d.Protocol == ProtocolType.S7 && d.IsActive == true)
.ToList();
@@ -207,7 +207,7 @@ public class OptimizedS7BackgroundService : BackgroundService
private async Task PollVariablesForDeviceAsync(S7DeviceContext context, List<Variable> variables,
CancellationToken stoppingToken)
{
if (!_appStorageService.Devices.TryGetValue(context.Device.Id, out var device))
if (!_appDataService.Devices.TryGetValue(context.Device.Id, out var device))
{
_logger.LogWarning($"轮询时没有找到设备ID{context.Device.Id}");
return;

View File

@@ -20,7 +20,7 @@ namespace DMS.Infrastructure.Services.S7
private readonly IEventService _eventService;
private readonly IDataProcessingService _dataProcessingService;
private readonly IAppCenterService _appCenterService;
private readonly IAppStorageService _appStorageService;
private readonly IAppDataService _appDataService;
private readonly IS7ServiceFactory _s7ServiceFactory;
private readonly ConcurrentDictionary<int, S7DeviceContext> _deviceContexts;
private readonly SemaphoreSlim _semaphore;
@@ -31,7 +31,7 @@ namespace DMS.Infrastructure.Services.S7
IEventService eventService,
IDataProcessingService dataProcessingService,
IAppCenterService appCenterService,
IAppStorageService appStorageService,
IAppDataService appStorageService,
IS7ServiceFactory s7ServiceFactory)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
@@ -40,7 +40,7 @@ namespace DMS.Infrastructure.Services.S7
= dataProcessingService ?? throw new ArgumentNullException(nameof(dataProcessingService));
_appCenterService
= appCenterService ?? throw new ArgumentNullException(nameof(appCenterService));
_appStorageService = appStorageService;
_appDataService = appStorageService;
_s7ServiceFactory = s7ServiceFactory ?? throw new ArgumentNullException(nameof(s7ServiceFactory));
_deviceContexts = new ConcurrentDictionary<int, S7DeviceContext>();
_semaphore = new SemaphoreSlim(10, 10); // 默认最大并发连接数为10
@@ -54,7 +54,7 @@ namespace DMS.Infrastructure.Services.S7
// if (_deviceContexts.TryGetValue(e.DeviceId, out var s7DeviceContext))
// {
// var variables = _appStorageService.Variables.Values.Where(v => e.VariableIds.Contains(v.Id))
// var variables = _appDataService.Variables.Values.Where(v => e.VariableIds.Contains(v.Id))
// .ToList();
// foreach (var variable in variables)
// {