using Atomx.Common.Constant; using Atomx.Common.Entities; using Atomx.Common.Enums; using Atomx.Common.Models; using Atomx.Utils.Extension; using Mapster; namespace Atomx.Data.CacheServices { public partial interface ICacheService { /// /// 获取内容分类列表 /// /// /// Task> GetContentCategoryList(bool? reload = false); /// /// 获取产品分类列表 /// /// /// Task> GetProductCategoryList(bool? reload = false); /// /// 获取可用的缓存信息 /// /// Task> GetContentCategories(List? data = null); /// /// 通过ID获取或更新缓存 /// /// /// /// Task GetContentCategoryById(long id, Category? data = null); /// /// 从缓存中移除分类缓存 /// /// /// Task RemoveContentCategory(long id); /// /// 获取可用的缓存信息 /// /// /// Task> GetProductCategories(bool? reload = false); /// /// 通过ID获取或更新缓存 /// /// /// /// Task GetProductCategoryById(long id, Category? data = null); /// /// 重缓存中移除产品分类 /// /// /// Task RemoveProductCategory(long id); } public partial class CacheService : ICacheService { /// /// 获取内容分类列表 /// /// /// public async Task> GetContentCategoryList(bool? reload = false) { var cacheData = await GetCacheAsync>(CacheKeys.ContentCategories); bool needReload = reload.HasValue ? reload.Value : false; if (cacheData == null || needReload) { var category = _dbContext.Categories.Where(p => p.Type == (int)CategoryType.Content).ToList(); var list = new List(); cacheData = BuildCategoryList(list, category, 0); await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } return cacheData; } /// /// 获取产品分类列表 /// /// /// public async Task> GetProductCategoryList(bool? reload = false) { var cacheData = await GetCacheAsync>(CacheKeys.ProductCategories); bool needReload = reload.HasValue ? reload.Value : false; if (cacheData == null || needReload) { var category = _dbContext.Categories.Where(p => p.Type == (int)CategoryType.Product).ToList(); var list = new List(); cacheData = BuildCategoryList(list, category, 0); await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } return cacheData; } List BuildCategoryList(List list, List data, long parentId) { var categories = data.Where(p => p.ParentId == parentId).OrderBy(p => p.DisplayOrder).ToList(); foreach (var item in categories) { var category = item.Adapt(); if (!string.IsNullOrEmpty(item.Path)) { var ids = item.Path.Split(',').Select(p => p.ToLong()).ToList(); var breadcrumbs = string.Empty; foreach (var id in ids) { var name = data.Where(p => p.Id == id).Select(p => p.Name).SingleOrDefault(); if (!string.IsNullOrEmpty(breadcrumbs)) { breadcrumbs = breadcrumbs + " >> " + name; } else { breadcrumbs = name; } } category.Breadcrumbs = breadcrumbs; category.Breadcrumbs = breadcrumbs + " >> " + category.Name; } else { category.Breadcrumbs = item.Name; } list.Add(category); if (data.Count(p => p.ParentId == item.Id) > 0) { List childlist = new List(); childlist = BuildCategoryList(childlist, data, item.Id); list.AddRange(childlist); } } return list; } public async Task GetProductCategoryById(long id, Category? data = null) { var cacheData = await GetProductCategories(); if (data != null) { var category = cacheData.SingleOrDefault(p => p.Id == id); if (category != null) { cacheData.Remove(category); cacheData.Add(data); await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } else { cacheData.Add(data); await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } return data; } else { var category = cacheData.SingleOrDefault(p => p.Id == id); if (category == null) { category = _dbContext.Categories.SingleOrDefault(p => p.Id == id); if (category != null) { cacheData.Add(category); await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } } return category; } } public async Task RemoveProductCategory(long id) { var cacheData = await GetProductCategories(); if (cacheData != null) { var data = cacheData.SingleOrDefault(p => p.Id == id); if (data != null) { cacheData.Remove(data); await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } } } public async Task> GetContentCategories(List? data = null) { var cacheData = await GetCacheAsync>(CacheKeys.ContentCategories); if (data != null) { cacheData = data; await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } else { if (cacheData == null) { return new List(); } } return cacheData; } /// /// 获取可用的缓存信息 /// /// /// public async Task> GetProductCategories(bool? reload = false) { var cacheData = await GetCacheAsync>(CacheKeys.ProductCategories); bool needReload = reload.HasValue ? reload.Value : false; if (cacheData == null || needReload) { var data = _dbContext.Categories.Where(p => p.Type == (int)CategoryType.Product && p.Enabled).ToList(); cacheData = data; await SetCacheAsync(CacheKeys.ProductCategories, cacheData); } else { if (cacheData == null) { return new List(); } } return cacheData; } public async Task GetContentCategoryById(long id, Category? data = null) { var cacheData = await GetContentCategories(); if (data != null) { var category = cacheData.SingleOrDefault(p => p.Id == id); if (category != null) { cacheData.Remove(category); cacheData.Add(data); await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } else { cacheData.Add(data); await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } return data; } else { var category = cacheData.SingleOrDefault(p => p.Id == id); if (category == null) { category = _dbContext.Categories.SingleOrDefault(p => p.Id == id); if (category != null) { cacheData.Add(category); await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } } return category; } } public async Task RemoveContentCategory(long id) { var cacheData = await GetContentCategories(); if (cacheData != null) { var data = cacheData.SingleOrDefault(p => p.Id == id); if (data != null) { cacheData.Remove(data); await SetCacheAsync(CacheKeys.ContentCategories, cacheData); } } } } }