显示详细的可滚动终端报告(使用Rich交互式显示)
(final_state: Dict)
| 801 | |
| 802 | |
| 803 | def display_detailed_report(final_state: Dict): |
| 804 | """显示详细的可滚动终端报告(使用Rich交互式显示)""" |
| 805 | if not final_state: |
| 806 | console.print("[red]无结果可显示[/red]") |
| 807 | return |
| 808 | |
| 809 | try: |
| 810 | from .static.report_template import FinalReportGenerator |
| 811 | generator = FinalReportGenerator(final_state) |
| 812 | step_results = final_state.get('step_results', {}) |
| 813 | data_team_results = step_results.get('data_team', {}) |
| 814 | research_team_results = step_results.get('research_team', {}) |
| 815 | contest_results = step_results.get('contest', {}) |
| 816 | |
| 817 | trigger_time = final_state.get('trigger_time', 'N/A') |
| 818 | data_factors_count = data_team_results.get('factors_count', 0) |
| 819 | research_signals_count = research_team_results.get('signals_count', 0) |
| 820 | best_signals = contest_results.get('best_signals', []) |
| 821 | |
| 822 | valid_signals = [s for s in best_signals if s.get('has_opportunity', 'no') == 'yes'] |
| 823 | invalid_signals = [s for s in best_signals if s.get('has_opportunity', 'no') != 'yes'] |
| 824 | |
| 825 | signal_rate = f"{len(valid_signals)/len(best_signals)*100:.1f}% ({len(valid_signals)}/{len(best_signals)})" if len(best_signals) > 0 else "0% (0/0)" |
| 826 | |
| 827 | markdown_content = f"""# ContestTrade {get_text('详细分析报告', 'Detailed Analysis Report')} |
| 828 | |
| 829 | ## 📊 {get_text('执行摘要', 'Executive Summary')} |
| 830 | |
| 831 | **{get_text('分析时间', 'Analysis Time')}**: {trigger_time} |
| 832 | **{get_text('数据源数量', 'Data Sources Count')}**: {data_factors_count} |
| 833 | **{get_text('研究信号数量', 'Research Signals Count')}**: {research_signals_count} |
| 834 | **{get_text('有效投资信号', 'Valid Investment Signals')}**: {len(valid_signals)} |
| 835 | **{get_text('信号有效率', 'Signal Effectiveness Rate')}**: {signal_rate} |
| 836 | |
| 837 | --- |
| 838 | |
| 839 | ## 🎯 {get_text('投资信号详情', 'Investment Signals Details')} |
| 840 | """ |
| 841 | |
| 842 | if valid_signals: |
| 843 | markdown_content += f"\n### ✅ {get_text('推荐投资信号', 'Recommended Investment Signals')} ({len(valid_signals)}{get_text('个', '')})\n\n" |
| 844 | |
| 845 | for i, signal in enumerate(valid_signals, 1): |
| 846 | symbol_name = signal.get('symbol_name', 'N/A') |
| 847 | symbol_code = signal.get('symbol_code', 'N/A') |
| 848 | action = signal.get('action', 'N/A') |
| 849 | probability = signal.get('probability', 'N/A') |
| 850 | agent_id = signal.get('agent_id', 'N/A') |
| 851 | |
| 852 | markdown_content += f"#### {i}. {symbol_name} ({symbol_code})\n\n" |
| 853 | markdown_content += f"- **{get_text('投资动作', 'Investment Action')}**: {action}\n" |
| 854 | markdown_content += f"- **{get_text('分析来源', 'Analysis Source')}**: Research Agent {agent_id}\n\n" |
| 855 | |
| 856 | evidence_list = signal.get('evidence_list', []) |
| 857 | if evidence_list: |
| 858 | markdown_content += f"**📋 {get_text('支撑证据', 'Supporting Evidence')} ({len(evidence_list)}{get_text('项', '')}):**\n\n" |
| 859 | for j, evidence in enumerate(evidence_list, 1): |
| 860 | desc = evidence.get('description', 'N/A') |
no test coverage detected