|
@@ -1,7 +1,9 @@
|
|
|
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.framework.mybatis.core.query.LambdaQueryWrapperX;
|
|
|
+import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
|
|
|
+import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.conversation.KeFuConversationRespVO;
|
|
|
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;
|
|
@@ -14,6 +16,7 @@ import org.springframework.validation.annotation.Validated;
|
|
|
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
|
|
|
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
|
|
|
import static cn.iocoder.yudao.module.promotion.enums.ErrorCodeConstants.KEFU_CONVERSATION_NOT_EXISTS;
|
|
@@ -59,14 +62,23 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
|
|
|
// 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())) {
|
|
|
+ //如果发送人为登录账号
|
|
|
+ if (Objects.equals(kefuMessage.getSenderId(), SecurityFrameworkUtils.getLoginUserId())) {
|
|
|
+ conversationMapper.updateById(new KeFuConversationDO().setId(kefuMessage.getConversationId())
|
|
|
+ .setLastMessageTime(kefuMessage.getCreateTime()).
|
|
|
+ setLastMessageContent(kefuMessage.getContent())
|
|
|
+ .setLastMessageContentType(kefuMessage.getContentType()));
|
|
|
+
|
|
|
conversationMapper.updateAdminUnreadMessageCountIncrement(kefuMessage.getConversationId());
|
|
|
}
|
|
|
+ if (Objects.equals(kefuMessage.getReceiverId(), SecurityFrameworkUtils.getLoginUserId())) {
|
|
|
+ conversationMapper.updateById(new KeFuConversationDO().setId(kefuMessage.getConversationId())
|
|
|
+ .setRelLastMessageTime(kefuMessage.getCreateTime()).setRelLastMessageContent(kefuMessage.getContent())
|
|
|
+ .setLastMessageContentType(kefuMessage.getContentType()));
|
|
|
+
|
|
|
+ conversationMapper.updateRelUnreadMessageCountIncrement(kefuMessage.getConversationId());
|
|
|
+ }
|
|
|
+
|
|
|
// 2.2 会员用户发送消息时,如果管理员删除过会话则进行恢复
|
|
|
if (Boolean.TRUE.equals(conversation.getAdminDeleted())) {
|
|
|
updateConversationAdminDeleted(kefuMessage.getConversationId(), Boolean.FALSE);
|
|
@@ -81,6 +93,15 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
|
|
|
// 管理员未读消息数归零
|
|
|
conversationMapper.updateById(new KeFuConversationDO().setId(id).setAdminUnreadMessageCount(0));
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void updateRelUnreadMessageCountToZero(Long id) {
|
|
|
+ // 校验存在
|
|
|
+ validateKefuConversationExists(id);
|
|
|
+
|
|
|
+ // 管理员未读消息数归零
|
|
|
+ conversationMapper.updateById(new KeFuConversationDO().setId(id).setRelUnreadMessageCount(0));
|
|
|
+ }
|
|
|
|
|
|
@Override
|
|
|
public void updateConversationAdminDeleted(Long id, Boolean adminDeleted) {
|
|
@@ -96,10 +117,21 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
|
|
|
public List<KeFuConversationDO> getKefuConversationAiList() {
|
|
|
return conversationMapper.selectConversationAiList();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<KeFuConversationDO> getConversationList() {
|
|
|
+ return conversationMapper.getConversationList();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<KeFuConversationDO> getList(KeFuConversationRespVO reqVO) {
|
|
|
+ return conversationMapper.getList(reqVO);
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public KeFuConversationDO getOrCreateConversation(Long userId) {
|
|
|
KeFuConversationDO conversation = conversationMapper.selectOne(KeFuConversationDO::getUserId, userId);
|
|
|
+
|
|
|
// 没有历史会话,则初始化一个新会话
|
|
|
if (conversation == null) {
|
|
|
conversation = new KeFuConversationDO().setUserId(userId).setLastMessageTime(LocalDateTime.now())
|
|
@@ -110,6 +142,38 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
|
|
|
}
|
|
|
return conversation;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public KeFuConversationDO getOrCreateConversation(Long userId, Long relUserId) {
|
|
|
+ // 尝试获取用户和关联用户之间的会话
|
|
|
+ KeFuConversationDO conversation = conversationMapper.selectOne(new LambdaQueryWrapperX<KeFuConversationDO>()
|
|
|
+ .eq(KeFuConversationDO::getUserId, userId)
|
|
|
+ .eq(KeFuConversationDO::getRelUserId, relUserId));
|
|
|
+
|
|
|
+ // 如果没有找到,则尝试获取关联用户和用户之间的会话
|
|
|
+ if (conversation == null) {
|
|
|
+ conversation = conversationMapper.selectOne(new LambdaQueryWrapperX<KeFuConversationDO>()
|
|
|
+ .eq(KeFuConversationDO::getUserId, relUserId)
|
|
|
+ .eq(KeFuConversationDO::getRelUserId, userId));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果仍然没有找到,则创建一个新的会话
|
|
|
+ if (conversation == null) {
|
|
|
+ conversation = new KeFuConversationDO()
|
|
|
+ .setUserId(userId)
|
|
|
+ .setRelUserId(relUserId)
|
|
|
+ .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) {
|