Files
DMS/DMS.Application/Services/Database/VariableTableAppService.cs

146 lines
6.0 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using AutoMapper;
using DMS.Application.DTOs;
using DMS.Application.Interfaces;
using DMS.Application.Interfaces.Database;
using DMS.Core.Enums;
using DMS.Core.Interfaces;
using DMS.Core.Models;
namespace DMS.Application.Services.Database
{
/// <summary>
/// 变量表应用服务,负责处理变量表相关的业务逻辑。
/// 实现 <see cref="IVariableTableAppService"/> 接口。
/// </summary>
public class VariableTableAppService : IVariableTableAppService
{
private readonly IRepositoryManager _repositoryManager;
private readonly IAppDataService _appDataService;
private readonly IMapper _mapper;
/// <summary>
/// 构造函数注入仓储管理器和AutoMapper。
/// </summary>
/// <param name="repositoryManager">仓储管理器实例。</param>
/// <param name="mapper">AutoMapper 实例。</param>
public VariableTableAppService(IRepositoryManager repositoryManager, IAppDataService appDataService, IMapper mapper)
{
_repositoryManager = repositoryManager;
_appDataService = appDataService;
_mapper = mapper;
}
/// <summary>
/// 异步根据ID获取变量表。
/// </summary>
/// <param name="id">变量表ID。</param>
/// <returns>变量表数据传输对象。</returns>
public async Task<VariableTable> GetVariableTableByIdAsync(int id)
{
var variableTable = await _repositoryManager.VariableTables.GetByIdAsync(id);
return _mapper.Map<VariableTable>(variableTable);
}
/// <summary>
/// 异步获取所有变量表。
/// </summary>
/// <returns>变量表数据传输对象列表。</returns>
public async Task<List<VariableTable>> GetAllVariableTablesAsync()
{
var variableTables = await _repositoryManager.VariableTables.GetAllAsync();
return _mapper.Map<List<VariableTable>>(variableTables);
}
/// <summary>
/// 异步创建变量表,并可选择性地创建关联菜单。
/// </summary>
/// <param name="createDto">包含变量表和菜单信息的创建数据传输对象。</param>
/// <returns>创建后的变量表数据传输对象。</returns>
/// <exception cref="ApplicationException">如果添加变量表失败或找不到设备菜单。</exception>
public async Task<CreateVariableTableWithMenuDto> AddAsync(CreateVariableTableWithMenuDto createDto)
{
await _repositoryManager.BeginTranAsync();
try
{
createDto.VariableTable = await _repositoryManager.VariableTables.AddAsync(createDto.VariableTable);
if (createDto.VariableTable.Id == 0)
{
throw new ApplicationException($"添加变量表失败设备ID:{createDto.VariableTable.DeviceId},请检查。");
}
if (createDto.Menu is not null)
{
createDto.Menu.TargetId = createDto.VariableTable.Id;
//映射菜单实体并设置关联信息
createDto.Menu = await _repositoryManager.Menus.AddAsync(createDto.Menu);
}
await _repositoryManager.CommitAsync();
return createDto;
}
catch
{
await _repositoryManager.RollbackAsync();
throw;
}
}
/// <summary>
/// 异步更新变量表。
/// </summary>
/// <param name="variableTable">要更新的变量表数据传输对象。</param>
/// <returns>受影响的行数。</returns>
/// <exception cref="ApplicationException">如果找不到变量表。</exception>
public async Task<int> UpdateAsync(VariableTable variableTable)
{
int res = await _repositoryManager.VariableTables.UpdateAsync(variableTable);
// 更新关联的菜单树
var menu = _appDataService.Menus.Values.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id);
if (menu is not null && variableTable.Name!= menu.Header)
{
menu.Header = variableTable.Name;
// 更新关联的菜单树
await _repositoryManager.Menus.UpdateAsync(menu);
}
return res;
}
/// <summary>
/// 异步根据ID删除变量表包括其关联的变量、MQTT别名和菜单事务性操作
/// </summary>
/// <param name="id">要删除的变量表ID。</param>
/// <returns>如果删除成功则为 true否则为 false。</returns>
/// <exception cref="InvalidOperationException">如果删除变量表失败。</exception>
/// <exception cref="ApplicationException">如果删除变量表时发生其他错误。</exception>
public async Task<bool> DeleteAsync(VariableTable variableTable)
{
try
{
await _repositoryManager.BeginTranAsync();
var delRes = await _repositoryManager.VariableTables.DeleteAsync(variableTable);
// 删除关联的菜单树
var menu = _appDataService.Menus.Values.FirstOrDefault(m => m.MenuType == MenuType.VariableTableMenu && m.TargetId == variableTable.Id);
if (menu is not null)
{
// 删除关联的菜单树
await _repositoryManager.Menus.DeleteAsync(menu);
}
await _repositoryManager.CommitAsync();
return true;
}
catch (Exception ex)
{
await _repositoryManager.RollbackAsync();
// 可以在此记录日志
throw new ApplicationException($"删除变量表时发生错误,操作已回滚,错误信息:{ex.Message}", ex);
}
}
}
}