diff --git a/web/apps/web-ele/src/components/zq-form/code-editor/code-editor.vue b/web/apps/web-ele/src/components/zq-form/code-editor/code-editor.vue new file mode 100644 index 0000000..4c73c19 --- /dev/null +++ b/web/apps/web-ele/src/components/zq-form/code-editor/code-editor.vue @@ -0,0 +1,195 @@ + + + + + diff --git a/web/apps/web-ele/src/components/zq-form/code-editor/index.ts b/web/apps/web-ele/src/components/zq-form/code-editor/index.ts new file mode 100644 index 0000000..6ab7338 --- /dev/null +++ b/web/apps/web-ele/src/components/zq-form/code-editor/index.ts @@ -0,0 +1 @@ +export { default as CodeEditor } from './code-editor.vue'; diff --git a/web/apps/web-ele/src/locales/langs/zh-CN/ai-platform.json b/web/apps/web-ele/src/locales/langs/zh-CN/ai-platform.json index 5119309..e1f5950 100644 --- a/web/apps/web-ele/src/locales/langs/zh-CN/ai-platform.json +++ b/web/apps/web-ele/src/locales/langs/zh-CN/ai-platform.json @@ -946,6 +946,9 @@ "userInput": "用户输入", "sessionId": "会话 ID", "agentId": "智能体 ID", + "appId": "应用 ID", + "appCode": "应用编码", + "formCode": "表单编码", "renderResult": "渲染结果", "subflowFullResult": "子流程完整结果", "execSuccess": "执行是否成功", @@ -1066,7 +1069,10 @@ "start": { "userInputDesc": "用户在对话框中输入的内容,自动传入此变量", "sessionIdDesc": "当前对话会话 ID,用于多轮记忆和执行追踪", - "agentIdDesc": "当前调用智能体 ID,用于智能体协作和审计" + "agentIdDesc": "当前调用智能体 ID,用于智能体协作和审计", + "appIdDesc": "当前应用 ID,用于应用内流程隔离和上下文注入", + "appCodeDesc": "当前应用编码,用于跨流程引用应用上下文", + "formCodeDesc": "当前表单编码,用于表单触发或表单相关流程" }, "choice": { "label": "选项节点", diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/NodeResultCard.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/NodeResultCard.vue index d8f1512..b279d1c 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/NodeResultCard.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/NodeResultCard.vue @@ -17,6 +17,7 @@ import { } from '@vben/icons'; import { $t } from '@vben/locales'; +import { CodeEditor } from '#/components/zq-form/code-editor'; import { ZqDialog } from '#/components/zq-dialog'; export interface IterationResult { @@ -253,8 +254,14 @@ const formattedInputs = computed(() => {
{{ $t('ai-platform.workflow.editor.nodeResultCard.input') }}
-
-
{{ formattedInputs }}
+
+
@@ -262,8 +269,14 @@ const formattedInputs = computed(() => {
{{ $t('ai-platform.workflow.editor.nodeResultCard.output') }}
-
-
{{ formattedOutput }}
+
+
@@ -462,23 +475,3 @@ const formattedInputs = computed(() => { - - diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/VariableSelector.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/VariableSelector.vue index 01d29a3..2815dc2 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/VariableSelector.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/components/VariableSelector.vue @@ -395,6 +395,21 @@ const availableNodes = computed(() => { ), isSystem: true, }, + { + key: 'application_id', + label: $t('ai-platform.workflow.editor.variableSelector.appId'), + isSystem: true, + }, + { + key: 'application_code', + label: $t('ai-platform.workflow.editor.variableSelector.appCode'), + isSystem: true, + }, + { + key: 'form_code', + label: $t('ai-platform.workflow.editor.variableSelector.formCode'), + isSystem: true, + }, ]; // 加上自定义变量 variables.push( diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/index.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/index.vue index 47349e0..ac07112 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/index.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/index.vue @@ -58,6 +58,7 @@ import { runWorkflowStreamApi, updateWorkflowApi, } from '#/api/ai-platform/ai-platform'; +import { useAppContextStore } from '#/store/app-context'; import { useWorkflowEditorStore } from '#/store/workflow-editor'; import RunDialog from './components/RunDialog.vue'; @@ -80,6 +81,7 @@ const AiChatPanel = defineAsyncComponent( const route = useRoute(); const router = useRouter(); +const appContextStore = useAppContextStore(); const workflowId = route.params.id as string; // 使用 Pinia store 管理工作流编辑器状态 @@ -1822,7 +1824,7 @@ const handleNodeComplete = (event: { }; const handleBack = () => { - router.push('/ai-platform/workflow'); + router.push(appContextStore.getContextPath('/ai-platform/workflow')); }; // 键盘快捷键 diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/CodePanel.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/CodePanel.vue index 164b54d..ae8a19e 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/CodePanel.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/CodePanel.vue @@ -13,6 +13,7 @@ import { ElTooltip, } from 'element-plus'; +import { CodeEditor } from '#/components/zq-form/code-editor'; import { ZqDialog } from '#/components/zq-dialog'; import SmartInput from '../components/SmartInput.vue'; @@ -185,13 +186,14 @@ const codeEditorVisible = ref(false); - @@ -204,12 +206,15 @@ const codeEditorVisible = ref(false); :show-footer="false" >
-
@@ -239,6 +244,12 @@ const codeEditorVisible = ref(false); min-height: 0; } +.code-editor-dialog .code-editor-dialog-content .code-editor { + flex: 1; + min-height: 0; + height: 100% !important; +} + .code-editor-dialog.is-fullscreen .el-dialog__body { display: flex; flex: 1; @@ -255,16 +266,4 @@ const codeEditorVisible = ref(false); height: 100% !important; } -.workflow-code-textarea textarea { - font-family: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', - 'Courier New', monospace; - font-size: 12px; - line-height: 1.6; -} - -.workflow-code-textarea--dialog, -.workflow-code-textarea--dialog textarea { - height: 100%; -} diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/HttpPanel.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/HttpPanel.vue index e74d362..4be228a 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/HttpPanel.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/HttpPanel.vue @@ -16,6 +16,8 @@ import { ElTabs, } from 'element-plus'; +import { CodeEditor } from '#/components/zq-form/code-editor'; + import SmartInput from '../components/SmartInput.vue'; const props = defineProps<{ data: any; nodeId: string }>(); @@ -173,13 +175,13 @@ const removeParam = (index: number) => { -
{{ $t('ai-platform.workflow.panels.http.bodyHint') }} @@ -205,11 +207,4 @@ const removeParam = (index: number) => { padding: 12px; } -:deep(.workflow-code-textarea textarea) { - font-family: - ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', - 'Courier New', monospace; - font-size: 12px; - line-height: 1.6; -} diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/StartPanel.vue b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/StartPanel.vue index 7ff38cb..8bea7b3 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/StartPanel.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/editor/panels/StartPanel.vue @@ -76,6 +76,42 @@ const handleDelete = (index: number) => {
+
+
+ application_id + {{ + $t('ai-platform.workflow.panels.common.sysVar') + }} +
+
+ {{ $t('ai-platform.workflow.panels.start.appIdDesc') }} +
+
+ +
+
+ application_code + {{ + $t('ai-platform.workflow.panels.common.sysVar') + }} +
+
+ {{ $t('ai-platform.workflow.panels.start.appCodeDesc') }} +
+
+ +
+
+ form_code + {{ + $t('ai-platform.workflow.panels.common.sysVar') + }} +
+
+ {{ $t('ai-platform.workflow.panels.start.formCodeDesc') }} +
+
+
{{ $t('ai-platform.workflow.panels.common.customVars') diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/index.vue b/web/apps/web-ele/src/views/ai-platform/workflow/index.vue index d536457..f5d1842 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/index.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/index.vue @@ -36,6 +36,7 @@ import { ElOption, ElPagination, ElSelect, + ElSwitch, ElTag, ElTooltip, } from 'element-plus'; @@ -51,11 +52,14 @@ import { updateWorkflowApi, } from '#/api/ai-platform/ai-platform'; import { ZqDialog } from '#/components/zq-dialog'; +import { useAppContextStore } from '#/store/app-context'; import RunDialog from '../workflow/editor/components/RunDialog.vue'; import ImportDialog from './modules/import-dialog.vue'; const router = useRouter(); +const appContextStore = useAppContextStore(); +const isMainApp = computed(() => appContextStore.isMainApp); // 工作流类型选项 const workflowTypeOptions = computed(() => [ @@ -114,6 +118,7 @@ async function handleConfirm() { } else { // 创建模式 const res = await createWorkflowApi({ + application_id: appContextStore.currentApp?.id, is_global: createForm.is_global, name: createForm.name, code: createForm.code, @@ -123,7 +128,11 @@ async function handleConfirm() { ElMessage.success($t('ai-platform.workflow.createSuccess')); dialogVisible.value = false; fetchList(); - router.push(`/ai-platform/workflow/editor/${res.id}`); + router.push( + appContextStore.getContextPath( + `/ai-platform/workflow/editor/${res.id}`, + ), + ); } } catch { // error handled by request interceptor @@ -156,6 +165,7 @@ async function fetchList() { page: pagination.current, pageSize: pagination.pageSize, name: searchKeyword.value || undefined, + applicationId: appContextStore.currentApp?.id, }); workflowList.value = res.items; pagination.total = res.total; @@ -223,7 +233,9 @@ const handleQuickRun = async (row: WorkflowListItem) => { }; const handleEdit = (row: WorkflowListItem) => { - router.push(`/ai-platform/workflow/editor/${row.id}`); + router.push( + appContextStore.getContextPath(`/ai-platform/workflow/editor/${row.id}`), + ); }; const handleDelete = async (row: WorkflowListItem) => { @@ -296,7 +308,9 @@ const handleCopy = async (row: WorkflowListItem) => { const res = await copyWorkflowApi(row.id); ElMessage.success($t('ai-platform.workflow.copySuccess')); fetchList(); - router.push(`/ai-platform/workflow/editor/${res.id}`); + router.push( + appContextStore.getContextPath(`/ai-platform/workflow/editor/${res.id}`), + ); } catch (error) { if (error !== 'cancel') { console.error(error); @@ -333,7 +347,7 @@ const getWorkflowTypeText = (type: string) => { const item = workflowTypeOptions.value.find( (o: { label: string; value: string }) => o.value === type, ); - return item?.label || workflowTypeLabelMap[type] || '智能体协作'; + return item?.label || workflowTypeLabelMap[type] || type; }; const getStatusType = (status: string) => { @@ -458,7 +472,11 @@ onMounted(() => { {{ $t('ai-platform.workflow.publish') }} @@ -503,8 +521,10 @@ onMounted(() => {
- v{{ item.published_version || item.version || '-' }} · - {{ item.run_count || 0 }} 次运行 + + {{ item.application_name }} + + {{ $t('ai-platform.workflow.mainApp') }}
{{ item.sys_create_datetime }} @@ -608,6 +628,12 @@ onMounted(() => { :rows="3" /> + + + diff --git a/web/apps/web-ele/src/views/ai-platform/workflow/modules/import-dialog.vue b/web/apps/web-ele/src/views/ai-platform/workflow/modules/import-dialog.vue index 4676b7b..084aeba 100644 --- a/web/apps/web-ele/src/views/ai-platform/workflow/modules/import-dialog.vue +++ b/web/apps/web-ele/src/views/ai-platform/workflow/modules/import-dialog.vue @@ -24,6 +24,7 @@ import { importWorkflowConfigApi, } from '#/api/ai-platform/ai-platform'; import { ZqDialog } from '#/components/zq-dialog'; +import { useAppContextStore } from '#/store/app-context'; interface Props { modelValue: boolean; @@ -36,6 +37,8 @@ const emit = defineEmits<{ 'update:modelValue': [value: boolean]; }>(); +const appContextStore = useAppContextStore(); + const dialogVisible = computed({ get: () => props.modelValue, set: (val) => emit('update:modelValue', val), @@ -129,6 +132,7 @@ async function handleConfirmImport() { try { const payload: WorkflowImportInput = { ...importData.value, + application_id: appContextStore.currentApp?.id, code: checkResult.value?.code_exists ? newCode.value.trim() : importData.value.code,