import_main_fan_facts.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. #!/usr/bin/env python3
  2. """显式导入已人工核验的事实,按文档 SHA256 缓存,不改变原文件。"""
  3. import argparse
  4. import json
  5. from pathlib import Path
  6. import sys
  7. sys.path.insert(0, str(Path(__file__).resolve().parents[1]))
  8. def main():
  9. parser = argparse.ArgumentParser()
  10. parser.add_argument("--document", type=Path, required=True)
  11. parser.add_argument("--facts", type=Path, required=True)
  12. parser.add_argument("--sha256", help="人工转录时记录的原文档哈希;样例完整清单可自动读取")
  13. args = parser.parse_args()
  14. from algorithms.main_fan.models import DocumentFacts
  15. from extensions.main_fan.documents import fingerprint, _prepare
  16. from db import db_conn, main_fan_store
  17. import tempfile
  18. raw = json.loads(args.facts.read_text(encoding="utf-8"))
  19. expected = args.sha256
  20. if "document_facts" in raw:
  21. expected = expected or raw["assets"]["performance_pdf"]["sha256"]
  22. raw = raw["document_facts"]
  23. actual = fingerprint(args.document)
  24. if not expected or actual != expected:
  25. raise ValueError("原文件哈希与转录记录不一致或缺失,不能导入")
  26. facts = DocumentFacts.model_validate(raw)
  27. with tempfile.TemporaryDirectory(prefix="main-fan-import-") as folder:
  28. page_count = len(_prepare(args.document.resolve(), Path(folder)))
  29. for report in facts.reports:
  30. for evidence in [report.evidence, *(p.evidence for p in report.points)]:
  31. if evidence.page is None or evidence.page > page_count or not evidence.excerpt:
  32. raise ValueError("报告事实须包含有效物理页码与原文/单位")
  33. evidence.sha256, evidence.method = actual, "manual_transcription"
  34. for item in [*facts.devices, *facts.points]:
  35. if item.evidence.page is None or item.evidence.page > page_count or not item.evidence.excerpt:
  36. raise ValueError("截图事实须包含原页与原文")
  37. item.evidence.sha256, item.evidence.method = actual, "manual_transcription"
  38. try:
  39. db_conn.init_schema()
  40. main_fan_store.save_document(actual, facts.model_dump(mode="json"), "manual_transcription")
  41. finally:
  42. db_conn.close()
  43. print(f"已导入哈希绑定的人工转录:{len(facts.reports)} 份报告,{len(facts.points)} 条测点;原件未改变")
  44. if __name__ == "__main__":
  45. main()