Ver Fonte

feat: EnumToDictJob 支持枚举新增枚举值的情况

许俊杰 há 2 anos atrás
pai
commit
c3e8356027
1 ficheiros alterados com 82 adições e 52 exclusões
  1. 82 52
      Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs

+ 82 - 52
Admin.NET/Admin.NET.Core/Job/EnumToDictJob.cs

@@ -4,8 +4,6 @@
 //
 // 不得利用本项目从事危害国家安全、扰乱社会秩序、侵犯他人合法权益等法律法规禁止的活动!任何基于本项目二次开发而产生的一切法律纠纷和责任,我们不承担任何责任!
 
-using AngleSharp.Common;
-
 namespace Admin.NET.Core;
 
 /// <summary>
@@ -43,7 +41,7 @@ public class EnumToDictJob : IJob
         var updatedEnumCodes = sysDictTypeList.Select(u => u.Code);
         var updatedEnumType = enumTypeList.Where(u => updatedEnumCodes.Contains(u.TypeName)).ToList();
         var sysDictTypeDict = sysDictTypeList.ToDictionary(u => u.Code, u => u);
-        var (updatedDictTypes, updatedDictDatas) = GetUpdatedDicts(updatedEnumType, sysDictTypeDict);
+        var (updatedDictTypes, updatedDictDatas, newSysDictDatas) = GetUpdatedDicts(updatedEnumType, sysDictTypeDict);
 
         // 新增的枚举转换字典
         var newEnumType = enumTypeList.Where(u => !updatedEnumCodes.Contains(u.TypeName)).ToList();
@@ -52,7 +50,7 @@ public class EnumToDictJob : IJob
         // 执行数据库操作
         try
         {
-            db.BeginTran();
+            await db.BeginTranAsync();
 
             if (updatedDictTypes.Count > 0)
                 await db.Updateable(updatedDictTypes).ExecuteCommandAsync(stoppingToken);
@@ -60,17 +58,20 @@ public class EnumToDictJob : IJob
             if (updatedDictDatas.Count > 0)
                 await db.Updateable(updatedDictDatas).ExecuteCommandAsync(stoppingToken);
 
+            if (newSysDictDatas.Count > 0)
+                await db.Insertable(newSysDictDatas).ExecuteCommandAsync(stoppingToken);
+
             if (newDictTypes.Count > 0)
                 await db.Insertable(newDictTypes).ExecuteCommandAsync(stoppingToken);
 
             if (newDictDatas.Count > 0)
                 await db.Insertable(newDictDatas).ExecuteCommandAsync(stoppingToken);
 
-            db.CommitTran();
+            await db.CommitTranAsync();
         }
         catch (Exception error)
         {
-            db.RollbackTran();
+            await db.RollbackTranAsync();
             Log.Error($"系统枚举转换字典操作错误:{error.Message}\n堆栈跟踪:{error.StackTrace}", error);
             throw;
         }
@@ -95,34 +96,35 @@ public class EnumToDictJob : IJob
     {
         var newDictType = new List<SysDictType>();
         var newDictData = new List<SysDictData>();
-        if (addEnumType.Count > 0)
+        if (addEnumType.Count <= 0)
+            return (newDictType, newDictData);
+
+        // 新增字典类型
+        newDictType = addEnumType.Select(u => new SysDictType
         {
-            // 新增字典类型
-            newDictType = addEnumType.Select(u => new SysDictType
+            Id = YitIdHelper.NextId(),
+            Code = u.TypeName,
+            Name = u.TypeDescribe,
+            Remark = u.TypeRemark,
+            Status = StatusEnum.Enable
+        }).ToList();
+
+        // 新增字典数据
+        newDictData = addEnumType.Join(newDictType, t1 => t1.TypeName, t2 => t2.Code, (t1, t2) => new
+        {
+            Data = t1.EnumEntities.Select(u => new SysDictData
             {
                 Id = YitIdHelper.NextId(),
-                Code = u.TypeName,
-                Name = u.TypeDescribe,
-                Remark = u.TypeRemark,
-                Status = StatusEnum.Enable
-            }).ToList();
-
-            // 新增字典数据
-            newDictData = addEnumType.Join(newDictType, t1 => t1.TypeName, t2 => t2.Code, (t1, t2) => new
-            {
-                Data = t1.EnumEntities.Select(u => new SysDictData
-                {
-                    Id = YitIdHelper.NextId(),
-                    DictTypeId = t2.Id,
-                    Name = u.Describe,
-                    Value = u.Value.ToString(),
-                    Code = u.Name,
-                    Remark = t2.Remark,
-                    OrderNo = u.Value + OrderOffset,
-                    TagType = u.Theme != "" ? u.Theme : DefaultTagType,
-                }).ToList()
-            }).SelectMany(x => x.Data).ToList();
-        }
+                DictTypeId = t2.Id,
+                Name = u.Describe,
+                Value = u.Value.ToString(),
+                Code = u.Name,
+                Remark = t2.Remark,
+                OrderNo = u.Value + OrderOffset,
+                TagType = u.Theme != "" ? u.Theme : DefaultTagType,
+            }).ToList()
+        }).SelectMany(x => x.Data).ToList();
+
         return (newDictType, newDictData);
     }
 
