VzQueryAppServiceBase.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. using Abp.Application.Navigation;
  2. using Abp.Application.Services.Dto;
  3. using Abp.Auditing;
  4. using Abp.Authorization;
  5. using Abp.Domain.Repositories;
  6. using Abp.Linq.Extensions;
  7. using Abp.Runtime.Caching;
  8. using Abp.Runtime.Session;
  9. using Microsoft.EntityFrameworkCore;
  10. using System.Linq.Expressions;
  11. using VberZero.AppService.Base;
  12. using VberZero.AppService.Base.Dto;
  13. using VberZero.AppService.Helps.Dto;
  14. using VberZero.AppService.Query.Dto;
  15. using VberZero.AppService.Users.Dto;
  16. using VberZero.BaseSystem;
  17. using VberZero.BaseSystem.Roles;
  18. using VberZero.BaseSystem.Users;
  19. using VberZero.DomainService.AutoCompletes;
  20. using VberZero.Session;
  21. using VberZero.Tools.StringModel;
  22. using static System.String;
  23. namespace VberZero.AppService.Query;
  24. /// <summary>
  25. /// 公共查询
  26. /// </summary>
  27. [AbpAuthorize]
  28. [DisableAuditing]
  29. public class VzQueryAppServiceBase : VzAppServiceBase, IVzQueryAppService
  30. {
  31. #region 仓储
  32. public VzQueryAppServiceBase(
  33. IRepository<User, long> userRepository, ICacheManager cacheManager,
  34. IRepository<SysFunction, int?> funRepository, IRepository<SysHelp> helpRepository,
  35. IUserNavigationManager userNavigationManager, IRepository<AuditLog, long> logRepository, IRepository<Role, int> roleRepository)
  36. {
  37. UserRepository = userRepository;
  38. FunRepository = funRepository;
  39. HelpRepository = helpRepository;
  40. UserNavigationManager = userNavigationManager;
  41. LogRepository = logRepository;
  42. RoleRepository = roleRepository;
  43. AcQuery = NullAutoCompleteQueryManager.Instance;
  44. CacheManager = cacheManager;
  45. }
  46. protected IRepository<User, long> UserRepository { get; }
  47. protected IRepository<Role, int> RoleRepository { get; }
  48. protected IRepository<SysFunction, int?> FunRepository { get; }
  49. protected IRepository<SysHelp> HelpRepository { get; }
  50. protected IRepository<AuditLog, long> LogRepository { get; }
  51. protected IUserNavigationManager UserNavigationManager { get; }
  52. public IAutoCompleteQueryManager AcQuery { get; set; }
  53. #endregion 仓储
  54. #region SELECT
  55. #region SYSTEM
  56. [DisableAuditing]
  57. public async Task<string> GetUserSelectStr()
  58. {
  59. var list = await UserRepository.GetAllListAsync();
  60. var str = "<option value=\"\" selected >请选择用户...</option>";
  61. foreach (var l in list) str += $"<option value=\"{l.Id}\" >{l.Name}</option>";
  62. return str;
  63. }
  64. [DisableAuditing]
  65. public async Task<string> GetUserTypeSelectStr(int type = 0)
  66. {
  67. var str = "<option value=\"\" selected >请选择用户类型...</option>";
  68. if (type == 0)
  69. {
  70. str += await StatesManager.GetSelectStrAsync("UserRole.UserRoleType");
  71. }
  72. else
  73. {
  74. var userTypeStr = AbpSession.GetUserType().ToInt() + "";
  75. var isAdmin = AbpSession.GetUserName() == User.AdminUserName ||
  76. AbpSession.GetUserName() == User.SystemUserName;
  77. str += await StatesManager.GetSelectStrAsync("UserRole.UserRoleType",
  78. a => isAdmin || Compare(a.CodeValue, userTypeStr, StringComparison.Ordinal) > 0);
  79. }
  80. return str;
  81. }
  82. [DisableAuditing]
  83. public async Task<string> GetRoleTypeSelectStr(int type = 0)
  84. {
  85. var str = "<option value=\"\" selected >请选择角色类型...</option>";
  86. if (type == 0)
  87. {
  88. str += await StatesManager.GetSelectStrAsync("UserRole.UserRoleType");
  89. }
  90. else
  91. {
  92. var userTypeStr = AbpSession.GetUserType().ToInt() + "";
  93. var isAdmin = AbpSession.GetUserName() == User.AdminUserName ||
  94. AbpSession.GetUserName() == User.SystemUserName;
  95. str += await StatesManager.GetSelectStrAsync("UserRole.UserRoleType",
  96. a => isAdmin || Compare(a.CodeValue, userTypeStr, StringComparison.Ordinal) > 0);
  97. }
  98. return str;
  99. }
  100. [DisableAuditing]
  101. public async Task<string> GetGenderTypeSelectStr()
  102. {
  103. var str = "<option value=\"\" selected >请选择性别...</option>";
  104. str += await StatesManager.GetSelectStrAsync("Gender.Type");
  105. return str;
  106. }
  107. [DisableAuditing]
  108. public async Task<string[]> GetGenderTypeArrayStr()
  109. {
  110. List<string> strings = new List<string>();
  111. var list = await StatesManager.GetStateListAsync("Gender.Type");
  112. foreach (var s in list)
  113. {
  114. strings.Add(s.DisplayValue);
  115. strings.Add(s.CodeValue);
  116. }
  117. return strings.ToArray();
  118. }
  119. [DisableAuditing]
  120. public async Task<string> GetAccountTypeSelectStr()
  121. {
  122. var str = "<option value=\"\" selected >请选择账号类型...</option>";
  123. str += await StatesManager.GetSelectStrAsync("Account.AccountType");
  124. return str;
  125. }
  126. [DisableAuditing]
  127. public async Task<string> GetActiveStateSelectStr()
  128. {
  129. var str = "<option value=\"\" selected >请选择账号激活状态...</option>";
  130. str += await StatesManager.GetSelectStrAsync("Active.Status");
  131. return str;
  132. }
  133. [DisableAuditing]
  134. public async Task<string[]> GetActiveStateArrayStr()
  135. {
  136. List<string> strings = new List<string>();
  137. var list = await StatesManager.GetStateListAsync("Active.Status");
  138. foreach (var s in list)
  139. {
  140. strings.Add(s.DisplayValue);
  141. strings.Add(s.CodeValue);
  142. }
  143. return strings.ToArray();
  144. }
  145. [DisableAuditing]
  146. public async Task<string> GetFunctionTypeSelectStr()
  147. {
  148. var str = "<option value=\"\" selected >请选择菜单类型...</option>";
  149. str += await StatesManager.GetSelectStrAsync("Function.FunctionType");
  150. return str;
  151. }
  152. [DisableAuditing]
  153. public async Task<string> GetCalendarNotifyTypeSelectStr()
  154. {
  155. var str = "<option value=\"\" disabled>请选择通知类型...</option>";
  156. str += await StatesManager.GetSelectStrAsync("Calendar.NotifyType");
  157. return str;
  158. }
  159. [DisableAuditing]
  160. public async Task<string> GetWorkflowAuditStatusSelectStr()
  161. {
  162. var str = "<option value=\"\" disabled>请选择审核类型...</option>";
  163. str += await StatesManager.GetSelectStrAsync("WorkflowAudit.Status");
  164. return str;
  165. }
  166. [DisableAuditing]
  167. public async Task<string> GetWorkflowStatusSelectStr()
  168. {
  169. var str = "<option value=\"\" disabled>请选择类型...</option>";
  170. str += await StatesManager.GetSelectStrAsync("Workflow.Status");
  171. return str;
  172. }
  173. /// <summary>
  174. /// 查询是页面的功能菜单 select
  175. /// </summary>
  176. /// <returns></returns>
  177. [DisableAuditing]
  178. public Task<string> QueryFunctionPageSelectStr()
  179. {
  180. return QueryFunctionSelect(VzDefinition.FunctionType.Catalog, VzDefinition.FunctionType.Menu);
  181. }
  182. private async Task<string> QueryFunctionSelect(params VzDefinition.FunctionType[] types)
  183. {
  184. var list = await FunRepository.GetAllListAsync(a => types.Length == 0 || types.Contains(a.FunctionType));
  185. var str =
  186. "<option value=\"\" selected disabled>请选择功能菜单</option>"; //"<option value=\"\" selected >请选择类别...</option>";
  187. //var topParentPerm = list.FirstOrDefault(a => a.ParentNo == null)?.PermissionName ?? "";
  188. foreach (var l in list)
  189. {
  190. if (l.ParentNo == null)
  191. {
  192. str += $"<option value=\"{l.Id}\" >{l.DisplayName}</option>";
  193. continue;
  194. }
  195. if (!await PermissionChecker.IsGrantedAsync(l.PermissionName)) continue;
  196. str += $"<option parent=\"{l.ParentNo}\" value=\"{l.Id}\">{l.DisplayName}</option>";
  197. }
  198. return str;
  199. }
  200. [DisableAuditing]
  201. public async Task<string> GetHelpTypeSelectStr()
  202. {
  203. var str = "<option value=\"\" selected >请选择帮助目录类型...</option>";
  204. var userTypeStr = AbpSession.GetUserType().ToStr();
  205. str += await StatesManager.GetSelectStrAsync("SysHelp.HelpType",
  206. a => Compare(a.CodeValue, userTypeStr, StringComparison.Ordinal) >= 0);
  207. return str;
  208. }
  209. /// <summary>
  210. /// 日志服务名称
  211. /// </summary>
  212. /// <returns></returns>
  213. [DisableAuditing]
  214. public string GetLogServiceSelectStr()
  215. {
  216. var options = "<option value=\"\" >请选择日志类型...</option>";
  217. var list = LogRepository.GetAll().Where(a => a.LogType != 0).GroupBy(a => a.ServiceName).Select(a => a.Key);
  218. foreach (var l in list)
  219. {
  220. options += $"<option value='{l}' >{l}</option>";
  221. }
  222. return options;
  223. }
  224. /// <summary>
  225. /// 日志服务方法名称
  226. /// </summary>
  227. /// <param name="input"></param>
  228. /// <returns></returns>
  229. [DisableAuditing]
  230. public string GetLogMethodSelectStr(QueryMethodName input)
  231. {
  232. string options = "<option value=\"\" >请选择操作类型...</option>";
  233. var list = LogRepository.GetAll().Where(a =>
  234. a.LogType != 0 && (string.IsNullOrEmpty(input.ServiceName) || a.ServiceName == input.ServiceName)).GroupBy(a => a.MethodName).Select(a => a.Key);
  235. foreach (var l in list)
  236. {
  237. options += $"<option value='{l}' >{l}</option>";
  238. }
  239. return options;
  240. }
  241. //[DisableAuditing]
  242. //public async Task<string> GetSelectTreeStr()
  243. //{
  244. // var list = await Repository.GetAllListAsync();
  245. // string str = "";//"<option value=\"\" selected >请选择类别...</option>";
  246. // var topParentNo = list.FirstOrDefault(a => a.ParentNo == null)?.Id ?? "";
  247. // foreach (var l in list)
  248. // {
  249. // if (l.ParentNo == null)
  250. // {
  251. // str += $"<option value=\"\" selected disabled>请选择类别</option>";
  252. // continue;
  253. // }
  254. // str += $"<option parent=\"{(l.ParentNo == topParentNo ? "" : l.ParentNo)}\" value=\"{l.Id}\">{l.Name}</option>";
  255. // }
  256. // return str;
  257. //}
  258. #endregion SYSTEM
  259. #endregion SELECT
  260. #region AutoCompleteQuery
  261. /// <summary>
  262. /// 查询自动完成的搜索记录
  263. /// </summary>
  264. /// <param name="input"></param>
  265. /// <returns></returns>
  266. [DisableAuditing]
  267. public virtual async Task<PagedResultDto<AcQueryDto>> AcInfos(PageAcQueryDto input)
  268. {
  269. var query = await AcQuery.PageItems(input.CodeKey, input.NameKey, input.Skip, input.Take);
  270. var list = query.Items.Select(a => new AcQueryDto(a)).ToList();
  271. return new PagedResultDto<AcQueryDto>(query.TotalCount, list);
  272. }
  273. public virtual async Task<AcQueryDto> AcInfo(CreateAcQueryDto input)
  274. {
  275. var info = await AcQuery.QueryItem(input.CodeKey, input.ValueKey);
  276. return new AcQueryDto(info ?? new SysAutoCompleteQuery());
  277. }
  278. /// <summary>
  279. /// 增加自动完成搜索记录
  280. /// </summary>
  281. /// <param name="input"></param>
  282. /// <returns></returns>
  283. [DisableAuditing]
  284. public virtual async Task AddAcInfo(CreateAcQueryDto input)
  285. {
  286. await AcQuery.InsertOrUpdate(input.CodeKey, input.ValueKey, input.NameKey);
  287. }
  288. /// <summary>
  289. /// 查询未绑定的账号
  290. /// </summary>
  291. /// <param name="input"></param>
  292. /// <returns></returns>
  293. public virtual async Task<PagedResultDto<AcQueryDto>> UnBindUserAcInfos(UserAcQueryDto input)
  294. {
  295. var query = UserRepository.GetAll().Where(a =>
  296. a.IsActive && a.AccountType == input.AccountType && IsNullOrEmpty(a.AccountNo));
  297. var totalCount = await query.CountAsync();
  298. var list = await query.Select(a => new AcQueryDto
  299. {
  300. NameKey = a.Name,
  301. ValueKey = a.UserName
  302. }).ToListAsync();
  303. return new PagedResultDto<AcQueryDto>(totalCount, list);
  304. }
  305. #endregion AutoCompleteQuery
  306. #region User
  307. /// <summary>
  308. /// 查询用户信息
  309. /// </summary>
  310. /// <param name="input"></param>
  311. /// <returns></returns>
  312. [DisableAuditing]
  313. public virtual async Task<PagedResultDto<UserDto>> QueryUsers(VzPagedRequestDto input)
  314. {
  315. var query = UserRepository.GetAll().Where(a => a.IsActive);
  316. query = ApplyFilter(query, input);
  317. var totalCount = await query.CountAsync();
  318. query = query.OrderBy(a => a.Id);
  319. query = query.Skip(input.SkipCount).Take(input.MaxResultCount);
  320. var entities = await query.ToListAsync();
  321. var dtoList = new PagedResultDto<UserDto>(totalCount, ObjectMapper.Map<List<UserDto>>(entities));
  322. return dtoList;
  323. }
  324. /// <summary>
  325. /// 查询用户
  326. /// </summary>
  327. /// <param name="id"></param>
  328. /// <returns></returns>
  329. public virtual async Task<UserDto> QueryUserDtoById(long id)
  330. {
  331. var user = await CacheManager.GetCache<string, User>(VzConsts.CacheSystemUser)
  332. .GetAsync($"{id}", () => UserRepository.FirstOrDefaultAsync(a => a.Id == id));
  333. return ObjectMapper.Map<UserDto>(user);
  334. }
  335. /// <summary>
  336. /// 查询用户
  337. /// </summary>
  338. /// <param name="userName"></param>
  339. /// <returns></returns>
  340. public virtual async Task<UserDto> QueryUserDtoByUserName(string userName)
  341. {
  342. var user = await CacheManager.GetCache<string, User>(VzConsts.CacheSystemUser)
  343. .GetAsync($"{userName}", () => UserRepository.FirstOrDefaultAsync(a => a.UserName == userName));
  344. return ObjectMapper.Map<UserDto>(user);
  345. }
  346. /// <summary>
  347. /// 为工作流获取审核用户
  348. /// </summary>
  349. /// <param name="keyword"></param>
  350. /// <param name="take"></param>
  351. /// <returns></returns>
  352. public virtual async Task<Dictionary<string, string>> GetWfUser(string keyword, int take)
  353. {
  354. var query = UserRepository.GetAll().Where(a => a.IsActive && string.IsNullOrEmpty(keyword) || a.UserName.Contains(keyword) || a.Name.Contains(keyword) || a.Surname.Contains(keyword));
  355. query = query.OrderBy(a => a.CreationTime).Skip(0).Take(take);
  356. var users = await query.ToListAsync();
  357. var dic = new Dictionary<string, string>();
  358. foreach (var user in users)
  359. {
  360. dic.Add(user.Id + "", user.Surname);
  361. }
  362. return dic;
  363. }
  364. /// <summary>
  365. /// 为工作流获取审核角色
  366. /// </summary>
  367. /// <param name="keyword"></param>
  368. /// <param name="take"></param>
  369. /// <returns></returns>
  370. public virtual async Task<Dictionary<string, string>> GetWfRole(string keyword, int take)
  371. {
  372. var query = RoleRepository.GetAll().Where(a => a.Name.Contains(keyword) || a.DisplayName.Contains(keyword));
  373. query = query.OrderBy(a => a.CreationTime).Skip(0).Take(take);
  374. var roles = await query.ToListAsync();
  375. var dic = new Dictionary<string, string>();
  376. foreach (var role in roles)
  377. {
  378. dic.Add(role.Name + "", role.DisplayName);
  379. }
  380. return dic;
  381. }
  382. #endregion User
  383. #region Help
  384. /// <summary>
  385. /// 根据页面权限(permName)查询帮助信息
  386. /// </summary>
  387. /// <param name="id"></param>
  388. /// <returns></returns>
  389. public virtual async Task<List<SysHelpDto>> QueryHelpByPerm(string id)
  390. {
  391. var helps = await QueryHelps(a => a.Function.PermissionName == id);
  392. return helps;
  393. }
  394. /// <summary>
  395. /// 查询页面的帮助信息详情
  396. /// </summary>
  397. /// <param name="id"></param>
  398. /// <returns></returns>
  399. public virtual async Task<SysHelpDto> QueryHelpDto(int id)
  400. {
  401. return await CacheManager.GetCache<int, SysHelpDto>(VzConsts.CacheSysHelp).GetAsync(id,
  402. async () =>
  403. {
  404. var help = await HelpRepository.FirstOrDefaultAsync(a => a.Id == id);
  405. return ObjectMapper.Map<SysHelpDto>(help);
  406. });
  407. }
  408. /// <summary>
  409. /// 按照菜单查询页面帮助信息
  410. /// </summary>
  411. /// <returns></returns>
  412. public virtual async Task<List<MenuHelpDto>> QueryHelpByMenu()
  413. {
  414. var helps = await QueryHelps();
  415. var menu = await UserNavigationManager.GetMenuAsync("MainMenu", AbpSession.ToUserIdentifier());
  416. var list = new List<MenuHelpDto>();
  417. foreach (var item in menu.Items) BuildMenuHelps(list, item, helps);
  418. return list;
  419. }
  420. private async Task<List<SysHelpDto>> QueryHelps(Expression<Func<SysHelp, bool>> exp = null)
  421. {
  422. var userType = (VzDefinition.HelpType)AbpSession.GetUserType();
  423. var helps = await HelpRepository.GetAllIncluding(a => a.Function).Where(a => a.HelpType >= userType).WhereIf(exp != null, exp)
  424. .OrderBy(a => a.Sequence).Select(a => new SysHelpDto
  425. {
  426. Id = a.Id,
  427. HelpType = a.HelpType,
  428. Title = a.Title,
  429. KeyWords = a.KeyWords,
  430. FunctionNo = a.Id,
  431. FunctionDisplayName = a.Function != null ? a.Function.DisplayName : "",
  432. PermissionName = a.Function != null ? a.Function.PermissionName : "",
  433. Sequence = a.Sequence
  434. }).ToListAsync();
  435. return helps;
  436. }
  437. private void BuildMenuHelps(List<MenuHelpDto> list, UserMenuItem menu, List<SysHelpDto> helps)
  438. {
  439. var helpDtos = helps.Where(a => a.PermissionName == menu.Name).OrderBy(a => a.Sequence).ToList();
  440. if (helpDtos.Any())
  441. list.Add(new MenuHelpDto
  442. {
  443. Index = list.Count + 1,
  444. MenuName = menu.DisplayName,
  445. Helps = helpDtos
  446. });
  447. foreach (var item in menu.Items) BuildMenuHelps(list, item, helps);
  448. }
  449. #endregion Help
  450. }