using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Security.Policy; using Wood.Data.Repository; using Wood.Entity; using Wood.Entity.SystemManage; using Wood.Service.BaseService; using Wood.Service.SystemManage.Dto; using Wood.Service.SystemManage.Manager; using Wood.Service.SystemManage.Param; using Wood.Util; using Wood.Util.JwtAuthorization; namespace Wood.Service.SystemManage { public class MessageService : ApiCRUDService { private UserManager _userManager { get; } private SqlSugarRepository _userMessageRepository { get; } private OrgManager _orgManager { get; } public MessageService(SqlSugarRepository repository, UserManager userManager, SqlSugarRepository userMessageRepository, OrgManager orgManager) : base(repository) { _userManager = userManager; _userMessageRepository = userMessageRepository; _orgManager = orgManager; } /// /// 发布通知公告 /// /// /// public async Task Publish(MessagePublishParam param) { var user = this.UserInfo(); if (!user!.IsAdmin) throw Oops.Oh("非管理员,无法发布!"); var message = await _repository.GetByIdAsync(param.Id); if (message == null) throw Oops.Oh("没有找到可发布的通知公告!"); message.Status = MessageStatusEnum.Published; message.PublishAt = DateTime.Now; message.PublisherId = user.UserId; message.PublisherName = user.RealName; message.PublisherOrgId = user.OrgId; message.PublisherOrgName = (await _orgManager.AsRepository().GetByIdAsync(user.OrgId))?.OrgName; message.MessageType = param.MessageType; // 更新发布状态和时间 await _repository.UpdateAsync(message); if (param.UserIds.Any()) { var ums = param.UserIds.Select(it => new UserMessageEntity { IsRead = false, MessageId = param.Id, UserId = it, }); await _userMessageRepository.InsertRangeAsync(ums.ToArray()); } else { var ids = await _userManager.GetOwnUserIdList(); var ums = ids.Select(it => new UserMessageEntity { IsRead = false, MessageId = param.Id, UserId = it, }); await _userMessageRepository.InsertRangeAsync(ums.ToArray()); } } /// /// 设置通知公告已读状态 /// /// /// [HttpGet] public async Task SetRead(BaseIdParam param) { await _userMessageRepository.UpdateAsync(u => new UserMessageEntity { IsRead = true, ReadTime = DateTime.Now }, u => u.Id == param.Id); } /// /// 设置通知公告已读状态 /// /// [HttpGet] public async ValueTask MessageCount() { var user = this.UserInfo(); return await _userMessageRepository.CountAsync(it => !it.IsRead && it.UserId == user!.UserId); } /// /// 设置所有通知公告已读状态 /// /// [HttpGet] public async Task SetAllRead() { var user = this.UserInfo(); await _userMessageRepository.UpdateAsync(u => new UserMessageEntity { IsRead = true, ReadTime = DateTime.Now }, u => u.UserId == user!.UserId); } /// /// 获取接收的通知公告 /// /// /// public async Task> PagedReceived(MessagePageReceivedParam param) { var user = this.UserInfo(); return await _userMessageRepository.AsQueryable().Includes(u => u.Message) .Where(u => u.UserId == user!.UserId) .WhereIF(!string.IsNullOrWhiteSpace(param.Title), u => u.Message!.Title!.Contains(param.Title! .Trim())) .WhereIF(param.Type.HasValue, u => u.Message!.MessageType == param.Type) .OrderBy(u => u.CreateTime, OrderByType.Desc) .Select(u => new MessagePageReceivedDto { Id = u.Id.SelectAll(), PublisherName = u.Message!.PublisherName, PublisherOrgName = u.Message!.PublisherOrgName, PublishAt=u.Message.PublishAt, Title = u.Message!.Title, MessageType = u.Message!.MessageType, }) .ToPagedListAsync(param.PageIndex, param.PageSize); } /// /// 获取发布的通知公告 /// /// /// public async Task> PagedPublish(MessagePagePublishParam param) { var user = this.UserInfo(); return await _repository.AsQueryable() .Where(u => u.CreateUserId == user!.UserId) .WhereIF(!string.IsNullOrWhiteSpace(param.Title), u => u!.Title!.Contains(param.Title! .Trim())) .WhereIF(param.Type.HasValue, u => u!.MessageType == param.Type) .OrderBy(u => u.CreateTime, OrderByType.Desc) .Select(it => new MessagePagedPublishDto { Id = it.Id.SelectAll() }) .ToPagedListAsync(param.PageIndex, param.PageSize); } /// /// 删除 /// /// /// public override async Task Delete(BaseIdListParam param) { if (param.Ids.Any()) { await _repository.FakeDeleteAsync(it => param.Ids.Contains(it.Id)); await _userMessageRepository.DeleteAsync(it => param.Ids.Contains(it.MessageId)); } } /// /// 撤回 /// /// /// public async Task Recalled(BaseIdListParam param) { if (param.Ids.Any()) { await _repository.AsUpdateable() .SetColumns(it => new MessageEntity { Status = MessageStatusEnum.Cancel, RecalledAt = DateTime.Now }) .Where(it => param.Ids.Contains(it.Id)).ExecuteCommandAsync(); await _userMessageRepository.DeleteAsync(it => param.Ids.Contains(it.MessageId)); } } } }