using NCC.Common.Core.Manager; using NCC.Dependency; using NCC.DynamicApiController; using NCC.JsonSerialization; using NCC.Message.Entitys; using NCC.Message.Entitys.Dto.ImReply; using NCC.Message.Extensions; using NCC.Message.Interfaces; using NCC.System.Entitys.Permission; using Mapster; using Microsoft.AspNetCore.Mvc; using SqlSugar; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace NCC.Message.Service { /// /// 消息会话接口 /// [ApiDescriptionSettings(Tag = "Message", Name = "imreply", Order = 163)] [Route("api/message/[controller]")] public class ImReplyService : IImReplyService, IDynamicApiController, ITransient { private readonly ISqlSugarRepository _imReplyRepository; private readonly IUserManager _userManager; private readonly SqlSugarScope _db; /// /// 初始化一个类型的新实例 /// public ImReplyService(ISqlSugarRepository imReplyRepository, IUserManager userManager) { _imReplyRepository = imReplyRepository; _userManager = userManager; _db = _imReplyRepository.Context; } /// /// 获取消息会话列表 /// /// [HttpGet("")] public async Task GetList() { var userInfo = await _userManager.GetUserInfo(); var newObjectUserList = new List(); //获取全部聊天对象列表 var objectList = _db.UnionAll(_db.Queryable().Where(i => i.ReceiveUserId == userInfo.userId).Select(it => new { userId = it.UserId, latestDate = it.ReceiveTime }).MergeTable().Select(), _db.Queryable().Where(i => i.UserId == userInfo.userId).Select(it => new { userId = it.ReceiveUserId, latestDate = it.ReceiveTime }).MergeTable().Select()).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 _db.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 = _db.Queryable().Where(i => (i.SendUserId == userInfo.userId && i.ReceiveUserId == it.userId) || (i.SendUserId == it.userId && i.ReceiveUserId == userInfo.userId)).Where(i => i.SendTime.Equals(it.latestDate)).ToList().FirstOrDefault(); //获取最信息 if (imContent != null) { it.latestMessage = imContent.Content; it.messageType = imContent.ContentType; } it.unreadMessage = _db.Queryable().Where(i => i.SendUserId == it.userId && i.ReceiveUserId == userInfo.userId).Where(i => i.State == 0).Count(); } }); }); } var output = objectUserList.OrderByDescending(x => x.latestDate).ToList(); return new { list = output }; } /// /// /// /// [NonAction] public void ForcedOffline(string connectionId) { var onlineUser = WebSocketClientCollection._clients.Find(q => q.ConnectionId == connectionId); if (onlineUser != null) { onlineUser.SendMessageAsync(new { method = "logout", msg = "此账号已在其他地方登陆" }.Serialize()); WebSocketClientCollection._clients.RemoveAll((x) => x.ConnectionId == connectionId); } } } }