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 @@
+
+
+
+
+
+
{{ lineNumbersText }}
+
+
+ {{ languageLabel }}
+
+
+
+
+
+
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,