Files
suanming/server/services/generators/markdownGenerator.cjs
patdelphi 0f3e1f406f feat: 完整实现奇门遁甲功能并优化显示效果
主要功能实现:
- 新增奇门遁甲分析完整功能模块
- 实现奇门盘可视化展示
- 添加用神分析、格局识别、预测结果等核心功能
- 集成AI解读和PDF导出功能
- 扩展历史记录支持奇门遁甲类型

显示优化:
- 修复时机评估[object Object]显示问题
- 优化时机评估显示为简洁格式
- 完善英文字段中文化映射
- 移除重复的成功概率显示
- 统一数值显示格式(小数转整数)

技术改进:
- 扩展类型定义支持奇门遁甲
- 完善API接口和路由
- 优化错误处理和用户体验
- 统一前后端字段映射机制
2025-08-25 21:56:31 +08:00

2751 lines
112 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* Markdown格式生成器
* 将分析结果转换为结构化的Markdown文档
*/
const generateMarkdown = async (analysisData, analysisType, userName) => {
try {
let markdown = '';
// 根据分析类型生成不同的Markdown内容
switch (analysisType) {
case 'bazi':
markdown = generateBaziMarkdown(analysisData, userName);
break;
case 'ziwei':
markdown = generateZiweiMarkdown(analysisData, userName);
break;
case 'yijing':
markdown = generateYijingMarkdown(analysisData, userName);
break;
case 'qimen':
markdown = generateQimenMarkdown(analysisData, userName);
break;
default:
throw new Error(`不支持的分析类型: ${analysisType}`);
}
return Buffer.from(markdown, 'utf8');
} catch (error) {
console.error('生成Markdown失败:', error);
throw error;
}
};
/**
* 生成八字命理Markdown文档
*/
const generateBaziMarkdown = (analysisData, userName) => {
const timestamp = new Date().toLocaleString('zh-CN');
let markdown = `# 八字命理分析报告\n\n`;
markdown += `**姓名:** ${userName || '用户'}\n`;
markdown += `**生成时间:** ${timestamp}\n`;
markdown += `**分析类型:** 八字命理\n\n`;
markdown += `---\n\n`;
// 基本信息
if (analysisData.basic_info) {
markdown += `## 📋 基本信息\n\n`;
if (analysisData.basic_info.personal_data) {
const personal = analysisData.basic_info.personal_data;
markdown += `- **姓名:** ${personal.name || '未提供'}\n`;
markdown += `- **性别:** ${personal.gender === 'male' ? '男' : personal.gender === 'female' ? '女' : personal.gender || '未提供'}\n`;
markdown += `- **出生日期:** ${personal.birth_date || '未提供'}\n`;
markdown += `- **出生时间:** ${personal.birth_time || '未提供'}\n`;
if (personal.birth_place) {
markdown += `- **出生地点:** ${personal.birth_place}\n`;
}
}
// 八字信息
if (analysisData.basic_info.bazi_chart) {
const bazi = analysisData.basic_info.bazi_chart;
markdown += `\n### 🔮 八字信息\n\n`;
markdown += `| 柱位 | 天干 | 地支 | 纳音 |\n`;
markdown += `|------|------|------|------|\n`;
// 处理年柱
let yearGan = '-', yearZhi = '-', yearNayin = '-';
if (bazi.year_pillar) {
if (typeof bazi.year_pillar === 'string' && bazi.year_pillar.length >= 2) {
yearGan = bazi.year_pillar[0];
yearZhi = bazi.year_pillar[1];
} else if (typeof bazi.year_pillar === 'object') {
yearGan = bazi.year_pillar.gan || bazi.year_pillar.tiangan || '-';
yearZhi = bazi.year_pillar.zhi || bazi.year_pillar.dizhi || '-';
}
yearNayin = bazi.year_nayin || bazi.year_pillar?.nayin || '-';
}
// 如果从bazi_chart中无法获取尝试从四柱解释中提取
if (yearGan === '-' && analysisData.basic_info.pillar_interpretations) {
const pillars = analysisData.basic_info.pillar_interpretations;
if (pillars.year_pillar) {
const yearText = pillars.year_pillar.interpretation || pillars.year_pillar;
const yearMatch = yearText.match(/年柱([甲乙丙丁戊己庚辛壬癸])([子丑寅卯辰巳午未申酉戌亥])/);
if (yearMatch) {
yearGan = yearMatch[1];
yearZhi = yearMatch[2];
}
// 提取纳音信息 - 扩展匹配模式
if (yearNayin === '-') {
// 尝试多种纳音匹配模式
let nayinMatch = yearText.match(/纳音[:]?([^,。\n]+)/);
if (!nayinMatch) {
// 尝试匹配常见纳音名称
nayinMatch = yearText.match(/(海中金|炉中火|大林木|路旁土|剑锋金|山头火|涧下水|城头土|白蜡金|杨柳木|泉中水|屋上土|霹雳火|松柏木|长流水|沙中金|山下火|平地木|壁上土|金箔金|覆灯火|天河水|大驿土|钗钏金|桑柘木|大溪水|沙中土|天上火|石榴木|大海水)/);
}
if (nayinMatch) {
yearNayin = nayinMatch[1].trim();
} else {
// 根据干支推算纳音
const ganZhi = `${yearGan}${yearZhi}`;
const nayinMap = {
'甲子': '海中金', '乙丑': '海中金', '丙寅': '炉中火', '丁卯': '炉中火',
'戊辰': '大林木', '己巳': '大林木', '庚午': '路旁土', '辛未': '路旁土',
'壬申': '剑锋金', '癸酉': '剑锋金', '甲戌': '山头火', '乙亥': '山头火',
'丙子': '涧下水', '丁丑': '涧下水', '戊寅': '城头土', '己卯': '城头土',
'庚辰': '白蜡金', '辛巳': '白蜡金', '壬午': '杨柳木', '癸未': '杨柳木',
'甲申': '泉中水', '乙酉': '泉中水', '丙戌': '屋上土', '丁亥': '屋上土',
'戊子': '霹雳火', '己丑': '霹雳火', '庚寅': '松柏木', '辛卯': '松柏木',
'壬辰': '长流水', '癸巳': '长流水', '甲午': '沙中金', '乙未': '沙中金',
'丙申': '山下火', '丁酉': '山下火', '戊戌': '平地木', '己亥': '平地木',
'庚子': '壁上土', '辛丑': '壁上土', '壬寅': '金箔金', '癸卯': '金箔金',
'甲辰': '覆灯火', '乙巳': '覆灯火', '丙午': '天河水', '丁未': '天河水',
'戊申': '大驿土', '己酉': '大驿土', '庚戌': '钗钏金', '辛亥': '钗钏金',
'壬子': '桑柘木', '癸丑': '桑柘木', '甲寅': '大溪水', '乙卯': '大溪水',
'丙辰': '沙中土', '丁巳': '沙中土', '戊午': '天上火', '己未': '天上火',
'庚申': '石榴木', '辛酉': '石榴木', '壬戌': '大海水', '癸亥': '大海水'
};
if (nayinMap[ganZhi]) {
yearNayin = nayinMap[ganZhi];
}
}
}
}
}
markdown += `| 年柱 | ${yearGan} | ${yearZhi} | ${yearNayin} |\n`;
// 处理月柱
let monthGan = '-', monthZhi = '-', monthNayin = '-';
if (bazi.month_pillar) {
if (typeof bazi.month_pillar === 'string' && bazi.month_pillar.length >= 2) {
monthGan = bazi.month_pillar[0];
monthZhi = bazi.month_pillar[1];
} else if (typeof bazi.month_pillar === 'object') {
monthGan = bazi.month_pillar.gan || bazi.month_pillar.tiangan || '-';
monthZhi = bazi.month_pillar.zhi || bazi.month_pillar.dizhi || '-';
}
monthNayin = bazi.month_nayin || bazi.month_pillar?.nayin || '-';
}
// 如果从bazi_chart中无法获取尝试从四柱解释中提取
if (monthGan === '-' && analysisData.basic_info.pillar_interpretations) {
const pillars = analysisData.basic_info.pillar_interpretations;
if (pillars.month_pillar) {
const monthText = pillars.month_pillar.interpretation || pillars.month_pillar;
const monthMatch = monthText.match(/月柱([甲乙丙丁戊己庚辛壬癸])([子丑寅卯辰巳午未申酉戌亥])/);
if (monthMatch) {
monthGan = monthMatch[1];
monthZhi = monthMatch[2];
}
// 提取纳音信息 - 扩展匹配模式
if (monthNayin === '-') {
// 尝试多种纳音匹配模式
let nayinMatch = monthText.match(/纳音[:]?([^,。\n]+)/);
if (!nayinMatch) {
nayinMatch = monthText.match(/(海中金|炉中火|大林木|路旁土|剑锋金|山头火|涧下水|城头土|白蜡金|杨柳木|泉中水|屋上土|霹雳火|松柏木|长流水|沙中金|山下火|平地木|壁上土|金箔金|覆灯火|天河水|大驿土|钗钏金|桑柘木|大溪水|沙中土|天上火|石榴木|大海水)/);
}
if (nayinMatch) {
monthNayin = nayinMatch[1].trim();
} else {
// 根据干支推算纳音
const ganZhi = `${monthGan}${monthZhi}`;
const nayinMap = {
'甲子': '海中金', '乙丑': '海中金', '丙寅': '炉中火', '丁卯': '炉中火',
'戊辰': '大林木', '己巳': '大林木', '庚午': '路旁土', '辛未': '路旁土',
'壬申': '剑锋金', '癸酉': '剑锋金', '甲戌': '山头火', '乙亥': '山头火',
'丙子': '涧下水', '丁丑': '涧下水', '戊寅': '城头土', '己卯': '城头土',
'庚辰': '白蜡金', '辛巳': '白蜡金', '壬午': '杨柳木', '癸未': '杨柳木',
'甲申': '泉中水', '乙酉': '泉中水', '丙戌': '屋上土', '丁亥': '屋上土',
'戊子': '霹雳火', '己丑': '霹雳火', '庚寅': '松柏木', '辛卯': '松柏木',
'壬辰': '长流水', '癸巳': '长流水', '甲午': '沙中金', '乙未': '沙中金',
'丙申': '山下火', '丁酉': '山下火', '戊戌': '平地木', '己亥': '平地木',
'庚子': '壁上土', '辛丑': '壁上土', '壬寅': '金箔金', '癸卯': '金箔金',
'甲辰': '覆灯火', '乙巳': '覆灯火', '丙午': '天河水', '丁未': '天河水',
'戊申': '大驿土', '己酉': '大驿土', '庚戌': '钗钏金', '辛亥': '钗钏金',
'壬子': '桑柘木', '癸丑': '桑柘木', '甲寅': '大溪水', '乙卯': '大溪水',
'丙辰': '沙中土', '丁巳': '沙中土', '戊午': '天上火', '己未': '天上火',
'庚申': '石榴木', '辛酉': '石榴木', '壬戌': '大海水', '癸亥': '大海水'
};
if (nayinMap[ganZhi]) {
monthNayin = nayinMap[ganZhi];
}
}
}
}
}
markdown += `| 月柱 | ${monthGan} | ${monthZhi} | ${monthNayin} |\n`;
// 处理日柱
let dayGan = '-', dayZhi = '-', dayNayin = '-';
if (bazi.day_pillar) {
if (typeof bazi.day_pillar === 'string' && bazi.day_pillar.length >= 2) {
dayGan = bazi.day_pillar[0];
dayZhi = bazi.day_pillar[1];
} else if (typeof bazi.day_pillar === 'object') {
dayGan = bazi.day_pillar.gan || bazi.day_pillar.tiangan || '-';
dayZhi = bazi.day_pillar.zhi || bazi.day_pillar.dizhi || '-';
}
dayNayin = bazi.day_nayin || bazi.day_pillar?.nayin || '-';
}
// 如果从bazi_chart中无法获取尝试从四柱解释中提取
if (dayGan === '-' && analysisData.basic_info.pillar_interpretations) {
const pillars = analysisData.basic_info.pillar_interpretations;
if (pillars.day_pillar) {
const dayText = pillars.day_pillar.interpretation || pillars.day_pillar;
const dayMatch = dayText.match(/日柱([甲乙丙丁戊己庚辛壬癸])([子丑寅卯辰巳午未申酉戌亥])/);
if (dayMatch) {
dayGan = dayMatch[1];
dayZhi = dayMatch[2];
}
// 提取纳音信息 - 扩展匹配模式
if (dayNayin === '-') {
// 尝试多种纳音匹配模式
let nayinMatch = dayText.match(/纳音[:]?([^,。\n]+)/);
if (!nayinMatch) {
nayinMatch = dayText.match(/(海中金|炉中火|大林木|路旁土|剑锋金|山头火|涧下水|城头土|白蜡金|杨柳木|泉中水|屋上土|霹雳火|松柏木|长流水|沙中金|山下火|平地木|壁上土|金箔金|覆灯火|天河水|大驿土|钗钏金|桑柘木|大溪水|沙中土|天上火|石榴木|大海水)/);
}
if (nayinMatch) {
dayNayin = nayinMatch[1].trim();
} else {
// 根据干支推算纳音
const ganZhi = `${dayGan}${dayZhi}`;
const nayinMap = {
'甲子': '海中金', '乙丑': '海中金', '丙寅': '炉中火', '丁卯': '炉中火',
'戊辰': '大林木', '己巳': '大林木', '庚午': '路旁土', '辛未': '路旁土',
'壬申': '剑锋金', '癸酉': '剑锋金', '甲戌': '山头火', '乙亥': '山头火',
'丙子': '涧下水', '丁丑': '涧下水', '戊寅': '城头土', '己卯': '城头土',
'庚辰': '白蜡金', '辛巳': '白蜡金', '壬午': '杨柳木', '癸未': '杨柳木',
'甲申': '泉中水', '乙酉': '泉中水', '丙戌': '屋上土', '丁亥': '屋上土',
'戊子': '霹雳火', '己丑': '霹雳火', '庚寅': '松柏木', '辛卯': '松柏木',
'壬辰': '长流水', '癸巳': '长流水', '甲午': '沙中金', '乙未': '沙中金',
'丙申': '山下火', '丁酉': '山下火', '戊戌': '平地木', '己亥': '平地木',
'庚子': '壁上土', '辛丑': '壁上土', '壬寅': '金箔金', '癸卯': '金箔金',
'甲辰': '覆灯火', '乙巳': '覆灯火', '丙午': '天河水', '丁未': '天河水',
'戊申': '大驿土', '己酉': '大驿土', '庚戌': '钗钏金', '辛亥': '钗钏金',
'壬子': '桑柘木', '癸丑': '桑柘木', '甲寅': '大溪水', '乙卯': '大溪水',
'丙辰': '沙中土', '丁巳': '沙中土', '戊午': '天上火', '己未': '天上火',
'庚申': '石榴木', '辛酉': '石榴木', '壬戌': '大海水', '癸亥': '大海水'
};
if (nayinMap[ganZhi]) {
dayNayin = nayinMap[ganZhi];
}
}
}
}
}
markdown += `| 日柱 | ${dayGan} | ${dayZhi} | ${dayNayin} |\n`;
// 处理时柱
let hourGan = '-', hourZhi = '-', hourNayin = '-';
if (bazi.hour_pillar) {
if (typeof bazi.hour_pillar === 'string' && bazi.hour_pillar.length >= 2) {
hourGan = bazi.hour_pillar[0];
hourZhi = bazi.hour_pillar[1];
} else if (typeof bazi.hour_pillar === 'object') {
hourGan = bazi.hour_pillar.gan || bazi.hour_pillar.tiangan || '-';
hourZhi = bazi.hour_pillar.zhi || bazi.hour_pillar.dizhi || '-';
}
hourNayin = bazi.hour_nayin || bazi.hour_pillar?.nayin || '-';
}
// 如果从bazi_chart中无法获取尝试从四柱解释中提取
if (hourGan === '-' && analysisData.basic_info.pillar_interpretations) {
const pillars = analysisData.basic_info.pillar_interpretations;
if (pillars.hour_pillar) {
const hourText = pillars.hour_pillar.interpretation || pillars.hour_pillar;
const hourMatch = hourText.match(/时柱([甲乙丙丁戊己庚辛壬癸])([子丑寅卯辰巳午未申酉戌亥])/);
if (hourMatch) {
hourGan = hourMatch[1];
hourZhi = hourMatch[2];
}
// 提取纳音信息 - 扩展匹配模式
if (hourNayin === '-') {
// 尝试多种纳音匹配模式
let nayinMatch = hourText.match(/纳音[:]?([^,。\n]+)/);
if (!nayinMatch) {
nayinMatch = hourText.match(/(海中金|炉中火|大林木|路旁土|剑锋金|山头火|涧下水|城头土|白蜡金|杨柳木|泉中水|屋上土|霹雳火|松柏木|长流水|沙中金|山下火|平地木|壁上土|金箔金|覆灯火|天河水|大驿土|钗钏金|桑柘木|大溪水|沙中土|天上火|石榴木|大海水)/);
}
if (nayinMatch) {
hourNayin = nayinMatch[1].trim();
} else {
// 根据干支推算纳音
const ganZhi = `${hourGan}${hourZhi}`;
const nayinMap = {
'甲子': '海中金', '乙丑': '海中金', '丙寅': '炉中火', '丁卯': '炉中火',
'戊辰': '大林木', '己巳': '大林木', '庚午': '路旁土', '辛未': '路旁土',
'壬申': '剑锋金', '癸酉': '剑锋金', '甲戌': '山头火', '乙亥': '山头火',
'丙子': '涧下水', '丁丑': '涧下水', '戊寅': '城头土', '己卯': '城头土',
'庚辰': '白蜡金', '辛巳': '白蜡金', '壬午': '杨柳木', '癸未': '杨柳木',
'甲申': '泉中水', '乙酉': '泉中水', '丙戌': '屋上土', '丁亥': '屋上土',
'戊子': '霹雳火', '己丑': '霹雳火', '庚寅': '松柏木', '辛卯': '松柏木',
'壬辰': '长流水', '癸巳': '长流水', '甲午': '沙中金', '乙未': '沙中金',
'丙申': '山下火', '丁酉': '山下火', '戊戌': '平地木', '己亥': '平地木',
'庚子': '壁上土', '辛丑': '壁上土', '壬寅': '金箔金', '癸卯': '金箔金',
'甲辰': '覆灯火', '乙巳': '覆灯火', '丙午': '天河水', '丁未': '天河水',
'戊申': '大驿土', '己酉': '大驿土', '庚戌': '钗钏金', '辛亥': '钗钏金',
'壬子': '桑柘木', '癸丑': '桑柘木', '甲寅': '大溪水', '乙卯': '大溪水',
'丙辰': '沙中土', '丁巳': '沙中土', '戊午': '天上火', '己未': '天上火',
'庚申': '石榴木', '辛酉': '石榴木', '壬戌': '大海水', '癸亥': '大海水'
};
if (nayinMap[ganZhi]) {
hourNayin = nayinMap[ganZhi];
}
}
}
}
}
markdown += `| 时柱 | ${hourGan} | ${hourZhi} | ${hourNayin} |\n`;
markdown += `\n`;
// 日主信息
if (bazi.day_master) {
markdown += `**日主:** ${bazi.day_master}\n`;
}
if (bazi.day_master_element) {
markdown += `**日主五行:** ${bazi.day_master_element}\n`;
}
if (bazi.strength_analysis) {
markdown += `**日主强弱:** ${bazi.strength_analysis}\n`;
}
markdown += `\n`;
}
// 四柱解释
if (analysisData.basic_info.pillar_interpretations) {
markdown += `### 📖 四柱解释\n\n`;
const pillars = analysisData.basic_info.pillar_interpretations;
if (pillars.year_pillar) {
markdown += `#### 年柱 - ${pillars.year_pillar.pillar || ''}\n`;
markdown += `${pillars.year_pillar.interpretation || pillars.year_pillar}\n\n`;
}
if (pillars.month_pillar) {
markdown += `#### 月柱 - ${pillars.month_pillar.pillar || ''}\n`;
markdown += `${pillars.month_pillar.interpretation || pillars.month_pillar}\n\n`;
}
if (pillars.day_pillar) {
markdown += `#### 日柱 - ${pillars.day_pillar.pillar || ''}\n`;
markdown += `${pillars.day_pillar.interpretation || pillars.day_pillar}\n\n`;
}
if (pillars.hour_pillar) {
markdown += `#### 时柱 - ${pillars.hour_pillar.pillar || ''}\n`;
markdown += `${pillars.hour_pillar.interpretation || pillars.hour_pillar}\n\n`;
}
}
// 农历信息 - 增强处理逻辑
markdown += `### 🌙 农历信息\n\n`;
let hasLunarInfo = false;
const lunar = analysisData.basic_info?.lunar_info || {};
const birthDate = new Date(analysisData.basic_info?.birth_date || '');
// 农历日期信息
if (lunar.lunar_date && lunar.lunar_date !== '农历信息') {
markdown += `**农历日期:** ${lunar.lunar_date}\n`;
hasLunarInfo = true;
} else if (lunar.year && lunar.month && lunar.day) {
markdown += `**农历日期:** 农历${lunar.year}${lunar.month}${lunar.day}\n`;
hasLunarInfo = true;
}
// 农历年份信息
if (lunar.lunar_year && lunar.lunar_year !== '农历信息') {
markdown += `**农历年份:** ${lunar.lunar_year}\n`;
hasLunarInfo = true;
} else if (analysisData.basic_info?.birth_date) {
const year = birthDate.getFullYear();
markdown += `**公历年份:** ${year}\n`;
hasLunarInfo = true;
}
// 生肖信息
if (lunar.zodiac) {
markdown += `**生肖:** ${lunar.zodiac}\n`;
hasLunarInfo = true;
} else if (analysisData.basic_info?.birth_date) {
// 根据年份推算生肖
const year = birthDate.getFullYear();
const zodiacAnimals = ['鼠', '牛', '虎', '兔', '龙', '蛇', '马', '羊', '猴', '鸡', '狗', '猪'];
const zodiacIndex = (year - 1900) % 12;
const zodiac = zodiacAnimals[zodiacIndex];
markdown += `**生肖:** ${zodiac}\n`;
hasLunarInfo = true;
}
// 节气信息
if (lunar.solar_term && lunar.solar_term !== '节气信息') {
markdown += `**节气:** ${lunar.solar_term}\n`;
hasLunarInfo = true;
} else if (analysisData.basic_info?.birth_date) {
// 根据出生日期推算节气
const month = birthDate.getMonth() + 1;
const day = birthDate.getDate();
let solarTerm = '';
// 24节气推算基于公历日期
if (month === 3 && day >= 5 && day <= 6) solarTerm = '惊蛰';
else if (month === 3 && day >= 20 && day <= 21) solarTerm = '春分';
else if (month === 4 && day >= 4 && day <= 6) solarTerm = '清明';
else if (month === 4 && day >= 19 && day <= 21) solarTerm = '谷雨';
else if (month === 5 && day >= 5 && day <= 7) solarTerm = '立夏';
else if (month === 5 && day >= 20 && day <= 22) solarTerm = '小满';
else if (month === 6 && day >= 5 && day <= 7) solarTerm = '芒种';
else if (month === 6 && day >= 21 && day <= 22) solarTerm = '夏至';
else if (month === 7 && day >= 6 && day <= 8) solarTerm = '小暑';
else if (month === 7 && day >= 22 && day <= 24) solarTerm = '大暑';
else if (month === 8 && day >= 7 && day <= 9) solarTerm = '立秋';
else if (month === 8 && day >= 22 && day <= 24) solarTerm = '处暑';
else if (month === 9 && day >= 7 && day <= 9) solarTerm = '白露';
else if (month === 9 && day >= 22 && day <= 24) solarTerm = '秋分';
else if (month === 10 && day >= 8 && day <= 9) solarTerm = '寒露';
else if (month === 10 && day >= 23 && day <= 24) solarTerm = '霜降';
else if (month === 11 && day >= 7 && day <= 8) solarTerm = '立冬';
else if (month === 11 && day >= 22 && day <= 23) solarTerm = '小雪';
else if (month === 12 && day >= 6 && day <= 8) solarTerm = '大雪';
else if (month === 12 && day >= 21 && day <= 23) solarTerm = '冬至';
else if (month === 1 && day >= 5 && day <= 7) solarTerm = '小寒';
else if (month === 1 && day >= 20 && day <= 21) solarTerm = '大寒';
else if (month === 2 && day >= 3 && day <= 5) solarTerm = '立春';
else if (month === 2 && day >= 18 && day <= 20) solarTerm = '雨水';
if (solarTerm) {
markdown += `**节气:** ${solarTerm}\n`;
hasLunarInfo = true;
}
}
// 干支年信息
if (lunar.ganzhi_year) {
markdown += `**干支年:** ${lunar.ganzhi_year}\n`;
hasLunarInfo = true;
} else if (analysisData.basic_info?.birth_date) {
// 根据年份推算干支年
const year = birthDate.getFullYear();
const tianGan = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
const diZhi = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
const ganIndex = (year - 4) % 10;
const zhiIndex = (year - 4) % 12;
const ganzhiYear = tianGan[ganIndex] + diZhi[zhiIndex];
markdown += `**干支年:** ${ganzhiYear}\n`;
hasLunarInfo = true;
}
if (!hasLunarInfo) {
markdown += `*农历信息暂无详细数据*\n`;
}
markdown += `\n`;
}
// 五行分析
if (analysisData.wuxing_analysis) {
markdown += `## 🌟 五行分析\n\n`;
if (analysisData.wuxing_analysis.element_distribution) {
markdown += `### 五行分布\n\n`;
const elements = analysisData.wuxing_analysis.element_distribution;
const total = Object.values(elements).reduce((sum, count) => sum + (typeof count === 'number' ? count : 0), 0);
markdown += `| 五行 | 数量 | 占比 | 强度 |\n`;
markdown += `|------|------|------|------|\n`;
Object.entries(elements).forEach(([element, count]) => {
const numCount = typeof count === 'number' ? count : 0;
const percentage = total > 0 ? Math.round((numCount / total) * 100) : 0;
const strength = numCount >= 3 ? '旺' : numCount >= 2 ? '中' : '弱';
markdown += `| ${element} | ${numCount} | ${percentage}% | ${strength} |\n`;
});
markdown += `\n`;
}
if (analysisData.wuxing_analysis.balance_analysis) {
markdown += `### 五行平衡分析\n\n`;
markdown += `${analysisData.wuxing_analysis.balance_analysis}\n\n`;
}
if (analysisData.wuxing_analysis.personality_traits) {
markdown += `### 性格特质\n\n`;
markdown += `${analysisData.wuxing_analysis.personality_traits}\n\n`;
}
if (analysisData.wuxing_analysis.improvement_suggestions) {
markdown += `### 改善建议\n\n`;
markdown += `${analysisData.wuxing_analysis.improvement_suggestions}\n\n`;
}
if (analysisData.wuxing_analysis.suggestions) {
markdown += `### 调和建议\n\n`;
markdown += `${analysisData.wuxing_analysis.suggestions}\n\n`;
}
}
// 十神分析(八字专用)
if (analysisData.ten_gods_analysis || analysisData.basic_info?.bazi_chart?.ten_gods || analysisData.basic_info?.bazi_chart || analysisData.basic_info?.pillar_interpretations) {
markdown += `## ⚡ 十神分析\n\n`;
// 从四柱解释中提取十神信息
let extractedTenGods = {};
if (analysisData.basic_info?.pillar_interpretations) {
const pillars = analysisData.basic_info.pillar_interpretations;
// 提取年柱十神
if (pillars.year_pillar) {
const yearText = pillars.year_pillar.interpretation || pillars.year_pillar;
const tenGodMatch = yearText.match(/(正印|偏印|正官|七杀|正财|偏财|食神|伤官|比肩|劫财)关系/);
if (tenGodMatch) {
extractedTenGods.year_ten_god = tenGodMatch[1];
}
}
// 提取月柱十神
if (pillars.month_pillar) {
const monthText = pillars.month_pillar.interpretation || pillars.month_pillar;
const tenGodMatch = monthText.match(/(正印|偏印|正官|七杀|正财|偏财|食神|伤官|比肩|劫财)关系/);
if (tenGodMatch) {
extractedTenGods.month_ten_god = tenGodMatch[1];
}
}
// 提取时柱十神
if (pillars.hour_pillar) {
const hourText = pillars.hour_pillar.interpretation || pillars.hour_pillar;
const tenGodMatch = hourText.match(/(正印|偏印|正官|七杀|正财|偏财|食神|伤官|比肩|劫财)关系/);
if (tenGodMatch) {
extractedTenGods.hour_ten_god = tenGodMatch[1];
}
}
}
// 如果有专门的十神分析
if (analysisData.ten_gods_analysis) {
if (analysisData.ten_gods_analysis.distribution) {
markdown += `### 十神分布\n\n`;
Object.entries(analysisData.ten_gods_analysis.distribution).forEach(([god, info]) => {
markdown += `#### ${god}\n`;
if (typeof info === 'object' && info.count !== undefined) {
markdown += `- **数量:** ${info.count}\n`;
if (info.description) {
markdown += `- **含义:** ${info.description}\n`;
}
} else {
markdown += `- **数量:** ${info}\n`;
}
markdown += `\n`;
});
}
if (analysisData.ten_gods_analysis.analysis) {
markdown += `### 十神综合分析\n\n`;
markdown += `${analysisData.ten_gods_analysis.analysis}\n\n`;
}
}
// 如果十神信息在bazi_chart中
const baziChart = analysisData.basic_info?.bazi_chart;
if (baziChart) {
const tenGods = baziChart.ten_gods || {};
// 显示各柱十神(优先使用提取的信息)
const yearTenGod = extractedTenGods.year_ten_god || tenGods.year_ten_god || baziChart.year_ten_god;
const monthTenGod = extractedTenGods.month_ten_god || tenGods.month_ten_god || baziChart.month_ten_god;
const hourTenGod = extractedTenGods.hour_ten_god || tenGods.hour_ten_god || baziChart.hour_ten_god;
if (yearTenGod || monthTenGod || hourTenGod) {
markdown += `### 十神配置\n\n`;
if (yearTenGod) {
markdown += `- **年柱十神:** ${yearTenGod}\n`;
}
if (monthTenGod) {
markdown += `- **月柱十神:** ${monthTenGod}\n`;
}
if (hourTenGod) {
markdown += `- **时柱十神:** ${hourTenGod}\n`;
}
// 添加十神分析说明
markdown += `\n### 十神特征分析\n\n`;
if (yearTenGod) {
markdown += `**${yearTenGod}(年柱)**:代表祖辈、早年环境和成长背景的影响。\n`;
}
if (monthTenGod) {
markdown += `**${monthTenGod}(月柱)**:代表青年时期、事业发展和社会关系的特点。\n`;
}
if (hourTenGod) {
markdown += `**${hourTenGod}(时柱)**:代表晚年运势、子女关系和人生成就。\n`;
}
markdown += `\n`;
}
// 如果有十神统计信息
if (baziChart.ten_gods_count || baziChart.ten_gods_distribution) {
const distribution = baziChart.ten_gods_count || baziChart.ten_gods_distribution;
markdown += `### 十神统计\n\n`;
Object.entries(distribution).forEach(([god, count]) => {
if (count > 0) {
markdown += `- **${god}** ${count}\n`;
}
});
markdown += `\n`;
}
}
}
// 格局分析(八字专用)
if (analysisData.geju_analysis) {
markdown += `## 🎯 格局分析\n\n`;
if (analysisData.geju_analysis.pattern_type) {
markdown += `### 格局类型\n\n`;
markdown += `**格局:** ${analysisData.geju_analysis.pattern_type}\n\n`;
}
if (analysisData.geju_analysis.pattern_strength) {
const strength = analysisData.geju_analysis.pattern_strength;
const strengthLabel = strength === 'strong' ? '强' : strength === 'moderate' ? '中等' : strength === 'fair' ? '一般' : '较弱';
markdown += `**格局强度:** ${strengthLabel}\n\n`;
}
if (analysisData.geju_analysis.characteristics) {
markdown += `### 格局特征\n\n`;
markdown += `${analysisData.geju_analysis.characteristics}\n\n`;
}
if (analysisData.geju_analysis.career_path) {
markdown += `### 适合职业\n\n`;
markdown += `${analysisData.geju_analysis.career_path}\n\n`;
}
if (analysisData.geju_analysis.life_meaning) {
markdown += `### 人生意义\n\n`;
markdown += `${analysisData.geju_analysis.life_meaning}\n\n`;
}
if (analysisData.geju_analysis.development_strategy) {
markdown += `### 发展策略\n\n`;
markdown += `${analysisData.geju_analysis.development_strategy}\n\n`;
}
}
// 大运分析(八字专用)
if (analysisData.dayun_analysis) {
markdown += `## 📈 大运分析\n\n`;
if (analysisData.dayun_analysis.current_dayun) {
markdown += `### 当前大运\n\n`;
// 处理大运信息,可能是对象或字符串
let dayunText = '';
const currentDayun = analysisData.dayun_analysis.current_dayun;
const currentAge = analysisData.dayun_analysis.current_age;
if (typeof currentDayun === 'string') {
dayunText = currentDayun;
} else if (typeof currentDayun === 'object' && currentDayun !== null) {
// 如果是对象,尝试提取干支信息
const gan = currentDayun.gan || currentDayun.tiangan || '';
const zhi = currentDayun.zhi || currentDayun.dizhi || '';
const period = currentDayun.period || currentDayun.name || '';
dayunText = period || `${gan}${zhi}` || '当前大运';
} else if (typeof currentDayun === 'number' && analysisData.dayun_analysis.dayun_sequence) {
// 如果是数字索引,从大运序列中查找
const sequence = analysisData.dayun_analysis.dayun_sequence;
if (sequence[currentDayun - 1]) {
const targetDayun = sequence[currentDayun - 1];
if (typeof targetDayun === 'object' && targetDayun.dayun) {
if (typeof targetDayun.dayun === 'string') {
dayunText = targetDayun.dayun;
} else if (typeof targetDayun.dayun === 'object') {
const gan = targetDayun.dayun.gan || targetDayun.dayun.tiangan || '';
const zhi = targetDayun.dayun.zhi || targetDayun.dayun.dizhi || '';
dayunText = `${gan}${zhi}`;
}
} else if (targetDayun.period) {
dayunText = targetDayun.period;
}
}
// 如果还是没找到,根据年龄匹配
if (!dayunText && currentAge) {
for (const period of sequence) {
if (typeof period === 'object' && period.start_age && period.end_age) {
if (currentAge >= period.start_age && currentAge <= period.end_age) {
if (period.dayun) {
if (typeof period.dayun === 'string') {
dayunText = period.dayun;
} else if (typeof period.dayun === 'object') {
const gan = period.dayun.gan || period.dayun.tiangan || '';
const zhi = period.dayun.zhi || period.dayun.dizhi || '';
dayunText = `${gan}${zhi}`;
}
} else if (period.period) {
dayunText = period.period;
}
break;
}
}
}
}
}
if (!dayunText) {
dayunText = '当前大运';
}
markdown += `**大运:** ${dayunText}\n`;
if (analysisData.dayun_analysis.current_age) {
markdown += `**当前年龄:** ${analysisData.dayun_analysis.current_age}\n`;
}
if (analysisData.dayun_analysis.start_luck_age) {
markdown += `**起运年龄:** ${analysisData.dayun_analysis.start_luck_age}\n`;
}
markdown += `\n`;
}
if (analysisData.dayun_analysis.dayun_influence) {
markdown += `### 大运影响\n\n`;
markdown += `${analysisData.dayun_analysis.dayun_influence}\n\n`;
}
if (analysisData.dayun_analysis.yearly_fortune) {
markdown += `### 流年运势\n\n`;
markdown += `${analysisData.dayun_analysis.yearly_fortune}\n\n`;
}
if (analysisData.dayun_analysis.future_outlook) {
markdown += `### 未来展望\n\n`;
markdown += `${analysisData.dayun_analysis.future_outlook}\n\n`;
}
if (analysisData.dayun_analysis.dayun_sequence && Array.isArray(analysisData.dayun_analysis.dayun_sequence)) {
markdown += `### 大运序列\n\n`;
markdown += `| 年龄段 | 大运 | 运势特点 |\n`;
markdown += `|--------|------|----------|\n`;
analysisData.dayun_analysis.dayun_sequence.forEach((period, index) => {
if (typeof period === 'object' && period !== null) {
const ageRange = period.age_range || `${period.start_age || '?'}-${period.end_age || '?'}`;
// 处理大运信息
let dayunText = '';
if (period.dayun) {
if (typeof period.dayun === 'string') {
dayunText = period.dayun;
} else if (typeof period.dayun === 'object') {
const gan = period.dayun.gan || period.dayun.tiangan || '';
const zhi = period.dayun.zhi || period.dayun.dizhi || '';
dayunText = `${gan}${zhi}`;
}
} else if (period.period) {
dayunText = period.period;
} else if (period.gan && period.zhi) {
dayunText = `${period.gan}${period.zhi}`;
} else {
dayunText = `${index + 1}`;
}
const description = period.description || period.characteristics || period.analysis || '运势平稳';
markdown += `| ${ageRange}岁 | ${dayunText} | ${description} |\n`;
} else {
// 如果是简单的数字或其他类型,生成基本信息
const startAge = 11 + index * 10;
const endAge = startAge + 9;
markdown += `| ${startAge}-${endAge}岁 | 第${index + 1}运 | 运势待分析 |\n`;
}
});
markdown += `\n`;
}
}
// 运势分析
if (analysisData.fortune_analysis) {
markdown += `## 🔮 运势分析\n\n`;
['career', 'wealth', 'relationship', 'health'].forEach(aspect => {
if (analysisData.fortune_analysis[aspect]) {
const aspectNames = {
career: '事业运势',
wealth: '财运分析',
relationship: '感情运势',
health: '健康运势'
};
markdown += `### ${aspectNames[aspect]}\n\n`;
markdown += `${analysisData.fortune_analysis[aspect]}\n\n`;
}
});
}
// 人生指导(八字专用)
if (analysisData.life_guidance) {
markdown += `## 🌟 人生指导\n\n`;
if (analysisData.life_guidance.overall_summary) {
markdown += `### 综合总结\n\n`;
markdown += `${analysisData.life_guidance.overall_summary}\n\n`;
}
if (analysisData.life_guidance.career_development) {
markdown += `### 事业发展\n\n`;
markdown += `${analysisData.life_guidance.career_development}\n\n`;
}
if (analysisData.life_guidance.wealth_management) {
markdown += `### 财富管理\n\n`;
markdown += `${analysisData.life_guidance.wealth_management}\n\n`;
}
if (analysisData.life_guidance.marriage_relationships) {
markdown += `### 婚姻感情\n\n`;
markdown += `${analysisData.life_guidance.marriage_relationships}\n\n`;
}
if (analysisData.life_guidance.health_wellness) {
markdown += `### 健康养生\n\n`;
markdown += `${analysisData.life_guidance.health_wellness}\n\n`;
}
if (analysisData.life_guidance.personal_development) {
markdown += `### 个人发展\n\n`;
markdown += `${analysisData.life_guidance.personal_development}\n\n`;
}
// 兼容旧格式
if (analysisData.life_guidance.strengths) {
markdown += `### 优势特质\n\n`;
if (Array.isArray(analysisData.life_guidance.strengths)) {
analysisData.life_guidance.strengths.forEach(strength => {
markdown += `- ${strength}\n`;
});
} else {
markdown += `${analysisData.life_guidance.strengths}\n`;
}
markdown += `\n`;
}
if (analysisData.life_guidance.challenges) {
markdown += `### 需要注意\n\n`;
if (Array.isArray(analysisData.life_guidance.challenges)) {
analysisData.life_guidance.challenges.forEach(challenge => {
markdown += `- ${challenge}\n`;
});
} else {
markdown += `${analysisData.life_guidance.challenges}\n`;
}
markdown += `\n`;
}
if (analysisData.life_guidance.suggestions) {
markdown += `### 发展建议\n\n`;
if (Array.isArray(analysisData.life_guidance.suggestions)) {
analysisData.life_guidance.suggestions.forEach(suggestion => {
markdown += `- ${suggestion}\n`;
});
} else {
markdown += `${analysisData.life_guidance.suggestions}\n`;
}
markdown += `\n`;
}
}
// 现代应用建议(八字专用)
if (analysisData.modern_applications) {
markdown += `## 💡 现代应用建议\n\n`;
if (analysisData.modern_applications.lifestyle_recommendations) {
markdown += `### 生活方式建议\n\n`;
markdown += `${analysisData.modern_applications.lifestyle_recommendations}\n\n`;
}
if (analysisData.modern_applications.career_strategies) {
markdown += `### 职业策略\n\n`;
markdown += `${analysisData.modern_applications.career_strategies}\n\n`;
}
if (analysisData.modern_applications.relationship_advice) {
markdown += `### 人际关系建议\n\n`;
markdown += `${analysisData.modern_applications.relationship_advice}\n\n`;
}
if (analysisData.modern_applications.decision_making) {
markdown += `### 决策指导\n\n`;
markdown += `${analysisData.modern_applications.decision_making}\n\n`;
}
// 兼容旧格式
Object.entries(analysisData.modern_applications).forEach(([key, value]) => {
const keyNames = {
lifestyle: '生活方式建议',
career_development: '职业发展建议',
relationship_advice: '人际关系建议',
health_maintenance: '健康养生建议',
financial_planning: '理财规划建议'
};
if (keyNames[key] && value && ![
'lifestyle_recommendations',
'career_strategies',
'relationship_advice',
'decision_making'
].includes(key)) {
markdown += `### ${keyNames[key]}\n\n`;
markdown += `${value}\n\n`;
}
});
}
// 页脚
markdown += `---\n\n`;
markdown += `*本报告由神机阁AI命理分析平台生成*\n`;
markdown += `*生成时间:${timestamp}*\n`;
markdown += `*仅供参考,请理性对待*\n`;
return markdown;
};
/**
* 生成紫微斗数Markdown文档
*/
const generateZiweiMarkdown = (analysisData, userName) => {
const timestamp = new Date().toLocaleString('zh-CN');
let markdown = `# 紫微斗数分析报告\n\n`;
markdown += `**姓名:** ${userName || '用户'}\n`;
markdown += `**生成时间:** ${timestamp}\n`;
markdown += `**分析类型:** 紫微斗数\n\n`;
markdown += `---\n\n`;
// 基本信息
if (analysisData.basic_info) {
markdown += `## 📋 基本信息\n\n`;
if (analysisData.basic_info.personal_data) {
const personal = analysisData.basic_info.personal_data;
markdown += `- **姓名:** ${personal.name || '未提供'}\n`;
markdown += `- **性别:** ${personal.gender === 'male' ? '男性' : personal.gender === 'female' ? '女性' : personal.gender || '未提供'}\n`;
markdown += `- **出生日期:** ${personal.birth_date || '未提供'}\n`;
markdown += `- **出生时间:** ${personal.birth_time || '未提供'}\n`;
}
// 八字信息
if (analysisData.basic_info.bazi_info) {
markdown += `\n### 🎋 八字信息\n\n`;
const bazi = analysisData.basic_info.bazi_info;
markdown += `- **年柱:** ${bazi.year || '未知'}\n`;
markdown += `- **月柱:** ${bazi.month || '未知'}\n`;
markdown += `- **日柱:** ${bazi.day || '未知'}\n`;
markdown += `- **时柱:** ${bazi.hour || '未知'}\n\n`;
}
// 命宫位置信息
if (analysisData.basic_info.ming_gong_position || analysisData.ziwei_analysis?.ming_gong_position || analysisData.ziwei_analysis?.twelve_palaces?.命宫) {
markdown += `### 🏰 命宫位置\n\n`;
// 从多个数据源获取命宫位置信息
const mingGongPos = analysisData.basic_info.ming_gong_position || analysisData.ziwei_analysis?.ming_gong_position;
const mingGongPalace = analysisData.ziwei_analysis?.twelve_palaces?.命宫;
// 显示命宫位置
if (mingGongPos?.position || mingGongPos?.branch) {
const position = mingGongPos.position || mingGongPos.branch;
markdown += `**命宫位置:** ${position}\n`;
markdown += `命宫在${position}\n\n`;
} else if (analysisData.basic_info?.ming_gong || analysisData.basic_info?.life_palace) {
const position = analysisData.basic_info.ming_gong || analysisData.basic_info.life_palace;
markdown += `**命宫位置:** ${position}\n`;
markdown += `命宫在${position}\n\n`;
}
// 显示命宫位置详解
const position = mingGongPos?.position || mingGongPos?.branch || analysisData.basic_info?.ming_gong || analysisData.basic_info?.life_palace;
const description = mingGongPos?.description || mingGongPos?.detailed_analysis;
// 检查description是否为有效的详细解释不是简单的"命宫在X宫"格式)
const isDetailedDescription = description && description.length > 10 && !description.match(/^命宫在.{1,2}宫$/);
if (isDetailedDescription) {
markdown += `**命宫位置详解:**\n`;
markdown += `${description}\n\n`;
} else if (position) {
// 提供默认的宫位解释
const palaceExplanations = {
'子': '子宫属水,代表智慧和流动,使您思维敏捷,适应能力强,善于在变化中寻找机会。',
'丑': '丑宫属土,代表稳重和积累,使您性格踏实,做事有条理,善于积累财富和经验。',
'寅': '寅宫属木,代表生长和创新,使您充满活力,勇于开拓,具有很强的进取心。',
'卯': '卯宫属木,代表温和和艺术,使您性格温和,具有艺术天赋,善于与人相处。',
'辰': '辰宫属土,代表智慧和储藏,使您善于学习和积累知识,在专业领域能够达到很高的水平。',
'巳': '巳宫属火,代表智慧和变化,使您聪明机智,善于思考,但有时过于多虑。',
'午': '午宫属火,代表光明和热情,使您性格开朗,热情大方,具有很强的表现力。',
'未': '未宫属土,代表包容和服务,使您具有很强的服务精神,善于照顾他人。',
'申': '申宫属金,代表果断和执行,使您做事果断,执行力强,善于处理实务。',
'酉': '酉宫属金,代表精细和完美,使您注重细节,追求完美,具有很强的审美能力。',
'戌': '戌宫属土,代表忠诚和责任,使您忠诚可靠,责任感强,善于辅助他人。',
'亥': '亥宫属水,代表智慧和包容,使您心胸宽广,具有很强的包容心和同情心。'
};
const explanation = palaceExplanations[position] || `${position}宫是您命宫所在的位置,影响着您的性格特质和人生发展方向。`;
markdown += `**命宫位置详解:**\n`;
markdown += `${explanation}\n\n`;
}
}
// 五行局详解
if (analysisData.basic_info.wuxing_ju) {
markdown += `### 🌟 五行局详解\n\n`;
const wuxingJu = analysisData.basic_info.wuxing_ju;
if (wuxingJu.type) {
markdown += `**五行局类型:** ${wuxingJu.type}\n\n`;
}
if (wuxingJu.description) {
markdown += `**五行局说明:** ${wuxingJu.description}\n\n`;
}
// 纳音五行分析
if (wuxingJu.nayin) {
markdown += `#### 🔥 纳音五行分析\n\n`;
markdown += `**纳音五行:** ${wuxingJu.nayin}\n\n`;
// 纳音五行详细解释
const nayinExplanations = {
'海中金': '如深海珍宝般内敛珍贵,性格深沉内敛,不轻易显露才华,但一旦时机成熟便能展现惊人的能力。',
'剑锋金': '锋利而坚韧,具有果断的决策能力和强烈的进取心,适合在竞争激烈的环境中发展。',
'白蜡金': '纯净温润,具有很强的适应能力和协调能力,适合通过人际关系和团队合作来实现目标。',
'砂中金': '需要淘洗显现,成功需要经过磨练和积累,通过不断努力最终能获得丰厚回报。',
'金箔金': '薄而广泛,具有灵活多变的特质,适合在多元化发展中寻找机会。',
'钗钏金': '精美实用,注重品质和细节,适合在精品化路线上发展。',
'大林木': '如参天大树,具有强大的成长潜力和包容能力,适合长期规划和稳步发展。',
'杨柳木': '柔韧优美,具有很强的适应性和创造力,适合在变化中寻找发展机会。',
'松柏木': '坚韧不屈,具有顽强的意志力和持久的耐力,虽有波折但最终能够获得成功。',
'平地木': '广阔包容,具有很强的团队协作能力,适合在团队中发挥领导作用。',
'桑柘木': '实用有价值,注重实际效果和长远价值,适合在实业中发展。',
'石榴木': '多子多福,具有旺盛的生命力和创造力,适合在人际交往中发展事业。',
'涧下水': '清澈持续,具有纯净的品格和坚持的精神,适合在专业领域深耕发展。',
'泉中水': '源源不断,具有丰富的创造力和持续的动力,适合在新兴领域发展。',
'长流水': '绵延不绝,具有持久的发展能力,适合长期投资和积累。',
'天河水': '高远广阔,具有远大的志向和宏观的视野,适合在高层次平台发展。',
'大溪水': '奔腾有力,具有强大的行动力和进取心,适合在变化中把握机遇。',
'大海水': '深邃包容,具有深厚的智慧和广阔的胸怀,适合在国际化平台发展。',
'炉中火': '热烈专注,具有专业的精神和热情的态度,适合在技术领域深入钻研。',
'山头火': '明亮显眼,具有出众的表现力和领导魅力,适合在公众平台发展。',
'霹雳火': '迅猛有力,具有快速的反应能力和强烈的爆发力,适合在快节奏环境中发展。',
'山下火': '温暖持久,具有温和的性格和持续的服务精神,适合在服务行业发展。',
'覆灯火': '温馨照明,具有照顾他人的天性和温暖的人格魅力,适合在关怀性行业发展。',
'天上火': '光明高远,具有正直的品格和崇高的理想,适合在公正性行业发展。',
'路旁土': '承载包容,具有踏实的品格和支持他人的能力,适合在基础性行业发展。',
'城头土': '坚固防护,具有强烈的责任感和保护意识,适合在防护性行业发展。',
'屋上土': '实用温馨,注重家庭和谐与实际效果,适合在家庭相关行业发展。',
'壁上土': '装饰美化,具有艺术天赋和美化能力,适合在美化性行业发展。',
'大驿土': '连接沟通,具有很强的组织协调能力,适合在协调性行业发展。',
'沙中土': '细腻广泛,具有细致入微的观察力和周到的处事能力,适合在精细化行业发展。'
};
const nayinDesc = nayinExplanations[wuxingJu.nayin] || `您的纳音五行为${wuxingJu.nayin},这是您天生的五行本质和能量特征。`;
markdown += `**纳音特质:** ${nayinDesc}\n\n`;
markdown += `**纳音在紫微斗数中的应用:**\n`;
markdown += `- 🏰 **五行局确定**:年柱纳音直接决定五行局类型,影响紫微星的定位和整个命盘的格局\n`;
markdown += `- ⏰ **大限推算**:五行局数决定大限的起始年龄和每步大限的年数,是推算运程的基础\n`;
markdown += `- 🌟 **性格分析**:纳音五行体现了深层的性格特质,与主星配合形成完整的性格画像\n`;
}
}
}
// 详细分析 - 紫微斗数的核心内容
if (analysisData.detailed_analysis) {
const detailed = analysisData.detailed_analysis;
// 个性分析
if (detailed.personality_analysis) {
markdown += `\n## 🎭 个性分析\n\n`;
const personality = detailed.personality_analysis;
if (personality.overview) {
markdown += `### 性格概述\n\n`;
markdown += `${personality.overview}\n\n`;
}
if (personality.core_traits) {
markdown += `### 核心特质\n\n`;
markdown += `${personality.core_traits}\n\n`;
}
if (personality.strengths) {
markdown += `### 优势特质\n\n`;
markdown += `${personality.strengths}\n\n`;
}
if (personality.challenges) {
markdown += `### 需要注意\n\n`;
markdown += `${personality.challenges}\n\n`;
}
if (personality.development_potential) {
markdown += `### 发展潜力\n\n`;
markdown += `${personality.development_potential}\n\n`;
}
}
// 事业分析
if (detailed.career_analysis) {
markdown += `\n## 💼 事业分析\n\n`;
const career = detailed.career_analysis;
if (career.career_potential) {
markdown += `### 事业潜力\n\n`;
markdown += `${career.career_potential}\n\n`;
}
if (career.suitable_industries) {
markdown += `### 适合行业\n\n`;
markdown += `${career.suitable_industries}\n\n`;
}
if (career.leadership_style) {
markdown += `### 领导风格\n\n`;
markdown += `${career.leadership_style}\n\n`;
}
if (career.success_strategies) {
markdown += `### 成功策略\n\n`;
markdown += `${career.success_strategies}\n\n`;
}
if (career.modern_career_advice) {
markdown += `### 现代事业建议\n\n`;
markdown += `${career.modern_career_advice}\n\n`;
}
}
// 财富分析
if (detailed.wealth_analysis) {
markdown += `\n## 💰 财富分析\n\n`;
const wealth = detailed.wealth_analysis;
if (wealth.wealth_potential) {
markdown += `### 财运潜力\n\n`;
markdown += `${wealth.wealth_potential}\n\n`;
}
if (wealth.earning_style) {
markdown += `### 赚钱方式\n\n`;
markdown += `${wealth.earning_style}\n\n`;
}
if (wealth.investment_tendency) {
markdown += `### 投资倾向\n\n`;
markdown += `${wealth.investment_tendency}\n\n`;
}
if (wealth.financial_planning) {
markdown += `### 理财规划建议\n\n`;
markdown += `${wealth.financial_planning}\n\n`;
}
}
// 感情分析
if (detailed.relationship_analysis) {
markdown += `\n## 💕 感情分析\n\n`;
const relationship = detailed.relationship_analysis;
if (relationship.marriage_fortune) {
markdown += `### 婚姻运势\n\n`;
markdown += `${relationship.marriage_fortune}\n\n`;
}
if (relationship.spouse_characteristics) {
markdown += `### 配偶特质\n\n`;
markdown += `${relationship.spouse_characteristics}\n\n`;
}
if (relationship.relationship_pattern) {
markdown += `### 感情模式\n\n`;
markdown += `${relationship.relationship_pattern}\n\n`;
}
if (relationship.relationship_advice) {
markdown += `### 感情建议\n\n`;
markdown += `${relationship.relationship_advice}\n\n`;
}
}
// 健康分析
if (detailed.health_analysis) {
markdown += `\n## 🏥 健康分析\n\n`;
const health = detailed.health_analysis;
if (health.constitution_analysis) {
markdown += `### 体质分析\n\n`;
markdown += `${health.constitution_analysis}\n\n`;
}
if (health.health_tendencies) {
markdown += `### 健康倾向\n\n`;
markdown += `${health.health_tendencies}\n\n`;
}
if (health.vulnerable_areas) {
markdown += `### 需要注意的部位\n\n`;
markdown += `${health.vulnerable_areas}\n\n`;
}
if (health.health_maintenance) {
markdown += `### 养生建议\n\n`;
markdown += `${health.health_maintenance}\n\n`;
}
}
// 流年分析
if (detailed.timing_analysis) {
markdown += `\n## 📅 流年分析\n\n`;
const timing = detailed.timing_analysis;
if (timing.liu_nian_analysis) {
const liuNian = timing.liu_nian_analysis;
markdown += `### 年度运势\n\n`;
if (liuNian.year_overview) {
markdown += `**年度概述:** ${liuNian.year_overview}\n\n`;
}
if (liuNian.year_opportunities && Array.isArray(liuNian.year_opportunities)) {
markdown += `**发展机遇:**\n`;
liuNian.year_opportunities.forEach(opportunity => {
markdown += `- ${opportunity}\n`;
});
markdown += `\n`;
}
if (liuNian.year_challenges && Array.isArray(liuNian.year_challenges)) {
markdown += `**注意事项:**\n`;
liuNian.year_challenges.forEach(challenge => {
markdown += `- ${challenge}\n`;
});
markdown += `\n`;
}
if (liuNian.year_focus_areas && Array.isArray(liuNian.year_focus_areas)) {
markdown += `**重点领域:** ${liuNian.year_focus_areas.join('、')}\n\n`;
}
}
}
// 人生指导
if (detailed.life_guidance) {
markdown += `\n## 🌟 人生指导\n\n`;
const guidance = detailed.life_guidance;
if (guidance.life_philosophy) {
markdown += `### 人生哲学\n\n`;
markdown += `${guidance.life_philosophy}\n\n`;
}
if (guidance.development_suggestions) {
markdown += `### 发展建议\n\n`;
markdown += `${guidance.development_suggestions}\n\n`;
}
if (guidance.life_priorities) {
markdown += `### 人生重点\n\n`;
markdown += `${guidance.life_priorities}\n\n`;
}
if (guidance.spiritual_growth) {
markdown += `### 精神成长\n\n`;
markdown += `${guidance.spiritual_growth}\n\n`;
}
if (guidance.overall_summary) {
markdown += `### 综合总结\n\n`;
markdown += `${guidance.overall_summary}\n\n`;
}
}
}
// 十二宫位分析(紫微斗数专用)
if (analysisData.ziwei_analysis?.twelve_palaces) {
markdown += `\n## 🏛️ 十二宫位详解\n\n`;
markdown += `紫微斗数将人生分为十二个宫位,每个宫位代表不同的人生领域。\n\n`;
// 星曜强度等级说明
markdown += `### ⭐ 星曜强度等级说明\n\n`;
markdown += `| 强度等级 | 说明 | 影响 |\n`;
markdown += `|----------|------|------|\n`;
markdown += `| **旺** | 最强 | 星曜力量最强,相关人生领域发展顺利 |\n`;
markdown += `| **得地** | 较强 | 星曜力量较强,发展较为顺利 |\n`;
markdown += `| **平** | 中等 | 星曜力量中等,需要努力发展 |\n`;
markdown += `| **不得地** | 较弱 | 星曜力量较弱,需要更多努力 |\n`;
markdown += `| **陷** | 最弱 | 星曜力量最弱,发展较为困难 |\n\n`;
const palaces = analysisData.ziwei_analysis.twelve_palaces;
const palaceNames = {
'命宫': { name: '命宫', desc: '主导人生格局、性格特质和整体运势' },
'兄弟宫': { name: '兄弟宫', desc: '手足关系、朋友交往和团队合作' },
'夫妻宫': { name: '夫妻宫', desc: '婚姻感情、配偶特质和感情运势' },
'子女宫': { name: '子女宫', desc: '子女缘分、创造力和部属关系' },
'财帛宫': { name: '财帛宫', desc: '财富状况、赚钱能力和理财方式' },
'疾厄宫': { name: '疾厄宫', desc: '健康状况、体质特征和疾病倾向' },
'迁移宫': { name: '迁移宫', desc: '外出运势、环境适应和人际关系' },
'奴仆宫': { name: '奴仆宫', desc: '朋友部属、社交能力和人脉关系' },
'官禄宫': { name: '官禄宫', desc: '事业发展、工作能力和社会地位' },
'田宅宫': { name: '田宅宫', desc: '不动产、家庭环境和居住状况' },
'福德宫': { name: '福德宫', desc: '精神享受、兴趣爱好和福报' },
'父母宫': { name: '父母宫', desc: '父母关系、长辈缘分和学习能力' }
};
Object.entries(palaces).forEach(([palaceName, palace]) => {
const palaceInfo = palaceNames[palaceName] || { name: palaceName, desc: '人生重要领域' };
markdown += `### ${palaceInfo.name} - ${palaceInfo.desc}\n\n`;
if (typeof palace === 'object') {
// 主星信息
if (palace.main_stars && palace.main_stars.length > 0) {
markdown += `**主星配置:**\n`;
palace.main_stars.forEach(star => {
if (typeof star === 'object') {
markdown += `- **${star.name}**`;
if (star.brightness) {
markdown += ` (${star.brightness})`;
}
if (star.description) {
markdown += `${star.description}`;
}
markdown += `\n`;
} else {
markdown += `- ${star}\n`;
}
});
markdown += `\n`;
}
// 吉星信息
if (palace.lucky_stars && palace.lucky_stars.length > 0) {
const luckyStars = Array.isArray(palace.lucky_stars) ? palace.lucky_stars.join('、') : palace.lucky_stars;
markdown += `**吉星:** ${luckyStars}\n`;
}
// 煞星信息
if (palace.unlucky_stars && palace.unlucky_stars.length > 0) {
const unluckyStars = Array.isArray(palace.unlucky_stars) ? palace.unlucky_stars.join('、') : palace.unlucky_stars;
markdown += `**煞星:** ${unluckyStars}\n`;
}
// 宫位强度
if (palace.strength) {
markdown += `**宫位强度:** ${palace.strength}\n`;
}
// 详细分析
if (palace.analysis || palace.interpretation) {
markdown += `**详细分析:** ${palace.analysis || palace.interpretation}\n`;
}
// 发展建议
if (palace.suggestions) {
markdown += `**发展建议:** ${palace.suggestions}\n`;
}
markdown += `\n`; // 宫位之间只保留一个空行
} else {
markdown += `${palace}\n\n`;
}
});
}
// 四化飞星分析(紫微斗数专用)
if (analysisData.ziwei_analysis?.si_hua) {
markdown += `\n## ✨ 四化飞星\n\n`;
const sihua = analysisData.ziwei_analysis.si_hua;
// 四化概述
markdown += `四化飞星是紫微斗数的核心理论,由${sihua.year_stem || '年干'}年干所化出。四化分别是化禄(财禄)、化权(权力)、化科(名声)、化忌(阻碍),它们会影响相应星曜的能量表现,是判断吉凶和时机的重要依据。\n\n`;
// 化禄详解
if (sihua.hua_lu) {
markdown += `### 💰 化禄 - ${sihua.hua_lu.star || sihua.hua_lu}\n\n`;
markdown += `**概念:** 化禄是四化之首,主财禄、享受、缘分\n`;
markdown += `**影响:** 增强星曜的正面能量,带来财运、人缘和享受,代表得到、收获和满足\n`;
markdown += `**应用:** 化禄星所在宫位通常是您的幸运领域,容易获得成功和满足感\n`;
markdown += `**时机:** 大限或流年遇化禄,主该时期财运亨通,事业顺利,人际关系和谐\n`;
if (sihua.hua_lu.palace) {
markdown += `**所在宫位:** ${sihua.hua_lu.palace}\n`;
}
if (sihua.hua_lu.analysis) {
markdown += `**详细分析:** ${sihua.hua_lu.analysis}\n`;
}
markdown += `\n`;
}
// 化权详解
if (sihua.hua_quan) {
markdown += `### 👑 化权 - ${sihua.hua_quan.star || sihua.hua_quan}\n\n`;
markdown += `**概念:** 化权主权力、地位、能力的发挥\n`;
markdown += `**影响:** 增强星曜的权威性和主导力,带来领导机会、权力地位和成就感\n`;
markdown += `**应用:** 化权星所在宫位是您容易掌控和发挥影响力的领域\n`;
markdown += `**时机:** 大限或流年遇化权,主该时期权力增长,地位提升,能力得到认可\n`;
if (sihua.hua_quan.palace) {
markdown += `**所在宫位:** ${sihua.hua_quan.palace}\n`;
}
if (sihua.hua_quan.analysis) {
markdown += `**详细分析:** ${sihua.hua_quan.analysis}\n`;
}
markdown += `\n`;
}
// 化科详解
if (sihua.hua_ke) {
markdown += `### 🌟 化科 - ${sihua.hua_ke.star || sihua.hua_ke}\n\n`;
markdown += `**概念:** 化科主名声、学业、贵人和文书\n`;
markdown += `**影响:** 增强星曜的声誉和学习能力,带来名声、考试运和贵人相助\n`;
markdown += `**应用:** 化科星所在宫位是您容易获得名声和学习成就的领域\n`;
markdown += `**时机:** 大限或流年遇化科,主该时期名声远播,学业有成,贵人运旺\n`;
if (sihua.hua_ke.palace) {
markdown += `**所在宫位:** ${sihua.hua_ke.palace}\n`;
}
if (sihua.hua_ke.analysis) {
markdown += `**详细分析:** ${sihua.hua_ke.analysis}\n`;
}
markdown += `\n`;
}
// 化忌详解
if (sihua.hua_ji) {
markdown += `### ⚠️ 化忌 - ${sihua.hua_ji.star || sihua.hua_ji}\n\n`;
markdown += `**概念:** 化忌主阻碍、困扰、执着和变化\n`;
markdown += `**影响:** 增强星曜的负面特质,带来阻碍、烦恼,但也促使变化和成长\n`;
markdown += `**应用:** 化忌星所在宫位需要特别注意,容易遇到挫折,但也是成长的机会\n`;
markdown += `**时机:** 大限或流年遇化忌,主该时期需要谨慎行事,化解阻碍,转危为安\n`;
if (sihua.hua_ji.palace) {
markdown += `**所在宫位:** ${sihua.hua_ji.palace}\n`;
}
if (sihua.hua_ji.analysis) {
markdown += `**详细分析:** ${sihua.hua_ji.analysis}\n`;
}
markdown += `\n`;
}
// 四化互动分析
if (sihua.enhanced_sihua?.interaction_analysis) {
markdown += `### 🔄 四化互动效应\n\n`;
const interaction = sihua.enhanced_sihua.interaction_analysis;
if (interaction.conflicts && interaction.conflicts.length > 0) {
markdown += `**四化冲突:**\n`;
interaction.conflicts.forEach(conflict => {
markdown += `- **${conflict.type}** ${conflict.impact}\n`;
});
markdown += `\n`;
}
if (interaction.enhancements && interaction.enhancements.length > 0) {
markdown += `**四化增强:**\n`;
interaction.enhancements.forEach(enhancement => {
markdown += `- **${enhancement.type}** ${enhancement.impact}\n`;
});
markdown += `\n`;
}
if (interaction.overall_harmony) {
markdown += `**整体和谐度:** ${interaction.overall_harmony}\n\n`;
}
if (interaction.recommendations && interaction.recommendations.length > 0) {
markdown += `**四化建议:**\n`;
interaction.recommendations.forEach(rec => {
markdown += `- ${rec}\n`;
});
markdown += `\n`;
}
}
// 四化综合分析
if (sihua.analysis || sihua.interpretation) {
markdown += `### 📊 四化综合分析\n\n`;
markdown += `${sihua.analysis || sihua.interpretation}\n\n`;
}
}
// 14主星详解
markdown += `\n## ⭐ 14主星详解\n\n`;
markdown += `紫微斗数以14颗主星为核心每颗主星都有其独特的性格特质和影响力。以下是14主星的详细解析\n\n`;
const starExplanations = {
'紫微': {
nature: '帝星,主尊贵和领导',
personality: '天生具有领导气质,自尊心强,喜欢被人尊重,有组织能力和统御才华',
career: '适合管理、政治、大企业经营等需要领导能力的工作',
fortune: '财运与地位相关,通过权力和地位获得财富,晚年富贵'
},
'天机': {
nature: '智星,主智慧和变化',
personality: '聪明机智,善于思考和分析,但有时过于多虑和善变',
career: '适合策划、咨询、教育、科技等需要智慧的工作',
fortune: '财运变化较大,需要通过智慧和技能获得财富'
},
'太阳': {
nature: '贵星,主光明和博爱',
personality: '性格开朗,热情大方,喜欢帮助他人,但有时过于直接和冲动',
career: '适合公关、外交、教育、公益等需要与人接触的工作',
fortune: '财运与人际关系相关,通过服务他人获得财富'
},
'武曲': {
nature: '财星,主财富和决断',
personality: '性格刚毅,做事果断,有很强的执行力,但有时过于严厉和固执',
career: '适合金融、军警、工程、制造等需要执行力的工作',
fortune: '天生财星,善于理财和投资,财运较佳'
},
'天同': {
nature: '福星,主和谐和享受',
personality: '性格温和,追求和谐,喜欢享受生活,但有时过于安逸和缺乏进取心',
career: '适合服务、娱乐、艺术、餐饮等需要亲和力的工作',
fortune: '财运平稳,通过服务和合作获得财富'
},
'廉贞': {
nature: '囚星,主变化和桃花',
personality: '性格复杂,善于交际,有艺术天赋,但有时过于情绪化和不稳定',
career: '适合艺术、娱乐、公关、销售等需要魅力的工作',
fortune: '财运起伏较大,需要通过人际关系获得财富'
},
'天府': {
nature: '库星,主保守和储藏',
personality: '性格稳重,善于管理和储蓄,有很强的责任感,但有时过于保守和固执',
career: '适合管理、财务、银行、房地产等需要稳重的工作',
fortune: '财运稳定,善于积累和保存财富'
},
'太阴': {
nature: '富星,主柔和和内敛',
personality: '性格温柔,心思细腻,善于照顾他人,但有时过于敏感和消极',
career: '适合护理、教育、家政、美容等需要细心的工作',
fortune: '财运与女性或家庭相关,通过细心服务获得财富'
},
'贪狼': {
nature: '桃花星,主欲望和多才',
personality: '多才多艺,善于交际,有很强的欲望和野心,但有时过于贪心和不专一',
career: '适合销售、娱乐、艺术、投资等需要多元能力的工作',
fortune: '财运变化很大,需要通过多元发展获得财富'
},
'巨门': {
nature: '暗星,主口才和是非',
personality: '口才出众,善于表达,但有时过于直言和招惹是非',
career: '适合律师、记者、教师、演说等需要口才的工作',
fortune: '财运与口才相关,通过言语和沟通获得财富'
},
'天相': {
nature: '印星,主辅助和服务',
personality: '忠诚可靠,善于辅助他人,有很强的服务精神,但有时过于依赖和缺乏主见',
career: '适合秘书、助理、服务、协调等需要辅助能力的工作',
fortune: '财运与服务相关,通过辅助他人获得财富'
},
'天梁': {
nature: '寿星,主正直和长者风范',
personality: '正直善良,有长者风范,喜欢帮助他人,具有很强的责任感',
career: '适合教育、公益、医疗、宗教等需要奉献精神的工作',
fortune: '财运与德行相关,通过正当途径获得财富,晚年富足'
},
'七杀': {
nature: '将星,主冲劲和开拓',
personality: '冲劲十足,勇于开拓,不怕困难,但有时过于冲动和急躁',
career: '适合军警、体育、创业、销售等需要冲劲的工作',
fortune: '财运起伏较大,需要通过努力奋斗获得财富'
},
'破军': {
nature: '耗星,主变化和创新',
personality: '喜欢变化,勇于创新,不满足现状,但有时过于冲动和破坏性',
career: '适合创新、改革、艺术、科技等需要突破的工作',
fortune: '财运变化很大,需要通过创新获得财富,晚年较佳'
}
};
Object.entries(starExplanations).forEach(([starName, explanation]) => {
markdown += `### ${starName}\n\n`;
markdown += `**星曜性质:** ${explanation.nature}\n`;
markdown += `**性格特质:** ${explanation.personality}\n`;
markdown += `**事业发展:** ${explanation.career}\n`;
markdown += `**财运特点:** ${explanation.fortune}\n`;
markdown += `\n`; // 每个主星之间只保留一个空行
});
// 星曜分析(保留原有逻辑作为补充)
if (analysisData.star_analysis) {
markdown += `\n## 🌟 个人星曜配置\n\n`;
if (analysisData.star_analysis.main_stars) {
markdown += `### 主星分析\n\n`;
if (Array.isArray(analysisData.star_analysis.main_stars)) {
analysisData.star_analysis.main_stars.forEach(star => {
if (typeof star === 'object') {
markdown += `#### ${star.name || star.star}\n`;
if (star.brightness) {
markdown += `- **亮度:** ${star.brightness}\n`;
}
if (star.influence) {
markdown += `- **影响:** ${star.influence}\n`;
}
if (star.description) {
markdown += `- **特质:** ${star.description}\n`;
}
markdown += `\n`;
}
});
} else {
markdown += `${analysisData.star_analysis.main_stars}\n\n`;
}
}
if (analysisData.star_analysis.auxiliary_stars) {
markdown += `### 辅星分析\n\n`;
markdown += `${analysisData.star_analysis.auxiliary_stars}\n\n`;
}
}
// 十二宫位分析
if (analysisData.palace_analysis) {
markdown += `## 🏛️ 十二宫位分析\n\n`;
const palaceNames = {
ming: '命宫',
xiong: '兄弟宫',
fu: '夫妻宫',
zi: '子女宫',
cai: '财帛宫',
ji: '疾厄宫',
qian: '迁移宫',
nu: '奴仆宫',
guan: '官禄宫',
tian: '田宅宫',
fu_de: '福德宫',
fu_mu: '父母宫'
};
Object.entries(analysisData.palace_analysis).forEach(([palace, analysis]) => {
const palaceName = palaceNames[palace] || palace;
markdown += `### ${palaceName}\n\n`;
if (typeof analysis === 'object') {
if (analysis.stars) {
markdown += `**星曜:** ${Array.isArray(analysis.stars) ? analysis.stars.join('、') : analysis.stars}\n`;
}
if (analysis.analysis) {
markdown += `**分析:** ${analysis.analysis}\n`;
}
if (analysis.fortune) {
markdown += `**运势:** ${analysis.fortune}\n`;
}
} else {
markdown += `${analysis}\n`;
}
markdown += `\n`;
});
}
// 四化分析
if (analysisData.sihua_analysis) {
markdown += `## 🔄 四化分析\n\n`;
const sihuaNames = {
lu: '化禄',
quan: '化权',
ke: '化科',
ji: '化忌'
};
Object.entries(analysisData.sihua_analysis).forEach(([sihua, analysis]) => {
const sihuaName = sihuaNames[sihua] || sihua;
markdown += `### ${sihuaName}\n\n`;
markdown += `${analysis}\n\n`;
});
}
// 大运分析
if (analysisData.major_periods) {
markdown += `## 📅 大运分析\n\n`;
if (Array.isArray(analysisData.major_periods)) {
analysisData.major_periods.forEach((period, index) => {
markdown += `### 第${index + 1}大运 (${period.age_range || period.years || '年龄段'})\n\n`;
if (period.main_star) {
markdown += `**主星:** ${period.main_star}\n`;
}
if (period.fortune) {
markdown += `**运势:** ${period.fortune}\n`;
}
if (period.analysis) {
markdown += `**分析:** ${period.analysis}\n`;
}
if (period.advice) {
markdown += `**建议:** ${period.advice}\n`;
}
markdown += `\n`;
});
}
}
// 综合分析
if (analysisData.comprehensive_analysis) {
markdown += `## 🎯 综合分析\n\n`;
['personality', 'career', 'wealth', 'relationship', 'health'].forEach(aspect => {
if (analysisData.comprehensive_analysis[aspect]) {
const aspectNames = {
personality: '性格特质',
career: '事业发展',
wealth: '财运分析',
relationship: '感情婚姻',
health: '健康状况'
};
markdown += `### ${aspectNames[aspect]}\n\n`;
markdown += `${analysisData.comprehensive_analysis[aspect]}\n\n`;
}
});
}
// 页脚
markdown += `---\n\n`;
markdown += `*本报告由神机阁AI命理分析平台生成*\n`;
markdown += `*生成时间:${timestamp}*\n`;
markdown += `*仅供参考,请理性对待*\n`;
return markdown;
};
/**
* 将卦象符号转换为ASCII字符组合
*/
const convertHexagramSymbol = (symbol) => {
// 卦象符号到ASCII的映射表竖向排列从上到下
const symbolMap = {
'䷀': '___\n___\n___\n___\n___\n___', // 乾卦(六阳爻)
'䷁': '_ _\n_ _\n_ _\n_ _\n_ _\n_ _', // 坤卦(六阴爻)
'䷂': '_ _\n_ _\n_ _\n___\n_ _\n___', // 屯卦
'䷃': '___\n_ _\n___\n_ _\n_ _\n_ _', // 蒙卦
'䷄': '_ _\n_ _\n___\n___\n___\n___', // 需卦
'䷅': '___\n___\n___\n_ _\n___\n_ _', // 讼卦
'䷆': '_ _\n_ _\n_ _\n_ _\n___\n_ _', // 师卦
'䷇': '_ _\n___\n_ _\n_ _\n_ _\n_ _', // 比卦
'䷈': '___\n___\n___\n_ _\n___\n___', // 小畜卦
'䷉': '_ _\n___\n___\n___\n___\n___', // 履卦
'䷊': '_ _\n_ _\n_ _\n___\n___\n___', // 泰卦
'䷋': '___\n___\n___\n_ _\n_ _\n_ _', // 否卦
'䷌': '_ _\n_ _\n___\n___\n___\n___', // 同人卦
'䷍': '___\n___\n___\n___\n_ _\n___', // 大有卦
'䷎': '_ _\n_ _\n_ _\n___\n_ _\n_ _', // 谦卦
'䷏': '_ _\n_ _\n___\n_ _\n_ _\n_ _', // 豫卦
'䷐': '_ _\n_ _\n___\n___\n_ _\n___', // 随卦
'䷑': '___\n_ _\n___\n___\n_ _\n_ _', // 蛊卦
'䷒': '_ _\n_ _\n_ _\n_ _\n___\n___', // 临卦
'䷓': '___\n___\n_ _\n_ _\n_ _\n_ _', // 观卦
'䷔': '___\n_ _\n___\n_ _\n___\n_ _', // 噬嗑卦
'䷕': '___\n_ _\n___\n___\n_ _\n___', // 贲卦
'䷖': '___\n_ _\n_ _\n_ _\n_ _\n_ _', // 剥卦
'䷗': '_ _\n_ _\n_ _\n_ _\n_ _\n___', // 复卦
'䷘': '___\n_ _\n_ _\n___\n___\n___', // 无妄卦
'䷙': '___\n___\n___\n_ _\n_ _\n___', // 大畜卦
'䷚': '___\n_ _\n_ _\n_ _\n_ _\n___', // 颐卦
'䷛': '_ _\n___\n___\n___\n___\n_ _', // 大过卦
'䷜': '_ _\n___\n_ _\n_ _\n___\n_ _', // 坎卦
'䷝': '___\n_ _\n___\n___\n_ _\n___', // 离卦
'䷞': '_ _\n_ _\n___\n___\n___\n___', // 咸卦
'䷟': '___\n___\n___\n___\n_ _\n_ _', // 恒卦
'䷠': '_ _\n_ _\n___\n___\n___\n___', // 遁卦
'䷡': '___\n___\n___\n___\n___\n___', // 大壮卦
'䷢': '___\n___\n___\n___\n_ _\n___', // 晋卦
'䷣': '___\n_ _\n___\n_ _\n_ _\n_ _', // 明夷卦
'䷤': '___\n_ _\n___\n_ _\n___\n___', // 家人卦
'䷥': '___\n_ _\n___\n___\n_ _\n___', // 睽卦
'䷦': '_ _\n___\n_ _\n_ _\n_ _\n___', // 蹇卦
'䷧': '___\n_ _\n_ _\n_ _\n___\n_ _', // 解卦
'䷨': '___\n_ _\n___\n_ _\n_ _\n___', // 损卦
'䷩': '___\n_ _\n_ _\n___\n_ _\n___', // 益卦
'䷪': '___\n___\n___\n___\n___\n_ _', // 夬卦
'䷫': '_ _\n___\n___\n___\n___\n___', // 姤卦
'䷬': '_ _\n_ _\n_ _\n___\n___\n___', // 萃卦
'䷭': '_ _\n_ _\n_ _\n___\n___\n___', // 升卦
'䷮': '_ _\n___\n_ _\n_ _\n_ _\n___', // 困卦
'䷯': '___\n_ _\n_ _\n_ _\n___\n___', // 井卦
'䷰': '_ _\n___\n___\n___\n_ _\n___', // 革卦
'䷱': '___\n_ _\n___\n___\n___\n_ _', // 鼎卦
'䷲': '_ _\n_ _\n___\n_ _\n_ _\n___', // 震卦
'䷳': '___\n_ _\n_ _\n___\n_ _\n_ _', // 艮卦
'䷴': '_ _\n_ _\n___\n___\n_ _\n___', // 渐卦
'䷵': '___\n_ _\n___\n___\n_ _\n_ _', // 归妹卦
'䷶': '___\n_ _\n___\n___\n_ _\n___', // 丰卦
'䷷': '___\n_ _\n___\n_ _\n_ _\n___', // 旅卦
'䷸': '_ _\n___\n___\n_ _\n___\n___', // 巽卦
'䷹': '_ _\n___\n___\n_ _\n___\n___', // 兑卦
'䷺': '_ _\n___\n_ _\n_ _\n___\n___', // 涣卦
'䷻': '_ _\n___\n___\n_ _\n_ _\n___', // 节卦
'䷼': '_ _\n___\n___\n_ _\n___\n___', // 中孚卦
'䷽': '_ _\n_ _\n___\n___\n_ _\n_ _', // 小过卦
'䷾': '___\n_ _\n___\n_ _\n___\n_ _', // 既济卦
'䷿': '_ _\n___\n_ _\n___\n_ _\n___' // 未济卦
};
return symbolMap[symbol] || symbol || '___\n___\n___\n___\n___\n___';
};
/**
* 生成易经占卜Markdown文档
*/
const generateYijingMarkdown = (analysisData, userName) => {
const timestamp = new Date().toLocaleString('zh-CN');
let markdown = `# 易经占卜分析报告\n\n`;
// 从userName中提取实际姓名去掉"占卜_"前缀
const actualUserName = userName ? userName.replace(/^占卜_/, '') : '用户';
markdown += `**占卜者:** ${actualUserName}\n`;
markdown += `**生成时间:** ${timestamp}\n`;
markdown += `**分析类型:** 易经占卜\n\n`;
markdown += `---\n\n`;
// 占卜问题 - 适配实际数据结构
if (analysisData.basic_info?.divination_data) {
markdown += `## ❓ 占卜问题\n\n`;
const divination = analysisData.basic_info.divination_data;
if (divination.question) {
markdown += `**问题:** ${divination.question}\n\n`;
}
if (divination.method) {
markdown += `**起卦方法:** ${divination.method}\n\n`;
}
if (divination.divination_time) {
const time = new Date(divination.divination_time).toLocaleString('zh-CN');
markdown += `**占卜时间:** ${time}\n\n`;
}
// 添加问题分析信息
if (analysisData.dynamic_guidance?.question_analysis) {
const questionAnalysis = analysisData.dynamic_guidance.question_analysis;
if (questionAnalysis.type) {
markdown += `**问题类型:** ${questionAnalysis.type}\n\n`;
}
if (questionAnalysis.focus) {
markdown += `**关注重点:** ${questionAnalysis.focus}\n\n`;
}
}
}
// 卦象信息 - 适配实际数据结构
if (analysisData.basic_info?.hexagram_info) {
markdown += `## 🔮 卦象信息\n\n`;
const hexInfo = analysisData.basic_info.hexagram_info;
// 主卦信息
if (hexInfo.main_hexagram) {
markdown += `### 主卦\n\n`;
markdown += `**卦名:** ${hexInfo.main_hexagram}\n`;
if (hexInfo.main_hexagram_symbol) {
markdown += `**卦象:**\n${convertHexagramSymbol(hexInfo.main_hexagram_symbol)}\n`;
}
if (hexInfo.main_hexagram_number) {
markdown += `**卦序:** 第${hexInfo.main_hexagram_number}\n`;
}
markdown += `\n`;
}
// 变卦信息
if (hexInfo.changing_hexagram && hexInfo.changing_hexagram !== '无') {
markdown += `### 变卦\n\n`;
markdown += `**卦名:** ${hexInfo.changing_hexagram}\n`;
if (hexInfo.changing_hexagram_symbol && hexInfo.changing_hexagram_symbol !== '无') {
markdown += `**卦象:**\n${convertHexagramSymbol(hexInfo.changing_hexagram_symbol)}\n`;
}
markdown += `\n`;
}
// 八卦结构
if (hexInfo.hexagram_structure) {
markdown += `### 八卦结构\n\n`;
const structure = hexInfo.hexagram_structure;
if (structure.upper_trigram) {
markdown += `**上卦:** ${structure.upper_trigram.name} (${structure.upper_trigram.nature})\n`;
}
if (structure.lower_trigram) {
markdown += `**下卦:** ${structure.lower_trigram.name} (${structure.lower_trigram.nature})\n`;
}
markdown += `\n`;
}
// 动爻信息
if (hexInfo.changing_lines && hexInfo.changing_lines.length > 0) {
markdown += `### 动爻\n\n`;
markdown += `**动爻位置:** ${hexInfo.changing_lines.join('、')}\n\n`;
}
}
// 卦辞分析 - 适配实际数据结构
if (analysisData.detailed_analysis?.hexagram_analysis) {
markdown += `## 📜 卦辞分析\n\n`;
const hexAnalysis = analysisData.detailed_analysis.hexagram_analysis;
if (hexAnalysis.primary_meaning) {
markdown += `### 卦象含义\n\n`;
markdown += `${hexAnalysis.primary_meaning}\n\n`;
}
if (hexAnalysis.judgment) {
markdown += `### 彖传\n\n`;
markdown += `> ${hexAnalysis.judgment}\n\n`;
}
if (hexAnalysis.image) {
markdown += `### 象传\n\n`;
markdown += `> ${hexAnalysis.image}\n\n`;
}
if (hexAnalysis.trigram_analysis) {
markdown += `### 八卦组合分析\n\n`;
markdown += `${hexAnalysis.trigram_analysis}\n\n`;
}
if (hexAnalysis.five_elements) {
markdown += `### 五行分析\n\n`;
if (typeof hexAnalysis.five_elements === 'object') {
Object.entries(hexAnalysis.five_elements).forEach(([key, value]) => {
markdown += `**${key}** ${value}\n`;
});
} else {
markdown += `${hexAnalysis.five_elements}\n`;
}
markdown += `\n`;
}
}
// 动爻分析
if (analysisData.detailed_analysis?.changing_lines_analysis) {
markdown += `## 🔄 动爻分析\n\n`;
const changingAnalysis = analysisData.detailed_analysis.changing_lines_analysis;
if (changingAnalysis.changing_lines_count) {
markdown += `**动爻数量:** ${changingAnalysis.changing_lines_count}\n\n`;
}
if (typeof changingAnalysis === 'object' && changingAnalysis.analysis) {
markdown += `${changingAnalysis.analysis}\n\n`;
} else if (typeof changingAnalysis === 'string') {
markdown += `${changingAnalysis}\n\n`;
}
}
// 变卦分析
if (analysisData.detailed_analysis?.changing_hexagram_analysis) {
markdown += `## 🔀 变卦分析\n\n`;
const changingHexAnalysis = analysisData.detailed_analysis.changing_hexagram_analysis;
if (changingHexAnalysis.meaning) {
markdown += `### 变卦含义\n\n`;
markdown += `${changingHexAnalysis.meaning}\n\n`;
}
if (changingHexAnalysis.transformation_insight) {
markdown += `### 转化洞察\n\n`;
markdown += `${changingHexAnalysis.transformation_insight}\n\n`;
}
if (changingHexAnalysis.guidance) {
markdown += `### 变化指导\n\n`;
markdown += `${changingHexAnalysis.guidance}\n\n`;
}
if (changingHexAnalysis.timing) {
markdown += `### 时机把握\n\n`;
markdown += `${changingHexAnalysis.timing}\n\n`;
}
// 兼容旧格式
if (typeof changingHexAnalysis === 'object' && changingHexAnalysis.analysis) {
markdown += `${changingHexAnalysis.analysis}\n\n`;
} else if (typeof changingHexAnalysis === 'string') {
markdown += `${changingHexAnalysis}\n\n`;
}
}
// 高级分析(互卦、错卦、综卦)
if (analysisData.detailed_analysis?.advanced_analysis) {
markdown += `## 🔍 高级分析\n\n`;
const advanced = analysisData.detailed_analysis.advanced_analysis;
if (advanced.inter_hexagram) {
markdown += `### 互卦 - ${advanced.inter_hexagram.name}\n\n`;
markdown += `**卦象:**\n${convertHexagramSymbol(advanced.inter_hexagram.symbol)}\n`;
markdown += `**含义:** ${advanced.inter_hexagram.meaning}\n`;
if (advanced.inter_hexagram.analysis) {
markdown += `**分析:** ${advanced.inter_hexagram.analysis}\n`;
}
markdown += `\n`;
}
if (advanced.opposite_hexagram) {
markdown += `### 错卦 - ${advanced.opposite_hexagram.name}\n\n`;
markdown += `**卦象:**\n${convertHexagramSymbol(advanced.opposite_hexagram.symbol)}\n`;
markdown += `**含义:** ${advanced.opposite_hexagram.meaning}\n`;
if (advanced.opposite_hexagram.analysis) {
markdown += `**分析:** ${advanced.opposite_hexagram.analysis}\n`;
}
markdown += `\n`;
}
if (advanced.reverse_hexagram) {
markdown += `### 综卦 - ${advanced.reverse_hexagram.name}\n\n`;
markdown += `**卦象:**\n${convertHexagramSymbol(advanced.reverse_hexagram.symbol)}\n`;
markdown += `**含义:** ${advanced.reverse_hexagram.meaning}\n`;
if (advanced.reverse_hexagram.analysis) {
markdown += `**分析:** ${advanced.reverse_hexagram.analysis}\n`;
}
markdown += `\n`;
}
// 四卦综合洞察
if (advanced.comprehensive_insight) {
markdown += `### 四卦综合洞察\n\n`;
markdown += `${advanced.comprehensive_insight}\n\n`;
}
}
// 象数分析 - 适配实际数据结构
if (analysisData.detailed_analysis?.numerology_analysis) {
markdown += `## 🔢 象数分析\n\n`;
const numerology = analysisData.detailed_analysis.numerology_analysis;
if (numerology.upper_trigram_analysis || numerology.upper_trigram_number) {
markdown += `### 上卦数理\n\n`;
const upper = numerology.upper_trigram_analysis || numerology.upper_trigram_number;
if (upper.number) {
markdown += `**数字:** ${upper.number}\n`;
}
if (upper.personalized_meaning || upper.meaning) {
markdown += `**含义:** ${upper.personalized_meaning || upper.meaning}\n`;
}
if (upper.environmental_influence || upper.influence) {
markdown += `**影响:** ${upper.environmental_influence || upper.influence}\n`;
}
markdown += `\n`;
}
if (numerology.lower_trigram_analysis || numerology.lower_trigram_number) {
markdown += `### 下卦数理\n\n`;
const lower = numerology.lower_trigram_analysis || numerology.lower_trigram_number;
if (lower.number) {
markdown += `**数字:** ${lower.number}\n`;
}
if (lower.personalized_meaning || lower.meaning) {
markdown += `**含义:** ${lower.personalized_meaning || lower.meaning}\n`;
}
if (lower.environmental_influence || lower.influence) {
markdown += `**影响:** ${lower.environmental_influence || lower.influence}\n`;
}
markdown += `\n`;
}
if (numerology.combined_energy) {
markdown += `### 组合能量\n\n`;
const combined = numerology.combined_energy;
if (combined.total_number || combined.total) {
markdown += `**总数:** ${combined.total_number || combined.total}\n`;
}
if (combined.interpretation) {
markdown += `**解释:** ${combined.interpretation}\n`;
}
if (combined.harmony_analysis?.description || combined.harmony) {
markdown += `**和谐度:** ${combined.harmony_analysis?.description || combined.harmony}\n`;
}
markdown += `\n`;
}
// 时间共振分析
if (numerology.time_space_resonance || numerology.time_resonance) {
markdown += `### 时间共振\n\n`;
const timeResonance = numerology.time_space_resonance || numerology.time_resonance;
if (timeResonance.number_time_harmony?.level || timeResonance.resonance_number) {
markdown += `**共振等级:** ${timeResonance.number_time_harmony?.level || timeResonance.resonance_number}\n`;
}
if (timeResonance.time_energy?.description || timeResonance.meaning) {
markdown += `**时间能量:** ${timeResonance.time_energy?.description || timeResonance.meaning}\n`;
}
if (timeResonance.optimal_action_time || timeResonance.interpretation) {
markdown += `**最佳时机:** ${timeResonance.optimal_action_time || timeResonance.interpretation}\n`;
}
markdown += `\n`;
}
}
// 五行分析 - 详细内容
if (analysisData.detailed_analysis?.hexagram_analysis?.five_elements) {
markdown += `## 🧭 五行分析\n\n`;
const fiveElements = analysisData.detailed_analysis.hexagram_analysis.five_elements;
markdown += `### 五行属性\n\n`;
if (fiveElements.upper_element) {
markdown += `**上卦五行:** ${fiveElements.upper_element}\n`;
}
if (fiveElements.lower_element) {
markdown += `**下卦五行:** ${fiveElements.lower_element}\n`;
}
markdown += `\n`;
if (fiveElements.relationship) {
markdown += `### 五行关系\n\n`;
markdown += `**相互作用:** ${fiveElements.relationship}\n`;
}
if (fiveElements.balance) {
markdown += `**平衡状态:** ${fiveElements.balance}\n`;
}
markdown += `\n`;
}
// 时间分析
if (analysisData.dynamic_guidance?.time_analysis) {
markdown += `## ⏰ 时间分析\n\n`;
const timeAnalysis = analysisData.dynamic_guidance.time_analysis;
if (timeAnalysis.seasonal_energy) {
markdown += `### 季节能量\n\n`;
if (timeAnalysis.seasonal_energy.season) {
markdown += `**当前季节:** ${timeAnalysis.seasonal_energy.season}\n`;
}
if (timeAnalysis.seasonal_energy.energy) {
markdown += `**季节能量:** ${timeAnalysis.seasonal_energy.energy}\n`;
}
if (timeAnalysis.seasonal_energy.advice) {
markdown += `**季节建议:** ${timeAnalysis.seasonal_energy.advice}\n`;
}
markdown += `\n`;
}
if (timeAnalysis.lunar_phase) {
markdown += `### 月相影响\n\n`;
if (timeAnalysis.lunar_phase.phase) {
markdown += `**月相:** ${timeAnalysis.lunar_phase.phase}\n`;
}
if (timeAnalysis.lunar_phase.energy) {
markdown += `**月相能量:** ${timeAnalysis.lunar_phase.energy}\n`;
}
if (timeAnalysis.lunar_phase.advice) {
markdown += `**月相建议:** ${timeAnalysis.lunar_phase.advice}\n`;
}
markdown += `\n`;
}
if (timeAnalysis.energy_state) {
markdown += `### 能量状态\n\n`;
if (timeAnalysis.energy_state.overall) {
markdown += `**整体状态:** ${timeAnalysis.energy_state.overall}\n`;
}
if (timeAnalysis.energy_state.recommendation) {
markdown += `**能量建议:** ${timeAnalysis.energy_state.recommendation}\n`;
}
markdown += `\n`;
}
}
// 针对性指导
if (analysisData.dynamic_guidance?.targeted_guidance) {
markdown += `## 🎯 针对性指导\n\n`;
markdown += `### 专业分析\n\n`;
markdown += `${analysisData.dynamic_guidance.targeted_guidance}\n\n`;
}
// 动态指导 - 整合所有动态指导内容
if (analysisData.dynamic_guidance) {
markdown += `## 🎯 动态指导\n\n`;
const guidance = analysisData.dynamic_guidance;
if (guidance.current_situation_analysis) {
markdown += `### 当前状况分析\n\n`;
markdown += `${guidance.current_situation_analysis}\n\n`;
}
if (guidance.development_trend) {
markdown += `### 发展趋势\n\n`;
markdown += `${guidance.development_trend}\n\n`;
}
if (guidance.practical_advice) {
markdown += `### 实用建议\n\n`;
markdown += `${guidance.practical_advice}\n\n`;
}
if (guidance.timing_guidance) {
markdown += `### 时机把握\n\n`;
markdown += `${guidance.timing_guidance}\n\n`;
}
}
// 易经智慧
if (analysisData.divination_wisdom) {
markdown += `## 🌟 易经智慧\n\n`;
const wisdom = analysisData.divination_wisdom;
if (wisdom.key_message) {
markdown += `### 核心信息\n\n`;
markdown += `${wisdom.key_message}\n\n`;
}
if (wisdom.action_advice) {
markdown += `### 行动建议\n\n`;
markdown += `${wisdom.action_advice}\n\n`;
}
if (wisdom.timing_guidance) {
markdown += `### 时机把握\n\n`;
markdown += `${wisdom.timing_guidance}\n\n`;
}
}
// 哲学洞察 - 独立章节
if (analysisData.divination_wisdom?.philosophical_insight) {
markdown += `## 📖 哲学洞察\n\n`;
markdown += `${analysisData.divination_wisdom.philosophical_insight}\n\n`;
}
// 综合解读
if (analysisData.comprehensive_interpretation) {
markdown += `## 🎯 综合解读\n\n`;
if (analysisData.comprehensive_interpretation.current_situation) {
markdown += `### 当前状况\n\n`;
markdown += `${analysisData.comprehensive_interpretation.current_situation}\n\n`;
}
if (analysisData.comprehensive_interpretation.development_trend) {
markdown += `### 发展趋势\n\n`;
markdown += `${analysisData.comprehensive_interpretation.development_trend}\n\n`;
}
if (analysisData.comprehensive_interpretation.action_advice) {
markdown += `### 行动建议\n\n`;
if (Array.isArray(analysisData.comprehensive_interpretation.action_advice)) {
analysisData.comprehensive_interpretation.action_advice.forEach(advice => {
markdown += `- ${advice}\n`;
});
} else {
markdown += `${analysisData.comprehensive_interpretation.action_advice}\n`;
}
markdown += `\n`;
}
if (analysisData.comprehensive_interpretation.timing_guidance) {
markdown += `### 时机指导\n\n`;
markdown += `${analysisData.comprehensive_interpretation.timing_guidance}\n\n`;
}
}
// 注意事项
if (analysisData.precautions) {
markdown += `## ⚠️ 注意事项\n\n`;
if (Array.isArray(analysisData.precautions)) {
analysisData.precautions.forEach(precaution => {
markdown += `- ${precaution}\n`;
});
} else {
markdown += `${analysisData.precautions}\n`;
}
markdown += `\n`;
}
// 页脚
markdown += `---\n\n`;
markdown += `*本报告由神机阁AI命理分析平台生成*\n`;
markdown += `*生成时间:${timestamp}*\n`;
markdown += `*仅供参考,请理性对待*\n`;
return markdown;
};
/**
* 生成奇门遁甲Markdown文档
*/
const generateQimenMarkdown = (analysisData, userName) => {
const timestamp = new Date().toLocaleString('zh-CN');
// 字段名称中文映射
const fieldNameMap = {
'question': '问题',
'method': '起局方法',
'divination_time': '起局时间',
'jieqi': '节气',
'yuan': '元',
'jushu': '局数',
'yindun': '阴阳遁',
'ganzhi': '干支',
'year': '年柱',
'month': '月柱',
'day': '日柱',
'hour': '时柱',
'gan': '干',
'zhi': '支',
'zhifu': '值符',
'zhishi': '值使',
'star': '九星',
'door': '八门',
'god': '八神',
'primary': '主用神',
'secondary': '次用神',
'overall': '综合评估',
'favorability': '有利度',
'strength': '力量强度',
'timing': '时机评估',
'recommendation': '建议',
'element': '天干',
'position': '宫位',
'palaceName': '宫位名称',
'wangshui': '旺衰',
'wangshuiScore': '旺衰评分',
'palaceRelation': '宫位关系',
'palaceHarmony': '宫位和谐度',
'seasonalInfluence': '季节影响',
'seasonalScore': '季节评分',
'totalScore': '综合评分',
'status': '状态',
'description': '详细描述',
'name': '名称',
'type': '类型',
'level': '等级',
'influence': '影响',
'probability': '成功概率',
'analysis': '详细分析',
'key_factors': '关键因素',
'timing_advice': '时机建议',
'action_suggestions': '行动建议',
'precautions': '注意事项',
'wuxing_analysis': '五行分析',
'timing_analysis': '时机分析',
'zhifuAnalysis': '值符分析',
'zhishiAnalysis': '值使分析',
'hourAnalysis': '时辰分析',
'seasonAnalysis': '节气分析',
'yindunAnalysis': '阴阳遁分析',
'score': '评分',
'factors': '影响因素',
// 财运相关字段
'profit': '利润',
'investment': '投资',
'wealth': '财富',
'money': '金钱',
'finance': '财务',
'business': '生意',
'career': '事业',
'work': '工作',
'job': '职业',
'success': '成功',
'failure': '失败',
'opportunity': '机会',
'risk': '风险',
'challenge': '挑战',
'advantage': '优势',
'disadvantage': '劣势',
// 用神分析字段
'matter': '事情',
'result': '结果',
'self': '自身',
'opponent': '对手',
'helper': '帮助者',
'obstacle': '阻碍',
// 五行分析字段
'dominant': '主导五行',
'balance': '平衡状态',
'suggestions': '建议',
'notes': '备注',
'season': '季节',
// 时机分析字段
'favorable': '有利',
'unfavorable': '不利',
'neutral': '中性',
// 其他常见字段
'true': '是',
'false': '否',
'unknown': '未知',
'good': '好',
'bad': '差',
'excellent': '极佳',
'poor': '很差',
'average': '一般',
// 感情相关字段
'spouse': '配偶',
'relationship': '感情关系',
'matchmaker': '媒人',
'marriage_palace': '婚姻宫',
'relationship_door': '感情门',
'love': '爱情',
'marriage': '婚姻',
'partner': '伴侣',
'emotion': '情感',
'affection': '感情',
'romance': '浪漫',
'compatibility': '相配度',
'harmony': '和谐度',
'conflict': '冲突',
'separation': '分离',
'reunion': '复合',
'commitment': '承诺',
'trust': '信任',
'loyalty': '忠诚'
};
// 获取中文字段名
const getChineseFieldName = (fieldName) => {
return fieldNameMap[fieldName] || fieldName;
};
let markdown = `# 奇门遁甲分析报告\n\n`;
// 从userName中提取实际姓名去掉"奇门_"前缀
const actualUserName = userName ? userName.replace(/^奇门_/, '') : '用户';
markdown += `**占卜者:** ${actualUserName}\n`;
markdown += `**生成时间:** ${timestamp}\n`;
markdown += `**分析类型:** 奇门遁甲\n\n`;
markdown += `---\n\n`;
// 占卜问题
if (analysisData.basic_info?.divination_data) {
markdown += `## ❓ 占卜问题\n\n`;
const divination = analysisData.basic_info.divination_data;
if (divination.question) {
markdown += `**问题:** ${divination.question}\n\n`;
}
if (divination.method) {
markdown += `**起局方法:** ${divination.method}\n\n`;
}
if (divination.divination_time) {
const time = new Date(divination.divination_time).toLocaleString('zh-CN');
markdown += `**起局时间:** ${time}\n\n`;
}
}
// 时空信息
if (analysisData.basic_info?.qimen_info) {
markdown += `## ⏰ 时空信息\n\n`;
const qimenInfo = analysisData.basic_info.qimen_info;
if (qimenInfo.jieqi) {
markdown += `**节气:** ${qimenInfo.jieqi}\n`;
}
if (qimenInfo.yuan) {
markdown += `**元:** ${qimenInfo.yuan}\n`;
}
if (qimenInfo.jushu) {
markdown += `**局数:** ${qimenInfo.jushu}\n`;
}
if (qimenInfo.yindun !== undefined) {
markdown += `**阴阳遁:** ${qimenInfo.yindun ? '阴遁' : '阳遁'}\n`;
}
// 干支四柱
if (qimenInfo.ganzhi) {
markdown += `\n### 🎋 干支四柱\n\n`;
const ganzhi = qimenInfo.ganzhi;
if (ganzhi.year) markdown += `- **年柱:** ${ganzhi.year.gan}${ganzhi.year.zhi}\n`;
if (ganzhi.month) markdown += `- **月柱:** ${ganzhi.month.gan}${ganzhi.month.zhi}\n`;
if (ganzhi.day) markdown += `- **日柱:** ${ganzhi.day.gan}${ganzhi.day.zhi}\n`;
if (ganzhi.hour) markdown += `- **时柱:** ${ganzhi.hour.gan}${ganzhi.hour.zhi}\n`;
}
// 值符值使
if (qimenInfo.zhifu || qimenInfo.zhishi) {
markdown += `\n### ⭐ 值符值使\n\n`;
if (qimenInfo.zhifu) markdown += `- **值符:** ${qimenInfo.zhifu}\n`;
if (qimenInfo.zhishi) markdown += `- **值使:** ${qimenInfo.zhishi}\n`;
}
markdown += `\n`;
}
// 奇门盘布局
if (analysisData.detailed_analysis?.qimen_pan) {
markdown += `## 🔮 奇门盘布局\n\n`;
const qimenPan = analysisData.detailed_analysis.qimen_pan;
if (qimenPan.dipan && Array.isArray(qimenPan.dipan)) {
const palaceNames = ['坎一宫', '坤二宫', '震三宫', '巽四宫', '中五宫', '乾六宫', '兑七宫', '艮八宫', '离九宫'];
markdown += `| 宫位 | 九星 | 八门 | 八神 |\n`;
markdown += `|------|------|------|------|\n`;
qimenPan.dipan.forEach((palace, index) => {
if (palace && palaceNames[index]) {
const star = palace.star || '-';
const door = palace.door || '-';
const god = palace.god || '-';
markdown += `| ${palaceNames[index]} | ${star} | ${door} | ${god} |\n`;
}
});
markdown += `\n`;
}
}
// 用神分析
if (analysisData.detailed_analysis?.yongshen_analysis) {
markdown += `## 🎯 用神分析\n\n`;
const yongShenAnalysis = analysisData.detailed_analysis.yongshen_analysis;
// 主用神
if (yongShenAnalysis.primary) {
markdown += `### 主用神\n\n`;
Object.entries(yongShenAnalysis.primary).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
if (typeof value === 'object' && value !== null) {
markdown += `**${chineseKey}**\n`;
Object.entries(value).forEach(([subKey, subValue]) => {
const chineseSubKey = getChineseFieldName(subKey);
markdown += `- ${chineseSubKey}${subValue}\n`;
});
} else {
markdown += `- **${chineseKey}** ${value}\n`;
}
});
markdown += `\n`;
}
// 次用神
if (yongShenAnalysis.secondary) {
markdown += `### 次用神\n\n`;
Object.entries(yongShenAnalysis.secondary).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
if (typeof value === 'object' && value !== null) {
markdown += `**${chineseKey}**\n`;
Object.entries(value).forEach(([subKey, subValue]) => {
const chineseSubKey = getChineseFieldName(subKey);
markdown += `- ${chineseSubKey}${subValue}\n`;
});
} else {
markdown += `- **${chineseKey}** ${value}\n`;
}
});
markdown += `\n`;
}
// 综合评估
if (yongShenAnalysis.overall) {
markdown += `### 用神综合评估\n\n`;
if (typeof yongShenAnalysis.overall === 'object') {
Object.entries(yongShenAnalysis.overall).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
if (typeof value === 'object' && value !== null) {
if (Array.isArray(value)) {
markdown += `- **${chineseKey}** ${value.join('、')}\n`;
} else {
const subEntries = Object.entries(value).map(([subK, subV]) => {
const chineseSubKey = getChineseFieldName(subK);
return `${chineseSubKey}${subV}`;
}).join('');
markdown += `- **${chineseKey}** ${subEntries}\n`;
}
} else {
markdown += `- **${chineseKey}** ${value}\n`;
}
});
} else {
markdown += `${yongShenAnalysis.overall}\n`;
}
markdown += `\n`;
}
}
// 格局识别
if (analysisData.detailed_analysis?.pattern_analysis && Array.isArray(analysisData.detailed_analysis.pattern_analysis)) {
markdown += `## ⭐ 格局识别\n\n`;
const patterns = analysisData.detailed_analysis.pattern_analysis;
const auspiciousPatterns = patterns.filter(p => p.type === 'auspicious');
const inauspiciousPatterns = patterns.filter(p => p.type === 'inauspicious');
const neutralPatterns = patterns.filter(p => p.type === 'neutral');
if (auspiciousPatterns.length > 0) {
markdown += `### 🌟 吉利格局\n\n`;
auspiciousPatterns.forEach(pattern => {
markdown += `**${pattern.name}** (${pattern.level || '吉'})\n`;
if (pattern.description) markdown += `${pattern.description}\n`;
if (pattern.influence) markdown += `**影响:** ${pattern.influence}\n`;
markdown += `\n`;
});
}
if (neutralPatterns.length > 0) {
markdown += `### ⚖️ 中性格局\n\n`;
neutralPatterns.forEach(pattern => {
markdown += `**${pattern.name}** (${pattern.level || '中'})\n`;
if (pattern.description) markdown += `${pattern.description}\n`;
if (pattern.influence) markdown += `**影响:** ${pattern.influence}\n`;
markdown += `\n`;
});
}
if (inauspiciousPatterns.length > 0) {
markdown += `### ⚠️ 不利格局\n\n`;
inauspiciousPatterns.forEach(pattern => {
markdown += `**${pattern.name}** (${pattern.level || '凶'})\n`;
if (pattern.description) markdown += `${pattern.description}\n`;
if (pattern.influence) markdown += `**影响:** ${pattern.influence}\n`;
markdown += `\n`;
});
}
}
// 预测结果
if (analysisData.prediction_result) {
markdown += `## 🔮 预测结果\n\n`;
const prediction = analysisData.prediction_result;
if (prediction.probability !== undefined) {
markdown += `### 成功概率\n\n`;
markdown += `**概率:** ${prediction.probability}%\n\n`;
let probabilityLevel = '';
if (prediction.probability >= 80) probabilityLevel = '极高';
else if (prediction.probability >= 60) probabilityLevel = '较高';
else if (prediction.probability >= 40) probabilityLevel = '中等';
else if (prediction.probability >= 20) probabilityLevel = '较低';
else probabilityLevel = '很低';
markdown += `**评级:** ${probabilityLevel}\n\n`;
}
if (prediction.analysis) {
markdown += `### 详细分析\n\n`;
if (typeof prediction.analysis === 'object') {
Object.entries(prediction.analysis).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
markdown += `**${chineseKey}** ${value}\n`;
});
} else {
markdown += `${prediction.analysis}\n`;
}
markdown += `\n`;
}
if (prediction.key_factors) {
markdown += `### 关键因素\n\n`;
if (typeof prediction.key_factors === 'object') {
Object.entries(prediction.key_factors).forEach(([factor, impact]) => {
const chineseFactor = getChineseFieldName(factor);
markdown += `- **${chineseFactor}** ${impact}\n`;
});
} else {
markdown += `${prediction.key_factors}\n`;
}
markdown += `\n`;
}
}
// 指导建议
if (analysisData.guidance) {
markdown += `## 💡 指导建议\n\n`;
const guidance = analysisData.guidance;
if (guidance.timing_advice) {
markdown += `### ⏰ 时机建议\n\n`;
if (typeof guidance.timing_advice === 'object') {
Object.entries(guidance.timing_advice).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
markdown += `**${chineseKey}** ${value}\n`;
});
} else {
markdown += `${guidance.timing_advice}\n`;
}
markdown += `\n`;
}
if (guidance.action_suggestions && Array.isArray(guidance.action_suggestions)) {
markdown += `### 🎯 行动建议\n\n`;
guidance.action_suggestions.forEach(suggestion => {
markdown += `- ${suggestion}\n`;
});
markdown += `\n`;
}
if (guidance.precautions && Array.isArray(guidance.precautions)) {
markdown += `### ⚠️ 注意事项\n\n`;
guidance.precautions.forEach(precaution => {
markdown += `- ${precaution}\n`;
});
markdown += `\n`;
}
}
// 五行分析
if (analysisData.detailed_analysis?.wuxing_analysis) {
markdown += `## 🌟 五行分析\n\n`;
const wuxingAnalysis = analysisData.detailed_analysis.wuxing_analysis;
if (typeof wuxingAnalysis === 'object') {
Object.entries(wuxingAnalysis).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
markdown += `**${chineseKey}** ${value}\n`;
});
} else {
markdown += `${wuxingAnalysis}\n`;
}
markdown += `\n`;
}
// 时机分析
if (analysisData.detailed_analysis?.timing_analysis) {
markdown += `## ⏰ 时机分析\n\n`;
const timingAnalysis = analysisData.detailed_analysis.timing_analysis;
if (typeof timingAnalysis === 'object') {
Object.entries(timingAnalysis).forEach(([key, value]) => {
const chineseKey = getChineseFieldName(key);
markdown += `**${chineseKey}** ${value}\n`;
});
} else {
markdown += `${timingAnalysis}\n`;
}
markdown += `\n`;
}
// 页脚
markdown += `---\n\n`;
markdown += `*本报告由神机阁AI命理分析平台生成*\n`;
markdown += `*生成时间:${timestamp}*\n`;
markdown += `*仅供参考,请理性对待*\n`;
return markdown;
};
module.exports = {
generateMarkdown
};