/**
* 八字分析引擎
* 负责八字排盘、分析和运势预测
*/
const { Lunar } = require('lunar-javascript');
const moment = require('moment-timezone');
const BaziDatabase = require('../data/bazi-database.js');
const BaziCalculator = require('../utils/bazi-calculator.js');
const Logger = require('../utils/logger.js');
class BaziEngine {
constructor() {
this.baziDB = new BaziDatabase();
this.calculator = new BaziCalculator();
this.logger = new Logger();
}
/**
* 生成八字排盘
* @param {Object} params - 参数对象
* @param {string} params.birth_datetime - 出生时间 (ISO格式)
* @param {string} params.timezone - 时区
* @param {string} params.gender - 性别 (male/female)
* @param {string} [params.location] - 出生地点
* @param {boolean} [params.use_true_solar_time] - 是否使用真太阳时
* @param {boolean} [params.is_lunar] - 是否为农历日期
* @returns {Object} 八字排盘结果
*/
async generateChart({ birth_datetime, timezone, gender, location, use_true_solar_time = false, is_lunar = false }) {
try {
this.logger.info('开始生成八字排盘', { birth_datetime, timezone, gender });
// 转换时间
const birthMoment = moment.tz(birth_datetime, timezone);
// 真太阳时校正
let adjustedTime = birthMoment;
if (use_true_solar_time && location) {
adjustedTime = this.calculator.adjustForTrueSolarTime(birthMoment, location);
}
// 根据is_lunar参数处理农历/公历日期
let lunar, solar;
if (is_lunar) {
// 如果输入的是农历日期,需要先创建农历对象再转换为公历
const year = adjustedTime.year();
const month = adjustedTime.month() + 1; // moment月份从0开始
const day = adjustedTime.date();
const hour = adjustedTime.hour();
const minute = adjustedTime.minute();
lunar = Lunar.fromYmdHms(year, month, day, hour, minute, 0);
solar = lunar.getSolar();
// 更新adjustedTime为转换后的公历时间
adjustedTime = moment.tz(`${solar.getYear()}-${solar.getMonth()}-${solar.getDay()} ${hour}:${minute}:00`, timezone);
} else {
// 如果输入的是公历日期,直接从公历创建农历对象
lunar = Lunar.fromDate(adjustedTime.toDate());
solar = lunar.getSolar();
}
// 计算四柱八字
const fourPillars = this.calculateFourPillars(lunar, adjustedTime);
// 计算大运
const majorLuck = this.calculateMajorLuck(fourPillars, gender, lunar);
// 计算流年
const annualLuck = this.calculateAnnualLuck(adjustedTime.year());
// 计算神煞
const spirits = this.calculateSpirits(fourPillars);
// 五行分析
const fiveElementsAnalysis = this.analyzeFiveElements(fourPillars);
// 十神分析
const tenGodsAnalysis = this.analyzeTenGods(fourPillars);
const result = {
timestamp: new Date().toISOString(),
birth_info: {
solar_datetime: solar.toYmdHms(),
lunar_date: lunar.toFullString(),
timezone: timezone,
gender: gender,
location: location,
use_true_solar_time: use_true_solar_time
},
four_pillars: fourPillars,
major_luck: majorLuck,
annual_luck: annualLuck,
spirits_and_stars: spirits,
five_elements: fiveElementsAnalysis,
ten_gods: tenGodsAnalysis,
chart_quality: this.evaluateChartQuality(fourPillars, fiveElementsAnalysis),
basic_personality: this.analyzeBasicPersonality(fourPillars, fiveElementsAnalysis)
};
this.logger.info('八字排盘生成成功');
return result;
} catch (error) {
this.logger.error('八字排盘生成失败', { error: error.message });
throw error;
}
}
/**
* 分析八字
* @param {Object} params - 参数对象
* @param {Object} params.chart - 八字排盘数据
* @param {string} params.analysis_type - 分析类型
* @param {Array} [params.focus_areas] - 关注领域
* @param {string} [params.detail_level] - 详细程度
* @returns {Object} 分析结果
*/
async analyzeChart({ chart, analysis_type, focus_areas = [], detail_level = 'standard' }) {
try {
this.logger.info('开始分析八字', { analysis_type, focus_areas, detail_level });
let analysis = {};
// 支持数组类型的analysis_type
const types = Array.isArray(analysis_type) ? analysis_type : [analysis_type];
for (const type of types) {
switch (type) {
case 'personality':
analysis.personality = await this.analyzePersonality(chart, detail_level);
break;
case 'career':
analysis.career = await this.analyzeCareer(chart, detail_level);
break;
case 'wealth':
analysis.wealth = await this.analyzeWealth(chart, detail_level);
break;
case 'relationship':
analysis.relationship = await this.analyzeRelationship(chart, detail_level);
break;
case 'health':
analysis.health = await this.analyzeHealth(chart, detail_level);
break;
case 'comprehensive':
analysis.comprehensive = await this.analyzeComprehensive(chart, focus_areas, detail_level);
break;
default:
throw new Error(`不支持的分析类型: ${type}`);
}
}
const result = {
timestamp: new Date().toISOString(),
analysis_type: analysis_type,
focus_areas: focus_areas,
detail_level: detail_level,
analysis: analysis,
strengths: this.identifyStrengths(chart, analysis),
challenges: this.identifyChallenges(chart, analysis),
recommendations: this.generateRecommendations(chart, analysis, analysis_type)
};
this.logger.info('八字分析完成');
return result;
} catch (error) {
this.logger.error('八字分析失败', { error: error.message });
throw error;
}
}
/**
* 识别优势
* @param {Object} chart - 八字排盘数据
* @param {Object} analysis - 分析结果
* @returns {Array} 优势列表
*/
identifyStrengths(chart, analysis) {
return [
'性格稳重可靠',
'执行力强',
'学习能力好',
'人际关系和谐',
'做事有条理'
];
}
/**
* 识别挑战
* @param {Object} chart - 八字排盘数据
* @param {Object} analysis - 分析结果
* @returns {Array} 挑战列表
*/
identifyChallenges(chart, analysis) {
return [
'决策速度需要提升',
'创新思维有待加强',
'风险承受能力较低',
'表达能力需要改善',
'适应变化能力待提高'
];
}
/**
* 生成建议
* @param {Object} chart - 八字排盘数据
* @param {Object} analysis - 分析结果
* @param {string} analysisType - 分析类型
* @returns {Array} 建议列表
*/
generateRecommendations(chart, analysis, analysisType) {
const baseRecommendations = [
'保持稳重的性格优势',
'培养更快的决策能力',
'增强创新思维',
'提升沟通表达能力',
'适度承担风险'
];
// 根据分析类型添加特定建议
if (Array.isArray(analysisType)) {
if (analysisType.includes('career')) {
baseRecommendations.push('专注专业技能提升', '建立良好的职场人脉');
}
if (analysisType.includes('personality')) {
baseRecommendations.push('培养自信心', '学会主动表达');
}
} else {
switch (analysisType) {
case 'career':
baseRecommendations.push('专注专业技能提升', '建立良好的职场人脉');
break;
case 'personality':
baseRecommendations.push('培养自信心', '学会主动表达');
break;
case 'wealth':
baseRecommendations.push('学习投资理财', '开拓多元收入');
break;
case 'relationship':
baseRecommendations.push('增强情感表达', '培养浪漫情趣');
break;
case 'health':
baseRecommendations.push('保持规律作息', '适量运动锻炼');
break;
}
}
return baseRecommendations;
}
/**
* 运势预测
* @param {Object} params - 参数对象
* @param {Object} params.chart - 八字排盘数据
* @param {string} params.period_type - 预测周期类型
* @param {string} [params.start_date] - 开始日期
* @param {string} [params.end_date] - 结束日期
* @param {Array} [params.focus_aspects] - 关注方面
* @returns {Object} 运势预测结果
*/
async forecastLuck({ chart, period_type, start_date, end_date, focus_aspects = [] }) {
try {
this.logger.info('开始运势预测', { period_type, start_date, end_date });
const currentDate = start_date ? moment(start_date) : moment();
let forecast = {};
switch (period_type) {
case 'monthly':
forecast = await this.forecastMonthly(chart, currentDate, focus_aspects);
break;
case 'yearly':
forecast = await this.forecastYearly(chart, currentDate, focus_aspects);
break;
case 'decade':
forecast = await this.forecastDecade(chart, currentDate, focus_aspects);
break;
case 'custom':
if (!start_date || !end_date) {
throw new Error('自定义预测需要提供开始和结束日期');
}
forecast = await this.forecastCustomPeriod(chart, start_date, end_date, focus_aspects);
break;
default:
throw new Error(`不支持的预测周期类型: ${period_type}`);
}
const result = {
timestamp: new Date().toISOString(),
period_type: period_type,
forecast_period: {
start: start_date || currentDate.format('YYYY-MM-DD'),
end: end_date || this.calculateEndDate(currentDate, period_type)
},
focus_aspects: focus_aspects,
forecast: forecast,
key_periods: this.identifyKeyPeriods(chart, forecast),
overall_trend: this.analyzeOverallTrend(forecast),
actionable_advice: this.generateActionableAdvice(forecast, focus_aspects)
};
this.logger.info('运势预测完成');
return result;
} catch (error) {
this.logger.error('运势预测失败', { error: error.message });
throw error;
}
}
/**
* 计算四柱八字
* @param {Object} lunar - 农历对象
* @param {Object} adjustedTime - 调整后的时间
* @returns {Object} 四柱八字
*/
calculateFourPillars(lunar, adjustedTime) {
const year = lunar.getYearInGanZhi();
const month = lunar.getMonthInGanZhi();
const day = lunar.getDayInGanZhi();
const hour = lunar.getTimeZhi();
// 获取时干
const hourGan = this.calculator.getHourGan(day.charAt(0), adjustedTime.hour());
const hourPillar = hourGan + hour;
return {
year: {
pillar: year,
heavenly_stem: year.charAt(0),
earthly_branch: year.charAt(1),
element: this.calculator.getGanElement(year.charAt(0)),
yin_yang: this.calculator.getGanYinYang(year.charAt(0))
},
month: {
pillar: month,
heavenly_stem: month.charAt(0),
earthly_branch: month.charAt(1),
element: this.calculator.getGanElement(month.charAt(0)),
yin_yang: this.calculator.getGanYinYang(month.charAt(0))
},
day: {
pillar: day,
heavenly_stem: day.charAt(0),
earthly_branch: day.charAt(1),
element: this.calculator.getGanElement(day.charAt(0)),
yin_yang: this.calculator.getGanYinYang(day.charAt(0)),
is_day_master: true
},
hour: {
pillar: hourPillar,
heavenly_stem: hourGan,
earthly_branch: hour,
element: this.calculator.getGanElement(hourGan),
yin_yang: this.calculator.getGanYinYang(hourGan)
}
};
}
/**
* 计算大运
* @param {Object} fourPillars - 四柱八字
* @param {string} gender - 性别
* @param {Object} lunar - 农历对象
* @returns {Object} 大运信息
*/
calculateMajorLuck(fourPillars, gender, lunar) {
const yearGan = fourPillars.year.heavenly_stem;
const isYangYear = this.calculator.getGanYinYang(yearGan) === 'yang';
// 确定大运顺逆
const isForward = (gender === 'male' && isYangYear) || (gender === 'female' && !isYangYear);
// 计算起运年龄
const startAge = this.calculator.calculateLuckStartAge(lunar, gender);
// 生成大运序列
const majorLuckPeriods = this.calculator.generateMajorLuckSequence(
fourPillars.month,
isForward,
startAge
);
return {
start_age: startAge,
direction: isForward ? 'forward' : 'backward',
periods: majorLuckPeriods
};
}
/**
* 计算流年
* @param {number} currentYear - 当前年份
* @returns {Array} 流年信息
*/
calculateAnnualLuck(currentYear) {
const annualLuck = [];
for (let i = 0; i < 10; i++) {
const year = currentYear + i;
const yearGanZhi = this.calculator.getYearGanZhi(year);
annualLuck.push({
year: year,
gan_zhi: yearGanZhi,
heavenly_stem: yearGanZhi.charAt(0),
earthly_branch: yearGanZhi.charAt(1),
element: this.calculator.getGanElement(yearGanZhi.charAt(0)),
yin_yang: this.calculator.getGanYinYang(yearGanZhi.charAt(0))
});
}
return annualLuck;
}
/**
* 性格分析
* @param {Object} chart - 八字排盘数据
* @param {string} detail_level - 详细程度
* @returns {Object} 性格分析结果
*/
async analyzePersonality(chart, detail_level = 'standard') {
const { four_pillars, five_elements, ten_gods } = chart;
return {
core_traits: this.analyzeCoreTraits(four_pillars, five_elements),
behavioral_patterns: this.analyzeBehavioralPatterns(ten_gods),
emotional_characteristics: this.analyzeEmotionalCharacteristics(five_elements),
social_tendencies: this.analyzeSocialTendencies(four_pillars),
strengths: this.identifyPersonalityStrengths(chart),
weaknesses: this.identifyPersonalityWeaknesses(chart),
development_suggestions: this.generatePersonalityDevelopmentSuggestions(chart)
};
}
/**
* 事业分析
* @param {Object} chart - 八字排盘数据
* @param {string} detail_level - 详细程度
* @returns {Object} 事业分析结果
*/
async analyzeCareer(chart, detail_level = 'standard') {
const { four_pillars, five_elements, ten_gods } = chart;
return {
career_potential: this.analyzeCareerPotential(four_pillars, ten_gods),
suitable_industries: this.identifySuitableIndustries(five_elements),
leadership_qualities: this.analyzeLeadershipQualities(ten_gods),
work_style: this.analyzeWorkStyle(four_pillars),
career_challenges: this.identifyCareerChallenges(chart),
development_timeline: this.analyzeCareerTimeline(chart),
success_factors: this.identifyCareerSuccessFactors(chart)
};
}
/**
* 财运分析
* @param {Object} chart - 八字排盘数据
* @param {string} detail_level - 详细程度
* @returns {Object} 财运分析结果
*/
async analyzeWealth(chart, detail_level = 'standard') {
const { four_pillars, five_elements, ten_gods } = chart;
return {
wealth_potential: this.analyzeWealthPotential(ten_gods),
money_management: this.analyzeMoneyManagement(four_pillars),
investment_tendencies: this.analyzeInvestmentTendencies(five_elements),
wealth_sources: this.identifyWealthSources(ten_gods),
financial_challenges: this.identifyFinancialChallenges(chart),
wealth_timing: this.analyzeWealthTiming(chart),
financial_advice: this.generateFinancialAdvice(chart)
};
}
/**
* 感情分析
* @param {Object} chart - 八字排盘数据
* @param {string} detail_level - 详细程度
* @returns {Object} 感情分析结果
*/
async analyzeRelationship(chart, detail_level = 'standard') {
const { four_pillars, five_elements, ten_gods } = chart;
return {
relationship_patterns: this.analyzeRelationshipPatterns(four_pillars),
partner_compatibility: this.analyzePartnerCompatibility(five_elements),
emotional_needs: this.analyzeEmotionalNeeds(ten_gods),
relationship_challenges: this.identifyRelationshipChallenges(chart),
marriage_timing: this.analyzeMarriageTiming(chart),
relationship_advice: this.generateRelationshipAdvice(chart)
};
}
/**
* 健康分析
* @param {Object} chart - 八字排盘数据
* @param {string} detail_level - 详细程度
* @returns {Object} 健康分析结果
*/
async analyzeHealth(chart, detail_level = 'standard') {
const { four_pillars, five_elements } = chart;
return {
constitution_type: this.analyzeConstitutionType(five_elements),
health_tendencies: this.analyzeHealthTendencies(four_pillars),
vulnerable_areas: this.identifyVulnerableAreas(five_elements),
seasonal_influences: this.analyzeSeasonalHealthInfluences(chart),
preventive_measures: this.generatePreventiveMeasures(chart),
lifestyle_recommendations: this.generateLifestyleRecommendations(chart)
};
}
/**
* 综合分析
* @param {Object} chart - 八字排盘数据
* @param {Array} focus_areas - 关注领域
* @param {string} detail_level - 详细程度
* @returns {Object} 综合分析结果
*/
async analyzeComprehensive(chart, focus_areas = [], detail_level = 'standard') {
const analysis = {
overall_assessment: this.generateOverallAssessment(chart),
life_themes: this.identifyLifeThemes(chart),
major_influences: this.analyzeMajorInfluences(chart),
life_cycles: this.analyzeLifeCycles(chart),
destiny_patterns: this.analyzeDestinyPatterns(chart)
};
// 根据关注领域添加专项分析
for (const area of focus_areas) {
switch (area) {
case 'personality':
analysis.personality = await this.analyzePersonality(chart, detail_level);
break;
case 'career':
analysis.career = await this.analyzeCareer(chart, detail_level);
break;
case 'wealth':
analysis.wealth = await this.analyzeWealth(chart, detail_level);
break;
case 'relationship':
analysis.relationship = await this.analyzeRelationship(chart, detail_level);
break;
case 'health':
analysis.health = await this.analyzeHealth(chart, detail_level);
break;
}
}
return analysis;
}
// 辅助方法 - 性格分析相关
analyzeCoreTraits(fourPillars, fiveElements) {
return ['稳重', '理性', '务实', '谨慎'];
}
analyzeBehavioralPatterns(tenGods) {
return ['深思熟虑', '循序渐进', '注重细节'];
}
analyzeEmotionalCharacteristics(fiveElements) {
return ['情绪稳定', '内敛含蓄', '重视感情'];
}
analyzeSocialTendencies(fourPillars) {
return ['重视人际关系', '善于合作', '值得信赖'];
}
identifyPersonalityStrengths(chart) {
return ['可靠性强', '执行力好', '学习能力强'];
}
identifyPersonalityWeaknesses(chart) {
return ['决策较慢', '缺乏冒险精神', '过于保守'];
}
generatePersonalityDevelopmentSuggestions(chart) {
return ['培养决断力', '适度冒险', '增强创新思维'];
}
// 辅助方法 - 事业分析相关
analyzeCareerPotential(fourPillars, tenGods) {
return { level: 'high', description: '具备良好的事业发展潜力' };
}
identifySuitableIndustries(fiveElements) {
return ['教育', '金融', '管理', '咨询'];
}
analyzeLeadershipQualities(tenGods) {
return { style: '稳健型', traits: ['善于协调', '重视团队'] };
}
analyzeWorkStyle(fourPillars) {
return ['注重计划', '执行力强', '团队合作'];
}
identifyCareerChallenges(chart) {
return ['需要提升决策速度', '增强创新能力'];
}
analyzeCareerTimeline(chart) {
return {
early_career: '稳步发展期',
mid_career: '快速上升期',
late_career: '成熟稳定期'
};
}
identifyCareerSuccessFactors(chart) {
return ['专业能力', '人际关系', '持续学习'];
}
// 辅助方法 - 财运分析相关
analyzeWealthPotential(tenGods) {
return { level: 'moderate', description: '财运平稳,需要努力积累' };
}
analyzeMoneyManagement(fourPillars) {
return ['理财谨慎', '注重储蓄', '投资保守'];
}
analyzeInvestmentTendencies(fiveElements) {
return ['偏好稳健投资', '风险承受能力中等'];
}
identifyWealthSources(tenGods) {
return ['工资收入', '投资理财', '副业收入'];
}
identifyFinancialChallenges(chart) {
return ['投资过于保守', '缺乏财富增长动力'];
}
analyzeWealthTiming(chart) {
return {
best_periods: ['中年期', '事业稳定期'],
challenging_periods: ['早年期', '变动期']
};
}
generateFinancialAdvice(chart) {
return ['适度增加投资比例', '学习理财知识', '开拓收入来源'];
}
// 新增缺失的财运分析方法
analyzeIncomeSource(chart) {
return {
primary_sources: ['工资收入', '专业技能收入'],
potential_sources: ['投资收益', '副业收入', '合作分成'],
income_stability: 'stable',
growth_potential: 'moderate'
};
}
analyzeInvestmentStyle(chart) {
return {
risk_preference: 'conservative',
investment_approach: '稳健型',
suitable_products: ['银行理财', '基金定投', '债券'],
avoid_products: ['高风险股票', '期货', '加密货币']
};
}
analyzeFinancialManagement(chart) {
return {
management_style: '谨慎理财',
budgeting_ability: 'good',
saving_tendency: 'high',
spending_pattern: '理性消费',
financial_planning: 'long_term_oriented'
};
}
analyzeWealthAccumulation(chart) {
return {
accumulation_speed: 'steady',
wealth_building_method: '稳步积累',
peak_accumulation_period: '中年期',
accumulation_challenges: ['投资过于保守', '收入来源单一'],
recommendations: ['多元化投资', '提升专业技能']
};
}
analyzeRiskTolerance(chart) {
return {
risk_level: 'low_to_moderate',
tolerance_score: 4,
risk_factors: ['稳定性偏好', '安全感需求'],
suitable_risk_range: '10%-30%',
risk_management_advice: ['分散投资', '设置止损']
};
}
getWealthFavorablePeriods(chart) {
return [
{
period: '25-35岁',
description: '事业上升期,收入稳定增长',
opportunities: ['职业发展', '技能提升', '投资理财']
},
{
period: '45-55岁',
description: '财富积累高峰期',
opportunities: ['资产配置', '被动收入', '财富传承']
}
];
}
getWealthCautionPeriods(chart) {
return [
{
period: '35-40岁',
description: '职业转换期,收入可能不稳定',
cautions: ['避免大额投资', '保持现金流', '谨慎决策']
}
];
}
// 辅助方法 - 感情分析相关
analyzeRelationshipPatterns(fourPillars) {
return ['重视感情', '专一忠诚', '慢热型'];
}
analyzePartnerCompatibility(fiveElements) {
return {
ideal_traits: ['温和', '理解', '支持'],
compatible_types: ['稳重型', '温柔型']
};
}
analyzeEmotionalNeeds(tenGods) {
return ['安全感', '理解支持', '共同成长'];
}
identifyRelationshipChallenges(chart) {
return ['表达不够直接', '过于理性', '缺乏浪漫'];
}
analyzeMarriageTiming(chart) {
return {
favorable_periods: ['25-30岁', '事业稳定后'],
considerations: ['感情基础', '经济条件']
};
}
generateRelationshipAdvice(chart) {
return ['增强情感表达', '培养浪漫情趣', '学会主动沟通'];
}
// 新增缺失的感情分析方法
analyzeRelationshipPattern(chart) {
return {
pattern_type: '稳重型',
relationship_approach: '慢热但专一',
emotional_expression: '内敛含蓄',
commitment_level: 'high',
relationship_values: ['忠诚', '理解', '共同成长']
};
}
analyzePartnerCharacteristics(chart) {
return {
ideal_partner_traits: ['温和', '理解', '支持', '有责任心'],
compatible_personality: ['稳重型', '温柔型', '理性型'],
partner_elements: ['土', '金'],
relationship_dynamics: '互补型',
long_term_compatibility: 'high'
};
}
getRelationshipChallenges(chart) {
return [
{
challenge: '情感表达不够直接',
impact: 'medium',
solution: '学会主动表达内心感受'
},
{
challenge: '过于理性化处理感情',
impact: 'medium',
solution: '培养感性思维和浪漫情趣'
}
];
}
getCompatibilityFactors(chart) {
return {
personality_compatibility: 85,
value_alignment: 90,
life_goal_match: 80,
communication_style: 75,
overall_compatibility: 82
};
}
getRelationshipAdvice(chart) {
return [
'主动表达关爱和欣赏',
'创造浪漫的相处时光',
'学会倾听和理解对方',
'在关键时刻给予支持',
'保持适度的独立空间'
];
}
// 辅助方法 - 健康分析相关
analyzeConstitutionType(fiveElements) {
return { type: '平和质', description: '体质较为均衡' };
}
analyzeHealthTendencies(fourPillars) {
return ['整体健康良好', '注意劳逸结合'];
}
identifyVulnerableAreas(fiveElements) {
return ['消化系统', '心血管系统'];
}
analyzeSeasonalHealthInfluences(chart) {
return {
spring: '精神饱满',
summer: '注意心火',
autumn: '润燥养肺',
winter: '温补肾阳'
};
}
generatePreventiveMeasures(chart) {
return ['规律作息', '适量运动', '均衡饮食'];
}
generateLifestyleRecommendations(chart) {
return ['保持心情愉悦', '避免过度劳累', '定期体检'];
}
// 新增缺失的健康分析方法
getVulnerableHealthAreas(chart) {
return [
{
area: '消化系统',
risk_level: 'medium',
symptoms: ['胃部不适', '消化不良'],
prevention: ['规律饮食', '避免暴饮暴食']
},
{
area: '心血管系统',
risk_level: 'low',
symptoms: ['心悸', '血压波动'],
prevention: ['适量运动', '控制情绪']
}
];
}
analyzeSeasonalHealth(chart) {
return {
spring: {
health_status: '精神饱满',
attention_points: ['肝气疏泄', '情绪调节'],
recommendations: ['多户外活动', '保持心情舒畅']
},
summer: {
health_status: '活力充沛',
attention_points: ['心火旺盛', '防暑降温'],
recommendations: ['清淡饮食', '避免过度劳累']
},
autumn: {
health_status: '需要滋润',
attention_points: ['肺燥咳嗽', '皮肤干燥'],
recommendations: ['润燥养肺', '多喝水']
},
winter: {
health_status: '需要温补',
attention_points: ['肾阳不足', '免疫力下降'],
recommendations: ['温补肾阳', '注意保暖']
}
};
}
getPreventiveMeasures(chart) {
return [
{
category: '日常保健',
measures: ['规律作息', '适量运动', '均衡饮食', '定期体检']
},
{
category: '情绪管理',
measures: ['保持乐观', '学会减压', '培养兴趣爱好']
},
{
category: '环境调节',
measures: ['保持室内通风', '避免污染环境', '注意季节变化']
}
];
}
getBeneficialActivities(chart) {
return [
{
activity: '太极拳',
benefits: ['调和气血', '强身健体', '修身养性'],
frequency: '每日30分钟'
},
{
activity: '散步',
benefits: ['促进消化', '放松心情', '增强体质'],
frequency: '饭后30分钟'
},
{
activity: '瑜伽',
benefits: ['柔韧性', '平衡感', '内心平静'],
frequency: '每周3-4次'
}
];
}
getDietarySuggestions(chart) {
return {
beneficial_foods: [
'温性食物:生姜、桂圆、红枣',
'健脾食物:山药、薏米、白扁豆',
'养血食物:红枣、桂圆、枸杞'
],
foods_to_avoid: [
'寒凉食物:冰饮、生冷瓜果',
'辛辣食物:辣椒、胡椒、芥末',
'油腻食物:肥肉、油炸食品'
],
eating_habits: [
'定时定量进餐',
'细嚼慢咽',
'饭后适当活动',
'睡前2小时不进食'
]
};
}
getHealthTiming(chart) {
return {
best_health_periods: [
{
period: '春季3-5月',
description: '肝气舒畅,精神状态最佳',
activities: ['户外运动', '春游踏青']
},
{
period: '秋季9-11月',
description: '肺气清爽,适合调养',
activities: ['登山', '深呼吸练习']
}
],
attention_periods: [
{
period: '夏季6-8月',
description: '心火旺盛,需要清热',
precautions: ['避免暴晒', '清淡饮食']
},
{
period: '冬季12-2月',
description: '肾气不足,需要温补',
precautions: ['注意保暖', '适当进补']
}
]
};
}
// 辅助方法 - 综合分析相关
generateOverallAssessment(chart) {
return {
overall_fortune: 'good',
life_quality: 'stable',
development_potential: 'high'
};
}
identifyLifeThemes(chart) {
return ['稳健发展', '重视关系', '追求平衡'];
}
analyzeMajorInfluences(chart) {
return {
positive_influences: ['家庭支持', '教育背景', '人际关系'],
challenging_influences: ['竞争压力', '变化适应', '决策犹豫']
};
}
analyzeLifeCycles(chart) {
return {
youth: '学习成长期',
adulthood: '事业发展期',
maturity: '收获稳定期'
};
}
analyzeDestinyPatterns(chart) {
return {
main_pattern: '稳健发展型',
secondary_patterns: ['人际和谐型', '学习成长型']
};
}
/**
* 计算神煞
* @param {Object} fourPillars - 四柱八字
* @returns {Object} 神煞信息
*/
calculateSpirits(fourPillars) {
const dayGan = fourPillars.day.heavenly_stem;
const dayZhi = fourPillars.day.earthly_branch;
const yearZhi = fourPillars.year.earthly_branch;
return {
noble_stars: this.calculator.getNobleStars(dayGan, [yearZhi, fourPillars.month.earthly_branch, dayZhi, fourPillars.hour.earthly_branch]),
peach_blossom: this.calculator.getPeachBlossom(dayZhi, [yearZhi, fourPillars.month.earthly_branch, fourPillars.hour.earthly_branch]),
academic_stars: this.calculator.getAcademicStars(dayGan, fourPillars),
wealth_stars: this.calculator.getWealthStars(dayGan, fourPillars),
power_stars: this.calculator.getPowerStars(dayGan, fourPillars),
travel_horse: this.calculator.getTravelHorse(dayZhi, fourPillars),
disaster_stars: this.calculator.getDisasterStars(dayGan, fourPillars)
};
}
/**
* 五行分析
* @param {Object} fourPillars - 四柱八字
* @returns {Object} 五行分析结果
*/
analyzeFiveElements(fourPillars) {
const elements = {
wood: 0, fire: 0, earth: 0, metal: 0, water: 0
};
// 统计天干地支五行
Object.values(fourPillars).forEach(pillar => {
const ganElement = this.calculator.getGanElement(pillar.heavenly_stem);
const zhiElement = this.calculator.getZhiElement(pillar.earthly_branch);
elements[ganElement]++;
elements[zhiElement]++;
// 地支藏干
const hiddenGans = this.calculator.getZhiHiddenGans(pillar.earthly_branch);
hiddenGans.forEach(gan => {
const element = this.calculator.getGanElement(gan.heavenly_stem);
elements[element] += gan.strength;
});
});
// 分析五行强弱
const total = Object.values(elements).reduce((sum, count) => sum + count, 0);
const percentages = {};
Object.keys(elements).forEach(element => {
percentages[element] = (elements[element] / total * 100).toFixed(1);
});
// 确定用神忌神
const dayMasterElement = fourPillars.day.element;
const analysis = this.calculator.analyzeFiveElementBalance(elements, dayMasterElement);
return {
counts: elements,
percentages: percentages,
day_master_element: dayMasterElement,
strongest_element: this.getStrongestElement(elements),
weakest_element: this.getWeakestElement(elements),
balance_analysis: analysis,
favorable_elements: analysis.favorable_elements,
unfavorable_elements: analysis.unfavorable_elements,
seasonal_influence: this.analyzeSeasonalInfluence(fourPillars.month.earthly_branch, dayMasterElement)
};
}
/**
* 十神分析
* @param {Object} fourPillars - 四柱八字
* @returns {Object} 十神分析结果
*/
analyzeTenGods(fourPillars) {
const dayGan = fourPillars.day.heavenly_stem;
const tenGods = {};
// 计算各柱的十神
Object.entries(fourPillars).forEach(([position, pillar]) => {
if (position !== 'day') {
const ganTenGod = this.calculator.getStemTenGod(dayGan, pillar.heavenly_stem);
const zhiTenGod = this.calculator.getStemTenGod(dayGan, this.calculator.getZhiMainGan(pillar.earthly_branch));
tenGods[position] = {
gan_ten_god: ganTenGod,
zhi_ten_god: zhiTenGod
};
}
});
// 统计十神分布
const distribution = this.calculator.getTenGodDistribution(tenGods);
// 分析十神特点
const characteristics = this.calculator.analyzeTenGodCharacteristics(distribution, dayGan);
return {
ten_gods_by_pillar: tenGods,
distribution: distribution,
characteristics: characteristics,
dominant_gods: this.getDominantTenGods(distribution),
personality_traits: this.getTenGodPersonalityTraits(distribution),
career_tendencies: this.getTenGodCareerTendencies(distribution)
};
}
/**
* 性格分析
* @param {Object} chart - 八字排盘
* @param {string} detailLevel - 详细程度
* @returns {Object} 性格分析结果
*/
async analyzePersonality(chart, detailLevel) {
const personality = {
core_traits: this.getCorePersonalityTraits(chart),
temperament: this.analyzeTemperament(chart),
thinking_style: this.analyzeThinkingStyle(chart),
emotional_patterns: this.analyzeEmotionalPatterns(chart),
social_tendencies: this.analyzeSocialTendencies(chart),
strengths: this.getPersonalityStrengths(chart),
weaknesses: this.getPersonalityWeaknesses(chart)
};
if (detailLevel === 'detailed') {
personality.detailed_analysis = {
five_element_influence: this.analyzeFiveElementPersonality(chart.five_elements),
ten_god_influence: this.analyzeTenGodPersonality(chart.ten_gods),
spirit_influence: this.analyzeSpiritPersonality(chart.spirits_and_stars),
seasonal_influence: this.analyzeSeasonalPersonality(chart.four_pillars.month.earthly_branch)
};
}
return personality;
}
/**
* 事业分析
* @param {Object} chart - 八字排盘
* @param {string} detailLevel - 详细程度
* @returns {Object} 事业分析结果
*/
async analyzeCareer(chart, detailLevel) {
return {
career_potential: this.analyzeCareerPotential(chart),
suitable_industries: this.getSuitableIndustries(chart),
leadership_ability: this.analyzeLeadershipAbility(chart),
work_style: this.analyzeWorkStyle(chart),
career_development: this.analyzeCareerDevelopment(chart),
success_factors: this.getCareerSuccessFactors(chart),
challenges: this.getCareerChallenges(chart),
optimal_timing: this.getCareerOptimalTiming(chart)
};
}
/**
* 分析事业潜力
* @param {Object} chart - 八字排盘
* @returns {Object} 事业潜力分析
*/
analyzeCareerPotential(chart) {
const dayMaster = chart.four_pillars?.day?.heavenly_stem;
const tenGods = chart.ten_gods || {};
// 检查ten_gods结构,兼容不同格式
const distribution = tenGods.distribution || {};
// 如果ten_gods是简单对象结构(如测试脚本中的样例),直接使用
const hasOfficial = (distribution.正官 > 0 || distribution.七杀 > 0 ||
tenGods.year === '正官' || tenGods.month === '正官' ||
tenGods.hour === '正官' || tenGods.year === '七杀' ||
tenGods.month === '七杀' || tenGods.hour === '七杀');
const hasCreativity = (distribution.食神 > 0 || distribution.伤官 > 0 ||
tenGods.year === '食神' || tenGods.month === '食神' ||
tenGods.hour === '食神' || tenGods.year === '伤官' ||
tenGods.month === '伤官' || tenGods.hour === '伤官');
const hasStability = (distribution.正印 > 0 || distribution.偏印 > 0 ||
tenGods.year === '正印' || tenGods.month === '正印' ||
tenGods.hour === '正印' || tenGods.year === '偏印' ||
tenGods.month === '偏印' || tenGods.hour === '偏印');
return {
leadership: hasOfficial ? '强' : '中等',
creativity: hasCreativity ? '强' : '中等',
stability: hasStability ? '强' : '中等',
adaptability: chart.chart_quality?.balance_score > 70 ? '强' : '中等'
};
}
/**
* 获取适合的行业
* @param {Object} chart - 八字排盘
* @returns {Array} 适合的行业列表
*/
getSuitableIndustries(chart) {
// 使用日主元素和强势元素来推荐行业
const dayMasterElement = chart.five_elements?.day_master_element || '水';
const strongestElement = chart.five_elements?.strongest_element || dayMasterElement;
const industries = [];
// 根据日主元素推荐行业
switch (dayMasterElement) {
case '金':
industries.push('金融', '机械', '汽车', '珠宝', '五金');
break;
case '木':
industries.push('教育', '文化', '出版', '纺织', '农林');
break;
case '水':
industries.push('贸易', '运输', '旅游', '渔业', '饮料');
break;
case '火':
industries.push('能源', '电子', '广告', '娱乐', '餐饮');
break;
case '土':
industries.push('房地产', '建筑', '农业', '陶瓷', '矿业');
break;
}
// 如果最强元素与日主不同,也添加相关行业
if (strongestElement !== dayMasterElement) {
switch (strongestElement) {
case '金':
industries.push('投资', '银行');
break;
case '木':
industries.push('媒体', '设计');
break;
case '水':
industries.push('物流', '外贸');
break;
case '火':
industries.push('科技', '传媒');
break;
case '土':
industries.push('制造', '工程');
break;
}
}
return [...new Set(industries)];
}
/**
* 分析领导能力
* @param {Object} chart - 八字排盘
* @returns {Object} 领导能力分析
*/
analyzeLeadershipAbility(chart) {
const tenGods = chart.ten_gods || {};
const distribution = tenGods.distribution || {};
// 兼容不同的ten_gods结构
const hasAuthority = (distribution.正官 > 0 || distribution.七杀 > 0 ||
tenGods.year === '正官' || tenGods.month === '正官' ||
tenGods.hour === '正官' || tenGods.year === '七杀' ||
tenGods.month === '七杀' || tenGods.hour === '七杀');
const hasWisdom = (distribution.正印 > 0 || distribution.偏印 > 0 ||
tenGods.year === '正印' || tenGods.month === '正印' ||
tenGods.hour === '正印' || tenGods.year === '偏印' ||
tenGods.month === '偏印' || tenGods.hour === '偏印');
const hasCreativity = (distribution.食神 > 0 ||
tenGods.year === '食神' || tenGods.month === '食神' ||
tenGods.hour === '食神');
return {
authority: hasAuthority ? '强' : '弱',
decision_making: hasWisdom ? '优秀' : '一般',
team_management: hasAuthority && hasWisdom ? '优秀' : '良好',
vision: hasCreativity ? '前瞻性强' : '务实型'
};
}
/**
* 分析工作风格
* @param {Object} chart - 八字排盘
* @returns {Object} 工作风格分析
*/
analyzeWorkStyle(chart) {
const tenGods = chart.ten_gods || {};
const distribution = tenGods.distribution || {};
// 兼容不同的ten_gods结构
const hasOfficial = (distribution.正官 > 0 ||
tenGods.year === '正官' || tenGods.month === '正官' ||
tenGods.hour === '正官');
const hasPeerSupport = (distribution.比肩 > 0 ||
tenGods.year === '比肩' || tenGods.month === '比肩' ||
tenGods.hour === '比肩');
const hasPrint = (distribution.正印 > 0 ||
tenGods.year === '正印' || tenGods.month === '正印' ||
tenGods.hour === '正印');
return {
approach: hasOfficial ? '稳健型' : '创新型',
pace: chart.chart_quality?.balance_score > 70 ? '稳定' : '快节奏',
collaboration: hasPeerSupport ? '团队合作' : '独立工作',
detail_focus: hasPrint ? '注重细节' : '关注大局'
};
}
/**
* 分析事业发展
* @param {Object} chart - 八字排盘
* @returns {Object} 事业发展分析
*/
analyzeCareerDevelopment(chart) {
return {
early_career: '基础建设期',
mid_career: '发展上升期',
late_career: '成熟稳定期',
peak_period: '40-50岁',
development_pattern: '稳步上升'
};
}
/**
* 获取事业成功因素
* @param {Object} chart - 八字排盘
* @returns {Array} 成功因素列表
*/
getCareerSuccessFactors(chart) {
return [
'专业技能提升',
'人际关系建设',
'机会把握能力',
'持续学习态度',
'团队协作精神'
];
}
/**
* 获取事业挑战
* @param {Object} chart - 八字排盘
* @returns {Array} 挑战列表
*/
getCareerChallenges(chart) {
return [
'竞争压力',
'技能更新',
'工作平衡',
'决策压力',
'变化适应'
];
}
/**
* 获取事业最佳时机
* @param {Object} chart - 八字排盘
* @returns {Object} 最佳时机分析
*/
getCareerOptimalTiming(chart) {
return {
promotion_timing: '春季和秋季',
job_change_timing: '夏季',
investment_timing: '冬季',
partnership_timing: '全年适宜'
};
}
/**
* 财运分析
* @param {Object} chart - 八字排盘
* @param {string} detailLevel - 详细程度
* @returns {Object} 财运分析结果
*/
async analyzeWealth(chart, detailLevel) {
return {
wealth_potential: this.analyzeWealthPotential(chart),
income_sources: this.analyzeIncomeSource(chart),
investment_style: this.analyzeInvestmentStyle(chart),
financial_management: this.analyzeFinancialManagement(chart),
wealth_accumulation: this.analyzeWealthAccumulation(chart),
risk_tolerance: this.analyzeRiskTolerance(chart),
favorable_periods: this.getWealthFavorablePeriods(chart),
caution_periods: this.getWealthCautionPeriods(chart)
};
}
/**
* 感情分析
* @param {Object} chart - 八字排盘
* @param {string} detailLevel - 详细程度
* @returns {Object} 感情分析结果
*/
async analyzeRelationship(chart, detailLevel) {
return {
relationship_pattern: this.analyzeRelationshipPattern(chart),
marriage_timing: this.analyzeMarriageTiming(chart),
partner_characteristics: this.analyzePartnerCharacteristics(chart),
relationship_challenges: this.getRelationshipChallenges(chart),
compatibility_factors: this.getCompatibilityFactors(chart),
emotional_needs: this.analyzeEmotionalNeeds(chart),
relationship_advice: this.getRelationshipAdvice(chart)
};
}
/**
* 健康分析
* @param {Object} chart - 八字排盘
* @param {string} detailLevel - 详细程度
* @returns {Object} 健康分析结果
*/
async analyzeHealth(chart, detailLevel) {
return {
constitution_type: this.analyzeConstitutionType(chart),
health_tendencies: this.analyzeHealthTendencies(chart),
vulnerable_areas: this.getVulnerableHealthAreas(chart),
seasonal_health: this.analyzeSeasonalHealth(chart),
preventive_measures: this.getPreventiveMeasures(chart),
beneficial_activities: this.getBeneficialActivities(chart),
dietary_suggestions: this.getDietarySuggestions(chart),
health_timing: this.getHealthTiming(chart)
};
}
/**
* 综合分析
* @param {Object} chart - 八字排盘
* @param {Array} focusAreas - 关注领域
* @param {string} detailLevel - 详细程度
* @returns {Object} 综合分析结果
*/
/**
* 获取人生概览
* @param {Object} chart - 八字排盘
* @returns {Object} 人生概览
*/
getLifeOverview(chart) {
const dayMaster = chart.four_pillars.day.heavenly_stem;
const dayBranch = chart.four_pillars.day.earthly_branch;
return {
life_stage: '成长期',
core_characteristics: ['聪明好学', '积极向上', '富有创造力'],
life_direction: '学业为重,全面发展',
key_strengths: ['学习能力强', '适应性好', '人际关系佳'],
development_areas: ['需要更多实践经验', '培养专业技能']
};
}
/**
* 获取主要人生主题
* @param {Object} chart - 八字排盘
* @returns {Array} 人生主题
*/
getMajorLifeThemes(chart) {
return [
{
theme: '学业成就',
description: '在学习和知识获取方面有天赋',
influence_period: '青少年时期'
},
{
theme: '人际关系',
description: '善于与人交往,容易获得他人帮助',
influence_period: '整个人生'
},
{
theme: '创新发展',
description: '具有创新思维,适合新兴领域发展',
influence_period: '成年后'
}
];
}
/**
* 分析人生周期
* @param {Object} chart - 八字排盘
* @returns {Object} 人生周期分析
*/
analyzeLifeCycles(chart) {
return {
current_cycle: {
name: '学习成长期',
age_range: '0-25岁',
characteristics: ['求学阶段', '基础建立', '性格形成'],
focus: '学业和个人发展'
},
upcoming_cycles: [
{
name: '事业建立期',
age_range: '25-40岁',
characteristics: ['职业发展', '技能积累', '社会地位建立'],
focus: '事业发展和财富积累'
},
{
name: '成熟稳定期',
age_range: '40-60岁',
characteristics: ['经验丰富', '地位稳固', '影响力扩大'],
focus: '领导力和社会贡献'
}
]
};
}
/**
* 识别人生转折点
* @param {Object} chart - 八字排盘
* @returns {Array} 转折点
*/
identifyTurningPoints(chart) {
return [
{
age: 18,
description: '高中毕业,面临重要的升学或职业选择',
significance: 'high',
advice: '慎重选择专业方向,为未来发展奠定基础'
},
{
age: 25,
description: '大学毕业,正式步入社会',
significance: 'high',
advice: '积极适应职场环境,建立专业技能'
},
{
age: 30,
description: '事业初步稳定,考虑人生重大决策',
significance: 'medium',
advice: '平衡事业与生活,做好长远规划'
}
];
}
/**
* 分析整体运势
* @param {Object} chart - 八字排盘
* @returns {Object} 整体运势
*/
analyzeOverallFortune(chart) {
return {
overall_rating: 75,
fortune_trend: 'ascending',
peak_periods: ['25-35岁', '45-55岁'],
challenging_periods: ['35-40岁'],
life_fortune_summary: '整体运势良好,早年求学顺利,中年事业有成,晚年安享天伦',
key_recommendations: [
'把握学习机会,打好基础',
'注重人际关系的建立和维护',
'在适当时机勇于创新和突破'
]
};
}
async analyzeComprehensive(chart, focusAreas, detailLevel) {
const comprehensive = {
life_overview: this.getLifeOverview(chart),
major_life_themes: this.getMajorLifeThemes(chart),
life_cycles: this.analyzeLifeCycles(chart),
turning_points: this.identifyTurningPoints(chart),
overall_fortune: this.analyzeOverallFortune(chart)
};
// 根据关注领域添加特定分析
if (focusAreas.includes('personality')) {
comprehensive.personality = await this.analyzePersonality(chart, 'brief');
}
if (focusAreas.includes('career')) {
comprehensive.career = await this.analyzeCareer(chart, 'brief');
}
if (focusAreas.includes('wealth')) {
comprehensive.wealth = await this.analyzeWealth(chart, 'brief');
}
if (focusAreas.includes('relationship')) {
comprehensive.relationship = await this.analyzeRelationship(chart, 'brief');
}
if (focusAreas.includes('health')) {
comprehensive.health = await this.analyzeHealth(chart, 'brief');
}
return comprehensive;
}
// 运势预测方法
/**
* 计算月运
* @param {Object} chart - 八字排盘
* @param {Object} targetDate - 目标日期
* @returns {Object} 月运信息
*/
calculateMonthLuck(chart, targetDate) {
const year = targetDate.year();
const month = targetDate.month() + 1;
// 获取流年和流月干支
const yearGanZhi = this.calculator.getYearGanZhi(year);
const monthGanZhi = this.calculator.getMonthGanZhi(year, month);
// 分析与日主的关系
const dayMaster = chart.four_pillars.day.gan;
const monthInfluence = this.analyzeMonthInfluence(dayMaster, monthGanZhi);
return {
overall: monthInfluence.overall_score,
key_events: monthInfluence.key_events,
advice: monthInfluence.advice,
gan_zhi: monthGanZhi,
influence_type: monthInfluence.type
};
}
/**
* 分析月份影响
* @param {string} dayMaster - 日主
* @param {string} monthGanZhi - 月干支
* @returns {Object} 月份影响分析
*/
analyzeMonthInfluence(dayMaster, monthGanZhi) {
const monthGan = monthGanZhi.charAt(0);
const monthZhi = monthGanZhi.charAt(1);
// 简化的影响分析
const influence = {
overall_score: Math.floor(Math.random() * 40) + 60, // 60-100分
type: '平稳',
key_events: ['工作顺利', '人际和谐'],
advice: '保持现状,稳步前进'
};
// 根据天干关系调整
if (dayMaster === monthGan) {
influence.overall_score += 10;
influence.type = '有利';
influence.key_events.push('得到帮助');
}
return influence;
}
/**
* 分析月度各方面运势
* @param {Object} chart - 八字排盘
* @param {Object} monthLuck - 月运势
* @param {Array} focusAspects - 关注方面
* @returns {Object} 月度各方面分析
*/
analyzeMonthlyAspects(chart, monthLuck, focusAspects) {
const aspects = {};
focusAspects.forEach(aspect => {
aspects[aspect] = this.generateAspectForecast(chart, aspect, 'monthly');
});
return aspects;
}
/**
* 总结月度预测
* @param {Array} monthlyForecast - 月度预测数组
* @returns {Object} 月度预测总结
*/
summarizeMonthlyForecast(monthlyForecast) {
const avgLuck = monthlyForecast.reduce((sum, month) => sum + month.overall_luck, 0) / monthlyForecast.length;
return {
average_luck: Math.round(avgLuck),
best_months: monthlyForecast.filter(m => m.overall_luck >= 80).map(m => m.month),
challenging_months: monthlyForecast.filter(m => m.overall_luck < 70).map(m => m.month),
overall_trend: avgLuck >= 75 ? 'positive' : avgLuck >= 65 ? 'stable' : 'challenging'
};
}
async forecastMonthly(chart, currentDate, focusAspects) {
const monthlyForecast = [];
for (let i = 0; i < 12; i++) {
const targetDate = currentDate.clone().add(i, 'months');
const monthLuck = this.calculateMonthLuck(chart, targetDate);
monthlyForecast.push({
month: targetDate.format('YYYY-MM'),
overall_luck: monthLuck.overall,
specific_aspects: this.analyzeMonthlyAspects(chart, monthLuck, focusAspects),
key_events: monthLuck.key_events,
advice: monthLuck.advice
});
}
return {
type: 'monthly',
periods: monthlyForecast,
summary: this.summarizeMonthlyForecast(monthlyForecast)
};
}
/**
* 计算年运势
* @param {Object} chart - 八字排盘
* @param {number} targetYear - 目标年份
* @returns {Object} 年运势分析
*/
calculateYearLuck(chart, targetYear) {
const yearGanZhi = this.calculator.getYearGanZhi(targetYear);
const dayMaster = chart.four_pillars.day.gan;
// 简化的年运势分析
const yearInfluence = {
overall: Math.floor(Math.random() * 40) + 60, // 60-100分
major_themes: ['事业发展', '人际关系'],
opportunities: ['新的合作机会', '技能提升'],
challenges: ['竞争加剧', '决策压力'],
advice: '把握机遇,稳步前进'
};
return yearInfluence;
}
/**
* 分析年度各方面运势
* @param {Object} chart - 八字排盘
* @param {Object} yearLuck - 年运势
* @param {Array} focusAspects - 关注方面
* @returns {Object} 年度各方面分析
*/
analyzeYearlyAspects(chart, yearLuck, focusAspects) {
const aspects = {};
focusAspects.forEach(aspect => {
aspects[aspect] = this.generateAspectForecast(chart, aspect, 'yearly');
});
return aspects;
}
/**
* 总结年度预测
* @param {Array} yearlyForecast - 年度预测数组
* @returns {Object} 年度预测总结
*/
summarizeYearlyForecast(yearlyForecast) {
const avgLuck = yearlyForecast.reduce((sum, year) => sum + year.overall_luck, 0) / yearlyForecast.length;
return {
average_luck: Math.round(avgLuck),
best_years: yearlyForecast.filter(y => y.overall_luck >= 80).map(y => y.year),
challenging_years: yearlyForecast.filter(y => y.overall_luck < 70).map(y => y.year),
overall_trend: avgLuck >= 75 ? 'positive' : avgLuck >= 65 ? 'stable' : 'challenging',
peak_period: yearlyForecast.reduce((max, year) => year.overall_luck > max.overall_luck ? year : max).year
};
}
async forecastYearly(chart, currentDate, focusAspects) {
const yearlyForecast = [];
for (let i = 0; i < 10; i++) {
const targetYear = currentDate.year() + i;
const yearLuck = this.calculateYearLuck(chart, targetYear);
yearlyForecast.push({
year: targetYear,
overall_luck: yearLuck.overall,
specific_aspects: this.analyzeYearlyAspects(chart, yearLuck, focusAspects),
major_themes: yearLuck.major_themes,
opportunities: yearLuck.opportunities,
challenges: yearLuck.challenges,
advice: yearLuck.advice
});
}
return {
type: 'yearly',
periods: yearlyForecast,
summary: this.summarizeYearlyForecast(yearlyForecast)
};
}
calculateAge(birthDatetime, currentDate = new Date()) {
const birth = moment(birthDatetime);
const current = moment(currentDate);
return current.diff(birth, 'years');
}
calculateDecadeLuck(chart, period) {
// 简化的大运分析
const baseScore = 75;
const variation = Math.floor(Math.random() * 20) - 10; // -10 to +10
return {
overall: Math.max(0, Math.min(100, baseScore + variation)),
life_themes: ['稳定发展', '积累经验', '建立基础'],
development_focus: ['专业技能提升', '人际关系建设', '财富积累'],
major_opportunities: ['职业发展机会', '投资理财机会', '学习进修机会'],
potential_challenges: ['竞争压力', '健康关注', '家庭责任'],
strategic_advice: ['保持稳健发展', '抓住关键机遇', '平衡各方面发展']
};
}
summarizeDecadeForecast(decadeForecast) {
const avgLuck = decadeForecast.reduce((sum, period) => sum + period.overall_luck, 0) / decadeForecast.length;
return {
average_luck: Math.round(avgLuck),
best_periods: decadeForecast.filter(p => p.overall_luck >= 80).map(p => p.period),
challenging_periods: decadeForecast.filter(p => p.overall_luck < 70).map(p => p.period),
overall_trend: avgLuck >= 75 ? 'positive' : avgLuck >= 65 ? 'stable' : 'challenging',
key_development_phases: decadeForecast.map(p => p.period)
};
}
async forecastDecade(chart, currentDate, focusAspects) {
const decadeForecast = [];
const currentAge = this.calculateAge(chart.birth_info.solar_datetime, currentDate);
// 分析大运周期
const majorLuckPeriods = chart.major_luck.periods.filter(period =>
period.start_age <= currentAge + 50 && period.end_age >= currentAge
);
majorLuckPeriods.forEach(period => {
const periodLuck = this.calculateDecadeLuck(chart, period);
decadeForecast.push({
period: `${period.start_age}-${period.end_age}岁`,
gan_zhi: period.gan_zhi,
overall_luck: periodLuck.overall,
life_themes: periodLuck.life_themes,
development_focus: periodLuck.development_focus,
major_opportunities: periodLuck.major_opportunities,
potential_challenges: periodLuck.potential_challenges,
strategic_advice: periodLuck.strategic_advice
});
});
return {
type: 'decade',
periods: decadeForecast,
summary: this.summarizeDecadeForecast(decadeForecast)
};
}
async forecastCustomPeriod(chart, startDate, endDate, focusAspects) {
const start = moment(startDate);
const end = moment(endDate);
const duration = end.diff(start, 'days');
if (duration <= 365) {
// 短期预测(按月)
return this.forecastShortTerm(chart, start, end, focusAspects);
} else {
// 长期预测(按年)
return this.forecastLongTerm(chart, start, end, focusAspects);
}
}
async forecastShortTerm(chart, startDate, endDate, focusAspects) {
const forecast = {
type: 'short_term',
period: `${startDate.format('YYYY-MM-DD')} 至 ${endDate.format('YYYY-MM-DD')}`,
duration_days: endDate.diff(startDate, 'days'),
aspects: {}
};
// 为每个关注方面生成预测
focusAspects.forEach(aspect => {
forecast.aspects[aspect] = this.generateAspectForecast(chart, aspect, 'short_term');
});
return forecast;
}
async forecastLongTerm(chart, startDate, endDate, focusAspects) {
const forecast = {
type: 'long_term',
period: `${startDate.format('YYYY-MM-DD')} 至 ${endDate.format('YYYY-MM-DD')}`,
duration_years: endDate.diff(startDate, 'years'),
aspects: {}
};
// 为每个关注方面生成预测
focusAspects.forEach(aspect => {
forecast.aspects[aspect] = this.generateAspectForecast(chart, aspect, 'long_term');
});
return forecast;
}
generateAspectForecast(chart, aspect, timeframe) {
const baseForecasts = {
overall: {
trend: 'stable',
score: 75,
description: '整体运势平稳,适合稳步发展',
key_periods: ['月中', '月末'],
advice: '保持现状,稳中求进'
},
study: {
trend: 'improving',
score: 80,
description: '学习运势良好,适合深入学习',
key_periods: ['上旬', '中旬'],
advice: '专注学习,提升技能'
},
career: {
trend: 'stable',
score: 70,
description: '事业运势稳定,有小幅提升',
key_periods: ['月初', '月末'],
advice: '踏实工作,积累经验'
},
health: {
trend: 'stable',
score: 85,
description: '健康状况良好,注意作息',
key_periods: ['全月'],
advice: '保持规律作息,适量运动'
}
};
return baseForecasts[aspect] || baseForecasts.overall;
}
// 辅助方法(简化实现)
evaluateChartQuality(fourPillars, fiveElementsAnalysis) {
return {
overall_score: 75,
balance_score: 80,
strength_score: 70,
special_patterns: [],
notable_features: ['五行较为平衡', '日主有根']
};
}
analyzeBasicPersonality(fourPillars, fiveElementsAnalysis) {
return {
primary_traits: ['稳重', '务实', '有责任心'],
secondary_traits: ['细心', '谨慎', '重感情'],
temperament: '温和型',
energy_level: '中等',
social_style: '内向偏外向'
};
}
getStrongestElement(elements) {
return Object.keys(elements).reduce((a, b) => elements[a] > elements[b] ? a : b);
}
getWeakestElement(elements) {
return Object.keys(elements).reduce((a, b) => elements[a] < elements[b] ? a : b);
}
analyzeSeasonalInfluence(monthZhi, dayMasterElement) {
return {
season: this.calculator.getSeasonFromZhi(monthZhi),
influence: '有利',
explanation: '当季对日主有生扶作用'
};
}
getDominantTenGods(distribution) {
return Object.keys(distribution)
.sort((a, b) => distribution[b] - distribution[a])
.slice(0, 3);
}
getTenGodPersonalityTraits(distribution) {
return ['理性思维', '重视实际', '有组织能力'];
}
getTenGodCareerTendencies(distribution) {
return ['管理类', '技术类', '服务类'];
}
identifyStrengths(chart, analysis) {
return ['五行平衡', '性格稳定', '适应能力强'];
}
identifyChallenges(chart, analysis) {
return ['需要增强自信', '避免过于保守', '提高决断力'];
}
generateRecommendations(chart, analysis, analysisType) {
return {
immediate_actions: ['保持现状', '稳步发展'],
long_term_goals: ['提升专业技能', '扩大人际网络'],
things_to_avoid: ['冒险投资', '频繁变动'],
favorable_directions: ['东方', '南方'],
lucky_colors: ['绿色', '红色'],
lucky_numbers: [3, 8, 9]
};
}
identifyKeyPeriods(chart, forecast) {
return [
{
period: '2024年春季',
significance: '事业发展关键期',
advice: '把握机会,积极行动'
}
];
}
analyzeOverallTrend(forecast) {
return {
direction: 'upward',
stability: 'stable',
key_themes: ['稳步发展', '机会增多', '人际和谐']
};
}
generateActionableAdvice(forecast, focusAspects) {
return {
short_term: ['专注当前工作', '维护人际关系'],
medium_term: ['规划职业发展', '提升个人能力'],
long_term: ['建立长期目标', '积累资源和经验']
};
}
calculateEndDate(startDate, periodType) {
switch (periodType) {
case 'monthly':
return startDate.clone().add(12, 'months').format('YYYY-MM-DD');
case 'yearly':
return startDate.clone().add(10, 'years').format('YYYY-MM-DD');
case 'decade':
return startDate.clone().add(50, 'years').format('YYYY-MM-DD');
default:
return startDate.clone().add(1, 'year').format('YYYY-MM-DD');
}
}
calculateAge(birthDatetime, currentDate) {
const birth = moment(birthDatetime);
return currentDate.diff(birth, 'years');
}
// 更多辅助方法的简化实现...
getCorePersonalityTraits(chart) {
return ['稳重', '理性', '有责任心', '重感情'];
}
analyzeTemperament(chart) {
return {
type: '温和型',
characteristics: ['情绪稳定', '不易冲动', '善于思考'],
stress_response: '倾向于内化压力,需要适当释放'
};
}
analyzeThinkingStyle(chart) {
return {
primary_style: '逻辑思维',
secondary_style: '直觉思维',
decision_making: '谨慎型',
learning_preference: '系统性学习'
};
}
analyzeEmotionalPatterns(chart) {
return {
emotional_stability: 'high',
expression_style: 'reserved',
empathy_level: 'high',
emotional_needs: ['安全感', '被理解', '稳定关系']
};
}
analyzeSocialTendencies(chart) {
return {
social_style: '选择性社交',
communication_style: '深度交流',
leadership_style: '服务型领导',
team_role: '协调者'
};
}
getPersonalityStrengths(chart) {
return ['可靠性强', '执行力好', '人际和谐', '学习能力强'];
}
getPersonalityWeaknesses(chart) {
return ['过于谨慎', '缺乏冒险精神', '决策较慢', '容易自我怀疑'];
}
}
module.exports = BaziEngine;