QuestionApplicationService.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Linq;
  5. using System.Threading.Tasks;
  6. using System.Web.Mvc;
  7. using Abp.Application.Services.Dto;
  8. using Abp.Auditing;
  9. using Abp.Authorization;
  10. using Abp.Domain.Repositories;
  11. using Abp.Runtime.Caching;
  12. using IwbZero.Auditing;
  13. using IwbZero.AppServiceBase;
  14. using IwbZero.ToolCommon.Lambda;
  15. using WeOnlineApp.Authorization.Users;
  16. using WeOnlineApp.Configuration;
  17. using WeOnlineApp.Question.Dto;
  18. using WeOnlineApp.TrainingCamp;
  19. using IwbZero.ToolCommon.StringModel;
  20. namespace WeOnlineApp.Question
  21. {
  22. [AbpAuthorize, AuditLog("问题")]
  23. public class QuestionAppService : IwbAsyncCrudAppService<QuestionInfo, QuestionDto, string, IwbPagedRequestDto, QuestionCreateDto, QuestionUpdateDto >, IQuestionAppService
  24. {
  25. public QuestionAppService(
  26. ICacheManager cacheManager,
  27. IRepository<QuestionInfo, string> repository, IRepository<QuestionAnswerInfo,string> qaRepository, IRepository<CampInfo, string> campRepository, IRepository<User, long> userRepository, IRepository<QuestionFavoriteInfo> qfRepository) : base(repository, "Id")
  28. {
  29. QaRepository = qaRepository;
  30. CampRepository = campRepository;
  31. UserRepository = userRepository;
  32. QfRepository = qfRepository;
  33. CacheManager = cacheManager;
  34. }
  35. protected override bool KeyIsAuto { get; set; } = false;
  36. protected IRepository<QuestionAnswerInfo,string> QaRepository { get; }
  37. protected IRepository<CampInfo,string> CampRepository { get; }
  38. protected IRepository<QuestionFavoriteInfo> QfRepository { get; }
  39. protected IRepository<User,long> UserRepository { get; }
  40. #region GetSelect
  41. [DisableAuditing]
  42. public override async Task<List<SelectListItem>> GetSelectList()
  43. {
  44. var list = await Repository.GetAllListAsync();
  45. var sList = new List<SelectListItem> {new SelectListItem {Text = @"请选择...", Value = "", Selected = true}};
  46. foreach (var l in list)
  47. {
  48. //sList.Add(new SelectListItem { Value = l.Id, Text = l. });
  49. }
  50. return sList;
  51. }
  52. [DisableAuditing]
  53. public override async Task<string> GetSelectStr()
  54. {
  55. var list = await Repository.GetAllListAsync();
  56. string str = "<option value=\"\" selected>请选择...</option>";
  57. foreach (var l in list)
  58. {
  59. //str += $"<option value=\"{l.Id}\">{l.}</option>";
  60. }
  61. return str;
  62. }
  63. #endregion
  64. #region CURD
  65. //[AbpAuthorize(PermissionNames.PagesQuestionMgCreate)]
  66. [AuditLog("提问")]
  67. public override async Task Create(QuestionCreateDto input)
  68. {
  69. var camp = await CampRepository.FirstOrDefaultAsync(a => a.Id == input.CampNo);
  70. if (camp != null)
  71. {
  72. input.SubjectCategoryNo = camp.SubjectType;
  73. }
  74. input.Id = await AppGuidManager.GetNextRecordIdAsync(DataLibType.Question);
  75. input.QuestionState = QuestionStateDefinition.New;
  76. await CreateEntity(input);
  77. }
  78. //[AbpAuthorize(PermissionNames.PagesQuestionMgUpdate)]
  79. public override async Task Update(QuestionUpdateDto input)
  80. {
  81. await UpdateEntity(input);
  82. }
  83. //[AbpAuthorize(PermissionNames.PagesQuestionMgDelete)]
  84. public override Task Delete(EntityDto<string> input)
  85. {
  86. return DeleteEntity(input);
  87. }
  88. [DisableAuditing]
  89. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  90. public override async Task<PagedResultDto<QuestionDto>> GetAll(IwbPagedRequestDto input)
  91. {
  92. var query = CreateFilteredQuery(input);
  93. //query = ApplyFilter(query, input);
  94. var totalCount = await AsyncQueryableExecuter.CountAsync(query);
  95. query = ApplySorting(query, input);
  96. query = ApplyPaging(query, input);
  97. var q1 = query.Select(a => new QuestionDto()
  98. {
  99. Id = a.Id,
  100. Title = a.Title,
  101. QuestionState = a.QuestionState,
  102. AnswerDateTime = a.AnswerDateTime,
  103. IsFavorite = false,
  104. SubjectCategoryNo = a.SubjectCategoryNo,
  105. SubjectCategoryName = a.SubjectCategory.CategoryName,
  106. CampName = a.Camp.Name
  107. }); ;
  108. var entities = await AsyncQueryableExecuter.ToListAsync(q1);
  109. var dtoList = new PagedResultDto<QuestionDto>(totalCount, entities);
  110. return dtoList;
  111. }
  112. #region GetEntity/Dto
  113. /// <summary>
  114. /// 查询实体Dto
  115. /// </summary>
  116. /// <param name="input"></param>
  117. /// <returns></returns>
  118. [DisableAuditing]
  119. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  120. public override async Task<QuestionDto> GetDto(EntityDto<string> input)
  121. {
  122. var entity = await GetEntity(input);
  123. return MapToEntityDto(entity);
  124. }
  125. /// <summary>
  126. /// 查询实体Dto
  127. /// </summary>
  128. /// <param name="id"></param>
  129. /// <returns></returns>
  130. [DisableAuditing]
  131. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  132. public override async Task<QuestionDto> GetDtoById(string id)
  133. {
  134. var entity = await GetEntityById(id);
  135. return MapToEntityDto(entity);
  136. }
  137. /// <summary>
  138. /// 查询实体Dto(需指明自定义字段)
  139. /// </summary>
  140. /// <param name="no"></param>
  141. /// <returns></returns>
  142. [DisableAuditing]
  143. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  144. public override async Task<QuestionDto> GetDtoByNo(string no)
  145. {
  146. var entity = await GetEntityByNo(no);
  147. return MapToEntityDto(entity);
  148. }
  149. /// <summary>
  150. /// 查询实体
  151. /// </summary>
  152. /// <param name="input"></param>
  153. /// <returns></returns>
  154. [DisableAuditing]
  155. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  156. public override async Task<QuestionInfo> GetEntity(EntityDto<string> input)
  157. {
  158. var entity = await GetEntityById(input.Id);
  159. return entity;
  160. }
  161. /// <summary>
  162. /// 查询实体
  163. /// </summary>
  164. /// <param name="id"></param>
  165. /// <returns></returns>
  166. [DisableAuditing]
  167. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  168. public override async Task<QuestionInfo> GetEntityById(string id)
  169. {
  170. return await Repository.FirstOrDefaultAsync(a=>a.Id==id);
  171. }
  172. /// <summary>
  173. /// 查询实体(需指明自定义字段)
  174. /// </summary>
  175. /// <param name="no"></param>
  176. /// <returns></returns>
  177. [DisableAuditing]
  178. //[AbpAuthorize(PermissionNames.PagesQuestionMgQuery)]
  179. public override async Task<QuestionInfo> GetEntityByNo(string no)
  180. {
  181. //CheckGetPermission();
  182. if (string.IsNullOrEmpty(KeyFiledName))
  183. {
  184. ThrowError("NoKeyFieldName");
  185. }
  186. return await base.GetEntityByNo(no);
  187. }
  188. #endregion
  189. #region Hide
  190. /// <summary>
  191. /// 根据给定的<see cref="IwbPagedRequestDto"/>创建 <see cref="IQueryable{QuestionInfo}"/>过滤查询.
  192. /// </summary>
  193. /// <param name="input">The input.</param>
  194. protected override IQueryable<QuestionInfo> CreateFilteredQuery(IwbPagedRequestDto input)
  195. {
  196. var query = Repository.GetAllIncluding(a=>a.SubjectCategory,a=>a.Camp,a=>a.Favorites);
  197. var pagedInput = input as IIwbPagedRequest;
  198. if (pagedInput == null)
  199. {
  200. return query;
  201. }
  202. query = query.Where(a =>
  203. string.IsNullOrEmpty(input.KeyWords) || a.SubjectCategory.CategoryPath.Contains(input.KeyWords));
  204. if (!string.IsNullOrEmpty(input.KeyField))
  205. {
  206. query = query.Where(a => a.Favorites.Count(s => s.UserId == AbpSession.UserId) > 0);
  207. }
  208. if (pagedInput.SearchList != null && pagedInput.SearchList.Count > 0)
  209. {
  210. List<LambdaObject> objList = new List<LambdaObject>();
  211. foreach (var o in pagedInput.SearchList)
  212. {
  213. if (string.IsNullOrEmpty(o.KeyWords))
  214. continue;
  215. object keyWords = o.KeyWords;
  216. objList.Add(new LambdaObject
  217. {
  218. FieldType = (LambdaFieldType)o.FieldType,
  219. FieldName = o.KeyField,
  220. FieldValue = keyWords,
  221. ExpType = (LambdaExpType)o.ExpType
  222. });
  223. }
  224. var exp = objList.GetExp<QuestionInfo>();
  225. query = exp != null ? query.Where(exp) : query;
  226. }
  227. return query;
  228. }
  229. //protected override IQueryable<QuestionInfo> ApplySorting(IQueryable<QuestionInfo> query, IwbPagedRequestDto input)
  230. //{
  231. // return query.OrderBy(a => a.No);
  232. //}
  233. //protected override IQueryable<QuestionInfo> ApplyPaging(IQueryable<QuestionInfo> query, IwbPagedRequestDto input)
  234. //{
  235. // if (input is IPagedResultRequest pagedInput)
  236. // {
  237. // return query.Skip(pagedInput.SkipCount).Take(pagedInput.MaxResultCount);
  238. // }
  239. // return query;
  240. //}
  241. #endregion
  242. #endregion
  243. /// <summary>
  244. /// 查询问题详情
  245. /// </summary>
  246. /// <param name="no"></param>
  247. /// <returns></returns>
  248. [DisableAuditing]
  249. public async Task<QuestionDto> GeQuestionDetail(string no)
  250. {
  251. var entity = await Repository.GetAllIncluding(a => a.Camp, a => a.SubjectCategory,a=>a.AnswerInfos)
  252. .FirstOrDefaultAsync(a => a.Id == no);
  253. if (entity == null)
  254. {
  255. CheckErrors("未查询到问题!");
  256. return null;
  257. }
  258. var dto = new QuestionDto()
  259. {
  260. Id = entity.Id,
  261. Title = entity.Title,
  262. QuestionState = entity.QuestionState,
  263. AnswerDateTime = entity.AnswerDateTime,
  264. SubjectCategoryNo = entity.SubjectCategoryNo,
  265. SubjectCategoryName = entity.SubjectCategory.CategoryName,
  266. IsFavorite =
  267. (await QfRepository.CountAsync(a => a.QuestionNo == entity.Id && a.UserId == AbpSession.UserId)) >
  268. 0,
  269. Camp = entity.Camp,
  270. CampName = entity.Camp.Name,
  271. ContentInfo = entity.ContentInfo,
  272. Answers = entity.AnswerInfos.Where(a => a.AnswerNo == null).OrderByDescending(a => a.AnswerState)
  273. .ThenByDescending(a => a.Id).Skip(0).Take(IwbConsts.AnswerTakeCount).Select(AnswerDtoMap).ToList(),
  274. CreatorUserId = entity.CreatorUserId
  275. };
  276. return dto;
  277. }
  278. /// <summary>
  279. /// 获取答疑回复
  280. /// </summary>
  281. /// <param name="input"></param>
  282. /// <returns></returns>
  283. [DisableAuditing]
  284. public async Task<List<AnswerDto>> GetChildAnswer(QueryChildAnswerDto input)
  285. {
  286. var query = QaRepository.GetAll();
  287. if (input.QuestionNo.IsEmpty())
  288. {
  289. query = query.Where(a => a.AnswerNo == input.AnswerNo);
  290. }
  291. else
  292. {
  293. query = query.Where(a => a.QuestionNo == input.QuestionNo);
  294. }
  295. query = query.OrderByDescending(a => a.AnswerState).ThenByDescending(a => a.Id);
  296. int skip = input.Skip ?? 0, take = input.Take ?? IwbConsts.AnswerTakeCount;
  297. query = query.Skip(skip).Take(take);
  298. var entities = await query.ToListAsync();
  299. var list = entities.Select(AnswerDtoMap).ToList();
  300. return list;
  301. }
  302. private AnswerDto AnswerDtoMap(QuestionAnswerInfo input)
  303. {
  304. var dto = ObjectMapper.Map<AnswerDto>(input);
  305. dto.ChildrenCount = QaRepository.Count(a => a.AnswerNo == input.Id);
  306. var user = QueryUserInfo(input.CreatorUserId);
  307. dto.ImagePath = user?.AvatarImagePath;
  308. dto.UserName = user?.UserName;
  309. dto.RealName = user?.Name;
  310. return dto;
  311. }
  312. private User QueryUserInfo(long? id)
  313. {
  314. return CacheManager.GetCache(IwbCacheNames.UserInfoCache).Get($"{id}", () =>
  315. {
  316. var user = UserRepository.FirstOrDefault(a => a.Id == id);
  317. return user;
  318. });
  319. }
  320. /// <summary>
  321. /// 答疑
  322. /// </summary>
  323. /// <param name="input"></param>
  324. /// <returns></returns>
  325. [AuditLog("答疑")]
  326. public async Task<AnswerDto> AddAnswer(AnswerDto input)
  327. {
  328. input.Id = $"QA{DateTime.Now:yyyyMMddHHmmssfff}";
  329. input.AnswerNo = input.AnswerNo.IsEmpty() ? null : input.AnswerNo;
  330. input.AnswerState = AnswerStateDefinition.New;
  331. var answer = ObjectMapper.Map<QuestionAnswerInfo>(input);
  332. answer = await QaRepository.InsertAsync(answer);
  333. await CurrentUnitOfWork.SaveChangesAsync();
  334. var dto = AnswerDtoMap(answer);
  335. return dto;
  336. }
  337. /// <summary>
  338. /// 收藏
  339. /// </summary>
  340. /// <param name="input"></param>
  341. /// <returns></returns>
  342. [AuditLog("收藏")]
  343. public async Task Favorite(FavoriteDto input)
  344. {
  345. var entity = await GetEntity(input);
  346. if (entity == null)
  347. {
  348. CheckErrors("未查询到问题!");
  349. return;
  350. }
  351. if (input.IsFavorite)
  352. {
  353. await QfRepository.InsertAsync(new QuestionFavoriteInfo()
  354. {
  355. QuestionNo = entity.Id,
  356. UserId = AbpSession.UserId ?? 0
  357. });
  358. }
  359. else
  360. {
  361. await QfRepository.DeleteAsync(a =>
  362. a.QuestionNo == entity.Id && a.UserId == AbpSession.UserId);
  363. }
  364. //entity.IsFavorite = input.IsFavorite;
  365. await CurrentUnitOfWork.SaveChangesAsync();
  366. }
  367. /// <summary>
  368. /// 采纳答疑
  369. /// </summary>
  370. /// <param name="input"></param>
  371. /// <returns></returns>
  372. [AuditLog("采纳答疑")]
  373. public async Task SelectAnswer(SelectAnswerDto input)
  374. {
  375. var entity = await GetEntity(input);
  376. if (entity == null)
  377. {
  378. CheckErrors("未查询到问题!");
  379. return;
  380. }
  381. var answer = await QaRepository.FirstOrDefaultAsync(a => a.Id == input.AnswerNo);
  382. if (answer == null)
  383. {
  384. CheckErrors("未查询到答疑!");
  385. return;
  386. }
  387. entity.QuestionState = QuestionStateDefinition.Answer;
  388. entity.AnswerNo = answer.Id;
  389. entity.AnswerDateTime=DateTime.Now;
  390. await Repository.UpdateAsync(entity);
  391. answer.AnswerState = AnswerStateDefinition.Answer;
  392. await QaRepository.UpdateAsync(answer);
  393. await CurrentUnitOfWork.SaveChangesAsync();
  394. }
  395. }
  396. }