sunpengfei
2025-08-08 32288af3e5f12bc48d8360114c872fde5d9ff4a8
FlexJobApi.Core/Utils/DbUtils/DbUtils.cs
@@ -8,6 +8,7 @@
using Microsoft.EntityFrameworkCore.ChangeTracking;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
@@ -98,7 +99,7 @@
        /// <param name="query"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task<List<SelectQueryResultOption<TValue, TData>>> GetSelect<TEntity, TValue, TData>(
        public static async Task<List<SelectOption<TValue, TData>>> GetSelect<TEntity, TValue, TData>(
            this SelectQuery<TValue, TData> request,
            Func<TData, TValue> getValue,
            Func<TData, string> getLabel,
@@ -113,10 +114,10 @@
            var models = await q
                .ProjectToType<TData>()
                .ToListAsync(cancellationToken);
            var options = new List<SelectQueryResultOption<TValue, TData>>();
            var options = new List<SelectOption<TValue, TData>>();
            foreach (var model in models)
            {
                var option = new SelectQueryResultOption<TValue, TData>();
                var option = new SelectOption<TValue, TData>();
                option.Data = model;
                option.Value = getValue(model);
                option.Label = getLabel(model);
@@ -304,12 +305,14 @@
        /// <typeparam name="TEntity"></typeparam>
        /// <typeparam name="TRequest"></typeparam>
        /// <param name="request"></param>
        /// <param name="query"></param>
        /// <param name="checkExist"></param>
        /// <param name="update"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        public static async Task<Guid> SaveData<TEntity, TRequest>(
            this TRequest request,
            Func<IQueryable<TEntity>, IQueryable<TEntity>> query = null,
            Expression<Func<TEntity, bool>> checkExist = null,
            Action<TEntity> update = null,
            CancellationToken cancellationToken = default)
@@ -323,7 +326,9 @@
                throw Oops.Oh(EnumErrorCodeType.s405, $"该{summary ?? "信息"}");
            if (request.Id.HasValue)
            {
                var entity = await rep.AsQueryable().FirstOrDefaultAsync(it => it.Id == request.Id, cancellationToken);
                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 (update != null) update(entity);
                else request.Adapt(entity);
@@ -348,35 +353,41 @@
        /// <returns></returns>
        public static async Task BuildEntity(ModelBuilder modelBuilder, Type dbContextLocator = null)
        {
            var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            if (App.GetService<IMigrator>() != null)
            {
                Console.WriteLine($"正在生成表:{entityType.Name}");
                // 获取实体类的XML注释,并设置为表注释
                var entityBuilder = modelBuilder.Entity(entityType.ClrType);
                string typeComment = (await entityType.ClrType.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                if (!string.IsNullOrEmpty(typeComment))
                var xmlDoc = await XmlDocUtils.GetXmlDocAsync();
                foreach (var entityType in modelBuilder.Model.GetEntityTypes())
                {
                    Console.WriteLine($"正在生成表注释:{entityType.Name}-{typeComment}");
                    entityBuilder.ToTable(it => it.HasComment(typeComment));
                }
                // 获取实体属性的XML注释,并设置为列注释
                var properties = entityType.ClrType.GetProperties()
                    .Where(p =>
                        p.CanRead
                        && p.CanWrite
                        && !typeof(System.Collections.ICollection).IsAssignableFrom(p.PropertyType)
                        && (p.PropertyType.IsClass ? p.PropertyType.FullName.Contains("System.") : true));
                foreach (var property in properties)
                {
                    string propComment = (await property.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                    if (!string.IsNullOrEmpty(propComment))
                    Console.WriteLine($"正在生成表:{entityType.Name}");
                    // 获取实体类的XML注释,并设置为表注释
                    var entityBuilder = modelBuilder.Entity(entityType.ClrType);
                    string typeComment = (await entityType.ClrType.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                    if (!string.IsNullOrEmpty(typeComment))
                    {
                        Console.WriteLine($"正在生成属性注释:{property.Name}-{propComment}");
                        entityBuilder.Property(property.Name).HasComment(propComment);
                        Console.WriteLine($"正在生成表注释:{entityType.Name}-{typeComment}");
                        entityBuilder.ToTable(it => it.HasComment(typeComment));
                    }
                    // 获取实体属性的XML注释,并设置为列注释
                    var properties = entityType.ClrType.GetProperties()
                        .Where(p =>
                            p.CanRead
                            && p.CanWrite
                            && !typeof(System.Collections.ICollection).IsAssignableFrom(p.PropertyType)
                            && (p.PropertyType.IsClass ? p.PropertyType.FullName.Contains("System.") : true));
                    foreach (var property in properties)
                    {
                        string propComment = (await property.GetXmlDocMemberAsync(xmlDoc))?.Summary;
                        if (!string.IsNullOrEmpty(propComment))
                        {
                            Console.WriteLine($"正在生成属性注释:{property.Name}-{propComment}");
                            entityBuilder.Property(property.Name).HasComment(propComment);
                        }
                    }
                }
            }
            foreach (var entityType in modelBuilder.Model.GetEntityTypes())
            {
                if (typeof(CommonEntity).IsAssignableFrom(entityType.ClrType))
                {
                    // 构建筛选条件:IsDeleted == false
@@ -390,8 +401,6 @@
                    modelBuilder.Entity(entityType.ClrType).HasQueryFilter(lambda);
                }
            }
            Console.WriteLine("数据库链接地址:" + App.Configuration.GetConnectionString("FlexJobApi"));
        }
        /// <summary>
@@ -420,6 +429,7 @@
            // 通过请求中获取当前操作人
            var logier = JwtUtils.GetCurrentLogier();
            var traceId = App.GetTraceId();
            // 获取所有已更改的实体
            foreach (var entity in entities)
@@ -445,17 +455,24 @@
                    }
                    // 赋值用户信息Id
                    prop = entity.Property(nameof(CommonEntity.CreatedUserInfoId));
                    prop = entity.Property(nameof(CommonEntity.CreatedUserId));
                    if (prop != null && prop.CurrentValue == null)
                    {
                        prop.CurrentValue = logier?.UserInfoId;
                        prop.CurrentValue = logier?.Id;
                    }
                    // 赋值企业Id
                    prop = entity.Property(nameof(CommonEntity.CreatedEnterpriseId));
                    if (prop != null && prop.CurrentValue == null)
                    {
                        prop.CurrentValue = logier?.EnterpriseId;
                    }
                    // 赋值跟踪Id
                    prop = entity.Property(nameof(CommonEntity.TraceId));
                    if (prop != null)
                    if (prop != null && prop.CurrentValue == null && traceId.IsNotNull())
                    {
                        prop.CurrentValue = App.GetTraceId();
                        prop.CurrentValue = traceId;
                    }
                }
                else
@@ -468,17 +485,17 @@
                    }
                    // 赋值用户信息Id
                    prop = entity.Property(nameof(CommonEntity.UpdatedUserInfoId));
                    prop = entity.Property(nameof(CommonEntity.UpdatedUserId));
                    if (prop != null)
                    {
                        prop.CurrentValue = logier?.UserInfoId;
                        prop.CurrentValue = logier?.Id;
                    }
                    // 赋值跟踪Id
                    prop = entity.Property(nameof(CommonEntity.TraceId));
                    if (prop != null)
                    if (prop != null && traceId.IsNotNull())
                    {
                        prop.CurrentValue = App.GetTraceId();
                        prop.CurrentValue = traceId;
                    }
                    // 软删除
@@ -517,7 +534,8 @@
                        : EnumDbAuditOperate.Deleted,
                    TraceId = App.GetTraceId(),
                    CreatedTime = DateTime.Now,
                    CreatedUserInfoId = logier?.UserInfoId,
                    CreatedUserId = logier?.Id,
                    CreatedEnterpriseId = logier?.EnterpriseId
                });
            }
        }