feat: 持久化会话节点结果与失败通知留痕

This commit is contained in:
2026-06-04 01:02:06 +08:00
parent b8381b3ba1
commit 2b40ddc487
2 changed files with 125 additions and 0 deletions

View File

@@ -172,6 +172,106 @@ def test_chat_execution_creates_notification_record_from_agent_result(client, db
assert record.batch_id == batch.batch_id
def test_chat_execution_creates_failed_notification_record_and_updates_conversation(client, db, monkeypatch):
batch, conversation = _create_conversation_with_batch()
UploadedDocument.objects.create(
batch=batch,
scenario_id="document_review",
original_name="说明书.md",
file_type="md",
size=1,
status=UploadedDocument.STATUS_INDEXED,
)
monkeypatch.setattr(
"apps.chat.views.run_agent",
lambda *args, **kwargs: AgentResult(
answer="执行失败",
status="failed",
error="规则执行失败",
node_results=[
{"code": "package_import", "label": "资料包导入", "status": "已完成"},
{"code": "overview", "label": "目录汇总", "status": "已完成"},
{"code": "risk", "label": "风险预警", "status": "已阻断"},
{"code": "feishu_notify", "label": "飞书通知", "status": "失败"},
],
notification_payload={
"batch_id": batch.batch_id,
"conversation_id": conversation.conversation_id,
"product_name": batch.product_name,
"notify_reason": "task_failed",
"owners": [
{
"owner_role": "注册申报负责人",
"feishu_user_id": "ou_demo_2",
}
],
},
),
)
response = client.post(
reverse("chat:detail", args=[conversation.conversation_id]),
{"message": "执行失败任务"},
)
assert response.status_code == 200
record = NotificationRecord.objects.get()
conversation.refresh_from_db()
assert record.notify_reason == "task_failed"
assert record.message_status == "failed"
assert conversation.task_status == "failed"
assert conversation.node_results[-1]["label"] == "飞书通知"
def test_chat_execution_persists_agent_node_results_to_conversation(client, db, monkeypatch):
batch, conversation = _create_conversation_with_batch()
UploadedDocument.objects.create(
batch=batch,
scenario_id="document_review",
original_name="说明书.md",
file_type="md",
size=1,
status=UploadedDocument.STATUS_INDEXED,
)
monkeypatch.setattr(
"apps.chat.views.run_agent",
lambda *args, **kwargs: AgentResult(
answer="已生成风险结论",
status="success",
node_results=[
{"code": "package_import", "label": "资料包导入", "status": "已完成"},
{"code": "overview", "label": "目录汇总", "status": "已完成"},
{"code": "completeness", "label": "法规完整性检查", "status": "已完成"},
{"code": "field_extraction", "label": "字段抽取", "status": "已完成"},
{"code": "consistency", "label": "一致性核查", "status": "待复核"},
{"code": "risk", "label": "风险预警", "status": "已阻断", "summary": "存在高风险"},
{"code": "word_export", "label": "Word 回填导出", "status": "待处理"},
{"code": "feishu_notify", "label": "飞书通知", "status": "待处理"},
],
notification_payload={
"batch_id": batch.batch_id,
"conversation_id": conversation.conversation_id,
"product_name": batch.product_name,
"notify_reason": "task_completed",
"owners": [],
},
),
)
response = client.post(
reverse("chat:detail", args=[conversation.conversation_id]),
{"message": "执行节点任务"},
)
assert response.status_code == 200
conversation.refresh_from_db()
assert len(conversation.node_results) == 8
assert conversation.task_status == "success"
assert conversation.latest_summary["answer"] == "已生成风险结论"
def test_create_conversation_for_batch_initializes_eight_workflow_nodes(db):
conversation = create_conversation_for_batch(
"SUB-20260604-001",