fix(regulatory): 修复条件确认实时轮询和重复提示

This commit is contained in:
2026-06-07 12:09:02 +08:00
parent 8f16675a92
commit 911e5378e8
3 changed files with 32 additions and 4 deletions

View File

@@ -649,12 +649,14 @@
return;
}
var cardId = "condition-confirmation-" + confirmation.batch_id;
removeStaleConditionConfirmationCards(cardId);
if (document.getElementById(cardId)) {
return;
}
var article = document.createElement("article");
article.className = "message assistant";
article.id = cardId;
article.setAttribute("data-condition-confirmation-card", "");
article.setAttribute("data-node-label", "AI 适用条件确认");
var avatar = document.createElement("div");
@@ -687,6 +689,14 @@
scrollChatToBottom();
}
function removeStaleConditionConfirmationCards(activeCardId) {
document.querySelectorAll("[data-condition-confirmation-card]").forEach(function (card) {
if (card.id !== activeCardId) {
card.remove();
}
});
}
function renderConditionFields(candidates) {
var html = "";
Object.keys(candidates || {}).forEach(function (field) {
@@ -830,9 +840,9 @@
delete workflowPollingTimers[key];
}
function startWorkflowPolling(batchId) {
function startWorkflowPolling(batchId, workflow_type) {
var card = workflowCardList ? workflowCardList.querySelector('[data-batch-id="' + batchId + '"]') : null;
var workflow_type = card ? card.getAttribute("data-workflow-type") || "file_summary" : "file_summary";
workflow_type = workflow_type || (card ? card.getAttribute("data-workflow-type") || "file_summary" : "file_summary");
var key = workflowTimerKey(batchId, workflow_type);
if (!batchId || workflowPollingTimers[key]) {
return;
@@ -907,7 +917,7 @@
status.textContent = "已确认,工作流继续执行。";
}
form.classList.add("confirmed");
startWorkflowPolling(batchId);
startWorkflowPolling(batchId, "regulatory_review");
await refreshWorkflowCard(batchId, "regulatory_review");
} catch (error) {
if (status) {
@@ -1050,7 +1060,7 @@
assistantMessage.text.innerHTML = renderAssistantContent(assistantText);
} else if (eventName === "workflow_started") {
ensureWorkflowCard(payload);
startWorkflowPolling(payload.batch_id);
startWorkflowPolling(payload.batch_id, payload.workflow_type);
} else if (eventName === "done") {
if (payload.assistant_message_id) {
assistantMessage.article.id = "message-" + payload.assistant_message_id;

View File

@@ -128,6 +128,7 @@
<article
class="message assistant"
id="condition-confirmation-{{ condition_confirmation.id }}"
data-condition-confirmation-card
data-node-label="AI 适用条件确认"
>
<div class="message-avatar">AI</div>

View File

@@ -163,3 +163,20 @@ def test_frontend_selects_status_url_by_workflow_type():
assert "condition_confirmation" in script
assert "bindRectificationActionButtons" in script
assert "data-rectification-action" in script
def test_frontend_polls_regulatory_workflow_with_explicit_workflow_type():
script = open("static/js/app.js", encoding="utf-8").read()
assert "function startWorkflowPolling(batchId, workflow_type)" in script
assert "startWorkflowPolling(payload.batch_id, payload.workflow_type)" in script
assert 'startWorkflowPolling(batchId, "regulatory_review")' in script
assert 'workflow_type || (card ? card.getAttribute("data-workflow-type") || "file_summary" : "file_summary")' in script
def test_frontend_keeps_single_condition_confirmation_prompt():
script = open("static/js/app.js", encoding="utf-8").read()
assert "data-condition-confirmation-card" in script
assert "removeStaleConditionConfirmationCards" in script
assert '[data-condition-confirmation-card]' in script