From 031d824dd0703e08324e153e8a62e5496f5b0c43 Mon Sep 17 00:00:00 2001 From: Peanut Date: Sun, 19 Jul 2026 12:08:54 +0800 Subject: [PATCH] =?UTF-8?q?refactor(server):=20=E6=8A=BD=E5=8F=96=20saveNo?= =?UTF-8?q?velResult=20=E6=96=B9=E6=B3=95=E4=BE=9B=E7=9F=AD=E7=AF=87?= =?UTF-8?q?=E5=B0=8F=E8=AF=B4=E6=9C=8D=E5=8A=A1=E5=A4=8D=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/EpicScriptDialogueServiceImpl.java | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/server/src/main/java/com/emotion/service/impl/EpicScriptDialogueServiceImpl.java b/server/src/main/java/com/emotion/service/impl/EpicScriptDialogueServiceImpl.java index 9042fe5..8234f12 100644 --- a/server/src/main/java/com/emotion/service/impl/EpicScriptDialogueServiceImpl.java +++ b/server/src/main/java/com/emotion/service/impl/EpicScriptDialogueServiceImpl.java @@ -217,6 +217,114 @@ public class EpicScriptDialogueServiceImpl implements EpicScriptDialogueService } } + /** + * 保存小说生成结果到数据库 + * 创建 EpicScript、Conversation 和 3 条 Message 记录 + * + * @param currentUserId 当前用户 ID + * @param theme 用户主题 + * @param fullText 完整小说文本 + * @param metadata 大纲元数据(标题等) + * @return Map 包含 scriptId、conversationId、currentVersionMessageId + */ + public Map saveNovelResult(String currentUserId, String theme, + String fullText, Map metadata) { + String scriptId = snowflakeIdGenerator.nextIdAsString(); + String conversationId = snowflakeIdGenerator.nextIdAsString(); + LocalDateTime now = LocalDateTime.now(); + + // 1. 创建剧本 + EpicScript script = new EpicScript(); + script.setId(scriptId); + script.setUserId(currentUserId); + script.setTitle(metadata != null && metadata.get("title") != null + ? (String) metadata.get("title") : "我的人生剧本"); + script.setTheme(theme); + script.setStyle("career"); + script.setLength("medium"); + script.setConversationId(conversationId); + script.setPlotIntro(fullText); + script.setPlotTurning(""); + script.setPlotClimax(""); + script.setPlotEnding(""); + script.setPlotJson(metadata != null ? metadata : new HashMap<>()); + script.setIsSelected(0); + epicScriptService.save(script); + + // 2. 创建对话 + Conversation conversation = new Conversation(); + conversation.setId(conversationId); + conversation.setUserId(currentUserId); + conversation.setUserType("registered"); + conversation.setScriptId(scriptId); + conversation.setTitle(script.getTitle()); + conversation.setType("script"); + conversation.setConversationStatus("active"); + conversation.setStartTime(now); + conversation.setLastActiveTime(now); + conversation.setMessageCount(3); + conversationService.save(conversation); + + // 3. 系统欢迎消息(messageOrder = 1) + Message systemWelcome = new Message(); + systemWelcome.setId(snowflakeIdGenerator.nextIdAsString()); + systemWelcome.setConversationId(conversationId); + systemWelcome.setScriptId(scriptId); + systemWelcome.setUserId(currentUserId); + systemWelcome.setContent("欢迎来到《" + script.getTitle() + "》剧本世界。\n\n让我们一起探索你的心愿故事。"); + systemWelcome.setType("system"); + systemWelcome.setSender("system"); + systemWelcome.setTimestamp(now); + systemWelcome.setMessageOrder(1L); + systemWelcome.setStatus("sent"); + systemWelcome.setIsRead(1); + messageService.createMessage(systemWelcome); + + // 4. 用户输入消息(messageOrder = 2) + Message userMessage = new Message(); + userMessage.setId(snowflakeIdGenerator.nextIdAsString()); + userMessage.setConversationId(conversationId); + userMessage.setScriptId(scriptId); + userMessage.setUserId(currentUserId); + userMessage.setContent(theme); + userMessage.setType("chat"); + userMessage.setSender("user"); + userMessage.setTimestamp(now); + userMessage.setMessageOrder(2L); + userMessage.setStatus("sent"); + userMessage.setIsRead(1); + messageService.createMessage(userMessage); + + // 5. AI 小说全文消息(messageOrder = 3) + Message aiMessage = new Message(); + aiMessage.setId(snowflakeIdGenerator.nextIdAsString()); + aiMessage.setConversationId(conversationId); + aiMessage.setScriptId(scriptId); + aiMessage.setUserId(currentUserId); + aiMessage.setContent(fullText); + aiMessage.setType("script"); + aiMessage.setSender("assistant"); + aiMessage.setTimestamp(now); + aiMessage.setMessageOrder(3L); + aiMessage.setVersionNumber(1); + aiMessage.setStatus("sent"); + aiMessage.setMetadata(metadata != null ? JSON.toJSONString(metadata) : "{}"); + messageService.createMessage(aiMessage); + + // 6. 更新剧本和对话 + script.setCurrentVersionMessageId(aiMessage.getId()); + epicScriptService.updateById(script); + + conversation.setCurrentMessageId(aiMessage.getId()); + conversationService.updateById(conversation); + + Map result = new HashMap<>(); + result.put("scriptId", scriptId); + result.put("conversationId", conversationId); + result.put("currentVersionMessageId", aiMessage.getId()); + return result; + } + private String buildDisplayContent(Map metadata) { StringBuilder sb = new StringBuilder(); appendSection(sb, metadata.get("title"), null);