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);
}
}
}