ConstSelectorService.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 常量下拉框服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Name = "常量下拉框", Order = 189)]
  6. public class ConstSelectorService : IDynamicApiController, ITransient
  7. {
  8. private readonly IDistributedCache _cache;
  9. public ConstSelectorService(IDistributedCache cache)
  10. {
  11. _cache = cache;
  12. }
  13. /// <summary>
  14. /// 获取所有常量下拉框列表
  15. /// </summary>
  16. /// <returns></returns>
  17. [AllowAnonymous]
  18. [HttpGet("/constSelector/allConstSelector")]
  19. public async Task<List<SelectorDto>> GetAllConstSelector()
  20. {
  21. var key = $"{CacheConst.KeyConstSelector}AllSelector";
  22. var json = await _cache.GetStringAsync(key);
  23. if (!string.IsNullOrWhiteSpace(json))
  24. {
  25. return json.ToObject<List<SelectorDto>>();
  26. }
  27. var typeList = await GetAllTypesAsync();
  28. var selectData = typeList.Select(x => new SelectorDto
  29. {
  30. Name = x.CustomAttributes.ToList().FirstOrDefault()?.ConstructorArguments.ToList().FirstOrDefault().Value?.ToString() ?? x.Name,
  31. Code = x.Name
  32. }).ToList();
  33. await _cache.SetStringAsync(key, selectData.ToJson());
  34. return selectData;
  35. }
  36. /// <summary>
  37. /// 根据类名获取下拉框数据
  38. /// </summary>
  39. /// <param name="typeName"></param>
  40. /// <returns></returns>
  41. [AllowAnonymous]
  42. [HttpGet("/constSelector/constSelector")]
  43. public async Task<List<SelectorDto>> GetConstSelector(string typeName)
  44. {
  45. var key = $"{CacheConst.KeyConstSelector}{typeName.ToUpper()}";
  46. var json = await _cache.GetStringAsync(key);
  47. if (!string.IsNullOrWhiteSpace(json))
  48. {
  49. return json.ToObject<List<SelectorDto>>();
  50. }
  51. var typeList = await GetAllTypesAsync();
  52. var type = typeList.FirstOrDefault(x => x.Name == typeName);
  53. var isEnum = type.BaseType.Name == "Enum";
  54. var selectData = type.GetFields()?
  55. .Where(isEnum, x => x.FieldType.Name == typeName)
  56. .Select(x => new SelectorDto
  57. {
  58. Name = x.Name,
  59. Code = isEnum ? (int)x.GetValue(BindingFlags.Instance) : x.GetValue(BindingFlags.Instance)
  60. }).ToList();
  61. await _cache.SetStringAsync(key, selectData.ToJson());
  62. return selectData;
  63. }
  64. /// <summary>
  65. /// 获取所有下拉框及选项 用于前端缓存
  66. /// </summary>
  67. /// <returns></returns>
  68. [AllowAnonymous]
  69. [HttpGet("/constSelector/allConstSelectorWithOptions")]
  70. public async Task<List<SelectorDto>> GetAllConstSelectorWithOptions()
  71. {
  72. var selectors = await GetAllConstSelector();
  73. foreach (var p in selectors)
  74. {
  75. p.Data = await GetConstSelector(Convert.ToString(p.Code));
  76. }
  77. return selectors;
  78. }
  79. /// <summary>
  80. /// 获取所有常量
  81. /// </summary>
  82. /// <returns></returns>
  83. private async Task<List<Type>> GetAllTypesAsync()
  84. {
  85. return await Task.Run(() =>
  86. {
  87. var typeList = AppDomain.CurrentDomain.GetAssemblies()
  88. .SelectMany(x => x.GetTypes())
  89. .Where(x => x.CustomAttributes.Any(y => y.AttributeType == typeof(ConstSelectorAttribute)))
  90. .ToList();
  91. return typeList;
  92. });
  93. }
  94. }