status: done created: 2026-06-06 complexity: 🔴复杂 related:
code-copilot/changes/archive/flow-management-dynamic-form-ux/spec.md,code-copilot/changes/lowcode-app-full-loop-optimization/spec.md
当前流程管理已经具备流程模型、BPMN 设计器、流程表单、节点动态表单、待办/已办、流程实例和消息中心能力,但仍缺少“业务人员配置一个全局动态表单,并把它作为流程入口运行”的完整闭环。
本次目标是把流程管理从“流程图 + 节点配置”升级为“流程应用入口 + 表单填报 + 流程流转 + 实例详情 + 可选业务落表”的运行平台:
forge/forge-flow/forge-flow-server/src/main/java/com/mdframe/forge/flow/controller/FlowFormController.java:35 的表单分页接口已存在,但参数使用 page,不符合项目约定的 pageNum。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/entity/FlowForm.java:24 至 61 已有 formKey/formName/formType/formSchema/formUrl/version/status,但没有字段注册表、业务对象映射、发布版本快照和表单实例数据。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowFormServiceImpl.java:27 至 48 使用 LambdaQueryWrapper 做表单查询,后续改造必须下沉到 Mapper XML。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/entity/FlowModel.java:47 至 59 已有 formType/formId/formJson,可表达模型级表单。forge-admin-ui/src/views/flow/design.vue:86 至 113 可在流程设计页选择或设计动态表单。forge-admin-ui/src/views/flow/design.vue:1671 至 1734 保存草稿和发布部署仍绑定独立设计页面,模型列表进入设计时不是弹窗式工作区。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowTaskServiceImpl.java:1223 至 1356 会按节点表单优先、模型表单兜底解析 TaskFormInfo,并返回流程变量。forge-admin-ui/src/views/flow/todo.vue:189 至 240 已支持外置表单和动态表单渲染。forge-admin-ui/src/views/flow/todo.vue:599 至 608 打开待办时用流程变量初始化表单数据。forge-admin-ui/src/views/flow/todo.vue:717 至 759 审批通过时收集动态表单变量并提交,但没有保存不可变表单实例快照,也没有回写业务表。forge-admin-ui/src/components/bpmn/NodePropertiesPanel.vue:328 至 408 用户任务节点支持引用表单、在线设计节点表单和高级 JSON。forge-admin-ui/src/components/bpmn/NodePropertiesPanel.vue:1715 至 1749 会把表单配置保存为 flowable:formKey/formJson/formUrl。forge/db/migration/V1.0.47__add_business_document_flow_closure.sql:3 至 55 已创建 ai_business_document_config 和 ai_business_flow_instance_link,用于业务单据配置和业务记录到流程实例的关联。forge/forge-framework/forge-plugin-parent/forge-plugin-generator/src/main/java/com/mdframe/forge/plugin/generator/service/businessapp/BusinessFlowService.java:91 至 137 已能从业务对象记录发起流程,业务键格式为 objectCode:recordId。forge-admin-ui/src/views/app-center/components/designer/BusinessFlowBindingPanel.vue:33 至 80 已提供业务对象默认流程和变量映射配置。forge-admin-ui/src/views/app-center/components/designer/FlowVariableMappingEditor.vue:16 至 33 已有“单据字段 -> 流程变量”的映射编辑 UI,可复用到表单字段映射。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/listener/FlowTaskEventListener.java:199 至 220 创建 sys_flow_task 后只发布 TASK_CREATED 事件。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/listener/FlowTaskEventListener.java:665 至 689 事件通知依赖流程模型的 notifyType=redis/webhook。forge/forge-framework/forge-plugin-parent/forge-plugin-flow/src/main/java/com/mdframe/forge/starter/flow/service/impl/FlowTaskServiceImpl.java:1046 至 1090 只有“催办”会主动调用 MessageService.send 发送站内信。forge/forge-framework/forge-plugin-parent/forge-plugin-message/src/main/java/com/mdframe/forge/plugin/message/service/impl/MessageServiceImpl.java:77 至 94 已支持创建消息、接收人和发送记录,WEB 渠道可作为站内信复用。forge/forge-flow/forge-flow-server/src/main/java/com/mdframe/forge/flow/controller/FlowInstanceController.java:175 至 198 的流程实例分页使用 LambdaQueryWrapper,如本次扩展查询条件,应迁移到 Mapper XML。forge/forge-flow/forge-flow-server/src/main/java/com/mdframe/forge/flow/controller/FlowTaskController.java:39 至 49 待办分页已使用 pageNum/pageSize,应作为本次新增接口的命名参考。全局可复用的动态表单资产。表单字段的 field 是流程变量、条件表达式、审批人表达式、消息模板和业务字段映射的统一变量名。
流程实例必须绑定提交时的表单版本和 Schema 快照。后续表单被修改,不影响历史实例详情展示和审计。
面向业务用户的填报入口由业务承载方提供:低代码应用入口、业务对象详情/列表操作,或后续专门的“流程发起中心”。流程模型页只维护流程定义、模型级表单和流程设计配置,不直接承担“入口显示在哪里”的应用导航配置,避免与低代码应用入口重复。
PROCESS_ONLY:不落实际业务表,只保存流程变量和表单实例快照,用于请假申请等轻量流程。说明:这里“不落库”指不落业务表;为了详情展示、流程变量和审计,平台仍会保存流程运行数据和表单快照。BUSINESS_OBJECT:提交时通过低代码动态 CRUD 创建或更新业务记录,并用 objectCode:recordId 发起流程。HYBRID:既保存流程表单实例快照,也映射到业务对象记录,适合需要审计原始填报内容且要参与业务统计的场景。这是“流程入口 + 业务对象落表 + 组织负责人提交”的业务场景示例,不作为流程管理的独立内置菜单。平台底层可以保留批次、组织负责人、明细状态等编排能力,但具体入口应由业务对象/业务应用承载。
pageNum/pageSize,查询 SQL 写入 Mapper XML。${leaveDays}、${deptName}。BUSINESS_OBJECT/HYBRID 的入口和可见范围优先复用低代码应用/业务对象配置,避免重复维护应用导航。PROCESS_ONLY 后续需要独立设计轻量流程发起中心或应用挂载协议,再开放给业务用户发起。sys_flow_form_instance,保存表单版本、Schema 快照、表单数据、发起人、发起组织、流程模型 Key、业务键。businessKey 默认格式为 FLOW_FORM:{entryCode}:{instanceId}。process_instance_id 和状态。processInstanceId 查询表单实例快照并只读展示。objectCode/configKey,不允许业务用户直接输入物理表名。formField/flowVariable 思路,新增 formField/businessField 映射。DynamicCrudService 创建或更新实际业务记录。objectCode:recordId 发起流程,复用 BusinessFlowService 和 ai_business_flow_instance_link。sys_flow_form_instance 快照,快照中记录 objectCode/recordId。sys_org 负责人字段。tenant_id + batch_id + org_id。TASK_CREATED 生成 sys_flow_task 成功后,同步发送站内信。assignee 时发送给指定处理人。assignee 但有候选用户时发送给候选用户。bizType=FLOW_TODO,bizKey=taskId,跳转地址为 /flow/todo?taskId=:taskId。taskId 的待办消息必须幂等,避免流程重试或事件重复导致多条消息。field 一旦被已发布流程、入口或业务映射引用,不允许直接删除;必须先解除引用或发布新版本。PROCESS_ONLY 的表单快照永久保留,并跟随流程实例归档策略归档,不单独设置保留期限。PROCESS_ONLY 不创建业务表记录,但必须能查看表单详情和流转记录。BUSINESS_OBJECT 模式必须先保存业务记录,拿到 recordId 后才能发起流程。/apply 前需要人工确认。tenant_id=1。pageNum/pageSize。:id。暂定新增 Flyway:forge/db/migration/V1.0.57__add_flow_form_runtime_entry.sql。若进入 /apply 时仓库已有更高版本,需顺延版本号。
| 操作 | 表名 | 字段/索引 | 说明 |
|---|---|---|---|
| 扩展 | sys_flow_form |
form_category, field_registry, default_data_mode, publish_status, current_version_id |
表单分类、字段目录、默认数据模式和发布状态 |
| 新增 | sys_flow_form_version |
form_id, form_key, version, form_schema, field_registry, form_config, publish_time |
不可变表单版本 |
| 新增 | sys_flow_entry |
entry_code, entry_name, model_key, form_key, form_version_id, data_mode, object_code, config_key, visible_scope, title_template, business_key_template, status |
流程应用入口 |
| 新增 | sys_flow_entry_field_mapping |
entry_id, form_field, target_type, target_field, flow_variable, required |
表单字段到流程变量/业务字段映射 |
| 新增 | sys_flow_form_instance |
entry_code, business_key, process_instance_id, model_key, form_key, form_version, schema_snapshot, form_data, data_mode, object_code, record_id, status |
每次填报实例快照 |
| 新增 | sys_flow_fill_batch |
entry_code, batch_name, period_key, target_scope, owner_rule, deadline_time, status |
组织批量填报批次 |
| 新增 | sys_flow_fill_batch_item |
batch_id, org_id, owner_user_id, form_instance_id, object_code, record_id, process_instance_id, submit_status, flow_status, deadline_time |
组织填报明细 |
| 新增/调整 | sys_resource |
流程入口、表单版本、批量填报、入口提交和实例查看权限 | 菜单和按钮权限,必须 NOT EXISTS |
| 新增 | sys_dict_type/sys_dict_data |
sys_flow_data_mode, sys_flow_entry_status, sys_flow_fill_status |
数据模式、入口状态、填报状态字典 |
所有新增业务表必须包含 id, tenant_id, create_by, create_time, create_dept, update_by, update_time,字符集 utf8mb4,引擎 InnoDB。
| 操作 | 接口 | 方法 | 变更内容 |
|---|---|---|---|
| 修改 | /api/flow/form/page |
GET | 参数改为 pageNum/pageSize,兼容旧 page 一版 |
| 新增 | /api/flow/form/{id}/publish |
POST | 发布表单版本 |
| 新增 | /api/flow/form/{id}/versions |
GET | 查询表单版本 |
| 新增 | /api/flow/form/field-catalog |
GET | 根据 formKey/versionId/modelKey 返回字段变量目录 |
| 新增 | /api/flow/entry/page |
GET | 流程入口分页 |
| 新增 | /api/flow/entry |
POST/PUT | 新增和修改流程入口 |
| 新增 | /api/flow/entry/:id |
GET/DELETE | 入口详情和删除 |
| 新增 | /api/flow/runtime/entry/:entryCode |
GET | 获取入口运行配置和表单 Schema |
| 新增 | /api/flow/runtime/submit/:entryCode |
POST | 提交流程入口表单并发起流程 |
| 新增 | /api/flow/runtime/instance/:processInstanceId |
GET | 查询表单实例快照和流程详情 |
| 修改 | /api/flow/task/form/:taskId |
GET | 增加 formInstanceId/schemaSnapshot/formData/dataMode/objectCode/recordId |
| 新增 | /api/flow/fill-batch/page |
GET | 组织填报批次分页 |
| 新增 | /api/flow/fill-batch |
POST/PUT | 创建和修改填报批次 |
| 新增 | /api/flow/fill-batch/:id/items |
GET | 查询批次组织明细 |
| 新增 | /api/flow/fill-batch/:id/publish |
POST | 发布批次并生成组织填报项 |
| 新增 | /api/flow/fill-batch/item/:itemId/submit |
POST | 按批次明细提交表单 |
| 影响域 | 文件/模块 | 说明 |
|---|---|---|
| 后端 Flow 服务 | forge-flow/forge-flow-server |
新增入口、运行态、批量填报接口;扩展任务表单接口 |
| Flow 插件 | forge-plugin-flow |
新增实体、Mapper、Service,补任务创建站内信 |
| 消息插件 | forge-plugin-message |
复用 MessageService.send,可能新增幂等查询方法 |
| 低代码生成器插件 | forge-plugin-generator |
复用业务对象落表、业务流程绑定和流程实例关联 |
| 前端流程管理 | forge-admin-ui/src/views/flow |
表单、模型、待办、已办、我发起、入口、批量填报页面 |
| BPMN 组件 | forge-admin-ui/src/components/bpmn |
字段变量目录、审批人配置、条件配置、全屏弹窗设计器 |
| form-create 组件 | forge-admin-ui/src/components/form-create |
支持字段目录提取、版本预览和只读快照渲染 |
| 数据库 | forge/db/migration |
新增表、字典、菜单和权限 |
| 风险 | 级别 | 应对措施 |
|---|---|---|
| 历史表单版本不一致导致已办详情错乱 | 🔴高 | 实例保存 Schema 快照,只读展示使用快照 |
| PROCESS_ONLY 被误解为完全不保存数据 | 🟡中 | 产品文案说明“不落业务表”,流程审计数据必须保存 |
| 业务落表绕过权限或字段校验 | 🔴高 | 只允许绑定已发布业务对象和动态 CRUD 配置,不开放物理表名 |
| 批量组织填报重复提交 | 🟡中 | 批次 + 组织唯一约束,提交接口加幂等锁 |
| 待办消息重复发送 | 🟡中 | bizType + bizKey 幂等检查 |
| 任务候选组无法解析用户 | 🟡中 | 记录告警,不阻断流程,管理员可催办或补充候选人 |
| 流程设计器弹窗空间和路由兼容 | 🟡中 | 保留原路由兼容直达,主路径改弹窗 |
| 状态流转和权限变更 | 🔴高 | /apply 前人工确认,接口补权限注解和操作日志 |
/test 前需创建 test-spec.md,并按 code-copilot/rules/automated-testing-standard.md 增量记录 execution-log.md。sys_org 负责人字段,还是通过角色解析“部门负责人”。结论:默认复用 sys_org 负责人字段。| 决策点 | 选择 | 原因 |
|---|---|---|
| 表单设计器 | 继续复用 form-create,并共享低代码业务组件注册 | 已集成并在流程表单/节点表单中使用 |
| 实际落表路径 | 绑定业务对象 + DynamicCrudService | 避免用户直接操作物理表,复用权限和字段校验 |
| 轻量流程数据 | sys_flow_form_instance + Flowable variables |
不生成业务表记录,但保留详情和审计 |
| 表单字段变量名 | form-create field |
已作为设计器字段 ID,可自然映射流程变量 |
| 流程入口边界 | 流程模型不直接配置应用入口 | 入口展示位置应由低代码应用、业务对象或后续流程发起中心承载,避免和应用入口配置重复 |
| 批量填报 | 批次表 + 明细表作为底层扩展能力 | 支持业务应用实现每组织状态跟踪、逾期和重新提交,不注册流程管理独立菜单 |
| 待办通知 | 任务创建后直接发送 WEB 站内信 | 满足“生成待办即推送”,不依赖外部事件订阅 |
| UI 设计器 | 模型列表内全屏弹窗为主、路由兼容,并适配移动端窄屏 | 满足更大设计空间,同时保留直达能力 |
| Task | 状态 | 实际改动文件 | 备注 |
|---|---|---|---|
| 创建 Spec | 完成 | code-copilot/changes/flow-management-form-runtime-optimization/spec.md |
本文件 |
| 创建 Tasks | 完成 | code-copilot/changes/flow-management-form-runtime-optimization/tasks.md |
配套任务拆分 |
| Task 1-4 | 完成 | V1.0.57__add_flow_form_runtime_entry.sql、Flow 表单/入口/运行态实体、Mapper、Service、Controller |
已覆盖表单版本、字段目录、流程入口、PROCESS_ONLY 表单实例快照和入口提交 |
| Task 5 | 完成 | FlowBusinessObjectRuntimeAdapter、FlowBusinessObjectRuntimeAdapterImpl、FlowRuntimeServiceImpl、forge-flow-server/pom.xml |
BUSINESS_OBJECT/HYBRID 已接入 DynamicCrudService 实际落表,并在流程启动后写入业务流程实例关联 |
| Task 6 | 完成 | NodePropertiesPanel.vue、design.vue、flow.js |
模型绑定表单字段目录已透传到 BPMN 节点属性面板;审批人、候选用户、候选组和流转条件可选择表单字段/系统变量 |
| Task 7 | 调整完成 | FlowFillBatch* 后端、FlowRuntimeServiceImpl、flow.js |
批次发布能力保留为业务场景扩展;前端不再暴露流程管理独立“组织填报批次”页面 |
| Task 8 | 完成 | FlowTaskEventListener、MessageService、SysMessageMapper.xml |
待办创建后同步发送 FLOW_TODO 站内信,并按 bizType + bizKey 做幂等查询 |
| Task 9 | 调整完成 | model.vue、router/index.js |
撤掉模型页“入口配置”和隐藏入口运行路由;入口展示位置改由低代码应用、业务对象或后续流程发起中心承载 |
| Task 9.5 | 完成 | model.vue |
模型页为已部署模型保留“发起测试”,使用 FLOW_MODEL_TEST 和 FLOW_TEST: 业务键前缀,避免与正式入口配置混淆 |
| Task 10 | 完成 | model.vue、design.vue、todo.vue、done.vue、started.vue、cc.vue |
模型列表设计入口改为全屏弹窗;设计器顶部配置常驻展示;待办/已办/我发起/抄送详情全部改为弹窗并补移动端全屏适配 |
| Task 10.5 | 完成 | FlowFormCreateDesigner.vue、FlowFormCreateRenderer.vue、formCreateBridge.js、forgeBusinessComponents.js |
流程表单设计器复用低代码业务组件注册,运行渲染时加载字典、组织、人员等选项;字段默认下方间距为 20px,并在表单配置中统一调整 |
| Task 11 | 完成 | test-spec.md、execution-log.md |
已记录后端编译、前端构建和空白检查结果 |
待 /review flow-management-form-runtime-optimization 后填写。
sys_org 负责人字段。