using FMDAL.DTO.AssetPool; using FMDAL.Query.AssetPool; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using System; using System.Collections.Generic; using System.Data.Common; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace FMDAL.CustomCode.AssetPool { public class AssetPoolDAL : IAssetPoolDAL { private readonly IQueryExecutor _qe; public AssetPoolDAL(IQueryExecutor qe) => _qe = qe; public async Task GetAssetPool(int assetPoolId, LoginDTO login, CancellationToken ct) { var poolDict = new Dictionary(); await _qe.QueryMultiMapAsync( login, AssetPoolQB.GET_ASSETPOOL, (parent, child) => { if (!poolDict.TryGetValue(parent.AssetPoolId, out var existingParent)) { existingParent = parent; existingParent.AssetPoolDetailArray = new List(); poolDict[parent.AssetPoolId] = existingParent; } if (child != null && child.AssetPoolDetailId != 0) { existingParent.AssetPoolDetailArray.Add(child); } return existingParent; }, new { AssetPoolId = assetPoolId, TenantId = login.ClientId }, splitOn: "AssetPoolDetailId" ).ConfigureAwait(false); return poolDict.Values.FirstOrDefault(); } public async Task> GetAssetPoolList(LoginDTO login, CancellationToken ct) { return await _qe.QueryAsync(login, AssetPoolQB.GET_ASSETPOOL_LIST, new { TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } public async Task> GetActiveAssetPoolDetails(int assetPoolId, LoginDTO login, CancellationToken ct) { return await _qe.QueryAsync(login, AssetPoolQB.GET_ACTIVE_ASSETPOOLDETAIL, new { AssetPoolId = assetPoolId }, cancellationToken: ct).ConfigureAwait(false); } public async Task SaveAssetPool(AssetPoolDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { await _qe.ExecuteAsync(login, AssetPoolQB.SAVE_ASSETPOOL, dto, tx, cancellationToken: ct).ConfigureAwait(false); } public async Task UpdateAssetPool(AssetPoolDTO dto, LoginDTO login, DbTransaction tx, CancellationToken ct) { await _qe.ExecuteAsync(login, AssetPoolQB.UPDATE_ASSETPOOL, dto, tx, cancellationToken: ct).ConfigureAwait(false); } public async Task DeleteAssetPool(int assetPoolId, int modifiedById, LoginDTO login, DbTransaction tx, CancellationToken ct) { await _qe.ExecuteAsync(login, AssetPoolQB.DELETE_ASSETPOOL, new { AssetPoolId = assetPoolId, ModifiedById = modifiedById, ModifiedOn = DateTime.UtcNow, TenantId = login.ClientId }, tx, cancellationToken: ct).ConfigureAwait(false); } public async Task SaveAssetPoolDetail(AssetPoolDetailDTO detail, LoginDTO login, DbTransaction tx, CancellationToken ct) { await _qe.ExecuteAsync(login, AssetPoolQB.SAVE_ASSETPOOLDETAIL, detail, tx, cancellationToken: ct).ConfigureAwait(false); } public async Task CloseAssetPoolDetail(int assetPoolDetailId, DateTime validTo, int modifiedById, LoginDTO login, DbTransaction tx, CancellationToken ct) { await _qe.ExecuteAsync(login, AssetPoolQB.CLOSE_ASSETPOOLDETAIL, new { AssetPoolDetailId = assetPoolDetailId, ValidTo = validTo, ModifiedById = modifiedById, ModifiedOn = validTo }, tx, cancellationToken: ct).ConfigureAwait(false); } } }