From ff8187bcb01bc648f4193d802a80020f3a5b8f5d Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Fri, 21 Nov 2025 09:44:56 +0800
Subject: [PATCH 1/7] =?UTF-8?q?feat:=20[bpm][ele]=20=E6=96=B0=E5=BB=BA?=
=?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=A8=A1=E5=9E=8B=2020%?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
apps/web-ele/src/router/routes/modules/bpm.ts | 48 +-
.../src/views/bpm/model/form/index.vue | 498 ++++++++++++++
.../bpm/model/form/modules/basic-info.vue | 442 +++++++++++++
.../model/form/modules/bpm-model-editor.vue | 126 ++++
.../form/modules/custom-print-template.vue | 117 ++++
.../bpm/model/form/modules/extra-setting.vue | 618 ++++++++++++++++++
.../bpm/model/form/modules/form-design.vue | 184 ++++++
.../bpm/model/form/modules/process-design.vue | 79 +++
.../form/modules/simple-model-design.vue | 48 ++
.../bpm/model/form/modules/tinymce-plugin.ts | 78 +++
10 files changed, 2214 insertions(+), 24 deletions(-)
create mode 100644 apps/web-ele/src/views/bpm/model/form/index.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/bpm-model-editor.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/custom-print-template.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/extra-setting.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/form-design.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/simple-model-design.vue
create mode 100644 apps/web-ele/src/views/bpm/model/form/modules/tinymce-plugin.ts
diff --git a/apps/web-ele/src/router/routes/modules/bpm.ts b/apps/web-ele/src/router/routes/modules/bpm.ts
index c895a34eec..375b45830f 100644
--- a/apps/web-ele/src/router/routes/modules/bpm.ts
+++ b/apps/web-ele/src/router/routes/modules/bpm.ts
@@ -62,30 +62,30 @@ const routes: RouteRecordRaw[] = [
};
},
},
- // {
- // path: 'manager/model/create',
- // component: () => import('#/views/bpm/model/form/index.vue'),
- // name: 'BpmModelCreate',
- // meta: {
- // title: '创建流程',
- // activePath: '/bpm/manager/model',
- // icon: 'carbon:flow-connection',
- // hideInMenu: true,
- // keepAlive: true,
- // },
- // },
- // {
- // path: 'manager/model/:type/:id',
- // component: () => import('#/views/bpm/model/form/index.vue'),
- // name: 'BpmModelUpdate',
- // meta: {
- // title: '修改流程',
- // activePath: '/bpm/manager/model',
- // icon: 'carbon:flow-connection',
- // hideInMenu: true,
- // keepAlive: true,
- // },
- // },
+ {
+ path: 'manager/model/create',
+ component: () => import('#/views/bpm/model/form/index.vue'),
+ name: 'BpmModelCreate',
+ meta: {
+ title: '创建流程',
+ activePath: '/bpm/manager/model',
+ icon: 'carbon:flow-connection',
+ hideInMenu: true,
+ keepAlive: true,
+ },
+ },
+ {
+ path: 'manager/model/:type/:id',
+ component: () => import('#/views/bpm/model/form/index.vue'),
+ name: 'BpmModelUpdate',
+ meta: {
+ title: '修改流程',
+ activePath: '/bpm/manager/model',
+ icon: 'carbon:flow-connection',
+ hideInMenu: true,
+ keepAlive: true,
+ },
+ },
{
path: 'manager/definition',
component: () => import('#/views/bpm/model/definition/index.vue'),
diff --git a/apps/web-ele/src/views/bpm/model/form/index.vue b/apps/web-ele/src/views/bpm/model/form/index.vue
new file mode 100644
index 0000000000..79896c35e7
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/index.vue
@@ -0,0 +1,498 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ formData.name || '创建流程' }}
+
+
+
+
+
+
+
+
+ {{ index + 1 }}
+
+
+ {{ step.title }}
+
+
+
+
+
+
+
+
+ 发 布
+
+
+ 恢 复
+ 保 存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
new file mode 100644
index 0000000000..0c82d5b144
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
@@ -0,0 +1,442 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ user.nickname?.substring(0, 1) }}
+
+
+ {{ user.nickname }}
+
+
+
+
+
+
+
+ 选择人员
+
+
+
+
+
+
+ {{ dept.name }}
+
+
+
+
+
+
+
+ 选择部门
+
+
+
+
+
+
+
+
+ {{ user.nickname?.substring(0, 1) }}
+
+
+ {{ user.nickname }}
+
+
+
+
+
+
+
+ 选择人员
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/bpm-model-editor.vue b/apps/web-ele/src/views/bpm/model/form/modules/bpm-model-editor.vue
new file mode 100644
index 0000000000..4f756afc37
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/bpm-model-editor.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/custom-print-template.vue b/apps/web-ele/src/views/bpm/model/form/modules/custom-print-template.vue
new file mode 100644
index 0000000000..3a75ed61d7
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/custom-print-template.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/extra-setting.vue b/apps/web-ele/src/views/bpm/model/form/modules/extra-setting.vue
new file mode 100644
index 0000000000..7392293879
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/extra-setting.vue
@@ -0,0 +1,618 @@
+
+
+
+
+
+
+ 允许撤销审批中的申请
+
+
+
+ 第一个审批节点通过后,提交人仍可撤销申请
+
+
+
+
+
+
+
+ 允许审批人撤回任务
+
+
+ 审批人可撤回正在审批节点的前一节点
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 编码示例:{{ numberExample }}
+
+
+
+
+
+ 同一审批人在流程中重复出现时:
+
+
+
+ 不自动通过
+
+ 仅审批一次,后续重复的审批节点均自动通过
+
+ 仅针对连续审批的节点自动通过
+
+
+
+
+
+
+
+
+
+ 系统默认
+ 展示流程名称
+
+
+
+ 自定义标题
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 系统默认
+ 展示表单前 3 个字段
+
+ 自定义摘要
+
+
+
+
+
+
+
+
+
+
+
+
+ 流程启动后通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 流程结束后通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 任务执行时通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 任务结束后通知
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/form-design.vue b/apps/web-ele/src/views/bpm/model/form/modules/form-design.vue
new file mode 100644
index 0000000000..534001d771
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/form-design.vue
@@ -0,0 +1,184 @@
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue b/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
new file mode 100644
index 0000000000..18a2b65e28
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/simple-model-design.vue b/apps/web-ele/src/views/bpm/model/form/modules/simple-model-design.vue
new file mode 100644
index 0000000000..ab9ca37532
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/simple-model-design.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/tinymce-plugin.ts b/apps/web-ele/src/views/bpm/model/form/modules/tinymce-plugin.ts
new file mode 100644
index 0000000000..145dc894b6
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/model/form/modules/tinymce-plugin.ts
@@ -0,0 +1,78 @@
+/** TinyMCE 自定义功能:
+ * - processrecord 按钮:插入流程记录占位元素
+ * - @ 自动补全:插入 mention 占位元素
+ */
+
+// @ts-ignore TinyMCE 全局或通过打包器提供
+import type { Editor } from 'tinymce';
+
+export interface MentionItem {
+ id: string;
+ name: string;
+}
+
+/** 在编辑器 setup 回调中注册流程记录按钮和 @ 自动补全 */
+export function setupTinyPlugins(
+ editor: Editor,
+ getMentionList: () => MentionItem[],
+) {
+ // 按钮:流程记录
+ editor.ui.registry.addButton('processrecord', {
+ text: '流程记录',
+ tooltip: '插入流程记录占位',
+ onAction: () => {
+ // 流程记录占位显示, 仅用于显示。process-print.vue 组件中会替换掉
+ editor.insertContent(
+ [
+ '
',
+ '
',
+ '| 流程记录 |
',
+ '',
+ '| 节点 | ',
+ '操作 | ',
+ '
',
+ '
',
+ '
',
+ ].join(''),
+ );
+ },
+ });
+
+ // @ 自动补全
+ editor.ui.registry.addAutocompleter('bpmMention', {
+ trigger: '@',
+ minChars: 0,
+ columns: 1,
+ fetch: (
+ pattern: string,
+ _maxResults: number,
+ _fetchOptions: Record,
+ ) => {
+ const list = getMentionList();
+ const keyword = (pattern || '').toLowerCase().trim();
+ const data = list
+ .filter((i) => i.name.toLowerCase().includes(keyword))
+ .map((i) => ({
+ value: i.id,
+ text: i.name,
+ }));
+ return Promise.resolve(data);
+ },
+ onAction: (
+ autocompleteApi: any,
+ rng: Range,
+ value: string,
+ _meta: Record,
+ ) => {
+ const list = getMentionList();
+ const item = list.find((i) => i.id === value);
+ const name = item ? item.name : value;
+ const info = encodeURIComponent(JSON.stringify({ id: value }));
+ editor.selection.setRng(rng);
+ editor.insertContent(
+ `@${name}`,
+ );
+ autocompleteApi.hide();
+ },
+ });
+}
--
Gitee
From dee1764556f4137ad0cd0f2a62dd55ec92df753b Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Fri, 21 Nov 2025 22:12:24 +0800
Subject: [PATCH 2/7] =?UTF-8?q?feat:=20[bpm][ele]=20=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97=EF=BC=8C=E9=83=A8=E9=97=A8?=
=?UTF-8?q?=E9=80=89=E6=8B=A9=E5=BC=B9=E7=AA=97=E7=BB=84=E4=BB=B6=E8=BF=81?=
=?UTF-8?q?=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bpm/model/form/modules/basic-info.vue | 98 ++--
.../dept/components/dept-select-modal.vue | 141 +++++
.../src/views/system/dept/components/index.ts | 2 +
.../src/views/system/user/components/index.ts | 1 +
.../user/components/user-select-modal.vue | 518 ++++++++++++++++++
5 files changed, 715 insertions(+), 45 deletions(-)
create mode 100644 apps/web-ele/src/views/system/dept/components/dept-select-modal.vue
create mode 100644 apps/web-ele/src/views/system/dept/components/index.ts
create mode 100644 apps/web-ele/src/views/system/user/components/index.ts
create mode 100644 apps/web-ele/src/views/system/user/components/user-select-modal.vue
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
index 0c82d5b144..d38cd7c083 100644
--- a/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
+++ b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
@@ -9,6 +9,7 @@ import type { SystemUserApi } from '#/api/system/user';
import { ref, watch } from 'vue';
+import { useVbenModal } from '@vben/common-ui';
import { DICT_TYPE } from '@vben/constants';
import { getDictOptions } from '@vben/hooks';
import { IconifyIcon } from '@vben/icons';
@@ -26,8 +27,9 @@ import {
ElTooltip,
} from 'element-plus';
-// import { DeptSelectModal, UserSelectModal } from '#/components/select-modal';
import { ImageUpload } from '#/components/upload';
+import { DeptSelectModal } from '#/views/system/dept/components';
+import { UserSelectModal } from '#/views/system/user/components';
const props = defineProps({
categoryList: {
@@ -44,15 +46,15 @@ const props = defineProps({
},
});
-// const [UserSelectModalComp, userSelectModalApi] = useVbenModal({
-// connectedComponent: UserSelectModal,
-// destroyOnClose: true,
-// });
+const [UserSelectModalComp, userSelectModalApi] = useVbenModal({
+ connectedComponent: UserSelectModal,
+ destroyOnClose: true,
+});
-// const [DeptSelectModalComp, deptSelectModalApi] = useVbenModal({
-// connectedComponent: DeptSelectModal,
-// destroyOnClose: true,
-// });
+const [DeptSelectModalComp, deptSelectModalApi] = useVbenModal({
+ connectedComponent: DeptSelectModal,
+ destroyOnClose: true,
+});
const formRef = ref(); // 表单引用
const modelData = defineModel(); // 创建本地数据副本
@@ -125,21 +127,22 @@ function openStartUserSelect() {
selectedUsers.value = selectedStartUsers.value.map(
(user) => user.id,
) as number[];
- // userSelectModalApi.setData({ userIds: selectedUsers.value }).open();
+ userSelectModalApi.setData({ userIds: selectedUsers.value }).open();
}
/** 打开部门选择 */
function openStartDeptSelect() {
- // deptSelectModalApi.setData({ selectedList: selectedStartDepts.value }).open();
+ deptSelectModalApi.setData({ selectedList: selectedStartDepts.value }).open();
}
-// /** 处理部门选择确认 */
-// function handleDeptSelectConfirm(depts: SystemDeptApi.Dept[]) {
-// modelData.value = {
-// ...modelData.value,
-// startDeptIds: depts.map((d) => d.id),
-// };
-// }
+/** 处理部门选择确认 */
+function handleDeptSelectConfirm(depts: SystemDeptApi.Dept[]) {
+ selectedStartDepts.value = depts;
+ modelData.value = {
+ ...modelData.value,
+ startDeptIds: depts.map((d) => d.id),
+ };
+}
/** 打开管理员选择 */
function openManagerUserSelect() {
@@ -147,32 +150,32 @@ function openManagerUserSelect() {
selectedUsers.value = selectedManagerUsers.value.map(
(user) => user.id,
) as number[];
- // userSelectModalApi.setData({ userIds: selectedUsers.value }).open();
+ userSelectModalApi.setData({ userIds: selectedUsers.value }).open();
}
-// /** 处理用户选择确认 */
-// function handleUserSelectConfirm(userList: SystemUserApi.User[]) {
-// modelData.value =
-// currentSelectType.value === 'start'
-// ? {
-// ...modelData.value,
-// startUserIds: userList.map((u) => u.id),
-// }
-// : {
-// ...modelData.value,
-// managerUserIds: userList.map((u) => u.id),
-// };
-// }
+/** 处理用户选择确认 */
+function handleUserSelectConfirm(userList: SystemUserApi.User[]) {
+ modelData.value =
+ currentSelectType.value === 'start'
+ ? {
+ ...modelData.value,
+ startUserIds: userList.map((u) => u.id),
+ }
+ : {
+ ...modelData.value,
+ managerUserIds: userList.map((u) => u.id),
+ };
+}
-// /** 用户选择弹窗关闭 */
-// function handleUserSelectClosed() {
-// selectedUsers.value = [];
-// }
+/** 用户选择弹窗关闭 */
+function handleUserSelectClosed() {
+ selectedUsers.value = [];
+}
-// /** 用户选择弹窗取消 */
-// function handleUserSelectCancel() {
-// selectedUsers.value = [];
-// }
+/** 用户选择弹窗取消 */
+function handleUserSelectCancel() {
+ selectedUsers.value = [];
+}
/** 处理发起人类型变化 */
function handleStartUserTypeChange(value: number) {
@@ -285,7 +288,12 @@ defineExpose({ validate });
-
+
@@ -424,19 +432,19 @@ defineExpose({ validate });
-
+ />
-
+ />
diff --git a/apps/web-ele/src/views/system/dept/components/dept-select-modal.vue b/apps/web-ele/src/views/system/dept/components/dept-select-modal.vue
new file mode 100644
index 0000000000..be14cf6ed3
--- /dev/null
+++ b/apps/web-ele/src/views/system/dept/components/dept-select-modal.vue
@@ -0,0 +1,141 @@
+// TODO @芋艿:是否有更好的组织形式?!
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/system/dept/components/index.ts b/apps/web-ele/src/views/system/dept/components/index.ts
new file mode 100644
index 0000000000..d41597e977
--- /dev/null
+++ b/apps/web-ele/src/views/system/dept/components/index.ts
@@ -0,0 +1,2 @@
+// TODO @xingyu:【待讨论】是不是把 user select 放到 user 目录的 components 下,dept select 放到 dept 目录的 components 下
+export { default as DeptSelectModal } from './dept-select-modal.vue';
diff --git a/apps/web-ele/src/views/system/user/components/index.ts b/apps/web-ele/src/views/system/user/components/index.ts
new file mode 100644
index 0000000000..9cb1c93fd0
--- /dev/null
+++ b/apps/web-ele/src/views/system/user/components/index.ts
@@ -0,0 +1 @@
+export { default as UserSelectModal } from './user-select-modal.vue';
diff --git a/apps/web-ele/src/views/system/user/components/user-select-modal.vue b/apps/web-ele/src/views/system/user/components/user-select-modal.vue
new file mode 100644
index 0000000000..a9c2b1b166
--- /dev/null
+++ b/apps/web-ele/src/views/system/user/components/user-select-modal.vue
@@ -0,0 +1,518 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ node.label }}
+
+
+
+
+
+
+
+ {{ option.label }}
+
+
+
+
+
+
+
+
+
+ {{ cancelText }}
+
+ {{ confirmText }}
+
+
+
+
+
+
--
Gitee
From 9fa9437abfe84047137ef4a8b6c2da7015778d01 Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Sat, 22 Nov 2025 09:20:49 +0800
Subject: [PATCH 3/7] =?UTF-8?q?feat:=20[bpm][ele]=20=E4=BB=BF=E9=92=89?=
=?UTF-8?q?=E9=92=89=E6=B5=81=E7=A8=8B=E6=A8=A1=E5=9E=8B=E8=BF=81=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../child-process-node-config.vue | 830 ++++++++++++
.../nodes-config/condition-node-config.vue | 197 +++
.../nodes-config/copy-task-node-config.vue | 506 +++++++
.../nodes-config/delay-timer-node-config.vue | 248 ++++
.../nodes-config/modules/condition-dialog.vue | 79 ++
.../nodes-config/modules/condition.vue | 318 +++++
.../modules/http-request-param-setting.vue | 221 +++
.../modules/http-request-setting.vue | 171 +++
.../modules/user-task-listener.vue | 109 ++
.../nodes-config/router-node-config.vue | 292 ++++
.../nodes-config/start-user-node-config.vue | 278 ++++
.../nodes-config/trigger-node-config.vue | 688 ++++++++++
.../nodes-config/user-task-node-config.vue | 1202 +++++++++++++++++
.../components/nodes-config/utils.ts | 48 +
.../components/nodes/child-process-node.vue | 127 ++
.../components/nodes/copy-task-node.vue | 120 ++
.../components/nodes/delay-timer-node.vue | 117 ++
.../components/nodes/end-event-node.vue | 61 +
.../components/nodes/exclusive-node.vue | 307 +++++
.../components/nodes/inclusive-node.vue | 309 +++++
.../nodes/modules/process-instance-data.ts | 56 +
.../nodes/modules/process-instance-modal.vue | 45 +
.../nodes/modules/task-list-data.ts | 61 +
.../nodes/modules/task-list-modal.vue | 48 +
.../components/nodes/node-handler.vue | 355 +++++
.../components/nodes/parallel-node.vue | 230 ++++
.../components/nodes/router-node.vue | 119 ++
.../components/nodes/start-user-node.vue | 128 ++
.../components/nodes/trigger-node.vue | 122 ++
.../components/nodes/user-task-node.vue | 154 +++
.../components/process-node-tree.vue | 164 +++
.../components/simple-process-designer.vue | 255 ++++
.../components/simple-process-model.vue | 267 ++++
.../components/simple-process-viewer.vue | 45 +
.../simple-process-design/consts.ts | 888 ++++++++++++
.../simple-process-design/helpers.ts | 792 +++++++++++
.../components/simple-process-design/index.ts | 11 +
.../simple-process-design/styles/iconfont.ttf | Bin 0 -> 4808 bytes
.../styles/iconfont.woff | Bin 0 -> 3176 bytes
.../styles/iconfont.woff2 | Bin 0 -> 2628 bytes
.../styles/simple-process-designer.scss | 759 +++++++++++
.../styles/svg/simple-process-bg.svg | 1 +
.../bpm/model/form/modules/basic-info.vue | 4 +-
.../bpm/model/form/modules/process-design.vue | 26 +-
.../form/modules/simple-model-design.vue | 18 +-
45 files changed, 10753 insertions(+), 23 deletions(-)
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/copy-task-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition-dialog.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/user-task-listener.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/start-user-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/utils.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/child-process-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/copy-task-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/delay-timer-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/end-event-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/exclusive-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/inclusive-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-data.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-modal.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-data.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-modal.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/node-handler.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/parallel-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/router-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/start-user-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/trigger-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/user-task-node.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/process-node-tree.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-designer.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-model.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-viewer.vue
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/consts.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/helpers.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/index.ts
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.ttf
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.woff
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.woff2
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/styles/simple-process-designer.scss
create mode 100644 apps/web-ele/src/views/bpm/components/simple-process-design/styles/svg/simple-process-bg.svg
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
new file mode 100644
index 0000000000..16048bd535
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
@@ -0,0 +1,830 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一个
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一个
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+ 超时设置
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+ 当超过
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+ 后进入下一节点
+
+
+
+
+
+
+
+
+
+
+ 后进入下一节点
+
+
+
+
+
+
+ 多实例设置
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
new file mode 100644
index 0000000000..4057157001
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
@@ -0,0 +1,197 @@
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+
+
+
+ 未满足其它条件时,将进入此分支(该分支不可编辑和删除)
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/copy-task-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/copy-task-node-config.vue
new file mode 100644
index 0000000000..e018f51385
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/copy-task-node-config.vue
@@ -0,0 +1,506 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
字段权限
+
+
+
+ 字段名称
+
+
+
+
+ 只读
+
+
+
+
+ 可编辑
+
+
+
+
+ 隐藏
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
new file mode 100644
index 0000000000..ea5f59e532
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
@@ -0,0 +1,248 @@
+
+
+
+
+
+
+
+ {{ nodeName }}
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+ 后进入下一节点
+
+
+
+
+
+
+
+
+
+ 后进入下一节点
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition-dialog.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition-dialog.vue
new file mode 100644
index 0000000000..8dc1b95921
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition-dialog.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
new file mode 100644
index 0000000000..425782d1a3
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+ {{ condition.conditionGroups.and ? '且' : '或' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+ {{ field.title }}
+
+
+
+
+
+
+
+ {{ operator.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
new file mode 100644
index 0000000000..9ae2e0a521
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ types.label }}
+
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ types.label }}
+
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
new file mode 100644
index 0000000000..f9daaaf777
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
@@ -0,0 +1,171 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加一行
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/user-task-listener.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/user-task-listener.vue
new file mode 100644
index 0000000000..c2959d90f4
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/user-task-listener.vue
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+ {{ listener.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
new file mode 100644
index 0000000000..8751b8db7b
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
@@ -0,0 +1,292 @@
+
+
+
+
+
+
+
+ {{ nodeName }}
+
+
+
+
+
+
+
+
+
+
+ 路由{{ index + 1 }}
+
+
+
+ {{ node.label }}
+
+
+
+
+
+
+
+
+
+
+
+ (routerGroups[index] = val)"
+ />
+
+
+
+
+
+
+
+
+
+ 新增路由分支
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/start-user-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/start-user-node-config.vue
new file mode 100644
index 0000000000..8a51c446b7
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/start-user-node-config.vue
@@ -0,0 +1,278 @@
+
+
+
+
+
+
+
+
+
+ 全部成员可以发起流程
+
+
+
+ {{ getUserNicknames(startUserIds) }} 可发起流程
+
+
+
+ {{ getUserNicknames(startUserIds.slice(0, 2)) }} 等
+ {{ startUserIds.length }} 人可发起流程
+
+
+
+
+
+ {{ getDeptNames(startDeptIds) }} 可发起流程
+
+
+
+ {{ getDeptNames(startDeptIds.slice(0, 2)) }} 等
+ {{ startDeptIds.length }} 个部门可发起流程
+
+
+
+
+
+
+
字段权限
+
+
+
+ 字段名称
+
+
+
+
+ 只读
+
+
+
+
+ 可编辑
+
+
+
+
+ 隐藏
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
new file mode 100644
index 0000000000..a4d45c6d85
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
@@ -0,0 +1,688 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 修改表单设置 {{ index + 1 }}
+
+
+
+
+
+
+
+
+ handleConditionUpdate(index, val)"
+ />
+
+
+
+
+ {{ showConditionText(formSetting) }}
+
+
+
+
+
+
+ 添加条件
+
+
+
+ 修改表单字段设置
+
+
+
+
+ updateFormFieldKey(formSetting, key, newKey)
+ "
+ placeholder="请选择表单字段"
+ :disabled="key !== ''"
+ allow-clear
+ >
+
+ {{ field.title }}
+
+
+
+
+
+ 的值设置为
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加修改字段
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加设置
+
+
+
+
+
+
+
+
+
+
+
+ 删除表单设置 {{ index + 1 }}
+
+
+
+
+
+
+
+
+
+ handleConditionUpdate(index, val)"
+ />
+
+
+
+
+ {{ showConditionText(formSetting) }}
+
+
+
+
+
+
+ 添加条件
+
+
+
+
+ 删除表单字段设置
+
+
+
+
+ {{ field.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 添加设置
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
new file mode 100644
index 0000000000..af9799efc7
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
@@ -0,0 +1,1202 @@
+
+
+
+
+
+
+
+ 审批类型 :
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ dict.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+ 审批人拒绝时
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审批人超时未处理
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+ 当超时
+
+
+
+
+
+
+
+
+
+
+
+
+ 未处理
+
+
+
+
+
+
+
+
+
+
+ {{ nodeTypeName }}人为空时
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 审批人与提交人为同一人时
+
+
+
+
+
+
+ {{ item.label }}
+
+
+
+
+
+
+
+
+ 是否需要签名
+
+
+
+
+
+
+ 审批意见
+
+
+
+
+
+ 跳过表达式
+
+
+
+
+
+
+
+
+
+
操作按钮
+
+
+
+ 操作按钮
+ 显示名称
+
+ 启用
+
+
+
+
+
+
+
+ {{ OPERATION_BUTTON_NAME.get(item.id) }}
+
+
+
+
+
+ {{ item.displayName }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
字段权限
+
+
+
+ 字段名称
+
+
+
+
+ 只读
+
+
+
+
+ 可编�?
+
+
+
+
+ 隐藏
+
+
+
+
+
+
+
+
+
+
+ {{ item.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/utils.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/utils.ts
new file mode 100644
index 0000000000..ee5e068094
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/utils.ts
@@ -0,0 +1,48 @@
+import { APPROVE_TYPE, ApproveType, TimeUnitType } from '../../consts';
+
+/** 获取条件节点默认的名称 */
+export function getDefaultConditionNodeName(
+ index: number,
+ defaultFlow: boolean | undefined,
+): string {
+ if (defaultFlow) {
+ return '其它情况';
+ }
+ return `条件${index + 1}`;
+}
+
+/** 获取包容分支条件节点默认的名称 */
+export function getDefaultInclusiveConditionNodeName(
+ index: number,
+ defaultFlow: boolean | undefined,
+): string {
+ if (defaultFlow) {
+ return '其它情况';
+ }
+ return `包容条件${index + 1}`;
+}
+
+/** 转换时间单位字符串为枚举值 */
+export function convertTimeUnit(strTimeUnit: string) {
+ if (strTimeUnit === 'M') {
+ return TimeUnitType.MINUTE;
+ }
+ if (strTimeUnit === 'H') {
+ return TimeUnitType.HOUR;
+ }
+ if (strTimeUnit === 'D') {
+ return TimeUnitType.DAY;
+ }
+ return TimeUnitType.HOUR;
+}
+
+/** 根据审批类型获取对应的文本描述 */
+export function getApproveTypeText(approveType: ApproveType): string {
+ let approveTypeText = '';
+ APPROVE_TYPE.forEach((item) => {
+ if (item.value === approveType) {
+ approveTypeText = item.label;
+ }
+ });
+ return approveTypeText;
+}
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/child-process-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/child-process-node.vue
new file mode 100644
index 0000000000..1ad4bbe7b8
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/child-process-node.vue
@@ -0,0 +1,127 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CHILD_PROCESS_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/copy-task-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/copy-task-node.vue
new file mode 100644
index 0000000000..6170909717
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/copy-task-node.vue
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.COPY_TASK_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/delay-timer-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/delay-timer-node.vue
new file mode 100644
index 0000000000..e38925c46d
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/delay-timer-node.vue
@@ -0,0 +1,117 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.DELAY_TIMER_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/end-event-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/end-event-node.vue
new file mode 100644
index 0000000000..8c30a43e7d
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/end-event-node.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/exclusive-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/exclusive-node.vue
new file mode 100644
index 0000000000..424bc06385
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/exclusive-node.vue
@@ -0,0 +1,307 @@
+
+
+
+
+
+
+
+
+ 添加条件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
优先级{{ index + 1 }}
+
+
+
+ {{ item.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/inclusive-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/inclusive-node.vue
new file mode 100644
index 0000000000..238180ace1
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/inclusive-node.vue
@@ -0,0 +1,309 @@
+
+
+
+
+
+
+
+
+ 添加条件
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
+
+
+ {{ item.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-data.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-data.ts
new file mode 100644
index 0000000000..a9f2a06bbd
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-data.ts
@@ -0,0 +1,56 @@
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { DICT_TYPE } from '@vben/constants';
+
+/** 流程实例列表字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ field: 'startUser',
+ title: '发起人',
+ slots: {
+ default: ({ row }: { row: any }) => {
+ return row.startUser?.nickname;
+ },
+ },
+ minWidth: 100,
+ },
+ {
+ field: 'deptName',
+ title: '部门',
+ slots: {
+ default: ({ row }: { row: any }) => {
+ return row.startUser?.deptName;
+ },
+ },
+ minWidth: 100,
+ },
+ {
+ field: 'createTime',
+ title: '开始时间',
+ formatter: 'formatDateTime',
+ minWidth: 140,
+ },
+ {
+ field: 'endTime',
+ title: '结束时间',
+ formatter: 'formatDateTime',
+ minWidth: 140,
+ },
+ {
+ field: 'status',
+ title: '流程状态',
+ minWidth: 90,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS },
+ },
+ },
+ {
+ field: 'durationInMillis',
+ title: '耗时',
+ minWidth: 100,
+ formatter: 'formatPast2',
+ },
+ ];
+}
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-modal.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-modal.vue
new file mode 100644
index 0000000000..199eae4896
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/process-instance-modal.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-data.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-data.ts
new file mode 100644
index 0000000000..fbb2d0ea58
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-data.ts
@@ -0,0 +1,61 @@
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { DICT_TYPE } from '@vben/constants';
+
+/** 审批记录列表字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ field: 'assigneeUser',
+ title: '审批人',
+ slots: {
+ default: ({ row }: { row: any }) => {
+ return row.assigneeUser?.nickname || row.ownerUser?.nickname;
+ },
+ },
+ minWidth: 100,
+ },
+ {
+ field: 'deptName',
+ title: '部门',
+ slots: {
+ default: ({ row }: { row: any }) => {
+ return row.assigneeUser?.deptName || row.ownerUser?.deptName;
+ },
+ },
+ minWidth: 100,
+ },
+ {
+ field: 'createTime',
+ title: '开始时间',
+ formatter: 'formatDateTime',
+ minWidth: 140,
+ },
+ {
+ field: 'endTime',
+ title: '结束时间',
+ formatter: 'formatDateTime',
+ minWidth: 140,
+ },
+ {
+ field: 'status',
+ title: '审批状态',
+ minWidth: 90,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.BPM_TASK_STATUS },
+ },
+ },
+ {
+ field: 'reason',
+ title: '审批建议',
+ minWidth: 160,
+ },
+ {
+ field: 'durationInMillis',
+ title: '耗时',
+ minWidth: 100,
+ formatter: 'formatPast2',
+ },
+ ];
+}
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-modal.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-modal.vue
new file mode 100644
index 0000000000..e86019dc16
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/modules/task-list-modal.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/node-handler.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/node-handler.vue
new file mode 100644
index 0000000000..0b8eb3fcf7
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/node-handler.vue
@@ -0,0 +1,355 @@
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/parallel-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/parallel-node.vue
new file mode 100644
index 0000000000..99a99f537c
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/parallel-node.vue
@@ -0,0 +1,230 @@
+
+
+
+
+
+
+
+
+ 添加分支
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ item.name }}
+
+
无优先级
+
+
+
+ {{ item.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.CONDITION_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/router-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/router-node.vue
new file mode 100644
index 0000000000..8314ee6959
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/router-node.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.ROUTER_BRANCH_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/start-user-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/start-user-node.vue
new file mode 100644
index 0000000000..ca4d4dab5f
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/start-user-node.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.START_USER_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/trigger-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/trigger-node.vue
new file mode 100644
index 0000000000..06d25156a8
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/trigger-node.vue
@@ -0,0 +1,122 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(BpmNodeTypeEnum.TRIGGER_NODE) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/user-task-node.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/user-task-node.vue
new file mode 100644
index 0000000000..f1a027c532
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes/user-task-node.vue
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentNode.name }}
+
+
+
+
+ {{ currentNode.showText }}
+
+
+ {{ NODE_DEFAULT_TEXT.get(currentNode.type) }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/process-node-tree.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/process-node-tree.vue
new file mode 100644
index 0000000000..cc6c210bbf
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/process-node-tree.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-designer.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-designer.vue
new file mode 100644
index 0000000000..427491e3a1
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-designer.vue
@@ -0,0 +1,255 @@
+
+
+
+
+
+ 以下节点配置不完善,请修改相关配置
+
+ {{ item.name }} : {{ NODE_DEFAULT_TEXT.get(item.type) }}
+
+
+
+ 知道了
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-model.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-model.vue
new file mode 100644
index 0000000000..8cc8d3fdfd
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-model.vue
@@ -0,0 +1,267 @@
+
+
+
+
+
+
+
+ 导出
+
+
+ 导入
+
+
+
+
+
+
+
+
+
+ {{ scaleValue }}%
+
+
+
+ 重置
+
+
+
+
+
+
+
+ 以下节点内容不完善,请修改后保存
+
+ {{ item.name }} : {{ NODE_DEFAULT_TEXT.get(item.type) }}
+
+
+
+ 知道了
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-viewer.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-viewer.vue
new file mode 100644
index 0000000000..febfa604f9
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/simple-process-viewer.vue
@@ -0,0 +1,45 @@
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/consts.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/consts.ts
new file mode 100644
index 0000000000..e811314e59
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/consts.ts
@@ -0,0 +1,888 @@
+import { BpmNodeTypeEnum, BpmTaskStatusEnum } from '@vben/constants';
+
+interface DictDataType {
+ label: string;
+ value: number | string;
+}
+
+// 用户任务的审批类型。 【参考飞书】
+export enum ApproveType {
+ /**
+ * 自动通过
+ */
+ AUTO_APPROVE = 2,
+ /**
+ * 自动拒绝
+ */
+ AUTO_REJECT = 3,
+ /**
+ * 人工审批
+ */
+ USER = 1,
+}
+
+// 多人审批方式类型枚举 ( 用于审批节点 )
+export enum ApproveMethodType {
+ /**
+ * 多人或签(通过只需一人,拒绝只需一人)
+ */
+ ANY_APPROVE = 3,
+
+ /**
+ * 多人会签(按通过比例)
+ */
+ APPROVE_BY_RATIO = 2,
+
+ /**
+ * 随机挑选一人审批
+ */
+ RANDOM_SELECT_ONE_APPROVE = 1,
+ /**
+ * 多人依次审批
+ */
+ SEQUENTIAL_APPROVE = 4,
+}
+
+export enum NodeId {
+ /**
+ * 发起人节点 Id
+ */
+ END_EVENT_NODE_ID = 'EndEvent',
+
+ /**
+ * 发起人节点 Id
+ */
+ START_USER_NODE_ID = 'StartUserNode',
+}
+
+// 条件配置类型 ( 用于条件节点配置 )
+export enum ConditionType {
+ /**
+ * 条件表达式
+ */
+ EXPRESSION = 1,
+
+ /**
+ * 条件规则
+ */
+ RULE = 2,
+}
+
+// 操作按钮类型枚举 (用于审批节点)
+export enum OperationButtonType {
+ /**
+ * 加签
+ */
+ ADD_SIGN = 5,
+ /**
+ * 通过
+ */
+ APPROVE = 1,
+ /**
+ * 抄送
+ */
+ COPY = 7,
+ /**
+ * 委派
+ */
+ DELEGATE = 4,
+ /**
+ * 拒绝
+ */
+ REJECT = 2,
+ /**
+ * 退回
+ */
+ RETURN = 6,
+ /**
+ * 转办
+ */
+ TRANSFER = 3,
+}
+
+// 审批拒绝类型枚举
+export enum RejectHandlerType {
+ /**
+ * 结束流程
+ */
+ FINISH_PROCESS = 1,
+ /**
+ * 驳回到指定节点
+ */
+ RETURN_USER_TASK = 2,
+}
+
+// 用户任务超时处理类型枚举
+export enum TimeoutHandlerType {
+ /**
+ * 自动同意
+ */
+ APPROVE = 2,
+ /**
+ * 自动拒绝
+ */
+ REJECT = 3,
+ /**
+ * 自动提醒
+ */
+ REMINDER = 1,
+}
+
+// 用户任务的审批人为空时,处理类型枚举
+export enum AssignEmptyHandlerType {
+ /**
+ * 自动通过
+ */
+ APPROVE = 1,
+ /**
+ * 转交给流程管理员
+ */
+ ASSIGN_ADMIN = 4,
+ /**
+ * 指定人员审批
+ */
+ ASSIGN_USER = 3,
+ /**
+ * 自动拒绝
+ */
+ REJECT = 2,
+}
+
+// 用户任务的审批人与发起人相同时,处理类型枚举
+export enum AssignStartUserHandlerType {
+ /**
+ * 转交给部门负责人审批
+ */
+ ASSIGN_DEPT_LEADER = 3,
+ /**
+ * 自动跳过【参考飞书】:1)如果当前节点还有其他审批人,则交由其他审批人进行审批;2)如果当前节点没有其他审批人,则该节点自动通过
+ */
+ SKIP = 2,
+ /**
+ * 由发起人对自己审批
+ */
+ START_USER_AUDIT = 1,
+}
+
+// 时间单位枚举
+export enum TimeUnitType {
+ /**
+ * 天
+ */
+ DAY = 3,
+ /**
+ * 小时
+ */
+ HOUR = 2,
+ /**
+ * 分钟
+ */
+ MINUTE = 1,
+}
+
+/**
+ * 表单权限的枚举
+ */
+export enum FieldPermissionType {
+ /**
+ * 隐藏
+ */
+ NONE = '3',
+ /**
+ * 只读
+ */
+ READ = '1',
+ /**
+ * 编辑
+ */
+ WRITE = '2',
+}
+
+/**
+ * 延迟类型
+ */
+export enum DelayTypeEnum {
+ /**
+ * 固定日期时间
+ */
+ FIXED_DATE_TIME = 2,
+ /**
+ * 固定时长
+ */
+ FIXED_TIME_DURATION = 1,
+}
+
+/**
+ * 触发器类型枚举
+ */
+export enum TriggerTypeEnum {
+ /**
+ * 表单数据删除触发器
+ */
+ FORM_DELETE = 11,
+ /**
+ * 表单数据更新触发器
+ */
+ FORM_UPDATE = 10,
+ /**
+ * 接收 HTTP 回调请求触发器
+ */
+ HTTP_CALLBACK = 2,
+ /**
+ * 发送 HTTP 请求触发器
+ */
+ HTTP_REQUEST = 1,
+}
+
+export enum ChildProcessStartUserTypeEnum {
+ /**
+ * 表单
+ */
+ FROM_FORM = 2,
+ /**
+ * 同主流程发起人
+ */
+ MAIN_PROCESS_START_USER = 1,
+}
+
+export enum ChildProcessStartUserEmptyTypeEnum {
+ /**
+ * 子流程管理员
+ */
+ CHILD_PROCESS_ADMIN = 2,
+ /**
+ * 主流程管理员
+ */
+ MAIN_PROCESS_ADMIN = 3,
+ /**
+ * 同主流程发起人
+ */
+ MAIN_PROCESS_START_USER = 1,
+}
+
+export enum ChildProcessMultiInstanceSourceTypeEnum {
+ /**
+ * 固定数量
+ */
+ FIXED_QUANTITY = 1,
+ /**
+ * 多选表单
+ */
+ MULTIPLE_FORM = 3,
+ /**
+ * 数字表单
+ */
+ NUMBER_FORM = 2,
+}
+
+// 候选人策略枚举 ( 用于审批节点。抄送节点 )
+export enum CandidateStrategy {
+ /**
+ * 审批人自选
+ */
+ APPROVE_USER_SELECT = 34,
+ /**
+ * 部门的负责人
+ */
+ DEPT_LEADER = 21,
+ /**
+ * 部门成员
+ */
+ DEPT_MEMBER = 20,
+ /**
+ * 流程表达式
+ */
+ EXPRESSION = 60,
+ /**
+ * 表单内部门负责人
+ */
+ FORM_DEPT_LEADER = 51,
+ /**
+ * 表单内用户字段
+ */
+ FORM_USER = 50,
+ /**
+ * 连续多级部门的负责人
+ */
+ MULTI_LEVEL_DEPT_LEADER = 23,
+ /**
+ * 指定岗位
+ */
+ POST = 22,
+ /**
+ * 指定角色
+ */
+ ROLE = 10,
+ /**
+ * 发起人自己
+ */
+ START_USER = 36,
+ /**
+ * 发起人部门负责人
+ */
+ START_USER_DEPT_LEADER = 37,
+ /**
+ * 发起人连续多级部门的负责人
+ */
+ START_USER_MULTI_LEVEL_DEPT_LEADER = 38,
+ /**
+ * 发起人自选
+ */
+ START_USER_SELECT = 35,
+ /**
+ * 指定用户
+ */
+ USER = 30,
+ /**
+ * 指定用户组
+ */
+ USER_GROUP = 40,
+}
+
+export enum BpmHttpRequestParamTypeEnum {
+ /**
+ * 固定值
+ */
+ FIXED_VALUE = 1,
+ /**
+ * 表单
+ */
+ FROM_FORM = 2,
+}
+
+// 这里定义 HTTP 请求参数类型
+export type HttpRequestParam = {
+ key: string;
+ type: number;
+ value: string;
+};
+
+// 监听器结构定义
+export type ListenerHandler = {
+ body?: HttpRequestParam[];
+ enable: boolean;
+ header?: HttpRequestParam[];
+ path?: string;
+};
+
+/**
+ * 条件规则结构定义
+ */
+export type ConditionRule = {
+ leftSide: string | undefined;
+ opCode: string;
+ rightSide: string | undefined;
+};
+
+/**
+ * 条件结构定义
+ */
+export type Condition = {
+ // 条件规则的逻辑关系是否为且
+ and: boolean;
+ rules: ConditionRule[];
+};
+
+/**
+ * 条件组结构定义
+ */
+export type ConditionGroup = {
+ // 条件组的逻辑关系是否为且
+ and: boolean;
+ // 条件数组
+ conditions: Condition[];
+};
+
+/**
+ * 条件节点设置结构定义,用于条件节点
+ */
+export type ConditionSetting = {
+ // 条件表达式
+ conditionExpression?: string;
+ // 条件组
+ conditionGroups?: ConditionGroup;
+ // 条件类型
+ conditionType?: ConditionType;
+ // 是否默认的条件
+ defaultFlow?: boolean;
+};
+
+/**
+ * 审批拒绝结构定义
+ */
+export type RejectHandler = {
+ // 退回节点 Id
+ returnNodeId?: string;
+ // 审批拒绝类型
+ type: RejectHandlerType;
+};
+
+/**
+ * 审批超时结构定义
+ */
+export type TimeoutHandler = {
+ // 是否开启超时处理
+ enable: boolean;
+ // 执行动作是自动提醒, 最大提醒次数
+ maxRemindCount?: number;
+ // 超时时间设置
+ timeDuration?: string;
+ // 超时执行的动作
+ type?: number;
+};
+
+/**
+ * 审批人为空的结构定义
+ */
+export type AssignEmptyHandler = {
+ // 审批人为空的处理类型
+ type: AssignEmptyHandlerType;
+ // 指定用户的编号数组
+ userIds?: number[];
+};
+
+/**
+ * 延迟设置
+ */
+export type DelaySetting = {
+ // 延迟时间表达式
+ delayTime: string;
+ // 延迟类型
+ delayType: number;
+};
+
+/**
+ * 路由分支结构定义
+ */
+export type RouterSetting = {
+ conditionExpression: string;
+ conditionGroups: ConditionGroup;
+ conditionType: ConditionType;
+ nodeId: string | undefined;
+};
+
+/**
+ * 操作按钮权限结构定义
+ */
+export type ButtonSetting = {
+ displayName: string;
+ enable: boolean;
+ id: OperationButtonType;
+};
+
+/**
+ * HTTP 请求触发器结构定义
+ */
+export type HttpRequestTriggerSetting = {
+ // 请求体参数设置
+ body?: HttpRequestParam[];
+ // 请求头参数设置
+ header?: HttpRequestParam[];
+ // 请求响应设置
+ response?: Record[];
+ // 请求 URL
+ url: string;
+};
+
+/**
+ * 流程表单触发器配置结构定义
+ */
+export type FormTriggerSetting = {
+ // 条件表达式
+ conditionExpression?: string;
+ // 条件组
+ conditionGroups?: ConditionGroup;
+ // 条件类型
+ conditionType?: ConditionType;
+ // 删除表单字段配置
+ deleteFields?: string[];
+ // 更新表单字段配置
+ updateFormFields?: Record;
+};
+
+/**
+ * 触发器节点结构定义
+ */
+export type TriggerSetting = {
+ formSettings?: FormTriggerSetting[];
+ httpRequestSetting?: HttpRequestTriggerSetting;
+ type: TriggerTypeEnum;
+};
+
+export type IOParameter = {
+ source: string;
+ target: string;
+};
+
+export type StartUserSetting = {
+ emptyType?: ChildProcessStartUserEmptyTypeEnum;
+ formField?: string;
+ type: ChildProcessStartUserTypeEnum;
+};
+
+export type TimeoutSetting = {
+ enable: boolean;
+ timeExpression?: string;
+ type?: DelayTypeEnum;
+};
+
+export type MultiInstanceSetting = {
+ approveRatio?: number;
+ enable: boolean;
+ sequential?: boolean;
+ source?: string;
+ sourceType?: ChildProcessMultiInstanceSourceTypeEnum;
+};
+
+/**
+ * 子流程节点结构定义
+ */
+export type ChildProcessSetting = {
+ async: boolean;
+ calledProcessDefinitionKey: string;
+ calledProcessDefinitionName: string;
+ inVariables?: IOParameter[];
+ multiInstanceSetting: MultiInstanceSetting;
+ outVariables?: IOParameter[];
+ skipStartUserNode: boolean;
+ startUserSetting: StartUserSetting;
+ timeoutSetting: TimeoutSetting;
+};
+
+/**
+ * 节点结构定义
+ */
+export interface SimpleFlowNode {
+ id: string;
+ type: BpmNodeTypeEnum;
+ name: string;
+ showText?: string;
+ // 孩子节点
+ childNode?: SimpleFlowNode;
+ // 条件节点
+ conditionNodes?: SimpleFlowNode[];
+ // 审批类型
+ approveType?: ApproveType;
+ // 候选人策略
+ candidateStrategy?: number;
+ // 候选人参数
+ candidateParam?: string;
+ // 多人审批方式
+ approveMethod?: ApproveMethodType;
+ // 通过比例
+ approveRatio?: number;
+ // 审批按钮设置
+ buttonsSetting?: any[];
+ // 表单权限
+ fieldsPermission?: Array>;
+ // 审批任务超时处理
+ timeoutHandler?: TimeoutHandler;
+ // 审批任务拒绝处理
+ rejectHandler?: RejectHandler;
+ // 审批人为空的处理
+ assignEmptyHandler?: AssignEmptyHandler;
+ // 审批节点的审批人与发起人相同时,对应的处理类型
+ assignStartUserHandlerType?: number;
+ // 创建任务监听器
+ taskCreateListener?: ListenerHandler;
+ // 创建任务监听器
+ taskAssignListener?: ListenerHandler;
+ // 创建任务监听器
+ taskCompleteListener?: ListenerHandler;
+ // 条件设置
+ conditionSetting?: ConditionSetting;
+ // 活动的状态,用于前端节点状态展示
+ activityStatus?: BpmTaskStatusEnum;
+ // 延迟设置
+ delaySetting?: DelaySetting;
+ // 路由分支
+ routerGroups?: RouterSetting[];
+ defaultFlowId?: string;
+ // 签名
+ signEnable?: boolean;
+ // 审批意见
+ reasonRequire?: boolean;
+ // 跳过表达式
+ skipExpression?: string;
+ // 触发器设置
+ triggerSetting?: TriggerSetting;
+ // 子流程
+ childProcessSetting?: ChildProcessSetting;
+}
+
+/**
+ * 条件组默认值
+ */
+export const DEFAULT_CONDITION_GROUP_VALUE = {
+ and: true,
+ conditions: [
+ {
+ and: true,
+ rules: [
+ {
+ opCode: '==',
+ leftSide: undefined,
+ rightSide: '',
+ },
+ ],
+ },
+ ],
+};
+
+export const NODE_DEFAULT_TEXT = new Map();
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.USER_TASK_NODE, '请配置审批人');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.COPY_TASK_NODE, '请配置抄送人');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.CONDITION_NODE, '请设置条件');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.START_USER_NODE, '请设置发起人');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.DELAY_TIMER_NODE, '请设置延迟器');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.ROUTER_BRANCH_NODE, '请设置路由节点');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.TRIGGER_NODE, '请设置触发器');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.TRANSACTOR_NODE, '请设置办理人');
+NODE_DEFAULT_TEXT.set(BpmNodeTypeEnum.CHILD_PROCESS_NODE, '请设置子流程');
+
+export const NODE_DEFAULT_NAME = new Map();
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.USER_TASK_NODE, '审批人');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.COPY_TASK_NODE, '抄送人');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.CONDITION_NODE, '条件');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.START_USER_NODE, '发起人');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.DELAY_TIMER_NODE, '延迟器');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.ROUTER_BRANCH_NODE, '路由分支');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.TRIGGER_NODE, '触发器');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.TRANSACTOR_NODE, '办理人');
+NODE_DEFAULT_NAME.set(BpmNodeTypeEnum.CHILD_PROCESS_NODE, '子流程');
+
+// 候选人策略。暂时不从字典中取。 后续可能调整。控制显示顺序
+export const CANDIDATE_STRATEGY: DictDataType[] = [
+ { label: '指定成员', value: CandidateStrategy.USER as any },
+ { label: '指定角色', value: CandidateStrategy.ROLE as any },
+ { label: '指定岗位', value: CandidateStrategy.POST as any },
+ { label: '部门成员', value: CandidateStrategy.DEPT_MEMBER as any },
+ { label: '部门负责人', value: CandidateStrategy.DEPT_LEADER as any },
+ {
+ label: '连续多级部门负责人',
+ value: CandidateStrategy.MULTI_LEVEL_DEPT_LEADER as any,
+ },
+ { label: '发起人自选', value: CandidateStrategy.START_USER_SELECT as any },
+ { label: '审批人自选', value: CandidateStrategy.APPROVE_USER_SELECT as any },
+ { label: '发起人本人', value: CandidateStrategy.START_USER as any },
+ {
+ label: '发起人部门负责人',
+ value: CandidateStrategy.START_USER_DEPT_LEADER as any,
+ },
+ {
+ label: '发起人连续部门负责人',
+ value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER as any,
+ },
+ { label: '用户组', value: CandidateStrategy.USER_GROUP as any },
+ { label: '表单内用户字段', value: CandidateStrategy.FORM_USER as any },
+ {
+ label: '表单内部门负责人',
+ value: CandidateStrategy.FORM_DEPT_LEADER as any,
+ },
+ { label: '流程表达式', value: CandidateStrategy.EXPRESSION as any },
+];
+// 审批节点 的审批类型
+export const APPROVE_TYPE: DictDataType[] = [
+ { label: '人工审批', value: ApproveType.USER as any },
+ { label: '自动通过', value: ApproveType.AUTO_APPROVE as any },
+ { label: '自动拒绝', value: ApproveType.AUTO_REJECT as any },
+];
+
+export const APPROVE_METHODS: DictDataType[] = [
+ {
+ label: '按顺序依次审批',
+ value: ApproveMethodType.SEQUENTIAL_APPROVE as any,
+ },
+ {
+ label: '会签(可同时审批,至少 % 人必须审批通过)',
+ value: ApproveMethodType.APPROVE_BY_RATIO as any,
+ },
+ {
+ label: '或签(可同时审批,有一人通过即可)',
+ value: ApproveMethodType.ANY_APPROVE as any,
+ },
+ {
+ label: '随机挑选一人审批',
+ value: ApproveMethodType.RANDOM_SELECT_ONE_APPROVE as any,
+ },
+];
+
+export const CONDITION_CONFIG_TYPES: DictDataType[] = [
+ { label: '条件规则', value: ConditionType.RULE as any },
+ { label: '条件表达式', value: ConditionType.EXPRESSION as any },
+];
+
+// 时间单位类型
+export const TIME_UNIT_TYPES: DictDataType[] = [
+ { label: '分钟', value: TimeUnitType.MINUTE as any },
+ { label: '小时', value: TimeUnitType.HOUR as any },
+ { label: '天', value: TimeUnitType.DAY as any },
+];
+// 超时处理执行动作类型
+export const TIMEOUT_HANDLER_TYPES: DictDataType[] = [
+ { label: '自动提醒', value: 1 },
+ { label: '自动同意', value: 2 },
+ { label: '自动拒绝', value: 3 },
+];
+export const REJECT_HANDLER_TYPES: DictDataType[] = [
+ { label: '终止流程', value: RejectHandlerType.FINISH_PROCESS as any },
+ { label: '驳回到指定节点', value: RejectHandlerType.RETURN_USER_TASK as any },
+ // { label: '结束任务', value: RejectHandlerType.FINISH_TASK }
+];
+export const ASSIGN_EMPTY_HANDLER_TYPES: DictDataType[] = [
+ { label: '自动通过', value: 1 },
+ { label: '自动拒绝', value: 2 },
+ { label: '指定成员审批', value: 3 },
+ { label: '转交给流程管理员', value: 4 },
+];
+export const ASSIGN_START_USER_HANDLER_TYPES: DictDataType[] = [
+ { label: '由发起人对自己审批', value: 1 },
+ { label: '自动跳过', value: 2 },
+ { label: '转交给部门负责人审批', value: 3 },
+];
+
+// 比较运算符
+export const COMPARISON_OPERATORS: DictDataType[] = [
+ {
+ value: '==',
+ label: '等于',
+ },
+ {
+ value: '!=',
+ label: '不等于',
+ },
+ {
+ value: '>',
+ label: '大于',
+ },
+ {
+ value: '>=',
+ label: '大于等于',
+ },
+ {
+ value: '<',
+ label: '小于',
+ },
+ {
+ value: '<=',
+ label: '小于等于',
+ },
+];
+// 审批操作按钮名称
+export const OPERATION_BUTTON_NAME = new Map();
+OPERATION_BUTTON_NAME.set(OperationButtonType.APPROVE, '通过');
+OPERATION_BUTTON_NAME.set(OperationButtonType.REJECT, '拒绝');
+OPERATION_BUTTON_NAME.set(OperationButtonType.TRANSFER, '转办');
+OPERATION_BUTTON_NAME.set(OperationButtonType.DELEGATE, '委派');
+OPERATION_BUTTON_NAME.set(OperationButtonType.ADD_SIGN, '加签');
+OPERATION_BUTTON_NAME.set(OperationButtonType.RETURN, '退回');
+OPERATION_BUTTON_NAME.set(OperationButtonType.COPY, '抄送');
+
+// 默认的按钮权限设置
+export const DEFAULT_BUTTON_SETTING: ButtonSetting[] = [
+ { id: OperationButtonType.APPROVE, displayName: '通过', enable: true },
+ { id: OperationButtonType.REJECT, displayName: '拒绝', enable: true },
+ { id: OperationButtonType.TRANSFER, displayName: '转办', enable: true },
+ { id: OperationButtonType.DELEGATE, displayName: '委派', enable: true },
+ { id: OperationButtonType.ADD_SIGN, displayName: '加签', enable: true },
+ { id: OperationButtonType.RETURN, displayName: '退回', enable: true },
+];
+
+// 办理人默认的按钮权限设置
+export const TRANSACTOR_DEFAULT_BUTTON_SETTING: ButtonSetting[] = [
+ { id: OperationButtonType.APPROVE, displayName: '办理', enable: true },
+ { id: OperationButtonType.REJECT, displayName: '拒绝', enable: false },
+ { id: OperationButtonType.TRANSFER, displayName: '转办', enable: false },
+ { id: OperationButtonType.DELEGATE, displayName: '委派', enable: false },
+ { id: OperationButtonType.ADD_SIGN, displayName: '加签', enable: false },
+ { id: OperationButtonType.RETURN, displayName: '退回', enable: false },
+];
+
+// 发起人的按钮权限。暂时定死,不可以编辑
+export const START_USER_BUTTON_SETTING: ButtonSetting[] = [
+ { id: OperationButtonType.APPROVE, displayName: '提交', enable: true },
+ { id: OperationButtonType.REJECT, displayName: '拒绝', enable: false },
+ { id: OperationButtonType.TRANSFER, displayName: '转办', enable: false },
+ { id: OperationButtonType.DELEGATE, displayName: '委派', enable: false },
+ { id: OperationButtonType.ADD_SIGN, displayName: '加签', enable: false },
+ { id: OperationButtonType.RETURN, displayName: '退回', enable: false },
+];
+
+export const MULTI_LEVEL_DEPT: DictDataType[] = [
+ { label: '第 1 级部门', value: 1 },
+ { label: '第 2 级部门', value: 2 },
+ { label: '第 3 级部门', value: 3 },
+ { label: '第 4 级部门', value: 4 },
+ { label: '第 5 级部门', value: 5 },
+ { label: '第 6 级部门', value: 6 },
+ { label: '第 7 级部门', value: 7 },
+ { label: '第 8 级部门', value: 8 },
+ { label: '第 9 级部门', value: 9 },
+ { label: '第 10 级部门', value: 10 },
+ { label: '第 11 级部门', value: 11 },
+ { label: '第 12 级部门', value: 12 },
+ { label: '第 13 级部门', value: 13 },
+ { label: '第 14 级部门', value: 14 },
+ { label: '第 15 级部门', value: 15 },
+];
+
+export const DELAY_TYPE = [
+ { label: '固定时长', value: DelayTypeEnum.FIXED_TIME_DURATION },
+ { label: '固定日期', value: DelayTypeEnum.FIXED_DATE_TIME },
+];
+
+export const BPM_HTTP_REQUEST_PARAM_TYPES = [
+ {
+ value: 1,
+ label: '固定值',
+ },
+ {
+ value: 2,
+ label: '表单',
+ },
+];
+
+export const TRIGGER_TYPES: DictDataType[] = [
+ { label: '发送 HTTP 请求', value: TriggerTypeEnum.HTTP_REQUEST as any },
+ { label: '接收 HTTP 回调', value: TriggerTypeEnum.HTTP_CALLBACK as any },
+ { label: '修改表单数据', value: TriggerTypeEnum.FORM_UPDATE as any },
+ { label: '删除表单数据', value: TriggerTypeEnum.FORM_DELETE as any },
+];
+
+export const CHILD_PROCESS_START_USER_TYPE = [
+ {
+ label: '同主流程发起人',
+ value: ChildProcessStartUserTypeEnum.MAIN_PROCESS_START_USER,
+ },
+ { label: '从表单中获取', value: ChildProcessStartUserTypeEnum.FROM_FORM },
+];
+
+export const CHILD_PROCESS_START_USER_EMPTY_TYPE = [
+ {
+ label: '同主流程发起人',
+ value: ChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_START_USER,
+ },
+ {
+ label: '子流程管理员',
+ value: ChildProcessStartUserEmptyTypeEnum.CHILD_PROCESS_ADMIN,
+ },
+ {
+ label: '主流程管理员',
+ value: ChildProcessStartUserEmptyTypeEnum.MAIN_PROCESS_ADMIN,
+ },
+];
+
+export const CHILD_PROCESS_MULTI_INSTANCE_SOURCE_TYPE = [
+ {
+ label: '固定数量',
+ value: ChildProcessMultiInstanceSourceTypeEnum.FIXED_QUANTITY,
+ },
+ {
+ label: '数字表单',
+ value: ChildProcessMultiInstanceSourceTypeEnum.NUMBER_FORM,
+ },
+ {
+ label: '多选表单',
+ value: ChildProcessMultiInstanceSourceTypeEnum.MULTIPLE_FORM,
+ },
+];
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/helpers.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/helpers.ts
new file mode 100644
index 0000000000..3ffc2a3037
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/helpers.ts
@@ -0,0 +1,792 @@
+import type { Ref } from 'vue';
+
+import type {
+ ConditionGroup,
+ HttpRequestParam,
+ SimpleFlowNode,
+} from './consts';
+
+import type { BpmUserGroupApi } from '#/api/bpm/userGroup';
+import type { SystemDeptApi } from '#/api/system/dept';
+import type { SystemPostApi } from '#/api/system/post';
+import type { SystemRoleApi } from '#/api/system/role';
+import type { SystemUserApi } from '#/api/system/user';
+
+import { inject, nextTick, ref, toRaw, unref, watch } from 'vue';
+
+import {
+ BpmNodeTypeEnum,
+ BpmTaskStatusEnum,
+ ProcessVariableEnum,
+} from '@vben/constants';
+
+import {
+ ApproveMethodType,
+ AssignEmptyHandlerType,
+ AssignStartUserHandlerType,
+ CandidateStrategy,
+ COMPARISON_OPERATORS,
+ ConditionType,
+ FieldPermissionType,
+ NODE_DEFAULT_NAME,
+ RejectHandlerType,
+} from './consts';
+
+export function useWatchNode(props: {
+ flowNode: SimpleFlowNode;
+}): Ref {
+ const node = ref(props.flowNode);
+ watch(
+ () => props.flowNode,
+ (newValue) => {
+ node.value = newValue;
+ },
+ );
+ return node;
+}
+
+// 解析 formCreate 所有表单字段, 并返回
+function parseFormCreateFields(formFields?: string[]) {
+ const result: Array> = [];
+ if (formFields) {
+ formFields.forEach((fieldStr: string) => {
+ parseFormFields(JSON.parse(fieldStr), result);
+ });
+ }
+ return result;
+}
+
+/**
+ * 解析表单组件的 field, title 等字段(递归,如果组件包含子组件)
+ *
+ * @param rule 组件的生成规则 https://www.form-create.com/v3/guide/rule
+ * @param fields 解析后表单组件字段
+ * @param parentTitle 如果是子表单,子表单的标题,默认为空
+ */
+export const parseFormFields = (
+ rule: Record,
+ fields: Array> = [],
+ parentTitle: string = '',
+) => {
+ const { type, field, $required, title: tempTitle, children } = rule;
+ if (field && tempTitle) {
+ let title = tempTitle;
+ if (parentTitle) {
+ title = `${parentTitle}.${tempTitle}`;
+ }
+ let required = false;
+ if ($required) {
+ required = true;
+ }
+ fields.push({
+ field,
+ title,
+ type,
+ required,
+ });
+ // TODO 子表单 需要处理子表单字段
+ // if (type === 'group' && rule.props?.rule && Array.isArray(rule.props.rule)) {
+ // // 解析子表单的字段
+ // rule.props.rule.forEach((item) => {
+ // parseFields(item, fieldsPermission, title)
+ // })
+ // }
+ }
+ if (children && Array.isArray(children)) {
+ children.forEach((rule) => {
+ parseFormFields(rule, fields);
+ });
+ }
+};
+
+/**
+ * @description 表单数据权限配置,用于发起人节点 、审批节点、抄送节点
+ */
+export function useFormFieldsPermission(
+ defaultPermission: FieldPermissionType,
+) {
+ // 字段权限配置. 需要有 field, title, permissioin 属性
+ const fieldsPermissionConfig = ref>>([]);
+
+ const formType = inject[>('formType', ref()); // 表单类型
+
+ const formFields = inject][>('formFields', ref([])); // 流程表单字段
+
+ function getNodeConfigFormFields(
+ nodeFormFields?: Array>,
+ ) {
+ nodeFormFields = toRaw(nodeFormFields);
+ fieldsPermissionConfig.value =
+ !nodeFormFields || nodeFormFields.length === 0
+ ? getDefaultFieldsPermission(unref(formFields))
+ : mergeFieldsPermission(nodeFormFields, unref(formFields));
+ }
+ // 合并已经设置的表单字段权限,当前流程表单字段 (可能新增,或删除了字段)
+ function mergeFieldsPermission(
+ formFieldsPermisson: Array>,
+ formFields?: string[],
+ ) {
+ let mergedFieldsPermission: Array> = [];
+ if (formFields) {
+ mergedFieldsPermission = parseFormCreateFields(formFields).map((item) => {
+ const found = formFieldsPermisson.find(
+ (fieldPermission) => fieldPermission.field === item.field,
+ );
+ return {
+ field: item.field,
+ title: item.title,
+ permission: found ? found.permission : defaultPermission,
+ };
+ });
+ }
+ return mergedFieldsPermission;
+ }
+
+ // 默认的表单权限: 获取表单的所有字段,设置字段默认权限为只读
+ function getDefaultFieldsPermission(formFields?: string[]) {
+ let defaultFieldsPermission: Array> = [];
+ if (formFields) {
+ defaultFieldsPermission = parseFormCreateFields(formFields).map(
+ (item) => {
+ return {
+ field: item.field,
+ title: item.title,
+ permission: defaultPermission,
+ };
+ },
+ );
+ }
+ return defaultFieldsPermission;
+ }
+
+ // 获取表单的所有字段,作为下拉框选项
+ const formFieldOptions = parseFormCreateFields(unref(formFields));
+
+ return {
+ formType,
+ fieldsPermissionConfig,
+ formFieldOptions,
+ getNodeConfigFormFields,
+ };
+}
+
+/**
+ * @description 获取流程表单的字段
+ */
+export function useFormFields() {
+ const formFields = inject][>('formFields', ref([])); // 流程表单字段
+ return parseFormCreateFields(unref(formFields));
+}
+
+// TODO @芋艿:后续需要把各种类似 useFormFieldsPermission 的逻辑,抽成一个通用方法。
+/**
+ * @description 获取流程表单的字段和发起人字段
+ */
+export function useFormFieldsAndStartUser() {
+ const injectFormFields = inject][>('formFields', ref([])); // 流程表单字段
+ const formFields = parseFormCreateFields(unref(injectFormFields));
+ // 添加发起人
+ formFields.unshift({
+ field: ProcessVariableEnum.START_USER_ID,
+ title: '发起人',
+ required: true,
+ });
+ return formFields;
+}
+
+export type UserTaskFormType = {
+ approveMethod: ApproveMethodType;
+ approveRatio?: number;
+ assignEmptyHandlerType?: AssignEmptyHandlerType;
+ assignEmptyHandlerUserIds?: number[];
+ assignStartUserHandlerType?: AssignStartUserHandlerType;
+ buttonsSetting: any[];
+ candidateStrategy: CandidateStrategy;
+ deptIds?: number[]; // 部门
+ deptLevel?: number; // 部门层级
+ expression?: string; // 流程表达式
+ formDept?: string; // 表单内部门字段
+ formUser?: string; // 表单内用户字段
+ maxRemindCount?: number;
+ postIds?: number[]; // 岗位
+ reasonRequire: boolean;
+ rejectHandlerType?: RejectHandlerType;
+ returnNodeId?: string;
+ roleIds?: number[]; // 角色
+ signEnable: boolean;
+ skipExpression?: string; // 跳过表达式
+ taskAssignListener?: {
+ body: HttpRequestParam[];
+ header: HttpRequestParam[];
+ };
+ taskAssignListenerEnable?: boolean;
+ taskAssignListenerPath?: string;
+ taskCompleteListener?: {
+ body: HttpRequestParam[];
+ header: HttpRequestParam[];
+ };
+ taskCompleteListenerEnable?: boolean;
+ taskCompleteListenerPath?: string;
+ taskCreateListener?: {
+ body: HttpRequestParam[];
+ header: HttpRequestParam[];
+ };
+ taskCreateListenerEnable?: boolean;
+ taskCreateListenerPath?: string;
+ timeDuration?: number;
+ timeoutHandlerEnable?: boolean;
+ timeoutHandlerType?: number;
+ userGroups?: number[]; // 用户组
+ userIds?: number[]; // 用户
+};
+
+export type CopyTaskFormType = {
+ candidateStrategy: CandidateStrategy;
+ deptIds?: number[]; // 部门
+ deptLevel?: number; // 部门层级
+ expression?: string; // 流程表达式
+ formDept?: string; // 表单内部门字段
+ formUser?: string; // 表单内用户字段
+ postIds?: number[]; // 岗位
+ roleIds?: number[]; // 角色
+ userGroups?: number[]; // 用户组
+ userIds?: number[]; // 用户
+};
+
+/**
+ * @description 节点表单数据。 用于审批节点、抄送节点
+ */
+export function useNodeForm(nodeType: BpmNodeTypeEnum) {
+ const roleOptions = inject][>('roleList', ref([])); // 角色列表
+ const postOptions = inject][>('postList', ref([])); // 岗位列表
+ const userOptions = inject][>('userList', ref([])); // 用户列表
+ const deptOptions = inject][>('deptList', ref([])); // 部门列表
+ const userGroupOptions = inject][>(
+ 'userGroupList',
+ ref([]),
+ ); // 用户组列表
+ const deptTreeOptions = inject][>(
+ 'deptTree',
+ ref([]),
+ ); // 部门树
+ const formFields = inject][>('formFields', ref([])); // 流程表单字段
+ const configForm = ref();
+
+ if (
+ nodeType === BpmNodeTypeEnum.USER_TASK_NODE ||
+ nodeType === BpmNodeTypeEnum.TRANSACTOR_NODE
+ ) {
+ configForm.value = {
+ candidateStrategy: CandidateStrategy.USER,
+ approveMethod: ApproveMethodType.SEQUENTIAL_APPROVE,
+ approveRatio: 100,
+ rejectHandlerType: RejectHandlerType.FINISH_PROCESS,
+ assignStartUserHandlerType: AssignStartUserHandlerType.START_USER_AUDIT,
+ returnNodeId: '',
+ timeoutHandlerEnable: false,
+ timeoutHandlerType: 1,
+ timeDuration: 6, // 默认 6小时
+ maxRemindCount: 1, // 默认 提醒 1次
+ buttonsSetting: [],
+ };
+ }
+ configForm.value = {
+ candidateStrategy: CandidateStrategy.USER,
+ };
+
+ function getShowText(): string {
+ let showText = '';
+ // 指定成员
+ if (
+ configForm.value?.candidateStrategy === CandidateStrategy.USER &&
+ configForm.value?.userIds?.length > 0
+ ) {
+ const candidateNames: string[] = [];
+ userOptions?.value.forEach((item: any) => {
+ if (configForm.value?.userIds?.includes(item.id)) {
+ candidateNames.push(item.nickname);
+ }
+ });
+ showText = `指定成员:${candidateNames.join(',')}`;
+ }
+ // 指定角色
+ if (
+ configForm.value?.candidateStrategy === CandidateStrategy.ROLE &&
+ configForm.value.roleIds?.length > 0
+ ) {
+ const candidateNames: string[] = [];
+ roleOptions?.value.forEach((item: any) => {
+ if (configForm.value?.roleIds?.includes(item.id)) {
+ candidateNames.push(item.name);
+ }
+ });
+ showText = `指定角色:${candidateNames.join(',')}`;
+ }
+ // 指定部门
+ if (
+ (configForm.value?.candidateStrategy === CandidateStrategy.DEPT_MEMBER ||
+ configForm.value?.candidateStrategy === CandidateStrategy.DEPT_LEADER ||
+ configForm.value?.candidateStrategy ===
+ CandidateStrategy.MULTI_LEVEL_DEPT_LEADER) &&
+ configForm.value?.deptIds?.length > 0
+ ) {
+ const candidateNames: string[] = [];
+ deptOptions?.value.forEach((item) => {
+ if (configForm.value?.deptIds?.includes(item.id)) {
+ candidateNames.push(item.name);
+ }
+ });
+ if (
+ configForm.value.candidateStrategy === CandidateStrategy.DEPT_MEMBER
+ ) {
+ showText = `部门成员:${candidateNames.join(',')}`;
+ } else if (
+ configForm.value.candidateStrategy === CandidateStrategy.DEPT_LEADER
+ ) {
+ showText = `部门的负责人:${candidateNames.join(',')}`;
+ } else {
+ showText = `多级部门的负责人:${candidateNames.join(',')}`;
+ }
+ }
+
+ // 指定岗位
+ if (
+ configForm.value?.candidateStrategy === CandidateStrategy.POST &&
+ configForm.value.postIds?.length > 0
+ ) {
+ const candidateNames: string[] = [];
+ postOptions?.value.forEach((item) => {
+ if (configForm.value?.postIds?.includes(item.id)) {
+ candidateNames.push(item.name);
+ }
+ });
+ showText = `指定岗位: ${candidateNames.join(',')}`;
+ }
+ // 指定用户组
+ if (
+ configForm.value?.candidateStrategy === CandidateStrategy.USER_GROUP &&
+ configForm.value?.userGroups?.length > 0
+ ) {
+ const candidateNames: string[] = [];
+ userGroupOptions?.value.forEach((item) => {
+ if (configForm.value?.userGroups?.includes(item.id)) {
+ candidateNames.push(item.name);
+ }
+ });
+ showText = `指定用户组: ${candidateNames.join(',')}`;
+ }
+
+ // 表单内用户字段
+ if (configForm.value?.candidateStrategy === CandidateStrategy.FORM_USER) {
+ const formFieldOptions = parseFormCreateFields(unref(formFields));
+ const item = formFieldOptions.find(
+ (item) => item.field === configForm.value?.formUser,
+ );
+ showText = `表单用户:${item?.title}`;
+ }
+
+ // 表单内部门负责人
+ if (
+ configForm.value?.candidateStrategy === CandidateStrategy.FORM_DEPT_LEADER
+ ) {
+ showText = `表单内部门负责人`;
+ }
+
+ // 审批人自选
+ if (
+ configForm.value?.candidateStrategy ===
+ CandidateStrategy.APPROVE_USER_SELECT
+ ) {
+ showText = `审批人自选`;
+ }
+
+ // 发起人自选
+ if (
+ configForm.value?.candidateStrategy ===
+ CandidateStrategy.START_USER_SELECT
+ ) {
+ showText = `发起人自选`;
+ }
+ // 发起人自己
+ if (configForm.value?.candidateStrategy === CandidateStrategy.START_USER) {
+ showText = `发起人自己`;
+ }
+ // 发起人的部门负责人
+ if (
+ configForm.value?.candidateStrategy ===
+ CandidateStrategy.START_USER_DEPT_LEADER
+ ) {
+ showText = `发起人的部门负责人`;
+ }
+ // 发起人的部门负责人
+ if (
+ configForm.value?.candidateStrategy ===
+ CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER
+ ) {
+ showText = `发起人连续部门负责人`;
+ }
+ // 流程表达式
+ if (configForm.value?.candidateStrategy === CandidateStrategy.EXPRESSION) {
+ showText = `流程表达式:${configForm.value.expression}`;
+ }
+ return showText;
+ }
+
+ /**
+ * 处理候选人参数的赋值
+ */
+ function handleCandidateParam() {
+ let candidateParam: string | undefined;
+ if (!configForm.value) {
+ return candidateParam;
+ }
+ switch (configForm.value.candidateStrategy) {
+ case CandidateStrategy.DEPT_LEADER:
+ case CandidateStrategy.DEPT_MEMBER: {
+ candidateParam = configForm.value.deptIds?.join(',');
+ break;
+ }
+ case CandidateStrategy.EXPRESSION: {
+ candidateParam = configForm.value.expression;
+ break;
+ }
+ // 表单内部门的负责人
+ case CandidateStrategy.FORM_DEPT_LEADER: {
+ // 候选人参数格式: | 分隔 。左边为表单内部门字段。 右边为部门层级
+ const deptFieldOnForm = configForm.value.formDept;
+ candidateParam = deptFieldOnForm?.concat(
+ `|${configForm.value.deptLevel}`,
+ );
+ break;
+ }
+ case CandidateStrategy.FORM_USER: {
+ candidateParam = configForm.value?.formUser;
+ break;
+ }
+ // 指定连续多级部门的负责人
+ case CandidateStrategy.MULTI_LEVEL_DEPT_LEADER: {
+ // 候选人参数格式: | 分隔 。左边为部门(多个部门用 , 分隔)。 右边为部门层级
+ const deptIds = configForm.value.deptIds?.join(',');
+ candidateParam = deptIds?.concat(`|${configForm.value.deptLevel}`);
+ break;
+ }
+ case CandidateStrategy.POST: {
+ candidateParam = configForm.value.postIds?.join(',');
+ break;
+ }
+ case CandidateStrategy.ROLE: {
+ candidateParam = configForm.value.roleIds?.join(',');
+ break;
+ }
+ // 发起人部门负责人
+ case CandidateStrategy.START_USER_DEPT_LEADER:
+ case CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER: {
+ candidateParam = `${configForm.value.deptLevel}`;
+ break;
+ }
+ case CandidateStrategy.USER: {
+ candidateParam = configForm.value.userIds?.join(',');
+ break;
+ }
+ case CandidateStrategy.USER_GROUP: {
+ candidateParam = configForm.value.userGroups?.join(',');
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ return candidateParam;
+ }
+ /**
+ * 解析候选人参数
+ */
+ function parseCandidateParam(
+ candidateStrategy: CandidateStrategy,
+ candidateParam: string | undefined,
+ ) {
+ if (!configForm.value || !candidateParam) {
+ return;
+ }
+ switch (candidateStrategy) {
+ case CandidateStrategy.DEPT_LEADER:
+ case CandidateStrategy.DEPT_MEMBER: {
+ configForm.value.deptIds = candidateParam
+ .split(',')
+ .map((item) => +item);
+ break;
+ }
+ case CandidateStrategy.EXPRESSION: {
+ configForm.value.expression = candidateParam;
+ break;
+ }
+ // 表单内的部门负责人
+ case CandidateStrategy.FORM_DEPT_LEADER: {
+ // 候选人参数格式: | 分隔 。左边为表单内的部门字段。 右边为部门层级
+ const paramArray = candidateParam.split('|');
+ if (paramArray.length > 1) {
+ configForm.value.formDept = paramArray[0];
+ if (paramArray[1]) configForm.value.deptLevel = +paramArray[1];
+ }
+ break;
+ }
+ case CandidateStrategy.FORM_USER: {
+ configForm.value.formUser = candidateParam;
+ break;
+ }
+ // 指定连续多级部门的负责人
+ case CandidateStrategy.MULTI_LEVEL_DEPT_LEADER: {
+ // 候选人参数格式: | 分隔 。左边为部门(多个部门用 , 分隔)。 右边为部门层级
+ const paramArray = candidateParam.split('|') as string[];
+ if (paramArray.length > 1) {
+ configForm.value.deptIds = paramArray[0]
+ ?.split(',')
+ .map((item) => +item);
+ if (paramArray[1]) configForm.value.deptLevel = +paramArray[1];
+ }
+ break;
+ }
+ case CandidateStrategy.POST: {
+ configForm.value.postIds = candidateParam
+ .split(',')
+ .map((item) => +item);
+ break;
+ }
+ case CandidateStrategy.ROLE: {
+ configForm.value.roleIds = candidateParam
+ .split(',')
+ .map((item) => +item);
+ break;
+ }
+ // 发起人部门负责人
+ case CandidateStrategy.START_USER_DEPT_LEADER:
+ case CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER: {
+ configForm.value.deptLevel = +candidateParam;
+ break;
+ }
+ case CandidateStrategy.USER: {
+ configForm.value.userIds = candidateParam
+ .split(',')
+ .map((item) => +item);
+ break;
+ }
+ case CandidateStrategy.USER_GROUP: {
+ configForm.value.userGroups = candidateParam
+ .split(',')
+ .map((item) => +item);
+ break;
+ }
+ default: {
+ break;
+ }
+ }
+ }
+ return {
+ configForm,
+ roleOptions,
+ postOptions,
+ userOptions,
+ userGroupOptions,
+ deptTreeOptions,
+ handleCandidateParam,
+ parseCandidateParam,
+ getShowText,
+ };
+}
+
+/**
+ * @description 抽屉配置
+ */
+export function useDrawer() {
+ // 抽屉配置是否可见
+ const settingVisible = ref(false);
+ // 关闭配置抽屉
+ function closeDrawer() {
+ settingVisible.value = false;
+ }
+ // 打开配置抽屉
+ function openDrawer() {
+ settingVisible.value = true;
+ }
+ return {
+ settingVisible,
+ closeDrawer,
+ openDrawer,
+ };
+}
+
+/**
+ * @description 节点名称配置
+ */
+export function useNodeName(nodeType: BpmNodeTypeEnum) {
+ // 节点名称
+ const nodeName = ref();
+ // 节点名称输入框
+ const showInput = ref(false);
+ // 输入框的引用
+ const inputRef = ref(null);
+ // 点击节点名称编辑图标
+ function clickIcon() {
+ showInput.value = true;
+ }
+ // 修改节点名称
+ function changeNodeName() {
+ showInput.value = false;
+ nodeName.value =
+ nodeName.value || (NODE_DEFAULT_NAME.get(nodeType) as string);
+ }
+ // 监听 showInput 的变化,当变为 true 时自动聚焦
+ watch(showInput, (value) => {
+ if (value) {
+ nextTick(() => {
+ inputRef.value?.focus();
+ });
+ }
+ });
+
+ return {
+ nodeName,
+ showInput,
+ inputRef,
+ clickIcon,
+ changeNodeName,
+ };
+}
+
+export function useNodeName2(
+ node: Ref,
+ nodeType: BpmNodeTypeEnum,
+) {
+ // 显示节点名称输入框
+ const showInput = ref(false);
+ // 输入框的引用
+ const inputRef = ref(null);
+
+ // 监听 showInput 的变化,当变为 true 时自动聚焦
+ watch(showInput, (value) => {
+ if (value) {
+ nextTick(() => {
+ inputRef.value?.focus();
+ });
+ }
+ });
+
+ // 修改节点名称
+ function changeNodeName() {
+ showInput.value = false;
+ node.value.name =
+ node.value.name || (NODE_DEFAULT_NAME.get(nodeType) as string);
+ console.warn('node.value.name===>', node.value.name);
+ }
+ // 点击节点标题进行输入
+ function clickTitle() {
+ showInput.value = true;
+ }
+ return {
+ showInput,
+ inputRef,
+ clickTitle,
+ changeNodeName,
+ };
+}
+
+/**
+ * @description 根据节点任务状态,获取节点任务状态样式
+ */
+export function useTaskStatusClass(
+ taskStatus: BpmTaskStatusEnum | undefined,
+): string {
+ if (!taskStatus) {
+ return '';
+ }
+ if (taskStatus === BpmTaskStatusEnum.APPROVE) {
+ return 'status-pass';
+ }
+ if (taskStatus === BpmTaskStatusEnum.RUNNING) {
+ return 'status-running';
+ }
+ if (taskStatus === BpmTaskStatusEnum.REJECT) {
+ return 'status-reject';
+ }
+ if (taskStatus === BpmTaskStatusEnum.CANCEL) {
+ return 'status-cancel';
+ }
+ return '';
+}
+
+/** 条件组件文字展示 */
+export function getConditionShowText(
+ conditionType: ConditionType | undefined,
+ conditionExpression: string | undefined,
+ conditionGroups: ConditionGroup | undefined,
+ fieldOptions: Array>,
+) {
+ let showText: string | undefined;
+ if (conditionType === ConditionType.EXPRESSION && conditionExpression) {
+ showText = `表达式:${conditionExpression}`;
+ }
+ if (conditionType === ConditionType.RULE) {
+ // 条件组是否为与关系
+ const groupAnd = conditionGroups?.and;
+ let warningMessage: string | undefined;
+ const conditionGroup = conditionGroups?.conditions.map((item) => {
+ return `(${item.rules
+ .map((rule) => {
+ if (rule.leftSide && rule.rightSide) {
+ return `${getFormFieldTitle(
+ fieldOptions,
+ rule.leftSide,
+ )} ${getOpName(rule.opCode)} ${rule.rightSide}`;
+ } else {
+ // 有一条规则不完善。提示错误
+ warningMessage = '请完善条件规则';
+ return '';
+ }
+ })
+ .join(item.and ? ' 且 ' : ' 或 ')} ) `;
+ });
+ showText = warningMessage
+ ? ''
+ : conditionGroup?.join(groupAnd ? ' 且 ' : ' 或 ');
+ }
+ return showText;
+}
+
+/** 获取表单字段名称*/
+function getFormFieldTitle(
+ fieldOptions: Array>,
+ field: string,
+) {
+ const item = fieldOptions.find((item) => item.field === field);
+ return item?.title;
+}
+
+/** 获取操作符名称 */
+function getOpName(opCode: string): string | undefined {
+ const opName = COMPARISON_OPERATORS.find(
+ (item: any) => item.value === opCode,
+ );
+ return opName?.label;
+}
+
+/** 获取条件节点默认的名称 */
+export function getDefaultConditionNodeName(
+ index: number,
+ defaultFlow: boolean | undefined,
+): string {
+ if (defaultFlow) {
+ return '其它情况';
+ }
+ return `条件${index + 1}`;
+}
+
+/** 获取包容分支条件节点默认的名称 */
+export function getDefaultInclusiveConditionNodeName(
+ index: number,
+ defaultFlow: boolean | undefined,
+): string {
+ if (defaultFlow) {
+ return '其它情况';
+ }
+ return `包容条件${index + 1}`;
+}
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/index.ts b/apps/web-ele/src/views/bpm/components/simple-process-design/index.ts
new file mode 100644
index 0000000000..41269eae8c
--- /dev/null
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/index.ts
@@ -0,0 +1,11 @@
+import './styles/simple-process-designer.scss';
+
+export { default as HttpRequestSetting } from './components/nodes-config/modules/http-request-setting.vue';
+
+export { default as SimpleProcessDesigner } from './components/simple-process-designer.vue';
+
+export { default as SimpleProcessViewer } from './components/simple-process-viewer.vue';
+
+export type { SimpleFlowNode } from './consts';
+
+export { parseFormFields } from './helpers';
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.ttf b/apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..06f4e31c4b4ce9868cd39b25f6beb1fd5884ff9c
GIT binary patch
literal 4808
zcmd@YX>c27^?SQItaBqvtIM{el`JW?WZBl`_=ptSi5)v`6Jk3lxg5n&Y$vj8WF^F<
z6Vf9?n|9jZGL#;)rA=DOgku^?TWDy?l+tp|K(Cq7rVV9erYX#j8HNGkHSb%kaYzF*
z%mn{KxR0}8pqLQTw1%VSpiI2O3`8mq&DYtNuL;)=sqGVBejce1sb$iLV
z5}Cg!#e=Z#lAEy`^5rFnkdHh*yuBlw?mIKs6qz;UmAQxDZdgHhC@2aM#E4n4w%
z0gdec`=yrx@TeRH#whS~kOShK+<4a1oIw{aZD!o(&
zx;jd)mjRExyKHW>=9evXSh-IrSPrEqDV7Q`BaS2`(lUO+h>YK3TpRV$ozg;1j%RmBnUl
z2b0AG*bl`iCLUqfs0%Dc@J1k>0&}@3i`boYJq@h*ReMmSU!jGY)S*s)xUasxFYNCO
zsm1&3!Bh62U=wev;%yd_^OA3%8m#MLg|cyFJ|Qwuhb0aC5k-D(rAj+)Q~;)%Db^
zw1JCNc-y@7>u*?Jk8RL?%o7oeD-xVxp@idv+w2W(>GlR2tagT@)DF?YE7*jpszON9
zcrPAj|HMw=>==lRRAD3pK9?f=LJ>n0X=L;{{$YvB<%5P~9ayCT@c#y2SI~eM7v^
z4SV3pZt;B(n5}bfz9DYyhFVd5&)l1D!&Bk|P%F*p;u-cswwE+utVhTmLj2xf1X@y%
z2n6xQkm7Bz+N?$hP(_m7I1ltjmEVh]F=`_dfh1Z+7$Z~GfxS-(_4u;+I
zg}X)!wJcX@(txUx@pSZW=x{@&O084DLt>?dt5Ez+)(HTMkobPg3Op3!oq3K-Dq#qX*sIc;h|T04v1XY*_dSBRbXNi*&Wz2pGS5T@8a
z)2#&)l%^uhPUXK-u>Y!1S**0X*(3$JB_=hP;k-qf2^9x)LR2;2GcmWj6RCt-LNi9Y
z5r4efy>R*yQme~##}z_k!!DObXK+QTTbWj8sH!#XVt(qD$8{$LjrMB0
z(H(NduOVA#bSGV|WGdluC5GG~H~yHo_&|lmY}MQCdUK^eI5V@-SM9X$1{>H=5D26h
zp4NuN->|1x4^nm_kO*lf>&Y0ZdX}Y$WilY?q+T|P(F~Dlxr26e!}XuuJ-Df{
zsi|?(;BLLapdY?|L(we=?&5~)zj57$qQ|a+n+%nehF?-7UNUfOoZ+1khGz`aQ?pZ3
z9vNK;FOzE|Qu1|RSvtHd-M&m_E96(waE2`>R@S38o6k|VpmW(1kH=Ho(3Ylkp4Riv
zvoGLjOHUj)&sfiKG8q@}Sd`iF5-Cq4NK=l5T|jBgQVOJ)n1D-)@(dX~p7tDk{Qez%
zNBURoYH8UuO%d$jETR68xEYb9#^UQ7YJhL0CQ=sIwd4NB4tdhY2m6oo!Fjnm+FV|1
zG0uhiL!tigoY8`GWT?}Znn)uf)!lp9KeDruzjdUQdMqvEvX|_YJBS9bL;_|7U`{|X
zfV4LVm^Oel53Cl33>@k2Kk^ld29n$3@$ET^;1O|`Eo~RK+wE}5p0>dgJhNY%(|dH{
z7xj9W(s}fd*E3&|Ezw*I%BE-!3iz7cE{>p~xXnh5yVjsFHIeM};+)1u_vpo=c*;GB
z?@>vJhT&Umn5odL0W<4Yn*4A#oDr{k|BbB+p10uJ;wcz;aaR1D_zUq>P{F7eI`-Mm
zF&D%WhhRiJ4mX1BGC6q?2ER$?lW$*jg4X(k39DHQw;zJIf&%ty%YS(yM7v_C%W<}II
zw1PE={re0(@JPpS-R63ix7EvZqsbbdW8ti$w$=d|@eve0^)kF?QgEGy04I9J`fc!P
zZQ#*CH+
zjh3?(<2bcMgye(E-0AAND|L0%rzM@d#*VVTVsF8E+Dx`evk{<9N39lB5YJ9nN>k7-
zZQ+S{im|yEY5P{kGB&$|}B?Bex?`X)_!xSI>rDb&E%H)_{x=`uFdfu(|l`X((^g%|3C
zMge~?Dz`x!Wd#_6S2(BEWYRjhA8UJu+t|c#pYavNtGe~WtxU^MpYb)t%eo$vCx`lX
zqfNvMf=zBWBIk_=^hGPldHG9>5Hs@hTa4lgM~yX$8{tGOffMiORGJ
z<*Q{{OG0FwOzUvOY5HBIz%K(5Ah*gi;FsQ0GR+Vpd0wVjl>bDg6-d7=(@J6`^D?bM
z`GQPq$rdokw2lN|w7Zba6tjChduBZoqf_~PQ~BajyE!{{FqbJTu}kfiY++_%D(`8I
zG%bmGv-xacX_%QqW6@%9pJ!iTYSPn#<7IQXDbI9aYJYaL7#S}Xr`sAE>2s(&GCDO$
zx=Dd#Nrn^=?TW`VM1u}#E=$IZ{
ztP%W6;p$$!*efsfyxN-?atNOmMIVdkkq4oGBTXXJBm0*{PjX0ma001rKaMksy(45?
zvYIAsq!I6>_gU&6k=}EX(3&Y-^uLd5T?Sx)#VtsQyM!7lKm%IPfgTKCB)S_XauWwf
z$FupdX6-VqE*2)n#j(W&WK
g)p#bqH<#6956e<@W*R5%P_|+^Q^@3U*&O=y4}qdQh5!Hn
literal 0
HcmV?d00001
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.woff b/apps/web-ele/src/views/bpm/components/simple-process-design/styles/iconfont.woff
new file mode 100644
index 0000000000000000000000000000000000000000..0724e75054dc761f7cec794944cc140f3056bebf
GIT binary patch
literal 3176
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
\ No newline at end of file
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
index d38cd7c083..8d1bdc79df 100644
--- a/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
+++ b/apps/web-ele/src/views/bpm/model/form/modules/basic-info.vue
@@ -291,8 +291,8 @@ defineExpose({ validate });
diff --git a/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue b/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
index 18a2b65e28..8f2495b750 100644
--- a/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
+++ b/apps/web-ele/src/views/bpm/model/form/modules/process-design.vue
@@ -1,5 +1,7 @@
-
+ />
--
Gitee
From c01b09b64b2e51a654b9e21f37e74a29ec040a39 Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Sat, 22 Nov 2025 09:29:25 +0800
Subject: [PATCH 4/7] =?UTF-8?q?feat:=20[bpm][ele]=20=E4=BB=BF=E9=92=89?=
=?UTF-8?q?=E9=92=89=E6=B5=81=E7=A8=8B=E6=A8=A1=E5=9E=8B=E8=BF=81=E7=A7=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../components/nodes-config/child-process-node-config.vue | 2 +-
.../components/nodes-config/condition-node-config.vue | 2 +-
.../components/nodes-config/copy-task-node-config.vue | 2 +-
.../components/nodes-config/delay-timer-node-config.vue | 2 +-
.../components/nodes-config/modules/condition-dialog.vue | 2 +-
.../components/nodes-config/modules/condition.vue | 3 +--
.../nodes-config/modules/http-request-param-setting.vue | 2 +-
.../components/nodes-config/modules/http-request-setting.vue | 2 +-
.../components/nodes-config/modules/user-task-listener.vue | 2 +-
.../components/nodes-config/router-node-config.vue | 2 +-
.../components/nodes-config/start-user-node-config.vue | 2 +-
.../components/nodes-config/trigger-node-config.vue | 2 +-
.../components/nodes-config/user-task-node-config.vue | 2 +-
.../components/nodes/child-process-node.vue | 2 +-
.../simple-process-design/components/nodes/copy-task-node.vue | 2 +-
.../components/nodes/delay-timer-node.vue | 2 +-
.../simple-process-design/components/nodes/end-event-node.vue | 2 +-
.../simple-process-design/components/nodes/exclusive-node.vue | 2 +-
.../simple-process-design/components/nodes/inclusive-node.vue | 2 +-
.../components/nodes/modules/process-instance-modal.vue | 2 +-
.../components/nodes/modules/task-list-modal.vue | 2 +-
.../simple-process-design/components/nodes/node-handler.vue | 2 +-
.../simple-process-design/components/nodes/parallel-node.vue | 2 +-
.../simple-process-design/components/nodes/router-node.vue | 2 +-
.../simple-process-design/components/nodes/start-user-node.vue | 2 +-
.../simple-process-design/components/nodes/trigger-node.vue | 2 +-
.../simple-process-design/components/nodes/user-task-node.vue | 2 +-
.../simple-process-design/components/process-node-tree.vue | 2 +-
.../components/simple-process-designer.vue | 2 +-
.../simple-process-design/components/simple-process-viewer.vue | 2 +-
30 files changed, 30 insertions(+), 31 deletions(-)
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
index 16048bd535..46ca6acc4f 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue
@@ -1,4 +1,4 @@
-
-
+
@@ -203,11 +205,12 @@ defineExpose({ validate });
-
+
@@ -247,19 +250,21 @@ defineExpose({ validate });
-
-
-
- {{ operator.label }}
-
-
+
+
+
+
+ {{ operator.label }}
+
+
+
-
+
-
+
-
-
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
index 7e8c7a30d8..9c70ae9208 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-param-setting.vue
@@ -5,11 +5,9 @@ import { IconifyIcon } from '@vben/icons';
import {
ElButton,
- ElCol,
ElFormItem,
ElInput,
ElOption,
- ElRow,
ElSelect,
} from 'element-plus';
@@ -57,8 +55,13 @@ function deleteHttpRequestParam(arr: HttpRequestParam[], index: number) {
-
-
+
+
+
-
-
-
-
- {{ types.label }}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
-
-
-
- {{ types.label }}
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -182,9 +202,13 @@ function deleteHttpRequestParam(arr: HttpRequestParam[], index: number) {
message: '参数值不能为空',
trigger: 'change',
}"
- v-if="item.type === BpmHttpRequestParamTypeEnum.FROM_FORM"
+ v-show="item.type === BpmHttpRequestParamTypeEnum.FROM_FORM"
>
-
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
字段名称
-
-
-
-
- 只读
-
-
-
-
- 可编辑
-
-
-
-
- 隐藏
-
-
-
+
+
+ 只读
+
+
+ 可编辑
+
+
+ 隐藏
+
@@ -255,18 +247,16 @@ defineExpose({ showStartUserNodeConfig });
{{ item.title }}
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
index 8f6cc6e1af..effa8b4044 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/user-task-node-config.vue
@@ -32,7 +32,6 @@ import {
ElSwitch,
ElTabPane,
ElTabs,
- ElText,
ElTreeSelect,
} from 'element-plus';
@@ -927,43 +926,30 @@ onMounted(() => {
-
-
-
- 当超时
-
-
-
-
-
-
-
-
-
-
-
-
- 未处理
-
-
-
+
+ 当超时
+
+
+
+
+
+
+ 未处理
+
{
字段名称
-
-
-
-
- 只读
-
-
-
-
- 可编�?
-
-
-
-
- 隐藏
-
-
-
+
+
+ 只读
+
+
+ 可编辑
+
+
+ 隐藏
+
@@ -1172,18 +1150,16 @@ onMounted(() => {
{{ item.title }}
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
--
Gitee
From fec9a768d981d7b59f50140ec812fd83852ee3bd Mon Sep 17 00:00:00 2001
From: jason <2667446@qq.com>
Date: Sun, 23 Nov 2025 10:56:59 +0800
Subject: [PATCH 6/7] =?UTF-8?q?feat:=20[bpm][ele]=20=E4=BB=BF=E9=92=89?=
=?UTF-8?q?=E9=92=89=E6=B5=81=E7=A8=8B=E8=AE=BE=E8=AE=A1=E5=99=A8=E8=BF=81?=
=?UTF-8?q?=E7=A7=BB=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../nodes-config/modules/condition.vue | 2 +-
.../nodes-config/condition-node-config.vue | 4 +-
.../nodes-config/delay-timer-node-config.vue | 73 +++++-------
.../nodes-config/modules/condition.vue | 40 +++----
.../modules/http-request-param-setting.vue | 40 +++----
.../modules/http-request-setting.vue | 109 +++++++++---------
.../nodes-config/router-node-config.vue | 17 ++-
.../nodes-config/trigger-node-config.vue | 26 ++---
8 files changed, 134 insertions(+), 177 deletions(-)
diff --git a/apps/web-antd/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue b/apps/web-antd/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
index e52eb8ee00..37df5a8ce5 100644
--- a/apps/web-antd/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
+++ b/apps/web-antd/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
@@ -41,7 +41,7 @@ defineOptions({
const props = defineProps({
modelValue: {
type: Object,
- required: true,
+ required: false,
default: () => ({}),
},
});
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
index 4dd9ad8302..e090971479 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/condition-node-config.vue
@@ -158,7 +158,7 @@ function changeNodeName() {
defineExpose({ open }); // 提供 open 方法,用于打开弹窗
-
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
index b3878c08a5..2366eb9f2e 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/delay-timer-node-config.vue
@@ -10,7 +10,6 @@ import { BpmNodeTypeEnum } from '@vben/constants';
import { IconifyIcon } from '@vben/icons';
import {
- ElCol,
ElDatePicker,
ElForm,
ElFormItem,
@@ -19,7 +18,6 @@ import {
ElOption,
ElRadio,
ElRadioGroup,
- ElRow,
ElSelect,
} from 'element-plus';
@@ -77,7 +75,7 @@ function getShowText(): string {
showText = `延迟${configForm.value.timeDuration}${TIME_UNIT_TYPES?.find((item) => item.value === configForm.value.timeUnit)?.label}`;
}
if (configForm.value.delayType === DelayTypeEnum.FIXED_DATE_TIME) {
- showText = `延迟�?{configForm.value.dateTime.replace('T', ' ')}`;
+ showText = `延迟至${configForm.value.dateTime.replace('T', ' ')}`;
}
return showText;
}
@@ -196,51 +194,40 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
-
-
-
-
-
-
-
-
-
- {{ item.label }}
-
-
-
-
- 后进入下一节点
-
-
+
+
+
+
+ {{ item.label }}
+
+
+ 后进入下一节点
+
-
-
-
-
-
- 后进入下一节点
-
-
+
+
+ 后进入下一节点
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
index 7f80d3eecf..e018cdde64 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/condition.vue
@@ -135,7 +135,7 @@ defineExpose({ validate });
-
+
+
-
+
@@ -310,7 +298,7 @@ defineExpose({ validate });
- {{ field.title }}
-
+ />
@@ -137,17 +135,15 @@ function deleteHttpRequestParam(arr: HttpRequestParam[], index: number) {
/>
-
+
+
+
添加一行
-
+
- {{ field.title }}
-
+ />
@@ -231,15 +225,13 @@ function deleteHttpRequestParam(arr: HttpRequestParam[], index: number) {
/>
-
+
+
+
添加一行
-
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
index d2a695062a..2446effd29 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/modules/http-request-setting.vue
@@ -67,7 +67,7 @@ function deleteHttpResponseSetting(
-
-
-
-
-
-
- {{ field.title }}
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
+
+
+
+
+
添加一行
-
+
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
index cf71a83653..8f89070613 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/router-node-config.vue
@@ -230,13 +230,13 @@ defineExpose({ openDrawer }); // 暴露方法给父组件
v-for="(item, index) in routerGroups"
:key="index"
>
-
-
-
+
+
+
路由{{ index + 1 }}
- {{ node.label }}
-
+ />
diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
index 8dd21b4c95..f01543c3ea 100644
--- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
+++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue
@@ -241,7 +241,7 @@ function showConditionText(formSetting: FormTriggerSetting) {
);
}
-/** 添加修改字段设置�?*/
+/** 添加修改字段设置项 */
function addFormFieldSetting(formSetting: FormTriggerSetting) {
if (!formSetting) return;
if (!formSetting.updateFormFields) {
@@ -383,10 +383,10 @@ onMounted(() => {
});
-
+