Jelajahi Sumber

bugfix: 😀修复字典数据缓存bug

Ir0nMax 1 tahun lalu
induk
melakukan
d42b456aad

+ 13 - 19
Admin.NET/Admin.NET.Core/Service/Dict/SysDictDataService.cs

@@ -68,7 +68,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D3003);
 
         var dictTypeCode = await _sysDictDataRep.AsQueryable().ClearFilter().Where(u => u.DictTypeId == input.DictTypeId).Select(u => u.DictType.Code).FirstAsync();
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictTypeCode}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictTypeCode}");
 
         await _sysDictDataRep.InsertAsync(input.Adapt<SysDictData>());
     }
@@ -90,7 +90,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D3003);
 
         var dictTypeCode = await _sysDictDataRep.AsQueryable().ClearFilter().Where(u => u.DictTypeId == input.DictTypeId).Select(u => u.DictType.Code).FirstAsync();
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictTypeCode}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictTypeCode}");
 
         await _sysDictDataRep.UpdateAsync(input.Adapt<SysDictData>());
     }
@@ -108,7 +108,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
         var dictData = await GetSysDictDataQueryable().FirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3004);
 
         var dictTypeCode = await GetSysDictDataQueryable().Where(u => u.DictTypeId == dictData.Id).Select(u => u.DictType.Code).FirstAsync();
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictTypeCode}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictTypeCode}");
 
         await _sysDictDataRep.DeleteAsync(dictData);
     }
@@ -136,7 +136,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
         var dictData = await _sysDictDataRep.AsQueryable().FirstAsync(u => u.Id == input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3004);
 
         var dictTypeCode = await _sysDictDataRep.AsQueryable().ClearFilter().Where(u => u.DictTypeId == dictData.Id).Select(u => u.DictType.Code).FirstAsync();
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictTypeCode}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictTypeCode}");
 
         dictData.Status = input.Status;
         await _sysDictDataRep.AsUpdateable(dictData).UpdateColumns(u => new { u.Status }, true).ExecuteCommandAsync();
@@ -150,15 +150,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     [NonAction]
     public async Task<List<SysDictData>> GetDictDataListByDictTypeId(long dictTypeId)
     {
-        var dictType = await SysDictTypeService.GetDetail(new DictTypeInput { Id = dictTypeId });
-        var dictDataList = _sysCacheService.Get<List<SysDictData>>($"{CacheConst.KeyDict}{dictTypeId}");
-
-        if (dictDataList == null)
-        {
-            dictDataList = await GetSysDictDataQueryable().Where(u => u.DictTypeId == dictTypeId).OrderBy(u => new { u.OrderNo, Code = u.Value }).ToListAsync();
-            _sysCacheService.Set($"{CacheConst.KeyDict}{dictType.Code}", dictDataList);
-        }
-        return dictDataList;
+        return await GetSysDictDataQueryable().Where(u => u.DictTypeId == dictTypeId).OrderBy(u => new { u.OrderNo, Code = u.Value }).ToListAsync();
     }
 
     /// <summary>
@@ -169,17 +161,18 @@ public class SysDictDataService : IDynamicApiController, ITransient
     [DisplayName("根据字典类型编码获取字典值集合")]
     public async Task<List<SysDictData>> GetDataList(string code)
     {
-        var dictDataList = _sysCacheService.Get<List<SysDictData>>($"{CacheConst.KeyDict}{code}");
+        var ids = GetTenantIdList();
+        var cacheKey = $"{CacheConst.KeyDict}{code}:{string.Join("|", ids)}";
+        var dictDataList = _sysCacheService.Get<List<SysDictData>>(cacheKey);
         if (dictDataList == null)
         {
-            var ids = GetTenantIdList();
             dictDataList = await _sysDictDataRep.Context.Queryable<SysDictType>().ClearFilter()
                 .LeftJoin<SysDictData>((u, a) => u.Id == a.DictTypeId)
-                .Where((u, a) => u.Code == code && u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable)
+                .Where((u, a) => u.Code == code && u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable && a.IsDelete == false)
                 .WhereIF(!_userManager.SuperAdmin, (u, a) => ids.Contains(u.TenantId.Value) && ids.Contains(a.TenantId.Value))
                 .OrderBy((u, a) => new { a.OrderNo, Code = a.Value })
                 .Select((u, a) => a).ToListAsync();
-            _sysCacheService.Set($"{CacheConst.KeyDict}{code}", dictDataList);
+            _sysCacheService.Set(cacheKey, dictDataList);
         }
         return dictDataList;
     }
