using NetAdmin.Domain.DbMaps.Sys; using NetAdmin.Domain.Dto.Sys.Dept; namespace NetAdmin.SysComponent.Application.Services.Sys; /// public sealed class DeptService(BasicRepository rpo) // : RepositoryService(rpo), IDeptService { /// 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).WithNoLockNoWait().CountAsync(); } /// /// Parent_department_does_not_exist public async Task CreateAsync(CreateDeptReq req) { req.ThrowIfInvalid(); if (req.ParentId != 0 && !await Rpo.Select.AnyAsync(a => a.Id == req.ParentId).ConfigureAwait(false)) { throw new NetAdminInvalidOperationException(Ln.父节点不存在); } var ret = await Rpo.InsertAsync(req).ConfigureAwait(false); return ret.Adapt(); } /// /// 该部门下存在用户 /// 该部门下存在子部门 public async Task DeleteAsync(DelReq req) { req.ThrowIfInvalid(); if (await Rpo.Orm.Select().AnyAsync(a => a.DeptId == req.Id).ConfigureAwait(false)) { throw new NetAdminInvalidOperationException(Ln.该部门下存在用户); } #pragma warning disable IDE0046 if (await Rpo.Select.AnyAsync(a => a.ParentId == req.Id).ConfigureAwait(false)) { #pragma warning restore IDE0046 throw new NetAdminInvalidOperationException(Ln.该部门下存在子部门); } return await Rpo.DeleteAsync(x => x.Id == req.Id).ConfigureAwait(false); } /// public async Task EditAsync(EditDeptReq req) { req.ThrowIfInvalid(); #if DBTYPE_SQLSERVER return (await UpdateReturnListAsync(req).ConfigureAwait(false)).FirstOrDefault()?.Adapt(); #else return await UpdateAsync(req, null).ConfigureAwait(false) > 0 ? await GetAsync(new QueryDeptReq { Id = req.Id }).ConfigureAwait(false) : null; #endif } /// public Task ExistAsync(QueryReq req) { req.ThrowIfInvalid(); return QueryInternal(req).WithNoLockNoWait().AnyAsync(); } /// public Task ExportAsync(QueryReq req) { req.ThrowIfInvalid(); return ExportAsync(QueryInternal, req, Ln.部门导出); } /// public async Task GetAsync(QueryDeptReq req) { req.ThrowIfInvalid(); var ret = await QueryInternal(new QueryReq { Filter = req, Order = Orders.None }).ToOneAsync().ConfigureAwait(false); return ret.Adapt(); } /// public Task> PagedQueryAsync(PagedQueryReq req) { req.ThrowIfInvalid(); throw new NotImplementedException(); } /// public async Task> QueryAsync(QueryReq req) { req.ThrowIfInvalid(); return (await QueryInternal(req).WithNoLockNoWait().ToTreeListAsync().ConfigureAwait(false)).Adapt>(); } /// public Task SetEnabledAsync(SetDeptEnabledReq req) { req.ThrowIfInvalid(); return UpdateAsync(req, [nameof(req.Enabled)]); } private ISelect QueryInternal(QueryReq req) { return QueryInternal(req, false); } private ISelect QueryInternal(QueryReq req, bool asTreeCte) { var ret = Rpo.Select.WhereDynamicFilter(req.DynamicFilter) .WhereDynamic(req.Filter) .WhereIf( // req.Keywords?.Length > 0 , a => a.Id == req.Keywords.Int64Try(0) || a.Name.Contains(req.Keywords) || a.Summary.Contains(req.Keywords)); if (asTreeCte) { ret = ret.AsTreeCte(); } // ReSharper disable once SwitchStatementMissingSomeEnumCasesNoDefault switch (req.Order) { case Orders.None: return ret; case Orders.Random: return ret.OrderByRandom(); } ret = ret.OrderByPropertyNameIf(req.Prop?.Length > 0, req.Prop, req.Order == Orders.Ascending); if (!req.Prop?.Equals(nameof(req.Filter.Sort), StringComparison.OrdinalIgnoreCase) ?? true) { ret = ret.OrderByDescending(a => a.Sort); } if (!req.Prop?.Equals(nameof(req.Filter.CreatedTime), StringComparison.OrdinalIgnoreCase) ?? true) { ret = ret.OrderByDescending(a => a.CreatedTime); } return ret; } }