feat: 支持会话内补传资料并保持绑定
This commit is contained in:
@@ -1,4 +1,7 @@
|
||||
from django import forms
|
||||
from pathlib import Path
|
||||
|
||||
from apps.documents.forms import MultipleFileField, SUPPORTED_EXTENSIONS
|
||||
|
||||
|
||||
class ChatForm(forms.Form):
|
||||
@@ -38,3 +41,23 @@ class ChatForm(forms.Form):
|
||||
def clean_document_ids(self):
|
||||
# View 与 Agent Core 都使用整型文档 ID,统一在表单层完成转换。
|
||||
return [int(document_id) for document_id in self.cleaned_data.get("document_ids", [])]
|
||||
|
||||
|
||||
class ConversationUploadForm(forms.Form):
|
||||
# 会话右侧上传区只负责继续补传资料,不修改会话绑定关系。
|
||||
files = MultipleFileField(label="补充文件或资料包", required=False)
|
||||
file = forms.FileField(label="兼容单文件上传", required=False)
|
||||
|
||||
def clean(self):
|
||||
cleaned_data = super().clean()
|
||||
files = list(cleaned_data.get("files") or [])
|
||||
file = cleaned_data.get("file")
|
||||
if file:
|
||||
files.append(file)
|
||||
if not files:
|
||||
raise forms.ValidationError("请至少上传一个文件或资料包。")
|
||||
for uploaded_file in files:
|
||||
if Path(uploaded_file.name).suffix.lower() not in SUPPORTED_EXTENSIONS:
|
||||
raise forms.ValidationError("仅支持 .txt、.md、.pdf、.docx、.zip 和 .7z 文件")
|
||||
cleaned_data["uploaded_files"] = files
|
||||
return cleaned_data
|
||||
|
||||
@@ -9,4 +9,5 @@ app_name = "chat"
|
||||
urlpatterns = [
|
||||
path("", views.index, name="index"),
|
||||
path("<str:conversation_id>/", views.detail, name="detail"),
|
||||
path("<str:conversation_id>/upload/", views.upload_documents, name="upload-documents"),
|
||||
]
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
from django.contrib import messages
|
||||
from django.utils import timezone
|
||||
from django.shortcuts import get_object_or_404, redirect, render
|
||||
from django.urls import reverse
|
||||
from django.views.decorators.http import require_POST
|
||||
|
||||
from agent_core.orchestrator import run_agent
|
||||
from agent_core.results import AgentResult
|
||||
from apps.audit.services import create_audit_log, create_notification_record
|
||||
from apps.documents.models import SubmissionBatch, UploadedDocument
|
||||
from apps.documents.services import append_documents_to_batch
|
||||
from apps.scenarios.services import get_scenario
|
||||
|
||||
from .forms import ChatForm
|
||||
from .forms import ChatForm, ConversationUploadForm
|
||||
from .models import Conversation
|
||||
|
||||
|
||||
@@ -37,6 +40,7 @@ def detail(request, conversation_id: str):
|
||||
batch = SubmissionBatch.objects.filter(batch_id=conversation.batch_id).first()
|
||||
documents = UploadedDocument.objects.filter(batch=batch)
|
||||
form = ChatForm(request.POST or None, documents=documents)
|
||||
upload_form = ConversationUploadForm()
|
||||
result = None
|
||||
audit_log = None
|
||||
active_node = None
|
||||
@@ -97,10 +101,35 @@ def detail(request, conversation_id: str):
|
||||
"node_results": conversation.node_results,
|
||||
"active_node": active_node,
|
||||
"workspace_summary": workspace_summary,
|
||||
"upload_form": upload_form,
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
@require_POST
|
||||
def upload_documents(request, conversation_id: str):
|
||||
conversation = get_object_or_404(Conversation, conversation_id=conversation_id)
|
||||
batch = get_object_or_404(SubmissionBatch, batch_id=conversation.batch_id)
|
||||
upload_form = ConversationUploadForm(request.POST, request.FILES)
|
||||
if upload_form.is_valid():
|
||||
result = append_documents_to_batch(
|
||||
"document_review",
|
||||
batch,
|
||||
upload_form.cleaned_data["uploaded_files"],
|
||||
)
|
||||
warning_count = len(result["registration_overview_report"]["warnings"])
|
||||
message = "资料已补充到当前资料包。"
|
||||
if warning_count:
|
||||
message += f" 当前有 {warning_count} 条待复核提示。"
|
||||
messages.success(request, message)
|
||||
else:
|
||||
messages.error(
|
||||
request,
|
||||
"补充资料失败:" + " ".join(upload_form.non_field_errors()) if upload_form.non_field_errors() else "补充资料失败。",
|
||||
)
|
||||
return redirect("chat:detail", conversation_id=conversation.conversation_id)
|
||||
|
||||
|
||||
def _persist_notification_records(result: AgentResult, *, web_detail_url: str = "") -> None:
|
||||
payload = result.notification_payload or {}
|
||||
owners = payload.get("owners") or []
|
||||
|
||||
Reference in New Issue
Block a user