# FMS 审批流程设置器二次重构实施文档 > 本文承接《FMS审批流程交互重构设计.md》,记录现有 FMS 流程设置器已经完成的部分,以及接下来应基于当前代码推进的第二阶段改造。目标交互参考 `D:\workspace\code\test\Workflow-Vue3`,尤其是纵向审批主线、递归条件分支、节点间添加按钮、右侧抽屉和错误定位。 > > **这是增量重构,不是从零重做。** 先保留已经建立的 FMS 领域草稿、审批规则、条件 AST、校验和 API 边界,再把目前只支持单链路的卡片编辑器扩展为完整的钉钉式流程树。树是编辑视图,FMS 的节点/连线仍是执行配置来源。 ## 1. 本阶段要解决的问题 目前已经具备可用的 FMS 流程领域模型和一版编辑器骨架,但用户体验仍是“线性步骤卡片 + 另一个 LogicFlow 画布”。二阶段的重点不是继续丰富画布,而是让审批、抄送和条件分支都能在同一棵纵向流程树里配置。 ### 1.1 本次交互决策 - **采用钉钉式流程树作为 FMS 审批设置的主交互,不把高级画布作为本次普通管理员的编辑入口。** 这项选择是本次重构的明确目标,不是待 AI 自行比较后再决定的选项。 - 借鉴的是审批配置的操作方式:纵向主线、节点间“+”、条件分支并列展开、分支内递归、属性抽屉、校验问题定位和缩放;不是逐像素仿钉钉,也不是复制 `Workflow-Vue3` 的实现。 - 视觉遵循 FMS 现有主题、控件和组件规范;领域数据仍用 FMS 的节点、连线、审批人规则和条件 AST。 - 这不等于永久禁止高级画布。只有当真实业务流程无法由已支持的流程树表达,且对应拓扑已有后端执行、校验和模拟语义,并通过无损读写验收后,才单独评估是否增加高级编辑器。不得为了“以后可能用到”而维持两个未完成的编辑模式。 完成后,管理员在一个连续页面内即可: 1. 看见开始、审批、抄送、条件分支和结束节点; 2. 在节点之间点“+”选择审批人、抄送人或条件分支; 3. 展开并编辑各条件分支,分支内允许继续添加节点或嵌套分支; 4. 在节点属性抽屉中配置审批人、审批方式和条件; 5. 从错误提示定位到具体节点/分支,校验并保存草稿。 本阶段不改变工作流表结构、实例运行语义、权限和审计规则;也不把参考项目的旧 JSON 结构写入数据库。 ## 2. 现状盘点:保留与改造 下表按当前 `fms-vue/src/views/system/workflow` 代码盘点。后续开发应在此基础上修改,避免重复实现已具备的能力。 | 当前文件/能力 | 当前状态 | 二阶段处理 | | --- | --- | --- | | `design.vue` | 已有新建向导入口、按流程编码加载草稿、离开未保存确认 | 保留;新建定义仍需服务端持久化接通后才能获得真实版本 ID | | `designer/domain.js` | 已有 schemaVersion 2、表行与领域草稿转换、条件 AST、摘要、单链路操作和图校验 | 保留既有转换;增加扁平 FMS 图与递归流程树的双向适配、分支结构操作和 round-trip 测试 | | `WorkflowDesigner.vue` | 已持有统一领域草稿、撤销/重做、节点/连线属性抽屉、选择器数据和版本/校验状态 | 保留草稿所有权、撤销栈、属性编辑和服务缺失提示;移除编辑器模式状态及画布同步逻辑 | | `WorkflowModeTabs.vue` | 当前包含“基本信息 / 流程步骤 / 高级画布 / 版本记录”四个页签 | 移除“流程步骤 / 高级画布”二选一;流程树作为唯一主编辑区。基本信息和版本记录改为顶部入口、抽屉或对话框,不挤占流程画布 | | `WorkflowStepEditor.vue` | 只识别单链路;遇到分支时提示切换画布;只调用线性插入、移动、复制和删除 | 改为递归流程树容器,不得再因条件分支拒绝编辑 | | `WorkflowStepCard.vue` | 已能显示审批/抄送摘要、标签、错误状态和节点操作 | 保留并按参考项目调整视觉层级;开始/结束作为固定节点,条件分支使用独立分支卡片 | | `WorkflowStepInsert.vue` | 目前直接显示“添加审批人”和“添加抄送”两个按钮 | 改为中心圆形“+”按钮,点击弹出“审批人 / 抄送人 / 条件分支”菜单 | | `WorkflowPropertyDrawer.vue` | 已有节点名称、审批人规则、审批方式、驳回策略、时限、行为和连线条件编辑 | 保留 FMS 字段和控件;根据节点类型展示内容;条件分支优先级、分支删除等放到分支卡片/分支属性区 | | `WorkflowActorSelector.vue` | 已有 FMS 审批人来源选择能力 | 保留;组织角色、岗位等主数据未接入时继续明确提示,不伪造候选项 | | `WorkflowConditionBuilder.vue` | 已有结构化 AST、字段/操作符/值控件;空条件可表达默认出口 | 保留作为单分支条件编辑器;补足用户可理解的“其他情况”默认分支体验,并处理嵌套条件编辑能力的限制提示 | | `WorkflowValidationPanel.vue` | 已能列出错误/警告并按节点定位 | 保留校验逻辑;改成流程画布上的错误计数入口 + 抽屉/弹窗列表,释放横向分支展示空间 | | `WorkflowCanvas.vue`、`WorkflowNodePanel.vue`、`nodes.js` | 已有 LogicFlow 画布和节点面板,`WorkflowDesigner` 当前会同步图与领域草稿 | 不作为本阶段的主编辑入口;移除页面入口及同步路径。确认无其他引用后再决定是否清理文件/依赖 | | `designer/api.js` | 已有表读取、字段和用户候选项查询,也定义了保存/校验/模拟/发布服务调用 | 保留当前“服务未接入则明确失败”的保护;不要把 404 当成功。新建、保存、校验、发布需与后端接口逐项验收 | | `tests/unit/workflow-domain.spec.js` | 已覆盖领域行转换、画布转换、线性操作和发布校验 | 保留原测试;追加流程树、分支、默认出口、分支汇合和不支持拓扑测试 | ### 2.1 现状中的两个实际缺口 - 当前 `WorkflowStepEditor.vue` 的分支保护会把用户导向高级画布;二阶段必须改成在同一个流程树里编辑条件分支。 - 新建向导的确认目前只创建内存中的 `WorkflowDraft`;若后端创建/保存服务尚不可用,界面必须保持“未保存/服务未接入”,不能显示真实保存成功。 ## 3. 参考项目如何用在 FMS ### 3.1 优先参考的源码 | 参考文件 | 需要借鉴的内容 | | --- | --- | | `D:\workspace\code\test\Workflow-Vue3\src\views\setting.vue` | 顶部流程标题/发布入口、中央流程设置区、缩放控制的页面组织 | | `D:\workspace\code\test\Workflow-Vue3\src\components\nodeWrap.vue` | 普通节点沿 `childNode` 递归;条件节点展开多个横向分支;支路内继续递归;分支排序和配置错误提示 | | `D:\workspace\code\test\Workflow-Vue3\src\components\addNode.vue` | 节点之间圆形“+”按钮和审批人/抄送人/条件分支弹出菜单 | | `D:\workspace\code\test\Workflow-Vue3\src\components\drawer\approverDrawer.vue` | 审批方式与审批人设置按需出现在右侧抽屉 | | `D:\workspace\code\test\Workflow-Vue3\src\components\drawer\copyerDrawer.vue` | 抄送人独立配置,不混入审批方式 | | `D:\workspace\code\test\Workflow-Vue3\src\components\drawer\conditionDrawer.vue` | 条件项编辑、优先级变更和业务字段选择 | | `D:\workspace\code\test\Workflow-Vue3\src\components\dialog\errorDialog.vue` | 发布/校验错误汇总,再定位到具体节点 | | `D:\workspace\code\test\Workflow-Vue3\src\css\workflow.css` | 纵向连线、条件横向框、节点悬浮边框、背景层和缩放布局的视觉参考 | 参考项目采用递归 UI JSON;FMS 不能原样照搬。FMS 页面可以构造临时的递归树投影,但最终变更必须回写当前 `WorkflowDraft.nodes / edges`,审批人仍进入 `actorRules`,条件仍使用 AST。 ### 3.2 样式借鉴边界 借鉴形态和空间关系,不复制实现: - 用 FMS 自己的 `