async function executePlan()

in spring-ai-alibaba-jmanus/src/main/resources/static/plan-template/js/plan-template.js [477:612]


async function executePlan() {
    if (isExecuting) {
        return;
    }

    if (!currentPlanTemplateId) {
        alert('没有可执行的计划模板');
        return;
    }

    try {
        isExecuting = true;
        updateUIState();

        let jsonContent = jsonEditor.value.trim();
        let response;

        // 获取执行参数(如果有)
        let executionParams = null;
        if (planParamsInput && planParamsInput.value.trim()) {
            try {
                executionParams = planParamsInput.value.trim();
                console.log('使用自定义参数执行计划:', executionParams);
            } catch (e) {
                console.error('参数JSON解析错误', e);
                alert('无效的参数JSON格式: ' + e.message);
                isExecuting = false;
                updateUIState();
                return;
            }
        }

        // 检查JSON内容是否已修改
        let isModified = true;
        if (currentVersionIndex >= 0 && planVersions.length > 0) {
            const latestVersion = planVersions[currentVersionIndex];
            isModified = jsonContent !== latestVersion;
        }

        if (isModified) {
            // JSON已修改,先保存新版本
            // 保存此版本到版本历史
            saveToVersionHistory(jsonContent);

            // 保存到服务器
            await savePlanToServer(currentPlanTemplateId, jsonContent);

            console.log('修改后的JSON已保存,使用计划模板ID执行');
        }

        // 使用现有计划模板ID执行,使用统一的API函数
        // 如果有参数,则传递参数对象;否则不传递额外参数
        if (executionParams) {
            // 使用带参数的执行方式
            response = await ManusAPI.executePlan(currentPlanTemplateId, executionParams);
        } else {
            // 使用无参数的执行方式
            response = await ManusAPI.executePlan(currentPlanTemplateId);
        }

        // 更新当前计划ID
        currentPlanId = response.planId;

        // 检查并初始化聊天区域
        if (!chatArea) {
            chatArea = document.querySelector('.simple-chat-area .dialog-round-container');
        }

        // 如果聊天区域不存在,则创建一个
        if (!chatArea) {
            const simpleChatArea = document.querySelector('.simple-chat-area');
            if (simpleChatArea) {
                chatArea = document.createElement('div');
                chatArea.className = 'dialog-round-container';
                chatArea.dataset.dialogRoundId = 'auto-created';
                chatArea.dataset.planId = currentPlanId;
                simpleChatArea.appendChild(chatArea);
                console.log('创建了新的对话容器');
            } else {
                console.error('无法找到 .simple-chat-area 元素');
                alert('UI元素初始化失败,请刷新页面重试');
                return; // 中止执行
            }
        }

        // 隐藏空聊天提示
        const emptyMessage = document.querySelector('.empty-chat-message');
        if (emptyMessage) {
            emptyMessage.style.display = 'none';
        }

        // 添加用户输入到聊天区域
        const userMessage = document.createElement('div');
        userMessage.className = 'message user-message';
        userMessage.innerHTML = `<p>执行计划: ${planPromptInput.value || '计划执行'}</p>`;
        chatArea.appendChild(userMessage);

        // 创建AI消息容器
        const aiStepsContainer = document.createElement('div');
        aiStepsContainer.className = 'message ai-message ai-steps-container';
        chatArea.appendChild(aiStepsContainer);

        // 通知右侧边栏和聊天处理器
        if (typeof PlanUIEvents !== 'undefined') {
            // 发出对话轮次开始事件
            PlanUIEvents.EventSystem.emit(PlanUIEvents.UI_EVENTS.DIALOG_ROUND_START, {
                planId: currentPlanId,
                query: planPromptInput.value || '计划执行'
            });

            // 模拟发送plan-update事件
            if (currentPlanData) {
                PlanUIEvents.EventSystem.emit('plan-update', currentPlanData);
            }
        }

        // 静默方式提示用户(不使用alert,避免打断用户体验)
        console.log('计划执行请求已提交,可以在右侧边栏查看执行进度');

        // 更新API URL
        if (currentPlanTemplateId) {
            apiUrlElement.textContent = `http://your-domain/api/plan-template/execute/${currentPlanTemplateId}`;
        }

        // 开始轮询执行状态
        lastSequenceSize = 0; // 重置序列大小,以便接收所有执行记录
        startPolling();

    } catch (error) {
        console.error('执行计划出错:', error);
        alert('执行计划失败: ' + error.message);
    } finally {
        isExecuting = false;
        updateUIState();
    }
}