mingpan 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +118 -0
- package/dist/core/bazi/BaziCore.d.ts +112 -0
- package/dist/core/bazi/BaziCore.d.ts.map +1 -0
- package/dist/core/bazi/BaziCore.js +606 -0
- package/dist/core/bazi/BaziCore.js.map +1 -0
- package/dist/core/bazi/SolarTermCalculator.d.ts +46 -0
- package/dist/core/bazi/SolarTermCalculator.d.ts.map +1 -0
- package/dist/core/bazi/SolarTermCalculator.js +452 -0
- package/dist/core/bazi/SolarTermCalculator.js.map +1 -0
- package/dist/core/bazi/TrueSolarTime.d.ts +64 -0
- package/dist/core/bazi/TrueSolarTime.d.ts.map +1 -0
- package/dist/core/bazi/TrueSolarTime.js +210 -0
- package/dist/core/bazi/TrueSolarTime.js.map +1 -0
- package/dist/core/bazi/ephemerisData.d.ts +10 -0
- package/dist/core/bazi/ephemerisData.d.ts.map +1 -0
- package/dist/core/bazi/ephemerisData.js +88 -0
- package/dist/core/bazi/ephemerisData.js.map +1 -0
- package/dist/core/bazi/index.d.ts +8 -0
- package/dist/core/bazi/index.d.ts.map +1 -0
- package/dist/core/bazi/index.js +30 -0
- package/dist/core/bazi/index.js.map +1 -0
- package/dist/core/bazi/types.d.ts +116 -0
- package/dist/core/bazi/types.d.ts.map +1 -0
- package/dist/core/bazi/types.js +7 -0
- package/dist/core/bazi/types.js.map +1 -0
- package/dist/core/calendar/SolarTermsCalculator.d.ts +33 -0
- package/dist/core/calendar/SolarTermsCalculator.d.ts.map +1 -0
- package/dist/core/calendar/SolarTermsCalculator.js +111 -0
- package/dist/core/calendar/SolarTermsCalculator.js.map +1 -0
- package/dist/core/calendar/astronomicalCalendar.d.ts +74 -0
- package/dist/core/calendar/astronomicalCalendar.d.ts.map +1 -0
- package/dist/core/calendar/astronomicalCalendar.js +276 -0
- package/dist/core/calendar/astronomicalCalendar.js.map +1 -0
- package/dist/core/calendar/calendar.d.ts +81 -0
- package/dist/core/calendar/calendar.d.ts.map +1 -0
- package/dist/core/calendar/calendar.js +223 -0
- package/dist/core/calendar/calendar.js.map +1 -0
- package/dist/core/calendar/constants.d.ts +151 -0
- package/dist/core/calendar/constants.d.ts.map +1 -0
- package/dist/core/calendar/constants.js +97 -0
- package/dist/core/calendar/constants.js.map +1 -0
- package/dist/core/calendar/julian.d.ts +54 -0
- package/dist/core/calendar/julian.d.ts.map +1 -0
- package/dist/core/calendar/julian.js +142 -0
- package/dist/core/calendar/julian.js.map +1 -0
- package/dist/core/calendar/lunarCalendar.d.ts +79 -0
- package/dist/core/calendar/lunarCalendar.d.ts.map +1 -0
- package/dist/core/calendar/lunarCalendar.js +164 -0
- package/dist/core/calendar/lunarCalendar.js.map +1 -0
- package/dist/core/calendar/solarTerms.d.ts +105 -0
- package/dist/core/calendar/solarTerms.d.ts.map +1 -0
- package/dist/core/calendar/solarTerms.js +487 -0
- package/dist/core/calendar/solarTerms.js.map +1 -0
- package/dist/core/constants/bazi.d.ts +138 -0
- package/dist/core/constants/bazi.d.ts.map +1 -0
- package/dist/core/constants/bazi.js +332 -0
- package/dist/core/constants/bazi.js.map +1 -0
- package/dist/core/constants/index.d.ts +6 -0
- package/dist/core/constants/index.d.ts.map +1 -0
- package/dist/core/constants/index.js +37 -0
- package/dist/core/constants/index.js.map +1 -0
- package/dist/core/constants/positions.d.ts +27 -0
- package/dist/core/constants/positions.d.ts.map +1 -0
- package/dist/core/constants/positions.js +39 -0
- package/dist/core/constants/positions.js.map +1 -0
- package/dist/core/ziwei/BrightnessSystem.d.ts +53 -0
- package/dist/core/ziwei/BrightnessSystem.d.ts.map +1 -0
- package/dist/core/ziwei/BrightnessSystem.js +278 -0
- package/dist/core/ziwei/BrightnessSystem.js.map +1 -0
- package/dist/core/ziwei/IztroAdapter.d.ts +78 -0
- package/dist/core/ziwei/IztroAdapter.d.ts.map +1 -0
- package/dist/core/ziwei/IztroAdapter.js +314 -0
- package/dist/core/ziwei/IztroAdapter.js.map +1 -0
- package/dist/core/ziwei/MutagenCore.d.ts +81 -0
- package/dist/core/ziwei/MutagenCore.d.ts.map +1 -0
- package/dist/core/ziwei/MutagenCore.js +246 -0
- package/dist/core/ziwei/MutagenCore.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1101 -0
- package/dist/index.js.map +1 -0
- package/dist/output/fortuneTextRenderer.d.ts +63 -0
- package/dist/output/fortuneTextRenderer.d.ts.map +1 -0
- package/dist/output/fortuneTextRenderer.js +384 -0
- package/dist/output/fortuneTextRenderer.js.map +1 -0
- package/dist/output/listTextRenderer.d.ts +298 -0
- package/dist/output/listTextRenderer.d.ts.map +1 -0
- package/dist/output/listTextRenderer.js +942 -0
- package/dist/output/listTextRenderer.js.map +1 -0
- package/dist/services/bazi/BaziService.d.ts +83 -0
- package/dist/services/bazi/BaziService.d.ts.map +1 -0
- package/dist/services/bazi/BaziService.js +635 -0
- package/dist/services/bazi/BaziService.js.map +1 -0
- package/dist/services/bazi/analyzers/ClimateAnalyzer.d.ts +31 -0
- package/dist/services/bazi/analyzers/ClimateAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/ClimateAnalyzer.js +194 -0
- package/dist/services/bazi/analyzers/ClimateAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts +16 -0
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js +60 -0
- package/dist/services/bazi/analyzers/HiddenStemsAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts +33 -0
- package/dist/services/bazi/analyzers/NaYinAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/NaYinAnalyzer.js +209 -0
- package/dist/services/bazi/analyzers/NaYinAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/PatternAnalyzer.d.ts +159 -0
- package/dist/services/bazi/analyzers/PatternAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/PatternAnalyzer.js +1150 -0
- package/dist/services/bazi/analyzers/PatternAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/RelationsAnalyzer.d.ts +114 -0
- package/dist/services/bazi/analyzers/RelationsAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/RelationsAnalyzer.js +704 -0
- package/dist/services/bazi/analyzers/RelationsAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts +236 -0
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.js +2079 -0
- package/dist/services/bazi/analyzers/ShenShaAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/StrengthAnalyzer.d.ts +181 -0
- package/dist/services/bazi/analyzers/StrengthAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/StrengthAnalyzer.js +1119 -0
- package/dist/services/bazi/analyzers/StrengthAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.d.ts +78 -0
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.js +383 -0
- package/dist/services/bazi/analyzers/TenGodsAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts +46 -0
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.js +260 -0
- package/dist/services/bazi/analyzers/TraditionalAnalyzer.js.map +1 -0
- package/dist/services/bazi/analyzers/YongShenAnalyzer.d.ts +70 -0
- package/dist/services/bazi/analyzers/YongShenAnalyzer.d.ts.map +1 -0
- package/dist/services/bazi/analyzers/YongShenAnalyzer.js +858 -0
- package/dist/services/bazi/analyzers/YongShenAnalyzer.js.map +1 -0
- package/dist/services/bazi/calculators/DaYunCalculator.d.ts +71 -0
- package/dist/services/bazi/calculators/DaYunCalculator.d.ts.map +1 -0
- package/dist/services/bazi/calculators/DaYunCalculator.js +496 -0
- package/dist/services/bazi/calculators/DaYunCalculator.js.map +1 -0
- package/dist/services/bazi/calculators/LiuNianCalculator.d.ts +88 -0
- package/dist/services/bazi/calculators/LiuNianCalculator.d.ts.map +1 -0
- package/dist/services/bazi/calculators/LiuNianCalculator.js +546 -0
- package/dist/services/bazi/calculators/LiuNianCalculator.js.map +1 -0
- package/dist/services/bazi/calculators/LiuRiCalculator.d.ts +66 -0
- package/dist/services/bazi/calculators/LiuRiCalculator.d.ts.map +1 -0
- package/dist/services/bazi/calculators/LiuRiCalculator.js +497 -0
- package/dist/services/bazi/calculators/LiuRiCalculator.js.map +1 -0
- package/dist/services/bazi/calculators/LiuYueCalculator.d.ts +50 -0
- package/dist/services/bazi/calculators/LiuYueCalculator.d.ts.map +1 -0
- package/dist/services/bazi/calculators/LiuYueCalculator.js +338 -0
- package/dist/services/bazi/calculators/LiuYueCalculator.js.map +1 -0
- package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts +123 -0
- package/dist/services/bazi/calculators/LuckCycleCalculator.d.ts.map +1 -0
- package/dist/services/bazi/calculators/LuckCycleCalculator.js +414 -0
- package/dist/services/bazi/calculators/LuckCycleCalculator.js.map +1 -0
- package/dist/services/bazi/index.d.ts +21 -0
- package/dist/services/bazi/index.d.ts.map +1 -0
- package/dist/services/bazi/index.js +83 -0
- package/dist/services/bazi/index.js.map +1 -0
- package/dist/services/bazi/types.d.ts +597 -0
- package/dist/services/bazi/types.d.ts.map +1 -0
- package/dist/services/bazi/types.js +123 -0
- package/dist/services/bazi/types.js.map +1 -0
- package/dist/services/ziwei/ZiweiService.d.ts +86 -0
- package/dist/services/ziwei/ZiweiService.d.ts.map +1 -0
- package/dist/services/ziwei/ZiweiService.js +343 -0
- package/dist/services/ziwei/ZiweiService.js.map +1 -0
- package/dist/services/ziwei/calculators/BrightnessCalculator.d.ts +38 -0
- package/dist/services/ziwei/calculators/BrightnessCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/BrightnessCalculator.js +142 -0
- package/dist/services/ziwei/calculators/BrightnessCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/DailyCalculator.d.ts +27 -0
- package/dist/services/ziwei/calculators/DailyCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/DailyCalculator.js +55 -0
- package/dist/services/ziwei/calculators/DailyCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/DecadeCalculator.d.ts +46 -0
- package/dist/services/ziwei/calculators/DecadeCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/DecadeCalculator.js +181 -0
- package/dist/services/ziwei/calculators/DecadeCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.d.ts +28 -0
- package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.js +84 -0
- package/dist/services/ziwei/calculators/HoroscopeStarsCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/HourlyCalculator.d.ts +41 -0
- package/dist/services/ziwei/calculators/HourlyCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/HourlyCalculator.js +139 -0
- package/dist/services/ziwei/calculators/HourlyCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/MinorLimitCalculator.d.ts +30 -0
- package/dist/services/ziwei/calculators/MinorLimitCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/MinorLimitCalculator.js +90 -0
- package/dist/services/ziwei/calculators/MinorLimitCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/MonthlyCalculator.d.ts +39 -0
- package/dist/services/ziwei/calculators/MonthlyCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/MonthlyCalculator.js +128 -0
- package/dist/services/ziwei/calculators/MonthlyCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/MutagenCalculator.d.ts +20 -0
- package/dist/services/ziwei/calculators/MutagenCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/MutagenCalculator.js +121 -0
- package/dist/services/ziwei/calculators/MutagenCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/PalaceDynamicCalculator.d.ts +35 -0
- package/dist/services/ziwei/calculators/PalaceDynamicCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/PalaceDynamicCalculator.js +55 -0
- package/dist/services/ziwei/calculators/PalaceDynamicCalculator.js.map +1 -0
- package/dist/services/ziwei/calculators/YearlyCalculator.d.ts +35 -0
- package/dist/services/ziwei/calculators/YearlyCalculator.d.ts.map +1 -0
- package/dist/services/ziwei/calculators/YearlyCalculator.js +119 -0
- package/dist/services/ziwei/calculators/YearlyCalculator.js.map +1 -0
- package/dist/services/ziwei/index.d.ts +15 -0
- package/dist/services/ziwei/index.d.ts.map +1 -0
- package/dist/services/ziwei/index.js +48 -0
- package/dist/services/ziwei/index.js.map +1 -0
- package/dist/services/ziwei/transformers/PalaceTransformer.d.ts +62 -0
- package/dist/services/ziwei/transformers/PalaceTransformer.d.ts.map +1 -0
- package/dist/services/ziwei/transformers/PalaceTransformer.js +153 -0
- package/dist/services/ziwei/transformers/PalaceTransformer.js.map +1 -0
- package/dist/services/ziwei/types.d.ts +185 -0
- package/dist/services/ziwei/types.d.ts.map +1 -0
- package/dist/services/ziwei/types.js +54 -0
- package/dist/services/ziwei/types.js.map +1 -0
- package/dist/shared/logger.d.ts +51 -0
- package/dist/shared/logger.d.ts.map +1 -0
- package/dist/shared/logger.js +136 -0
- package/dist/shared/logger.js.map +1 -0
- package/dist/shared/types.d.ts +91 -0
- package/dist/shared/types.d.ts.map +1 -0
- package/dist/shared/types.js +7 -0
- package/dist/shared/types.js.map +1 -0
- package/dist/utils/ageCalculator.d.ts +30 -0
- package/dist/utils/ageCalculator.d.ts.map +1 -0
- package/dist/utils/ageCalculator.js +51 -0
- package/dist/utils/ageCalculator.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,858 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* YongShen Analyzer (用神分析器)
|
|
4
|
+
* Implements taro-bazi's comprehensive YongShen (Useful God) analysis system
|
|
5
|
+
* Determines the most beneficial elements based on chart balance and patterns
|
|
6
|
+
* Returns language-agnostic data with translation keys
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.YongShenAnalyzer = void 0;
|
|
10
|
+
const bazi_1 = require("../../../core/constants/bazi");
|
|
11
|
+
class YongShenAnalyzer {
|
|
12
|
+
/**
|
|
13
|
+
* Main analysis method - determines useful and harmful gods
|
|
14
|
+
*/
|
|
15
|
+
static analyze(chart, strengthAnalysis, patternAnalysis, climateAnalysis) {
|
|
16
|
+
const dayMasterElement = this.getDayMasterElement(chart.day.stem);
|
|
17
|
+
// Use the enhanced pattern analysis to determine YongShen
|
|
18
|
+
const pattern = patternAnalysis?.primaryPattern?.type || '正格';
|
|
19
|
+
const patternPriority = patternAnalysis?.primaryPattern?.priority || 0;
|
|
20
|
+
let analysis;
|
|
21
|
+
// High priority patterns (8-10) have specific YongShen rules
|
|
22
|
+
if (patternPriority >= 8) {
|
|
23
|
+
analysis = this.analyzeByPatternRecommendations(chart, dayMasterElement, patternAnalysis, strengthAnalysis);
|
|
24
|
+
}
|
|
25
|
+
else if (pattern.includes('從')) {
|
|
26
|
+
// Follow patterns
|
|
27
|
+
analysis = this.analyzeSpecialPattern(chart, dayMasterElement, pattern, strengthAnalysis, patternAnalysis);
|
|
28
|
+
}
|
|
29
|
+
else if (climateAnalysis?.adjustment === 'urgent') {
|
|
30
|
+
// Climate takes priority when extreme
|
|
31
|
+
analysis = this.analyzeClimateFirst(chart, dayMasterElement, climateAnalysis, strengthAnalysis);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Normal pattern analysis based on strength
|
|
35
|
+
analysis = this.analyzeNormalPattern(chart, dayMasterElement, strengthAnalysis, patternAnalysis, climateAnalysis);
|
|
36
|
+
}
|
|
37
|
+
// Add explanation based on the analysis method
|
|
38
|
+
analysis.explanation = this.generateExplanation(analysis, pattern, strengthAnalysis.dayMasterStrength);
|
|
39
|
+
return analysis;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Analyze normal patterns (正格)
|
|
43
|
+
*/
|
|
44
|
+
static analyzeNormalPattern(chart, dayMasterElement, strengthAnalysis, patternAnalysis, climateAnalysis) {
|
|
45
|
+
const strength = strengthAnalysis.dayMasterStrength;
|
|
46
|
+
const yongShen = [];
|
|
47
|
+
const xiShen = [];
|
|
48
|
+
const jiShen = [];
|
|
49
|
+
const xianShen = [];
|
|
50
|
+
if (strength === '身弱' || strength === '衰极' || strength === '偏弱') {
|
|
51
|
+
// Weak day master needs support
|
|
52
|
+
// YongShen: Elements that generate or same as day master
|
|
53
|
+
const generatingElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement];
|
|
54
|
+
yongShen.push(generatingElement);
|
|
55
|
+
yongShen.push(dayMasterElement);
|
|
56
|
+
// XiShen: Elements that support YongShen
|
|
57
|
+
xiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[generatingElement]);
|
|
58
|
+
// JiShen: Elements that control or drain day master
|
|
59
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.controlling[dayMasterElement]);
|
|
60
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement]);
|
|
61
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[dayMasterElement]);
|
|
62
|
+
}
|
|
63
|
+
else if (strength === '身旺' || strength === '旺极' || strength === '偏强') {
|
|
64
|
+
// Strong day master needs draining or control
|
|
65
|
+
// YongShen: Elements that drain or control day master
|
|
66
|
+
const drainingElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement];
|
|
67
|
+
const controllingElement = bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[dayMasterElement];
|
|
68
|
+
yongShen.push(drainingElement);
|
|
69
|
+
yongShen.push(controllingElement);
|
|
70
|
+
// XiShen: Wealth element (controlled by day master)
|
|
71
|
+
xiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.controlling[dayMasterElement]);
|
|
72
|
+
// JiShen: Elements that strengthen day master
|
|
73
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement]);
|
|
74
|
+
jiShen.push(dayMasterElement);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// Normal/balanced strength
|
|
78
|
+
// Analyze based on what's missing or excessive in the chart
|
|
79
|
+
const elementCounts = this.count(chart);
|
|
80
|
+
const missingElements = bazi_1.FIVE_ELEMENTS_ARRAY.filter(elem => elementCounts[elem] === 0);
|
|
81
|
+
const excessiveElements = bazi_1.FIVE_ELEMENTS_ARRAY.filter(elem => elementCounts[elem] > 3);
|
|
82
|
+
// YongShen: Missing elements or elements that balance excess
|
|
83
|
+
yongShen.push(...missingElements);
|
|
84
|
+
excessiveElements.forEach((elem) => {
|
|
85
|
+
const controller = bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[elem];
|
|
86
|
+
if (!yongShen.includes(controller)) {
|
|
87
|
+
yongShen.push(controller);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
// XiShen: Elements that support YongShen
|
|
91
|
+
yongShen.forEach((elem) => {
|
|
92
|
+
const supporter = bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[elem];
|
|
93
|
+
if (!xiShen.includes(supporter) && !yongShen.includes(supporter)) {
|
|
94
|
+
xiShen.push(supporter);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
// JiShen: Excessive elements
|
|
98
|
+
jiShen.push(...excessiveElements);
|
|
99
|
+
}
|
|
100
|
+
// XianShen: Remaining neutral elements
|
|
101
|
+
bazi_1.FIVE_ELEMENTS_ARRAY.forEach((elem) => {
|
|
102
|
+
if (!yongShen.includes(elem) && !xiShen.includes(elem) && !jiShen.includes(elem)) {
|
|
103
|
+
xianShen.push(elem);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
const analysis = {
|
|
107
|
+
yongShen,
|
|
108
|
+
xiShen,
|
|
109
|
+
jiShen,
|
|
110
|
+
xianShen,
|
|
111
|
+
explanation: ''
|
|
112
|
+
};
|
|
113
|
+
// Generate recommendations
|
|
114
|
+
analysis.recommendations = this.generateRecommendations(analysis, dayMasterElement, strengthAnalysis, patternAnalysis, climateAnalysis);
|
|
115
|
+
return analysis;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Analyze based on pattern recommendations from PatternAnalyzer
|
|
119
|
+
*/
|
|
120
|
+
static analyzeByPatternRecommendations(chart, dayMasterElement, patternAnalysis, strengthAnalysis) {
|
|
121
|
+
const yongShen = [];
|
|
122
|
+
const xiShen = [];
|
|
123
|
+
const jiShen = [];
|
|
124
|
+
const xianShen = [];
|
|
125
|
+
// Extract elements from pattern-based useful/avoid gods
|
|
126
|
+
const chartStructure = patternAnalysis?.chartStructure;
|
|
127
|
+
if (chartStructure) {
|
|
128
|
+
// Convert translation keys back to elements
|
|
129
|
+
chartStructure.usefulGods.forEach((god) => {
|
|
130
|
+
const element = god.replace('elements.', '');
|
|
131
|
+
if (bazi_1.FIVE_ELEMENTS_ARRAY.includes(element)) {
|
|
132
|
+
yongShen.push(element);
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
chartStructure.avoidGods.forEach((god) => {
|
|
136
|
+
const element = god.replace('elements.', '');
|
|
137
|
+
if (bazi_1.FIVE_ELEMENTS_ARRAY.includes(element)) {
|
|
138
|
+
jiShen.push(element);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
// Determine XiShen based on YongShen
|
|
143
|
+
yongShen.forEach((elem) => {
|
|
144
|
+
if (elem in bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy) {
|
|
145
|
+
const supporter = bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[elem];
|
|
146
|
+
if (!yongShen.includes(supporter) && !jiShen.includes(supporter) && !xiShen.includes(supporter)) {
|
|
147
|
+
xiShen.push(supporter);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
// Fill remaining elements as XianShen
|
|
152
|
+
bazi_1.FIVE_ELEMENTS_ARRAY.forEach((elem) => {
|
|
153
|
+
if (!yongShen.includes(elem) && !xiShen.includes(elem) && !jiShen.includes(elem)) {
|
|
154
|
+
xianShen.push(elem);
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
const analysis = {
|
|
158
|
+
yongShen,
|
|
159
|
+
xiShen,
|
|
160
|
+
jiShen,
|
|
161
|
+
xianShen,
|
|
162
|
+
explanation: ''
|
|
163
|
+
};
|
|
164
|
+
// Generate recommendations
|
|
165
|
+
analysis.recommendations = this.generateRecommendations(analysis, dayMasterElement, strengthAnalysis, patternAnalysis, null);
|
|
166
|
+
return analysis;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Analyze special patterns (從格)
|
|
170
|
+
*/
|
|
171
|
+
static analyzeSpecialPattern(chart, dayMasterElement, pattern, strengthAnalysis, patternAnalysis) {
|
|
172
|
+
const yongShen = [];
|
|
173
|
+
const xiShen = [];
|
|
174
|
+
const jiShen = [];
|
|
175
|
+
const xianShen = [];
|
|
176
|
+
// Use pattern analysis recommendations if available
|
|
177
|
+
if (patternAnalysis?.chartStructure) {
|
|
178
|
+
return this.analyzeByPatternRecommendations(chart, dayMasterElement, patternAnalysis, null);
|
|
179
|
+
}
|
|
180
|
+
// Fallback to basic pattern analysis
|
|
181
|
+
if (pattern.includes('從強格') || pattern.includes('從旺格')) {
|
|
182
|
+
// 從強格/從旺格 - Follow strong pattern
|
|
183
|
+
// Support the dominant element group
|
|
184
|
+
const dominantElements = strengthAnalysis.supportingElements || [dayMasterElement];
|
|
185
|
+
yongShen.push(...dominantElements);
|
|
186
|
+
// XiShen: Elements that generate dominant elements
|
|
187
|
+
dominantElements.forEach((elem) => {
|
|
188
|
+
if (elem in bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy) {
|
|
189
|
+
const generator = bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[elem];
|
|
190
|
+
if (!yongShen.includes(generator)) {
|
|
191
|
+
xiShen.push(generator);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
// JiShen: Elements that oppose the flow
|
|
196
|
+
dominantElements.forEach((elem) => {
|
|
197
|
+
if (elem in bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy) {
|
|
198
|
+
const opposer = bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[elem];
|
|
199
|
+
if (!jiShen.includes(opposer)) {
|
|
200
|
+
jiShen.push(opposer);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else if (pattern.includes('從弱格') || pattern.includes('從勢格')) {
|
|
206
|
+
// 從弱格/從勢格 - Follow weak/trend pattern
|
|
207
|
+
// Support elements that drain or control day master
|
|
208
|
+
const drainingElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement];
|
|
209
|
+
const controllingElement = bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[dayMasterElement];
|
|
210
|
+
const wealthElement = bazi_1.FIVE_ELEMENTS_RELATIONS.controlling[dayMasterElement];
|
|
211
|
+
yongShen.push(drainingElement, controllingElement, wealthElement);
|
|
212
|
+
// JiShen: Elements that support day master
|
|
213
|
+
jiShen.push(dayMasterElement);
|
|
214
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement]);
|
|
215
|
+
}
|
|
216
|
+
else if (pattern.includes('從兒格')) {
|
|
217
|
+
// 從兒格 - Follow output pattern
|
|
218
|
+
const outputElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement];
|
|
219
|
+
yongShen.push(outputElement);
|
|
220
|
+
// Also support wealth (generated by output)
|
|
221
|
+
const wealthElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generating[outputElement];
|
|
222
|
+
yongShen.push(wealthElement);
|
|
223
|
+
// JiShen: Elements that support day master or control output
|
|
224
|
+
jiShen.push(dayMasterElement);
|
|
225
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement]);
|
|
226
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[outputElement]);
|
|
227
|
+
}
|
|
228
|
+
else if (pattern.includes('從財格')) {
|
|
229
|
+
// 從財格 - Follow wealth pattern
|
|
230
|
+
const wealthElement = bazi_1.FIVE_ELEMENTS_RELATIONS.controlling[dayMasterElement];
|
|
231
|
+
yongShen.push(wealthElement);
|
|
232
|
+
// Also support output (feeds wealth)
|
|
233
|
+
const outputElement = bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement];
|
|
234
|
+
xiShen.push(outputElement);
|
|
235
|
+
// JiShen: Elements that support day master
|
|
236
|
+
jiShen.push(dayMasterElement);
|
|
237
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement]);
|
|
238
|
+
}
|
|
239
|
+
else if (pattern.includes('從官格')) {
|
|
240
|
+
// 從官格 - Follow officer pattern
|
|
241
|
+
const officerElement = bazi_1.FIVE_ELEMENTS_RELATIONS.restrictBy[dayMasterElement];
|
|
242
|
+
yongShen.push(officerElement);
|
|
243
|
+
// Also support wealth (feeds officer)
|
|
244
|
+
const wealthElement = bazi_1.FIVE_ELEMENTS_RELATIONS.controlling[dayMasterElement];
|
|
245
|
+
xiShen.push(wealthElement);
|
|
246
|
+
// JiShen: Elements that support day master or control officer
|
|
247
|
+
jiShen.push(dayMasterElement);
|
|
248
|
+
jiShen.push(bazi_1.FIVE_ELEMENTS_RELATIONS.generating[dayMasterElement]);
|
|
249
|
+
}
|
|
250
|
+
// Fill remaining elements as XianShen
|
|
251
|
+
bazi_1.FIVE_ELEMENTS_ARRAY.forEach((elem) => {
|
|
252
|
+
if (!yongShen.includes(elem) && !xiShen.includes(elem) && !jiShen.includes(elem)) {
|
|
253
|
+
xianShen.push(elem);
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
const analysis = {
|
|
257
|
+
yongShen,
|
|
258
|
+
xiShen,
|
|
259
|
+
jiShen,
|
|
260
|
+
xianShen,
|
|
261
|
+
explanation: ''
|
|
262
|
+
};
|
|
263
|
+
// Generate recommendations
|
|
264
|
+
analysis.recommendations = this.generateRecommendations(analysis, dayMasterElement, strengthAnalysis, patternAnalysis || { primary: { type: pattern } }, null);
|
|
265
|
+
return analysis;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Analyze when climate adjustment is urgent
|
|
269
|
+
*/
|
|
270
|
+
static analyzeClimateFirst(chart, dayMasterElement, climateAnalysis, strengthAnalysis) {
|
|
271
|
+
const yongShen = [];
|
|
272
|
+
const xiShen = [];
|
|
273
|
+
const jiShen = [];
|
|
274
|
+
const xianShen = [];
|
|
275
|
+
// Climate is too hot - need Water first
|
|
276
|
+
if (climateAnalysis.temperature === 'hot') {
|
|
277
|
+
yongShen.push('水');
|
|
278
|
+
xiShen.push('金'); // Metal generates Water
|
|
279
|
+
jiShen.push('火'); // Fire makes it hotter
|
|
280
|
+
// Secondary consideration based on day master
|
|
281
|
+
if (dayMasterElement === '木' || dayMasterElement === '火') {
|
|
282
|
+
xiShen.push('土'); // Earth can absorb some heat
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
else if (climateAnalysis.temperature === 'cold') {
|
|
286
|
+
// Climate is too cold - need Fire first
|
|
287
|
+
yongShen.push('火');
|
|
288
|
+
xiShen.push('木'); // Wood feeds Fire
|
|
289
|
+
jiShen.push('水'); // Water makes it colder
|
|
290
|
+
// Secondary consideration
|
|
291
|
+
if (dayMasterElement === '金' || dayMasterElement === '水') {
|
|
292
|
+
xiShen.push('土'); // Earth can provide stability
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
// After climate adjustment, consider day master strength
|
|
296
|
+
const strength = strengthAnalysis.dayMasterStrength;
|
|
297
|
+
if (strength === '身弱' && !jiShen.includes(dayMasterElement)) {
|
|
298
|
+
const supporter = bazi_1.FIVE_ELEMENTS_RELATIONS.generateBy[dayMasterElement];
|
|
299
|
+
if (!yongShen.includes(supporter) && !jiShen.includes(supporter)) {
|
|
300
|
+
xiShen.push(supporter);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
// Fill remaining elements
|
|
304
|
+
bazi_1.FIVE_ELEMENTS_ARRAY.forEach((elem) => {
|
|
305
|
+
if (!yongShen.includes(elem) && !xiShen.includes(elem) && !jiShen.includes(elem)) {
|
|
306
|
+
xianShen.push(elem);
|
|
307
|
+
}
|
|
308
|
+
});
|
|
309
|
+
const analysis = {
|
|
310
|
+
yongShen,
|
|
311
|
+
xiShen,
|
|
312
|
+
jiShen,
|
|
313
|
+
xianShen,
|
|
314
|
+
explanation: ''
|
|
315
|
+
};
|
|
316
|
+
// Generate recommendations
|
|
317
|
+
analysis.recommendations = this.generateRecommendations(analysis, dayMasterElement, strengthAnalysis, null, climateAnalysis);
|
|
318
|
+
return analysis;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Generate explanation for the YongShen analysis
|
|
322
|
+
*/
|
|
323
|
+
static generateExplanation(analysis, pattern, dayMasterStrength) {
|
|
324
|
+
// Return translation key based on the analysis type
|
|
325
|
+
if (pattern.includes('從強格') || pattern.includes('從旺格')) {
|
|
326
|
+
return '從強格或從旺格,順其勢而為,以增強其力量為吉';
|
|
327
|
+
}
|
|
328
|
+
else if (pattern.includes('從弱格') || pattern.includes('從勢格')) {
|
|
329
|
+
return '從弱格或從勢格,順其勢而洩,以消耗其力量為吉';
|
|
330
|
+
}
|
|
331
|
+
else if (pattern.includes('從兒格')) {
|
|
332
|
+
return '從兒格,日主洩秀於食傷,以食傷財星為用';
|
|
333
|
+
}
|
|
334
|
+
else if (pattern.includes('從財格')) {
|
|
335
|
+
return '從財格,日主消耗於財星,以財星食傷為用';
|
|
336
|
+
}
|
|
337
|
+
else if (pattern.includes('從官格')) {
|
|
338
|
+
return '從官格,日主服從於官殺,以官殺財星為用';
|
|
339
|
+
}
|
|
340
|
+
else if (pattern.includes('化氣格')) {
|
|
341
|
+
return '化氣格,五行流通有情,順其流通之勢為用';
|
|
342
|
+
}
|
|
343
|
+
else if (pattern.includes('曲直格') || pattern.includes('炎上格') || pattern.includes('稼穡格') || pattern.includes('從革格') || pattern.includes('潤下格')) {
|
|
344
|
+
return '特殊格局,以主導元素為用,增強其勢力';
|
|
345
|
+
}
|
|
346
|
+
else if (analysis.yongShen.includes('水') && (analysis.jiShen.includes('火') || analysis.jiShen.includes('土'))) {
|
|
347
|
+
return '命局過熱,急需水來調候,以水金為用';
|
|
348
|
+
}
|
|
349
|
+
else if (analysis.yongShen.includes('火') && analysis.jiShen.includes('水')) {
|
|
350
|
+
return '命局過寒,急需火來調候,以火木為用';
|
|
351
|
+
}
|
|
352
|
+
else if (dayMasterStrength === '身弱' || dayMasterStrength === '衰极') {
|
|
353
|
+
return '日主弱,需要生扶,以印比為用神';
|
|
354
|
+
}
|
|
355
|
+
else if (dayMasterStrength === '身旺' || dayMasterStrength === '旺极') {
|
|
356
|
+
return '日主強旺,需要消耗,以財官食傷為用神';
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
return '日主中和,五行平衡,以補缺抑過為用神';
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Generate comprehensive actionable recommendations based on YongShen analysis
|
|
364
|
+
*/
|
|
365
|
+
static generateRecommendations(analysis, dayMasterElement, strengthAnalysis, patternAnalysis, climateAnalysis) {
|
|
366
|
+
const recommendations = {
|
|
367
|
+
career: this.generateCareerRecommendations(analysis, dayMasterElement, patternAnalysis),
|
|
368
|
+
lifestyle: this.generateLifestyleRecommendations(analysis, dayMasterElement, climateAnalysis),
|
|
369
|
+
relationships: this.generateRelationshipRecommendations(analysis, dayMasterElement),
|
|
370
|
+
health: this.generateHealthRecommendations(analysis, dayMasterElement, strengthAnalysis),
|
|
371
|
+
luck: this.generateLuckEnhancers(analysis, dayMasterElement),
|
|
372
|
+
fengShui: this.generateFengShuiSuggestions(analysis, dayMasterElement)
|
|
373
|
+
};
|
|
374
|
+
return recommendations;
|
|
375
|
+
}
|
|
376
|
+
/**
|
|
377
|
+
* Generate career recommendations based on favorable elements
|
|
378
|
+
*/
|
|
379
|
+
static generateCareerRecommendations(analysis, dayMasterElement, patternAnalysis) {
|
|
380
|
+
const career = {
|
|
381
|
+
favorableIndustries: [],
|
|
382
|
+
avoidIndustries: [],
|
|
383
|
+
idealRoles: [],
|
|
384
|
+
workEnvironment: [],
|
|
385
|
+
businessPartners: [...analysis.yongShen, ...analysis.xiShen],
|
|
386
|
+
timing: '循序漸進'
|
|
387
|
+
};
|
|
388
|
+
// Map favorable elements to industries
|
|
389
|
+
analysis.yongShen.forEach(element => {
|
|
390
|
+
switch (element) {
|
|
391
|
+
case '木':
|
|
392
|
+
career.favorableIndustries.push('教育培訓', '出版印刷', '醫療保健', '時尚服飾', '農林業');
|
|
393
|
+
career.idealRoles.push('教師', '設計師', '治療師');
|
|
394
|
+
career.workEnvironment.push('綠化環境');
|
|
395
|
+
break;
|
|
396
|
+
case '火':
|
|
397
|
+
career.favorableIndustries.push('高科技產業', '娛樂傳媒', '能源電力', '餐飲業', '市場營銷');
|
|
398
|
+
career.idealRoles.push('領導者', '表演者', '創新開發者');
|
|
399
|
+
career.workEnvironment.push('明亮環境');
|
|
400
|
+
break;
|
|
401
|
+
case '土':
|
|
402
|
+
career.favorableIndustries.push('房地產', '建築工程', '農業種植', '保險業', '管理諮詢');
|
|
403
|
+
career.idealRoles.push('行政管理者', '顧問', '調解者');
|
|
404
|
+
career.workEnvironment.push('穩定環境');
|
|
405
|
+
break;
|
|
406
|
+
case '金':
|
|
407
|
+
career.favorableIndustries.push('金融銀行', '法律司法', '精密科技', '珠寶首飾', '汽車機械');
|
|
408
|
+
career.idealRoles.push('分析師', '工程師', '執行決策者');
|
|
409
|
+
career.workEnvironment.push('結構化環境');
|
|
410
|
+
break;
|
|
411
|
+
case '水':
|
|
412
|
+
career.favorableIndustries.push('貿易物流', '運輸航運', '通訊傳播', '旅遊觀光', '飲料酒水');
|
|
413
|
+
career.idealRoles.push('談判協商者', '策略規劃師', '人脈經營者');
|
|
414
|
+
career.workEnvironment.push('靈活環境');
|
|
415
|
+
break;
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
// Map unfavorable elements to industries to avoid
|
|
419
|
+
analysis.jiShen.forEach(element => {
|
|
420
|
+
switch (element) {
|
|
421
|
+
case '木':
|
|
422
|
+
career.avoidIndustries.push('木屬性行業');
|
|
423
|
+
break;
|
|
424
|
+
case '火':
|
|
425
|
+
career.avoidIndustries.push('火屬性行業');
|
|
426
|
+
break;
|
|
427
|
+
case '土':
|
|
428
|
+
career.avoidIndustries.push('土屬性行業');
|
|
429
|
+
break;
|
|
430
|
+
case '金':
|
|
431
|
+
career.avoidIndustries.push('金屬性行業');
|
|
432
|
+
break;
|
|
433
|
+
case '水':
|
|
434
|
+
career.avoidIndustries.push('水屬性行業');
|
|
435
|
+
break;
|
|
436
|
+
}
|
|
437
|
+
});
|
|
438
|
+
// Adjust timing based on pattern
|
|
439
|
+
if (patternAnalysis?.primaryPattern?.type?.includes('從')) {
|
|
440
|
+
career.timing = '果斷決策';
|
|
441
|
+
}
|
|
442
|
+
else if (analysis.yongShen.length > 2) {
|
|
443
|
+
career.timing = '靈活變通';
|
|
444
|
+
}
|
|
445
|
+
return career;
|
|
446
|
+
}
|
|
447
|
+
/**
|
|
448
|
+
* Generate lifestyle recommendations
|
|
449
|
+
*/
|
|
450
|
+
static generateLifestyleRecommendations(analysis, dayMasterElement, climateAnalysis) {
|
|
451
|
+
const lifestyle = {
|
|
452
|
+
dailyHabits: [],
|
|
453
|
+
exercises: [],
|
|
454
|
+
hobbies: [],
|
|
455
|
+
environment: [],
|
|
456
|
+
diet: [],
|
|
457
|
+
schedule: '平衡作息'
|
|
458
|
+
};
|
|
459
|
+
// Recommendations based on favorable elements
|
|
460
|
+
analysis.yongShen.forEach(element => {
|
|
461
|
+
switch (element) {
|
|
462
|
+
case '木':
|
|
463
|
+
lifestyle.dailyHabits.push('早起晨練', '親近自然', '持續學習成長');
|
|
464
|
+
lifestyle.exercises.push('瑜伽', '太極拳', '散步健走');
|
|
465
|
+
lifestyle.hobbies.push('園藝種植', '閱讀學習', '手工藝');
|
|
466
|
+
lifestyle.environment.push('綠色植物環境');
|
|
467
|
+
lifestyle.diet.push('綠色蔬菜', '酸味食物');
|
|
468
|
+
break;
|
|
469
|
+
case '火':
|
|
470
|
+
lifestyle.dailyHabits.push('適度曬太陽', '社交活動', '創意表達');
|
|
471
|
+
lifestyle.exercises.push('有氧運動', '舞蹈', '球類運動');
|
|
472
|
+
lifestyle.hobbies.push('表演藝術', '烹飪', '藝術創作');
|
|
473
|
+
lifestyle.environment.push('明亮溫暖環境');
|
|
474
|
+
lifestyle.diet.push('辛辣食物', '苦味食物');
|
|
475
|
+
break;
|
|
476
|
+
case '土':
|
|
477
|
+
lifestyle.dailyHabits.push('規律作息', '接地氣', '保持穩定');
|
|
478
|
+
lifestyle.exercises.push('登山健行', '重量訓練', '皮拉提斯');
|
|
479
|
+
lifestyle.hobbies.push('陶藝', '收藏', '廚藝');
|
|
480
|
+
lifestyle.environment.push('自然材質環境');
|
|
481
|
+
lifestyle.diet.push('五穀雜糧', '甘甜食物');
|
|
482
|
+
break;
|
|
483
|
+
case '金':
|
|
484
|
+
lifestyle.dailyHabits.push('整理收納', '自律守時', '簡約生活');
|
|
485
|
+
lifestyle.exercises.push('武術格鬥', '呼吸練習', '精準運動');
|
|
486
|
+
lifestyle.hobbies.push('音樂', '科技玩物', '精品收藏');
|
|
487
|
+
lifestyle.environment.push('整潔有序環境');
|
|
488
|
+
lifestyle.diet.push('白色食物', '辛味食物');
|
|
489
|
+
break;
|
|
490
|
+
case '水':
|
|
491
|
+
lifestyle.dailyHabits.push('保持彈性', '冥想靜心', '順其自然');
|
|
492
|
+
lifestyle.exercises.push('游泳', '流動瑜伽', '伸展運動');
|
|
493
|
+
lifestyle.hobbies.push('旅行', '哲學思考', '音樂欣賞');
|
|
494
|
+
lifestyle.environment.push('流水元素環境');
|
|
495
|
+
lifestyle.diet.push('海鮮水產', '鹹味食物');
|
|
496
|
+
break;
|
|
497
|
+
}
|
|
498
|
+
});
|
|
499
|
+
// Adjust schedule based on day master and climate
|
|
500
|
+
if (climateAnalysis?.temperature === 'hot') {
|
|
501
|
+
lifestyle.schedule = '早晨作息';
|
|
502
|
+
}
|
|
503
|
+
else if (climateAnalysis?.temperature === 'cold') {
|
|
504
|
+
lifestyle.schedule = '日中作息';
|
|
505
|
+
}
|
|
506
|
+
return lifestyle;
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Generate relationship recommendations
|
|
510
|
+
*/
|
|
511
|
+
static generateRelationshipRecommendations(analysis, dayMasterElement) {
|
|
512
|
+
const relationships = {
|
|
513
|
+
compatibleElements: [...analysis.yongShen, ...analysis.xiShen],
|
|
514
|
+
communicationStyle: [],
|
|
515
|
+
socialActivities: [],
|
|
516
|
+
partnerQualities: [],
|
|
517
|
+
conflictResolution: [],
|
|
518
|
+
familyDynamics: '家庭和諧'
|
|
519
|
+
};
|
|
520
|
+
// Communication style based on day master element
|
|
521
|
+
switch (dayMasterElement) {
|
|
522
|
+
case '木':
|
|
523
|
+
relationships.communicationStyle.push('直接溝通', '成長導向溝通');
|
|
524
|
+
relationships.conflictResolution.push('尋求妥協');
|
|
525
|
+
break;
|
|
526
|
+
case '火':
|
|
527
|
+
relationships.communicationStyle.push('熱情表達', '激勵型溝通');
|
|
528
|
+
relationships.conflictResolution.push('表達釋放');
|
|
529
|
+
break;
|
|
530
|
+
case '土':
|
|
531
|
+
relationships.communicationStyle.push('穩重踏實', '務實具體');
|
|
532
|
+
relationships.conflictResolution.push('耐心等待');
|
|
533
|
+
break;
|
|
534
|
+
case '金':
|
|
535
|
+
relationships.communicationStyle.push('精確清晰', '公正客觀');
|
|
536
|
+
relationships.conflictResolution.push('理性分析');
|
|
537
|
+
break;
|
|
538
|
+
case '水':
|
|
539
|
+
relationships.communicationStyle.push('直覺感性', '適應調整');
|
|
540
|
+
relationships.conflictResolution.push('順勢化解');
|
|
541
|
+
break;
|
|
542
|
+
}
|
|
543
|
+
// Social activities based on favorable elements
|
|
544
|
+
analysis.yongShen.forEach(element => {
|
|
545
|
+
switch (element) {
|
|
546
|
+
case '木':
|
|
547
|
+
relationships.socialActivities.push('戶外活動', '學習成長');
|
|
548
|
+
relationships.partnerQualities.push('成長導向', '支持鼓勵');
|
|
549
|
+
break;
|
|
550
|
+
case '火':
|
|
551
|
+
relationships.socialActivities.push('社交聚會', '創意活動');
|
|
552
|
+
relationships.partnerQualities.push('熱情積極', '充滿活力');
|
|
553
|
+
break;
|
|
554
|
+
case '土':
|
|
555
|
+
relationships.socialActivities.push('社區活動', '傳統聚會');
|
|
556
|
+
relationships.partnerQualities.push('可靠穩定', '關懷照顧');
|
|
557
|
+
break;
|
|
558
|
+
case '金':
|
|
559
|
+
relationships.socialActivities.push('精緻活動', '專業交流');
|
|
560
|
+
relationships.partnerQualities.push('自律嚴謹', '忠誠專一');
|
|
561
|
+
break;
|
|
562
|
+
case '水':
|
|
563
|
+
relationships.socialActivities.push('多元體驗', '知性交流');
|
|
564
|
+
relationships.partnerQualities.push('理解包容', '靈活變通');
|
|
565
|
+
break;
|
|
566
|
+
}
|
|
567
|
+
});
|
|
568
|
+
// Family dynamics based on pattern
|
|
569
|
+
if (analysis.jiShen.includes(dayMasterElement)) {
|
|
570
|
+
relationships.familyDynamics = '獨立自主';
|
|
571
|
+
}
|
|
572
|
+
return relationships;
|
|
573
|
+
}
|
|
574
|
+
/**
|
|
575
|
+
* Generate health recommendations
|
|
576
|
+
*/
|
|
577
|
+
static generateHealthRecommendations(analysis, dayMasterElement, strengthAnalysis) {
|
|
578
|
+
const health = {
|
|
579
|
+
preventiveMeasures: [],
|
|
580
|
+
vulnerableAreas: [],
|
|
581
|
+
exercises: [],
|
|
582
|
+
dietaryGuidelines: [],
|
|
583
|
+
seasonalCare: [],
|
|
584
|
+
stressManagement: []
|
|
585
|
+
};
|
|
586
|
+
// Vulnerable areas based on weak/excessive elements
|
|
587
|
+
analysis.jiShen.forEach(element => {
|
|
588
|
+
switch (element) {
|
|
589
|
+
case '木':
|
|
590
|
+
health.vulnerableAreas.push('肝臟', '眼睛', '神經系統');
|
|
591
|
+
break;
|
|
592
|
+
case '火':
|
|
593
|
+
health.vulnerableAreas.push('心臟', '血液循環', '舌頭');
|
|
594
|
+
break;
|
|
595
|
+
case '土':
|
|
596
|
+
health.vulnerableAreas.push('脾臟', '胃部', '消化系統');
|
|
597
|
+
break;
|
|
598
|
+
case '金':
|
|
599
|
+
health.vulnerableAreas.push('肺部', '皮膚', '呼吸系統');
|
|
600
|
+
break;
|
|
601
|
+
case '水':
|
|
602
|
+
health.vulnerableAreas.push('腎臟', '膀胱', '骨骼');
|
|
603
|
+
break;
|
|
604
|
+
}
|
|
605
|
+
});
|
|
606
|
+
// Preventive measures based on favorable elements
|
|
607
|
+
analysis.yongShen.forEach(element => {
|
|
608
|
+
switch (element) {
|
|
609
|
+
case '木':
|
|
610
|
+
health.preventiveMeasures.push('伸展運動', '護眼保健');
|
|
611
|
+
health.exercises.push('瑜伽');
|
|
612
|
+
health.dietaryGuidelines.push('綠色蔬菜');
|
|
613
|
+
break;
|
|
614
|
+
case '火':
|
|
615
|
+
health.preventiveMeasures.push('心血管保健', '促進循環');
|
|
616
|
+
health.exercises.push('有氧運動');
|
|
617
|
+
health.dietaryGuidelines.push('抗氧化食物');
|
|
618
|
+
break;
|
|
619
|
+
case '土':
|
|
620
|
+
health.preventiveMeasures.push('消化保健', '接地養生');
|
|
621
|
+
health.exercises.push('核心訓練');
|
|
622
|
+
health.dietaryGuidelines.push('全食物');
|
|
623
|
+
break;
|
|
624
|
+
case '金':
|
|
625
|
+
health.preventiveMeasures.push('呼吸保健', '增強免疫');
|
|
626
|
+
health.exercises.push('呼吸練習');
|
|
627
|
+
health.dietaryGuidelines.push('礦物質食物');
|
|
628
|
+
break;
|
|
629
|
+
case '水':
|
|
630
|
+
health.preventiveMeasures.push('充足水分', '腎臟保健');
|
|
631
|
+
health.exercises.push('游泳');
|
|
632
|
+
health.dietaryGuidelines.push('補水食物');
|
|
633
|
+
break;
|
|
634
|
+
}
|
|
635
|
+
});
|
|
636
|
+
// Seasonal care
|
|
637
|
+
if (analysis.yongShen.includes('木')) {
|
|
638
|
+
health.seasonalCare.push('春季養生');
|
|
639
|
+
}
|
|
640
|
+
if (analysis.yongShen.includes('火')) {
|
|
641
|
+
health.seasonalCare.push('夏季養生');
|
|
642
|
+
}
|
|
643
|
+
if (analysis.yongShen.includes('土')) {
|
|
644
|
+
health.seasonalCare.push('季節轉換養生');
|
|
645
|
+
}
|
|
646
|
+
if (analysis.yongShen.includes('金')) {
|
|
647
|
+
health.seasonalCare.push('秋季養生');
|
|
648
|
+
}
|
|
649
|
+
if (analysis.yongShen.includes('水')) {
|
|
650
|
+
health.seasonalCare.push('冬季養生');
|
|
651
|
+
}
|
|
652
|
+
// Stress management based on day master strength
|
|
653
|
+
if (strengthAnalysis && (strengthAnalysis.dayMasterStrength === '身弱' || strengthAnalysis.dayMasterStrength === '衰極')) {
|
|
654
|
+
health.stressManagement.push('充分休息', '尋求支援', '滋養身心');
|
|
655
|
+
}
|
|
656
|
+
else if (strengthAnalysis && (strengthAnalysis.dayMasterStrength === '身旺' || strengthAnalysis.dayMasterStrength === '旺極')) {
|
|
657
|
+
health.stressManagement.push('釋放壓力', '疏導能量', '平衡調節');
|
|
658
|
+
}
|
|
659
|
+
else {
|
|
660
|
+
health.stressManagement.push('維持平衡', '預防失衡');
|
|
661
|
+
}
|
|
662
|
+
return health;
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* Generate luck enhancers
|
|
666
|
+
*/
|
|
667
|
+
static generateLuckEnhancers(analysis, dayMasterElement) {
|
|
668
|
+
const luck = {
|
|
669
|
+
colors: [],
|
|
670
|
+
numbers: [],
|
|
671
|
+
directions: [],
|
|
672
|
+
seasons: [],
|
|
673
|
+
timeOfDay: [],
|
|
674
|
+
materials: []
|
|
675
|
+
};
|
|
676
|
+
// Map elements to luck enhancers
|
|
677
|
+
analysis.yongShen.forEach(element => {
|
|
678
|
+
switch (element) {
|
|
679
|
+
case '木':
|
|
680
|
+
luck.colors.push('綠色', '青色');
|
|
681
|
+
luck.numbers.push(3, 8);
|
|
682
|
+
luck.directions.push('東方', '東南');
|
|
683
|
+
luck.seasons.push('春季');
|
|
684
|
+
luck.timeOfDay.push('清晨');
|
|
685
|
+
luck.materials.push('木質材料', '竹製品');
|
|
686
|
+
break;
|
|
687
|
+
case '火':
|
|
688
|
+
luck.colors.push('紅色', '紫色');
|
|
689
|
+
luck.numbers.push(2, 7);
|
|
690
|
+
luck.directions.push('南方');
|
|
691
|
+
luck.seasons.push('夏季');
|
|
692
|
+
luck.timeOfDay.push('中午');
|
|
693
|
+
luck.materials.push('火屬性材料', '皮革');
|
|
694
|
+
break;
|
|
695
|
+
case '土':
|
|
696
|
+
luck.colors.push('黃色', '棕色');
|
|
697
|
+
luck.numbers.push(5, 0);
|
|
698
|
+
luck.directions.push('中央', '東北', '西南');
|
|
699
|
+
luck.seasons.push('季節交替');
|
|
700
|
+
luck.timeOfDay.push('下午');
|
|
701
|
+
luck.materials.push('土質材料', '陶瓷');
|
|
702
|
+
break;
|
|
703
|
+
case '金':
|
|
704
|
+
luck.colors.push('白色', '金色');
|
|
705
|
+
luck.numbers.push(4, 9);
|
|
706
|
+
luck.directions.push('西方', '西北');
|
|
707
|
+
luck.seasons.push('秋季');
|
|
708
|
+
luck.timeOfDay.push('傍晚');
|
|
709
|
+
luck.materials.push('金屬材料', '水晶');
|
|
710
|
+
break;
|
|
711
|
+
case '水':
|
|
712
|
+
luck.colors.push('黑色', '藍色');
|
|
713
|
+
luck.numbers.push(1, 6);
|
|
714
|
+
luck.directions.push('北方');
|
|
715
|
+
luck.seasons.push('冬季');
|
|
716
|
+
luck.timeOfDay.push('夜晚');
|
|
717
|
+
luck.materials.push('水屬性材料', '玻璃');
|
|
718
|
+
break;
|
|
719
|
+
}
|
|
720
|
+
});
|
|
721
|
+
// Remove duplicates
|
|
722
|
+
luck.numbers = [...new Set(luck.numbers)];
|
|
723
|
+
return luck;
|
|
724
|
+
}
|
|
725
|
+
/**
|
|
726
|
+
* Generate Feng Shui suggestions
|
|
727
|
+
*/
|
|
728
|
+
static generateFengShuiSuggestions(analysis, dayMasterElement) {
|
|
729
|
+
const fengShui = {
|
|
730
|
+
homeLayout: [],
|
|
731
|
+
officeSetup: [],
|
|
732
|
+
sleepDirection: '',
|
|
733
|
+
decorElements: [],
|
|
734
|
+
plants: [],
|
|
735
|
+
avoidPlacements: []
|
|
736
|
+
};
|
|
737
|
+
// Sleep direction based on favorable elements
|
|
738
|
+
const primaryYongShen = analysis.yongShen[0];
|
|
739
|
+
switch (primaryYongShen) {
|
|
740
|
+
case '木':
|
|
741
|
+
fengShui.sleepDirection = '頭向東方';
|
|
742
|
+
break;
|
|
743
|
+
case '火':
|
|
744
|
+
fengShui.sleepDirection = '頭向南方';
|
|
745
|
+
break;
|
|
746
|
+
case '土':
|
|
747
|
+
fengShui.sleepDirection = '中央位置';
|
|
748
|
+
break;
|
|
749
|
+
case '金':
|
|
750
|
+
fengShui.sleepDirection = '頭向西方';
|
|
751
|
+
break;
|
|
752
|
+
case '水':
|
|
753
|
+
fengShui.sleepDirection = '頭向北方';
|
|
754
|
+
break;
|
|
755
|
+
default:
|
|
756
|
+
fengShui.sleepDirection = '吉利方向';
|
|
757
|
+
}
|
|
758
|
+
// Home and office suggestions based on favorable elements
|
|
759
|
+
analysis.yongShen.forEach(element => {
|
|
760
|
+
switch (element) {
|
|
761
|
+
case '木':
|
|
762
|
+
fengShui.homeLayout.push('通風採光', '室內植物');
|
|
763
|
+
fengShui.officeSetup.push('辦公桌面向東方', '生長元素');
|
|
764
|
+
fengShui.decorElements.push('高大物品', '長方形裝飾');
|
|
765
|
+
fengShui.plants.push('竹子', '榕樹');
|
|
766
|
+
break;
|
|
767
|
+
case '火':
|
|
768
|
+
fengShui.homeLayout.push('明亮燈光', '南方區域');
|
|
769
|
+
fengShui.officeSetup.push('明亮照明', '三角元素');
|
|
770
|
+
fengShui.decorElements.push('蠟燭', '三角形裝飾');
|
|
771
|
+
fengShui.plants.push('開花植物', '紅色花卉');
|
|
772
|
+
break;
|
|
773
|
+
case '土':
|
|
774
|
+
fengShui.homeLayout.push('中央穩定', '穩固佈局');
|
|
775
|
+
fengShui.officeSetup.push('接地元素', '方形佈局');
|
|
776
|
+
fengShui.decorElements.push('石頭擺設', '方形裝飾');
|
|
777
|
+
fengShui.plants.push('多肉植物', '低矮植物');
|
|
778
|
+
break;
|
|
779
|
+
case '金':
|
|
780
|
+
fengShui.homeLayout.push('整齊有序', '西方區域');
|
|
781
|
+
fengShui.officeSetup.push('極簡設計', '圓形元素');
|
|
782
|
+
fengShui.decorElements.push('金屬物品', '圓形裝飾');
|
|
783
|
+
fengShui.plants.push('白色花卉', '圓葉植物');
|
|
784
|
+
break;
|
|
785
|
+
case '水':
|
|
786
|
+
fengShui.homeLayout.push('流水裝飾', '北方區域');
|
|
787
|
+
fengShui.officeSetup.push('流水擺設', '曲線設計');
|
|
788
|
+
fengShui.decorElements.push('水族箱', '波浪形裝飾');
|
|
789
|
+
fengShui.plants.push('蓮花', '水生植物');
|
|
790
|
+
break;
|
|
791
|
+
}
|
|
792
|
+
});
|
|
793
|
+
// Avoid placements based on JiShen
|
|
794
|
+
analysis.jiShen.forEach(element => {
|
|
795
|
+
switch (element) {
|
|
796
|
+
case '木':
|
|
797
|
+
fengShui.avoidPlacements.push('避免木元素過多');
|
|
798
|
+
break;
|
|
799
|
+
case '火':
|
|
800
|
+
fengShui.avoidPlacements.push('避免火元素過多');
|
|
801
|
+
break;
|
|
802
|
+
case '土':
|
|
803
|
+
fengShui.avoidPlacements.push('避免土元素過多');
|
|
804
|
+
break;
|
|
805
|
+
case '金':
|
|
806
|
+
fengShui.avoidPlacements.push('避免金元素過多');
|
|
807
|
+
break;
|
|
808
|
+
case '水':
|
|
809
|
+
fengShui.avoidPlacements.push('避免水元素過多');
|
|
810
|
+
break;
|
|
811
|
+
}
|
|
812
|
+
});
|
|
813
|
+
return fengShui;
|
|
814
|
+
}
|
|
815
|
+
/**
|
|
816
|
+
* Helper: Get day master element
|
|
817
|
+
*/
|
|
818
|
+
static getDayMasterElement(dayMasterStem) {
|
|
819
|
+
const elementMap = {
|
|
820
|
+
'甲': '木', '乙': '木',
|
|
821
|
+
'丙': '火', '丁': '火',
|
|
822
|
+
'戊': '土', '己': '土',
|
|
823
|
+
'庚': '金', '辛': '金',
|
|
824
|
+
'壬': '水', '癸': '水'
|
|
825
|
+
};
|
|
826
|
+
return elementMap[dayMasterStem] || '';
|
|
827
|
+
}
|
|
828
|
+
/**
|
|
829
|
+
* Helper: Count elements in the chart
|
|
830
|
+
*/
|
|
831
|
+
static count(chart) {
|
|
832
|
+
const counts = {
|
|
833
|
+
'木': 0, '火': 0, '土': 0, '金': 0, '水': 0
|
|
834
|
+
};
|
|
835
|
+
// Count stems
|
|
836
|
+
const stems = [chart.year.stem, chart.month.stem, chart.day.stem, chart.hour.stem];
|
|
837
|
+
stems.forEach((stem) => {
|
|
838
|
+
const element = this.getDayMasterElement(stem);
|
|
839
|
+
if (element)
|
|
840
|
+
counts[element]++;
|
|
841
|
+
});
|
|
842
|
+
// Count branches (simplified - main qi only)
|
|
843
|
+
const branchElements = {
|
|
844
|
+
'子': '水', '丑': '土', '寅': '木', '卯': '木',
|
|
845
|
+
'辰': '土', '巳': '火', '午': '火', '未': '土',
|
|
846
|
+
'申': '金', '酉': '金', '戌': '土', '亥': '水'
|
|
847
|
+
};
|
|
848
|
+
const branches = [chart.year.branch, chart.month.branch, chart.day.branch, chart.hour.branch];
|
|
849
|
+
branches.forEach((branch) => {
|
|
850
|
+
const element = branchElements[branch];
|
|
851
|
+
if (element)
|
|
852
|
+
counts[element]++;
|
|
853
|
+
});
|
|
854
|
+
return counts;
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
exports.YongShenAnalyzer = YongShenAnalyzer;
|
|
858
|
+
//# sourceMappingURL=YongShenAnalyzer.js.map
|