feat: 塔罗牌添加AI解读功能
- 后端添加HunYuanAiService调用生成AI解读 - 添加DeductRecord保存测算记录 - 前端传递userId参数
This commit is contained in:
1 parent
e7df1479ab
commit
7e3f534ef4
2 files changed
+41
-57
No files matched your search
@@ -1,12 +1,24 @@
|
||||
package xuan.controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import xuan.service.HunYuanAiService;
|
||||
import xuan.service.PromptTemplates;
|
||||
import xuan.service.DeductRecordService;
|
||||
import xuan.entity.DeductRecord;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/taluo")
|
||||
public class TaLuoController {
|
||||
|
||||
private final HunYuanAiService aiService = new HunYuanAiService();
|
||||
|
||||
@Autowired
|
||||
private DeductRecordService recordService;
|
||||
|
||||
private static final List<Map<String, Object>> MAJOR_ARCANA = Arrays.asList(
|
||||
createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"),
|
||||
createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"),
|
||||
@@ -142,15 +154,38 @@ public class TaLuoController {
|
||||
selectedCards.add(card);
|
||||
}
|
||||
|
||||
String interpretation = generateInterpretation(selectedCards, spreadType, request.getQuestion());
|
||||
|
||||
Map<String, Object> aiData = new HashMap<>();
|
||||
aiData.put("question", request.getQuestion());
|
||||
aiData.put("spreadName", getSpreadName(spreadType));
|
||||
aiData.put("cards", selectedCards);
|
||||
|
||||
String aiAnalysis = aiService.chat(
|
||||
PromptTemplates.getTaLuoSystemPrompt(),
|
||||
PromptTemplates.getTaLuoUserPrompt(aiData)
|
||||
);
|
||||
|
||||
Map<String, Object> data = new HashMap<>();
|
||||
data.put("spreadType", spreadType);
|
||||
data.put("spreadName", getSpreadName(spreadType));
|
||||
data.put("question", request.getQuestion());
|
||||
data.put("cards", selectedCards);
|
||||
data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion()));
|
||||
data.put("aiAnalysis", generateAiAnalysis(selectedCards, spreadType, request.getQuestion()));
|
||||
data.put("interpretation", interpretation);
|
||||
data.put("aiAnalysis", aiAnalysis);
|
||||
data.put("timestamp", new Date());
|
||||
|
||||
DeductRecord record = new DeductRecord();
|
||||
record.setUserId(request.getUserId() != null ? request.getUserId() : "default_user");
|
||||
record.setType("taluo");
|
||||
record.setName(request.getQuestion() != null ? request.getQuestion() : "塔罗占卜");
|
||||
record.setInputData(JSON.toJSONString(request));
|
||||
record.setResultData(JSON.toJSONString(data));
|
||||
record.setAiAnalysis(aiAnalysis);
|
||||
recordService.saveRecord(record);
|
||||
|
||||
data.put("recordId", record.getId());
|
||||
|
||||
result.put("success", true);
|
||||
result.put("data", data);
|
||||
} catch (Exception e) {
|
||||
@@ -270,61 +305,6 @@ public class TaLuoController {
|
||||
return interpretation.toString();
|
||||
}
|
||||
|
||||
private String generateAiAnalysis(List<Map<String, Object>> cards, String spreadType, String question) {
|
||||
StringBuilder analysis = new StringBuilder();
|
||||
|
||||
analysis.append("## 塔罗牌深度解读\n\n");
|
||||
|
||||
if (question != null && !question.isEmpty()) {
|
||||
analysis.append("**您的问题:**").append(question).append("\n\n");
|
||||
}
|
||||
|
||||
analysis.append("### 牌面分析\n\n");
|
||||
|
||||
for (Map<String, Object> card : cards) {
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
String position = (String) card.get("positionMeaning");
|
||||
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
|
||||
|
||||
analysis.append("**").append(position).append(" - ").append(name).append("**");
|
||||
analysis.append(isReversed ? "(逆位)\n\n" : "(正位)\n\n");
|
||||
analysis.append(meaning).append("\n\n");
|
||||
}
|
||||
|
||||
analysis.append("### 综合解读\n\n");
|
||||
|
||||
if ("single".equals(spreadType)) {
|
||||
Map<String, Object> card = cards.get(0);
|
||||
String name = (String) card.get("name");
|
||||
boolean isReversed = (Boolean) card.get("isReversed");
|
||||
|
||||
analysis.append("这张").append(name).append("为您揭示了当前的能量状态。");
|
||||
if (isReversed) {
|
||||
analysis.append("逆位的出现提示您需要关注内在的阻碍和挑战,建议您停下来反思,寻找内在的平衡。");
|
||||
} else {
|
||||
analysis.append("正位的出现表示能量流动顺畅,是采取行动的好时机。");
|
||||
}
|
||||
} else if ("three".equals(spreadType)) {
|
||||
analysis.append("三张牌阵为您展示了时间的流动:\n\n");
|
||||
analysis.append("- **过去**:影响了现在的因素\n");
|
||||
analysis.append("- **现在**:当前的状态和挑战\n");
|
||||
analysis.append("- **未来**:可能的发展方向\n\n");
|
||||
analysis.append("请结合三张牌的含义,理解事情的发展脉络,做出明智的选择。");
|
||||
} else if ("celtic".equals(spreadType)) {
|
||||
analysis.append("凯尔特十字牌阵为您提供了全面的视角:\n\n");
|
||||
analysis.append("- **核心区域(1-6)**:揭示问题的核心和内在动力\n");
|
||||
analysis.append("- **延伸区域(7-10)**:展示外部环境和未来走向\n\n");
|
||||
analysis.append("请仔细体会每张牌的含义,它们共同为您描绘出完整的图景。");
|
||||
}
|
||||
|
||||
analysis.append("\n### 建议\n\n");
|
||||
analysis.append("塔罗牌是一面镜子,反映您内心的智慧和直觉。请信任自己的判断,");
|
||||
analysis.append("将牌面的启示与实际情况结合,做出最适合自己的决定。");
|
||||
|
||||
return analysis.toString();
|
||||
}
|
||||
|
||||
@GetMapping("/cards")
|
||||
public Map<String, Object> getAllCards() {
|
||||
Map<String, Object> result = new HashMap<>();
|
||||
@@ -365,9 +345,12 @@ public class TaLuoController {
|
||||
}
|
||||
|
||||
public static class TaLuoRequest {
|
||||
private String userId;
|
||||
private String question;
|
||||
private String spreadType;
|
||||
|
||||
public String getUserId() { return userId; }
|
||||
public void setUserId(String userId) { this.userId = userId; }
|
||||
public String getQuestion() { return question; }
|
||||
public void setQuestion(String question) { this.question = question; }
|
||||
public String getSpreadType() { return spreadType; }
|
||||
|
||||
@@ -102,6 +102,7 @@ export default {
|
||||
|
||||
try {
|
||||
const result = await api.taLuoApi.divine({
|
||||
userId: this.userId,
|
||||
question: this.question || '请给我指引',
|
||||
spreadType: this.spreadType
|
||||
})
|
||||
|
||||
Reference in new issue
Block a user