feat(regulatory): 新增法规核查模型与工作流通用字段

This commit is contained in:
2026-06-07 00:23:58 +08:00
parent 665403735a
commit f52dcc197d
8 changed files with 878 additions and 7 deletions

View File

@@ -0,0 +1,137 @@
import pytest
from review_agent.models import (
Conversation,
ExportedSummaryFile,
FileSummaryBatch,
Message,
RegulatoryArtifact,
RegulatoryIssue,
RegulatoryNotificationRecord,
RegulatoryReviewBatch,
RegulatoryRuleVersion,
WorkflowEvent,
WorkflowNodeRun,
)
pytestmark = pytest.mark.django_db
def test_regulatory_models_store_batch_issue_artifact_and_notification(django_user_model):
user = django_user_model.objects.create_user(username="owner", password="pass")
conversation = Conversation.objects.create(user=user, title="法规核查")
trigger = Message.objects.create(
conversation=conversation,
role=Message.Role.USER,
content="请做NMPA法规核查",
)
summary_batch = FileSummaryBatch.objects.create(
conversation=conversation,
user=user,
batch_no="FS-READY",
status=FileSummaryBatch.Status.SUCCESS,
)
rule_version = RegulatoryRuleVersion.objects.create(
code="nmpa_ivd_registration_v1",
name="NMPA IVD 注册资料 Demo 规则",
yaml_path="review_agent/regulatory_review/rules/nmpa_ivd_registration_v1.yaml",
yaml_hash="abc123",
rag_collection="nmpa_ivd_registration_v1",
rag_index_version="idx-1",
rag_index_hash="hash-1",
status=RegulatoryRuleVersion.Status.ACTIVE,
)
batch = RegulatoryReviewBatch.objects.create(
conversation=conversation,
user=user,
trigger_message=trigger,
source_summary_batch=summary_batch,
rule_version=rule_version,
batch_no="RR-202606070001-abcdef",
)
issue = RegulatoryIssue.objects.create(
batch=batch,
rule_code="registration_test_report",
category=RegulatoryIssue.Category.COMPLETENESS,
severity=RegulatoryIssue.Severity.BLOCKING,
title="缺少注册检验报告",
suggestion="请补充注册检验报告并复核。",
evidence={"matched_files": []},
citations=[{"source": "法规.doc", "text": "注册检验报告"}],
)
artifact = RegulatoryArtifact.objects.create(
batch=batch,
artifact_type=RegulatoryArtifact.ArtifactType.JSON,
name="结果包",
storage_path="media/regulatory_review/result.json",
content_hash="hash",
)
notification = RegulatoryNotificationRecord.objects.create(
batch=batch,
channel=RegulatoryNotificationRecord.Channel.MOCK,
target="todo-plan",
payload={"issue_id": issue.pk},
)
assert batch.status == RegulatoryReviewBatch.Status.PENDING
assert batch.source_summary_batch == summary_batch
assert issue.status == RegulatoryIssue.Status.OPEN
assert artifact.artifact_type == RegulatoryArtifact.ArtifactType.JSON
assert notification.status == RegulatoryNotificationRecord.Status.PENDING
def test_generic_workflow_fields_support_file_summary_and_regulatory_batches(django_user_model):
user = django_user_model.objects.create_user(username="owner", password="pass")
conversation = Conversation.objects.create(user=user, title="会话")
summary_batch = FileSummaryBatch.objects.create(
conversation=conversation,
user=user,
batch_no="FS-GENERIC",
)
regulatory_batch = RegulatoryReviewBatch.objects.create(
conversation=conversation,
user=user,
source_summary_batch=summary_batch,
batch_no="RR-GENERIC",
)
file_node = WorkflowNodeRun.objects.create(
batch=summary_batch,
workflow_type="file_summary",
workflow_batch_id=summary_batch.pk,
node_group="file_summary",
node_code="inventory",
node_name="文件扫描",
)
regulatory_node = WorkflowNodeRun.objects.create(
workflow_type="regulatory_review",
workflow_batch_id=regulatory_batch.pk,
node_group="regulatory_review",
node_code="prepare",
node_name="准备",
)
event = WorkflowEvent.objects.create(
batch=summary_batch,
workflow_type="regulatory_review",
workflow_batch_id=regulatory_batch.pk,
conversation=conversation,
event_type="workflow_created",
payload={"batch_no": regulatory_batch.batch_no},
)
exported = ExportedSummaryFile.objects.create(
batch=summary_batch,
workflow_type="regulatory_review",
workflow_batch_id=regulatory_batch.pk,
export_category="result_package",
export_type=ExportedSummaryFile.ExportType.JSON,
file_name="result.json",
storage_path="media/regulatory_review/result.json",
)
assert file_node.batch == summary_batch
assert regulatory_node.batch is None
assert regulatory_node.workflow_batch_id == regulatory_batch.pk
assert event.conversation == conversation
assert exported.export_type == ExportedSummaryFile.ExportType.JSON