feat: 集成腾讯混元AI模型,为所有玄学模块添加AI分析功能

- 新增HunYuanAiService服务类,实现腾讯混元API调用
- 新增PromptTemplates提示词模板类,为各模块设计专业提示词
- 修改所有Controller集成AI服务(八字、紫微、六爻、梅花、奇门、大六壬、塔罗、占星)
- 修改前端所有结果页面显示AI分析结果
- 添加OkHttp依赖用于HTTP请求
This commit is contained in:
xuan-bot committed 2026-03-07 07:43:02 +08:00
1 parent db9a63d309
commit 01283f1db7
19 files changed
+1030 -1391

No files matched your search

@@ -5,7 +5,8 @@ import xuan.core.bazi.BaZi;
import xuan.core.bazi.settings.BaZiJiChuSetting;
import xuan.core.bazi.settings.BaZiShenShaSetting;
import xuan.core.bazi.settings.BaZiGanZhiLiuYiSetting;
import xuan.core.bazi.utils.BaZiAnalysisUtil;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.HashMap;
import java.util.Map;
@@ -14,6 +15,8 @@ import java.util.Map;
@RequestMapping("/api/bazi")
public class BaZiController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody BaZiRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -38,8 +41,16 @@ public class BaZiController {
baZi.baZiShenShaSetting(new BaZiShenShaSetting());
baZi.baZiGanZhiLiuYiSetting(new BaZiGanZhiLiuYiSetting());
Map<String, Object> data = buildBaZiData(baZi);
String aiAnalysis = aiService.chat(
PromptTemplates.getBaZiSystemPrompt(),
PromptTemplates.getBaZiUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildBaZiData(baZi));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -79,27 +90,9 @@ public class BaZiController {
data.put("monthGanZhiShenSha", baZi.getMonthGanZhiShenSha());
data.put("dayGanZhiShenSha", baZi.getDayGanZhiShenSha());
data.put("hourGanZhiShenSha", baZi.getHourGanZhiShenSha());
data.put("analysis", buildAnalysis(baZi));
return data;
}
private Map<String, Object> buildAnalysis(BaZi baZi) {
Map<String, Object> analysis = new HashMap<>();
BaZiAnalysisUtil analysisUtil = new BaZiAnalysisUtil(baZi);
analysis.put("summary", analysisUtil.generateSummary());
analysis.put("personality", analysisUtil.generatePersonality());
analysis.put("career", analysisUtil.generateCareer());
analysis.put("marriage", analysisUtil.generateMarriage());
analysis.put("wealth", analysisUtil.generateWealth());
analysis.put("health", analysisUtil.generateHealth());
analysis.put("advice", analysisUtil.generateAdvice());
return analysis;
}
public static class BaZiRequest {
private String name;
private String occupy;
@@ -145,5 +138,4 @@ public class BaZiController {
public Integer getDayGanZhiType() { return dayGanZhiType; }
public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; }
}
}
@@ -4,6 +4,8 @@ import org.springframework.web.bind.annotation.*;
import xuan.core.daliuren.DaLiuRen;
import xuan.core.daliuren.settings.DaLiuRenJiChuSetting;
import xuan.core.daliuren.settings.DaLiuRenShenShaSetting;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.*;
@@ -11,6 +13,8 @@ import java.util.*;
@RequestMapping("/api/daliuren")
public class DaLiuRenController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody DaLiuRenRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -32,8 +36,16 @@ public class DaLiuRenController {
DaLiuRen daLiuRen = new DaLiuRen(setting);
daLiuRen.daLiuRenShenShaSetting(new DaLiuRenShenShaSetting());
Map<String, Object> data = buildDaLiuRenData(daLiuRen);
String aiAnalysis = aiService.chat(
PromptTemplates.getDaLiuRenSystemPrompt(),
PromptTemplates.getDaLiuRenUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildDaLiuRenData(daLiuRen));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -52,85 +64,24 @@ public class DaLiuRenController {
data.put("solar", daLiuRen.getSolarStr2());
data.put("lunar", daLiuRen.getLunarStr2());
data.put("xingQi", daLiuRen.getXingQi());
data.put("jiJie", daLiuRen.getJiJie());
data.put("shengXiao", daLiuRen.getShengXiao());
data.put("xingZuo", daLiuRen.getXingZuo());
data.put("yearGanZhi", daLiuRen.getYearGanZhi());
data.put("monthGanZhi", daLiuRen.getMonthGanZhi());
data.put("dayGanZhi", daLiuRen.getDayGanZhi());
data.put("hourGanZhi", daLiuRen.getHourGanZhi());
data.put("yearGan", daLiuRen.getYearGan());
data.put("monthGan", daLiuRen.getMonthGan());
data.put("dayGan", daLiuRen.getDayGan());
data.put("hourGan", daLiuRen.getHourGan());
data.put("yearZhi", daLiuRen.getYearZhi());
data.put("monthZhi", daLiuRen.getMonthZhi());
data.put("dayZhi", daLiuRen.getDayZhi());
data.put("hourZhi", daLiuRen.getHourZhi());
data.put("yearGanWuXing", daLiuRen.getYearGanWuXing());
data.put("monthGanWuXing", daLiuRen.getMonthGanWuXing());
data.put("dayGanWuXing", daLiuRen.getDayGanWuXing());
data.put("hourGanWuXing", daLiuRen.getHourGanWuXing());
data.put("yearZhiWuXing", daLiuRen.getYearZhiWuXing());
data.put("monthZhiWuXing", daLiuRen.getMonthZhiWuXing());
data.put("dayZhiWuXing", daLiuRen.getDayZhiWuXing());
data.put("hourZhiWuXing", daLiuRen.getHourZhiWuXing());
data.put("yearGanZhiNaYin", daLiuRen.getYearGanZhiNaYin());
data.put("monthGanZhiNaYin", daLiuRen.getMonthGanZhiNaYin());
data.put("dayGanZhiNaYin", daLiuRen.getDayGanZhiNaYin());
data.put("hourGanZhiNaYin", daLiuRen.getHourGanZhiNaYin());
data.put("yearGanZhiKongWang", daLiuRen.getYearGanZhiKongWang());
data.put("monthGanZhiKongWang", daLiuRen.getMonthGanZhiKongWang());
data.put("dayGanZhiKongWang", daLiuRen.getDayGanZhiKongWang());
data.put("hourGanZhiKongWang", daLiuRen.getHourGanZhiKongWang());
data.put("wuXingWangShuai", daLiuRen.getWuXingWangShuai());
data.put("prevJie", daLiuRen.getPrevJie());
data.put("nextJie", daLiuRen.getNextJie());
data.put("prevJieDateStr", daLiuRen.getPrevJieDateStr());
data.put("nextJieDateStr", daLiuRen.getNextJieDateStr());
data.put("prevJieDay", daLiuRen.getPrevJieDay());
data.put("nextJieDay", daLiuRen.getNextJieDay());
data.put("chuShengJie", daLiuRen.getChuShengJie());
data.put("prevQi", daLiuRen.getPrevQi());
data.put("nextQi", daLiuRen.getNextQi());
data.put("prevQiDateStr", daLiuRen.getPrevQiDateStr());
data.put("nextQiDateStr", daLiuRen.getNextQiDateStr());
data.put("prevQiDay", daLiuRen.getPrevQiDay());
data.put("nextQiDay", daLiuRen.getNextQiDay());
data.put("chuShengQi", daLiuRen.getChuShengQi());
data.put("yueXiang", daLiuRen.getYueXiang());
data.put("yueJiang", daLiuRen.getYueJiang());
data.put("yueJiangShen", daLiuRen.getYueJiangShen());
data.put("wuBuYuShi", daLiuRen.getWuBuYuShi());
data.put("tianDiPanType", daLiuRen.getTianDiPanType());
data.put("tianGan", daLiuRen.getTianGan());
data.put("diPan", daLiuRen.getDiPan());
data.put("tianPan", daLiuRen.getTianPan());
data.put("shenPan", daLiuRen.getShenPan());
data.put("diPan", daLiuRen.getDiPan());
data.put("siKe", daLiuRen.getSiKe());
data.put("siKeDunGan", daLiuRen.getSiKeDunGan());
data.put("siKeShenJiang", daLiuRen.getSiKeShenJiang());
data.put("sanChuan", daLiuRen.getSanChuan());
data.put("sanChuanDunGan", daLiuRen.getSanChuanDunGan());
data.put("sanChuanShenJiang", daLiuRen.getSanChuanShenJiang());
data.put("sanChuanLiuQin", daLiuRen.getSanChuanLiuQin());
data.put("sanChuanQuFa", daLiuRen.getSanChuanQuFa());
return data;
}
@@ -4,6 +4,8 @@ import org.springframework.web.bind.annotation.*;
import xuan.core.liuyao.LiuYao;
import xuan.core.liuyao.settings.LiuYaoJiChuSetting;
import xuan.core.liuyao.settings.LiuYaoShenShaSetting;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.HashMap;
import java.util.Map;
@@ -12,6 +14,8 @@ import java.util.Map;
@RequestMapping("/api/liuyao")
public class LiuYaoController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody LiuYaoRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -44,8 +48,16 @@ public class LiuYaoController {
LiuYao liuYao = new LiuYao(setting);
liuYao.liuYaoShenShaSetting(new LiuYaoShenShaSetting());
Map<String, Object> data = buildLiuYaoData(liuYao);
String aiAnalysis = aiService.chat(
PromptTemplates.getLiuYaoSystemPrompt(),
PromptTemplates.getLiuYaoUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildLiuYaoData(liuYao));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -57,6 +69,7 @@ public class LiuYaoController {
Map<String, Object> data = new HashMap<>();
data.put("name", liuYao.getName());
data.put("occupy", liuYao.getOccupy());
data.put("sex", liuYao.getSex());
data.put("age", liuYao.getAge());
data.put("solar", liuYao.getSolarStr2());
@@ -84,101 +97,13 @@ public class LiuYaoController {
data.put("zongGuaName", liuYao.getZongGuaName());
data.put("fuGuaName", liuYao.getFuGuaName());
data.put("shangGuaAs", liuYao.getShangGuaAs());
data.put("xiaGuaAs", liuYao.getXiaGuaAs());
data.put("benGuaAs", liuYao.getBenGuaAs());
data.put("bianGuaAs", liuYao.getBianGuaAs());
data.put("huGuaAs", liuYao.getHuGuaAs());
data.put("cuoGuaAs", liuYao.getCuoGuaAs());
data.put("zongGuaAs", liuYao.getZongGuaAs());
data.put("fuGuaAs", liuYao.getFuGuaAs());
data.put("benGuaType", liuYao.getBenGuaType());
data.put("bianGuaType", liuYao.getBianGuaType());
data.put("huGuaType", liuYao.getHuGuaType());
data.put("cuoGuaType", liuYao.getCuoGuaType());
data.put("zongGuaType", liuYao.getZongGuaType());
data.put("fuGuaType", liuYao.getFuGuaType());
data.put("benGuaGuaShen", liuYao.getBenGuaGuaShen());
data.put("bianGuaGuaShen", liuYao.getBianGuaGuaShen());
data.put("huGuaGuaShen", liuYao.getHuGuaGuaShen());
data.put("cuoGuaGuaShen", liuYao.getCuoGuaGuaShen());
data.put("zongGuaGuaShen", liuYao.getZongGuaGuaShen());
data.put("fuGuaGuaShen", liuYao.getFuGuaGuaShen());
data.put("benGuaGuaCi", liuYao.getBenGuaGuaCi());
data.put("bianGuaGuaCi", liuYao.getBianGuaGuaCi());
data.put("huGuaGuaCi", liuYao.getHuGuaGuaCi());
data.put("cuoGuaGuaCi", liuYao.getCuoGuaGuaCi());
data.put("zongGuaGuaCi", liuYao.getZongGuaGuaCi());
data.put("fuGuaGuaCi", liuYao.getFuGuaGuaCi());
data.put("benGuaLiuYaoName", liuYao.getBenGuaLiuYaoName());
data.put("bianGuaLiuYaoName", liuYao.getBianGuaLiuYaoName());
data.put("huGuaLiuYaoName", liuYao.getHuGuaLiuYaoName());
data.put("cuoGuaLiuYaoName", liuYao.getCuoGuaLiuYaoName());
data.put("zongGuaLiuYaoName", liuYao.getZongGuaLiuYaoName());
data.put("fuGuaLiuYaoName", liuYao.getFuGuaLiuYaoName());
data.put("benGuaLiuYaoAs", liuYao.getBenGuaLiuYaoAs());
data.put("bianGuaLiuYaoAs", liuYao.getBianGuaLiuYaoAs());
data.put("huGuaLiuYaoAs", liuYao.getHuGuaLiuYaoAs());
data.put("cuoGuaLiuYaoAs", liuYao.getCuoGuaLiuYaoAs());
data.put("zongGuaLiuYaoAs", liuYao.getZongGuaLiuYaoAs());
data.put("fuGuaLiuYaoAs", liuYao.getFuGuaLiuYaoAs());
data.put("benGuaLiuYaoShiYing", liuYao.getBenGuaLiuYaoShiYing());
data.put("bianGuaLiuYaoShiYing", liuYao.getBianGuaLiuYaoShiYing());
data.put("huGuaLiuYaoShiYing", liuYao.getHuGuaLiuYaoShiYing());
data.put("cuoGuaLiuYaoShiYing", liuYao.getCuoGuaLiuYaoShiYing());
data.put("zongGuaLiuYaoShiYing", liuYao.getZongGuaLiuYaoShiYing());
data.put("fuGuaLiuYaoShiYing", liuYao.getFuGuaLiuYaoShiYing());
data.put("benGuaLiuYaoLiuQin", liuYao.getBenGuaLiuYaoLiuQin());
data.put("bianGuaLiuYaoLiuQin", liuYao.getBianGuaLiuYaoLiuQin());
data.put("huGuaLiuYaoLiuQin", liuYao.getHuGuaLiuYaoLiuQin());
data.put("cuoGuaLiuYaoLiuQin", liuYao.getCuoGuaLiuYaoLiuQin());
data.put("zongGuaLiuYaoLiuQin", liuYao.getZongGuaLiuYaoLiuQin());
data.put("fuGuaLiuYaoLiuQin", liuYao.getFuGuaLiuYaoLiuQin());
data.put("benGuaLiuYaoGanZhi", liuYao.getBenGuaLiuYaoGanZhi());
data.put("bianGuaLiuYaoGanZhi", liuYao.getBianGuaLiuYaoGanZhi());
data.put("huGuaLiuYaoGanZhi", liuYao.getHuGuaLiuYaoGanZhi());
data.put("cuoGuaLiuYaoGanZhi", liuYao.getCuoGuaLiuYaoGanZhi());
data.put("zongGuaLiuYaoGanZhi", liuYao.getZongGuaLiuYaoGanZhi());
data.put("fuGuaLiuYaoGanZhi", liuYao.getFuGuaLiuYaoGanZhi());
data.put("benGuaLiuYaoWuXing", liuYao.getBenGuaLiuYaoWuXing());
data.put("bianGuaLiuYaoWuXing", liuYao.getBianGuaLiuYaoWuXing());
data.put("huGuaLiuYaoWuXing", liuYao.getHuGuaLiuYaoWuXing());
data.put("cuoGuaLiuYaoWuXing", liuYao.getCuoGuaLiuYaoWuXing());
data.put("zongGuaLiuYaoWuXing", liuYao.getZongGuaLiuYaoWuXing());
data.put("fuGuaLiuYaoWuXing", liuYao.getFuGuaLiuYaoWuXing());
data.put("benGuaLiuYaoLiuShen", liuYao.getBenGuaLiuYaoLiuShen());
data.put("bianGuaLiuYaoLiuShen", liuYao.getBianGuaLiuYaoLiuShen());
data.put("huGuaLiuYaoLiuShen", liuYao.getHuGuaLiuYaoLiuShen());
data.put("cuoGuaLiuYaoLiuShen", liuYao.getCuoGuaLiuYaoLiuShen());
data.put("zongGuaLiuYaoLiuShen", liuYao.getZongGuaLiuYaoLiuShen());
data.put("fuGuaLiuYaoLiuShen", liuYao.getFuGuaLiuYaoLiuShen());
data.put("benGuaLiuYaoYaoCi", liuYao.getBenGuaLiuYaoYaoCi());
data.put("bianGuaLiuYaoYaoCi", liuYao.getBianGuaLiuYaoYaoCi());
data.put("huGuaLiuYaoYaoCi", liuYao.getHuGuaLiuYaoYaoCi());
data.put("cuoGuaLiuYaoYaoCi", liuYao.getCuoGuaLiuYaoYaoCi());
data.put("zongGuaLiuYaoYaoCi", liuYao.getZongGuaLiuYaoYaoCi());
data.put("fuGuaLiuYaoYaoCi", liuYao.getFuGuaLiuYaoYaoCi());
data.put("benGuaLiuYaoNaYin", liuYao.getBenGuaLiuYaoNaYin());
data.put("bianGuaLiuYaoNaYin", liuYao.getBianGuaLiuYaoNaYin());
data.put("huGuaLiuYaoNaYin", liuYao.getHuGuaLiuYaoNaYin());
data.put("cuoGuaLiuYaoNaYin", liuYao.getCuoGuaLiuYaoNaYin());
data.put("zongGuaLiuYaoNaYin", liuYao.getZongGuaLiuYaoNaYin());
data.put("fuGuaLiuYaoNaYin", liuYao.getFuGuaLiuYaoNaYin());
data.put("fuGuaLiuYaoFuShen", liuYao.getFuGuaLiuYaoFuShen());
data.put("shenSha", liuYao.getShenSha());
return data;
}
@@ -225,5 +150,4 @@ public class LiuYaoController {
public String getLiuYaoYaoXiang() { return liuYaoYaoXiang; }
public void setLiuYaoYaoXiang(String liuYaoYaoXiang) { this.liuYaoYaoXiang = liuYaoYaoXiang; }
}
}
@@ -3,6 +3,8 @@ package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.core.meihua.MeiHua;
import xuan.core.meihua.settings.MeiHuaJiChuSetting;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.HashMap;
import java.util.Map;
@@ -11,6 +13,8 @@ import java.util.Map;
@RequestMapping("/api/meihua")
public class MeiHuaController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody MeiHuaRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -37,8 +41,16 @@ public class MeiHuaController {
MeiHua meiHua = new MeiHua(setting);
Map<String, Object> data = buildMeiHuaData(meiHua);
String aiAnalysis = aiService.chat(
PromptTemplates.getMeiHuaSystemPrompt(),
PromptTemplates.getMeiHuaUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildMeiHuaData(meiHua));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -50,6 +62,7 @@ public class MeiHuaController {
Map<String, Object> data = new HashMap<>();
data.put("name", meiHua.getName());
data.put("occupy", meiHua.getOccupy());
data.put("sex", meiHua.getSex());
data.put("age", meiHua.getAge());
data.put("solar", meiHua.getSolarStr2());
@@ -58,120 +71,22 @@ public class MeiHuaController {
data.put("jiJie", meiHua.getJiJie());
data.put("shengXiao", meiHua.getShengXiao());
data.put("xingZuo", meiHua.getXingZuo());
data.put("yueXiang", meiHua.getYueXiang());
data.put("yueJiang", meiHua.getYueJiang());
data.put("yueJiangShen", meiHua.getYueJiangShen());
data.put("wuBuYuShi", meiHua.getWuBuYuShi());
data.put("yearGanZhi", meiHua.getYearGanZhi());
data.put("monthGanZhi", meiHua.getMonthGanZhi());
data.put("dayGanZhi", meiHua.getDayGanZhi());
data.put("hourGanZhi", meiHua.getHourGanZhi());
data.put("yearGanZhiWuXing", meiHua.getYearGanZhiWuXing());
data.put("monthGanZhiWuXing", meiHua.getMonthGanZhiWuXing());
data.put("dayGanZhiWuXing", meiHua.getDayGanZhiWuXing());
data.put("hourGanZhiWuXing", meiHua.getHourGanZhiWuXing());
data.put("yearGanZhiNaYin", meiHua.getYearGanZhiNaYin());
data.put("monthGanZhiNaYin", meiHua.getMonthGanZhiNaYin());
data.put("dayGanZhiNaYin", meiHua.getDayGanZhiNaYin());
data.put("hourGanZhiNaYin", meiHua.getHourGanZhiNaYin());
data.put("yearGanZhiKongWang", meiHua.getYearGanZhiKongWang());
data.put("monthGanZhiKongWang", meiHua.getMonthGanZhiKongWang());
data.put("dayGanZhiKongWang", meiHua.getDayGanZhiKongWang());
data.put("hourGanZhiKongWang", meiHua.getHourGanZhiKongWang());
data.put("prevJie", meiHua.getPrevJie());
data.put("prevJieDateStr", meiHua.getPrevJieDateStr());
data.put("prevJieDay", meiHua.getPrevJieDay());
data.put("nextJie", meiHua.getNextJie());
data.put("nextJieDateStr", meiHua.getNextJieDateStr());
data.put("nextJieDay", meiHua.getNextJieDay());
data.put("chuShengJie", meiHua.getChuShengJie());
data.put("prevQi", meiHua.getPrevQi());
data.put("prevQiDateStr", meiHua.getPrevQiDateStr());
data.put("prevQiDay", meiHua.getPrevQiDay());
data.put("nextQi", meiHua.getNextQi());
data.put("nextQiDateStr", meiHua.getNextQiDateStr());
data.put("nextQiDay", meiHua.getNextQiDay());
data.put("chuShengQi", meiHua.getChuShengQi());
data.put("shangGuaName", meiHua.getShangGuaName());
data.put("xiaGuaName", meiHua.getXiaGuaName());
data.put("benGuaName", meiHua.getBenGuaName());
data.put("bianGuaName", meiHua.getBianGuaName());
data.put("huGuaName", meiHua.getHuGuaName());
data.put("cuoGuaName", meiHua.getCuoGuaName());
data.put("zongGuaName", meiHua.getZongGuaName());
data.put("shangGuaAs", meiHua.getShangGuaAs());
data.put("xiaGuaAs", meiHua.getXiaGuaAs());
data.put("benGuaAs", meiHua.getBenGuaAs());
data.put("bianGuaAs", meiHua.getBianGuaAs());
data.put("huGuaAs", meiHua.getHuGuaAs());
data.put("cuoGuaAs", meiHua.getCuoGuaAs());
data.put("zongGuaAs", meiHua.getZongGuaAs());
data.put("benGuaGuaCi", meiHua.getBenGuaGuaCi());
data.put("bianGuaGuaCi", meiHua.getBianGuaGuaCi());
data.put("huGuaGuaCi", meiHua.getHuGuaGuaCi());
data.put("cuoGuaGuaCi", meiHua.getCuoGuaGuaCi());
data.put("zongGuaGuaCi", meiHua.getZongGuaGuaCi());
data.put("benGuaShangGuaName", meiHua.getBenGuaShangGuaName());
data.put("bianGuaShangGuaName", meiHua.getBianGuaShangGuaName());
data.put("huGuaShangGuaName", meiHua.getHuGuaShangGuaName());
data.put("cuoGuaShangGuaName", meiHua.getCuoGuaShangGuaName());
data.put("zongGuaShangGuaName", meiHua.getZongGuaShangGuaName());
data.put("benGuaXiaGuaName", meiHua.getBenGuaXiaGuaName());
data.put("bianGuaXiaGuaName", meiHua.getBianGuaXiaGuaName());
data.put("huGuaXiaGuaName", meiHua.getHuGuaXiaGuaName());
data.put("cuoGuaXiaGuaName", meiHua.getCuoGuaXiaGuaName());
data.put("zongGuaXiaGuaName", meiHua.getZongGuaXiaGuaName());
data.put("benGuaShangGuaAs", meiHua.getBenGuaShangGuaAs());
data.put("bianGuaShangGuaAs", meiHua.getBianGuaShangGuaAs());
data.put("huGuaShangGuaAs", meiHua.getHuGuaShangGuaAs());
data.put("cuoGuaShangGuaAs", meiHua.getCuoGuaShangGuaAs());
data.put("zongGuaShangGuaAs", meiHua.getZongGuaShangGuaAs());
data.put("benGuaXiaGuaAs", meiHua.getBenGuaXiaGuaAs());
data.put("bianGuaXiaGuaAs", meiHua.getBianGuaXiaGuaAs());
data.put("huGuaXiaGuaAs", meiHua.getHuGuaXiaGuaAs());
data.put("cuoGuaXiaGuaAs", meiHua.getCuoGuaXiaGuaAs());
data.put("zongGuaXiaGuaAs", meiHua.getZongGuaXiaGuaAs());
data.put("benGuaLiuYaoName", meiHua.getBenGuaLiuYaoName());
data.put("bianGuaLiuYaoName", meiHua.getBianGuaLiuYaoName());
data.put("huGuaLiuYaoName", meiHua.getHuGuaLiuYaoName());
data.put("cuoGuaLiuYaoName", meiHua.getCuoGuaLiuYaoName());
data.put("zongGuaLiuYaoName", meiHua.getZongGuaLiuYaoName());
data.put("benGuaLiuYaoAs", meiHua.getBenGuaLiuYaoAs());
data.put("bianGuaLiuYaoAs", meiHua.getBianGuaLiuYaoAs());
data.put("huGuaLiuYaoAs", meiHua.getHuGuaLiuYaoAs());
data.put("cuoGuaLiuYaoAs", meiHua.getCuoGuaLiuYaoAs());
data.put("zongGuaLiuYaoAs", meiHua.getZongGuaLiuYaoAs());
data.put("benGuaLiuYaoYaoCi", meiHua.getBenGuaLiuYaoYaoCi());
data.put("bianGuaLiuYaoYaoCi", meiHua.getBianGuaLiuYaoYaoCi());
data.put("huGuaLiuYaoYaoCi", meiHua.getHuGuaLiuYaoYaoCi());
data.put("cuoGuaLiuYaoYaoCi", meiHua.getCuoGuaLiuYaoYaoCi());
data.put("zongGuaLiuYaoYaoCi", meiHua.getZongGuaLiuYaoYaoCi());
data.put("benGuaLink", meiHua.getBenGuaLink());
data.put("bianGuaLink", meiHua.getBianGuaLink());
data.put("huGuaLink", meiHua.getHuGuaLink());
data.put("cuoGuaLink", meiHua.getCuoGuaLink());
data.put("zongGuaLink", meiHua.getZongGuaLink());
data.put("dongYao", meiHua.getDongYao());
data.put("dongYaoStr", meiHua.getDongYaoStr());
data.put("guaMa", meiHua.getGuaMa());
return data;
}
@@ -233,5 +148,4 @@ public class MeiHuaController {
public Integer getDongYaoType() { return dongYaoType; }
public void setDongYaoType(Integer dongYaoType) { this.dongYaoType = dongYaoType; }
}
}
@@ -3,6 +3,8 @@ package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.core.qimen.zhuan.QiMenZhuanPan;
import xuan.core.qimen.zhuan.settings.QiMenZhuanPanJiChuSetting;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.HashMap;
import java.util.Map;
@@ -11,6 +13,8 @@ import java.util.Map;
@RequestMapping("/api/qimen")
public class QiMenController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody QiMenRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -33,8 +37,16 @@ public class QiMenController {
QiMenZhuanPan qiMen = new QiMenZhuanPan(setting);
Map<String, Object> data = buildQiMenData(qiMen);
String aiAnalysis = aiService.chat(
PromptTemplates.getQiMenSystemPrompt(),
PromptTemplates.getQiMenUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildQiMenData(qiMen));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -49,126 +61,24 @@ public class QiMenController {
data.put("occupy", qiMen.getOccupy());
data.put("sex", qiMen.getSex());
data.put("age", qiMen.getAge());
data.put("zao", qiMen.getZao());
data.put("solar", qiMen.getSolarStr2());
data.put("lunar", qiMen.getLunarStr2());
data.put("xingQi", qiMen.getXingQi());
data.put("jiJie", qiMen.getJiJie());
data.put("shengXiao", qiMen.getShengXiao());
data.put("xingZuo", qiMen.getXingZuo());
data.put("yueXiang", qiMen.getYueXiang());
data.put("yueJiang", qiMen.getYueJiang());
data.put("yueJiangShen", qiMen.getYueJiangShen());
data.put("wuBuYuShi", qiMen.getWuBuYuShi());
data.put("yearGan", qiMen.getYearGan());
data.put("monthGan", qiMen.getMonthGan());
data.put("dayGan", qiMen.getDayGan());
data.put("hourGan", qiMen.getHourGan());
data.put("yearZhi", qiMen.getYearZhi());
data.put("monthZhi", qiMen.getMonthZhi());
data.put("dayZhi", qiMen.getDayZhi());
data.put("hourZhi", qiMen.getHourZhi());
data.put("yearGanZhi", qiMen.getYearGanZhi());
data.put("monthGanZhi", qiMen.getMonthGanZhi());
data.put("dayGanZhi", qiMen.getDayGanZhi());
data.put("hourGanZhi", qiMen.getHourGanZhi());
data.put("yearGanWuXing", qiMen.getYearGanWuXing());
data.put("monthGanWuXing", qiMen.getMonthGanWuXing());
data.put("dayGanWuXing", qiMen.getDayGanWuXing());
data.put("hourGanWuXing", qiMen.getHourGanWuXing());
data.put("yearZhiWuXing", qiMen.getYearZhiWuXing());
data.put("monthZhiWuXing", qiMen.getMonthZhiWuXing());
data.put("dayZhiWuXing", qiMen.getDayZhiWuXing());
data.put("hourZhiWuXing", qiMen.getHourZhiWuXing());
data.put("yearGanZhiWuXing", qiMen.getYearGanZhiWuXing());
data.put("monthGanZhiWuXing", qiMen.getMonthGanZhiWuXing());
data.put("dayGanZhiWuXing", qiMen.getDayGanZhiWuXing());
data.put("hourGanZhiWuXing", qiMen.getHourGanZhiWuXing());
data.put("yearGanZhiNaYin", qiMen.getYearGanZhiNaYin());
data.put("monthGanZhiNaYin", qiMen.getMonthGanZhiNaYin());
data.put("dayGanZhiNaYin", qiMen.getDayGanZhiNaYin());
data.put("hourGanZhiNaYin", qiMen.getHourGanZhiNaYin());
data.put("yearGanZhiKongWang", qiMen.getYearGanZhiKongWang());
data.put("monthGanZhiKongWang", qiMen.getMonthGanZhiKongWang());
data.put("dayGanZhiKongWang", qiMen.getDayGanZhiKongWang());
data.put("hourGanZhiKongWang", qiMen.getHourGanZhiKongWang());
data.put("prevJie", qiMen.getPrevJie());
data.put("prevJieDateStr", qiMen.getPrevJieDateStr());
data.put("prevJieDay", qiMen.getPrevJieDay());
data.put("nextJie", qiMen.getNextJie());
data.put("nextJieDateStr", qiMen.getNextJieDateStr());
data.put("nextJieDay", qiMen.getNextJieDay());
data.put("chuShengJie", qiMen.getChuShengJie());
data.put("prevQi", qiMen.getPrevQi());
data.put("prevQiDateStr", qiMen.getPrevQiDateStr());
data.put("prevQiDay", qiMen.getPrevQiDay());
data.put("nextQi", qiMen.getNextQi());
data.put("nextQiDateStr", qiMen.getNextQiDateStr());
data.put("nextQiDay", qiMen.getNextQiDay());
data.put("chuShengQi", qiMen.getChuShengQi());
data.put("fuTou", qiMen.getFuTou());
data.put("jieQi", qiMen.getJieQi());
data.put("sanYuan", qiMen.getSanYuan());
data.put("juShu", qiMen.getJuShu());
data.put("yinYangDun", qiMen.getYinYangDun());
data.put("xunShou", qiMen.getXunShou());
data.put("xunShouYiZhang", qiMen.getXunShouYiZhang());
data.put("zhiFu", qiMen.getZhiFu());
data.put("zhiShi", qiMen.getZhiShi());
data.put("liuJiaXunKong", qiMen.getLiuJiaXunKong());
data.put("liuJiaXunKongGongWei", qiMen.getLiuJiaXunKongGongWei());
data.put("liuJiaXunKongGongWeiMark", qiMen.getLiuJiaXunKongGongWeiMark());
data.put("yiMa", qiMen.getYiMa());
data.put("yiMaGongWei", qiMen.getYiMaGongWei());
data.put("yiMaGongWeiMark", qiMen.getYiMaGongWeiMark());
data.put("diPan", qiMen.getDiPan());
data.put("tianPan", qiMen.getTianPan());
data.put("renPan", qiMen.getRenPan());
data.put("shenPan", qiMen.getShenPan());
data.put("tianPanQiYiTianQinNo", qiMen.getTianPanQiYiTianQinNo());
data.put("tianPanQiYiTianQinYes", qiMen.getTianPanQiYiTianQinYes());
data.put("tianYi", qiMen.getTianYi());
data.put("diYi", qiMen.getDiYi());
data.put("taiYi", qiMen.getTaiYi());
data.put("jiuDun", qiMen.getJiuDun());
data.put("neiWaiGongWeiMark", qiMen.getNeiWaiGongWeiMark());
data.put("neiWaiGongWeiInfo", qiMen.getNeiWaiGongWeiInfo());
data.put("tianMen", qiMen.getTianMen());
data.put("diHu", qiMen.getDiHu());
data.put("fuYin", qiMen.getFuYin());
data.put("fanYin", qiMen.getFanYin());
data.put("liuYiJiXing", qiMen.getLiuYiJiXing());
data.put("qiYiRuMu", qiMen.getQiYiRuMu());
data.put("liuYiJiXingRuMuTianQinNoStatus", qiMen.getLiuYiJiXingRuMuTianQinNoStatus());
data.put("liuYiJiXingRuMuTianQinYesStatus", qiMen.getLiuYiJiXingRuMuTianQinYesStatus());
data.put("menPoStatus", qiMen.getMenPoStatus());
data.put("shiGanKeYing", qiMen.getShiGanKeYing());
data.put("baMenKeYing", qiMen.getBaMenKeYing());
data.put("baMenJingYing", qiMen.getBaMenJingYing());
data.put("baMenDongYing", qiMen.getBaMenDongYing());
data.put("xingMenKeYing", qiMen.getXingMenKeYing());
data.put("jiuXingShiYing", qiMen.getJiuXingShiYing());
data.put("baGuaWangShuai", qiMen.getBaGuaWangShuai());
data.put("baMenWangShuai", qiMen.getBaMenWangShuai());
data.put("jiuXingWangShuai", qiMen.getJiuXingWangShuai());
data.put("baShenLuoGongStatus", qiMen.getBaShenLuoGongStatus());
data.put("baMenLuoGongStatus", qiMen.getBaMenLuoGongStatus());
data.put("jiuXingLuoGongStatus", qiMen.getJiuXingLuoGongStatus());
data.put("diPanQiYiLuoGongLink", qiMen.getDiPanQiYiLuoGongLink());
data.put("tianPanQiYiLuoGongTianQinNoLink", qiMen.getTianPanQiYiLuoGongTianQinNoLink());
data.put("tianPanQiYiLuoGongTianQinYesLink", qiMen.getTianPanQiYiLuoGongTianQinYesLink());
return data;
}
@@ -218,5 +128,4 @@ public class QiMenController {
public Integer getDayGanZhiType() { return dayGanZhiType; }
public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; }
}
}
@@ -1,12 +1,17 @@
package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.*;
@RestController
@RequestMapping("/api/taluo")
public class TaLuoController {
private final HunYuanAiService aiService = new HunYuanAiService();
private static final List<Map<String, Object>> MAJOR_ARCANA = Arrays.asList(
createCard(0, "愚者", "The Fool", "新的开始、冒险、天真、自由", "鲁莽、冲动、不负责任", "代表新的旅程和无限可能"),
createCard(1, "魔术师", "The Magician", "创造力、技能、意志力、自信", "欺骗、操纵、缺乏计划", "代表运用技能实现目标"),
@@ -32,8 +37,6 @@ public class TaLuoController {
createCard(21, "世界", "The World", "完成、成就、整合、圆满", "未完成、缺乏闭合、延迟成功", "代表完成和圆满")
);
private static final List<Map<String, Object>> MINOR_ARCANA = createMinorArcana();
private static Map<String, Object> createCard(int number, String name, String englishName,
String uprightMeaning, String reversedMeaning, String description) {
Map<String, Object> card = new HashMap<>();
@@ -43,82 +46,10 @@ public class TaLuoController {
card.put("uprightMeaning", uprightMeaning);
card.put("reversedMeaning", reversedMeaning);
card.put("description", description);
card.put("type", number < 22 ? "major" : "minor");
card.put("type", "major");
return card;
}
private static List<Map<String, Object>> createMinorArcana() {
List<Map<String, Object>> cards = new ArrayList<>();
String[] suits = {"权杖", "圣杯", "宝剑", "星币"};
String[] suitMeanings = {"行动与创造", "情感与关系", "思想与沟通", "物质与现实"};
String[] ranks = {"Ace", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", "侍从", "骑士", "王后", "国王"};
int cardNumber = 22;
for (int suitIndex = 0; suitIndex < suits.length; suitIndex++) {
String suit = suits[suitIndex];
String suitMeaning = suitMeanings[suitIndex];
for (int rankIndex = 0; rankIndex < ranks.length; rankIndex++) {
String rank = ranks[rankIndex];
String cardName = suit + rank;
Map<String, Object> card = new HashMap<>();
card.put("number", cardNumber++);
card.put("name", cardName);
card.put("englishName", rank + " of " + getSuitEnglish(suit));
card.put("suit", suit);
card.put("rank", rank);
card.put("uprightMeaning", generateUprightMeaning(suit, rank, suitMeaning));
card.put("reversedMeaning", generateReversedMeaning(suit, rank, suitMeaning));
card.put("description", suitMeaning + "领域的" + getRankDescription(rank));
card.put("type", "minor");
cards.add(card);
}
}
return cards;
}
private static String getSuitEnglish(String suit) {
switch (suit) {
case "权杖": return "Wands";
case "圣杯": return "Cups";
case "宝剑": return "Swords";
case "星币": return "Pentacles";
default: return suit;
}
}
private static String getRankDescription(String rank) {
switch (rank) {
case "Ace": return "新的开始";
case "Two": return "选择与平衡";
case "Three": return "发展与创造";
case "Four": return "稳定与基础";
case "Five": return "冲突与挑战";
case "Six": return "和谐与胜利";
case "Seven": return "评估与选择";
case "Eight": return "行动与速度";
case "Nine": return "接近完成";
case "Ten": return "完成与圆满";
case "侍从": return "学习与探索";
case "骑士": return "行动与追求";
case "王后": return "内在智慧";
case "国王": return "掌控与权威";
default: return rank;
}
}
private static String generateUprightMeaning(String suit, String rank, String suitMeaning) {
return suitMeaning + "方面的" + getRankDescription(rank) + ",正位时能量流动顺畅";
}
private static String generateReversedMeaning(String suit, String rank, String suitMeaning) {
return suitMeaning + "方面的" + getRankDescription(rank) + ",逆位时需要反思调整";
}
@PostMapping("/divine")
public Map<String, Object> divine(@RequestBody TaLuoRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -126,9 +57,7 @@ public class TaLuoController {
String spreadType = request.getSpreadType() != null ? request.getSpreadType() : "single";
int cardCount = getCardCount(spreadType);
List<Map<String, Object>> allCards = new ArrayList<>();
allCards.addAll(MAJOR_ARCANA);
allCards.addAll(MINOR_ARCANA);
List<Map<String, Object>> allCards = new ArrayList<>(MAJOR_ARCANA);
Collections.shuffle(allCards, new Random());
@@ -147,10 +76,14 @@ public class TaLuoController {
data.put("spreadName", getSpreadName(spreadType));
data.put("question", request.getQuestion());
data.put("cards", selectedCards);
data.put("interpretation", generateInterpretation(selectedCards, spreadType, request.getQuestion()));
data.put("summary", generateSummary(selectedCards, spreadType));
data.put("timestamp", new Date());
String aiAnalysis = aiService.chat(
PromptTemplates.getTaLuoSystemPrompt(),
PromptTemplates.getTaLuoUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", data);
} catch (Exception e) {
@@ -206,317 +139,6 @@ public class TaLuoController {
return "未知";
}
private String generateInterpretation(List<Map<String, Object>> cards, String spreadType, String question) {
StringBuilder interpretation = new StringBuilder();
if ("single".equals(spreadType)) {
Map<String, Object> card = cards.get(0);
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String meaning = isReversed ? (String) card.get("reversedMeaning") : (String) card.get("uprightMeaning");
interpretation.append("您抽到的牌是【").append(name).append("】");
interpretation.append(isReversed ? "(逆位)" : "(正位)").append("。\n\n");
interpretation.append("牌义解读:").append(meaning).append("。\n\n");
interpretation.append((String) card.get("description"));
} else if ("three".equals(spreadType)) {
interpretation.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");
interpretation.append("【").append(position).append("】");
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append("\n");
interpretation.append(meaning).append("\n\n");
}
interpretation.append("综合解读:从过去到现在再到未来,牌面展示了事情的发展脉络。");
} else if ("celtic".equals(spreadType)) {
interpretation.append("凯尔特十字牌阵解读:\n\n");
interpretation.append("核心区域(位置1-6):\n");
for (int i = 0; i < 6; i++) {
Map<String, Object> card = cards.get(i);
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");
interpretation.append("【").append(position).append("】");
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
interpretation.append(meaning).append("\n");
}
interpretation.append("\n延伸区域(位置7-10):\n");
for (int i = 6; i < 10; i++) {
Map<String, Object> card = cards.get(i);
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");
interpretation.append("【").append(position).append("】");
interpretation.append(name).append(isReversed ? "(逆位)" : "(正位)").append(":");
interpretation.append(meaning).append("\n");
}
interpretation.append("\n综合解读:凯尔特十字牌阵为您提供了全方位的视角,帮助您深入理解问题的各个方面。");
}
return interpretation.toString();
}
private Map<String, String> generateSummary(List<Map<String, Object>> cards, String spreadType) {
Map<String, String> summary = new HashMap<>();
summary.put("personality", generatePersonalityAnalysis(cards));
summary.put("emotion", generateEmotionAnalysis(cards));
summary.put("career", generateCareerAnalysis(cards));
summary.put("overall", generateOverallAdvice(cards, spreadType));
return summary;
}
private String generatePersonalityAnalysis(List<Map<String, Object>> cards) {
StringBuilder sb = new StringBuilder();
int majorCount = 0;
int reversedCount = 0;
boolean hasFool = false, hasMagician = false, hasHighPriestess = false, hasEmperor = false;
for (Map<String, Object> card : cards) {
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String type = (String) card.get("type");
if ("major".equals(type)) majorCount++;
if (isReversed) reversedCount++;
if ("愚者".equals(name)) hasFool = true;
if ("魔术师".equals(name)) hasMagician = true;
if ("女祭司".equals(name)) hasHighPriestess = true;
if ("皇帝".equals(name)) hasEmperor = true;
}
sb.append("【性格特质】\n");
if (majorCount > cards.size() / 2) {
sb.append("你的内心世界很丰富,经常思考人生的大问题。你是个有深度的人,不满足于表面的东西,总想探索更深层的意义。");
} else {
sb.append("你是个务实的人,更关注日常生活中的具体事务。你脚踏实地,做事有条理,是个值得信赖的人。");
}
sb.append("\n\n");
if (reversedCount > cards.size() / 2) {
sb.append("最近你可能感到有些迷茫,内心有些矛盾。这是正常的,说明你在反思和成长。给自己一点时间,不要着急。");
} else {
sb.append("你目前的状态比较积极向上,心态比较平和。继续保持这种状态,会让你更容易应对生活中的挑战。");
}
sb.append("\n\n");
if (hasFool) {
sb.append("你有一颗年轻的心,充满好奇心和冒险精神。你愿意尝试新事物,不怕失败,这是很宝贵的品质。");
}
if (hasMagician) {
sb.append("你很有创造力和执行力,能够把自己的想法变成现实。你善于利用身边的资源,是个有能力的人。");
}
if (hasHighPriestess) {
sb.append("你的直觉很敏锐,常常能感知到别人察觉不到的东西。你善于倾听内心的声音,这是你的优势。");
}
if (hasEmperor) {
sb.append("你有领导才能,善于规划和组织。你做事有原则,有责任感,是个可以依靠的人。");
}
return sb.toString();
}
private String generateEmotionAnalysis(List<Map<String, Object>> cards) {
StringBuilder sb = new StringBuilder();
sb.append("【感情运势】\n");
boolean hasLovers = false, hasEmpress = false, hasStar = false, hasMoon = false;
boolean hasCups = false;
int reversedCount = 0;
for (Map<String, Object> card : cards) {
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String suit = (String) card.get("suit");
if (isReversed) reversedCount++;
if ("恋人".equals(name)) hasLovers = true;
if ("女皇".equals(name)) hasEmpress = true;
if ("星星".equals(name)) hasStar = true;
if ("月亮".equals(name)) hasMoon = true;
if ("圣杯".equals(suit)) hasCups = true;
}
if (hasLovers) {
sb.append("牌面显示你正在面临或即将面临一个重要的感情选择。这可能是一个转折点,需要你认真思考自己真正想要的是什么。");
} else if (hasEmpress) {
sb.append("你的感情生活充满温暖和关爱。你懂得如何去爱,也值得被爱。这段时期适合培养和加深感情关系。");
} else if (hasStar) {
sb.append("感情方面充满希望。如果你在寻找爱情,很快就会遇到让你心动的人。如果已有伴侣,你们的关系会更加和谐美满。");
} else if (hasMoon) {
sb.append("在感情方面,你可能感到有些困惑或不确定。这可能是因为信息不完整,或者你还没有看清事情的全貌。建议多沟通,不要急于下结论。");
} else if (hasCups) {
sb.append("你的感情世界比较丰富,最近可能会有一些情感上的波动。这是正常的,说明你对感情很投入。");
} else {
if (reversedCount > cards.size() / 2) {
sb.append("最近感情方面可能有些不太顺利,但这只是暂时的。保持开放的心态,真诚地对待他人,情况会慢慢好转。");
} else {
sb.append("你的感情生活比较平稳。虽然没有大的波澜,但这种平静也是一种幸福。珍惜身边的人,用心经营感情。");
}
}
sb.append("\n\n");
sb.append("建议:在感情中要保持真诚和耐心。不要因为一时的情绪波动而做出冲动的决定。多倾听对方的心声,也要勇敢表达自己的感受。");
return sb.toString();
}
private String generateCareerAnalysis(List<Map<String, Object>> cards) {
StringBuilder sb = new StringBuilder();
sb.append("【事业发展】\n");
boolean hasMagician = false, hasEmperor = false, hasChariot = false, hasWheel = false;
boolean hasWands = false, hasPentacles = false;
int reversedCount = 0;
for (Map<String, Object> card : cards) {
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String suit = (String) card.get("suit");
if (isReversed) reversedCount++;
if ("魔术师".equals(name)) hasMagician = true;
if ("皇帝".equals(name)) hasEmperor = true;
if ("战车".equals(name)) hasChariot = true;
if ("命运之轮".equals(name)) hasWheel = true;
if ("权杖".equals(suit)) hasWands = true;
if ("星币".equals(suit)) hasPentacles = true;
}
if (hasMagician) {
sb.append("你目前的工作能力很强,能够很好地运用自己的技能和资源。这是个展现才华的好时机,不要害怕表现自己。");
} else if (hasEmperor) {
sb.append("你在工作中展现出领导才能,善于管理和规划。如果有机会,可以尝试承担更多的责任,这会带来更好的发展机会。");
} else if (hasChariot) {
sb.append("事业正处于上升期,你的努力正在得到回报。保持这种势头,继续前进,你会取得更大的成功。");
} else if (hasWheel) {
sb.append("事业方面即将迎来转机,可能是新的机会或者环境的改变。保持开放的心态,抓住机遇,但也要做好充分的准备。");
} else if (hasWands) {
sb.append("工作中充满活力和创造力,你有很多好的想法和计划。现在是付诸行动的好时机,不要让机会从手中溜走。");
} else if (hasPentacles) {
sb.append("你的工作比较稳定,财务状况也不错。这是个积累的好时期,为未来打下坚实的基础。");
} else {
if (reversedCount > cards.size() / 2) {
sb.append("最近工作方面可能遇到一些挑战或阻碍。不要灰心,这些困难都是暂时的。调整好心态,寻找解决问题的方法。");
} else {
sb.append("你的事业发展比较平稳。虽然没有大的突破,但稳扎稳打也是一种进步。继续保持,机会总会来的。");
}
}
sb.append("\n\n");
sb.append("建议:在工作中要保持学习和成长的心态。不要满足于现状,要不断提升自己的能力。同时,也要注意工作与生活的平衡,不要过度劳累。");
return sb.toString();
}
private String generateOverallAdvice(List<Map<String, Object>> cards, String spreadType) {
StringBuilder sb = new StringBuilder();
sb.append("【总体建议】\n\n");
int reversedCount = 0;
int majorCount = 0;
boolean hasSun = false, hasWorld = false, hasTower = false, hasDeath = false;
for (Map<String, Object> card : cards) {
String name = (String) card.get("name");
boolean isReversed = (Boolean) card.get("isReversed");
String type = (String) card.get("type");
if (isReversed) reversedCount++;
if ("major".equals(type)) majorCount++;
if ("太阳".equals(name)) hasSun = true;
if ("世界".equals(name)) hasWorld = true;
if ("塔".equals(name)) hasTower = true;
if ("死神".equals(name)) hasDeath = true;
}
if (hasSun || hasWorld) {
sb.append("这是一个非常积极的信号!你正走在正确的道路上,未来充满光明和希望。继续保持积极的心态,好事即将发生。\n\n");
}
if (hasTower || hasDeath) {
sb.append("牌面显示可能会有一些变化或转折。不要害怕改变,有时候结束是为了更好的开始。接受变化,适应新的情况,你会发现新的机会。\n\n");
}
if (reversedCount > cards.size() / 2) {
sb.append("整体来看,你目前可能处于一个需要反思和调整的阶段。这并不是坏事,反而是一个重新审视自己、做出改变的好机会。");
} else {
sb.append("整体来看,你目前的状态不错,各方面都比较平衡。继续保持,同时也要注意细节,不要因为顺利而掉以轻心。");
}
sb.append("\n\n");
if (majorCount > cards.size() / 2) {
sb.append("这次占卜显示的都是大阿卡纳牌,说明你正在经历或即将经历一些重要的人生阶段。这些经历会让你成长,帮助你更好地理解自己和人生。");
}
sb.append("\n\n最后,记住塔罗牌只是提供指引,真正的决定权在你手中。相信自己的直觉,勇敢地面对生活,你一定能够创造属于自己的美好未来!");
return sb.toString();
}
@GetMapping("/cards")
public Map<String, Object> getAllCards() {
Map<String, Object> result = new HashMap<>();
try {
List<Map<String, Object>> allCards = new ArrayList<>();
allCards.addAll(MAJOR_ARCANA);
allCards.addAll(MINOR_ARCANA);
result.put("success", true);
result.put("data", allCards);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
@GetMapping("/card/{number}")
public Map<String, Object> getCard(@PathVariable int number) {
Map<String, Object> result = new HashMap<>();
try {
List<Map<String, Object>> allCards = new ArrayList<>();
allCards.addAll(MAJOR_ARCANA);
allCards.addAll(MINOR_ARCANA);
if (number >= 0 && number < allCards.size()) {
result.put("success", true);
result.put("data", allCards.get(number));
} else {
result.put("success", false);
result.put("error", "Card not found");
}
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
}
return result;
}
public static class TaLuoRequest {
private String question;
private String spreadType;
@@ -1,17 +1,29 @@
package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.*;
@RestController
@RequestMapping("/api/zhanxing")
public class ZhanXingController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody ZhanXingRequest request) {
Map<String, Object> result = new HashMap<>();
try {
Map<String, Object> data = buildZhanXingData(request);
String aiAnalysis = aiService.chat(
PromptTemplates.getZhanXingSystemPrompt(),
PromptTemplates.getZhanXingUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", data);
} catch (Exception e) {
@@ -180,5 +192,4 @@ public class ZhanXingController {
public String getBirthPlace() { return birthPlace; }
public void setBirthPlace(String birthPlace) { this.birthPlace = birthPlace; }
}
}
@@ -3,6 +3,8 @@ package xuan.controller;
import org.springframework.web.bind.annotation.*;
import xuan.core.ziwei.ZiWei;
import xuan.core.ziwei.settings.ZiWeiJiChuSetting;
import xuan.service.HunYuanAiService;
import xuan.service.PromptTemplates;
import java.util.*;
@@ -10,6 +12,8 @@ import java.util.*;
@RequestMapping("/api/ziwei")
public class ZiWeiController {
private final HunYuanAiService aiService = new HunYuanAiService();
@PostMapping("/paipan")
public Map<String, Object> paiPan(@RequestBody ZiWeiRequest request) {
Map<String, Object> result = new HashMap<>();
@@ -30,8 +34,16 @@ public class ZiWeiController {
ZiWei ziWei = new ZiWei(setting);
Map<String, Object> data = buildZiWeiData(ziWei);
String aiAnalysis = aiService.chat(
PromptTemplates.getZiWeiSystemPrompt(),
PromptTemplates.getZiWeiUserPrompt(data)
);
data.put("aiAnalysis", aiAnalysis);
result.put("success", true);
result.put("data", buildZiWeiData(ziWei));
result.put("data", data);
} catch (Exception e) {
result.put("success", false);
result.put("error", e.getMessage());
@@ -78,509 +90,8 @@ public class ZiWeiController {
data.put("huaKeXingGongWeiJieDu", ziWei.getHuaKeXingGongWeiJieDu());
data.put("huaJiXingGongWeiJieDu", ziWei.getHuaJiXingGongWeiJieDu());
data.put("jieDu", buildJieDu(ziWei, shiErGongZhuXing));
return data;
}
private Map<String, Object> buildJieDu(ZiWei ziWei, List<List<String>> shiErGongZhuXing) {
Map<String, Object> jieDu = new HashMap<>();
List<String> shiErMingGong = ziWei.getShiErMingGong();
int mingGongIndex = ziWei.getMingGongGongWei() - 1;
List<String> mingGongStars = shiErGongZhuXing.get(mingGongIndex);
List<String> mainStars = getMainStars(mingGongStars);
String xingGe = analyzeXingGe(mainStars);
String shiYe = analyzeShiYe(mainStars, ziWei, shiErMingGong, shiErGongZhuXing);
String ganQing = analyzeGanQing(ziWei, shiErMingGong, shiErGongZhuXing);
String caiYun = analyzeCaiYun(ziWei, shiErMingGong, shiErGongZhuXing);
jieDu.put("xingGe", xingGe);
jieDu.put("shiYe", shiYe);
jieDu.put("ganQing", ganQing);
jieDu.put("caiYun", caiYun);
String zongJie = buildZongJie(ziWei, mainStars, xingGe, shiYe, ganQing, caiYun);
jieDu.put("zongJie", zongJie);
return jieDu;
}
private List<String> getMainStars(List<String> stars) {
Set<String> mainStarSet = new HashSet<>(Arrays.asList(
"紫微", "天机", "太阳", "武曲", "天同", "廉贞",
"天府", "太阴", "贪狼", "巨门", "天相", "天梁", "七杀", "破军"
));
List<String> mainStars = new ArrayList<>();
for (String star : stars) {
if (mainStarSet.contains(star)) {
mainStars.add(star);
}
}
return mainStars;
}
private int getGongIndex(List<String> shiErMingGong, String gongName) {
for (int i = 0; i < shiErMingGong.size(); i++) {
if (gongName.equals(shiErMingGong.get(i))) {
return i;
}
}
return -1;
}
private String analyzeXingGe(List<String> mainStars) {
StringBuilder sb = new StringBuilder();
if (mainStars.isEmpty()) {
return "你是一个性格比较随和的人,没有特别强的主见,容易受环境影响。做事比较灵活,能够适应各种情况,但有时候也会显得优柔寡断。建议多培养自己的主见,学会独立思考。";
}
String firstStar = mainStars.get(0);
switch (firstStar) {
case "紫微":
sb.append("你是一个很有气场的人,天生就有一种领导范儿。");
if (mainStars.contains("天府")) {
sb.append("性格稳重踏实,做事有条理,不喜欢冒险。");
} else if (mainStars.contains("贪狼")) {
sb.append("既有野心又懂得享受生活,是个有情趣的人。");
} else if (mainStars.contains("天相")) {
sb.append("为人正直,讲究原则,是个值得信赖的人。");
}
sb.append("你比较注重面子,喜欢被人尊重的感觉,有时候会显得有点强势。");
break;
case "天机":
sb.append("你是一个很聪明的人,脑子转得快,想法多。");
sb.append("善于分析问题,喜欢琢磨事情,但有时候想得太多反而会犹豫不决。");
sb.append("你比较敏感,能够察觉到别人的情绪变化,是个很好的倾听者。");
break;
case "太阳":
sb.append("你是一个阳光开朗的人,热情大方,喜欢交朋友。");
sb.append("做事积极主动,不喜欢拖拖拉拉,但有时候会显得有点急躁。");
sb.append("你很有正义感,看不惯不公平的事,愿意帮助别人。");
break;
case "武曲":
sb.append("你是一个很务实的人,做事讲究效率,不喜欢虚头巴脑的东西。");
sb.append("性格比较刚强,有话直说,有时候会得罪人。");
sb.append("你对金钱比较敏感,有理财头脑,是个会过日子的人。");
break;
case "天同":
sb.append("你是一个很温和的人,性格随和,不爱和人计较。");
sb.append("喜欢安逸的生活,不喜欢太累太辛苦的事。");
sb.append("你人缘很好,大家都愿意和你相处,是个有福气的人。");
break;
case "廉贞":
sb.append("你是一个很有魅力的人,感情丰富,有艺术细胞。");
sb.append("做事有冲劲,但有时候会情绪化。");
sb.append("你比较注重外表和形象,喜欢美好的事物。");
break;
case "天府":
sb.append("你是一个稳重踏实的人,做事有条不紊,不喜欢冒险。");
sb.append("很会理财,懂得积累,是个有财运的人。");
sb.append("你比较保守,不喜欢变动,追求安稳的生活。");
break;
case "太阴":
sb.append("你是一个心思细腻的人,感情丰富,直觉很准。");
sb.append("比较内向,不太喜欢太热闹的场合,喜欢安静的环境。");
sb.append("你很有艺术天分,对美的事物有独特的见解。");
break;
case "贪狼":
sb.append("你是一个很有活力的人,兴趣广泛,喜欢尝试新鲜事物。");
sb.append("社交能力强,朋友多,但有时候会三分钟热度。");
sb.append("你比较追求物质享受,喜欢美好的生活。");
break;
case "巨门":
sb.append("你是一个很会说话的人,口才好,善于表达。");
sb.append("观察力强,能够看到别人看不到的问题,但有时候会想太多。");
sb.append("你比较敏感,容易多心,建议学会放宽心态。");
break;
case "天相":
sb.append("你是一个正直善良的人,讲究原则,有正义感。");
sb.append("做事稳重,不喜欢投机取巧,是个值得信赖的人。");
sb.append("你很注重人际关系,懂得如何与人相处。");
break;
case "天梁":
sb.append("你是一个很有爱心的人,喜欢帮助别人,有长辈缘。");
sb.append("性格成熟稳重,做事有担当,是个可靠的人。");
sb.append("你比较传统,重视家庭,是个顾家的人。");
break;
case "七杀":
sb.append("你是一个很有魄力的人,做事果断,敢想敢干。");
sb.append("性格比较强势,不喜欢被人管,有独立精神。");
sb.append("你很有领导才能,但有时候会显得太冲动。");
break;
case "破军":
sb.append("你是一个很有个性的人,不喜欢墨守成规,喜欢打破常规。");
sb.append("做事有冲劲,但有时候会显得太急躁。");
sb.append("你的人生变动比较多,建议学会稳中求进。");
break;
default:
sb.append("你是一个性格独特的人,有自己的想法和追求。");
}
return sb.toString();
}
private String analyzeShiYe(List<String> mainStars, ZiWei ziWei, List<String> shiErMingGong, List<List<String>> shiErGongZhuXing) {
StringBuilder sb = new StringBuilder();
int guanLuIndex = getGongIndex(shiErMingGong, "官禄宫");
int qianYiIndex = getGongIndex(shiErMingGong, "迁移宫");
List<String> guanLuStars = guanLuIndex >= 0 ? getMainStars(shiErGongZhuXing.get(guanLuIndex)) : new ArrayList<>();
List<String> qianYiStars = qianYiIndex >= 0 ? getMainStars(shiErGongZhuXing.get(qianYiIndex)) : new ArrayList<>();
String firstStar = mainStars.isEmpty() ? "" : mainStars.get(0);
sb.append("【适合的工作方向】\n");
switch (firstStar) {
case "紫微":
case "天府":
sb.append("你天生就是当领导的料,适合做管理工作。");
sb.append("可以考虑往企业管理、政府部门、大型机构发展。");
sb.append("你比较适合稳定的平台,不太适合从零开始创业。");
break;
case "天机":
case "太阴":
sb.append("你脑子好使,适合做需要动脑子的工作。");
sb.append("可以考虑策划、咨询、设计、写作、研究等方向。");
sb.append("你比较适合在专业领域深耕,成为某个领域的专家。");
break;
case "太阳":
case "天相":
sb.append("你适合做需要和人打交道的工作。");
sb.append("可以考虑公务员、律师、教师、人力资源等方向。");
sb.append("你比较适合稳定的体制内工作,或者大型正规企业。");
break;
case "武曲":
sb.append("你对数字敏感,适合做和钱打交道的工作。");
sb.append("可以考虑金融、财务、投资、商业等方向。");
sb.append("你比较务实,适合实实在在能赚钱的行业。");
break;
case "贪狼":
case "廉贞":
sb.append("你适合做需要表现力和社交能力的工作。");
sb.append("可以考虑销售、演艺、公关、市场营销等方向。");
sb.append("你比较适合能发挥个人魅力的行业。");
break;
case "七杀":
case "破军":
sb.append("你适合做有挑战性的工作,不喜欢一成不变。");
sb.append("可以考虑创业、投资、军警、体育等方向。");
sb.append("你比较适合能发挥个人能力的舞台,不太适合被人管着。");
break;
case "天同":
case "天梁":
sb.append("你适合做服务性质的工作,有耐心有爱心。");
sb.append("可以考虑医疗、教育、社工、服务业等方向。");
sb.append("你比较适合稳定、压力不太大的工作环境。");
break;
case "巨门":
sb.append("你口才好,适合做需要说话的工作。");
sb.append("可以考虑律师、教师、主持人、销售、咨询等方向。");
sb.append("你比较适合能发挥口才优势的行业。");
break;
default:
sb.append("你可以根据自己的兴趣和特长选择发展方向。");
sb.append("建议多尝试不同的工作,找到最适合自己的方向。");
}
sb.append("\n\n【事业发展建议】\n");
if (!guanLuStars.isEmpty()) {
String guanLuStar = guanLuStars.get(0);
if ("紫微".equals(guanLuStar) || "天府".equals(guanLuStar)) {
sb.append("你的事业运势不错,容易得到贵人相助,发展会比较顺利。");
} else if ("七杀".equals(guanLuStar) || "破军".equals(guanLuStar)) {
sb.append("你的事业变动会比较多,建议稳扎稳打,不要急于求成。");
} else if ("太阳".equals(guanLuStar)) {
sb.append("你的事业运势旺盛,适合往外发展,多接触外面的机会。");
} else if ("太阴".equals(guanLuStar)) {
sb.append("你的事业发展比较平稳,适合稳中求进,不要太冒进。");
}
}
return sb.toString();
}
private String analyzeGanQing(ZiWei ziWei, List<String> shiErMingGong, List<List<String>> shiErGongZhuXing) {
StringBuilder sb = new StringBuilder();
int fuQiIndex = getGongIndex(shiErMingGong, "夫妻宫");
int ziNvIndex = getGongIndex(shiErMingGong, "子女宫");
List<String> fuQiStars = fuQiIndex >= 0 ? getMainStars(shiErGongZhuXing.get(fuQiIndex)) : new ArrayList<>();
sb.append("【感情婚姻分析】\n");
if (fuQiStars.isEmpty()) {
sb.append("你的感情运势比较平淡,婚姻生活相对稳定。");
sb.append("另一半可能是一个性格温和、不张扬的人。");
sb.append("你们的感情不会太轰轰烈烈,但会比较长久稳定。");
} else {
String fuQiStar = fuQiStars.get(0);
switch (fuQiStar) {
case "紫微":
case "天府":
sb.append("你的另一半可能是一个有能力、有地位的人。");
sb.append("对方性格比较强势,在家里可能说一不二。");
sb.append("你们的婚姻比较稳定,但要注意互相尊重。");
break;
case "天机":
case "太阴":
sb.append("你的另一半可能是一个心思细腻、温柔体贴的人。");
sb.append("对方比较顾家,会照顾人,但有时候会想太多。");
sb.append("你们的感情比较细腻,需要多沟通。");
break;
case "太阳":
sb.append("你的另一半可能是一个开朗热情的人。");
sb.append("对方比较外向,喜欢社交,人缘很好。");
sb.append("你们的感情比较阳光,充满正能量。");
break;
case "武曲":
sb.append("你的另一半可能是一个务实、有经济头脑的人。");
sb.append("对方比较会过日子,但有时候会显得太现实。");
sb.append("你们的婚姻比较务实,注重物质基础。");
break;
case "贪狼":
case "廉贞":
sb.append("你的另一半可能是一个有魅力、有情趣的人。");
sb.append("对方比较会享受生活,但有时候会显得花心。");
sb.append("你们的感情比较浪漫,但要注意专一。");
break;
case "七杀":
case "破军":
sb.append("你的另一半可能是一个有个性、有主见的人。");
sb.append("对方性格比较强势,不喜欢被人管。");
sb.append("你们的感情可能会有波折,需要多包容。");
break;
case "天同":
sb.append("你的另一半可能是一个温和、好相处的人。");
sb.append("对方比较随和,不喜欢争吵。");
sb.append("你们的感情比较和谐,生活平淡但幸福。");
break;
case "巨门":
sb.append("你的另一半可能是一个能说会道的人。");
sb.append("对方口才好,但有时候会和你抬杠。");
sb.append("你们的感情需要多沟通,避免误会。");
break;
case "天相":
sb.append("你的另一半可能是一个正直、有原则的人。");
sb.append("对方比较传统,重视家庭。");
sb.append("你们的感情比较稳定,互相尊重。");
break;
case "天梁":
sb.append("你的另一半可能是一个成熟、有担当的人。");
sb.append("对方比较顾家,会照顾人。");
sb.append("你们的感情比较稳定,对方会给你安全感。");
break;
default:
sb.append("你的感情运势比较正常,婚姻生活相对平稳。");
}
}
sb.append("\n\n【感情建议】\n");
sb.append("感情需要经营,建议多沟通、多理解、多包容。");
sb.append("遇到问题及时解决,不要冷战。");
sb.append("珍惜眼前人,用心经营你的感情。");
return sb.toString();
}
private String analyzeCaiYun(ZiWei ziWei, List<String> shiErMingGong, List<List<String>> shiErGongZhuXing) {
StringBuilder sb = new StringBuilder();
int caiBoIndex = getGongIndex(shiErMingGong, "财帛宫");
List<String> caiBoStars = caiBoIndex >= 0 ? getMainStars(shiErGongZhuXing.get(caiBoIndex)) : new ArrayList<>();
sb.append("【财运分析】\n");
if (caiBoStars.isEmpty()) {
sb.append("你的财运比较平稳,不会大起大落。");
sb.append("收入来源比较稳定,但不会有太多意外之财。");
sb.append("建议量入为出,做好理财规划。");
} else {
String caiBoStar = caiBoStars.get(0);
switch (caiBoStar) {
case "紫微":
case "天府":
sb.append("你的财运不错,容易积累财富。");
sb.append("收入稳定,有存钱的习惯。");
sb.append("适合稳健投资,不宜冒险。");
break;
case "武曲":
sb.append("你是一个有财运的人,对金钱敏感。");
sb.append("理财能力强,会赚钱也会存钱。");
sb.append("适合做和钱打交道的工作,财运会比较旺。");
break;
case "太阴":
sb.append("你的财运比较平稳,适合慢慢积累。");
sb.append("不宜冒险投资,稳健为主。");
sb.append("可能有一些偏财运,但不要指望一夜暴富。");
break;
case "贪狼":
sb.append("你的财运起伏比较大,有时候很旺,有时候一般。");
sb.append("可能有一些偏财运,但不要贪心。");
sb.append("建议稳健理财,不要投机取巧。");
break;
case "太阳":
sb.append("你的财运和事业挂钩,事业好财运就好。");
sb.append("适合靠努力工作赚钱,不太适合投资。");
sb.append("收入可能比较公开透明。");
break;
case "七杀":
case "破军":
sb.append("你的财运起伏比较大,可能有大起大落。");
sb.append("有时候会有一笔大收入,但花销也大。");
sb.append("建议做好财务规划,不要冲动消费。");
break;
case "天机":
sb.append("你的财运需要动脑子,靠智慧赚钱。");
sb.append("适合做一些需要策划、分析的工作。");
sb.append("收入可能不太稳定,但总体还行。");
break;
case "天同":
sb.append("你的财运比较平稳,不会太差也不会太好。");
sb.append("适合安稳的工作,不太适合冒险。");
sb.append("可能有一些意外之财,但不要指望。");
break;
case "廉贞":
sb.append("你的财运和人际关系有关,靠人脉赚钱。");
sb.append("可能有一些偏财运,但要注意风险。");
sb.append("建议稳健为主,不要贪心。");
break;
default:
sb.append("你的财运比较正常,不会大富大贵,也不会太差。");
sb.append("建议量入为出,做好理财规划。");
}
}
sb.append("\n\n【理财建议】\n");
sb.append("不管财运好坏,都要学会理财。");
sb.append("收入再高,不会理财也是白搭。");
sb.append("建议养成记账的习惯,控制不必要的开支。");
return sb.toString();
}
private String buildZongJie(ZiWei ziWei, List<String> mainStars, String xingGe, String shiYe, String ganQing, String caiYun) {
StringBuilder sb = new StringBuilder();
sb.append("【命盘总评】\n\n");
sb.append("根据你的出生时间排出的紫微命盘,以下是通俗易懂的解读:\n\n");
sb.append("你的命宫在").append(ziWei.getMingGongDiZhi()).append("宫");
if (!mainStars.isEmpty()) {
sb.append(",主星是").append(String.join("和", mainStars));
}
sb.append("。").append(ziWei.getWuXingJu()).append(",说明你的人生节奏是").append(getWuXingJuDesc(ziWei.getWuXingJu())).append("。\n\n");
sb.append("命主").append(ziWei.getMingZhu()).append(",身主").append(ziWei.getShenZhu()).append("。");
sb.append("这说明你内在追求的是").append(getMingZhuDesc(ziWei.getMingZhu()));
sb.append(",外在表现的是").append(getShenZhuDesc(ziWei.getShenZhu())).append("。\n\n");
sb.append("【重要提醒】\n");
sb.append("命盘只是参考,命运掌握在自己手中。");
sb.append("了解自己的优势和短板,扬长避短,才能过上更好的生活。");
sb.append("不管命盘如何,努力和善良永远是最重要的。");
return sb.toString();
}
private String getWuXingJuDesc(String wuXingJu) {
if (wuXingJu.contains("水二")) {
return "比较灵活多变,适应能力强";
} else if (wuXingJu.contains("木三")) {
return "比较稳健,有成长性";
} else if (wuXingJu.contains("金四")) {
return "比较务实,注重实际";
} else if (wuXingJu.contains("土五")) {
return "比较稳重,厚积薄发";
} else if (wuXingJu.contains("火六")) {
return "比较快速,有冲劲";
}
return "比较平稳";
}
private String getMingZhuDesc(String mingZhu) {
Map<String, String> descMap = new HashMap<>();
descMap.put("贪狼", "物质享受和人生体验");
descMap.put("巨门", "表达和沟通");
descMap.put("禄存", "稳定和积累");
descMap.put("文曲", "文艺和才华");
descMap.put("廉贞", "情感和魅力");
descMap.put("武曲", "财富和成就");
descMap.put("破军", "变革和突破");
descMap.put("左辅", "帮助和服务");
descMap.put("右弼", "支持和配合");
descMap.put("文昌", "学业和知识");
descMap.put("天相", "公正和平衡");
descMap.put("天梁", "庇护和关怀");
descMap.put("七杀", "权力和掌控");
descMap.put("天同", "安逸和享受");
return descMap.getOrDefault(mingZhu, "自我实现");
}
private String getShenZhuDesc(String shenZhu) {
Map<String, String> descMap = new HashMap<>();
descMap.put("火星", "热情和行动力");
descMap.put("铃星", "内敛和思考");
descMap.put("天相", "正直和公正");
descMap.put("天梁", "稳重和可靠");
descMap.put("天同", "温和和随和");
descMap.put("文昌", "学习和思考");
descMap.put("文曲", "艺术和浪漫");
return descMap.getOrDefault(shenZhu, "个人特质");
}
public static class ZiWeiRequest {
private String name;
@@ -621,5 +132,4 @@ public class ZiWeiController {
public Integer getDayGanZhiType() { return dayGanZhiType; }
public void setDayGanZhiType(Integer dayGanZhiType) { this.dayGanZhiType = dayGanZhiType; }
}
}