using Furion.DependencyInjection; using Furion.DynamicApiController; using Furion.FriendlyException; using GDZZ.Core.Entity; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace GDZZ.Core.Service; /// /// 通知公告服务 /// [ApiDescriptionSettings(Name = "Notice", Order = 100)] public class SysNoticeService : ISysNoticeService, IDynamicApiController, ITransient { private readonly SqlSugarRepository _sysNoticeRep; // 通知公告表仓储 private readonly ISysOnlineUserService _sysOnlineUserService; private readonly ISysNoticeUserService _sysNoticeUserService; private readonly SqlSugarRepository _sysEmpRep; public SysNoticeService(SqlSugarRepository sysNoticeRep, ISysNoticeUserService sysNoticeUserService, ISysOnlineUserService sysOnlineUserService, SqlSugarRepository sysEmpRep) { _sysNoticeRep = sysNoticeRep; _sysNoticeUserService = sysNoticeUserService; _sysOnlineUserService = sysOnlineUserService; _sysEmpRep=sysEmpRep; } /// /// 分页查询通知公告 /// /// /// [HttpGet("/sysNotice/page")] public async Task QueryNoticePageList([FromQuery] NoticeInput input) { var notices = await _sysNoticeRep.AsQueryable() .WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), u => u.Title.Contains(input.SearchValue.Trim()) || u.Content.Contains(input.SearchValue.Trim())) .WhereIF(input.Type > 0, u => u.Type == input.Type) .Where(u => u.Status != NoticeStatus.DELETED) .ToPagedListAsync(input.PageNo, input.PageSize); return notices.XnPagedResult(); } /// /// 增加通知公告 /// /// /// [HttpPost("/sysNotice/add")] public async Task AddNotice(AddNoticeInput input) { if (input.Status != NoticeStatus.DRAFT && input.Status != NoticeStatus.PUBLIC) throw Oops.Oh(ErrorCode.D7000); var notice = input.Adapt(); await UpdatePublicInfo(notice); // 如果是发布,则设置发布时间 if (input.Status == NoticeStatus.PUBLIC) notice.PublicTime = DateTime.Now; var newItem =await _sysNoticeRep.InsertReturnEntityAsync(notice); // 通知到的人 var noticeUserIdList = input.NoticeUserIdList; var noticeUserStatus = NoticeUserStatus.UNREAD; await _sysNoticeUserService.Add(newItem.Id, noticeUserIdList, noticeUserStatus); if (newItem.Status == NoticeStatus.PUBLIC) { await _sysOnlineUserService.PushNotice(newItem, noticeUserIdList); } } /// /// 删除通知公告 /// /// /// [HttpPost("/sysNotice/delete")] public async Task DeleteNotice(DeleteNoticeInput input) { var notice = await _sysNoticeRep.FirstOrDefaultAsync(u => u.Id == input.Id); if (notice.Status != NoticeStatus.DRAFT && notice.Status != NoticeStatus.CANCEL) // 只能删除草稿和撤回的 throw Oops.Oh(ErrorCode.D7001); await _sysNoticeRep.DeleteAsync(notice); } /// /// 更新通知公告 /// /// /// [HttpPost("/sysNotice/edit")] public async Task UpdateNotice(UpdateNoticeInput input) { if (input.Status != NoticeStatus.DRAFT && input.Status != NoticeStatus.PUBLIC) throw Oops.Oh(ErrorCode.D7000); // 非草稿状态 if (input.Status != NoticeStatus.DRAFT) throw Oops.Oh(ErrorCode.D7002); var notice = input.Adapt(); if (input.Status == NoticeStatus.PUBLIC) { notice.PublicTime = DateTime.Now; await UpdatePublicInfo(notice); } await _sysNoticeRep.UpdateAsync(notice); // 通知到的人 var noticeUserIdList = input.NoticeUserIdList; var noticeUserStatus = NoticeUserStatus.UNREAD; await _sysNoticeUserService.Update(input.Id, noticeUserIdList, noticeUserStatus); if (notice.Status == NoticeStatus.PUBLIC) { await _sysOnlineUserService.PushNotice(notice, noticeUserIdList); } } /// /// 获取通知公告详情 /// /// /// [HttpGet("/sysNotice/detail")] public async Task GetNotice([FromQuery] QueryNoticeInput input) { var notice = await _sysNoticeRep.FirstOrDefaultAsync(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.Name, ReadStatus = u.ReadStatus, ReadTime = u.ReadTime }; noticeUserReadInfoList.Add(noticeUserRead); }); } var noticeResult = notice.Adapt(); noticeResult.NoticeUserIdList = noticeUserIdList; noticeResult.NoticeUserReadInfoList = noticeUserReadInfoList; // 如果该条通知公告为已发布,则将当前用户的该条通知公告设置为已读 if (notice.Status == NoticeStatus.PUBLIC) await _sysNoticeUserService.Read(notice.Id, UserManager.UserId, NoticeUserStatus.READ); return noticeResult; } /// /// 修改通知公告状态 /// /// /// [HttpPost("/sysNotice/changeStatus")] public async Task ChangeStatus(ChangeStatusNoticeInput input) { // 状态应为撤回或删除或发布 if (input.Status != NoticeStatus.CANCEL && input.Status != NoticeStatus.DELETED && input.Status != NoticeStatus.PUBLIC) throw Oops.Oh(ErrorCode.D7000); var notice = await _sysNoticeRep.FirstOrDefaultAsync(u => u.Id == input.Id); notice.Status = input.Status; if (input.Status == NoticeStatus.CANCEL) { notice.CancelTime = DateTime.Now; } else if (input.Status == NoticeStatus.PUBLIC) { notice.PublicTime = DateTime.Now; } await _sysNoticeRep.UpdateAsync(notice); if (notice.Status == NoticeStatus.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) { var notices = await _sysNoticeRep.AsQueryable().InnerJoin((n, u) => n.Id == u.NoticeId) .Where((n, u) => u.UserId == UserManager.UserId) .WhereIF(!string.IsNullOrWhiteSpace(input.SearchValue), n => n.Title.Contains(input.SearchValue.Trim()) || n.Content.Contains(input.SearchValue.Trim())) .WhereIF(input.Type > 0, (n, u) => n.Type == input.Type) .Select() .ToPagedListAsync(input.PageNo, input.PageSize); return notices.XnPagedResult(); } /// /// 未处理消息 /// /// /// [HttpGet("/sysNotice/unread")] public async Task UnReadNoticeList([FromQuery] NoticeInput input) { var dic = typeof(NoticeType).EnumToList(); var notices = await _sysNoticeRep.AsQueryable().InnerJoin((n, u) => n.Id == u.NoticeId) .Where((n, u) => u.UserId == UserManager.UserId && u.ReadStatus== NoticeUserStatus.UNREAD).PartitionBy(n => n.Type).OrderBy(n=>n.CreatedTime,OrderByType.Desc).Take(input.PageSize).Select() .ToListAsync(); var count = await _sysNoticeRep.AsQueryable().InnerJoin((n, u) => n.Id == u.NoticeId).Where((n, u) => u.UserId == UserManager.UserId && u.ReadStatus == NoticeUserStatus.UNREAD).CountAsync(); List 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 emp = await _sysEmpRep.FirstOrDefaultAsync(u => u.Id == UserManager.UserId); notice.PublicUserId = UserManager.UserId; notice.PublicUserName = UserManager.Name; notice.PublicOrgId = emp.OrgId; notice.PublicOrgName = emp.OrgName; } }