|
|
@@ -0,0 +1,149 @@
|
|
|
+package com.etotem.num.service;
|
|
|
+
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import java.util.*;
|
|
|
+
|
|
|
+@Service
|
|
|
+public class EightStarService {
|
|
|
+
|
|
|
+ public enum StarType {
|
|
|
+ TIAN_YI, SHENG_QI, YAN_NIAN, FU_WEI,
|
|
|
+ JUE_MING, WU_GUI, LIU_SHA, HUO_HAI;
|
|
|
+ }
|
|
|
+
|
|
|
+ public enum EnergyLevel { ONE(1), TWO(2), THREE(3), FOUR(4);
|
|
|
+ public final int level;
|
|
|
+ EnergyLevel(int l) { level = l; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class StarPair {
|
|
|
+ public final int pair;
|
|
|
+ public final StarType star;
|
|
|
+ public final EnergyLevel level;
|
|
|
+ public StarPair(int p, StarType s, EnergyLevel l) { pair = p; star = s; level = l; }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class ChartCombo {
|
|
|
+ public final String pos;
|
|
|
+ public final int a, b, val;
|
|
|
+ public final StarPair info;
|
|
|
+ public final int pri;
|
|
|
+ public ChartCombo(String p, int x, int y, StarPair i, int r) {
|
|
|
+ pos = p; a = x; b = y; val = x * 10 + y; info = i; pri = r;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ public static class TriangleAnalysis {
|
|
|
+ public final Map<String,Integer> pos;
|
|
|
+ public final List<ChartCombo> cs;
|
|
|
+ public final int ac, ic;
|
|
|
+ public final String dom;
|
|
|
+ public TriangleAnalysis(Map<String,Integer> p, List<ChartCombo> cc) {
|
|
|
+ pos = p; cs = cc;
|
|
|
+ int a = 0, b = 0;
|
|
|
+ java.util.Map<String,Integer> f = new java.util.HashMap<>();
|
|
|
+ for (ChartCombo c : cc) {
|
|
|
+ if (c.info != null) {
|
|
|
+ if (c.info.star.ordinal() < 4) a++; else b++;
|
|
|
+ String n = c.info.star.name();
|
|
|
+ f.put(n, f.getOrDefault(n, 0) + 1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ac = a; ic = b;
|
|
|
+ String d = ""; int m = 0;
|
|
|
+ for (java.util.Map.Entry<String,Integer> e : f.entrySet()) {
|
|
|
+ if (e.getValue() > m) { m = e.getValue(); d = e.getKey(); }
|
|
|
+ }
|
|
|
+ dom = d;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private static final Map<Integer,StarPair> LOOKUP = new HashMap<>();
|
|
|
+ static {
|
|
|
+ // TianYi - Auspicious
|
|
|
+ add(13,StarType.TIAN_YI,EnergyLevel.ONE); add(31,StarType.TIAN_YI,EnergyLevel.ONE);
|
|
|
+ add(68,StarType.TIAN_YI,EnergyLevel.TWO); add(86,StarType.TIAN_YI,EnergyLevel.TWO);
|
|
|
+ add(94,StarType.TIAN_YI,EnergyLevel.THREE); add(49,StarType.TIAN_YI,EnergyLevel.THREE);
|
|
|
+ add(72,StarType.TIAN_YI,EnergyLevel.FOUR); add(27,StarType.TIAN_YI,EnergyLevel.FOUR);
|
|
|
+ // ShengQi - Auspicious
|
|
|
+ add(14,StarType.SHENG_QI,EnergyLevel.ONE); add(41,StarType.SHENG_QI,EnergyLevel.ONE);
|
|
|
+ add(67,StarType.SHENG_QI,EnergyLevel.TWO); add(76,StarType.SHENG_QI,EnergyLevel.TWO);
|
|
|
+ add(93,StarType.SHENG_QI,EnergyLevel.THREE); add(39,StarType.SHENG_QI,EnergyLevel.THREE);
|
|
|
+ add(82,StarType.SHENG_QI,EnergyLevel.FOUR); add(28,StarType.SHENG_QI,EnergyLevel.FOUR);
|
|
|
+ // YanNian - Auspicious
|
|
|
+ add(19,StarType.YAN_NIAN,EnergyLevel.ONE); add(91,StarType.YAN_NIAN,EnergyLevel.ONE);
|
|
|
+ add(87,StarType.YAN_NIAN,EnergyLevel.TWO); add(78,StarType.YAN_NIAN,EnergyLevel.TWO);
|
|
|
+ add(43,StarType.YAN_NIAN,EnergyLevel.THREE); add(34,StarType.YAN_NIAN,EnergyLevel.THREE);
|
|
|
+ add(26,StarType.YAN_NIAN,EnergyLevel.FOUR); add(62,StarType.YAN_NIAN,EnergyLevel.FOUR);
|
|
|
+ // FuWei - Neutral
|
|
|
+ add(11,StarType.FU_WEI,EnergyLevel.ONE); add(22,StarType.FU_WEI,EnergyLevel.ONE);
|
|
|
+ add(99,StarType.FU_WEI,EnergyLevel.TWO); add(88,StarType.FU_WEI,EnergyLevel.TWO);
|
|
|
+ add(77,StarType.FU_WEI,EnergyLevel.THREE); add(66,StarType.FU_WEI,EnergyLevel.THREE);
|
|
|
+ add(44,StarType.FU_WEI,EnergyLevel.FOUR); add(33,StarType.FU_WEI,EnergyLevel.FOUR);
|
|
|
+ // JueMing - Inauspicious
|
|
|
+ add(12,StarType.JUE_MING,EnergyLevel.ONE); add(21,StarType.JUE_MING,EnergyLevel.ONE);
|
|
|
+ add(69,StarType.JUE_MING,EnergyLevel.TWO); add(96,StarType.JUE_MING,EnergyLevel.TWO);
|
|
|
+ add(84,StarType.JUE_MING,EnergyLevel.THREE); add(48,StarType.JUE_MING,EnergyLevel.THREE);
|
|
|
+ add(73,StarType.JUE_MING,EnergyLevel.FOUR); add(37,StarType.JUE_MING,EnergyLevel.FOUR);
|
|
|
+ // WuGui - Inauspicious
|
|
|
+ add(18,StarType.WU_GUI,EnergyLevel.ONE); add(81,StarType.WU_GUI,EnergyLevel.ONE);
|
|
|
+ add(79,StarType.WU_GUI,EnergyLevel.TWO); add(97,StarType.WU_GUI,EnergyLevel.TWO);
|
|
|
+ add(36,StarType.WU_GUI,EnergyLevel.THREE); add(63,StarType.WU_GUI,EnergyLevel.THREE);
|
|
|
+ add(42,StarType.WU_GUI,EnergyLevel.FOUR); add(24,StarType.WU_GUI,EnergyLevel.FOUR);
|
|
|
+ // LiuSha - Inauspicious
|
|
|
+ add(16,StarType.LIU_SHA,EnergyLevel.ONE); add(61,StarType.LIU_SHA,EnergyLevel.ONE);
|
|
|
+ add(47,StarType.LIU_SHA,EnergyLevel.TWO); add(74,StarType.LIU_SHA,EnergyLevel.TWO);
|
|
|
+ add(38,StarType.LIU_SHA,EnergyLevel.THREE); add(83,StarType.LIU_SHA,EnergyLevel.THREE);
|
|
|
+ add(92,StarType.LIU_SHA,EnergyLevel.FOUR); add(29,StarType.LIU_SHA,EnergyLevel.FOUR);
|
|
|
+ // HuoHai - Inauspicious
|
|
|
+ add(17,StarType.HUO_HAI,EnergyLevel.ONE); add(71,StarType.HUO_HAI,EnergyLevel.ONE);
|
|
|
+ add(89,StarType.HUO_HAI,EnergyLevel.TWO); add(98,StarType.HUO_HAI,EnergyLevel.TWO);
|
|
|
+ add(64,StarType.HUO_HAI,EnergyLevel.THREE); add(46,StarType.HUO_HAI,EnergyLevel.THREE);
|
|
|
+ add(32,StarType.HUO_HAI,EnergyLevel.FOUR); add(23,StarType.HUO_HAI,EnergyLevel.FOUR);
|
|
|
+ }
|
|
|
+ private static void add(int p, StarType s, EnergyLevel l) { LOOKUP.put(p, new StarPair(p, s, l)); }
|
|
|
+
|
|
|
+ public StarPair lookup(int p) { return LOOKUP.get(p); }
|
|
|
+ public StarPair lookup(int a, int b) { return lookup(a * 10 + b); }
|
|
|
+
|
|
|
+ public TriangleAnalysis analyze(Map<String,Integer> pos) {
|
|
|
+ List<ChartCombo> cs = new ArrayList<>();
|
|
|
+ // Priority 1: base horizontal
|
|
|
+ addC(cs,pos,"I","J",1); addC(cs,pos,"K","L",1); addC(cs,pos,"M","N",1);
|
|
|
+ // Priority 2: vertical connections
|
|
|
+ addC(cs,pos,"I","M",2); addC(cs,pos,"J","M",2);
|
|
|
+ addC(cs,pos,"K","N",2); addC(cs,pos,"L","N",2);
|
|
|
+ // Priority 3: core personality
|
|
|
+ addC(cs,pos,"M","O",3); addC(cs,pos,"N","O",3);
|
|
|
+ // Priority 4: external
|
|
|
+ addC(cs,pos,"P","Q",4); addC(cs,pos,"S","T",4); addC(cs,pos,"V","W",4);
|
|
|
+ return new TriangleAnalysis(pos, cs);
|
|
|
+ }
|
|
|
+
|
|
|
+ public Map<String,Object> buildJson(TriangleAnalysis ta) {
|
|
|
+ Map<String,Object> r = new LinkedHashMap<>();
|
|
|
+ List<Map<String,Object>> cl = new ArrayList<>();
|
|
|
+ for (ChartCombo c : ta.cs) {
|
|
|
+ Map<String,Object> m = new LinkedHashMap<>();
|
|
|
+ m.put("pair", c.pos); m.put("digits", c.val); m.put("priority", c.pri);
|
|
|
+ if (c.info != null) {
|
|
|
+ Map<String,Object> s = new LinkedHashMap<>();
|
|
|
+ s.put("starType", c.info.star.name());
|
|
|
+ s.put("level", c.info.level.level);
|
|
|
+ m.put("star", s);
|
|
|
+ }
|
|
|
+ cl.add(m);
|
|
|
+ }
|
|
|
+ r.put("combinations", cl);
|
|
|
+ Map<String,Object> st = new LinkedHashMap<>();
|
|
|
+ st.put("total", ta.cs.size()); st.put("auspiciousCount", ta.ac);
|
|
|
+ st.put("inauspiciousCount", ta.ic); st.put("dominantStar", ta.dom.isEmpty() ? "none" : ta.dom);
|
|
|
+ r.put("stats", st);
|
|
|
+ return r;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void addC(List<ChartCombo> cs, Map<String,Integer> pos, String a, String b, int pri) {
|
|
|
+ Integer va = pos.get(a); Integer vb = pos.get(b);
|
|
|
+ if (va != null && vb != null) cs.add(new ChartCombo(a+"-"+b, va, vb, lookup(va, vb), pri));
|
|
|
+ }
|
|
|
+}
|