feat(regulatory): 按实际处理数量更新节点进度

This commit is contained in:
2026-06-07 13:32:06 +08:00
parent 32d258bb75
commit 3e8720e521
5 changed files with 286 additions and 62 deletions

View File

@@ -1,12 +1,20 @@
from __future__ import annotations
from collections.abc import Callable
from review_agent.regulatory_review.schemas import Finding
def run_structure_check(document_texts: dict[str, str], rule_set: dict) -> list[Finding]:
def run_structure_check(
document_texts: dict[str, str],
rule_set: dict,
progress_callback: Callable[[dict[str, object]], None] | None = None,
) -> list[Finding]:
findings: list[Finding] = []
combined_all_text = "\n".join(document_texts.values())
for requirement in rule_set.get("requirements", []):
requirements = list(rule_set.get("requirements", []))
total = len(requirements)
for index, requirement in enumerate(requirements, start=1):
if requirement.get("structure_required") and not _contains_any(
combined_all_text,
[requirement.get("title", ""), *requirement.get("aliases", [])],
@@ -27,25 +35,32 @@ def run_structure_check(document_texts: dict[str, str], rule_set: dict) -> list[
)
)
required_sections = requirement.get("required_sections") or []
if not required_sections:
continue
matching_docs = _matching_documents(document_texts, requirement.get("file_keywords", []))
if not matching_docs:
continue
combined_text = "\n".join(matching_docs.values())
for section in required_sections:
if _contains_any(combined_text, [section]):
continue
findings.append(
Finding(
rule_code=f"{requirement['code']}:{section}",
category="structure",
severity=requirement.get("severity", "medium"),
title=f"{requirement['title']}缺少{section}章节",
detail=f"已匹配{requirement['title']}文件,但未发现{section}相关内容。",
suggestion=requirement.get("suggestion", ""),
evidence={"section": section, "files": list(matching_docs)},
)
if required_sections:
matching_docs = _matching_documents(document_texts, requirement.get("file_keywords", []))
if matching_docs:
combined_text = "\n".join(matching_docs.values())
for section in required_sections:
if _contains_any(combined_text, [section]):
continue
findings.append(
Finding(
rule_code=f"{requirement['code']}:{section}",
category="structure",
severity=requirement.get("severity", "medium"),
title=f"{requirement['title']}缺少{section}章节",
detail=f"已匹配{requirement['title']}文件,但未发现{section}相关内容。",
suggestion=requirement.get("suggestion", ""),
evidence={"section": section, "files": list(matching_docs)},
)
)
if progress_callback:
progress_callback(
{
"processed": index,
"total": total,
"label": _numbered_title(requirement),
"finding_count": len(findings),
}
)
return findings