Files
suanming/src/components/AnalysisResultDisplay.tsx

473 lines
20 KiB
TypeScript
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.
import React from 'react';
import CompleteBaziAnalysis from './CompleteBaziAnalysis';
import CompleteZiweiAnalysis from './CompleteZiweiAnalysis';
import CompleteYijingAnalysis from './CompleteYijingAnalysis';
import BaziAnalysisDisplay from './BaziAnalysisDisplay';
interface AnalysisResultDisplayProps {
analysisResult?: any;
analysisType: 'bazi' | 'ziwei' | 'yijing';
birthDate?: {
date: string;
time: string;
name?: string;
gender?: string;
};
question?: string;
userId?: string;
divinationMethod?: string;
preAnalysisData?: any; // 预先分析的数据,用于历史记录
}
const AnalysisResultDisplay: React.FC<AnalysisResultDisplayProps> = ({
analysisResult,
analysisType,
birthDate,
question,
userId,
divinationMethod,
preAnalysisData
}) => {
// 安全地获取数据的辅助函数
const safeGet = (obj: any, path: string, defaultValue: any = '暂无数据') => {
const keys = path.split('.');
let current = obj;
for (const key of keys) {
if (current && typeof current === 'object' && key in current) {
current = current[key];
} else {
return defaultValue;
}
}
return current || defaultValue;
};
// 安全渲染函数,确保返回的是字符串
const safeRender = (value: any, defaultValue: string = '') => {
if (typeof value === 'string') return value;
if (typeof value === 'number') return String(value);
if (Array.isArray(value)) return value.join(', ');
if (typeof value === 'object' && value !== null) {
// 特殊处理包含stars键的对象
if (value.stars && Array.isArray(value.stars)) {
return value.stars.join(', ');
}
// 其他对象转为JSON字符串
return JSON.stringify(value);
}
return defaultValue;
};
// 渲染八字命理分析
const renderBaziAnalysis = () => {
// 如果有 birthDate使用新的 CompleteBaziAnalysis 组件
if (birthDate) {
return <CompleteBaziAnalysis birthDate={birthDate} analysisData={preAnalysisData} />;
}
// 如果有分析结果但没有 birthDate尝试从结果中提取出生信息
if (analysisResult && analysisResult.data) {
const basicInfo = analysisResult.data.basic_info;
if (basicInfo && basicInfo.personal_data) {
const extractedBirthDate = {
date: basicInfo.personal_data.birth_date || '',
time: basicInfo.personal_data.birth_time || '12:00',
name: basicInfo.personal_data.name || '',
gender: basicInfo.personal_data.gender === '男性' ? 'male' : 'female'
};
return <CompleteBaziAnalysis birthDate={extractedBirthDate} analysisData={preAnalysisData} />;
}
}
// 如果没有足够的数据,返回错误提示
return (
<div className="bg-white rounded-lg p-6 shadow-lg">
<p className="text-gray-500 text-center"></p>
</div>
);
};
// 渲染紫微斗数分析
const renderZiweiAnalysis = () => {
// 如果有 birthDate使用新的 CompleteZiweiAnalysis 组件
if (birthDate) {
return <CompleteZiweiAnalysis birthDate={birthDate} analysisData={preAnalysisData} />;
}
// 如果有分析结果但没有 birthDate尝试从结果中提取出生信息
if (analysisResult && analysisResult.data) {
const basicInfo = analysisResult.data.basic_info;
if (basicInfo && basicInfo.personal_data) {
const extractedBirthDate = {
date: basicInfo.personal_data.birth_date || '',
time: basicInfo.personal_data.birth_time || '12:00',
name: basicInfo.personal_data.name || '',
gender: basicInfo.personal_data.gender === '男性' ? 'male' : 'female'
};
return <CompleteZiweiAnalysis birthDate={extractedBirthDate} analysisData={preAnalysisData} />;
}
}
// 回退到旧的渲染方式(向后兼容)
const data = analysisResult?.data || analysisResult;
const ziweiData = data?.ziwei_analysis || data?.ziwei || data;
const analysisData = data?.detailed_analysis || data?.analysis || data;
return (
<div className="space-y-8">
{/* 命宫信息 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-purple-700"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-purple-50 p-4 rounded-lg">
<p><span className="font-medium"></span>{safeRender(safeGet(ziweiData, 'ming_gong'), '未知')}</p>
<p><span className="font-medium"></span>{safeRender(safeGet(ziweiData, 'ming_gong_xing'))}</p>
</div>
<div className="bg-blue-50 p-4 rounded-lg">
<p><span className="font-medium"></span>{safeRender(safeGet(ziweiData, 'shi_er_gong.命宫.interpretation'))}</p>
<p><span className="font-medium"></span>{safeRender(safeGet(ziweiData, 'shi_er_gong.命宫.strength'))}</p>
</div>
</div>
</div>
{/* 12宫位分析 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-blue-700">12</h3>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
{[
{ key: '命宫', name: '命宫' },
{ key: '兄弟宫', name: '兄弟宫' },
{ key: '夫妻宫', name: '夫妻宫' },
{ key: '子女宫', name: '子女宫' },
{ key: '财帛宫', name: '财帛宫' },
{ key: '疾厄宫', name: '疾厄宫' },
{ key: '迁移宫', name: '迁移宫' },
{ key: '交友宫', name: '交友宫' },
{ key: '事业宫', name: '事业宫' },
{ key: '田宅宫', name: '田宅宫' },
{ key: '福德宫', name: '福德宫' },
{ key: '父母宫', name: '父母宫' }
].map((gong) => {
const gongData = safeGet(ziweiData, `shi_er_gong.${gong.key}`, {});
return (
<div key={gong.key} className="bg-blue-50 p-3 rounded-lg">
<h4 className="font-medium text-blue-800 mb-2">{gong.name}</h4>
<p className="text-sm text-gray-600 mb-1">
{safeRender(gongData.main_stars)}
</p>
<p className="text-sm text-gray-600">
{safeRender(gongData.interpretation)}
</p>
</div>
);
})}
</div>
</div>
{/* 四化飞星系统 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-green-700"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
{[
{ key: 'hua_lu', name: '化禄', color: 'bg-green-50' },
{ key: 'hua_quan', name: '化权', color: 'bg-red-50' },
{ key: 'hua_ke', name: '化科', color: 'bg-yellow-50' },
{ key: 'hua_ji', name: '化忌', color: 'bg-gray-50' }
].map((sihua) => {
const sihuaData = safeGet(ziweiData, `si_hua.${sihua.key}`, {});
return (
<div key={sihua.key} className={`${sihua.color} p-4 rounded-lg`}>
<h4 className="font-medium mb-2">{sihua.name}</h4>
<p className="text-sm text-gray-600">
{safeRender(sihuaData.star)}
</p>
<p className="text-sm text-gray-600">
{safeRender(sihuaData.meaning)}
</p>
</div>
);
})}
</div>
</div>
{/* 性格分析 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-indigo-700"></h3>
<div className="space-y-4">
<div className="bg-indigo-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(analysisData, 'character.overview'))}</p>
</div>
<div className="bg-blue-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(analysisData, 'character.personality_traits'))}</p>
</div>
</div>
</div>
{/* 事业财运 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-orange-700"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-orange-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<div className="text-gray-700">
{Array.isArray(safeGet(analysisData, 'career.suitable_industries')) &&
safeGet(analysisData, 'career.suitable_industries')?.map((industry: string, index: number) => (
<span key={index} className="inline-block bg-white px-2 py-1 rounded mr-2 mb-2 text-sm">
{safeRender(industry)}
</span>
))}
</div>
</div>
<div className="bg-green-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(analysisData, 'wealth.wealth_pattern'))}</p>
</div>
</div>
</div>
{/* 感情婚姻 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-pink-700"></h3>
<div className="bg-pink-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(analysisData, 'relationships.marriage_fortune'))}</p>
<div className="mt-3">
<h5 className="font-medium text-sm mb-1"></h5>
<p className="text-gray-600 text-sm">{safeRender(safeGet(analysisData, 'relationships.spouse_characteristics'))}</p>
</div>
</div>
</div>
{/* 健康指导 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-teal-700"></h3>
<div className="bg-teal-50 p-4 rounded-lg">
<p className="text-gray-700">{safeRender(safeGet(analysisData, 'health.constitution'))}</p>
<div className="mt-3">
<h5 className="font-medium text-sm mb-1"></h5>
<p className="text-gray-600 text-sm">{safeRender(safeGet(analysisData, 'health.wellness_advice'))}</p>
</div>
</div>
</div>
</div>
);
};
// 渲染易经占卜分析
const renderYijingAnalysis = () => {
// 如果有问题参数,使用新的 CompleteYijingAnalysis 组件
if (question) {
return (
<CompleteYijingAnalysis
question={question}
userId={userId}
divinationMethod={divinationMethod}
/>
);
}
// 如果有分析结果但没有问题参数,尝试从结果中提取问题信息
if (analysisResult && analysisResult.data) {
const basicInfo = analysisResult.data.basic_info;
if (basicInfo && basicInfo.divination_data) {
return (
<CompleteYijingAnalysis
question={basicInfo.divination_data.question || '综合运势如何?'}
userId={userId || 'user123'}
divinationMethod={divinationMethod || 'time'}
/>
);
}
}
// 回退到旧的渲染方式(向后兼容)
const data = analysisResult?.data || analysisResult;
return (
<div className="space-y-8">
{/* 占卜基本信息 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-amber-700"></h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
<div className="bg-amber-50 p-4 rounded-lg">
<p><span className="font-medium"></span>{safeRender(safeGet(data, 'basic_info.divination_data.question'))}</p>
<p><span className="font-medium"></span>{safeRender(safeGet(data, 'basic_info.divination_data.method'))}</p>
</div>
<div className="bg-yellow-50 p-4 rounded-lg">
<p><span className="font-medium"></span>{safeGet(data, 'basic_info.divination_data.divination_time') ? new Date(safeGet(data, 'basic_info.divination_data.divination_time')).toLocaleString('zh-CN') : ''}</p>
<p><span className="font-medium"></span>{safeRender(safeGet(data, 'analysis_date'))}</p>
</div>
</div>
</div>
{/* 卦象分析 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-green-700"></h3>
{/* 本卦识别 */}
<div className="mb-6">
<h4 className="text-lg font-medium mb-3 text-gray-800"></h4>
<div className="bg-green-50 p-4 rounded-lg">
<p className="text-gray-700 text-lg font-medium">
{safeRender(safeGet(data, 'basic_info.hexagram_info.main_hexagram'))}
</p>
<p className="text-gray-600 mt-2">
{safeRender(safeGet(data, 'basic_info.hexagram_info.hexagram_description'))}
</p>
<p className="text-gray-600 mt-1">
{safeRender(safeGet(data, 'basic_info.hexagram_info.upper_trigram'))} / {safeRender(safeGet(data, 'basic_info.hexagram_info.lower_trigram'))}
</p>
</div>
</div>
{/* 卦象详解 */}
<div>
<h4 className="text-lg font-medium mb-3 text-gray-800"></h4>
<div className="bg-blue-50 p-4 rounded-lg">
<p className="text-gray-700">{safeRender(safeGet(data, 'basic_info.hexagram_info.detailed_interpretation'))}</p>
</div>
</div>
</div>
{/* 卦象主要分析 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-purple-700"></h3>
<div className="space-y-4">
<div className="bg-purple-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'detailed_analysis.hexagram_analysis.primary_meaning'))}</p>
</div>
<div className="bg-indigo-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'detailed_analysis.hexagram_analysis.judgment'))}</p>
</div>
<div className="bg-blue-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'detailed_analysis.hexagram_analysis.image'))}</p>
</div>
</div>
</div>
{/* 变卦分析 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-orange-700"></h3>
<div className="bg-orange-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">
{safeRender(safeGet(data, 'detailed_analysis.changing_lines_analysis.changing_line_position'))}
{safeRender(safeGet(data, 'detailed_analysis.changing_lines_analysis.line_meaning'))}
</p>
<div className="mt-3">
<h5 className="font-medium text-sm mb-1"></h5>
<p className="text-gray-600 text-sm">
{safeRender(safeGet(data, 'detailed_analysis.changing_hexagram.name'))} -
{safeRender(safeGet(data, 'detailed_analysis.changing_hexagram.meaning'))}
</p>
<p className="text-gray-600 text-sm mt-1">
{safeRender(safeGet(data, 'detailed_analysis.changing_hexagram.transformation_insight'))}
</p>
</div>
</div>
</div>
{/* 人生指导 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-cyan-700"></h3>
<div className="space-y-4">
<div className="bg-cyan-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'life_guidance.overall_fortune'))}</p>
</div>
<div className="bg-green-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'life_guidance.career_guidance'))}</p>
</div>
<div className="bg-pink-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'life_guidance.relationship_guidance'))}</p>
</div>
<div className="bg-yellow-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700">{safeRender(safeGet(data, 'life_guidance.wealth_guidance'))}</p>
</div>
</div>
</div>
{/* 易经智慧 */}
<div className="bg-white rounded-lg p-6 shadow-lg">
<h3 className="text-xl font-semibold mb-4 text-gray-700"></h3>
<div className="bg-gray-50 p-4 rounded-lg">
<h4 className="font-medium mb-2"></h4>
<p className="text-gray-700 text-lg font-medium mb-3">
{safeRender(safeGet(data, 'divination_wisdom.key_message'))}
</p>
<div className="space-y-2">
<p className="text-gray-600">
<span className="font-medium"></span>{safeRender(safeGet(data, 'divination_wisdom.action_advice'))}
</p>
<p className="text-gray-600">
<span className="font-medium"></span>{safeRender(safeGet(data, 'divination_wisdom.philosophical_insight'))}
</p>
</div>
</div>
</div>
</div>
);
};
// 主渲染逻辑
const renderAnalysis = () => {
switch (analysisType) {
case 'bazi':
return renderBaziAnalysis();
case 'ziwei':
return renderZiweiAnalysis();
case 'yijing':
return renderYijingAnalysis();
default:
return (
<div className="bg-white rounded-lg p-6 shadow-lg">
<p className="text-gray-500">: {analysisType}</p>
</div>
);
}
};
// 对于八字分析,如果有 birthDate 则不需要 analysisResult
if (analysisType === 'bazi' && birthDate) {
return renderBaziAnalysis();
}
// 对于易经占卜,如果有 question 参数,直接返回 CompleteYijingAnalysis 组件(不添加额外容器)
if (analysisType === 'yijing' && question) {
return (
<CompleteYijingAnalysis
question={question}
userId={userId}
divinationMethod={divinationMethod}
analysisData={preAnalysisData}
/>
);
}
// 对于紫微斗数,如果有 birthDate 参数,直接返回 CompleteZiweiAnalysis 组件(不添加额外容器)
if (analysisType === 'ziwei' && birthDate) {
return <CompleteZiweiAnalysis birthDate={birthDate} analysisData={preAnalysisData} />;
}
// 如果没有分析结果数据
if (!analysisResult) {
return (
<div className="bg-white rounded-lg p-6 shadow-lg">
<p className="text-gray-500 text-center"></p>
</div>
);
}
return (
<div className="max-w-4xl mx-auto p-4">
{renderAnalysis()}
</div>
);
};
export default AnalysisResultDisplay;