diff --git a/review_agent/regulatory_review/services/completeness_check.py b/review_agent/regulatory_review/services/completeness_check.py index 7b2b1ad..c30e11c 100644 --- a/review_agent/regulatory_review/services/completeness_check.py +++ b/review_agent/regulatory_review/services/completeness_check.py @@ -27,8 +27,8 @@ def run_completeness_check(batch: FileSummaryBatch, rule_set: dict) -> list[Find rule_code=requirement["code"], category=requirement.get("category", "completeness"), severity=requirement.get("severity", "medium"), - title=f"缺少{requirement['title']}", - detail=f"当前文件汇总批次未发现{requirement['title']}。", + title=f"缺少{_numbered_title(requirement)}", + detail=f"当前文件汇总批次未发现{_numbered_title(requirement)}。", suggestion=requirement.get("suggestion", ""), evidence={ "requirement_type": requirement.get("type"), @@ -44,3 +44,10 @@ def run_completeness_check(batch: FileSummaryBatch, rule_set: dict) -> list[Find def _matches_item(file_name: str, relative_path: str, directory_level: str, keywords: list[str]) -> bool: haystack = f"{file_name} {relative_path} {directory_level}".lower() return any(str(keyword).lower() in haystack for keyword in keywords) + + +def _numbered_title(requirement: dict) -> str: + attachment4_code = requirement.get("attachment4_code") + if not attachment4_code: + return requirement["title"] + return f"{attachment4_code}{requirement['title']}" diff --git a/review_agent/regulatory_review/services/structure_check.py b/review_agent/regulatory_review/services/structure_check.py index d57758a..85f5b27 100644 --- a/review_agent/regulatory_review/services/structure_check.py +++ b/review_agent/regulatory_review/services/structure_check.py @@ -16,8 +16,8 @@ def run_structure_check(document_texts: dict[str, str], rule_set: dict) -> list[ rule_code=requirement["code"], category="structure", severity=requirement.get("severity", "medium"), - title=f"申报资料目录缺少{requirement['title']}章节", - detail=f"未在申报资料目录或章节标题候选中发现{requirement['title']}。", + title=f"申报资料目录缺少{_numbered_title(requirement)}章节", + detail=f"未在申报资料目录或章节标题候选中发现{_numbered_title(requirement)}。", suggestion=requirement.get("suggestion", ""), evidence={ "attachment4_code": requirement.get("attachment4_code"), @@ -68,3 +68,10 @@ def _contains_any(text: str, needles: list[str]) -> bool: def _normalize_title(value: str) -> str: return "".join(str(value).lower().replace("/", "").replace("/", "").split()) + + +def _numbered_title(requirement: dict) -> str: + attachment4_code = requirement.get("attachment4_code") + if not attachment4_code: + return requirement["title"] + return f"{attachment4_code}{requirement['title']}" diff --git a/tests/test_regulatory_completeness.py b/tests/test_regulatory_completeness.py index 16467bb..51944fc 100644 --- a/tests/test_regulatory_completeness.py +++ b/tests/test_regulatory_completeness.py @@ -37,7 +37,7 @@ def test_completeness_check_matches_existing_files_and_reports_missing(django_us findings = run_completeness_check(batch, load_rule_file()) titles = [finding.title for finding in findings] - assert "缺少注册检验报告" in titles + assert "缺少3.4注册检验报告" in titles assert "缺少产品技术要求" not in titles missing = next(finding for finding in findings if finding.rule_code == "registration_test_report") assert missing.severity == "blocking" @@ -67,5 +67,6 @@ def test_completeness_check_matches_attachment4_directory_names(django_user_mode assert not any(finding.rule_code == "attachment4_1_2_application_form" for finding in findings) missing_qms = next(finding for finding in findings if finding.rule_code == "attachment4_6_quality_system") + assert missing_qms.title == "缺少6质量管理体系文件" assert missing_qms.severity == "high" assert missing_qms.evidence["searched_fields"] == ["file_name", "relative_path", "directory_level"] diff --git a/tests/test_regulatory_structure.py b/tests/test_regulatory_structure.py index e883918..ac571ff 100644 --- a/tests/test_regulatory_structure.py +++ b/tests/test_regulatory_structure.py @@ -22,4 +22,5 @@ def test_structure_check_reports_missing_attachment4_outline_heading(): missing = next(finding for finding in findings if finding.rule_code == "attachment4_4_clinical_evaluation") assert missing.category == "structure" + assert missing.title == "申报资料目录缺少4临床评价资料章节" assert missing.evidence["expected_title"] == "临床评价资料"