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] =?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 c895a34ee..375b45830 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 000000000..79896c35e
--- /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 000000000..0c82d5b14
--- /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 000000000..4f756afc3
--- /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 000000000..3a75ed61d
--- /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 000000000..739229387
--- /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 000000000..534001d77
--- /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 000000000..18a2b65e2
--- /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 000000000..ab9ca3753
--- /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 000000000..145dc894b
--- /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();
+ },
+ });
+}