Browse Source

MALL-KEFU: 完善APP端聊天消息获取

puhui999 10 months ago
parent
commit
cdb20539ea

+ 32 - 30
sql/mysql/mall-promotion-kefu.sql

@@ -1,37 +1,39 @@
 DROP TABLE IF EXISTS `promotion_kefu_conversation`;
 CREATE TABLE `promotion_kefu_conversation` (
-    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
-    `user_id` BIGINT NOT NULL COMMENT '会话所属用户',
-    `last_message_time` DATETIME NOT NULL COMMENT '最后聊天时间',
-    `last_message_content` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最后聊天内容',
-    `last_message_content_type` INT NOT NULL COMMENT '最后发送的消息类型',
-    `admin_pinned` BIT(1) NOT NULL DEFAULT b'0'  COMMENT '管理端置顶',
-    `user_deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '用户是否可见',
-    `admin_deleted` BIT(1) NOT NULL DEFAULT b'0'  COMMENT '管理员是否可见',
-    `admin_unread_message_count` INT NOT NULL COMMENT '管理员未读消息数',
-    `creator` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
-    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `updater` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
-    `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-    `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+    `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+    `user_id` bigint NOT NULL COMMENT '会话所属用户',
+    `last_message_time` datetime NOT NULL COMMENT '最后聊天时间',
+    `last_message_content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '最后聊天内容',
+    `last_message_content_type` int NOT NULL COMMENT '最后发送的消息类型',
+    `admin_pinned` bit(1) NOT NULL DEFAULT b'0' COMMENT '管理端置顶',
+    `user_deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '用户是否可见',
+    `admin_deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '管理员是否可见',
+    `admin_unread_message_count` int NOT NULL COMMENT '管理员未读消息数',
+    `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+    `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
     PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '客服会话' ROW_FORMAT = Dynamic;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='客服会话';
 
 DROP TABLE IF EXISTS `promotion_kefu_message`;
 CREATE TABLE `promotion_kefu_message` (
-    `id` BIGINT NOT NULL AUTO_INCREMENT COMMENT '编号',
-    `conversation_id` BIGINT NOT NULL COMMENT '会话编号',
-    `sender_id` BIGINT NOT NULL COMMENT '发送人编号',
-    `sender_type` INT NOT NULL COMMENT '发送人类型',
-    `receiver_id` BIGINT NOT NULL COMMENT '接收人编号',
-    `receiver_type` INT NOT NULL COMMENT '接收人类型',
-    `content_type` INT NOT NULL COMMENT '消息类型',
-    `content` VARCHAR(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息',
-    `read_status` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否已读',
-    `creator` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '创建者',
-    `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-    `updater` VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '' COMMENT '更新者',
-    `update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
-    `deleted` BIT(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+    `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
+    `conversation_id` bigint NOT NULL COMMENT '会话编号',
+    `sender_id` bigint NOT NULL COMMENT '发送人编号',
+    `sender_type` int NOT NULL COMMENT '发送人类型',
+    `receiver_id` bigint DEFAULT NULL COMMENT '接收人编号',
+    `receiver_type` int DEFAULT NULL COMMENT '接收人类型',
+    `content_type` int NOT NULL COMMENT '消息类型',
+    `content` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '消息',
+    `read_status` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否已读',
+    `creator` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
+    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    `updater` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '更新者',
+    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    `deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
+    `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
     PRIMARY KEY (`id`) USING BTREE
-) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '客服消息' ROW_FORMAT = Dynamic;
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='客服消息';

+ 4 - 6
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/controller/app/kefu/AppKeFuMessageController.java

@@ -5,9 +5,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
 import cn.iocoder.yudao.framework.security.core.annotations.PreAuthenticated;
-import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageRespVO;
-import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageSendReqVO;
+import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessageSendReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
 import cn.iocoder.yudao.module.promotion.service.kefu.KeFuMessageService;
@@ -16,14 +15,13 @@ import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
 import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
-@Tag(name = "管理后台 - 客服消息")
+@Tag(name = "用户 APP - 客服消息")
 @RestController
 @RequestMapping("/promotion/kefu-message")
 @Validated
