ConstSelectorService.cs 3.3 KB

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