聊天相关表结构及业务逻辑

表结构:

CREATE TABLE `t_chat_record` (
  `id` bigint(20) NOT NULL,
  `send_user_id` bigint(20) DEFAULT NULL COMMENT '发送人',
  `receive_user_id` bigint(20) DEFAULT NULL COMMENT '接收人',
  `msg_type` char(1) DEFAULT '0' COMMENT '消息类型:0:文字 1:图片',
  `msg_content` text DEFAULT NULL COMMENT '消息内容',
  `send_user_readed` char(1) DEFAULT '0' COMMENT '是否已读:0:未读 1:已读',
  `receive_user_readed` char(1) DEFAULT '0' COMMENT '是否已读:0:未读 1:已读',
  `del_flag` char(1) DEFAULT '0' COMMENT '逻辑删除0:未删除 2:已删除',
  `create_by` varchar(255) DEFAULT '' COMMENT '创建人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(255) DEFAULT '' COMMENT '更新人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT='聊天记录表';



CREATE TABLE `chat_user_relate` (
  `id` bigint(20) DEFAULT NULL,
  `user_id` bigint(20) DEFAULT NULL COMMENT '用户id',
  `relate_user_id` bigint(20) DEFAULT NULL COMMENT '对话用户id',
  `user_no_read` bigint(20) DEFAULT 0 COMMENT '用户未读聊天用户发消息的数量',
  `last_msg_type` char(1) DEFAULT '' COMMENT '最新消息类型',
  `last_msg_content` text DEFAULT NULL COMMENT '最新消息内容',
  `last_msg_time` datetime DEFAULT NULL COMMENT '最新消息发送时间',
  `del_flag` char(1) DEFAULT '0' COMMENT '逻辑删除0:未删除 2:已删除',
  `create_by` varchar(255) DEFAULT '' COMMENT '创建人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `update_by` varchar(255) DEFAULT '' COMMENT '更新人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间'
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COMMENT="用户的聊天用户关系表';

聊天逻辑:

 /**
     * 新增聊天记录
     *
     * @param chatRecord 聊天记录
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int insertChatRecord(ChatRecord chatRecord) {
        MsgBody msgBody = new MsgBody();
        if (StrUtil.isNotBlank(chatRecord.getMsgType())) {
            if (chatRecord.getMsgType().equals(MsgTypeEnum.TEXT.getMsgType())) {
                msgBody.setMsgType(MsgBody.MsgType.text);
            } else if (chatRecord.getMsgType().equals(MsgTypeEnum.IMG.getMsgType())) {
                msgBody.setMsgType(MsgBody.MsgType.img);
                if (chatRecord.getMsgContent().contains("base64")){
                    MultipartFile file = FileUtils.base64ToMultipartFile(chatRecord.getMsgContent());
                    try {
                        if(file != null){
                            // 上传文件路径
                            String filePath = SpringAutumnComeBlogConfig.getUploadPath();
                            // 上传并返回新文件名称
                            String fileName = FileUploadUtils.upload(filePath, file);
                            String url = serverConfig.getUrl() + fileName;
                            AjaxResult ajax = AjaxResult.success();
                            ajax.put("fileName" , fileName);
                            msgBody.setMsgContent(String.valueOf(ajax.get("fileName")));
                            chatRecord.setMsgContent(String.valueOf(ajax.get("fileName")));
                        }
                    } catch (Exception e) {
                    }
                }
            }
        }
        msgBody.setMsgContent(chatRecord.getMsgContent());
        chatRecord.setMsgContent(chatRecord.getMsgContent());
        chatRecord.setId(IdUtils.getLongId());
        chatRecord.setCreateTime(DateUtils.getNowDate());

        msgBody.setCreateTime(chatRecord.getCreateTime());

        int insert =  chatRecordMapper.insertChatRecord(chatRecord);

        //记录用户聊天用户关系表.方面后面查询

        //发送方的聊天用户列表逻辑
        ChatUserRelate chatUserRelate = chatUserRelateService.getOne(new LambdaQueryWrapper()
                .eq(ChatUserRelate::getUserId, chatRecord.getSendUserId())
                .eq(ChatUserRelate::getRelateUserId, chatRecord.getReceiveUserId()));
        if (chatUserRelate != null) {
            chatUserRelate.setLastMsgContent(chatRecord.getMsgContent());
            chatUserRelate.setLastMsgType(chatRecord.getMsgType());
            chatUserRelate.setLastMsgTime(chatRecord.getCreateTime());
            chatUserRelate.setUpdateTime(new Date());
            chatUserRelate.setUpdateBy(chatRecord.getSendUserId().toString());
            insert = chatUserRelateService.updateChatUserRelate(chatUserRelate);
        } else {
            ChatUserRelate chatUserRelateNew = new ChatUserRelate();
            chatUserRelateNew.setUserId(chatRecord.getSendUserId());
            chatUserRelateNew.setRelateUserId(chatRecord.getReceiveUserId());
            chatUserRelateNew.setLastMsgContent(chatRecord.getMsgContent());
            chatUserRelateNew.setLastMsgType(chatRecord.getMsgType());
            chatUserRelateNew.setLastMsgTime(chatRecord.getCreateTime());
            chatUserRelateNew.setCreateTime(new Date());
            chatUserRelateNew.setCreateBy(chatRecord.getSendUserId().toString());
            insert = chatUserRelateService.insertChatUserRelate(chatUserRelateNew);
        }

        //接收方的聊天用户列表逻辑
        ChatUserRelate chatUserRelate2 = chatUserRelateService.getOne(new LambdaQueryWrapper()
                .eq(ChatUserRelate::getUserId, chatRecord.getReceiveUserId())
                .eq(ChatUserRelate::getRelateUserId, chatRecord.getSendUserId()));
        if (chatUserRelate2 != null) {
            chatUserRelate2.setLastMsgContent(chatRecord.getMsgContent());
            chatUserRelate2.setLastMsgType(chatRecord.getMsgType());
            chatUserRelate2.setLastMsgTime(chatRecord.getCreateTime());
            chatUserRelate2.setUpdateTime(new Date());
            chatUserRelate2.setUpdateBy(chatRecord.getSendUserId().toString());
            long count = chatRecordMapper.selectCount(new LambdaQueryWrapper()
                    .select(ChatRecord::getId)
                    .eq(ChatRecord::getSendUserId, chatRecord.getSendUserId())
                    .eq(ChatRecord::getReceiveUserId, chatRecord.getReceiveUserId())
                    .eq(ChatRecord::getReceiveUserReaded, "0"));
            chatUserRelate2.setUserNoRead(count);
            insert = chatUserRelateService.updateChatUserRelate(chatUserRelate2);
        } else {
            ChatUserRelate chatUserRelateNew = new ChatUserRelate();
            chatUserRelateNew.setUserId(chatRecord.getReceiveUserId());
            chatUserRelateNew.setRelateUserId(chatRecord.getSendUserId());
            chatUserRelateNew.setLastMsgContent(chatRecord.getMsgContent());
            chatUserRelateNew.setLastMsgType(chatRecord.getMsgType());
            chatUserRelateNew.setLastMsgTime(chatRecord.getCreateTime());
            chatUserRelateNew.setCreateTime(new Date());
            chatUserRelateNew.setUserNoRead(1L);
            chatUserRelateNew.setCreateBy(chatRecord.getSendUserId().toString());
            insert = chatUserRelateService.insertChatUserRelate(chatUserRelateNew);
        }

        if (insert > 0) {
            msgBody.setType(MsgBody.Type.self);
            webSocketChannelPool.sendToUser(chatRecord.getSendUserId().toString(), msgBody);
            msgBody.setType(MsgBody.Type.other);
            msgBody.setSendUserId(chatRecord.getSendUserId());
            msgBody.setChatRecordId(chatRecord.getId());
            webSocketChannelPool.sendToUser(chatRecord.getReceiveUserId().toString(), msgBody);
        }
        return insert;
    }

    /**
     * 修改聊天记录的阅读数量
     *
     * @param chatRecord 聊天记录
     * @return 结果
     */
    @Transactional(rollbackFor = Exception.class)
    @Override
    public int updateChatRecord(ChatRecord chatRecord) {
        ChatRecord record = chatRecordMapper.selectById(chatRecord.getId());
        if (record != null){
            //同时更新关系表的未读数量
            ChatUserRelate chatUserRelate = new ChatUserRelate();
            chatUserRelate.setUserId(record.getReceiveUserId());
            chatUserRelate.setRelateUserId(record.getSendUserId());
            ChatUserRelate one = chatUserRelateService.getOne(new LambdaQueryWrapper()
                    .eq(ChatUserRelate::getUserId,chatUserRelate.getUserId())
                    .eq(ChatUserRelate::getRelateUserId,chatUserRelate.getRelateUserId()));
            if (one != null){
                one.setUserNoRead(one.getUserNoRead() - 1);
                chatUserRelateService.updateChatUserRelate(one);
            }
        }
        chatRecord.setUpdateTime(DateUtils.getNowDate());
        return chatRecordMapper.updateChatRecord(chatRecord);
    }

其他查询逻辑及前端数据渲染这里省略.......

你可能感兴趣的:(java,java)