package com.ruoyi.call.service.impl; import com.ruoyi.call.domain.*; import com.ruoyi.call.dto.MessageEvent; import com.ruoyi.call.mapper.ArdCallGroupUserMapper; import com.ruoyi.call.mapper.ArdCallHistoryMapper; import com.ruoyi.call.mapper.ArdCallSessionMapper; import com.ruoyi.call.mapper.ArdCallUnreadMessagesMapper; import com.ruoyi.call.service.IArdCallGroupService; import com.ruoyi.call.service.IArdCallHistoryService; import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.uuid.IdUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * 会话历史Service业务层处理 * * @author ard * @date 2024-07-03 */ @Service @Slf4j(topic = "msgListener") public class ArdCallHistoryServiceImpl implements IArdCallHistoryService { @Resource private ArdCallHistoryMapper ardCallHistoryMapper; @Resource private ArdCallSessionMapper ardCallSessionMapper; @Resource private ArdCallUnreadMessagesMapper ardCallUnreadMessagesMapper; @Resource private ArdCallGroupUserMapper ardCallGroupUserMapper; @Resource private IArdCallGroupService ardCallGroupService; @Autowired private ApplicationEventPublisher eventPublisher; /** * 查询会话历史 * * @param id 会话历史主键 * @return 会话历史 */ @Override public ArdCallHistory selectArdCallHistoryById(String id) { ArdCallHistory ardCallHistory = ardCallHistoryMapper.selectArdCallHistoryById(id); if (ardCallHistory != null) { //群聊则将targetNickName改为群名称 ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(ardCallHistory.getSessionId()); if (ardCallSession != null && ardCallSession.getType().equals("1")) { ArdCallGroup ardCallGroup = ardCallGroupService.selectArdCallGroupById(ardCallHistory.getTargetId()); if (ardCallGroup != null) { ardCallHistory.setTargetNickName(ardCallGroup.getName()); } } } return ardCallHistory; } /** * 查询会话历史列表 * * @param ardCallHistory 会话历史 * @return 会话历史 */ @Override public List selectArdCallHistoryList(ArdCallHistory ardCallHistory) { List ardCallHistories = ardCallHistoryMapper.selectArdCallHistoryList(ardCallHistory); ardCallHistories.stream().forEach(aCallHistory -> { //群聊则将targetNickName改为群名称 ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(aCallHistory.getSessionId()); if (ardCallSession != null && ardCallSession.getType().equals("1")) { ArdCallGroup ardCallGroup = ardCallGroupService.selectArdCallGroupById(aCallHistory.getTargetId()); if (ardCallGroup != null) { aCallHistory.setTargetNickName(ardCallGroup.getName()); } } }); return ardCallHistories; } /** * 新增会话历史 * * @param ardCallHistory 会话历史 * @return 结果 */ @Override public int insertArdCallHistory(ArdCallHistory ardCallHistory) { ardCallHistory.setId(IdUtils.simpleUUID()); ardCallHistory.setCreateTime(DateUtils.getNowDate()); ArdCallSession ardCallSession = ardCallSessionMapper.selectArdCallSessionById(ardCallHistory.getSessionId()); if (ardCallSession.getType().equals("0")) { //更新单聊用户未读消息计数 ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallHistory.getSessionId(), ardCallHistory.getTargetId()); if (ardCallUnreadMessages == null) { ardCallUnreadMessages = new ArdCallUnreadMessages(); ardCallUnreadMessages.setUserId(ardCallHistory.getTargetId()); ardCallUnreadMessages.setSessionId(ardCallHistory.getSessionId()); ardCallUnreadMessages.setUnreadCount(1); int rows = ardCallUnreadMessagesMapper.selectCountByUserIdAndSessionId(ardCallUnreadMessages.getUserId(), ardCallUnreadMessages.getSessionId()); if (rows == 0) { ardCallUnreadMessagesMapper.insertArdCallUnreadMessages(ardCallUnreadMessages); } } else { ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1); ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages); } //websocket发送给targetId MessageEvent messageEvent = new MessageEvent(ardCallHistory.getTargetId(), ardCallHistory); eventPublisher.publishEvent(messageEvent); } else { //更新群聊用户未读消息计数 ArdCallGroupUser ardCallGroupUser = new ArdCallGroupUser(); ardCallGroupUser.setGroupId(ardCallHistory.getTargetId()); List ardCallGroupUsers = ardCallGroupUserMapper.selectArdCallGroupUserList(ardCallGroupUser); ardCallGroupUsers.stream().forEach(groupUser -> { if (!ardCallHistory.getUserId().equals(groupUser.getUserId())) { //对群里除了自己外其他用户更新未读消息 ArdCallUnreadMessages ardCallUnreadMessages = ardCallUnreadMessagesMapper.getUnreadMessage(ardCallHistory.getSessionId(), groupUser.getUserId()); if (ardCallUnreadMessages == null) { ardCallUnreadMessages = new ArdCallUnreadMessages(); ardCallUnreadMessages.setUserId(groupUser.getUserId()); ardCallUnreadMessages.setSessionId(ardCallHistory.getSessionId()); ardCallUnreadMessages.setUnreadCount(1); int rows = ardCallUnreadMessagesMapper.selectCountByUserIdAndSessionId(ardCallUnreadMessages.getUserId(), ardCallUnreadMessages.getSessionId()); if (rows == 0) { ardCallUnreadMessagesMapper.insertArdCallUnreadMessages(ardCallUnreadMessages); } } else { ardCallUnreadMessages.setUnreadCount(ardCallUnreadMessages.getUnreadCount() + 1); ardCallUnreadMessagesMapper.updateArdCallUnreadMessages(ardCallUnreadMessages); } //websocket发送给targetId MessageEvent messageEvent = new MessageEvent(groupUser.getUserId(), ardCallHistory); eventPublisher.publishEvent(messageEvent); } }); } return ardCallHistoryMapper.insertArdCallHistory(ardCallHistory); } /** * 修改会话历史 * * @param ardCallHistory 会话历史 * @return 结果 */ @Override public int updateArdCallHistory(ArdCallHistory ardCallHistory) { ardCallHistory.setUpdateBy(SecurityUtils.getUsername()); ardCallHistory.setUpdateTime(DateUtils.getNowDate()); return ardCallHistoryMapper.updateArdCallHistory(ardCallHistory); } /** * 批量删除会话历史 * * @param ids 需要删除的会话历史主键 * @return 结果 */ @Override public int deleteArdCallHistoryByIds(String[] ids) { return ardCallHistoryMapper.deleteArdCallHistoryByIds(ids); } /** * 删除会话历史信息 * * @param id 会话历史主键 * @return 结果 */ @Override public int deleteArdCallHistoryById(String id) { return ardCallHistoryMapper.deleteArdCallHistoryById(id); } }