@@ -134,42 +136,70 @@ public class EnumToDictJob : IJob
     /// <returns>
     /// 一个元组,包含以下元素:
     /// <list type="table">
-    ///     <item><term>SysDictTypes</term><description>字典类型列表</description>
+    ///     <item><term>SysDictTypes</term><description>更新字典类型列表</description>
+    ///     </item>
+    ///     <item><term>SysDictDatas</term><description>更新字典数据列表</description>
     ///     </item>
-    ///     <item><term>SysDictDatas</term><description>字典数据列表</description>
+    ///     <item><term>SysDictDatas</term><description>新增字典数据列表</description>
     ///     </item>
     /// </list>
     /// </returns>
-    private (List<SysDictType>, List<SysDictData>) GetUpdatedDicts(List<EnumTypeOutput> updatedEnumType, Dictionary<string, SysDictType> sysDictTypeDict)
+    private (List<SysDictType>, List<SysDictData>, List<SysDictData>) GetUpdatedDicts(List<EnumTypeOutput> updatedEnumType, Dictionary<string, SysDictType> sysDictTypeDict)
     {
         var updatedSysDictTypes = new List<SysDictType>();
         var updatedSysDictData = new List<SysDictData>();
+        var newSysDictData = new List<SysDictData>();
         foreach (var e in updatedEnumType)
         {
-            if (sysDictTypeDict.TryGetValue(e.TypeName, out var value))
+            if (!sysDictTypeDict.TryGetValue(e.TypeName, out var value))
+                continue;
+
+            var updatedDictType = value;
+            updatedDictType.Name = e.TypeDescribe;
+            updatedDictType.Remark = e.TypeRemark;
+            updatedSysDictTypes.Add(updatedDictType);
+            var updatedDictData = updatedDictType.Children.Where(u => u.DictTypeId == updatedDictType.Id).ToList();
+
+            // 遍历需要更新的字典数据
+            foreach (var dictData in updatedDictData)
+            {
+                var enumData = e.EnumEntities.FirstOrDefault(u => dictData.Code == u.Name);
+                if (enumData != null)
+                {
+                    dictData.Value = enumData.Value.ToString();
+                    dictData.OrderNo = enumData.Value + OrderOffset;
+                    dictData.Name = enumData.Describe;
+                    dictData.TagType = enumData.Theme != "" ? enumData.Theme : dictData.TagType != "" ? dictData.TagType : DefaultTagType;
+                    updatedSysDictData.Add(dictData);
+                }
+            }
+
+            // 新增的枚举值名称列表
+            var newEnumDataNameList = e.EnumEntities.Select(u => u.Name).Except(updatedDictData.Select(u => u.Code));
+            foreach (var newEnumDataName in newEnumDataNameList)
             {
-                var updatedDictType = value;
-                updatedDictType.Name = e.TypeDescribe;
-                updatedDictType.Remark = e.TypeRemark;
-                updatedSysDictTypes.Add(updatedDictType);
-                var updatedDictData = updatedDictType.Children.Where(u => u.DictTypeId == updatedDictType.Id).ToList();
-
-                // 遍历需要更新的字典数据
-                foreach (var dictData in updatedDictData)
+                var enumData = e.EnumEntities.FirstOrDefault(u => newEnumDataName == u.Name);
+                if (enumData != null)
                 {
-                    var enumData = e.EnumEntities.Where(u => dictData.Code == u.Name).FirstOrDefault();
-                    if (enumData != null)
+                    var dictData = new SysDictData
                     {
-                        dictData.Value = enumData.Value.ToString();
-                        dictData.OrderNo = enumData.Value + OrderOffset;
-                        dictData.Name = enumData.Describe;
-                        dictData.TagType = enumData.Theme != "" ? enumData.Theme : dictData.TagType != "" ? dictData.TagType : DefaultTagType;
-                        updatedSysDictData.Add(dictData);
-                    }
+                        Id = YitIdHelper.NextId(),
+                        DictTypeId = updatedDictType.Id,
+                        Name = enumData.Describe,
+                        Value = enumData.Value.ToString(),
+                        Code = enumData.Name,
+                        Remark = updatedDictType.Remark,
+                        OrderNo = enumData.Value + OrderOffset,
+                        TagType = enumData.Theme != "" ? enumData.Theme : DefaultTagType,
+                    };
+                    dictData.TagType = enumData.Theme != "" ? enumData.Theme : dictData.TagType != "" ? dictData.TagType : DefaultTagType;
+                    newSysDictData.Add(dictData);
                 }
             }
+
+            // 删除的情况暂不处理
         }
 
-        return (updatedSysDictTypes, updatedSysDictData);
+        return (updatedSysDictTypes, updatedSysDictData, newSysDictData);
     }
 }