sunpengfei
7 天以前 5262f7b77aea5cf8c1543f48b34f311665d61518
FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -148,7 +148,8 @@
            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);
@@ -176,7 +177,8 @@
            where TItem : class, new()
            where TResult : PagedListQueryResult<TItem>, new()
        {
            q = q.CustomOrderBy(page.OrderInput);
            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>();
@@ -250,6 +252,32 @@
            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>
        /// 设置是否禁用
        /// </summary>
@@ -302,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>
@@ -313,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,
@@ -326,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
            {
@@ -344,7 +393,7 @@
                if (update != null) update(entity);
                else request.Adapt(entity);
                await rep.InsertAsync(entity);
                return entity.Id;
                return entity;
            }
        }
@@ -519,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);
        }
    }
}