diff --git a/Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs b/Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs index 397e9020..72c04663 100644 --- a/Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs +++ b/Admin.NET/Admin.NET.Core/Attribute/ThemeAttribute.cs @@ -1,45 +1,22 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -namespace Admin.NET.Core; - -/// -/// 枚举拓展主题样式 -/// -[SuppressSniffer] -[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)] -public class ThemeAttribute : Attribute -{ - public string Theme { get; private set; } - - public ThemeAttribute(string theme) - { - this.Theme = theme; - } -} - -public static class ThemeExtend -{ - /// - /// 扩展方法 - /// - /// - /// - public static string GetTheme(this Enum enumValue) - { - Type type = enumValue.GetType(); - FieldInfo field = type.GetField(enumValue.ToString()); - if (field.IsDefined(typeof(ThemeAttribute), true)) - { - var themeAttribute = (ThemeAttribute)field.GetCustomAttribute(typeof(ThemeAttribute)); - return themeAttribute.Theme; - } - else - { - return string.Empty; - } - } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 枚举拓展主题样式 +/// +[SuppressSniffer] +[AttributeUsage(AttributeTargets.Enum | AttributeTargets.Field)] +public class ThemeAttribute : Attribute +{ + public string Theme { get; private set; } + + public ThemeAttribute(string theme) + { + this.Theme = theme; + } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs index 57f3b06f..7b8c8ee1 100644 --- a/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs +++ b/Admin.NET/Admin.NET.Core/Extension/EnumExtension.cs @@ -1,242 +1,242 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -namespace Admin.NET.Core; - -/// -/// 枚举拓展 -/// -public static class EnumExtension -{ - // 枚举显示字典缓存 - private static readonly ConcurrentDictionary> EnumDisplayValueDict = new(); - - // 枚举值字典缓存 - private static readonly ConcurrentDictionary> EnumNameValueDict = new(); - - // 枚举类型缓存 - private static ConcurrentDictionary _enumTypeDict; - - /// - /// 获取枚举对象Key与名称的字典(缓存) - /// - /// - /// - public static Dictionary GetEnumDictionary(this Type enumType) - { - if (!enumType.IsEnum) - throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); - - // 查询缓存 - var enumDic = EnumNameValueDict.ContainsKey(enumType) ? EnumNameValueDict[enumType] : new Dictionary(); - if (enumDic.Count != 0) - return enumDic; - // 取枚举类型的Key/Value字典集合 - enumDic = GetEnumDictionaryItems(enumType); - - // 缓存 - EnumNameValueDict[enumType] = enumDic; - - return enumDic; - } - - /// - /// 获取枚举对象Key与名称的字典 - /// - /// - /// - private static Dictionary GetEnumDictionaryItems(this Type enumType) - { - // 获取类型的字段,初始化一个有限长度的字典 - var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); - Dictionary enumDic = new(enumFields.Length); - - // 遍历字段数组获取key和name - foreach (var enumField in enumFields) - { - var intValue = (int)enumField.GetValue(enumType); - enumDic[intValue] = enumField.Name; - } - - return enumDic; - } - - /// - /// 获取枚举类型key与描述的字典(缓存) - /// - /// - /// - /// - public static Dictionary GetEnumDescDictionary(this Type enumType) - { - if (!enumType.IsEnum) - throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); - - // 查询缓存 - var enumDic = EnumDisplayValueDict.ContainsKey(enumType) - ? EnumDisplayValueDict[enumType] - : new Dictionary(); - if (enumDic.Count != 0) - return enumDic; - // 取枚举类型的Key/Value字典集合 - enumDic = GetEnumDescDictionaryItems(enumType); - - // 缓存 - EnumDisplayValueDict[enumType] = enumDic; - - return enumDic; - } - - /// - /// 获取枚举类型key与描述的字典(没有描述则获取name) - /// - /// - /// - /// - private static Dictionary GetEnumDescDictionaryItems(this Type enumType) - { - // 获取类型的字段,初始化一个有限长度的字典 - var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); - Dictionary enumDic = new(enumFields.Length); - - // 遍历字段数组获取key和name - foreach (var enumField in enumFields) - { - var intValue = (int)enumField.GetValue(enumType); - var desc = enumField.GetDescriptionValue(); - enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; - } - - return enumDic; - } - - /// - /// 从程序集中查找指定枚举类型 - /// - /// - /// - /// - public static Type TryToGetEnumType(Assembly assembly, string typeName) - { - // 枚举缓存为空则重新加载枚举类型字典 - _enumTypeDict ??= LoadEnumTypeDict(assembly); - - // 按名称查找 - return _enumTypeDict.ContainsKey(typeName) ? _enumTypeDict[typeName] : null; - } - - /// - /// 从程序集中加载所有枚举类型 - /// - /// - /// - private static ConcurrentDictionary LoadEnumTypeDict(Assembly assembly) - { - // 取程序集中所有类型 - var typeArray = assembly.GetTypes(); - - // 过滤非枚举类型,转成字典格式并返回 - var dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); - ConcurrentDictionary enumTypeDict = new(dict); - return enumTypeDict; - } - - /// - /// 获取枚举的Description - /// - /// - /// - public static string GetDescription(this System.Enum value) - { - return value.GetType().GetMember(value.ToString()).FirstOrDefault()?.GetCustomAttribute() - ?.Description; - } - - /// - /// 获取枚举的Description - /// - /// - /// - public static string GetDescription(this object value) - { - return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() - ?.GetCustomAttribute()?.Description; - } - - /// - /// 获取枚举的Theme - /// - /// - /// - public static string GetTheme(this object value) - { - return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() - ?.GetCustomAttribute()?.Theme; - } - - /// - /// 将枚举转成枚举信息集合 - /// - /// - /// - public static List EnumToList(this Type type) - { - if (!type.IsEnum) - throw new ArgumentException("Type '" + type.Name + "' is not an enum."); - var arr = System.Enum.GetNames(type); - return arr.Select(sl => - { - var item = System.Enum.Parse(type, sl); - return new EnumEntity - { - Name = item.ToString(), - Describe = item.GetDescription() ?? item.ToString(), - Theme = item.GetTheme() ?? string.Empty, - Value = item.GetHashCode() - }; - }).ToList(); - } - - /// - /// 枚举ToList - /// - /// - /// - /// - public static List EnumToList(this Type type) - { - if (!type.IsEnum) - throw new ArgumentException("Type '" + type.Name + "' is not an enum."); - var arr = System.Enum.GetNames(type); - return arr.Select(name => (T)System.Enum.Parse(type, name)).ToList(); - } -} - -/// -/// 枚举实体 -/// -public class EnumEntity -{ - /// - /// 枚举的描述 - /// - public string Describe { set; get; } - - /// - /// 枚举的样式 - /// - public string Theme { set; get; } - - /// - /// 枚举名称 - /// - public string Name { set; get; } - - /// - /// 枚举对象的值 - /// - public int Value { set; get; } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 枚举拓展 +/// +public static class EnumExtension +{ + // 枚举显示字典缓存 + private static readonly ConcurrentDictionary> EnumDisplayValueDict = new(); + + // 枚举值字典缓存 + private static readonly ConcurrentDictionary> EnumNameValueDict = new(); + + // 枚举类型缓存 + private static ConcurrentDictionary _enumTypeDict; + + /// + /// 获取枚举对象Key与名称的字典(缓存) + /// + /// + /// + public static Dictionary GetEnumDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 查询缓存 + var enumDic = EnumNameValueDict.ContainsKey(enumType) ? EnumNameValueDict[enumType] : new Dictionary(); + if (enumDic.Count != 0) + return enumDic; + // 取枚举类型的Key/Value字典集合 + enumDic = GetEnumDictionaryItems(enumType); + + // 缓存 + EnumNameValueDict[enumType] = enumDic; + + return enumDic; + } + + /// + /// 获取枚举对象Key与名称的字典 + /// + /// + /// + private static Dictionary GetEnumDictionaryItems(this Type enumType) + { + // 获取类型的字段,初始化一个有限长度的字典 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary enumDic = new(enumFields.Length); + + // 遍历字段数组获取key和name + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + enumDic[intValue] = enumField.Name; + } + + return enumDic; + } + + /// + /// 获取枚举类型key与描述的字典(缓存) + /// + /// + /// + /// + public static Dictionary GetEnumDescDictionary(this Type enumType) + { + if (!enumType.IsEnum) + throw new ArgumentException("Type '" + enumType.Name + "' is not an enum."); + + // 查询缓存 + var enumDic = EnumDisplayValueDict.ContainsKey(enumType) + ? EnumDisplayValueDict[enumType] + : new Dictionary(); + if (enumDic.Count != 0) + return enumDic; + // 取枚举类型的Key/Value字典集合 + enumDic = GetEnumDescDictionaryItems(enumType); + + // 缓存 + EnumDisplayValueDict[enumType] = enumDic; + + return enumDic; + } + + /// + /// 获取枚举类型key与描述的字典(没有描述则获取name) + /// + /// + /// + /// + private static Dictionary GetEnumDescDictionaryItems(this Type enumType) + { + // 获取类型的字段,初始化一个有限长度的字典 + var enumFields = enumType.GetFields(BindingFlags.Public | BindingFlags.Static); + Dictionary enumDic = new(enumFields.Length); + + // 遍历字段数组获取key和name + foreach (var enumField in enumFields) + { + var intValue = (int)enumField.GetValue(enumType); + var desc = enumField.GetDescriptionValue(); + enumDic[intValue] = desc != null && !string.IsNullOrEmpty(desc.Description) ? desc.Description : enumField.Name; + } + + return enumDic; + } + + /// + /// 从程序集中查找指定枚举类型 + /// + /// + /// + /// + public static Type TryToGetEnumType(Assembly assembly, string typeName) + { + // 枚举缓存为空则重新加载枚举类型字典 + _enumTypeDict ??= LoadEnumTypeDict(assembly); + + // 按名称查找 + return _enumTypeDict.ContainsKey(typeName) ? _enumTypeDict[typeName] : null; + } + + /// + /// 从程序集中加载所有枚举类型 + /// + /// + /// + private static ConcurrentDictionary LoadEnumTypeDict(Assembly assembly) + { + // 取程序集中所有类型 + var typeArray = assembly.GetTypes(); + + // 过滤非枚举类型,转成字典格式并返回 + var dict = typeArray.Where(o => o.IsEnum).ToDictionary(o => o.Name, o => o); + ConcurrentDictionary enumTypeDict = new(dict); + return enumTypeDict; + } + + /// + /// 获取枚举的Description + /// + /// + /// + public static string GetDescription(this System.Enum value) + { + return value.GetType().GetMember(value.ToString()).FirstOrDefault()?.GetCustomAttribute() + ?.Description; + } + + /// + /// 获取枚举的Description + /// + /// + /// + public static string GetDescription(this object value) + { + return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() + ?.GetCustomAttribute()?.Description; + } + + /// + /// 获取枚举的Theme + /// + /// + /// + public static string GetTheme(this object value) + { + return value.GetType().GetMember(value.ToString() ?? string.Empty).FirstOrDefault() + ?.GetCustomAttribute()?.Theme; + } + + /// + /// 将枚举转成枚举信息集合 + /// + /// + /// + public static List EnumToList(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + var arr = System.Enum.GetNames(type); + return arr.Select(sl => + { + var item = System.Enum.Parse(type, sl); + return new EnumEntity + { + Name = item.ToString(), + Describe = item.GetDescription() ?? item.ToString(), + Theme = item.GetTheme() ?? string.Empty, + Value = item.GetHashCode() + }; + }).ToList(); + } + + /// + /// 枚举ToList + /// + /// + /// + /// + public static List EnumToList(this Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type '" + type.Name + "' is not an enum."); + var arr = System.Enum.GetNames(type); + return arr.Select(name => (T)System.Enum.Parse(type, name)).ToList(); + } +} + +/// +/// 枚举实体 +/// +public class EnumEntity +{ + /// + /// 枚举的描述 + /// + public string Describe { set; get; } + + /// + /// 枚举的样式 + /// + public string Theme { set; get; } + + /// + /// 枚举名称 + /// + public string Name { set; get; } + + /// + /// 枚举对象的值 + /// + public int Value { set; get; } } \ No newline at end of file diff --git a/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs b/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs index 3e0d5661..f1b0cf21 100644 --- a/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs +++ b/Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs @@ -1,149 +1,150 @@ -// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 -// -// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 -// -// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! - -namespace Admin.NET.Core; - -/// -/// 枚举转字典 -/// -[JobDetail("job_EnumToDictJob", Description = "枚举转字典", GroupName = "default", Concurrent = false)] -[PeriodSeconds(1, TriggerId = "trigger_EnumToDictJob", Description = "枚举转字典", MaxNumberOfRuns = 1, RunOnStart = true)] -public class EnumToDictJob : IJob -{ - private readonly IServiceScopeFactory _scopeFactory; - private readonly IJsonSerializerProvider _jsonSerializer; - - public EnumToDictJob(IServiceScopeFactory scopeFactory, IJsonSerializerProvider jsonSerializer) - { - _scopeFactory = scopeFactory; - _jsonSerializer = jsonSerializer; - } - - public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) - { - using var serviceScope = _scopeFactory.CreateScope(); - var sysEnumService = serviceScope.ServiceProvider.GetRequiredService(); - var db = serviceScope.ServiceProvider.GetRequiredService().CopyNew(); - - var enumTypeList = sysEnumService.GetEnumTypeList(); - var enumCodeList = enumTypeList.Select(u => u.TypeName); - var sysDictTypeCodeList = await db.Queryable().Where(u => enumCodeList.Contains(u.Code)).Select(u => u.Code).ToListAsync(stoppingToken); - - // 更新的枚举转换字典 - var uEnumType = enumTypeList.Where(u => sysDictTypeCodeList.Contains(u.TypeName)).ToList(); - var waitUpdateSysDictType = await db.Queryable().Where(u => uEnumType.Any(a => a.TypeName == u.Code)).ToListAsync(stoppingToken); - var waitUpdateSysDictTypeDict = waitUpdateSysDictType.ToDictionary(u => u.Code, u => u); - var waitUpdateSysDictData = await db.Queryable().Where(u => uEnumType.Any(a => a.TypeName == u.DictType.Code)).ToListAsync(stoppingToken); - var uSysDictType = new List(); - var uSysDictData = new List(); - if (uEnumType.Count > 0) - { - uEnumType.ForEach(e => - { - if (waitUpdateSysDictTypeDict.TryGetValue(e.TypeName, out SysDictType value)) - { - var uDictType = value; - uDictType.Name = e.TypeDescribe; - uDictType.Remark = e.TypeRemark; - var uDictData = waitUpdateSysDictData.Where(u => u.DictTypeId == uDictType.Id).ToList(); - if (uDictData.Count > 0) - { - uDictData.ForEach(dictData => - { - var enumData = e.EnumEntities.Where(u => dictData.Code == u.Name).FirstOrDefault(); - if (enumData != null) - { - dictData.Value = enumData.Value.ToString(); - dictData.Code = enumData.Name; - dictData.OrderNo = enumData.Value + 10; - dictData.Name = enumData.Describe; - uSysDictData.Add(dictData); - } - }); - } - if (!uSysDictType.Any(u => u.Id == uDictType.Id)) - uSysDictType.Add(uDictType); - } - }); - try - { - db.BeginTran(); - - if (uSysDictType.Count > 0) - await db.Updateable(uSysDictType).ExecuteCommandAsync(stoppingToken); - - if (uSysDictData.Count > 0) - await db.Updateable(uSysDictData).ExecuteCommandAsync(stoppingToken); - - db.CommitTran(); - } - catch (Exception error) - { - db.RollbackTran(); - Log.Error($"{context.Trigger.Description}更新枚举转换字典入库错误:" + _jsonSerializer.Serialize(error)); - throw new Exception($"{context.Trigger.Description}更新枚举转换字典入库错误"); - } - } - - // 新增的枚举转换字典 - var iEnumType = enumTypeList.Where(u => !sysDictTypeCodeList.Contains(u.TypeName)).ToList(); - if (iEnumType.Count > 0) - { - // 新增字典类型 - var iDictType = iEnumType.Select(u => new SysDictType - { - Id = YitIdHelper.NextId(), - Code = u.TypeName, - Name = u.TypeDescribe, - Remark = u.TypeRemark, - Status = StatusEnum.Enable - }).ToList(); - // 新增字典数据 - var dictData = iEnumType.Join(iDictType, t1 => t1.TypeName, t2 => t2.Code, (t1, t2) => new - { - data = t1.EnumEntities.Select(u => new SysDictData - { - Id = YitIdHelper.NextId(), // 性能优化,使用BulkCopyAsync必须手动获取Id - DictTypeId = t2.Id, - Name = u.Describe, - Value = u.Value.ToString(), - Code = u.Name, - Remark = t2.Remark, - OrderNo = u.Value + 10, - TagType = "info" - }).ToList() - }).ToList(); - var iDictData = new List(); - dictData.ForEach(item => - { - iDictData.AddRange(item.data); - }); - try - { - db.BeginTran(); - - if (iDictType.Count > 0) - await db.Insertable(iDictType).ExecuteCommandAsync(stoppingToken); - - if (iDictData.Count > 0) - await db.Insertable(iDictData).ExecuteCommandAsync(stoppingToken); - - db.CommitTran(); - } - catch (Exception error) - { - db.RollbackTran(); - Log.Error($"{context.Trigger.Description}新增枚举转换字典入库错误:" + _jsonSerializer.Serialize(error)); - throw new Exception($"{context.Trigger.Description}新增枚举转换字典入库错误"); - } - } - - var originColor = Console.ForegroundColor; - Console.ForegroundColor = ConsoleColor.Green; - Console.WriteLine($"【{DateTime.Now}】系统枚举转换字典"); - Console.ForegroundColor = originColor; - } +// Admin.NET 项目的版权、商标、专利和其他相关权利均受相应法律法规的保护。使用本项目应遵守相关法律法规和许可证的要求。 +// +// 本项目主要遵循 MIT 许可证和 Apache 许可证(版本 2.0)进行分发和使用。许可证位于源代码树根目录中的 LICENSE-MIT 和 LICENSE-APACHE 文件。 +// +// 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任! + +namespace Admin.NET.Core; + +/// +/// 枚举转字典 +/// +[JobDetail("job_EnumToDictJob", Description = "枚举转字典", GroupName = "default", Concurrent = false)] +[PeriodSeconds(1, TriggerId = "trigger_EnumToDictJob", Description = "枚举转字典", MaxNumberOfRuns = 1, RunOnStart = true)] +public class EnumToDictJob : IJob +{ + private readonly IServiceScopeFactory _scopeFactory; + private readonly IJsonSerializerProvider _jsonSerializer; + + public EnumToDictJob(IServiceScopeFactory scopeFactory, IJsonSerializerProvider jsonSerializer) + { + _scopeFactory = scopeFactory; + _jsonSerializer = jsonSerializer; + } + + public async Task ExecuteAsync(JobExecutingContext context, CancellationToken stoppingToken) + { + using var serviceScope = _scopeFactory.CreateScope(); + var sysEnumService = serviceScope.ServiceProvider.GetRequiredService(); + var db = serviceScope.ServiceProvider.GetRequiredService().CopyNew(); + + var enumTypeList = sysEnumService.GetEnumTypeList(); + var enumCodeList = enumTypeList.Select(u => u.TypeName); + var sysDictTypeCodeList = await db.Queryable().Where(u => enumCodeList.Contains(u.Code)).Select(u => u.Code).ToListAsync(stoppingToken); + + // 更新的枚举转换字典 + var uEnumType = enumTypeList.Where(u => sysDictTypeCodeList.Contains(u.TypeName)).ToList(); + var waitUpdateSysDictType = await db.Queryable().Where(u => uEnumType.Any(a => a.TypeName == u.Code)).ToListAsync(stoppingToken); + var waitUpdateSysDictTypeDict = waitUpdateSysDictType.ToDictionary(u => u.Code, u => u); + var waitUpdateSysDictData = await db.Queryable().Where(u => uEnumType.Any(a => a.TypeName == u.DictType.Code)).ToListAsync(stoppingToken); + var uSysDictType = new List(); + var uSysDictData = new List(); + if (uEnumType.Count > 0) + { + uEnumType.ForEach(e => + { + if (waitUpdateSysDictTypeDict.TryGetValue(e.TypeName, out SysDictType value)) + { + var uDictType = value; + uDictType.Name = e.TypeDescribe; + uDictType.Remark = e.TypeRemark; + var uDictData = waitUpdateSysDictData.Where(u => u.DictTypeId == uDictType.Id).ToList(); + if (uDictData.Count > 0) + { + uDictData.ForEach(dictData => + { + var enumData = e.EnumEntities.Where(u => dictData.Code == u.Name).FirstOrDefault(); + if (enumData != null) + { + dictData.Value = enumData.Value.ToString(); + dictData.Code = enumData.Name; + dictData.OrderNo = enumData.Value + 10; + dictData.Name = enumData.Describe; + dictData.TagType = enumData.Theme; + uSysDictData.Add(dictData); + } + }); + } + if (!uSysDictType.Any(u => u.Id == uDictType.Id)) + uSysDictType.Add(uDictType); + } + }); + try + { + db.BeginTran(); + + if (uSysDictType.Count > 0) + await db.Updateable(uSysDictType).ExecuteCommandAsync(stoppingToken); + + if (uSysDictData.Count > 0) + await db.Updateable(uSysDictData).ExecuteCommandAsync(stoppingToken); + + db.CommitTran(); + } + catch (Exception error) + { + db.RollbackTran(); + Log.Error($"{context.Trigger.Description}更新枚举转换字典入库错误:" + _jsonSerializer.Serialize(error)); + throw new Exception($"{context.Trigger.Description}更新枚举转换字典入库错误"); + } + } + + // 新增的枚举转换字典 + var iEnumType = enumTypeList.Where(u => !sysDictTypeCodeList.Contains(u.TypeName)).ToList(); + if (iEnumType.Count > 0) + { + // 新增字典类型 + var iDictType = iEnumType.Select(u => new SysDictType + { + Id = YitIdHelper.NextId(), + Code = u.TypeName, + Name = u.TypeDescribe, + Remark = u.TypeRemark, + Status = StatusEnum.Enable + }).ToList(); + // 新增字典数据 + var dictData = iEnumType.Join(iDictType, t1 => t1.TypeName, t2 => t2.Code, (t1, t2) => new + { + data = t1.EnumEntities.Select(u => new SysDictData + { + Id = YitIdHelper.NextId(), // 性能优化,使用BulkCopyAsync必须手动获取Id + DictTypeId = t2.Id, + Name = u.Describe, + Value = u.Value.ToString(), + Code = u.Name, + Remark = t2.Remark, + OrderNo = u.Value + 10, + TagType = u.Theme ?? "info" + }).ToList() + }).ToList(); + var iDictData = new List(); + dictData.ForEach(item => + { + iDictData.AddRange(item.data); + }); + try + { + db.BeginTran(); + + if (iDictType.Count > 0) + await db.Insertable(iDictType).ExecuteCommandAsync(stoppingToken); + + if (iDictData.Count > 0) + await db.Insertable(iDictData).ExecuteCommandAsync(stoppingToken); + + db.CommitTran(); + } + catch (Exception error) + { + db.RollbackTran(); + Log.Error($"{context.Trigger.Description}新增枚举转换字典入库错误:" + _jsonSerializer.Serialize(error)); + throw new Exception($"{context.Trigger.Description}新增枚举转换字典入库错误"); + } + } + + var originColor = Console.ForegroundColor; + Console.ForegroundColor = ConsoleColor.Green; + Console.WriteLine($"【{DateTime.Now}】系统枚举转换字典"); + Console.ForegroundColor = originColor; + } } \ No newline at end of file