refactor(server): 抽取 saveNovelResult 方法供短篇小说服务复用
This commit is contained in:
@@ -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<String, String> saveNovelResult(String currentUserId, String theme,
|
||||||
|
String fullText, Map<String, Object> 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<String, String> result = new HashMap<>();
|
||||||
|
result.put("scriptId", scriptId);
|
||||||
|
result.put("conversationId", conversationId);
|
||||||
|
result.put("currentVersionMessageId", aiMessage.getId());
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
private String buildDisplayContent(Map<String, Object> metadata) {
|
private String buildDisplayContent(Map<String, Object> metadata) {
|
||||||
StringBuilder sb = new StringBuilder();
|
StringBuilder sb = new StringBuilder();
|
||||||
appendSection(sb, metadata.get("title"), null);
|
appendSection(sb, metadata.get("title"), null);
|
||||||
|
|||||||
Reference in New Issue
Block a user