//
namespace SafeCampus.System;
///
///
///
public class MessageService : DbRepository, IMessageService
{
private readonly ILogger _logger;
private readonly ISimpleCacheService _simpleCacheService;
private readonly IRelationService _relationService;
private readonly IEventPublisher _eventPublisher;
public MessageService(ILogger logger, ISimpleCacheService simpleCacheService, IRelationService relationService,
IEventPublisher eventPublisher)
{
_logger = logger;
_simpleCacheService = simpleCacheService;
_relationService = relationService;
_eventPublisher = eventPublisher;
}
///
public async Task> Page(MessagePageInput input)
{
var query = Context.Queryable().WhereIF(!string.IsNullOrEmpty(input.Category), it => it.Category == input.Category)//根据分类查询
.WhereIF(!string.IsNullOrEmpty(input.SearchKey),
it => it.Subject.Contains(input.SearchKey) || it.Content.Contains(input.SearchKey))//根据关键字查询
.OrderByIF(!string.IsNullOrEmpty(input.SortField), $"{input.SortField} {input.SortOrder}")//排序
.OrderBy(it => it.CreateTime, OrderByType.Desc);
var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页
return pageInfo;
}
///
public async Task> MyMessagePage(MessagePageInput input, long userId)
{
var query = Context.Queryable().LeftJoin((u, m) => u.MessageId == m.Id)
.Where((u, m) => u.IsDelete == false && u.UserId == userId)
.WhereIF(!string.IsNullOrEmpty(input.Category), (u, m) => m.Category == input.Category)//根据分类查询
.OrderBy((u, m) => u.Read, OrderByType.Asc).OrderBy((u, m) => m.CreateTime, OrderByType.Desc).Select((u, m) => new SysMessage
{
Id = m.Id.SelectAll(),
Read = u.Read
});
var pageInfo = await query.ToPagedListAsync(input.PageNum, input.PageSize);//分页
return pageInfo;
}
///
public async Task Send(MessageSendInput input)
{
var message = input.Adapt();//实体转换
var messageUsers = new List();
input.ReceiverIdList.ForEach(it =>
{
//遍历用户ID列表,生成拓展列表
messageUsers.Add(new SysMessageUser { UserId = it, Read = false, IsDelete = false });
});
//事务
var result = await Tenant.UseTranAsync(async () =>
{
message = await InsertReturnEntityAsync(message);//添加消息
messageUsers.ForEach(it => it.MessageId = message.Id);//添加关系
await Context.Insertable(messageUsers).ExecuteCommandAsync();
});
if (result.IsSuccess)//如果成功了
{
await _eventPublisher.PublishAsync(EventSubscriberConst.NEW_MESSAGE, new NewMessageEvent
{
UserIds = input.ReceiverIdList.Select(it => it.ToString()).ToList(),
Message = input.Subject
});//通知用户有新的消息
}
else
{
//写日志
_logger.LogError(result.ErrorMessage, result.ErrorException);
throw Oops.Oh(ErrorCodeEnum.A0003);
}
}
///
public async Task Detail(BaseIdInput input, bool isSelf = false)
{
//获取消息
var message = await GetFirstAsync(it => it.Id == input.Id);
if (message != null)
{
var messageDetail = message.Adapt();//实体转换
var messageUserRep = ChangeRepository>();//切换仓储
var messageUsers = await messageUserRep.GetListAsync(it => it.MessageId == message.Id);
var myMessage = messageUsers.Where(it => it.UserId == UserManager.UserId && it.MessageId == input.Id).FirstOrDefault();//查询是否发给自己
if (myMessage != null)
{
myMessage.Read = true;//设置已读
await messageUserRep.UpdateAsync(myMessage);//修改状态
}
if (!isSelf)//如果不是自己则把所有的用户都列出来
{
var userIds = messageUsers.Select(it => it.UserId).ToList();//获取用户ID列表
var userInfos = await Context.Queryable().Where(it => userIds.Contains(it.Id)).Select(it => new { it.Id, it.Name })
.ToListAsync();//获取用户姓名信息列表
//遍历关系
messageUsers.ForEach(messageUser =>
{
var user = userInfos.Where(u => u.Id == messageUser.UserId).FirstOrDefault();//获取用户信息
if (user != null)
{
//添加到已读列表
messageDetail.ReceiveInfoList.Add(new MessageDetailOutPut.ReceiveInfo
{
ReceiveUserId = user.Id,
ReceiveUserName = user.Name,
Read = messageUser.Read
});
}
else//用户ID没找到
{
//添加到已读列表
messageDetail.ReceiveInfoList.Add(new MessageDetailOutPut.ReceiveInfo
{
ReceiveUserId = messageUser.UserId,
ReceiveUserName = "未知用户",
Read = messageUser.Read
});
}
});
}
return messageDetail;
}
return null;
}
///
public async Task Delete(BaseIdListInput input)
{
//获取所有ID
var ids = input.Ids;
if (ids.Count > 0)
{
//事务
var result = await Tenant.UseTranAsync(async () =>
{
await DeleteAsync(it => ids.Contains(it.Id));
await Context.Deleteable().Where(it => ids.Contains(it.MessageId)).ExecuteCommandAsync();
});
if (!result.IsSuccess)//如果失败了
{
//写日志
_logger.LogError(result.ErrorMessage, result.ErrorException);
throw Oops.Oh(ErrorCodeEnum.A0002);
}
}
}
///
public async Task DeleteMyMessage(BaseIdInput input, long userId)
{
var messageUserRep = ChangeRepository>();//切换仓储
await Context.Deleteable().Where(it => it.UserId == userId && it.MessageId == input.Id).IsLogic().ExecuteCommandAsync();//逻辑删除
}
///
public async Task UnReadCount(long userId)
{
var messageUserRep = ChangeRepository>();//切换仓储
//获取未读数量
var unRead = await messageUserRep.CountAsync(it => it.UserId == userId && it.Read == false && it.IsDelete == false);
return unRead;
}
}