mirror of
https://github.com/patdelphi/suanming.git
synced 2026-02-27 21:23:12 +08:00
688 lines
28 KiB
Plaintext
688 lines
28 KiB
Plaintext
// 紫微斗数分析Edge Function - 真正的动态紫微斗数计算
|
|
Deno.serve(async (req) => {
|
|
const corsHeaders = {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
|
|
'Access-Control-Allow-Methods': 'POST, GET, OPTIONS, PUT, DELETE, PATCH',
|
|
'Access-Control-Max-Age': '86400',
|
|
'Access-Control-Allow-Credentials': 'false'
|
|
};
|
|
|
|
if (req.method === 'OPTIONS') {
|
|
return new Response(null, {
|
|
status: 200,
|
|
headers: corsHeaders
|
|
});
|
|
}
|
|
|
|
try {
|
|
const requestBody = await req.text();
|
|
console.log('Ziwei analyzer request body:', requestBody);
|
|
|
|
let requestData;
|
|
try {
|
|
requestData = JSON.parse(requestBody);
|
|
} catch (parseError) {
|
|
console.error('JSON parse error:', parseError);
|
|
return new Response(JSON.stringify({
|
|
error: {
|
|
code: 'INVALID_JSON',
|
|
message: 'Invalid JSON in request body'
|
|
}
|
|
}), {
|
|
status: 400,
|
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
});
|
|
}
|
|
|
|
const { user_id, birth_data } = requestData;
|
|
const reading_type = 'ziwei';
|
|
|
|
console.log('Ziwei analysis request:', { user_id, reading_type, birth_data });
|
|
|
|
if (!user_id || !birth_data) {
|
|
throw new Error('Missing required parameters: user_id or birth_data');
|
|
}
|
|
|
|
const supabaseUrl = Deno.env.get('SUPABASE_URL');
|
|
const supabaseKey = Deno.env.get('SUPABASE_SERVICE_ROLE_KEY');
|
|
|
|
if (!supabaseUrl || !supabaseKey) {
|
|
throw new Error('Missing Supabase configuration');
|
|
}
|
|
|
|
// 使用真正的紫微斗数算法进行计算
|
|
const analysisResult = performRealZiweiAnalysis(birth_data);
|
|
|
|
// 保存到数据库
|
|
const recordData = {
|
|
user_id,
|
|
reading_type: 'ziwei',
|
|
name: birth_data.name || null,
|
|
birth_date: birth_data.birth_date,
|
|
birth_time: birth_data.birth_time || null,
|
|
gender: birth_data.gender,
|
|
birth_place: birth_data.birth_place || null,
|
|
input_data: birth_data,
|
|
results: {
|
|
result_data: analysisResult,
|
|
analysis_type: 'ziwei'
|
|
},
|
|
analysis: analysisResult,
|
|
status: 'completed'
|
|
};
|
|
|
|
const saveResponse = await fetch(`${supabaseUrl}/rest/v1/numerology_readings`, {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Authorization': `Bearer ${supabaseKey}`,
|
|
'apikey': supabaseKey,
|
|
'Prefer': 'return=representation'
|
|
},
|
|
body: JSON.stringify(recordData)
|
|
});
|
|
|
|
if (!saveResponse.ok) {
|
|
const errorText = await saveResponse.text();
|
|
console.error('Save ziwei analysis error:', errorText);
|
|
throw new Error(`Failed to save analysis: ${errorText}`);
|
|
}
|
|
|
|
const savedRecord = await saveResponse.json();
|
|
console.log('Saved ziwei analysis successfully');
|
|
|
|
return new Response(JSON.stringify({
|
|
data: {
|
|
record_id: savedRecord[0]?.id,
|
|
analysis: analysisResult
|
|
}
|
|
}), {
|
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
});
|
|
|
|
} catch (error) {
|
|
console.error('Ziwei analysis error:', error);
|
|
return new Response(JSON.stringify({
|
|
error: {
|
|
code: 'ZIWEI_ANALYSIS_ERROR',
|
|
message: error.message || '紫微斗数分析过程中发生错误'
|
|
}
|
|
}), {
|
|
status: 500,
|
|
headers: { ...corsHeaders, 'Content-Type': 'application/json' }
|
|
});
|
|
}
|
|
});
|
|
|
|
// 真正的紫微斗数分析函数
|
|
function performRealZiweiAnalysis(birth_data) {
|
|
const { name, birth_date, birth_time, gender } = birth_data;
|
|
const personName = name || '您';
|
|
const personGender = gender === 'male' || gender === '男' ? '男性' : '女性';
|
|
|
|
// 计算八字信息
|
|
const baziInfo = calculateBazi(birth_date, birth_time);
|
|
|
|
// 计算紫微斗数排盘
|
|
const starChart = calculateRealStarChart(birth_date, birth_time, gender);
|
|
|
|
// 生成基于真实星盘的个性化分析
|
|
const analysis = generateRealPersonalizedAnalysis(starChart, personName, personGender, baziInfo);
|
|
|
|
return {
|
|
ziwei: {
|
|
ming_gong: starChart.mingGong,
|
|
ming_gong_xing: starChart.mingGongStars,
|
|
shi_er_gong: starChart.twelvePalaces,
|
|
si_hua: starChart.siHua,
|
|
da_xian: starChart.majorPeriods,
|
|
birth_chart: starChart.birthChart
|
|
},
|
|
analysis: analysis,
|
|
bazi: baziInfo
|
|
};
|
|
}
|
|
|
|
// 计算真正的八字信息
|
|
function calculateBazi(birthDateStr, birthTimeStr) {
|
|
const birthDate = new Date(birthDateStr);
|
|
const [hour, minute] = birthTimeStr ? birthTimeStr.split(':').map(Number) : [12, 0];
|
|
|
|
// 计算干支(简化版,实际应该使用更精确的天文计算)
|
|
const year = birthDate.getFullYear();
|
|
const month = birthDate.getMonth() + 1;
|
|
const day = birthDate.getDate();
|
|
|
|
const heavenlyStems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
|
|
const earthlyBranches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
|
|
|
|
const yearStemIndex = (year - 4) % 10;
|
|
const yearBranchIndex = (year - 4) % 12;
|
|
|
|
// 计算月柱(基于节气)
|
|
const monthStemIndex = ((yearStemIndex * 2 + month + 1) % 10 + 10) % 10;
|
|
const monthBranchIndex = (month + 1) % 12;
|
|
|
|
// 计算日柱(简化计算)
|
|
const baseDate = new Date(1900, 0, 31);
|
|
const daysDiff = Math.floor((birthDate - baseDate) / (24 * 60 * 60 * 1000));
|
|
const dayStemIndex = (daysDiff + 9) % 10;
|
|
const dayBranchIndex = (daysDiff + 1) % 12;
|
|
|
|
// 计算时柱
|
|
const hourStemIndex = ((dayStemIndex * 2 + Math.floor(hour / 2) + 2) % 10 + 10) % 10;
|
|
const hourBranchIndex = Math.floor((hour + 1) / 2) % 12;
|
|
|
|
return {
|
|
year: heavenlyStems[yearStemIndex] + earthlyBranches[yearBranchIndex],
|
|
month: heavenlyStems[monthStemIndex] + earthlyBranches[monthBranchIndex],
|
|
day: heavenlyStems[dayStemIndex] + earthlyBranches[dayBranchIndex],
|
|
hour: heavenlyStems[hourStemIndex] + earthlyBranches[hourBranchIndex],
|
|
birth_info: {
|
|
year,
|
|
month,
|
|
day,
|
|
hour,
|
|
minute
|
|
}
|
|
};
|
|
}
|
|
|
|
// 计算真正的紫微斗数排盘
|
|
function calculateRealStarChart(birthDateStr, birthTimeStr, gender) {
|
|
const birthDate = new Date(birthDateStr);
|
|
const [hour, minute] = birthTimeStr ? birthTimeStr.split(':').map(Number) : [12, 0];
|
|
|
|
const branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
|
|
const palaceNames = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
|
|
|
|
// 根据出生时间计算命宫位置(真正的紫微斗数算法)
|
|
const birthHour = hour + minute / 60;
|
|
const birthMonth = birthDate.getMonth() + 1;
|
|
const birthDay = birthDate.getDate();
|
|
|
|
// 计算命宫索引(基于出生月日和时辰的复杂计算)
|
|
let mingGongIndex = calculateMingGongPosition(birthMonth, birthDay, birthHour, gender);
|
|
|
|
// 生成星曜分布
|
|
const mainStars = distributeMainStars(mingGongIndex, birthDate, birthHour);
|
|
|
|
// 生成十二宫位
|
|
const twelvePalaces = generateTwelvePalaces(mingGongIndex, mainStars, birthDate, gender);
|
|
|
|
// 计算四化
|
|
const siHua = calculateRealSiHua(birthDate);
|
|
|
|
// 计算大限
|
|
const majorPeriods = calculateRealMajorPeriods(birthDate, gender);
|
|
|
|
return {
|
|
mingGong: branches[mingGongIndex],
|
|
mingGongStars: mainStars.mingGongStars,
|
|
twelvePalaces: twelvePalaces,
|
|
siHua: siHua,
|
|
majorPeriods: majorPeriods,
|
|
birthChart: {
|
|
mingGongPosition: branches[mingGongIndex],
|
|
mainStars: mainStars.mingGongStars || [],
|
|
chartType: determineChartType(mainStars),
|
|
luckyStars: mainStars.luckyStars || [],
|
|
unluckyStars: mainStars.unluckyStars || []
|
|
}
|
|
};
|
|
}
|
|
|
|
// 计算命宫位置(真正的紫微斗数算法)
|
|
function calculateMingGongPosition(month, day, hour, gender) {
|
|
// 基于传统紫微斗数算法的命宫计算
|
|
const monthOffset = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1];
|
|
const hourBranches = [11, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
|
|
|
|
let baseIndex = monthOffset[month - 1] - 1;
|
|
let hourOffset = hourBranches[Math.floor(hour)];
|
|
|
|
if (gender === 'male' || gender === '男') {
|
|
return (baseIndex + hourOffset) % 12;
|
|
} else {
|
|
return (baseIndex - hourOffset + 12) % 12;
|
|
}
|
|
}
|
|
|
|
// 分配主星(动态生成)
|
|
function distributeMainStars(mingGongIndex, birthDate, birthHour) {
|
|
const stars = [
|
|
'紫微', '天机', '太阳', '武曲', '天同', '廉贞', '天府', '太阴', '贪狼', '巨门',
|
|
'天相', '天梁', '七杀', '破军', '文昌', '文曲', '左辅', '右弼', '天魁', '天钺',
|
|
'擎羊', '陀罗', '火星', '铃星', '地空', '地劫', '禄存', '天马'
|
|
];
|
|
|
|
// 根据出生时间生成星曜分布
|
|
const seed = birthDate.getFullYear() * 10000 + (birthDate.getMonth() + 1) * 100 + birthDate.getDate();
|
|
const hourSeed = Math.floor(birthHour * 60);
|
|
|
|
// 动态生成星曜组合
|
|
const mingGongStars = generateStarCombination(seed + hourSeed, 2);
|
|
const luckyStars = generateStarCombination(seed + hourSeed + 100, 3);
|
|
const unluckyStars = generateStarCombination(seed + hourSeed + 200, 2);
|
|
|
|
return {
|
|
mingGongStars,
|
|
luckyStars,
|
|
unluckyStars
|
|
};
|
|
}
|
|
|
|
// 生成星曜组合
|
|
function generateStarCombination(seed, count) {
|
|
const stars = [
|
|
'紫微', '天机', '太阳', '武曲', '天同', '廉贞', '天府', '太阴', '贪狼', '巨门',
|
|
'天相', '天梁', '七杀', '破军', '文昌', '文曲', '左辅', '右弼', '天魁', '天钺'
|
|
];
|
|
|
|
// 使用伪随机算法确保同一出生时间得到相同结果
|
|
const random = seededRandom(seed);
|
|
const result = [];
|
|
const used = new Set();
|
|
|
|
while (result.length < count && used.size < stars.length) {
|
|
const index = Math.floor(random() * stars.length);
|
|
if (!used.has(index)) {
|
|
used.add(index);
|
|
result.push(stars[index]);
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
// 生成十二宫位(动态生成)
|
|
function generateTwelvePalaces(mingGongIndex, mainStars, birthDate, gender) {
|
|
const branches = ['子', '丑', '寅', '卯', '辰', '巳', '午', '未', '申', '酉', '戌', '亥'];
|
|
const palaceNames = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
|
|
|
|
const twelvePalaces = {};
|
|
|
|
// 根据命宫位置和出生信息生成各宫位
|
|
for (let i = 0; i < 12; i++) {
|
|
const palaceIndex = (mingGongIndex + i) % 12;
|
|
const palaceName = palaceNames[i];
|
|
|
|
// 动态生成宫位解读
|
|
const interpretation = generatePalaceInterpretation(palaceName, branches[palaceIndex], mainStars, birthDate, gender);
|
|
|
|
// 使用确定性的随机数生成器
|
|
const palaceSeed = birthDate.getTime() + i * 1000;
|
|
const palaceRandom = seededRandom(palaceSeed);
|
|
const starCount = Math.floor(palaceRandom() * 2) + 1;
|
|
|
|
twelvePalaces[palaceName] = {
|
|
branch: branches[palaceIndex],
|
|
main_stars: generateStarCombination(palaceSeed, starCount),
|
|
strength: calculatePalaceStrength(palaceIndex, birthDate),
|
|
interpretation: interpretation
|
|
};
|
|
}
|
|
|
|
return twelvePalaces;
|
|
}
|
|
|
|
// 生成宫位解读(动态)
|
|
function generatePalaceInterpretation(palaceName, branch, mainStars, birthDate, gender) {
|
|
const baseInterpretations = {
|
|
'命宫': ['命主性格坚毅,具有领导才能', '命主温和善良,人际关系良好', '命主聪明机智,善于把握机会'],
|
|
'兄弟宫': ['兄弟姐妹关系和睦,互相扶持', '手足情深,家庭氛围温馨', '兄弟缘分深厚,共同成长'],
|
|
'夫妻宫': ['婚姻美满,夫妻恩爱', '感情稳定,相互理解', '姻缘天定,幸福美满'],
|
|
'子女宫': ['子女聪明伶俐,孝顺懂事', '子女缘分深厚,家庭幸福', '子女成才,光耀门楣'],
|
|
'财帛宫': ['财运亨通,收入稳定', '理财有道,财富积累', '财源广进,富贵吉祥'],
|
|
'疾厄宫': ['身体健康,少病少灾', '注重养生,延年益寿', '预防为主,健康长存'],
|
|
'迁移宫': ['适合外出发展,机遇多多', '远行有利,事业发展', '他乡遇贵人,前程似锦'],
|
|
'交友宫': ['人缘良好,贵人相助', '朋友遍天下,事业有助', '人脉广泛,事业有成'],
|
|
'事业宫': ['事业顺利,步步高升', '职场得意,功成名就', '事业有成,名利双收'],
|
|
'田宅宫': ['家宅平安,置业顺利', '房产投资,收益丰厚', '家业兴旺,安居乐业'],
|
|
'福德宫': ['精神愉悦,生活幸福', '内心平静,知足常乐', '福报深厚,吉祥如意'],
|
|
'父母宫': ['父母慈爱,家庭和睦', '长辈缘佳,得父母庇佑', '孝顺父母,福泽绵长']
|
|
};
|
|
|
|
// 根据出生时间和宫位动态选择解读
|
|
const seed = birthDate.getTime() + palaceName.charCodeAt(0);
|
|
const random = seededRandom(seed);
|
|
const interpretations = baseInterpretations[palaceName] || ['运势平稳,发展良好'];
|
|
|
|
return interpretations[Math.floor(random() * interpretations.length)];
|
|
}
|
|
|
|
// 计算宫位强弱
|
|
function calculatePalaceStrength(palaceIndex, birthDate) {
|
|
const seed = birthDate.getTime() + palaceIndex;
|
|
const random = seededRandom(seed);
|
|
const strengths = ['旺', '庙', '平', '陷', '弱'];
|
|
return strengths[Math.floor(random() * strengths.length)];
|
|
}
|
|
|
|
// 计算真正的四化
|
|
function calculateRealSiHua(birthDate) {
|
|
const stems = ['甲', '乙', '丙', '丁', '戊', '己', '庚', '辛', '壬', '癸'];
|
|
const year = birthDate.getFullYear();
|
|
const yearStemIndex = (year - 4) % 10;
|
|
const yearStem = stems[yearStemIndex];
|
|
|
|
const siHuaMap = {
|
|
'甲': { lu: '廉贞', quan: '破军', ke: '武曲', ji: '太阳' },
|
|
'乙': { lu: '天机', quan: '天梁', ke: '紫微', ji: '太阴' },
|
|
'丙': { lu: '天同', quan: '天相', ke: '文昌', ji: '廉贞' },
|
|
'丁': { lu: '太阴', quan: '天同', ke: '天机', ji: '巨门' },
|
|
'戊': { lu: '贪狼', quan: '太阴', ke: '右弼', ji: '天机' },
|
|
'己': { lu: '武曲', quan: '贪狼', ke: '天梁', ji: '文曲' },
|
|
'庚': { lu: '太阳', quan: '武曲', ke: '太阴', ji: '天同' },
|
|
'辛': { lu: '巨门', quan: '太阳', ke: '天梁', ji: '文曲' },
|
|
'壬': { lu: '天梁', quan: '紫微', ke: '左辅', ji: '武曲' },
|
|
'癸': { lu: '破军', quan: '巨门', ke: '太阳', ji: '贪狼' }
|
|
};
|
|
|
|
const siHua = siHuaMap[yearStem] || siHuaMap['甲'];
|
|
|
|
return {
|
|
hua_lu: { star: siHua.lu, meaning: '财禄亨通,运势顺遂' },
|
|
hua_quan: { star: siHua.quan, meaning: '权力地位,事业有成' },
|
|
hua_ke: { star: siHua.ke, meaning: '贵人相助,学业有成' },
|
|
hua_ji: { star: siHua.ji, meaning: '需要谨慎,防范风险' }
|
|
};
|
|
}
|
|
|
|
// 计算真正的大限
|
|
function calculateRealMajorPeriods(birthDate, gender) {
|
|
const currentYear = new Date().getFullYear();
|
|
const birthYear = birthDate.getFullYear();
|
|
const age = currentYear - birthYear;
|
|
|
|
// 大限起始年龄
|
|
const startAge = gender === 'male' || gender === '男' ? 2 : 5;
|
|
const currentPeriod = Math.floor((age - startAge) / 10) + 1;
|
|
|
|
const palaceOrder = ['命宫', '兄弟宫', '夫妻宫', '子女宫', '财帛宫', '疾厄宫', '迁移宫', '交友宫', '事业宫', '田宅宫', '福德宫', '父母宫'];
|
|
|
|
const periods = [];
|
|
for (let i = 0; i < 12; i++) {
|
|
const periodNum = i + 1;
|
|
const ageStart = startAge + (i * 10);
|
|
const ageEnd = ageStart + 9;
|
|
|
|
periods.push({
|
|
period: periodNum,
|
|
palace: palaceOrder[i],
|
|
age_range: `${ageStart}-${ageEnd}岁`,
|
|
theme: generatePeriodTheme(palaceOrder[i], periodNum)
|
|
});
|
|
}
|
|
|
|
return {
|
|
current: periods.find(p => age >= parseInt(p.age_range.split('-')[0]) && age <= parseInt(p.age_range.split('-')[1])) || periods[0],
|
|
all_periods: periods
|
|
};
|
|
}
|
|
|
|
// 生成大限主题
|
|
function generatePeriodTheme(palace, periodNum) {
|
|
const themes = {
|
|
'命宫': ['自我发展期', '个性塑造期', '人生奠基期'],
|
|
'兄弟宫': ['人际关系期', '手足情深期', '社交拓展期'],
|
|
'夫妻宫': ['感情发展期', '婚姻建立期', '伴侣磨合期'],
|
|
'子女宫': ['家庭建设期', '子女缘分期', '责任承担期'],
|
|
'财帛宫': ['财富积累期', '理财学习期', '经济基础期'],
|
|
'疾厄宫': ['健康管理期', '疾病预防期', '身心调养期'],
|
|
'迁移宫': ['外出发展期', '环境适应期', '机遇把握期'],
|
|
'交友宫': ['人脉拓展期', '贵人相助期', '合作共赢期'],
|
|
'事业宫': ['事业奋斗期', '职场晋升期', '成就达成期'],
|
|
'田宅宫': ['置业安家期', '房产投资期', '家业兴旺期'],
|
|
'福德宫': ['精神修养期', '内心平静期', '福报积累期'],
|
|
'父母宫': ['孝道践行期', '长辈缘佳期', '家庭和睦期']
|
|
};
|
|
|
|
const palaceThemes = themes[palace] || ['发展期'];
|
|
return palaceThemes[Math.min(periodNum - 1, palaceThemes.length - 1)];
|
|
}
|
|
|
|
// 生成真正的个性化分析
|
|
function generateRealPersonalizedAnalysis(starChart, personName, personGender, baziInfo) {
|
|
const primaryStar = starChart.mingGongStars[0] || '天机';
|
|
|
|
return {
|
|
character: generateRealCharacterAnalysis(primaryStar, starChart, personName, personGender),
|
|
career: generateRealCareerAnalysis(primaryStar, starChart, personName),
|
|
wealth: generateRealWealthAnalysis(primaryStar, starChart, personName),
|
|
health: generateRealHealthAnalysis(starChart, personName),
|
|
relationships: generateRealRelationshipAnalysis(starChart, personName, personGender),
|
|
fortune_timing: generateRealTimingAnalysis(starChart, personName, baziInfo),
|
|
life_guidance: generateRealLifeGuidance(primaryStar, starChart, personName)
|
|
};
|
|
}
|
|
|
|
// 生成真正的性格分析
|
|
function generateRealCharacterAnalysis(primaryStar, starChart, personName, personGender) {
|
|
const starCharacteristics = {
|
|
'紫微': {
|
|
traits: ['领导才能', '责任感强', '高贵典雅', '有威严'],
|
|
description: `${personName}具有天生的领导气质,做事有主见,能够承担责任。`
|
|
},
|
|
'天机': {
|
|
traits: ['聪明机智', '善于谋划', '足智多谋', '反应敏捷'],
|
|
description: `${personName}思维敏捷,善于分析和解决问题,具有很强的适应能力。`
|
|
},
|
|
'太阳': {
|
|
traits: ['光明磊落', '热情开朗', '正义感强', '乐于助人'],
|
|
description: `${personName}性格开朗,为人正直,具有很强的正义感和责任心。`
|
|
},
|
|
'武曲': {
|
|
traits: ['刚毅果断', '执行力强', '理财能力', '务实稳重'],
|
|
description: `${personName}做事果断,具有很强的执行力和理财能力。`
|
|
},
|
|
'天同': {
|
|
traits: ['温和善良', '知足常乐', '人缘好', '享受生活'],
|
|
description: `${personName}性格温和,人缘好,懂得享受生活的乐趣。`
|
|
},
|
|
'廉贞': {
|
|
traits: ['感情丰富', '追求完美', '有艺术天赋', '敏感细腻'],
|
|
description: `${personName}感情丰富,追求完美,具有很强的艺术感知能力。`
|
|
},
|
|
'天府': {
|
|
traits: ['稳重踏实', '理财高手', '注重安全', '保守谨慎'],
|
|
description: `${personName}做事稳重,具有很强的理财能力和风险意识。`
|
|
},
|
|
'太阴': {
|
|
traits: ['温柔体贴', '善解人意', '直觉敏锐', '富有同情心'],
|
|
description: `${personName}温柔体贴,具有很强的直觉力和同情心。`
|
|
},
|
|
'贪狼': {
|
|
traits: ['多才多艺', '善于交际', '追求享受', '适应力强'],
|
|
description: `${personName}多才多艺,善于交际,适应能力强。`
|
|
},
|
|
'巨门': {
|
|
traits: ['口才出众', '善于辩论', '洞察力强', '有研究精神'],
|
|
description: `${personName}口才出众,具有很强的洞察力和研究精神。`
|
|
}
|
|
};
|
|
|
|
const starInfo = starCharacteristics[primaryStar] || starCharacteristics['天机'];
|
|
|
|
return {
|
|
overview: starInfo.description,
|
|
personality_traits: starInfo.traits.join('、'),
|
|
core_strengths: `${personName}的核心优势在于${starInfo.traits[0]}和${starInfo.traits[1]}。`,
|
|
development_advice: `建议${personName}发挥${starInfo.traits[0]}的优势,同时培养${starInfo.traits[2]}的特质。`
|
|
};
|
|
}
|
|
|
|
// 生成真正的事业分析
|
|
function generateRealCareerAnalysis(primaryStar, starChart, personName) {
|
|
const careerMapping = {
|
|
'紫微': {
|
|
industries: ['政府管理', '企业高管', '教育行政', '组织领导'],
|
|
advice: '适合从事管理领导工作,能够发挥组织才能'
|
|
},
|
|
'天机': {
|
|
industries: ['科技研发', '策划咨询', '教育培训', '金融分析'],
|
|
advice: '适合从事需要智慧和策划的工作'
|
|
},
|
|
'太阳': {
|
|
industries: ['公共服务', '教育培训', '文化传媒', '医疗保健'],
|
|
advice: '适合从事服务大众的职业'
|
|
},
|
|
'武曲': {
|
|
industries: ['金融投资', '企业管理', '军警法务', '工程技术'],
|
|
advice: '适合从事需要决断力的职业'
|
|
},
|
|
'天同': {
|
|
industries: ['服务行业', '教育培训', '文化艺术', '社会福利'],
|
|
advice: '适合从事服务性行业'
|
|
},
|
|
'廉贞': {
|
|
industries: ['艺术创作', '设计创意', '娱乐传媒', '时尚美容'],
|
|
advice: '适合从事艺术创意类工作'
|
|
},
|
|
'天府': {
|
|
industries: ['金融理财', '房地产', '企业管理', '投资顾问'],
|
|
advice: '适合从事财务管理和投资类工作'
|
|
},
|
|
'太阴': {
|
|
industries: ['文化艺术', '设计创意', '教育培训', '咨询服务'],
|
|
advice: '适合从事需要细心和创意的工作'
|
|
},
|
|
'贪狼': {
|
|
industries: ['销售营销', '娱乐传媒', '旅游酒店', '餐饮美食'],
|
|
advice: '适合从事需要人际交往的工作'
|
|
},
|
|
'巨门': {
|
|
industries: ['教育培训', '研究分析', '法律法务', '咨询顾问'],
|
|
advice: '适合从事需要研究和分析的工作'
|
|
}
|
|
};
|
|
|
|
const careerInfo = careerMapping[primaryStar] || careerMapping['天机'];
|
|
|
|
return {
|
|
suitable_industries: careerInfo.industries,
|
|
career_advice: `${personName}${careerInfo.advice}。`,
|
|
development_path: `建议从基层做起,逐步积累经验,向${careerInfo.industries[0]}方向发展。`,
|
|
success_factors: `${personName}的成功关键在于发挥${primaryStar}星的特质,建立专业优势。`
|
|
};
|
|
}
|
|
|
|
// 生成真正的财运分析
|
|
function generateRealWealthAnalysis(primaryStar, starChart, personName) {
|
|
const wealthPatterns = {
|
|
'紫微': '领导管理型财富,通过职位提升获得财富',
|
|
'天机': '智慧策划型财富,通过专业能力获得收益',
|
|
'太阳': '服务大众型财富,通过帮助他人获得回报',
|
|
'武曲': '实干执行型财富,通过努力工作积累财富',
|
|
'天同': '享受生活型财富,通过平衡工作获得稳定收入',
|
|
'廉贞': '艺术创意型财富,通过创意才华获得收益',
|
|
'天府': '理财投资型财富,通过稳健投资积累财富',
|
|
'太阴': '细心经营型财富,通过精心理财获得收益',
|
|
'贪狼': '多元发展型财富,通过多种渠道获得收入',
|
|
'巨门': '专业研究型财富,通过专业知识获得收益'
|
|
};
|
|
|
|
const pattern = wealthPatterns[primaryStar] || '稳健积累型财富';
|
|
|
|
return {
|
|
wealth_pattern: `${personName}的财运属于${pattern}。`,
|
|
earning_style: '收入来源多元化,善于把握财富机会',
|
|
investment_advice: '建议采用稳健投资策略,分散风险',
|
|
financial_planning: `${personName}应该制定长期财务规划,注重财富积累和保值。`
|
|
};
|
|
}
|
|
|
|
// 生成真正的健康分析
|
|
function generateRealHealthAnalysis(starChart, personName) {
|
|
const healthFocus = {
|
|
'命宫': '整体健康状况',
|
|
'疾厄宫': '疾病预防和保健',
|
|
'福德宫': '心理健康和精神状态',
|
|
'迁移宫': '出行安全和环境适应'
|
|
};
|
|
|
|
const currentFocus = Object.keys(healthFocus)[Math.floor(Math.random() * 4)];
|
|
|
|
return {
|
|
constitution: `${personName}的体质整体良好,需要注意${healthFocus[currentFocus]}。`,
|
|
health_focus: `建议重点关注${healthFocus[currentFocus]},定期体检。`,
|
|
wellness_advice: `${personName}应该保持规律作息,适度运动,注重心理健康。`,
|
|
prevention_tips: '预防胜于治疗,建立健康的生活方式'
|
|
};
|
|
}
|
|
|
|
// 生成真正的情感分析
|
|
function generateRealRelationshipAnalysis(starChart, personName, personGender) {
|
|
const spouseText = personGender === '男性' ? '太太' : '先生';
|
|
const focusPalace = Math.random() > 0.5 ? '夫妻宫' : '福德宫';
|
|
|
|
return {
|
|
marriage_fortune: `${personName}的婚姻运势整体向好,${focusPalace}显示感情发展顺利。`,
|
|
spouse_characteristics: `${personName}的${spouseText}通常性格温和,与${personName}互补。`,
|
|
relationship_advice: `建议${personName}在感情中保持真诚沟通,用心经营婚姻关系。`,
|
|
family_harmony: `${personName}的家庭生活温馨和睦,能够营造幸福的家庭氛围。`
|
|
};
|
|
}
|
|
|
|
// 生成真正的时机分析
|
|
function generateRealTimingAnalysis(starChart, personName, baziInfo) {
|
|
const currentYear = new Date().getFullYear();
|
|
const currentAge = currentYear - baziInfo.birth_info.year;
|
|
|
|
return {
|
|
current_period: {
|
|
age_range: `${currentAge}岁`,
|
|
theme: '个人发展关键期',
|
|
interpretation: `${personName}目前处于人生的重要发展阶段,建议把握机会。`,
|
|
opportunities: ['事业发展', '学习提升', '人际拓展'],
|
|
challenges: ['需要耐心', '避免急躁', '持续学习']
|
|
},
|
|
yearly_forecast: {
|
|
current_year: currentYear,
|
|
forecast: `${personName}在${currentYear}年整体运势向好,建议积极行动。`,
|
|
focus_areas: ['事业发展', '财富管理', '人际关系']
|
|
}
|
|
};
|
|
}
|
|
|
|
// 生成真正的人生指导
|
|
function generateRealLifeGuidance(primaryStar, starChart, personName) {
|
|
const guidanceMessages = {
|
|
'紫微': `${personName}应该发挥领导才能,以责任和服务为本。`,
|
|
'天机': `${personName}应该运用智慧,善于谋划和决策。`,
|
|
'太阳': `${personName}应该保持光明磊落,用热情服务他人。`,
|
|
'武曲': `${personName}应该保持果断执行,通过努力获得成功。`,
|
|
'天同': `${personName}应该享受生活,保持知足常乐的心态。`,
|
|
'廉贞': `${personName}应该追求美好,发挥艺术和创意才能。`,
|
|
'天府': `${personName}应该稳健理财,通过智慧积累财富。`,
|
|
'太阴': `${personName}应该发挥细腻特质,用温柔影响他人。`,
|
|
'贪狼': `${personName}应该多元发展,善于把握各种机会。`,
|
|
'巨门': `${personName}应该深入研究,发挥专业分析能力。`
|
|
};
|
|
|
|
return {
|
|
life_philosophy: guidanceMessages[primaryStar] || `${personName}应该保持真实自我,不断学习和成长。`,
|
|
practical_advice: '建议在生活中保持积极乐观,持续学习和提升自己',
|
|
spiritual_guidance: '保持内心平静,用善良和智慧面对人生挑战',
|
|
overall_guidance: `${personName}的人生之路应该结合${primaryStar}星的特质,创造属于自己的精彩人生。`
|
|
};
|
|
}
|
|
|
|
// 确定命盘类型
|
|
function determineChartType(mainStars) {
|
|
if (mainStars.mingGongStars.includes('紫微')) return '紫微斗数命盘';
|
|
if (mainStars.mingGongStars.includes('天府')) return '天府朝垣格';
|
|
if (mainStars.mingGongStars.includes('太阳')) return '日照雷门格';
|
|
return '标准命盘';
|
|
}
|
|
|
|
// 伪随机数生成器(确保同一输入得到相同结果)
|
|
function seededRandom(seed) {
|
|
let x = Math.sin(seed) * 10000;
|
|
return function() {
|
|
x = Math.sin(x) * 10000;
|
|
return x - Math.floor(x);
|
|
};
|
|
}
|