using NCC.Common.Filter; using NCC.Dependency; using NCC.LinqBuilder; using NCC.Message.Entitys; using NCC.Message.Entitys.Dto.IM; using NCC.Message.Entitys.Model.IM; using NCC.Message.Interfaces.Message; using Mapster; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using Yitter.IdGenerator; namespace NCC.Message.Service.Message { ///     /// 聊天内容     /// 版 本:V1.20.15     /// 版 权:Wesley(https://www.NCCsoft.com)     /// 作 者:NCC开发平台组     /// 日 期:2022-03-16     /// public class IMContentService : IIMContentService, ITransient { private readonly ISqlSugarRepository _IMContentRepository; private readonly ISqlSugarRepository _imReplyRepository; /// /// /// public IMContentService(ISqlSugarRepository IMContentRepository, ISqlSugarRepository imReplyRepository) { _IMContentRepository = IMContentRepository; _imReplyRepository = imReplyRepository; } /// /// 获取消息列表 /// /// 分页参数 /// 发送者 /// 接收者 /// public dynamic GetMessageList(string sendUserId, string receiveUserId, PageInputBase input) { var orderByType = input.sort == "asc" ? OrderByType.Asc : OrderByType.Desc; var list = _IMContentRepository.Entities.Select(it => new IMContentListOutput { id = it.Id, sendUserId = it.SendUserId, sendTime = it.SendTime, receiveUserId = it.ReceiveUserId, receiveTime = it.ReceiveTime, content = it.Content, contentType = it.ContentType, state = it.State }).MergeTable() .OrderBy(it => it.sendTime, orderByType) .WhereIF(!string.IsNullOrEmpty(input.keyword), it => it.content.Contains(input.keyword)) .Where(i => (i.sendUserId == sendUserId && i.receiveUserId == receiveUserId) || (i.sendUserId == receiveUserId && i.receiveUserId == sendUserId)) .ToPagedList(input.currentPage, input.pageSize); if (input.sort == "desc") { list.list = list.list.ToList().OrderBy(it => it.sendTime); } return PageResult.SqlSugarPageResult(list); } /// /// 获取未读消息条数 /// /// 接收者 /// public int GetUnreadCount(string receiveUserId) { return _IMContentRepository.Entities.Where(x => x.State == 0 && x.ReceiveUserId == receiveUserId).ToList().Count; } /// /// 获取未读消息内容 /// /// 接收者 /// public List GetUnreadList(string receiveUserId) { var list = _IMContentRepository.Context.Queryable().Where(x => x.ReceiveUserId == receiveUserId).Select(x => new IMContentEntity { State = SqlFunc.AggregateSum(SqlFunc.IIF(x.State == 0, 1, 0)), SendUserId = x.SendUserId, ReceiveUserId = x.ReceiveUserId }).GroupBy(x => new { x.SendUserId, x.ReceiveUserId }).MergeTable().ToList().Where(x => x.State > 0).ToList(); var list1 = _IMContentRepository.Entities.Where(x => x.ReceiveUserId == receiveUserId).OrderBy(x => x.SendTime, OrderByType.Desc).ToList(); var output = list.Adapt>(); foreach (var item in output) { var entity = list1.FirstOrDefault(x => x.SendUserId == item.sendUserId); item.defaultMessage = entity.Content; item.defaultMessageType = entity.ContentType; item.defaultMessageTime = entity.SendTime.ToString(); ; } return output; } /// /// 已读消息 /// /// /// /// public int ReadMessage(string sendUserId, string receiveUserId) { return _IMContentRepository.Context.Updateable().SetColumns(x => x.State == 1).SetColumns(x => x.ReceiveTime == DateTime.Now).Where(x => x.State == 0 && x.SendUserId == sendUserId && x.ReceiveUserId == receiveUserId).ExecuteCommand(); } /// /// 发送消息 /// /// /// /// /// /// public int SendMessage(string sendUserId, string receiveUserId, string message, string messageType) { IMContentEntity entity = new IMContentEntity(); entity.Id = YitIdHelper.NextId().ToString(); entity.SendUserId = sendUserId; entity.SendTime = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")); entity.ReceiveUserId = receiveUserId; entity.State = 0; entity.Content = message; entity.ContentType = messageType; //写入到会话表中 var isExist = _imReplyRepository.Any(it => it.UserId == sendUserId && it.ReceiveUserId == receiveUserId); if (isExist) { var imReplyEntity = _imReplyRepository.Single(it => it.UserId == sendUserId && it.ReceiveUserId == receiveUserId); imReplyEntity.ReceiveTime = entity.SendTime; _imReplyRepository.Context.Updateable(imReplyEntity).ExecuteCommand(); } else { var imReplyEntity = new ImReplyEntity() { Id = YitIdHelper.NextId().ToString(), UserId = sendUserId, ReceiveUserId = receiveUserId, ReceiveTime = entity.SendTime }; _imReplyRepository.Context.Insertable(imReplyEntity).ExecuteCommand(); } return _IMContentRepository.Insert(entity); } } }