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) {
|
||||
StringBuilder sb = new StringBuilder();
|
||||
appendSection(sb, metadata.get("title"), null);
|
||||
|
||||
Reference in New Issue
Block a user