using JNPF.Common.Core.Handlers; using JNPF.Common.Core.Manager; using JNPF.Common.Security; using JNPF.DependencyInjection; using JNPF.DynamicApiController; using JNPF.Message.Entitys; using JNPF.Message.Entitys.Dto.ImReply; using JNPF.Message.Interfaces; using JNPF.Systems.Entitys.Permission; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; namespace JNPF.Message; /// /// 业务实现:消息会话. /// [ApiDescriptionSettings(Tag = "Message", Name = "imreply", Order = 163)] [Route("api/message/[controller]")] public class ImReplyService : IImReplyService, IDynamicApiController, ITransient { /// /// 服务基础仓储. /// private readonly ISqlSugarRepository _repository; /// /// 用户管理. /// private readonly IUserManager _userManager; /// /// IM中心处理程序. /// private IMHandler _imHandler; /// /// 初始化一个类型的新实例. /// public ImReplyService( ISqlSugarRepository repository, IUserManager userManager, IMHandler imHandler) { _repository = repository; _userManager = userManager; _imHandler = imHandler; } /// /// 获取消息会话列表. /// /// [HttpGet("")] public async Task GetList() { var newObjectUserList = new List(); // 获取全部聊天对象列表 var objectList = _repository.AsSugarClient().UnionAll( _repository.AsQueryable().Where(i => i.ReceiveUserId == _userManager.UserId && (SqlFunc.IsNullOrEmpty(i.ImreplySendDeleteMark) || i.ImreplySendDeleteMark != _userManager.UserId)).Select(it => new ImReplyObjectIdOutput { userId = it.UserId, latestDate = it.ReceiveTime }), _repository.AsQueryable().Where(i => i.UserId == _userManager.UserId && (SqlFunc.IsNullOrEmpty(i.ImreplySendDeleteMark) || i.ImreplySendDeleteMark != _userManager.UserId)).Select(it => new ImReplyObjectIdOutput { userId = it.ReceiveUserId, latestDate = it.ReceiveTime })).MergeTable().GroupBy(it => new { it.userId }).Select(it => new { it.userId, latestDate = SqlFunc.AggregateMax(it.latestDate) }).ToList(); var objectUserList = objectList.Adapt>(); if (objectUserList.Count > 0) { var userList = await _repository.AsSugarClient().Queryable().In(it => it.Id, objectUserList.Select(it => it.userId).ToArray()).ToListAsync(); // 将用户信息补齐 userList.ForEach(item => { objectUserList.ForEach(it => { if (it.userId == item.Id) { it.account = item.Account; it.id = it.userId; it.realName = item.RealName; it.headIcon = "/api/File/Image/userAvatar/" + item.HeadIcon; var imContent = _repository.AsSugarClient().Queryable().Where(i => (i.SendUserId == _userManager.UserId && i.ReceiveUserId == it.userId) || (i.SendUserId == it.userId && i.ReceiveUserId == _userManager.UserId)).Where(i => i.SendTime.Equals(it.latestDate) && (SqlFunc.IsNullOrEmpty(i.SendDeleteMark) || i.SendDeleteMark != _userManager.UserId)).ToList().FirstOrDefault(); // 获取最信息 if (imContent != null) { it.latestMessage = imContent.Content; it.messageType = imContent.ContentType; } it.unreadMessage = _repository.AsSugarClient().Queryable().Where(i => i.SendUserId == it.userId && i.ReceiveUserId == _userManager.UserId).Where(i => i.State == 0 && (SqlFunc.IsNullOrEmpty(i.SendDeleteMark) || i.SendDeleteMark != _userManager.UserId)).Count(); } }); }); } return new { list = objectUserList.OrderByDescending(x => x.latestDate).ToList() }; } /// /// 删除聊天会话. /// /// 聊天人员UserId /// [HttpDelete("relocation/{id}")] public async Task DelMsgSession(string id) { var list = _repository.AsQueryable().Where(i => (i.UserId == _userManager.UserId && i.ReceiveUserId == id) || (i.UserId == id && i.ReceiveUserId == _userManager.UserId)).ToList(); if (list.Any(x => x.ImreplySendDeleteMark == id)) { await _repository.AsSugarClient().Deleteable(list).ExecuteCommandAsync(); } else { await _repository.AsSugarClient().Updateable(list).ReSetValue(it => { it.ImreplySendDeleteMark = _userManager.UserId; }).ExecuteCommandAsync(); } } /// /// 删除聊天记录. /// /// 聊天人员UserId /// [HttpDelete("deleteChatRecord/{id}")] public async Task DelMsgContent(string id) { var list = _repository.AsSugarClient().Queryable().Where(i => (i.SendUserId == _userManager.UserId && i.ReceiveUserId == id) || (i.SendUserId == id && i.ReceiveUserId == _userManager.UserId)).ToList(); if (list.Any(x => x.SendDeleteMark == id)) { await _repository.AsSugarClient().Deleteable(list).ExecuteCommandAsync(); } else { await _repository.AsSugarClient().Updateable(list).ReSetValue(it => { it.SendDeleteMark = _userManager.UserId; }).ExecuteCommandAsync(); } } /// /// 强制下线. /// /// [NonAction] public async void ForcedOffline(string connectionId) { await _imHandler.SendMessageAsync(connectionId, new { method = "logout", msg = "此账号已在其他地方登陆" }.ToJsonString()); } }