@@ -217,7 +210,8 @@ public class SysDictDataService : IDynamicApiController, ITransient
     public ISugarQueryable<SysDictData> GetSysDictDataQueryable()
     {
         var ids = GetTenantIdList();
-        return _sysDictDataRep.AsQueryable().ClearFilter().WhereIF(!_userManager.SuperAdmin, u => ids.Contains(u.TenantId.Value));
+        return _sysDictDataRep.AsQueryable().ClearFilter()
+            .Where(u => u.IsDelete == false).WhereIF(!_userManager.SuperAdmin, u => ids.Contains(u.TenantId.Value));
     }
 
     /// <summary>
@@ -229,7 +223,7 @@ public class SysDictDataService : IDynamicApiController, ITransient
     public async Task DeleteDictData(long dictTypeId)
     {
         var dictTypeCode = await _sysDictDataRep.AsQueryable().Where(u => u.DictTypeId == dictTypeId).Select(u => u.DictType.Code).FirstAsync();
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictTypeCode}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictTypeCode}");
 
         await _sysDictDataRep.DeleteAsync(u => u.DictTypeId == dictTypeId);
     }

+ 5 - 4
Admin.NET/Admin.NET.Core/Service/Dict/SysDictTypeService.cs

@@ -101,7 +101,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
         var isExist = await _sysDictTypeRep.AsQueryable().ClearFilter().AnyAsync(u => u.Code == input.Code && u.Id != input.Id);
         if (isExist) throw Oops.Oh(ErrorCodeEnum.D3001);
 
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{input.Code}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{input.Code}");
         await _sysDictTypeRep.UpdateAsync(input.Adapt<SysDictType>());
     }
 
@@ -144,7 +144,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     {
         var dictType = await _sysDictTypeRep.GetByIdAsync(input.Id) ?? throw Oops.Oh(ErrorCodeEnum.D3000);
 
-        _sysCacheService.Remove($"{CacheConst.KeyDict}{dictType.Code}");
+        _sysCacheService.RemoveByPrefixKey($"{CacheConst.KeyDict}{dictType.Code}");
 
         dictType.Status = input.Status;
         await _sysDictTypeRep.AsUpdateable(dictType).UpdateColumns(u => new { u.Status }, true).ExecuteCommandAsync();
@@ -187,7 +187,7 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     {
         var ds = await GetSysDictDataQueryable()
             .InnerJoin<SysDictData>((u, a) => u.Id == a.DictTypeId).ClearFilter()
-            .Where((u, a) => u.IsDelete == false && u.Status == StatusEnum.Enable && a.IsDelete == false && a.Status == StatusEnum.Enable)
+            .Where((u, a) => u.Status == StatusEnum.Enable && a.Status == StatusEnum.Enable && a.IsDelete == false)
             .Select((u, a) => new { TypeCode = u.Code, a.Label, a.Value, a.Name, a.TagType, a.StyleSetting, a.ClassSetting, a.ExtData, a.Remark, a.OrderNo, a.Status })
             .ToListAsync();
         return ds.OrderBy(u => u.OrderNo).GroupBy(u => u.TypeCode).ToDictionary(u => u.Key, u => u);
@@ -201,7 +201,8 @@ public class SysDictTypeService : IDynamicApiController, ITransient
     public ISugarQueryable<SysDictType> GetSysDictDataQueryable()
     {
         var ids = GetTenantIdList();
-        return _sysDictTypeRep.AsQueryable().ClearFilter().WhereIF(!_userManager.SuperAdmin, u => ids.Contains(u.TenantId.Value));
+        return _sysDictTypeRep.AsQueryable().ClearFilter()
+            .Where(u => u.IsDelete == false).WhereIF(!_userManager.SuperAdmin, u => ids.Contains(u.TenantId.Value));
     }
 
     /// <summary>

+ 5 - 1
Admin.NET/Admin.NET.sln

@@ -54,6 +54,9 @@ Global
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{11EA630B-4600-4236-A117-CE6C6CD67586}.Release|Any CPU.Build.0 = Release|Any CPU
+		{57350E6A-B5A0-452C-9FD4-C69617C6DA30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{57350E6A-B5A0-452C-9FD4-C69617C6DA30}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{57350E6A-B5A0-452C-9FD4-C69617C6DA30}.Release|Any CPU.Build.0 = Release|Any CPU
 		{C4A288D5-0FAA-4F43-9072-B97635D7871D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{C4A288D5-0FAA-4F43-9072-B97635D7871D}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{C4A288D5-0FAA-4F43-9072-B97635D7871D}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -76,7 +79,8 @@ Global
 		{72EB89AB-15F7-4F85-88DB-7C2EF7C3D588}.Release|Any CPU.Build.0 = Release|Any CPU
 		{BFE4764F-1FF8-47A7-B4AD-085F7D8CD6C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{BFE4764F-1FF8-47A7-B4AD-085F7D8CD6C4}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{57350E6A-B5A0-452C-9FD4-C69617C6DA30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{BFE4764F-1FF8-47A7-B4AD-085F7D8CD6C4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{BFE4764F-1FF8-47A7-B4AD-085F7D8CD6C4}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE