fix(regulatory): 缺失问题标题显示章节序号
This commit is contained in:
@@ -27,8 +27,8 @@ def run_completeness_check(batch: FileSummaryBatch, rule_set: dict) -> list[Find
|
|||||||
rule_code=requirement["code"],
|
rule_code=requirement["code"],
|
||||||
category=requirement.get("category", "completeness"),
|
category=requirement.get("category", "completeness"),
|
||||||
severity=requirement.get("severity", "medium"),
|
severity=requirement.get("severity", "medium"),
|
||||||
title=f"缺少{requirement['title']}",
|
title=f"缺少{_numbered_title(requirement)}",
|
||||||
detail=f"当前文件汇总批次未发现{requirement['title']}。",
|
detail=f"当前文件汇总批次未发现{_numbered_title(requirement)}。",
|
||||||
suggestion=requirement.get("suggestion", ""),
|
suggestion=requirement.get("suggestion", ""),
|
||||||
evidence={
|
evidence={
|
||||||
"requirement_type": requirement.get("type"),
|
"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:
|
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()
|
haystack = f"{file_name} {relative_path} {directory_level}".lower()
|
||||||
return any(str(keyword).lower() in haystack for keyword in keywords)
|
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']}"
|
||||||
|
|||||||
@@ -16,8 +16,8 @@ def run_structure_check(document_texts: dict[str, str], rule_set: dict) -> list[
|
|||||||
rule_code=requirement["code"],
|
rule_code=requirement["code"],
|
||||||
category="structure",
|
category="structure",
|
||||||
severity=requirement.get("severity", "medium"),
|
severity=requirement.get("severity", "medium"),
|
||||||
title=f"申报资料目录缺少{requirement['title']}章节",
|
title=f"申报资料目录缺少{_numbered_title(requirement)}章节",
|
||||||
detail=f"未在申报资料目录或章节标题候选中发现{requirement['title']}。",
|
detail=f"未在申报资料目录或章节标题候选中发现{_numbered_title(requirement)}。",
|
||||||
suggestion=requirement.get("suggestion", ""),
|
suggestion=requirement.get("suggestion", ""),
|
||||||
evidence={
|
evidence={
|
||||||
"attachment4_code": requirement.get("attachment4_code"),
|
"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:
|
def _normalize_title(value: str) -> str:
|
||||||
return "".join(str(value).lower().replace("/", "").replace("/", "").split())
|
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']}"
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ def test_completeness_check_matches_existing_files_and_reports_missing(django_us
|
|||||||
findings = run_completeness_check(batch, load_rule_file())
|
findings = run_completeness_check(batch, load_rule_file())
|
||||||
|
|
||||||
titles = [finding.title for finding in findings]
|
titles = [finding.title for finding in findings]
|
||||||
assert "缺少注册检验报告" in titles
|
assert "缺少3.4注册检验报告" in titles
|
||||||
assert "缺少产品技术要求" not in titles
|
assert "缺少产品技术要求" not in titles
|
||||||
missing = next(finding for finding in findings if finding.rule_code == "registration_test_report")
|
missing = next(finding for finding in findings if finding.rule_code == "registration_test_report")
|
||||||
assert missing.severity == "blocking"
|
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)
|
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")
|
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.severity == "high"
|
||||||
assert missing_qms.evidence["searched_fields"] == ["file_name", "relative_path", "directory_level"]
|
assert missing_qms.evidence["searched_fields"] == ["file_name", "relative_path", "directory_level"]
|
||||||
|
|||||||
@@ -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")
|
missing = next(finding for finding in findings if finding.rule_code == "attachment4_4_clinical_evaluation")
|
||||||
assert missing.category == "structure"
|
assert missing.category == "structure"
|
||||||
|
assert missing.title == "申报资料目录缺少4临床评价资料章节"
|
||||||
assert missing.evidence["expected_title"] == "临床评价资料"
|
assert missing.evidence["expected_title"] == "临床评价资料"
|
||||||
|
|||||||
Reference in New Issue
Block a user