using System.Diagnostics; using AutoMapper; using DMS.Core.Interfaces.Repositories; using DMS.Core.Models; using DMS.Infrastructure.Data; using DMS.Infrastructure.Entities; using Microsoft.Extensions.Logging; namespace DMS.Infrastructure.Repositories; /// /// 变量仓储实现类,负责变量数据的持久化操作。 /// 继承自 并实现 接口。 /// public class VariableRepository : BaseRepository, IVariableRepository { private readonly IMapper _mapper; /// /// 构造函数,注入 AutoMapper 和 SqlSugarDbContext。 /// /// AutoMapper 实例,用于实体模型和数据库模型之间的映射。 /// SqlSugar 数据库上下文,用于数据库操作。 /// 日志记录器实例。 public VariableRepository(IMapper mapper, SqlSugarDbContext dbContext, ILogger logger) : base(dbContext, logger) { _mapper = mapper; } /// /// 异步根据ID获取单个变量。 /// /// 变量的唯一标识符。 /// 对应的变量实体,如果不存在则为null。 public async Task GetByIdAsync(int id) { var dbVariable = await base.GetByIdAsync(id); return _mapper.Map(dbVariable); } /// /// 异步获取所有变量。 /// /// 包含所有变量实体的列表。 public async Task> GetAllAsync() { var dbList = await base.GetAllAsync(); return _mapper.Map>(dbList); } /// /// 异步添加新变量。 /// /// 要添加的变量实体。 /// 添加成功后的变量实体(包含数据库生成的ID等信息)。 public async Task AddAsync(Variable entity) { var dbVariable = await base.AddAsync(_mapper.Map(entity)); return _mapper.Map(dbVariable, entity); } /// /// 异步更新现有变量。 /// /// 要更新的变量实体。 /// 受影响的行数。 public async Task UpdateAsync(Variable entity) => await base.UpdateAsync(_mapper.Map(entity)); /// /// 异步删除变量。 /// /// 要删除的变量实体。 /// 受影响的行数。 public async Task DeleteAsync(Variable entity) => await base.DeleteAsync(new List { _mapper.Map(entity) }); /// /// 异步根据变量表ID删除变量。 /// /// 变量表的唯一标识符。 /// 受影响的行数。 public async Task DeleteByVariableTableIdAsync(int variableTableId) { var stopwatch = new Stopwatch(); stopwatch.Start(); var result = await _dbContext.GetInstance().Deleteable() .Where(v => v.VariableTableId == variableTableId) .ExecuteCommandAsync(); stopwatch.Stop(); _logger.LogInformation($"Delete {typeof(DbVariable)} by VariableTableId={variableTableId}, Count={result}, 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } public async Task> AddBatchAsync(List entities) { var dbEntities = _mapper.Map>(entities); var addedEntities = await base.AddBatchAsync(dbEntities); return _mapper.Map>(addedEntities); } /// /// 异步根据OPC UA NodeId获取单个变量实体。 /// /// OPC UA NodeId。 /// 找到的变量实体,如果不存在则返回null。 public async Task GetByOpcUaNodeIdAsync(string opcUaNodeId) { var dbVariable = await _dbContext.GetInstance().Queryable() .Where(v => v.OpcUaNodeId == opcUaNodeId) .FirstAsync(); return dbVariable == null ? null : _mapper.Map(dbVariable); } /// /// 异步根据OPC UA NodeId列表获取变量实体列表。 /// /// OPC UA NodeId列表。 /// 找到的变量实体列表。 public async Task> GetByOpcUaNodeIdsAsync(List opcUaNodeIds) { var dbVariables = await _dbContext.GetInstance().Queryable() .Where(v => opcUaNodeIds.Contains(v.OpcUaNodeId)) .ToListAsync(); return _mapper.Map>(dbVariables); } /// /// 异步批量更新变量。 /// /// 要更新的变量实体集合。 /// 受影响的行数。 public async Task UpdateBatchAsync(IEnumerable variables) { var stopwatch = new Stopwatch(); stopwatch.Start(); var dbVariables = _mapper.Map>(variables); var result = await _dbContext.GetInstance().Updateable(dbVariables).ExecuteCommandAsync(); stopwatch.Stop(); _logger.LogInformation($"Batch update {typeof(DbVariable)}, Count={dbVariables.Count}, 耗时:{stopwatch.ElapsedMilliseconds}ms"); return result; } /// /// 异步根据实体列表批量删除变量。 /// /// 要删除的变量实体列表。 /// 受影响的行数。 public async Task DeleteAsync(List entities) { var dbEntities = _mapper.Map>(entities); return await base.DeleteAsync(dbEntities); } }