@@ -52,8 +50,8 @@ public class AppKeFuMessageController {
     @GetMapping("/page")
     @Operation(summary = "获得客服消息分页")
     @PreAuthenticated
-    public CommonResult<PageResult<KeFuMessageRespVO>> getKefuMessagePage(@Valid KeFuMessagePageReqVO pageReqVO) {
-        PageResult<KeFuMessageDO> pageResult = kefuMessageService.getKefuMessagePage(pageReqVO);
+    public CommonResult<PageResult<KeFuMessageRespVO>> getKefuMessagePage(@Valid AppKeFuMessagePageReqVO pageReqVO) {
+        PageResult<KeFuMessageDO> pageResult = kefuMessageService.getKefuMessagePage(pageReqVO, getLoginUserId());
         return success(BeanUtils.toBean(pageResult, KeFuMessageRespVO.class));
     }
 

+ 8 - 1
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/dal/mysql/kefu/KeFuMessageMapper.java

@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
+import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@@ -23,7 +24,7 @@ public interface KeFuMessageMapper extends BaseMapperX<KeFuMessageDO> {
     default PageResult<KeFuMessageDO> selectPage(KeFuMessagePageReqVO reqVO) {
         return selectPage(reqVO, new LambdaQueryWrapperX<KeFuMessageDO>()
                 .eqIfPresent(KeFuMessageDO::getConversationId, reqVO.getConversationId())
-                .orderByDesc(KeFuMessageDO::getId));
+                .orderByDesc(KeFuMessageDO::getCreateTime));
     }
 
     default List<KeFuMessageDO> selectListByConversationIdAndReadStatus(Long conversationId, Boolean readStatus) {
@@ -37,4 +38,10 @@ public interface KeFuMessageMapper extends BaseMapperX<KeFuMessageDO> {
                 .in(KeFuMessageDO::getId, ids));
     }
 
+    default PageResult<KeFuMessageDO> selectPage(AppKeFuMessagePageReqVO pageReqVO){
+        return selectPage(pageReqVO, new LambdaQueryWrapperX<KeFuMessageDO>()
+                .eqIfPresent(KeFuMessageDO::getConversationId, pageReqVO.getConversationId())
+                .orderByDesc(KeFuMessageDO::getCreateTime));
+    }
+
 }

+ 8 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationService.java

@@ -74,4 +74,12 @@ public interface KeFuConversationService {
      */
     KeFuConversationDO validateKefuConversationExists(Long id);
 
+    /**
+     * 【会员】获得客服会话
+     *
+     * @param userId 用户编号
+     * @return 客服会话
+     */
+    KeFuConversationDO getConversationByUserId(Long userId);
+
 }

+ 5 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuConversationServiceImpl.java

@@ -104,4 +104,9 @@ public class KeFuConversationServiceImpl implements KeFuConversationService {
         return conversation;
     }
 
+    @Override
+    public KeFuConversationDO getConversationByUserId(Long userId) {
+        return conversationMapper.selectOne(KeFuConversationDO::getUserId, userId);
+    }
+
 }

+ 10 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageService.java

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.promotion.service.kefu;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageSendReqVO;
+import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessageSendReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
 import jakarta.validation.Valid;
@@ -45,4 +46,13 @@ public interface KeFuMessageService {
      */
     PageResult<KeFuMessageDO> getKefuMessagePage(KeFuMessagePageReqVO pageReqVO);
 
+    /**
+     * 【会员】获得客服消息分页
+     *
+     * @param pageReqVO 请求
+     * @param userId    用户编号
+     * @return 客服消息分页
+     */
+    PageResult<KeFuMessageDO> getKefuMessagePage(AppKeFuMessagePageReqVO pageReqVO, Long userId);
+
 }

+ 14 - 0
yudao-module-mall/yudao-module-promotion-biz/src/main/java/cn/iocoder/yudao/module/promotion/service/kefu/KeFuMessageServiceImpl.java

@@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.infra.api.websocket.WebSocketSenderApi;
 import cn.iocoder.yudao.module.member.api.user.MemberUserApi;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.admin.kefu.vo.message.KeFuMessageSendReqVO;
+import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessagePageReqVO;
 import cn.iocoder.yudao.module.promotion.controller.app.kefu.vo.message.AppKeFuMessageSendReqVO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuConversationDO;
 import cn.iocoder.yudao.module.promotion.dal.dataobject.kefu.KeFuMessageDO;
@@ -21,6 +22,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
 
+import java.util.Collections;
 import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
@@ -131,6 +133,18 @@ public class KeFuMessageServiceImpl implements KeFuMessageService {
         return keFuMessageMapper.selectPage(pageReqVO);
     }
 
+    @Override
+    public PageResult<KeFuMessageDO> getKefuMessagePage(AppKeFuMessagePageReqVO pageReqVO, Long userId) {
+        // 1. 获得客服会话
+        KeFuConversationDO conversation = conversationService.getConversationByUserId(userId);
+        if (conversation == null) {
+            return PageResult.empty();
+        }
+        // 2. 设置会话编号
+        pageReqVO.setConversationId(conversation.getId());
+        return keFuMessageMapper.selectPage(pageReqVO);
+    }
+
     private KeFuMessageServiceImpl getSelf() {
         return SpringUtil.getBean(getClass());
     }