feat(regulatory): 按实际处理数量更新节点进度

This commit is contained in:
2026-06-07 13:32:06 +08:00
parent 32d258bb75
commit 3e8720e521
5 changed files with 286 additions and 62 deletions

View File

@@ -17,6 +17,7 @@ from review_agent.models import (
)
from review_agent.regulatory_review.workflow import (
NODE_DEFINITIONS,
RegulatoryWorkflowExecutor,
create_regulatory_review_batch,
find_latest_successful_summary_batch,
start_regulatory_review_workflow,
@@ -413,3 +414,89 @@ def test_workflow_records_llm_review_artifacts_for_review_nodes(
assert "llm_review_structure_check.json" in artifact_names
assert "llm_review_consistency_check.json" in artifact_names
assert "llm_review_risk_assess.json" in artifact_names
def test_workflow_progress_uses_processed_file_counts(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,
)
for index, name in enumerate(["注册信息.txt", "说明书.txt", "综述.txt"], start=1):
path = tmp_path / name
path.write_text(f"产品名称:甲胎蛋白检测试剂盒\n文件:{name}", encoding="utf-8")
FileSummaryItem.objects.create(
batch=summary,
file_index=index,
file_name=name,
file_type="txt",
relative_path=name,
storage_path=str(path),
)
batch = create_regulatory_review_batch(
conversation=conversation,
user=user,
source_summary_batch=summary,
)
node = WorkflowNodeRun.objects.get(
workflow_type="regulatory_review",
workflow_batch_id=batch.pk,
node_code="text_extract",
)
executor = RegulatoryWorkflowExecutor(batch)
texts = executor._extract_source_texts(node)
node.refresh_from_db()
assert len(texts) == 3
assert node.progress == 95
assert "文本抽取 3/3" in node.message
assert "综述.txt" in node.message
assert WorkflowEvent.objects.filter(
workflow_type="regulatory_review",
workflow_batch_id=batch.pk,
event_type="node_progress",
payload__node_code="text_extract",
payload__processed=3,
payload__total=3,
).exists()
def test_review_services_emit_actual_workload_progress_callbacks(django_user_model):
from review_agent.regulatory_review.services.completeness_check import run_completeness_check
from review_agent.regulatory_review.services.consistency_check import FIELDS, run_consistency_check
from review_agent.regulatory_review.services.structure_check import run_structure_check
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,
)
rule_set = {
"requirements": [
{"code": "r1", "title": "注册信息", "type": "required", "file_keywords": ["注册信息"]},
{"code": "r2", "title": "说明书", "type": "required", "file_keywords": ["说明书"]},
]
}
completeness_updates = []
structure_updates = []
consistency_updates = []
run_completeness_check(summary, rule_set, progress_callback=completeness_updates.append)
run_structure_check({"注册信息.txt": "注册信息"}, rule_set, progress_callback=structure_updates.append)
run_consistency_check({"注册信息.txt": "产品名称A"}, progress_callback=consistency_updates.append)
assert completeness_updates[-1]["processed"] == 2
assert completeness_updates[-1]["total"] == 2
assert completeness_updates[-1]["label"] == "说明书"
assert structure_updates[-1]["processed"] == 2
assert structure_updates[-1]["total"] == 2
assert consistency_updates[-1]["processed"] == len(FIELDS)
assert consistency_updates[-1]["total"] == len(FIELDS)