From 64fdd045a5006c8fae0bbae02395da10e51fb36d Mon Sep 17 00:00:00 2001 From: cherishsince Date: Wed, 24 Apr 2024 17:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=20chat=20message=20=E5=88=A0?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/controller/ChatMessageController.java | 28 ++++++++- .../module/ai/mapper/AiChatMessageMapper.java | 14 +++++ .../module/ai/service/ChatMessageService.java | 31 ++++++++++ .../service/impl/ChatMessageServiceImpl.java | 57 +++++++++++++++++++ .../module/ai/vo/ChatMessageListRes.java | 42 ++++++++++++++ .../yudao/module/ai/vo/ChatMessageReq.java | 23 ++++++++ 6 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java create mode 100644 yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java index 227932e78..3c6749e21 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/controller/ChatMessageController.java @@ -1,10 +1,16 @@ package cn.iocoder.yudao.module.ai.controller; +import cn.iocoder.yudao.framework.common.pojo.CommonResult; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.service.ChatMessageService; +import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; /** * chat message @@ -15,8 +21,24 @@ import org.springframework.web.bind.annotation.RestController; */ @Tag(name = "A3-聊天-对话") @RestController -@RequestMapping("/ai/chat/conversation") +@RequestMapping("/ai/chat/message") @Slf4j @AllArgsConstructor public class ChatMessageController { + + private final ChatMessageService chatMessageService; + + @Operation(summary = "聊天记录", description = "查询个人的聊天记录") + @GetMapping("/list") + public PageResult list(@Validated @ModelAttribute ChatMessageReq req) { + return chatMessageService.list(req); + } + + @Operation(summary = "聊天记录", description = "查询个人的聊天记录") + @DeleteMapping("/{chatConversationId}/{id}") + public CommonResult delete(@PathVariable("chatConversationId") Long chatConversationId, + @PathVariable("id") Long id) { + chatMessageService.delete(chatConversationId, id); + return CommonResult.success(null); + } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java index b121a0601..0947cac7b 100644 --- a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/mapper/AiChatMessageMapper.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.ai.mapper; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatMessageDO; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; @@ -14,4 +15,17 @@ import org.springframework.stereotype.Repository; @Repository @Mapper public interface AiChatMessageMapper extends BaseMapperX { + + /** + * 删除 - 根据 Conversation 和 id + * + * @param chatConversationId + * @param id + */ + default int deleteByConversationAndId(Long chatConversationId, Long id) { + return this.delete(new LambdaQueryWrapperX() + .eq(AiChatMessageDO::getChatConversationId, chatConversationId) + .eq(AiChatMessageDO::getId, id) + ); + } } diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java new file mode 100644 index 000000000..625bc1b2e --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/ChatMessageService.java @@ -0,0 +1,31 @@ +package cn.iocoder.yudao.module.ai.service; + +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; + +/** + * chat message + * + * @author fansili + * @time 2024/4/24 17:25 + * @since 1.0 + */ +public interface ChatMessageService { + + /** + * message - 列表 + * + * @param req + * @return + */ + PageResult list(ChatMessageReq req); + + /** + * message - 删除 + * + * @param chatConversationId + * @param id + */ + void delete(Long chatConversationId, Long id); +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java new file mode 100644 index 000000000..7d3513810 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/service/impl/ChatMessageServiceImpl.java @@ -0,0 +1,57 @@ +package cn.iocoder.yudao.module.ai.service.impl; + +import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil; +import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; +import cn.iocoder.yudao.module.ai.ErrorCodeConstants; +import cn.iocoder.yudao.module.ai.dal.dataobject.AiChatConversationDO; +import cn.iocoder.yudao.module.ai.mapper.AiChatConversationMapper; +import cn.iocoder.yudao.module.ai.mapper.AiChatMessageMapper; +import cn.iocoder.yudao.module.ai.service.ChatMessageService; +import cn.iocoder.yudao.module.ai.vo.ChatMessageListRes; +import cn.iocoder.yudao.module.ai.vo.ChatMessageReq; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * chat message + * + * @author fansili + * @time 2024/4/24 17:25 + * @since 1.0 + */ +@AllArgsConstructor +@Service +@Slf4j +public class ChatMessageServiceImpl implements ChatMessageService { + + private final AiChatMessageMapper aiChatMessageMapper; + private final AiChatConversationMapper aiChatConversationMapper; + + @Override + public PageResult list(ChatMessageReq req) { + return null; + } + + @Override + public void delete(Long chatConversationId, Long id) { + // 获取登录用户 + Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); + // 校验 ChatConversation + validateChatConversation(chatConversationId, loginUserId); + // 删除 + aiChatMessageMapper.deleteByConversationAndId(chatConversationId, id); + } + + private AiChatConversationDO validateChatConversation(Long chatConversationId, Long loginUserId) { + AiChatConversationDO aiChatConversationDO = aiChatConversationMapper.selectById(chatConversationId); + if (aiChatConversationDO == null) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONTINUE_NOT_EXIST); + } + if (!aiChatConversationDO.getUserId().equals(loginUserId)) { + throw ServiceExceptionUtil.exception(ErrorCodeConstants.AI_CHAT_CONVERSATION_NOT_YOURS); + } + return aiChatConversationDO; + } +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java new file mode 100644 index 000000000..52017c062 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageListRes.java @@ -0,0 +1,42 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 看板 message list req + * + * @author fansili + * @time 2024/4/24 17:28 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class ChatMessageListRes { + + @Schema(description = "编号") + private Long id; + + @Schema(description = "聊天ID,关联到特定的会话或对话") + private Long chatConversationId; + + @Schema(description = "角色ID,用于标识发送消息的用户或系统的身份") + private Long userId; + + @Schema(description = "消息具体内容,存储用户的发言或者系统响应的文字信息") + private String message; + + @Schema(description = "消息类型,枚举值可能包括'system'(系统消息)、'user'(用户消息)和'assistant'(助手消息)") + private String messageType; + + @Schema(description = "在生成消息时采用的Top-K采样大小") + private Double topK; + + @Schema(description = "Top-P核采样方法的概率阈值") + private Double topP; + + @Schema(description = "温度参数,用于调整生成回复的随机性和多样性程度,") + private Double temperature; + +} diff --git a/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java new file mode 100644 index 000000000..72aa633f0 --- /dev/null +++ b/yudao-module-ai/yudao-module-ai-biz/src/main/java/cn/iocoder/yudao/module/ai/vo/ChatMessageReq.java @@ -0,0 +1,23 @@ +package cn.iocoder.yudao.module.ai.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * chat message list req + * + * @author fansili + * @time 2024/4/14 16:12 + * @since 1.0 + */ +@Data +@Accessors(chain = true) +public class ChatMessageReq { + + @Schema(description = "聊天ID,关联到特定的会话或对话") + @NotNull + private Long chatConversationId; + +}