fix(regulatory): 修复无标签文档适用条件回显
This commit is contained in:
@@ -161,6 +161,61 @@ def test_detect_regulatory_condition_uses_llm_review_for_better_product_name(
|
||||
assert candidates["product_name"]["source"] == "llm"
|
||||
|
||||
|
||||
def test_detect_regulatory_condition_infers_fields_from_unlabeled_attachment_text(
|
||||
settings, tmp_path, django_user_model
|
||||
):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
summary = FileSummaryBatch.objects.create(
|
||||
conversation=conversation,
|
||||
user=user,
|
||||
batch_no="FS-COND",
|
||||
status=FileSummaryBatch.Status.SUCCESS,
|
||||
product_name="第1章 监管信息",
|
||||
)
|
||||
standard_list = tmp_path / "standard_list.txt"
|
||||
standard_list.write_text(
|
||||
"国家药品监督管理局:\n"
|
||||
"卡尤迪生物科技宜兴有限公司申请境内第三类体外诊断试剂"
|
||||
"呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)产品注册。\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
product_list = tmp_path / "product_list.txt"
|
||||
product_list.write_text(
|
||||
"呼吸道合胞病毒、肺炎支原体核酸检测试剂盒\n"
|
||||
"(荧光PCR法)\n"
|
||||
"产品的包装规格\n"
|
||||
"24人份/盒、48人份/盒\n",
|
||||
encoding="utf-8",
|
||||
)
|
||||
FileSummaryItem.objects.create(
|
||||
batch=summary,
|
||||
file_index=1,
|
||||
directory_level="第1章 监管信息",
|
||||
file_name="符合标准的清单.txt",
|
||||
file_type="txt",
|
||||
relative_path="第1章 监管信息/符合标准的清单.txt",
|
||||
storage_path=str(standard_list),
|
||||
)
|
||||
FileSummaryItem.objects.create(
|
||||
batch=summary,
|
||||
file_index=2,
|
||||
directory_level="第1章 监管信息",
|
||||
file_name="产品列表.txt",
|
||||
file_type="txt",
|
||||
relative_path="第1章 监管信息/产品列表.txt",
|
||||
storage_path=str(product_list),
|
||||
)
|
||||
|
||||
candidates = detect_regulatory_condition_candidates(summary)
|
||||
|
||||
assert candidates["product_category"]["suggested"] == "体外诊断试剂"
|
||||
assert candidates["product_name"]["suggested"] == "呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)"
|
||||
assert candidates["product_name"]["source"] == "inferred"
|
||||
assert candidates["model_spec"]["suggested"] == "24人份/盒、48人份/盒"
|
||||
|
||||
|
||||
def test_workflow_pauses_before_rule_scope_until_conditions_confirmed(settings, tmp_path, django_user_model):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
|
||||
@@ -4,6 +4,7 @@ from django.urls import reverse
|
||||
from review_agent.models import (
|
||||
Conversation,
|
||||
FileSummaryBatch,
|
||||
FileSummaryItem,
|
||||
RegulatoryArtifact,
|
||||
RegulatoryNotificationRecord,
|
||||
RegulatoryReviewBatch,
|
||||
@@ -108,6 +109,55 @@ def test_workspace_renders_condition_confirmation_form(client, django_user_model
|
||||
assert "data-condition-confirm-form" not in content[summary_index:]
|
||||
|
||||
|
||||
def test_workspace_refreshes_incomplete_condition_confirmation_candidates(client, settings, tmp_path, django_user_model):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
summary = FileSummaryBatch.objects.create(
|
||||
conversation=conversation,
|
||||
user=user,
|
||||
batch_no="FS-OK",
|
||||
status=FileSummaryBatch.Status.SUCCESS,
|
||||
product_name="第1章 监管信息",
|
||||
)
|
||||
application = tmp_path / "application.txt"
|
||||
application.write_text(
|
||||
"卡尤迪生物科技宜兴有限公司申请境内第三类体外诊断试剂"
|
||||
"呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)产品注册。",
|
||||
encoding="utf-8",
|
||||
)
|
||||
FileSummaryItem.objects.create(
|
||||
batch=summary,
|
||||
file_index=1,
|
||||
directory_level="第1章 监管信息",
|
||||
file_name="符合标准的清单.txt",
|
||||
file_type="txt",
|
||||
relative_path="第1章 监管信息/符合标准的清单.txt",
|
||||
storage_path=str(application),
|
||||
)
|
||||
RegulatoryReviewBatch.objects.create(
|
||||
conversation=conversation,
|
||||
user=user,
|
||||
source_summary_batch=summary,
|
||||
batch_no="RR-WAIT-EMPTY",
|
||||
status=RegulatoryReviewBatch.Status.WAITING_USER,
|
||||
condition_json={
|
||||
"confirmed": False,
|
||||
"candidates": {
|
||||
"product_category": {"label": "产品类别", "input_type": "select", "options": ["其他"], "suggested": "其他"},
|
||||
"product_name": {"label": "产品名称", "input_type": "text", "suggested": ""},
|
||||
},
|
||||
},
|
||||
)
|
||||
client.force_login(user)
|
||||
|
||||
response = client.get(f"{reverse('home')}?conversation={conversation.pk}")
|
||||
|
||||
content = response.content.decode("utf-8")
|
||||
assert "体外诊断试剂" in content
|
||||
assert "呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)" in content
|
||||
|
||||
|
||||
def test_workspace_renders_rectification_actions_and_summaries(client, tmp_path, django_user_model):
|
||||
user = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=user, title="会话")
|
||||
|
||||
@@ -40,3 +40,18 @@ def test_review_condition_fields_falls_back_when_llm_returns_chapter_title():
|
||||
|
||||
assert result["selected_fields"]["产品名称"] == "甲胎蛋白检测试剂盒"
|
||||
assert result["selected_sources"]["产品名称"] == "rule"
|
||||
|
||||
|
||||
def test_review_condition_fields_rejects_garbled_llm_product_name():
|
||||
def completion(messages, temperature=0.0):
|
||||
return json.dumps({"fields": {"产品名称": "呼吸道合胞病毒、 <20>肺炎支原体核酸检测试剂盒 (荧光PCR法)"}}, ensure_ascii=False)
|
||||
|
||||
result = review_condition_fields(
|
||||
text="呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)",
|
||||
rule_fields={"产品名称": "呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)"},
|
||||
file_context="产品列表.txt",
|
||||
completion_func=completion,
|
||||
)
|
||||
|
||||
assert result["selected_fields"]["产品名称"] == "呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)"
|
||||
assert result["selected_sources"]["产品名称"] == "rule"
|
||||
|
||||
@@ -80,3 +80,57 @@ def test_regulatory_batch_status_exposes_condition_confirmation(client, django_u
|
||||
assert payload["batch"]["status"] == RegulatoryReviewBatch.Status.WAITING_USER
|
||||
assert payload["condition_confirmation"]["batch_id"] == batch.pk
|
||||
assert payload["condition_confirmation"]["candidates"]["product_category"]["suggested"] == "体外诊断试剂"
|
||||
|
||||
|
||||
def test_regulatory_batch_status_refreshes_incomplete_condition_candidates(
|
||||
client, settings, tmp_path, django_user_model
|
||||
):
|
||||
settings.MEDIA_ROOT = tmp_path
|
||||
owner = django_user_model.objects.create_user(username="owner", password="pass")
|
||||
conversation = Conversation.objects.create(user=owner, title="会话")
|
||||
summary = FileSummaryBatch.objects.create(
|
||||
conversation=conversation,
|
||||
user=owner,
|
||||
batch_no="FS-OK",
|
||||
status=FileSummaryBatch.Status.SUCCESS,
|
||||
product_name="第1章 监管信息",
|
||||
)
|
||||
application = tmp_path / "application.txt"
|
||||
application.write_text(
|
||||
"卡尤迪生物科技宜兴有限公司申请境内第三类体外诊断试剂"
|
||||
"呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)产品注册。",
|
||||
encoding="utf-8",
|
||||
)
|
||||
from review_agent.models import FileSummaryItem
|
||||
|
||||
FileSummaryItem.objects.create(
|
||||
batch=summary,
|
||||
file_index=1,
|
||||
directory_level="第1章 监管信息",
|
||||
file_name="符合标准的清单.txt",
|
||||
file_type="txt",
|
||||
relative_path="第1章 监管信息/符合标准的清单.txt",
|
||||
storage_path=str(application),
|
||||
)
|
||||
batch = RegulatoryReviewBatch.objects.create(
|
||||
conversation=conversation,
|
||||
user=owner,
|
||||
source_summary_batch=summary,
|
||||
batch_no="RR-WAIT-EMPTY",
|
||||
status=RegulatoryReviewBatch.Status.WAITING_USER,
|
||||
condition_json={
|
||||
"confirmed": False,
|
||||
"candidates": {
|
||||
"product_category": {"suggested": "其他"},
|
||||
"product_name": {"suggested": ""},
|
||||
},
|
||||
},
|
||||
)
|
||||
client.force_login(owner)
|
||||
|
||||
response = client.get(reverse("regulatory_review_batch_status", args=[batch.pk]))
|
||||
|
||||
payload = response.json()
|
||||
candidates = payload["condition_confirmation"]["candidates"]
|
||||
assert candidates["product_category"]["suggested"] == "体外诊断试剂"
|
||||
assert candidates["product_name"]["suggested"] == "呼吸道合胞病毒、肺炎支原体核酸检测试剂盒(荧光PCR法)"
|
||||
|
||||
Reference in New Issue
Block a user