SysNoticeService.cs 9.9 KB

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