From 8922cdf2bf292958f839c8bcbfdc7131af1b8deb Mon Sep 17 00:00:00 2001 From: sunpengfei <i@angelzzz.com> Date: 星期五, 05 九月 2025 14:51:40 +0800 Subject: [PATCH] feat:开发 --- FlexJobApi.Core/Utils/DbUtils/DbUtils.cs | 156 ++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 115 insertions(+), 41 deletions(-) diff --git a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs index 55647c2..e8e12e3 100644 --- a/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs +++ b/FlexJobApi.Core/Utils/DbUtils/DbUtils.cs @@ -148,12 +148,39 @@ var q = rep.AsQueryable().AsNoTracking(); if (query != null) q = query(q); else q = q.OrderBy(it => it.Sort).ThenBy(it => it.CreatedTime); - q = q.CustomOrderBy(page.OrderInput); + if (page.OrderInput.IsNotNull()) + q = q.CustomOrderBy(page.OrderInput); var s = selector == null ? q.ProjectToType<TItem>() : q.Select(selector); var pagedList = await s.ToPagedListAsync(page.Page, page.Rows, cancellationToken); var result = new PagedListQueryResult<TItem>(); + result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); + result.PageModel.TotalCount = pagedList.TotalCount; + result.PageModel.TotalPage = pagedList.TotalPages; + result.Data = pagedList.Items.ToList(); + return result; + } + /// <summary> + /// 鏌ヨ鍒嗛〉鍒楄〃鏁版嵁 + /// </summary> + /// <typeparam name="TResult"></typeparam> + /// <typeparam name="TItem"></typeparam> + /// <param name="page"></param> + /// <param name="q"></param> + /// <param name="cancellationToken"></param> + /// <returns></returns> + public static async Task<TResult> GetPagedListAsync<TResult, TItem>( + this PagedListQueryPageModel page, + IQueryable<TItem> q, + CancellationToken cancellationToken = default) + where TItem : class, new() + where TResult : PagedListQueryResult<TItem>, new() + { + if (page.OrderInput.IsNotNull()) + q = q.CustomOrderBy(page.OrderInput); + var pagedList = await q.ToPagedListAsync(page.Page, page.Rows, cancellationToken); + var result = new TResult(); result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); result.PageModel.TotalCount = pagedList.TotalCount; result.PageModel.TotalPage = pagedList.TotalPages; @@ -169,34 +196,27 @@ /// <param name="q"></param> /// <param name="cancellationToken"></param> /// <returns></returns> - public static async Task<PagedListQueryResult<TItem>> GetPagedListAsync<TItem>( + public static Task<PagedListQueryResult<TItem>> GetPagedListAsync<TItem>( this PagedListQueryPageModel page, IQueryable<TItem> q, CancellationToken cancellationToken = default) where TItem : class, new() { - q = q.CustomOrderBy(page.OrderInput); - var pagedList = await q.ToPagedListAsync(page.Page, page.Rows, cancellationToken); - var result = new PagedListQueryResult<TItem>(); - result.PageModel = page.Adapt<PagedListQueryResultPageModel>(); - result.PageModel.TotalCount = pagedList.TotalCount; - result.PageModel.TotalPage = pagedList.TotalPages; - result.Data = pagedList.Items.ToList(); - return result; + return GetPagedListAsync<PagedListQueryResult<TItem>, TItem>(page, q, cancellationToken); } public static IOrderedQueryable<T> CustomOrderBy<T>(this IQueryable<T> q, List<PagedListQueryPageModelOrderInput> orders) { ParameterExpression parameter = Expression.Parameter(typeof(T), "p"); PagedListQueryPageModelOrderInput orderInput = orders[0]; - IOrderedQueryable<T> orderedQueryable = (orderInput.Order == EnumPagedListOrder.Asc) - ? OrderBy(q, orderInput.Property, parameter) + IOrderedQueryable<T> orderedQueryable = (orderInput.Order == EnumPagedListOrder.Asc) + ? OrderBy(q, orderInput.Property, parameter) : OrderByDescending(q, orderInput.Property, parameter); for (int i = 1; i < orders.Count; i++) { PagedListQueryPageModelOrderInput orderInput2 = orders[i]; - orderedQueryable = (orderInput2.Order == EnumPagedListOrder.Asc) - ? ThenBy(orderedQueryable, orderInput2.Property, parameter) + orderedQueryable = (orderInput2.Order == EnumPagedListOrder.Asc) + ? ThenBy(orderedQueryable, orderInput2.Property, parameter) : ThenByDescending(orderedQueryable, orderInput2.Property, parameter); } @@ -230,6 +250,32 @@ public static IOrderedQueryable<T> ThenByDescending<T>(IOrderedQueryable<T> source, string propertyName, ParameterExpression parameter) { return Ordering(source, parameter, propertyName, "ThenByDescending"); + } + + public static async Task<TResult> GetDetail<TEntity, TResult>( + this Guid id, + CancellationToken cancellationToken = default) + where TEntity : CommonEntity, new() + { + var rep = Db.GetRepository<TEntity>(); + return await rep.AsQueryable().AsNoTracking() + .Where(it => it.Id == id) + .GetDetail<TEntity, TResult>(cancellationToken); + } + + public static async Task<TResult> GetDetail<TEntity, TResult>( + this IQueryable<TEntity> q, + CancellationToken cancellationToken = default) + { + var model = await q + .ProjectToType<TResult>() + .FirstOrDefaultAsync(cancellationToken); + if (model == null) + { + var summary = await typeof(TEntity).GetSummary(); + throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "淇℃伅"}"); + } + return model; } /// <summary> @@ -284,6 +330,27 @@ : 0; } + public static async Task<Guid> UpdateData<TEntity, TRequest>( + this IQueryable<TEntity> q, + TRequest request, + Action<TEntity> update = null, + CancellationToken cancellationToken = default) + where TEntity : CommonEntity, new() + { + var rep = Db.GetRepository<TEntity>(); + var entity = await q.FirstOrDefaultAsync(); + if (entity == null) + { + var summary = await typeof(TEntity).GetSummary(); + throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "淇℃伅"}"); + } + + if (update != null) update(entity); + else request.Adapt(entity); + await rep.UpdateAsync(entity); + return entity.Id; + } + /// <summary> /// 淇濆瓨鏁版嵁 /// </summary> @@ -295,7 +362,7 @@ /// <param name="update"></param> /// <param name="cancellationToken"></param> /// <returns></returns> - public static async Task<Guid> SaveData<TEntity, TRequest>( + public static async Task<TEntity> SaveData<TEntity, TRequest>( this TRequest request, Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null, Expression<Func<TEntity, bool>> checkExist = null, @@ -308,17 +375,17 @@ var summary = await typeof(TEntity).GetSummary(xmlDoc); var rep = Db.GetRepository<TEntity>(); if (checkExist != null && await rep.AsQueryable().AsNoTracking().AnyAsync(checkExist)) - throw Oops.Oh(EnumErrorCodeType.s405, $"璇summary ?? "淇℃伅"}"); + throw Oops.Oh(EnumErrorCodeType.s405, $"{summary ?? "淇℃伅"}"); if (request.Id.HasValue) { var q = rep.AsQueryable(); if (query != null) q = query(q); var entity = await q.FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken); - if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, $"璇summary ?? "淇℃伅"}"); + if (entity == null) throw Oops.Oh(EnumErrorCodeType.s404, $"{summary ?? "淇℃伅"}"); if (update != null) update(entity); else request.Adapt(entity); await rep.UpdateAsync(entity); - return entity.Id; + return entity; } else { @@ -326,7 +393,7 @@ if (update != null) update(entity); else request.Adapt(entity); await rep.InsertAsync(entity); - return entity.Id; + return entity; } } @@ -501,37 +568,44 @@ continue; } - Db.GetRepository<DbAuditLog, LogDbContextLocator>().InsertNow(new DbAuditLog + var log = new DbAuditLog { Id = IDGen.NextID(), TableName = entityType.Name, PrimaryKey = (Guid)entity.Property("Id").CurrentValue, - NewValues = entity.State == EntityState.Added || entity.State == EntityState.Modified - ? GetPropertyValuesAsJson(entity) - : null, - OldValues = entity.State == EntityState.Deleted || entity.State == EntityState.Modified - ? GetPropertyValuesAsJson(entity, entity.State == EntityState.Modified) - : null, - Operate = entity.State == EntityState.Added - ? EnumDbAuditOperate.Added - : entity.State == EntityState.Modified - ? EnumDbAuditOperate.Modified - : EnumDbAuditOperate.Deleted, TraceId = App.GetTraceId(), CreatedTime = DateTime.Now, CreatedUserId = logier?.Id, CreatedEnterpriseId = logier?.EnterpriseId - }); + }; + log.Operate = + entity.State == EntityState.Added + ? EnumDbAuditOperate.Added + : entity.State == EntityState.Modified + ? EnumDbAuditOperate.Modified + : EnumDbAuditOperate.Deleted; + if (entity.Property(nameof(CommonEntity.IsDeleted)).CurrentValue is bool isDeleted && isDeleted == true) + { + log.Operate = EnumDbAuditOperate.Deleted; + } + log.NewValues = + log.Operate == EnumDbAuditOperate.Deleted + ? null + : JsonConvert.SerializeObject(entity.Properties + .Where(p => log.Operate == EnumDbAuditOperate.Modified + ? p.IsModified + : true) + .ToDictionary(p => p.Metadata.Name, p => p.CurrentValue)); + log.OldValues = + log.Operate == EnumDbAuditOperate.Added + ? null + : JsonConvert.SerializeObject(entity.Properties + .Where(p => log.Operate == EnumDbAuditOperate.Modified + ? p.IsModified + : true) + .ToDictionary(p => p.Metadata.Name, p => p.OriginalValue)); + Db.GetRepository<DbAuditLog, LogDbContextLocator>().InsertNow(log); } - } - - private static string GetPropertyValuesAsJson(EntityEntry entry, bool getOldValues = false) - { - var properties = entry.Properties - .Where(p => getOldValues ? p.IsModified : true) - .ToDictionary(p => p.Metadata.Name, p => getOldValues ? p.OriginalValue : p.CurrentValue); - - return JsonConvert.SerializeObject(properties); } } } -- Gitblit v1.9.1