80 lines
3.0 KiB
Python
80 lines
3.0 KiB
Python
from __future__ import annotations
|
|
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from django.conf import settings
|
|
|
|
from review_agent.models import ExportedSummaryFile, FileSummaryBatch
|
|
|
|
|
|
logger = logging.getLogger("review_agent.file_summary.report")
|
|
|
|
|
|
def _exports_dir(batch: FileSummaryBatch) -> Path:
|
|
root = Path(batch.work_dir) if batch.work_dir else Path(settings.MEDIA_ROOT) / "file_summary" / batch.batch_no
|
|
export_dir = root / "exports"
|
|
export_dir.mkdir(parents=True, exist_ok=True)
|
|
return export_dir
|
|
|
|
|
|
def build_summary_table(batch: FileSummaryBatch) -> str:
|
|
lines = [
|
|
"| 序号 | 目录层级 | 文件名 | 类型 | 页数 | 状态 | 异常说明 |",
|
|
"| --- | --- | --- | --- | --- | --- | --- |",
|
|
]
|
|
for item in batch.items.order_by("file_index"):
|
|
lines.append(
|
|
"| {index} | {directory} | {name} | {file_type} | {pages} | {status} | {error} |".format(
|
|
index=item.file_index,
|
|
directory=item.directory_level or "-",
|
|
name=item.file_name,
|
|
file_type=item.file_type,
|
|
pages=item.page_count if item.page_count is not None else "-",
|
|
status=item.statistics_status,
|
|
error=item.error_message or "-",
|
|
)
|
|
)
|
|
return "\n".join(lines)
|
|
|
|
|
|
def build_markdown_report(batch: FileSummaryBatch) -> str:
|
|
return "\n\n".join(
|
|
[
|
|
f"# 文件目录与页数汇总报告\n\n批次号:{batch.batch_no}",
|
|
(
|
|
"## 汇总信息\n\n"
|
|
f"- 产品名称:{batch.product_name or '-'}\n"
|
|
f"- 文件总数:{batch.total_files}\n"
|
|
f"- 统计成功:{batch.success_files}\n"
|
|
f"- 统计失败:{batch.failed_files}\n"
|
|
f"- 不支持:{batch.unsupported_files}\n"
|
|
f"- 不确定:{batch.uncertain_files}\n"
|
|
f"- 总页数:{batch.total_pages}"
|
|
),
|
|
"## 文件明细\n\n" + build_summary_table(batch),
|
|
"## 处理说明\n\n单文件失败不会阻断批次,失败与不确定文件已在明细中标注。",
|
|
]
|
|
)
|
|
|
|
|
|
def generate_markdown_report(batch: FileSummaryBatch) -> tuple[ExportedSummaryFile, str]:
|
|
logger.info("Markdown report generation started", extra={"batch_id": batch.pk})
|
|
content = build_markdown_report(batch)
|
|
path = _exports_dir(batch) / f"{batch.batch_no}-summary.md"
|
|
path.write_text(content, encoding="utf-8")
|
|
exported = ExportedSummaryFile.objects.create(
|
|
batch=batch,
|
|
workflow_type="file_summary",
|
|
workflow_batch_id=batch.pk,
|
|
export_category="summary",
|
|
export_type=ExportedSummaryFile.ExportType.MARKDOWN,
|
|
file_name=path.name,
|
|
storage_path=str(path),
|
|
)
|
|
logger.info(
|
|
"Markdown report generation finished",
|
|
extra={"batch_id": batch.pk, "export_id": exported.pk, "path": str(path)},
|
|
)
|
|
return exported, build_summary_table(batch)
|