using Atomx.Common.Constants;
using Atomx.Common.Entities;
using Atomx.Common.Models;
namespace Atomx.Data.CacheServices
{
public partial interface ICacheService
{
///
/// 获取国家数据
///
///
Task> GetCountries(bool? reload = false);
///
/// 通过ID获取国家
///
///
///
Task GetCountry(long countryId);
///
/// 获取区域数据
///
///
///
Task> GetStateProvinces(long countryId, bool? reload = false);
///
/// 获取州省数据
///
///
///
///
Task GetStateProvince(long countryId, long stateProvinceId);
///
/// 获取地区数据
///
///
///
///
Task> GetAreas(long countryId, bool? reload = false);
///
/// 更新调整缓存数据
///
///
///
Task UpdateArea(Area area);
///
/// 更新调整州省缓存数据
///
///
///
Task UpdateStateProvince(StateProvince stateProvince);
///
/// 更新调整国家缓存数据
///
///
///
Task UpdateCountry(Country country);
///
/// 获取国家-省份-城市树形数据
///
///
///
Task> GetAreaTree(long countryId, bool? reload = false);
}
public partial class CacheService : ICacheService
{
public async Task> GetAreaTree(long countryId, bool? reload = false)
{
bool reloadData = reload.HasValue ? reload.Value : false;
var cacheData = await GetCacheAsync>($"{CacheKeys.CountryTree}{countryId}");
if (cacheData == null || reloadData)
{
var states = await GetStateProvinces(countryId, true);
var cities = await GetAreas(countryId, true);
var tree = new List();
foreach (var state in states)
{
var item = new KeyValueTree
{
Label = state.Name,
Value = state.Id.ToString()
};
var citysInState = cities.Where(p => p.StateProvinceId == state.Id).ToList();
foreach (var city in citysInState)
{
var cityItem = new KeyValueTree
{
Label = state.Name,
Value = state.Id.ToString()
};
cityItem.Children = BuildAreaTree(city.Id, cities, new List());
item.Children.Add(cityItem);
}
tree.Add(item);
}
await SetCacheAsync($"{CacheKeys.CountryTree}{countryId}", tree);
}
return cacheData;
}
public async Task> GetCountries(bool? reload = false)
{
bool reloadData = reload.HasValue ? reload.Value : false;
var cacheData = await GetCacheAsync>(CacheKeys.Country);
if (cacheData == null || reloadData)
{
var countries = (from p in _dbContext.Countries
where p.Enabled
select p).ToList();
await SetCacheAsync(CacheKeys.Country, countries);
return countries;
}
return cacheData;
}
public async Task GetCountry(long countryId)
{
var cacheData = await GetCountries();
var data = cacheData.SingleOrDefault(p => p.Id == countryId);
return data;
}
///
/// 获取区域数据
///
///
///
public async Task> GetStateProvinces(long countryId, bool? reload = false)
{
bool reloadData = reload.HasValue ? reload.Value : false;
var cacheData = await GetCacheAsync>($"{CacheKeys.StateProvince}.{countryId}");
if (cacheData == null || reloadData)
{
var stateProvinces = (from p in _dbContext.StateProvinces
where p.CountryId == countryId && p.Enabled
select p).ToList();
await SetCacheAsync($"{CacheKeys.StateProvince}.{countryId}", stateProvinces);
return stateProvinces;
}
return cacheData;
}
///
/// 获取州省数据
///
///
///
public async Task GetStateProvince(long countryId, long stateProvinceId)
{
var cacheData = await GetStateProvinces(countryId);
var data = cacheData.SingleOrDefault(p => p.Id == stateProvinceId);
return data;
}
///
/// 获取地区数据
///
///
///
///
public async Task> GetAreas(long countryId, bool? reload = false)
{
var cacheData = await GetCacheAsync>($"{CacheKeys.City}.{countryId}");
bool reloadData = reload.HasValue ? reload.Value : false;
if (cacheData == null || reloadData)
{
List areas = new();
var query = from p in _dbContext.Areas
where p.CountryId == countryId && p.Enabled
select p;
var count = query.Count();
int size = 50;
var pageCount = (int)Math.Ceiling(count / (double)size) + 1;
for (var i = 1; i < pageCount; i++)
{
var list = query.Skip((i - 1) * size).Take(size).ToList();
areas.AddRange(list);
}
await SetCacheAsync(CacheKeys.Country, areas);
return areas;
}
return cacheData;
}
public async Task UpdateArea(Area area)
{
var cacheData = await GetAreas(area.CountryId);
var data = cacheData.Where(p => p.Id == area.Id).SingleOrDefault();
if (data != null)
{
cacheData.Remove(data);
}
cacheData.Add(area);
await SetCacheAsync($"{CacheKeys.City}.{area.CountryId}", cacheData);
}
///
/// 更新调整州省缓存数据
///
///
///
public async Task UpdateStateProvince(StateProvince stateProvince)
{
var cacheData = await GetStateProvinces(stateProvince.CountryId);
var data = cacheData.Where(p => p.Id == stateProvince.Id).SingleOrDefault();
if (data != null)
{
cacheData.Remove(data);
}
cacheData.Add(stateProvince);
await SetCacheAsync($"{CacheKeys.StateProvince}.{stateProvince.CountryId}", cacheData);
}
///
/// 更新调整国家缓存数据
///
///
///
public async Task UpdateCountry(Country country)
{
var cacheData = await GetCountries();
var data = cacheData.Where(p => p.Id == country.Id).SingleOrDefault();
if (data != null)
{
cacheData.Remove(data);
}
cacheData.Add(country);
await SetCacheAsync($"{CacheKeys.Country}", cacheData);
}
private List BuildAreaTree(long parentId, List areas, List result)
{
var data = areas.Where(p => p.ParentId == parentId).ToList();
foreach (var area in areas)
{
var item = new KeyValueTree
{
Label = area.Name,
Value = area.Id.ToString()
};
var childs = areas.Where(p => p.ParentId == area.Id).ToList();
if (childs.Count > 0)
{
var childrenTrees = BuildAreaTree(area.Id, areas, result);
item.Children.AddRange(childrenTrees);
}
result.Add(item);
}
return result;
}
}
}