agent 模式补充文件功能已经实现
This commit is contained in:
+24
-178
@@ -4,6 +4,7 @@
|
||||
import { App } from './state.js';
|
||||
import { escapeHtml } from './utils.js';
|
||||
import { addChatMessage, showStatus } from './chat.js';
|
||||
import { createSSEConnection, handleDoneResult } from './sse.js';
|
||||
|
||||
// ================================================================
|
||||
// Agent 事件处理
|
||||
@@ -59,82 +60,19 @@ function _handleAgentStateChange(msg) {
|
||||
}
|
||||
|
||||
/**
|
||||
* 请求补充材料 — 仅更新瞬态状态,持久提示消息由 done 事件分支负责
|
||||
* 请求补充材料 — 将 suggestion 以消息气泡形式单独展示
|
||||
*/
|
||||
export function _handleAgentRequestSupplement(msg) {
|
||||
const suggestion = msg.suggestion || '请补充上传相关材料';
|
||||
showStatus(suggestion);
|
||||
showStatus('信息不完整,请补充材料');
|
||||
addChatMessage(suggestion, 'system');
|
||||
}
|
||||
|
||||
/**
|
||||
* 信息完整 — 已由 process.js 的 done 处理覆盖,此处不再重复显示
|
||||
* 信息完整 — 在消息气泡中提醒用户,最终结果由 done 事件处理
|
||||
*/
|
||||
function _handleAgentReady(msg) {
|
||||
// agent_ready 事件的信息展示统一由 process.js done 分支处理
|
||||
}
|
||||
|
||||
/**
|
||||
* 自动触发财务系统提交(由 done 事件调用)
|
||||
*/
|
||||
export async function handleAutoSubmit() {
|
||||
if (!App.sessionId) {
|
||||
addChatMessage('请先上传文件并处理', 'error');
|
||||
return;
|
||||
}
|
||||
|
||||
if (App.agentEventSource) {
|
||||
App.agentEventSource.close();
|
||||
App.agentEventSource = null;
|
||||
}
|
||||
|
||||
App.isProcessing = true;
|
||||
App.processState = 'submitting';
|
||||
|
||||
try {
|
||||
showStatus('正在自动提交到财务系统...');
|
||||
|
||||
const response = await fetch(`/api/submit-financial/${App.sessionId}`, {
|
||||
method: 'POST',
|
||||
});
|
||||
|
||||
const result = await response.json();
|
||||
|
||||
if (result.status === 'started') {
|
||||
const es = new EventSource(`/api/logs/${App.sessionId}`);
|
||||
es.addEventListener('message', e => {
|
||||
try {
|
||||
const msg = JSON.parse(e.data);
|
||||
if (msg.type === 'done') {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
if (msg.result.submit_ok) {
|
||||
addChatMessage('提交完成!', 'done');
|
||||
} else {
|
||||
addChatMessage(`提交失败:${msg.result.submit_error || '未知错误'}`, 'error');
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// 普通日志行
|
||||
}
|
||||
});
|
||||
|
||||
es.onerror = () => {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
addChatMessage('连接中断', 'error');
|
||||
};
|
||||
} else if (result.error) {
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
addChatMessage(`提交失败:${result.error}`, 'error');
|
||||
}
|
||||
} catch (e) {
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
addChatMessage(`请求失败:${e.message}`, 'error');
|
||||
}
|
||||
addChatMessage(msg.message || '信息完整,正在提交到财务系统', 'done');
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -242,49 +180,15 @@ export async function handleUserSupplement(text) {
|
||||
|
||||
if (result.status === 'started') {
|
||||
showStatus('补充信息已收到,正在重新分析...');
|
||||
App.isProcessing = true;
|
||||
|
||||
const es = new EventSource(`/api/logs/${App.sessionId}`);
|
||||
es.addEventListener('message', e => {
|
||||
try {
|
||||
const msg = JSON.parse(e.data);
|
||||
|
||||
if (msg.type && msg.type.startsWith('agent_')) {
|
||||
handleAgentEvent(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'done') {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
|
||||
if (msg.result.waiting_for_supplement) {
|
||||
App.processState = 'awaiting_supplement';
|
||||
_handleAgentRequestSupplement(msg.result);
|
||||
addChatMessage('您可通过上传区补充文件,或直接输入文字说明补充信息,或输入"直接提交"跳过校验', 'system');
|
||||
} else {
|
||||
App.processState = 'done';
|
||||
if (msg.result.ok) {
|
||||
if (msg.result.submit_ok !== false) {
|
||||
addChatMessage('信息完整,已自动提交到财务系统', 'done');
|
||||
} else {
|
||||
addChatMessage(`校验通过但提交失败:${msg.result.submit_error || '未知错误'}`, 'error');
|
||||
}
|
||||
} else {
|
||||
addChatMessage(`分析失败:${msg.result.error || '未知错误'}`, 'error');
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// 普通日志
|
||||
}
|
||||
createSSEConnection(App.sessionId, {
|
||||
onDone: (result) => {
|
||||
handleDoneResult(result);
|
||||
},
|
||||
handleFileProgress: false,
|
||||
handleLLMStream: false,
|
||||
});
|
||||
|
||||
es.onerror = () => {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
addChatMessage('连接中断', 'error');
|
||||
};
|
||||
} else if (result.error) {
|
||||
addChatMessage(`处理失败:${result.error}`, 'error');
|
||||
}
|
||||
@@ -328,35 +232,13 @@ export async function handleForceSubmit() {
|
||||
App.isProcessing = true;
|
||||
App.processState = 'submitting';
|
||||
|
||||
const es = new EventSource(`/api/logs/${App.sessionId}`);
|
||||
es.addEventListener('message', e => {
|
||||
try {
|
||||
const msg = JSON.parse(e.data);
|
||||
if (msg.type === 'done') {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
App.forceSubmitting = false;
|
||||
App.lastProcessedFileCount = App.allFiles.length;
|
||||
if (msg.result.ok) {
|
||||
addChatMessage('提交完成!', 'done');
|
||||
} else {
|
||||
addChatMessage(`提交失败:${msg.result.submit_error || '未知错误'}`, 'error');
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// 普通日志行
|
||||
}
|
||||
createSSEConnection(App.sessionId, {
|
||||
onDone: (result) => {
|
||||
handleDoneResult(result);
|
||||
},
|
||||
handleFileProgress: false,
|
||||
handleLLMStream: false,
|
||||
});
|
||||
|
||||
es.onerror = () => {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
App.forceSubmitting = false;
|
||||
App.lastProcessedFileCount = App.allFiles.length;
|
||||
addChatMessage('连接中断', 'error');
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
App.forceSubmitting = false;
|
||||
@@ -389,49 +271,13 @@ export async function handleSupplementUpload(filenames) {
|
||||
const result = await response.json();
|
||||
|
||||
if (result.status === 'started') {
|
||||
const es = new EventSource(`/api/logs/${App.sessionId}`);
|
||||
es.addEventListener('message', e => {
|
||||
try {
|
||||
const msg = JSON.parse(e.data);
|
||||
App.isProcessing = true;
|
||||
|
||||
if (msg.type && msg.type.startsWith('agent_')) {
|
||||
handleAgentEvent(msg);
|
||||
return;
|
||||
}
|
||||
|
||||
if (msg.type === 'done') {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
|
||||
if (msg.result.waiting_for_supplement) {
|
||||
App.processState = 'awaiting_supplement';
|
||||
showStatus('信息不完整,请补充上传相关材料');
|
||||
addChatMessage('您可通过上传区补充文件,或直接输入文字说明补充信息,或输入"直接提交"跳过校验', 'system');
|
||||
} else {
|
||||
App.processState = 'done';
|
||||
if (msg.result.ok) {
|
||||
// 后端已自动提交,根据 submit_ok 显示结果
|
||||
if (msg.result.submit_ok !== false) {
|
||||
addChatMessage('信息完整,已自动提交到财务系统', 'done');
|
||||
} else {
|
||||
addChatMessage(`校验通过但提交失败:${msg.result.submit_error || '未知错误'}`, 'error');
|
||||
}
|
||||
} else {
|
||||
addChatMessage(`分析失败:${msg.result.error || '未知错误'}`, 'error');
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (err) {
|
||||
// 普通日志
|
||||
}
|
||||
createSSEConnection(App.sessionId, {
|
||||
onDone: (result) => {
|
||||
handleDoneResult(result);
|
||||
},
|
||||
});
|
||||
|
||||
es.onerror = () => {
|
||||
es.close();
|
||||
App.isProcessing = false;
|
||||
App.processState = 'done';
|
||||
addChatMessage('连接中断', 'error');
|
||||
};
|
||||
}
|
||||
} catch (e) {
|
||||
addChatMessage(`请求失败:${e.message}`, 'error');
|
||||
|
||||
Reference in New Issue
Block a user