status: propose created: 2026-05-05 complexity: 🟡中等
为什么做:
n-collapse 折叠面板,依赖 @blur 失焦自动保存,用户体验不佳,配置可能丢失NodePropertiesPanel.vue 中(第705-742行),无法动态管理FlowModeler.vue 第153行)无高度限制,内容溢出,缺少下载和语法高亮功能做完后的效果:
前端核心文件:
| 文件 | 功能 | 代码位置 |
|------|------|----------|
| forge-admin-ui/src/components/bpmn/NodePropertiesPanel.vue | 节点配置面板 | 第40-60行(n-collapse折叠面板),第705-742行(SPEL模板硬编码) |
| forge-admin-ui/src/components/bpmn/FlowModeler.vue | BPMN画布组件 | 第153行(XML预览弹窗 n-modal),第518-527行(handlePreview函数) |
| forge-admin-ui/src/views/flow/design.vue | 流程设计页面 | 第141-157行(右侧停靠属性面板),第436-480行(handleSaveDraft保存逻辑) |
后端核心文件:
| 文件 | 功能 |
|------|------|
| forge-plugin-flow/src/main/java/.../controller/FlowNodeConfigController.java | 节点配置API |
| forge-plugin-flow/src/main/java/.../entity/FlowNodeConfig.java | 节点配置实体 |
| forge-plugin-flow/src/main/java/.../entity/FlowConditionRule.java | 条件规则实体(含conditionExpression字段) |
数据库表:
| 表名 | 说明 |
|------|------|
| sys_flow_node_config | 审批节点配置表(flow_tables_v2.sql 第189-225行) |
| sys_flow_condition_rule | 条件规则表(flow_tables_v2.sql 第244-264行) |
节点配置保存逻辑:
NodePropertiesPanel.vue 使用 @blur="updateProperty('xxx')" 触发保存updateProperty 函数调用 modeling.updateProperties 更新 BPMN 元素emit('update') 通知父组件 design.vue,触发 handleBpmnChangeSPEL模板现状:
// NodePropertiesPanel.vue 第705-742行
const spelTemplates = [
{ label: '根据部门查找负责人', value: '${flowSpelService.findDeptManager(...)}', ... },
{ label: '根据角色查找用户', value: '${flowSpelService.findUsersByRole(...)}', ... },
// ... 共7个硬编码模板
]
XML预览现状:
<!-- FlowModeler.vue 第153行 -->
<n-modal v-model:show="showPreviewModal" preset="card" title="BPMN XML 预览" style="width: 800px">
<n-code :code="previewXml" language="xml" :show-line-numbers="true" />
</n-modal>
max-height 限制,XML 内容过长时溢出| 问题 | 风险等级 | 说明 |
|---|---|---|
| 失焦保存不稳定 | 🔴高 | 用户点击其他区域或切换Tab时可能未触发 @blur,配置丢失 |
| SPEL模板硬编码 | 🟡中 | 无法动态添加模板,不同项目无法定制 |
| XML预览溢出 | 🟡中 | 长流程XML导致弹窗撑满屏幕,影响用户体验 |
| 无保存状态提示 | 🟡中 | 用户不知道配置是否已生效 |
[ ] 功能1:节点配置Tab分隔 + 手动保存按钮
n-tabs 分隔配置项,底部添加"保存配置"按钮[ ] 功能2:SPEL表达式模板独立管理
sys_flow_spel_template 表,节点配置时从 API 加载[ ] 功能3:XML预览样式优化
.bpmn 文件| Tab名称 | 显示条件 | 包含配置项 |
|---|---|---|
| 基础属性 | 所有节点 | 节点ID、名称、描述 |
| 审批设置 | bpmn:UserTask |
审批人类型、表单配置、优先级、截止日期 |
| 会签配置 | bpmn:UserTask |
多实例类型、完成条件、通过比例 |
| 监听器 | bpmn:UserTask/bpmn:ServiceTask/Start/End |
任务监听器、执行监听器 |
| 分类 | 说明 |
|---|---|
general |
通用模板(发起人、上级等) |
dept |
部门相关(部门负责人、部门成员等) |
role |
角色相关(按角色查找用户) |
region |
行政区划相关(区域负责人) |
custom |
用户自定义模板 |
| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 新增 | sys_flow_spel_template |
全表 | SPEL表达式模板管理表 |
新增表SQL:
CREATE TABLE `sys_flow_spel_template` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`tenant_id` bigint NOT NULL DEFAULT '1' COMMENT '租户编号',
`template_name` varchar(100) NOT NULL COMMENT '模板名称',
`template_code` varchar(50) NOT NULL COMMENT '模板编码',
`expression` varchar(500) NOT NULL COMMENT 'SPEL表达式',
`description` varchar(200) DEFAULT NULL COMMENT '描述说明',
`category` varchar(50) DEFAULT 'general' COMMENT '分类',
`example_params` varchar(500) DEFAULT NULL COMMENT '示例参数JSON',
`status` int NOT NULL DEFAULT '1' COMMENT '状态:0禁用,1启用',
`sort` int DEFAULT '100' COMMENT '排序',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`create_by` bigint DEFAULT NULL,
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`update_by` bigint DEFAULT NULL,
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`deleted` int DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_template_code` (`tenant_id`, `template_code`),
KEY `idx_tenant_id` (`tenant_id`),
KEY `idx_category` (`category`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='流程SPEL表达式模板';
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 新增 | /api/flow/spelTemplate/page |
GET | 分页查询SPEL模板 |
| 新增 | /api/flow/spelTemplate/list |
GET | 启用状态模板列表(节点配置下拉) |
| 新增 | /api/flow/spelTemplate/{id} |
GET | 模板详情 |
| 新增 | /api/flow/spelTemplate |
POST | 新增模板 |
| 新增 | /api/flow/spelTemplate |
PUT | 修改模板 |
| 新增 | /api/flow/spelTemplate/{id} |
DELETE | 删除模板 |
| 影域 | 文件/模块 | 影响说明 |
|---|---|---|
| 前端组件 | NodePropertiesPanel.vue |
重构为Tab布局 + 手动保存 |
| 前端组件 | FlowModeler.vue |
XML预览弹窗样式优化 |
| 前端页面 | 新增 spelTemplate.vue |
SPEL模板管理页面 |
| 后端模块 | forge-plugin-flow |
新增Entity/Mapper/Service/Controller |
| 数据库 | 新增表 | sys_flow_spel_template |
| 菜单 | 新增菜单 | SPEL模板管理(置于流程配置下) |
| 风险 | 级别 | 应对措施 |
|---|---|---|
| Tab切换时配置丢失 | 🟡中 | 添加"未保存"提示,切换Tab时提醒保存 |
| SPEL模板迁移 | 🟡中 | 保留原有硬编码模板作为默认数据,新模板可通过API添加 |
| XML预览性能 | 🟢低 | 大文件时可能渲染慢,建议限制显示长度或使用虚拟滚动 |
| 决策点 | 选择 | 原因 |
|---|---|---|
| Tab组件 | n-tabs |
Naive UI原生组件,样式统一 |
| 手动保存按钮位置 | 面板底部固定 | 醒目,不遮挡配置项 |
| SPEL模板表设计 | 不绑定model_id | 用户确认全局通用,便于复用 |
| XML代码高亮 | n-code + word-wrap |
已有组件,添加换行样式即可 |
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| 创建Spec | 完成 | spec.md | 本文件 |
(待审查后填写)