VzAppServiceBase.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. using System.Linq.Dynamic.Core;
  2. using Abp.Application.Services;
  3. using Abp.Application.Services.Dto;
  4. using Abp.Linq.Extensions;
  5. using Abp.Runtime.Caching;
  6. using Abp.Runtime.Session;
  7. using Abp.UI;
  8. using Microsoft.AspNetCore.Identity;
  9. using VberZero.AppService.Base.Dto;
  10. using VberZero.Authorization.Users;
  11. using VberZero.BaseSystem.MultiTenancy;
  12. using VberZero.BaseSystem.Users;
  13. using VberZero.DomainService.AppGuids;
  14. using VberZero.DomainService.Attaches;
  15. using VberZero.DomainService.AutoCompletes;
  16. using VberZero.DomainService.States;
  17. using VberZero.IdentityFramework;
  18. using VberZero.Session;
  19. using VberZero.Tools.Lambda;
  20. namespace VberZero.AppService.Base;
  21. public abstract class VzAppServiceBase : ApplicationService
  22. {
  23. public ICacheManager CacheManager { get; set; }
  24. public new IVzSession AbpSession { get; set; }
  25. public IAttachManager AttachManager { get; set; }
  26. public ISysStatesManager StatesManager { get; set; }
  27. public IAppGuidManager AppGuidManager { get; set; }
  28. public IAutoCompleteQueryManager QueryAcManager { get; set; }
  29. protected virtual VzTenantManager TenantManager { get; set; }
  30. protected virtual VzUserManager UserManager { get; set; }
  31. protected VzAppServiceBase()
  32. {
  33. LocalizationSourceName = VzConsts.LocalizationSourceName;
  34. AttachManager = NullAttachManager.Instance;
  35. StatesManager = NullSysStatesManager.Instance;
  36. AppGuidManager = NullAppGuidManager.Instance;
  37. QueryAcManager = NullAutoCompleteQueryManager.Instance;
  38. AbpSession = NullVzSession.Instance;
  39. }
  40. protected virtual async Task<User> GetCurrentUserAsync()
  41. {
  42. var user = await UserManager.FindByIdAsync(AbpSession.GetUserId().ToString());
  43. if (user == null)
  44. {
  45. throw new Exception("There is no current user!");
  46. }
  47. return user;
  48. }
  49. protected virtual Task<Tenant> GetCurrentTenantAsync()
  50. {
  51. return TenantManager.GetByIdAsync(AbpSession.GetTenantId());
  52. }
  53. /// <summary>
  54. /// 过滤查询条件
  55. /// </summary>
  56. protected virtual IQueryable<T> ApplyFilter<T>(IQueryable<T> query, IVzPagedRequestDto input)
  57. {
  58. if (!(input is { } pagedInput))
  59. {
  60. return query;
  61. }
  62. if (!string.IsNullOrEmpty(pagedInput.KeyWords))
  63. {
  64. query = pagedInput.KeyField.ToLower() == "keyword" ? KeyWordFilter(query, pagedInput.KeyWords) : KeyWordFilter(query, pagedInput);
  65. }
  66. query = SearchListFilter(query, pagedInput);
  67. return query;
  68. }
  69. /// <summary>
  70. /// 关键字查询
  71. /// </summary>
  72. /// <typeparam name="T"></typeparam>
  73. /// <param name="query"></param>
  74. /// <param name="pagedInput"></param>
  75. /// <returns></returns>
  76. protected virtual IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, string pagedInput)
  77. {
  78. return query;
  79. }
  80. /// <summary>
  81. /// 关键字查询
  82. /// </summary>
  83. /// <typeparam name="T"></typeparam>
  84. /// <param name="query"></param>
  85. /// <param name="pagedInput"></param>
  86. /// <returns></returns>
  87. protected virtual IQueryable<T> KeyWordFilter<T>(IQueryable<T> query, IVzPagedRequestDto pagedInput)
  88. {
  89. if (!string.IsNullOrEmpty(pagedInput.KeyWords) && !string.IsNullOrEmpty(pagedInput.KeyField) && pagedInput.KeyField.ToLower() != "keyword")
  90. {
  91. object keyWords = pagedInput.KeyWords;
  92. LambdaObject obj = new LambdaObject()
  93. {
  94. FieldType = (LambdaFieldType)pagedInput.FieldType,
  95. FieldName = pagedInput.KeyField,
  96. FieldValue = keyWords,
  97. ExpType = (LambdaExpType)pagedInput.ExpType
  98. };
  99. var exp = obj.GetExp<T>();
  100. query = exp != null ? query.Where(exp) : query;
  101. }
  102. return query;
  103. }
  104. /// <summary>
  105. /// 多个条件查询
  106. /// </summary>
  107. /// <typeparam name="T"></typeparam>
  108. /// <param name="query"></param>
  109. /// <param name="pagedInput"></param>
  110. /// <returns></returns>
  111. protected IQueryable<T> SearchListFilter<T>(IQueryable<T> query, IVzPagedRequestDto pagedInput)
  112. {
  113. if (pagedInput.SearchList != null && pagedInput.SearchList.Count > 0)
  114. {
  115. List<LambdaObject> objList = SelfFilter(pagedInput.SearchList) ?? new List<LambdaObject>();
  116. foreach (var o in pagedInput.SearchList)
  117. {
  118. if (o.HasUse || string.IsNullOrEmpty(o.KeyWords))
  119. continue;
  120. object keyWords = o.KeyWords;
  121. objList.Add(new LambdaObject
  122. {
  123. FieldType = (LambdaFieldType)o.FieldType,
  124. FieldName = o.KeyField,
  125. FieldValue = keyWords,
  126. ExpType = (LambdaExpType)o.ExpType
  127. });
  128. }
  129. var exp = objList.GetExp<T>();
  130. query = exp != null ? query.Where(exp) : query;
  131. }
  132. return query;
  133. }
  134. /// <summary>
  135. /// 特殊条件时,自定义查询 (使用完该字段查询条件时,应该从list里清楚)
  136. /// </summary>
  137. /// <param name="list"></param>
  138. /// <returns></returns>
  139. protected virtual List<LambdaObject> SelfFilter(List<MultiSearchDto> list)
  140. {
  141. return null;
  142. }
  143. /// <summary>
  144. /// 排序
  145. /// </summary>
  146. /// <param name="query">The query.</param>
  147. /// <param name="input">The input.</param>
  148. protected virtual IQueryable<T> ApplySorting<T>(IQueryable<T> query, IVzPagedRequestDto input)
  149. {
  150. return _ApplySorting(query, input);
  151. }
  152. /// <summary>
  153. /// 排序
  154. /// </summary>
  155. /// <param name="query">The query.</param>
  156. /// <param name="input">The input.</param>
  157. protected IQueryable<T> _ApplySorting<T>(IQueryable<T> query, IVzPagedRequestDto input)
  158. {
  159. //Try to sort query if available
  160. if (input is ISortedResultRequest sortInput)
  161. {
  162. return string.IsNullOrWhiteSpace(sortInput.Sorting)
  163. ? SelfSorting(query, input)
  164. : query.OrderBy(sortInput.Sorting);
  165. }
  166. //No sorting
  167. return query;
  168. }
  169. /// <summary>
  170. /// 默认自定义排序
  171. /// </summary>
  172. /// <typeparam name="T"></typeparam>
  173. /// <param name="query"></param>
  174. /// <param name="input"></param>
  175. /// <returns></returns>
  176. protected virtual IQueryable<T> SelfSorting<T>(IQueryable<T> query, IVzPagedRequestDto input)
  177. {
  178. return query;
  179. }
  180. /// <summary>
  181. /// 分页
  182. /// </summary>
  183. /// <param name="query">The query.</param>
  184. /// <param name="input">The input.</param>
  185. protected virtual IQueryable<T> ApplyPaging<T>(IQueryable<T> query, IVzPagedRequestDto input)
  186. {
  187. return _ApplyPaging(query, input);
  188. }
  189. /// <summary>
  190. /// 分页
  191. /// </summary>
  192. /// <param name="query">The query.</param>
  193. /// <param name="input">The input.</param>
  194. protected IQueryable<T> _ApplyPaging<T>(IQueryable<T> query, IVzPagedRequestDto input)
  195. {
  196. //Try to use paging if available
  197. if (input is IPagedResultRequest pagedInput)
  198. {
  199. return query.PageBy(pagedInput);
  200. }
  201. //Try to limit query result if available
  202. if (input is ILimitedResultRequest limitedInput)
  203. {
  204. return query.Take(limitedInput.MaxResultCount);
  205. }
  206. //No paging
  207. return query;
  208. }
  209. protected virtual void CheckErrors(string error)
  210. {
  211. throw new UserFriendlyException(error);
  212. }
  213. /// <summary>
  214. /// 抛出错误
  215. /// </summary>
  216. /// <param name="err"></param>
  217. /// <param name="isLocalization">是否要本地化</param>
  218. protected virtual void ThrowError(string err, bool isLocalization = true)
  219. {
  220. CheckErrors(isLocalization ? L(err) : err);
  221. }
  222. protected virtual void CheckErrors(IdentityResult identityResult)
  223. {
  224. identityResult.CheckErrors(LocalizationManager);
  225. }
  226. }