namespace Admin.NET.Core.Service; /// /// 系统通知公告服务 /// [ApiDescriptionSettings(Name = "通知公告", Order = 100)] public class SysNoticeService : ISysNoticeService, IDynamicApiController, ITransient { private readonly SqlSugarRepository _sysNoticeRep; private readonly ISysOnlineUserService _sysOnlineUserService; private readonly ISysNoticeUserService _sysNoticeUserService; private readonly SqlSugarRepository _sysUserRep; private readonly IUserManager _userManager; public SysNoticeService(SqlSugarRepository sysNoticeRep, ISysNoticeUserService sysNoticeUserService, ISysOnlineUserService sysOnlineUserService, SqlSugarRepository sysUserRep, IUserManager userManager) { _sysNoticeRep = sysNoticeRep; _sysNoticeUserService = sysNoticeUserService; _sysOnlineUserService = sysOnlineUserService; _sysUserRep = sysUserRep; _userManager = userManager; } /// /// 分页查询通知公告 /// /// /// [HttpGet("/sysNotice/page")] public async Task QueryNoticePageList([FromQuery] NoticeInput input) { return await _sysNoticeRep.Context.Queryable() .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Content), u => u.Content.Contains(input.Content.Trim())) .WhereIF(input.Type > 0, u => u.Type == input.Type) .Where(u => u.Status != NoticeStatusEnum.DELETED) .ToPagedListAsync(input.Page, input.PageSize); } /// /// 增加通知公告 /// /// /// [HttpPost("/sysNotice/add")] public async Task AddNotice(AddNoticeInput input) { if (input.Status != NoticeStatusEnum.DRAFT && input.Status != NoticeStatusEnum.PUBLIC) throw Oops.Oh(ErrorCodeEnum.D7000); var notice = input.Adapt(); await UpdatePublicInfo(notice); // 如果是发布,则设置发布时间 if (input.Status == NoticeStatusEnum.PUBLIC) notice.PublicTime = DateTime.Now; var newItem = await _sysNoticeRep.AsInsertable(notice).ExecuteReturnEntityAsync(); // 通知到的人 var noticeUserIdList = input.NoticeUserIdList; var noticeUserStatus = NoticeUserStatusEnum.UNREAD; await _sysNoticeUserService.Add(newItem.Id, noticeUserIdList, noticeUserStatus); if (newItem.Status == NoticeStatusEnum.PUBLIC) { await _sysOnlineUserService.PushNotice(newItem, noticeUserIdList); } } /// /// 删除通知公告 /// /// /// [HttpPost("/sysNotice/delete")] public async Task DeleteNotice(DeleteNoticeInput input) { var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id); if (notice.Status != NoticeStatusEnum.DRAFT && notice.Status != NoticeStatusEnum.CANCEL) // 只能删除草稿和撤回的 throw Oops.Oh(ErrorCodeEnum.D7001); await _sysNoticeRep.DeleteAsync(notice); } /// /// 更新通知公告 /// /// /// [HttpPost("/sysNotice/edit")] public async Task UpdateNotice(UpdateNoticeInput input) { if (input.Status != NoticeStatusEnum.DRAFT && input.Status != NoticeStatusEnum.PUBLIC) throw Oops.Oh(ErrorCodeEnum.D7000); // 非草稿状态 if (input.Status != NoticeStatusEnum.DRAFT) throw Oops.Oh(ErrorCodeEnum.D7002); var notice = input.Adapt(); if (input.Status == NoticeStatusEnum.PUBLIC) { notice.PublicTime = DateTime.Now; await UpdatePublicInfo(notice); } await _sysNoticeRep.UpdateAsync(notice); // 通知到的人 var noticeUserIdList = input.NoticeUserIdList; var noticeUserStatus = NoticeUserStatusEnum.UNREAD; await _sysNoticeUserService.Update(input.Id, noticeUserIdList, noticeUserStatus); if (notice.Status == NoticeStatusEnum.PUBLIC) { await _sysOnlineUserService.PushNotice(notice, noticeUserIdList); } } /// /// 获取通知公告详情 /// /// /// [HttpGet("/sysNotice/detail")] public async Task GetNotice([FromQuery] QueryNoticeInput input) { var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id); // 获取通知到的用户 var noticeUserList = await _sysNoticeUserService.GetNoticeUserListByNoticeId(input.Id); var noticeUserIdList = new List(); var noticeUserReadInfoList = new List(); if (noticeUserList != null) { noticeUserList.ForEach(u => { noticeUserIdList.Add(u.UserId.ToString()); var noticeUserRead = new NoticeUserRead { UserId = u.UserId, UserName = _userManager.UserName, ReadStatus = u.ReadStatus, ReadTime = u.ReadTime }; noticeUserReadInfoList.Add(noticeUserRead); }); } var noticeResult = notice.Adapt(); noticeResult.NoticeUserIdList = noticeUserIdList; noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList; // 如果该条通知公告为已发布,则将当前用户的该条通知公告设置为已读 if (notice.Status == NoticeStatusEnum.PUBLIC) await _sysNoticeUserService.Read(notice.Id, _userManager.UserId, NoticeUserStatusEnum.READ); return noticeResult; } /// /// 修改通知公告状态 /// /// /// [HttpPost("/sysNotice/changeStatus")] public async Task ChangeStatus(ChangeStatusNoticeInput input) { // 状态应为撤回或删除或发布 if (input.Status != NoticeStatusEnum.CANCEL && input.Status != NoticeStatusEnum.DELETED && input.Status != NoticeStatusEnum.PUBLIC) throw Oops.Oh(ErrorCodeEnum.D7000); var notice = await _sysNoticeRep.GetFirstAsync(u => u.Id == input.Id); notice.Status = input.Status; if (input.Status == NoticeStatusEnum.CANCEL) { notice.CancelTime = DateTime.Now; } else if (input.Status == NoticeStatusEnum.PUBLIC) { notice.PublicTime = DateTime.Now; } await _sysNoticeRep.UpdateAsync(notice); if (notice.Status == NoticeStatusEnum.PUBLIC) { // 获取通知到的用户 var noticeUserList = await _sysNoticeUserService.GetNoticeUserListByNoticeId(input.Id); await _sysOnlineUserService.PushNotice(notice, noticeUserList.Select(m => m.UserId).ToList()); } } /// /// 获取接收的通知公告 /// /// /// [HttpGet("/sysNotice/received")] public async Task ReceivedNoticePageList([FromQuery] NoticeInput input) { return await _sysNoticeRep.Context.Queryable((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId)) .Where((n, u) => u.UserId == _userManager.UserId) .WhereIF(!string.IsNullOrWhiteSpace(input.Title), u => u.Title.Contains(input.Title.Trim())) .WhereIF(!string.IsNullOrWhiteSpace(input.Content), u => u.Title.Contains(input.Content.Trim())) .WhereIF(input.Type > 0, (n, u) => n.Type == input.Type) .Select() .ToPagedListAsync(input.Page, input.PageSize); } /// /// 未处理消息 /// /// /// [HttpGet("/sysNotice/unread")] public async Task UnReadNoticeList([FromQuery] NoticeInput input) { var dic = typeof(NoticeTypeEnum).EnumToList(); var notices = await _sysNoticeRep.Context.Queryable((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId)) .Where((n, u) => u.UserId == _userManager.UserId && u.ReadStatus == NoticeUserStatusEnum.UNREAD) .PartitionBy(n => n.Type).OrderBy(n => n.CreateTime, OrderByType.Desc) .Take(input.PageSize).Select().ToListAsync(); var count = await _sysNoticeRep.Context.Queryable((n, u) => new JoinQueryInfos(JoinType.Inner, n.Id == u.NoticeId)) .Where((n, u) => u.UserId == _userManager.UserId && u.ReadStatus == NoticeUserStatusEnum.UNREAD).CountAsync(); var noticeClays = new List(); int index = 0; foreach (var item in dic) { noticeClays.Add(new { Index = index++, Key = item.Describe, Value = item.Value, NoticeData = notices.Where(m => m.Type == item.Value).ToList() }); } return new { Rows = noticeClays, TotalRows = count }; } /// /// 更新发布信息 /// /// [NonAction] private async Task UpdatePublicInfo(SysNotice notice) { var user = await _sysUserRep.GetFirstAsync(u => u.Id == _userManager.UserId); notice.PublicUserId = _userManager.UserId; notice.PublicUserName = _userManager.UserName; notice.PublicOrgId = user.OrgId; // notice.PublicOrgName = user.OrgName; } }