This commit is contained in:
fengjignqi
2026-05-16 16:19:39 +08:00
commit 1b1575eb8a
1632 changed files with 242221 additions and 0 deletions

View File

@@ -0,0 +1,168 @@
package com.ckkj.water.utils.helper;
import java.util.HashMap;
import java.util.Map;
public class FiveElementsHelper {
// 五行颜色值
private static final String COLOR_METAL = "#FFAA00"; // 金
private static final String COLOR_WOOD = "#4CAE50"; // 木
private static final String COLOR_WATER = "#2196F3"; // 水
private static final String COLOR_FIRE = "#E54E4E"; // 火
private static final String COLOR_EARTH = "#B9653D"; // 土
// 天干映射表
private static final Map<String, String> celestialStems = new HashMap<>();
// 地支映射表
private static final Map<String, String> terrestrialBranches = new HashMap<>();
// 藏干映射表
private static final Map<String, String[]> hiddenStems = new HashMap<>();
// 五行颜色映射
private static final Map<String, String> elementColors = new HashMap<>();
static {
// 初始化天干五行
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
celestialStems.put("", "");
// 初始化地支五行
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
terrestrialBranches.put("", "");
// 初始化藏干
hiddenStems.put("", new String[]{""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{"", ""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{""});
hiddenStems.put("", new String[]{"", "", ""});
hiddenStems.put("", new String[]{"", ""});
// 初始化五行颜色
elementColors.put("", COLOR_METAL);
elementColors.put("", COLOR_WOOD);
elementColors.put("", COLOR_WATER);
elementColors.put("", COLOR_FIRE);
elementColors.put("", COLOR_EARTH);
}
/**
* 获取五行属性信息
*
* @param element 天干、地支或藏干
* @return 包含五行名称和颜色值的Map如果未找到返回null
*/
public static Map<String, String> getElementInfo(String element) {
String elementType = null;
// 1. 检查是否为天干
if (celestialStems.containsKey(element)) {
elementType = celestialStems.get(element);
}
// 2. 检查是否为地支
else if (terrestrialBranches.containsKey(element)) {
elementType = terrestrialBranches.get(element);
}
// 3. 检查是否为藏干(需要遍历所有地支的藏干)
else {
for (String[] stems : hiddenStems.values()) {
for (String stem : stems) {
if (stem.equals(element)) {
elementType = celestialStems.get(stem);
break;
}
}
if (elementType != null) break;
}
}
// 未找到匹配项
if (elementType == null) return null;
// 返回结果
Map<String, String> result = new HashMap<>();
result.put("element", elementType);
result.put("color", elementColors.get(elementType));
return result;
}
/**
* 获取所有天干
*/
public static String[] getAllCelestialStems() {
return celestialStems.keySet().toArray(new String[0]);
}
/**
* 获取所有地支
*/
public static String[] getAllTerrestrialBranches() {
return terrestrialBranches.keySet().toArray(new String[0]);
}
/**
* 获取指定地支的藏干
*
* @param branch 地支
* @return 藏干数组如果地支不存在返回null
*/
public static String[] getHiddenStems(String branch) {
return hiddenStems.get(branch);
}
/**
* 获取天干的阴阳属性
*
* @param stem 天干
* @return "阳"或"阴"无效输入返回null
*/
public static String getYinYang(String stem) {
// 阳干:甲、丙、戊、庚、壬
// 阴干:乙、丁、己、辛、癸
if ("甲丙戊庚壬".contains(stem)) return "";
if ("乙丁己辛癸".contains(stem)) return "";
return null;
}
/**
* 获取地支的阴阳属性
*
* @param branch 地支
* @return "阳"或"阴"无效输入返回null
*/
public static String getBranchYinYang(String branch) {
// 阳支:子、寅、辰、午、申、戌
// 阴支:丑、卯、巳、未、酉、亥
if ("子寅辰午申戌".contains(branch)) return "";
if ("丑卯巳未酉亥".contains(branch)) return "";
return null;
}
}

View File

@@ -0,0 +1,31 @@
package com.ckkj.water.utils.helper;
public class ShiShen {
private String fullName; // 十神全称(如"正官"
private String shortName; // 十神简称(如"官"
private String relation; // 生克关系(如"克我"
private String yinYang; // 阴阳关系(如"阳克阴"
public ShiShen(String fullName, String shortName, String relation, String yinYang) {
this.fullName = fullName;
this.shortName = shortName;
this.relation = relation;
this.yinYang = yinYang;
}
// Getters
public String getFullName() { return fullName; }
public String getShortName() { return shortName; }
public String getRelation() { return relation; }
public String getYinYang() { return yinYang; }
@Override
public String toString() {
return "ShiShen{" +
"全称='" + fullName + '\'' +
", 简称='" + shortName + '\'' +
", 关系='" + relation + '\'' +
", 阴阳='" + yinYang + '\'' +
'}';
}
}

View File

@@ -0,0 +1,156 @@
package com.ckkj.water.utils.helper;
import java.util.HashMap;
import java.util.Map;
public class ShiShenCalculator {
// 十神全称到简称的映射表
private static final Map<String, String> SHEN_SHORT_FORM = new HashMap<>();
static {
SHEN_SHORT_FORM.put("比肩", "");
SHEN_SHORT_FORM.put("劫财", "");
SHEN_SHORT_FORM.put("食神", "");
SHEN_SHORT_FORM.put("伤官", "");
SHEN_SHORT_FORM.put("偏财", "");
SHEN_SHORT_FORM.put("正财", "");
SHEN_SHORT_FORM.put("偏印", "");
SHEN_SHORT_FORM.put("正印", "");
SHEN_SHORT_FORM.put("七杀", "");
SHEN_SHORT_FORM.put("正官", "");
}
/**
* 根据十神全称获取简称
*
* @param fullName 十神全称(如"比肩"
* @return 十神简称(如"比"未找到时返回null
*/
public static String getAbbreviation(String fullName) {
return SHEN_SHORT_FORM.get(fullName);
}
// 天干阴阳属性映射
private static final Map<String, String> stemYinYang = new HashMap<>();
static {
// 阳干:甲、丙、戊、庚、壬
// 阴干:乙、丁、己、辛、癸
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
stemYinYang.put("", "");
}
// 十神映射表
private static final Map<String, ShiShen> SHI_SHEN_MAP = new HashMap<>();
static {
// 生克关系 + 阴阳组合 -> 十神对象
SHI_SHEN_MAP.put("同阳", new ShiShen("比肩", "", "同我", "阳同阳"));
SHI_SHEN_MAP.put("同阴", new ShiShen("比肩", "", "同我", "阴同阴"));
SHI_SHEN_MAP.put("同阴阳", new ShiShen("劫财", "", "同我", "阴阳异"));
SHI_SHEN_MAP.put("生阳阳", new ShiShen("食神", "", "我生", "阳生阳"));
SHI_SHEN_MAP.put("生阳阴", new ShiShen("伤官", "", "我生", "阳生阴"));
SHI_SHEN_MAP.put("生阴阳", new ShiShen("伤官", "", "我生", "阴生阳"));
SHI_SHEN_MAP.put("生阴阴", new ShiShen("食神", "", "我生", "阴生阴"));
SHI_SHEN_MAP.put("克阳阳", new ShiShen("偏财", "", "我克", "阳克阳"));
SHI_SHEN_MAP.put("克阳阴", new ShiShen("正财", "", "我克", "阳克阴"));
SHI_SHEN_MAP.put("克阴阳", new ShiShen("正财", "", "我克", "阴克阳"));
SHI_SHEN_MAP.put("克阴阴", new ShiShen("偏财", "", "我克", "阴克阴"));
SHI_SHEN_MAP.put("被生阳阳", new ShiShen("偏印", "", "生我", "阳生阳"));
SHI_SHEN_MAP.put("被生阳阴", new ShiShen("正印", "", "生我", "阴生阳"));
SHI_SHEN_MAP.put("被生阴阳", new ShiShen("正印", "", "生我", "阳生阴"));
SHI_SHEN_MAP.put("被生阴阴", new ShiShen("偏印", "", "生我", "阴生阴"));
SHI_SHEN_MAP.put("被克阳阳", new ShiShen("七杀", "", "克我", "阳克阳"));
SHI_SHEN_MAP.put("被克阳阴", new ShiShen("正官", "", "克我", "阴克阳"));
SHI_SHEN_MAP.put("被克阴阳", new ShiShen("正官", "", "克我", "阳克阴"));
SHI_SHEN_MAP.put("被克阴阴", new ShiShen("七杀", "", "克我", "阴克阴"));
}
/**
* 计算十神关系
*
* @param dayStem 日干(如"己"
* @param targetStem 目标天干(如"癸"
* @return 十神对象如果输入无效返回null
*/
public static ShiShen calculate(String dayStem, String targetStem) {
// 验证输入
if (!isValidStem(dayStem) || !isValidStem(targetStem)) {
return null;
}
// 1. 获取五行属性
String dayElement = FiveElementsHelper.getElementInfo(dayStem).get("element");
String targetElement = FiveElementsHelper.getElementInfo(targetStem).get("element");
// 2. 获取阴阳属性
String dayYY = stemYinYang.get(dayStem);
String targetYY = stemYinYang.get(targetStem);
// 3. 确定生克关系
String relationKey = getElementRelation(dayElement, targetElement);
String yyKey = dayYY + targetYY;
// 4. 组合最终key
String finalKey = relationKey + yyKey;
// 特殊处理同五行情况
if ("".equals(relationKey)) {
if (dayYY.equals(targetYY)) {
finalKey = "" + dayYY; // 同阳或同阴
} else {
finalKey = "同阴阳";
}
}
return SHI_SHEN_MAP.get(finalKey);
}
/**
* 判断是否为有效天干
*/
private static boolean isValidStem(String stem) {
return stemYinYang.containsKey(stem);
}
/**
* 获取五行生克关系
*/
private static String getElementRelation(String e1, String e2) {
if (e1.equals(e2)) return "";
// 五行生克规则
Map<String, String> sheng = new HashMap<>();
sheng.put("", "");
sheng.put("", "");
sheng.put("", "");
sheng.put("", "");
sheng.put("", "");
Map<String, String> ke = new HashMap<>();
ke.put("", "");
ke.put("", "");
ke.put("", "");
ke.put("", "");
ke.put("", "");
if (sheng.get(e1).equals(e2)) return "";
if (ke.get(e1).equals(e2)) return "";
if (sheng.get(e2).equals(e1)) return "被生";
if (ke.get(e2).equals(e1)) return "被克";
return null; // 理论上不会发生
}
}