马一丁

Update the process when only Report Engine is running

... ... @@ -7,7 +7,7 @@ Report Engine 命令行版本
1. 检查PDF依赖
2. 获取最新的log、md文件
3. 直接调用Report Engine生成报告(跳过文件增加审核)
4. 自动保存HTML和PDF(如果有依赖)到final_reports/
4. 自动保存HTML、PDF(如果有依赖)和Markdown到final_reports/(Markdown 会在 PDF 之后生成)
使用方法:
python report_engine_only.py [选项]
... ... @@ -15,6 +15,7 @@ Report Engine 命令行版本
选项:
--query QUERY 指定报告主题(可选,默认从文件名提取)
--skip-pdf 跳过PDF生成(即使有依赖)
--skip-markdown 跳过Markdown生成
--verbose 显示详细日志
--help 显示帮助信息
"""
... ... @@ -358,6 +359,52 @@ def save_pdf(document_ir_path: str, query: str) -> Optional[str]:
return None
def save_markdown(document_ir_path: str, query: str) -> Optional[str]:
"""
从IR文件生成并保存Markdown
Args:
document_ir_path: Document IR文件路径
query: 报告主题
Returns:
Optional[str]: Markdown文件路径,如果失败则返回None
"""
logger.info("\n正在生成 Markdown 文件...")
try:
with open(document_ir_path, 'r', encoding='utf-8') as f:
document_ir = json.load(f)
from ReportEngine.renderers import MarkdownRenderer
renderer = MarkdownRenderer()
markdown_content = renderer.render(document_ir)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
query_safe = "".join(
c for c in query if c.isalnum() or c in (" ", "-", "_")
).rstrip()
query_safe = query_safe.replace(" ", "_")[:30] or "report"
md_dir = Path("final_reports") / "md"
md_dir.mkdir(parents=True, exist_ok=True)
md_filename = f"final_report_{query_safe}_{timestamp}.md"
md_path = md_dir / md_filename
md_path.write_text(markdown_content, encoding='utf-8')
file_size_kb = md_path.stat().st_size / 1024
logger.success(f"✓ Markdown 已保存: {md_path}")
logger.info(f" 文件大小: {file_size_kb:.1f} KB")
return str(md_path)
except Exception as e:
logger.exception(f"❌ Markdown 生成失败: {e}")
return None
def parse_arguments():
"""解析命令行参数"""
parser = argparse.ArgumentParser(
... ... @@ -371,7 +418,7 @@ def parse_arguments():
注意:
程序会自动获取三个引擎目录中的最新报告文件,
不进行文件增加审核,直接生成综合报告。
不进行文件增加审核,直接生成综合报告,并默认在PDF之后生成Markdown
"""
)
... ... @@ -389,6 +436,12 @@ def parse_arguments():
)
parser.add_argument(
'--skip-markdown',
action='store_true',
help='跳过Markdown生成'
)
parser.add_argument(
'--verbose',
action='store_true',
help='显示详细日志信息'
... ... @@ -413,12 +466,16 @@ def main():
# 步骤 1: 检查依赖
pdf_available, _ = check_dependencies()
markdown_enabled = not args.skip_markdown
# 如果用户指定跳过PDF,则禁用PDF生成
if args.skip_pdf:
logger.info("用户指定 --skip-pdf,将跳过 PDF 生成")
pdf_available = False
if not markdown_enabled:
logger.info("用户指定 --skip-markdown,将跳过 Markdown 生成")
# 步骤 2: 获取最新文件
latest_files = get_latest_engine_reports()
... ... @@ -448,12 +505,15 @@ def main():
# HTML 已经在 generate_report 中自动保存
html_path = result.get('report_filepath', '')
ir_path = result.get('ir_filepath', '')
pdf_path = None
markdown_path = None
if html_path:
logger.success(f"✓ HTML 已保存: {result.get('report_relative_path', html_path)}")
# 如果有PDF依赖,生成并保存PDF
if pdf_available:
ir_path = result.get('ir_filepath', '')
if ir_path and os.path.exists(ir_path):
pdf_path = save_pdf(ir_path, query)
else:
... ... @@ -461,6 +521,15 @@ def main():
else:
logger.info("⚠ 跳过 PDF 生成(缺少系统依赖或用户指定跳过)")
# 生成并保存Markdown(在PDF之后)
if markdown_enabled:
if ir_path and os.path.exists(ir_path):
markdown_path = save_markdown(ir_path, query)
else:
logger.warning("⚠ 未找到 IR 文件,无法生成 Markdown")
else:
logger.info("⚠ 跳过 Markdown 生成(用户指定)")
# 总结
logger.info("\n" + "=" * 70)
logger.success("✓ 报告生成完成!")
... ... @@ -468,7 +537,19 @@ def main():
logger.info(f"报告 ID: {result.get('report_id', 'N/A')}")
logger.info(f"HTML 文件: {result.get('report_relative_path', 'N/A')}")
if pdf_available:
logger.info(f"PDF 文件: final_reports/pdf/ 目录下")
if pdf_path:
logger.info(f"PDF 文件: {os.path.relpath(pdf_path, os.getcwd())}")
else:
logger.info("PDF 文件: 生成失败,请检查日志")
else:
logger.info("PDF 文件: 已跳过")
if markdown_enabled:
if markdown_path:
logger.info(f"Markdown 文件: {os.path.relpath(markdown_path, os.getcwd())}")
else:
logger.info("Markdown 文件: 生成失败,请检查日志")
else:
logger.info("Markdown 文件: 已跳过")
logger.info("=" * 70)
logger.info("\n程序结束")
... ...