package cn.iocoder.yudao.module.promotion.service.kefu; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.enums.UserTypeEnum; import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.conversation.KeFuConversationUpdatePinnedReqVO; import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuConversationDO; import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO; import cn.iocoder.yudao.module.promotion.dal.mysql.kefu.KeFuConversationMapper; import cn.iocoder.yudao.module.promotion.enums.kefu.KeFuMessageContentTypeEnum; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import java.time.LocalDateTime; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.KEFU_CONVERSATION_NOT_EXISTS; /** * 客服会话 Service 实现类 * * @author HUIHUI */ @Service @Validated public class KeFuConversationServiceImpl implements KeFuConversationService { @Resource private KeFuConversationMapper conversationMapper; @Override public KeFuConversationDO getConversation(Long id) { return conversationMapper.selectById(id); } @Override public void deleteKefuConversation(Long id) { // 校验存在 validateKefuConversationExists(id); // 只有管理员端可以删除会话,也不真的删,只是管理员端看不到啦 conversationMapper.updateById(new KeFuConversationDO().setId(id).setAdminDeleted(Boolean.TRUE)); } @Override public void updateConversationPinnedByAdmin(KeFuConversationUpdatePinnedReqVO updateReqVO) { // 校验存在 validateKefuConversationExists(updateReqVO.getId()); // 更新管理员会话置顶状态 conversationMapper.updateById(new KeFuConversationDO().setId(updateReqVO.getId()).setAdminPinned(updateReqVO.getAdminPinned())); } @Override @Transactional(rollbackFor = Exception.class) public void updateConversationLastMessage(KeFuMessageDO kefuMessage) { // 1.1 校验会话是否存在 KeFuConversationDO conversation = validateKefuConversationExists(kefuMessage.getConversationId()); // 1.2 更新会话消息冗余 conversationMapper.updateById(new KeFuConversationDO().setId(kefuMessage.getConversationId()) .setLastMessageTime(kefuMessage.getCreateTime()).setLastMessageContent(kefuMessage.getContent()) .setLastMessageContentType(kefuMessage.getContentType())); // 2.1 更新管理员未读消息数 if (UserTypeEnum.MEMBER.getValue().equals(kefuMessage.getSenderType())) { conversationMapper.updateAdminUnreadMessageCountIncrement(kefuMessage.getConversationId()); } // 2.2 会员用户发送消息时,如果管理员删除过会话则进行恢复 if (Boolean.TRUE.equals(conversation.getAdminDeleted())) { updateConversationAdminDeleted(kefuMessage.getConversationId(), Boolean.FALSE); } } @Override public void updateAdminUnreadMessageCountToZero(Long id) { // 校验存在 validateKefuConversationExists(id); // 管理员未读消息数归零 conversationMapper.updateById(new KeFuConversationDO().setId(id).setAdminUnreadMessageCount(0)); } @Override public void updateConversationAdminDeleted(Long id, Boolean adminDeleted) { conversationMapper.updateById(new KeFuConversationDO().setId(id).setAdminDeleted(adminDeleted)); } @Override public List getKefuConversationList() { return conversationMapper.selectConversationList(); } @Override public KeFuConversationDO getOrCreateConversation(Long userId) { KeFuConversationDO conversation = conversationMapper.selectOne(KeFuConversationDO::getUserId, userId); // 没有历史会话,则初始化一个新会话 if (conversation == null) { conversation = new KeFuConversationDO().setUserId(userId).setLastMessageTime(LocalDateTime.now()) .setLastMessageContent(StrUtil.EMPTY).setLastMessageContentType(KeFuMessageContentTypeEnum.TEXT.getType()) .setAdminPinned(Boolean.FALSE).setUserDeleted(Boolean.FALSE).setAdminDeleted(Boolean.FALSE) .setAdminUnreadMessageCount(0); conversationMapper.insert(conversation); } return conversation; } @Override public KeFuConversationDO validateKefuConversationExists(Long id) { KeFuConversationDO conversation = conversationMapper.selectById(id); if (conversation == null) { throw exception(KEFU_CONVERSATION_NOT_EXISTS); } return conversation; } @Override public KeFuConversationDO getConversationByUserId(Long userId) { return conversationMapper.selectByUserId(userId); } }