SysNoticeService.cs 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. namespace Admin.NET.Core.Service;
  2. /// <summary>
  3. /// 系统通知公告服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 100)]
  6. public class SysNoticeService : ISysNoticeService, IDynamicApiController, ITransient
  7. {
  8. private readonly UserManager _userManager;
  9. private readonly SqlSugarRepository<SysUser> _sysUserRep;
  10. private readonly SqlSugarRepository<SysNotice> _sysNoticeRep;
  11. private readonly SysOnlineUserService _sysOnlineUserService;
  12. private readonly ISysNoticeUserService _sysNoticeUserService;
  13. public SysNoticeService(
  14. UserManager userManager,
  15. SqlSugarRepository<SysUser> sysUserRep,
  16. SqlSugarRepository<SysNotice> sysNoticeRep,
  17. SysOnlineUserService sysOnlineUserService,
  18. ISysNoticeUserService sysNoticeUserService)
  19. {
  20. _userManager = userManager;
  21. _sysUserRep = sysUserRep;
  22. _sysNoticeRep = sysNoticeRep;
  23. _sysOnlineUserService = sysOnlineUserService;
  24. _sysNoticeUserService = sysNoticeUserService;
  25. }
  26. /// <summary>
  27. /// 分页查询通知公告
  28. /// </summary>
  29. /// <param name="input"></param>
  30. /// <returns></returns>
  31. [HttpGet("/sysNotice/page")]
  32. public async Task<dynamic> QueryNoticePageList([FromQuery] NoticeInput input)
  33. {
  34. return await _sysNoticeRep.Context.Queryable<SysNotice>()
  35. .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim()))
  36. .WhereIF(!string.IsNullOrWhiteSpace(input.Content), u => u.Content.Contains(input.Content.Trim()))
  37. .WhereIF(input.Type > 0, u => u.Type == input.Type)
  38. .Where(u => u.Status != NoticeStatusEnum.DELETED)
  39. .ToPagedListAsync(input.Page, input.PageSize);
  40. }
  41. /// <summary>
  42. /// 增加通知公告
  43. /// </summary>
  44. /// <param name="input"></param>
  45. /// <returns></returns>
  46. [HttpPost("/sysNotice/add")]
  47. public async Task AddNotice(AddNoticeInput input)
  48. {
  49. if (input.Status != NoticeStatusEnum.DRAFT && input.Status != NoticeStatusEnum.PUBLIC)
  50. throw Oops.Oh(ErrorCodeEnum.D7000);
  51. var notice = input.Adapt<SysNotice>();
  52. await UpdatePublicInfo(notice);
  53. // 如果是发布,则设置发布时间
  54. if (input.Status == NoticeStatusEnum.PUBLIC)
  55. notice.PublicTime = DateTime.Now;
  56. var newItem = await _sysNoticeRep.AsInsertable(notice).ExecuteReturnEntityAsync();
  57. // 通知到的人
  58. var noticeUserIdList = input.NoticeUserIdList;
  59. var noticeUserStatus = NoticeUserStatusEnum.UNREAD;
  60. await _sysNoticeUserService.Add(newItem.Id, noticeUserIdList, noticeUserStatus);
  61. if (newItem.Status == NoticeStatusEnum.PUBLIC)
  62. {
  63. await _sysOnlineUserService.AppendNotice(newItem, noticeUserIdList);
  64. }
  65. }
  66. /// <summary>
  67. /// 删除通知公告
  68. /// </summary>
  69. /// <param name="input"></param>
  70. /// <returns></returns>
  71. [HttpPost("/sysNotice/delete")]
  72. public async Task DeleteNotice(DeleteNoticeInput input)
  73. {
  74. var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id);
  75. if (notice.Status != NoticeStatusEnum.DRAFT && notice.Status != NoticeStatusEnum.CANCEL) // 只能删除草稿和撤回的
  76. throw Oops.Oh(ErrorCodeEnum.D7001);
  77. await _sysNoticeRep.DeleteAsync(notice);
  78. }
  79. /// <summary>
  80. /// 更新通知公告
  81. /// </summary>
  82. /// <param name="input"></param>
  83. /// <returns></returns>
  84. [HttpPost("/sysNotice/edit")]
  85. public async Task UpdateNotice(UpdateNoticeInput input)
  86. {
  87. if (input.Status != NoticeStatusEnum.DRAFT && input.Status != NoticeStatusEnum.PUBLIC)
  88. throw Oops.Oh(ErrorCodeEnum.D7000);
  89. // 非草稿状态
  90. if (input.Status != NoticeStatusEnum.DRAFT)
  91. throw Oops.Oh(ErrorCodeEnum.D7002);
  92. var notice = input.Adapt<SysNotice>();
  93. if (input.Status == NoticeStatusEnum.PUBLIC)
  94. {
  95. notice.PublicTime = DateTime.Now;
  96. await UpdatePublicInfo(notice);
  97. }
  98. await _sysNoticeRep.UpdateAsync(notice);
  99. // 通知到的人
  100. var noticeUserIdList = input.NoticeUserIdList;
  101. var noticeUserStatus = NoticeUserStatusEnum.UNREAD;
  102. await _sysNoticeUserService.Update(input.Id, noticeUserIdList, noticeUserStatus);
  103. if (notice.Status == NoticeStatusEnum.PUBLIC)
  104. {
  105. await _sysOnlineUserService.AppendNotice(notice, noticeUserIdList);
  106. }
  107. }
  108. /// <summary>
  109. /// 获取通知公告详情
  110. /// </summary>
  111. /// <param name="input"></param>
  112. /// <returns></returns>
  113. [HttpGet("/sysNotice/detail")]
  114. public async Task<NoticeDetailOutput> GetNotice([FromQuery] QueryNoticeInput input)
  115. {
  116. var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id);
  117. // 获取通知到的用户
  118. var noticeUserList = await _sysNoticeUserService.GetNoticeUserListByNoticeId(input.Id);
  119. var noticeUserIdList = new List<string>();
  120. var noticeUserReadInfoList = new List<NoticeUserRead>();
  121. if (noticeUserList != null)
  122. {
  123. noticeUserList.ForEach(u =>
  124. {
  125. noticeUserIdList.Add(u.UserId.ToString());
  126. var noticeUserRead = new NoticeUserRead
  127. {
  128. UserId = u.UserId,
  129. UserName = _userManager.Account,
  130. ReadStatus = u.ReadStatus,
  131. ReadTime = u.ReadTime
  132. };
  133. noticeUserReadInfoList.Add(noticeUserRead);
  134. });
  135. }
  136. var noticeResult = notice.Adapt<NoticeDetailOutput>();
  137. noticeResult.NoticeUserIdList = noticeUserIdList;
  138. noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList;
  139. // 如果该条通知公告为已发布,则将当前用户的该条通知公告设置为已读
  140. if (notice.Status == NoticeStatusEnum.PUBLIC)
  141. await _sysNoticeUserService.Read(notice.Id, _userManager.UserId, NoticeUserStatusEnum.READ);
  142. return noticeResult;
  143. }
  144. /// <summary>
  145. /// 修改通知公告状态
  146. /// </summary>
  147. /// <param name="input"></param>
  148. /// <returns></returns>
  149. [HttpPost("/sysNotice/changeStatus")]
  150. public async Task ChangeStatus(ChangeStatusNoticeInput input)
  151. {
  152. // 状态应为撤回或删除或发布
  153. if (input.Status != NoticeStatusEnum.CANCEL && input.Status != NoticeStatusEnum.DELETED && input.Status != NoticeStatusEnum.PUBLIC)
  154. throw Oops.Oh(ErrorCodeEnum.D7000);
  155. var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id);
  156. notice.Status = input.Status;
  157. if (input.Status == NoticeStatusEnum.CANCEL)
  158. {
  159. notice.CancelTime = DateTime.Now;
  160. }
  161. else if (input.Status == NoticeStatusEnum.PUBLIC)
  162. {
  163. notice.PublicTime = DateTime.Now;
  164. }
  165. await _sysNoticeRep.UpdateAsync(notice);
  166. if (notice.Status == NoticeStatusEnum.PUBLIC)
  167. {
  168. // 获取通知到的用户
  169. var noticeUserList = await _sysNoticeUserService.GetNoticeUserListByNoticeId(input.Id);
  170. await _sysOnlineUserService.AppendNotice(notice, noticeUserList.Select(m => m.UserId).ToList());
  171. }
  172. }
  173. /// <summary>
  174. /// 获取接收的通知公告
  175. /// </summary>
  176. /// <param name="input"></param>
  177. /// <returns></returns>
  178. [HttpGet("/sysNotice/received")]
  179. public async Task<dynamic> ReceivedNoticePageList([FromQuery] NoticeInput input)
  180. {
  181. return await _sysNoticeRep.Context.Queryable<SysNotice, SysNoticeUser>((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId))
  182. .Where((n, u) => u.UserId == _userManager.UserId)
  183. .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim()))
  184. .WhereIF(!string.IsNullOrWhiteSpace(input.Content), u => u.Title.Contains(input.Content.Trim()))
  185. .WhereIF(input.Type > 0, (n, u) => n.Type == input.Type)
  186. .Select<NoticeReceiveOutput>()
  187. .ToPagedListAsync(input.Page, input.PageSize);
  188. }
  189. /// <summary>
  190. /// 未处理消息
  191. /// </summary>
  192. /// <param name="input"></param>
  193. /// <returns></returns>
  194. [HttpGet("/sysNotice/unread")]
  195. public async Task<dynamic> UnReadNoticeList([FromQuery] NoticeInput input)
  196. {
  197. var dic = typeof(NoticeTypeEnum).EnumToList();
  198. var notices = await _sysNoticeRep.Context.Queryable<SysNotice, SysNoticeUser>((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId))
  199. .Where((n, u) => u.UserId == _userManager.UserId && u.ReadStatus == NoticeUserStatusEnum.UNREAD)
  200. .PartitionBy(n => n.Type).OrderBy(n => n.CreateTime, OrderByType.Desc)
  201. .Take(input.PageSize).Select<NoticeReceiveOutput>().ToListAsync();
  202. var count = await _sysNoticeRep.Context.Queryable<SysNotice, SysNoticeUser>((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId))
  203. .Where((n, u) => u.UserId == _userManager.UserId && u.ReadStatus == NoticeUserStatusEnum.UNREAD).CountAsync();
  204. var noticeClays = new List<dynamic>();
  205. int index = 0;
  206. foreach (var item in dic)
  207. {
  208. noticeClays.Add(new
  209. {
  210. Index = index++,
  211. Key = item.Describe,
  212. Value = item.Value,
  213. NoticeData = notices.Where(m => m.Type == item.Value).ToList()
  214. });
  215. }
  216. return new
  217. {
  218. Rows = noticeClays,
  219. TotalRows = count
  220. };
  221. }
  222. /// <summary>
  223. /// 更新发布信息
  224. /// </summary>
  225. /// <param name="notice"></param>
  226. [NonAction]
  227. private async Task UpdatePublicInfo(SysNotice notice)
  228. {
  229. var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId);
  230. notice.PublicUserId = _userManager.UserId;
  231. notice.PublicUserName = _userManager.Account;
  232. notice.PublicOrgId = user.OrgId;
  233. // notice.PublicOrgName = user.OrgName;
  234. }
  235. }