using NetAdmin.Application.Repositories; using NetAdmin.Application.Services; using NetAdmin.Domain.Contexts; using NetAdmin.Domain.Dto.Dependency; using NetAdmin.Domain.Dto.Sys.Dic.Content; using NetAdmin.Domain.Dto.Sys.UserProfile; using NetAdmin.SysComponent.Application.Services.Sys.Dependency; namespace NetAdmin.SysComponent.Application.Services.Sys; /// public sealed class UserProfileService(BasicRepository rpo) // : RepositoryService(rpo), IUserProfileService { /// /// 构建应用配置 /// public static string BuildAppConfig(Dictionary roles) { try { return new string[][] { [ Chars.FLG_FRONT_APP_SET_HOME_GRID , new { content = roles.MaxBy(x => x.Key).Value.ToObject(), datetime = 0 }.ToJson() ] }.ToJson(); } catch { return "[]"; } } /// public async Task BulkDeleteAsync(BulkReq req) { req.ThrowIfInvalid(); var ret = 0; // ReSharper disable once LoopCanBeConvertedToQuery foreach (var item in req.Items) { ret += await DeleteAsync(item).ConfigureAwait(false); } return ret; } /// public Task CountAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .CountAsync(); } /// public async Task CreateAsync(CreateUserProfileReq req) { req.ThrowIfInvalid(); var entity = req.Adapt(); var ret = await Rpo.InsertAsync(entity).ConfigureAwait(false); return ret.Adapt(); } /// public Task DeleteAsync(DelReq req) { req.ThrowIfInvalid(); return Rpo.DeleteAsync(a => a.Id == req.Id); } /// public Task EditAsync(EditUserProfileReq req) { return UpdateAsync(req.Adapt(), null); } /// public Task ExistAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .AnyAsync(); } /// public Task ExportAsync(QueryReq req) { throw new NotImplementedException(); } /// public async Task GetAsync(QueryUserProfileReq req) { req.ThrowIfInvalid(); var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); return ret.Adapt(); } /// public async Task GetSessionUserAppConfigAsync() { var ret = await Rpo.Select.Where(a => a.Id == UserToken.Id).ToOneAsync().ConfigureAwait(false); return ret.Adapt(); } /// public async Task> PagedQueryAsync(PagedQueryReq req) { req.ThrowIfInvalid(); var list = await QueryInternal(req) .Page(req.Page, req.PageSize) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .Count(out var total) .ToListAsync((a, b, c, d, e) => new { a , b = new { b.Key, b.Value } , c = new { c.Key, c.Value } , d = new { d.Key, d.Value } , e = new { e.Key, e.Value } }) .ConfigureAwait(false); return new PagedQueryRsp(req.Page, req.PageSize, total , list.ConvertAll( x => x.a.Adapt() with { NationArea = x.b.Adapt() , CompanyArea = x.c.Adapt() , HomeArea = x.d.Adapt() , EmergencyContactArea = x.e.Adapt() })); } /// public async Task> QueryAsync(QueryReq req) { req.ThrowIfInvalid(); var ret = await QueryInternal(req) #if DBTYPE_SQLSERVER .WithLock(SqlServerLock.NoLock | SqlServerLock.NoWait) #endif .Take(req.Count) .ToListAsync((a, b, c, d, e) => new { a , b = new { b.Key, b.Value } , c = new { c.Key, c.Value } , d = new { d.Key, d.Value } , e = new { e.Key, e.Value } }) .ConfigureAwait(false); return ret.ConvertAll(x => x.a.Adapt() with { NationArea = x.b.Key == null ? null : x.b.Adapt() , CompanyArea = x.c.Key == null ? null : x.c.Adapt() , HomeArea = x.d.Key == null ? null : x.d.Adapt() , EmergencyContactArea = x.e.Key == null ? null : x.e.Adapt() }); } /// public Task SetSessionUserAppConfigAsync(SetSessionUserAppConfigReq req) { req.ThrowIfInvalid(); // 默认仪表版 if (req.AppConfig == "[]") { req.AppConfig = BuildAppConfig(App.GetService().Roles.ToDictionary(x => x.Id, x => x.DashboardLayout)); } return UpdateAsync(req, [nameof(req.AppConfig)], null, a => a.Id == UserToken.Id, null, true); } private ISelect QueryInternal(QueryReq req) { #pragma warning disable CA1305,IDE0072 var ret = Rpo.Orm.Select() .LeftJoin((a, b, _, __, ___) => a.NationArea.ToString() == b.Value && b.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA) .LeftJoin((a, _, c, __, ___) => a.CompanyArea.ToString() == c.Value && c.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA) .LeftJoin((a, _, __, d, ___) => a.HomeArea.ToString() == d.Value && d.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA) .LeftJoin((a, _, __, ___, e) => a.EmergencyContactArea.ToString() == e.Value && e.CatalogId == Numbers.ID_DIC_CATALOG_GEO_AREA) .WhereDynamicFilter(req.DynamicFilter); return req.Order switch { Orders.None => ret , Orders.Random => ret.OrderByRandom() , _ => ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending) .OrderByDescending((a, _, __, ___, ____) => a.Id) }; #pragma warning restore CA1305,IDE0072 } }