diff --git a/web/src/composables/workbenchAiMode/useWorkbenchAiActionRouter.js b/web/src/composables/workbenchAiMode/useWorkbenchAiActionRouter.js index 254dac4..3322913 100644 --- a/web/src/composables/workbenchAiMode/useWorkbenchAiActionRouter.js +++ b/web/src/composables/workbenchAiMode/useWorkbenchAiActionRouter.js @@ -223,8 +223,10 @@ export function useWorkbenchAiActionRouter({ const result = await executeStewardAction( buildStewardActionExecutePayload(action, actionType, contextJson) ) + const resultActions = buildStewardActionResultActions(result) + const nextTaskAction = buildNextTaskSuggestedAction(actionPayload) finalizeStewardActionMessage(pendingMessage, buildStewardActionResultText(result), { - suggestedActions: buildStewardActionResultActions(result) + suggestedActions: nextTaskAction ? [...resultActions, nextTaskAction] : resultActions }) return true } catch (error) { @@ -369,6 +371,39 @@ export function useWorkbenchAiActionRouter({ }] } + function buildNextTaskSuggestedAction(actionPayload = {}) { + // 多 task 串行推进:task1 完成后,从剩余 task 列表取下一个,生成推进按钮。 + // 用户点击推进按钮后,handleInlineSuggestedAction 的 steward_confirm_flow 分支 + // 会自动拉起下一个 task 的申请预览/报销流程,实现"先做完 A 再做 B"。 + const remainingTasks = Array.isArray(actionPayload.steward_remaining_tasks) + ? actionPayload.steward_remaining_tasks + : [] + const nextTask = remainingTasks[0] + if (!nextTask || !nextTask.task_type) { + return null + } + const taskType = String(nextTask.task_type || '').trim() + const isApplication = taskType === 'expense_application' + const flowId = isApplication ? 'travel_application' : 'travel_reimbursement' + const taskLabel = isApplication ? '出差申请' : '费用报销' + const ontologyFields = nextTask.ontology_fields || nextTask.ontologyFields || {} + return { + label: `继续处理${taskLabel}`, + description: `接下来处理${taskLabel}: ${String(nextTask.summary || nextTask.title || '').slice(0, 40)}`, + icon: isApplication ? 'mdi mdi-file-plus-outline' : 'mdi mdi-receipt-text-plus-outline', + action_type: 'steward_continue_next_task', + payload: { + steward_confirm_flow: true, + flow_id: flowId, + steward_current_task: nextTask, + expense_type: String(ontologyFields.expense_type || 'travel').trim() || 'travel', + expense_type_label: String(ontologyFields.expense_type_label || '差旅费').trim() || '差旅费', + ontology_fields: ontologyFields, + original_message: String(nextTask.summary || nextTask.title || `继续处理${taskLabel}`).trim() + } + } + } + return { handleInlineSuggestedAction }