namespace Admin.NET.Core.Service;
///
/// 常量下拉框服务
///
[ApiDescriptionSettings(Name = "常量下拉框", Order = 189)]
[AllowAnonymous]
public class ConstSelectorService : IDynamicApiController, ITransient
{
private readonly ISysCacheService _sysCacheService;
public ConstSelectorService(ISysCacheService sysCacheService)
{
_sysCacheService = sysCacheService;
}
///
/// 获取所有常量下拉框列表
///
///
[HttpGet("/constSelector/allConstSelector")]
public async Task> GetAllConstSelector()
{
var key = $"{CacheConst.KeyConstSelector}AllSelector";
var json = await _sysCacheService.GetStringAsync(key);
if (!string.IsNullOrWhiteSpace(json))
{
return json.ToObject>();
}
var typeList = await GetAllTypesAsync();
var selectData = typeList.Select(x => new SelectorDto
{
Name = x.CustomAttributes.ToList().FirstOrDefault()?.ConstructorArguments.ToList().FirstOrDefault().Value?.ToString() ?? x.Name,
Code = x.Name
}).ToList();
await _sysCacheService.SetStringAsync(key, selectData.ToJson());
return selectData;
}
///
/// 根据类名获取下拉框数据
///
///
///
[HttpGet("/constSelector/constSelector")]
public async Task> GetConstSelector(string typeName)
{
var key = $"{CacheConst.KeyConstSelector}{typeName.ToUpper()}";
var json = await _sysCacheService.GetStringAsync(key);
if (!string.IsNullOrWhiteSpace(json))
{
return json.ToObject>();
}
var typeList = await GetAllTypesAsync();
var type = typeList.FirstOrDefault(x => x.Name == typeName);
var isEnum = type.BaseType.Name == "Enum";
var selectData = type.GetFields()?
.Where(isEnum, x => x.FieldType.Name == typeName)
.Select(x => new SelectorDto
{
Name = x.Name,
Code = isEnum ? (int)x.GetValue(BindingFlags.Instance) : x.GetValue(BindingFlags.Instance)
}).ToList();
await _sysCacheService.SetStringAsync(key, selectData.ToJson());
return selectData;
}
///
/// 获取所有下拉框及选项 用于前端缓存
///
///
[HttpGet("/constSelector/allConstSelectorWithOptions")]
public async Task> GetAllConstSelectorWithOptions()
{
var selectors = await GetAllConstSelector();
foreach (var p in selectors)
{
p.Data = await GetConstSelector(Convert.ToString(p.Code));
}
return selectors;
}
///
/// 获取所有常量
///
///
private async Task> GetAllTypesAsync()
{
return await Task.Run(() =>
{
var typeList = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(x => x.GetTypes())
.Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(ConstSelectorAttribute)))
.ToList();
return typeList;
});
}
}