diff --git a/src/api/global.ts b/src/api/global.ts
new file mode 100644
index 0000000..182114a
--- /dev/null
+++ b/src/api/global.ts
@@ -0,0 +1,20 @@
+import axios from 'axios';
+import { GlobalParams } from '@/api/interface';
+
+// 公共路径
+const urlPrefix = '/api/v1/bpms-workbench';
+
+// 新增全局变量
+export function addGlobal(data: GlobalParams) {
+ return axios.post(`${urlPrefix}/global/add`, data);
+}
+
+// 获取全局变量列表
+export function getGlobalList(sceneId: string) {
+ return axios.get(`${urlPrefix}/global/${sceneId}/map`);
+}
+
+// 删除全局变量
+export function deleteGlobal(id: string) {
+ return axios.delete(`${urlPrefix}/global/${id}`);
+}
\ No newline at end of file
diff --git a/src/api/interface/index.ts b/src/api/interface/index.ts
index 5c5ba29..0af6396 100644
--- a/src/api/interface/index.ts
+++ b/src/api/interface/index.ts
@@ -222,4 +222,12 @@ export interface ExecuteCurrentEventParams {
export interface ReconnectRunParams {
instanceId: string,
newSocketId: string
+}
+
+export interface GlobalParams {
+ name: string,
+ dataType: any,
+ arrayType: any,
+ defaultValue: any,
+ sceneId: string,
}
\ No newline at end of file
diff --git a/src/pages/orchestration/globalVar/addModal.tsx b/src/pages/orchestration/globalVar/addModal.tsx
new file mode 100644
index 0000000..7665862
--- /dev/null
+++ b/src/pages/orchestration/globalVar/addModal.tsx
@@ -0,0 +1,261 @@
+import React from 'react';
+import { Form, Input, Modal, Select } from '@arco-design/web-react';
+import { useSelector } from 'react-redux';
+
+const FormItem = Form.Item;
+
+// 定义数据类型枚举
+const dataTypeEnum = [
+ 'OBJECT',
+ 'JSON',
+ 'ARRAY',
+ 'BOOLEAN',
+ 'INTEGER',
+ 'DOUBLE',
+ 'STRING',
+ 'DATE',
+ 'DATETIME',
+ 'TIMESTAMP',
+ 'DATABASE'
+];
+
+// 定义数组元素类型枚举
+const arrayElementTypeEnum = [
+ 'STRING',
+ 'INTEGER',
+ 'DOUBLE',
+ 'BOOLEAN',
+ 'DATE',
+ 'DATETIME',
+ 'TIMESTAMP'
+];
+
+// 默认值类型校验方法
+const validateDefaultValue = (value, dataType, arrayType) => {
+ // 如果没有值,则不进行校验
+ if (value === undefined || value === null || value === '') {
+ return true;
+ }
+
+ switch (dataType) {
+ case 'STRING':
+ case 'DATE':
+ case 'DATETIME':
+ case 'TIMESTAMP':
+ case 'DATABASE':
+ // 字符串类型 - 任何值都是有效的
+ return true;
+
+ case 'INTEGER':
+ // 整数类型 - 必须是整数
+ const intRegex = /^-?\d+$/;
+ return intRegex.test(value);
+
+ case 'DOUBLE':
+ // 双精度浮点类型 - 必须是数字
+ const doubleRegex = /^-?\d+(\.\d+)?$/;
+ return doubleRegex.test(value);
+
+ case 'BOOLEAN':
+ // 布尔类型 - 必须是 true 或 false
+ return value === 'true' || value === 'false' || value === true || value === false;
+
+ case 'ARRAY':
+ // 数组类型 - 尝试解析为JSON数组
+ try {
+ const parsed = JSON.parse(value);
+ if (!Array.isArray(parsed)) {
+ return false;
+ }
+
+ // 根据数组元素类型进行校验
+ if (arrayType) {
+ for (const item of parsed) {
+ switch (arrayType) {
+ case 'STRING':
+ case 'DATE':
+ case 'DATETIME':
+ case 'TIMESTAMP':
+ if (typeof item !== 'string') {
+ return false;
+ }
+ break;
+ case 'INTEGER':
+ if (!Number.isInteger(item)) {
+ return false;
+ }
+ break;
+ case 'DOUBLE':
+ if (typeof item !== 'number') {
+ return false;
+ }
+ break;
+ case 'BOOLEAN':
+ if (typeof item !== 'boolean') {
+ return false;
+ }
+ break;
+ }
+ }
+ }
+ return true;
+ } catch (e) {
+ return false;
+ }
+
+ case 'JSON':
+ // JSON类型 - 必须是有效的JSON
+ try {
+ JSON.parse(value);
+ return true;
+ } catch (e) {
+ return false;
+ }
+
+ case 'OBJECT':
+ // 对象类型 - 必须是有效的JSON对象
+ try {
+ const parsed = JSON.parse(value);
+ return typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed);
+ } catch (e) {
+ return false;
+ }
+
+ default:
+ // 其他类型暂时不做特殊校验
+ return true;
+ }
+};
+
+const AddGlobalVarModal = ({ visible, onOk, onChangeVisible, form }) => {
+ const { info } = useSelector((state: any) => state.ideContainer);
+
+ // 获取表单字段值
+ const formData = Form.useWatch('dataType', form);
+ const arrayTypeData = Form.useWatch('arrayType', form);
+
+ return (
+