from __future__ import annotations from review_agent.models import FileSummaryBatch from review_agent.regulatory_review.schemas import Finding def run_completeness_check(batch: FileSummaryBatch, rule_set: dict) -> list[Finding]: items = list(batch.items.order_by("file_index")) findings: list[Finding] = [] for requirement in rule_set.get("requirements", []): if requirement.get("type") not in {"required", "conditional", "recommended"}: continue matched = [ item for item in items if _matches_item(item.file_name, item.relative_path, requirement.get("file_keywords", [])) ] if matched: continue findings.append( Finding( rule_code=requirement["code"], category=requirement.get("category", "completeness"), severity=requirement.get("severity", "medium"), title=f"缺少{requirement['title']}", detail=f"当前文件汇总批次未发现{requirement['title']}。", suggestion=requirement.get("suggestion", ""), evidence={ "requirement_type": requirement.get("type"), "matched_files": [], "searched_keywords": requirement.get("file_keywords", []), }, ) ) return findings def _matches_item(file_name: str, relative_path: str, keywords: list[str]) -> bool: haystack = f"{file_name} {relative_path}".lower() return any(str(keyword).lower() in haystack for keyword in keywords)