20260923165454
This commit is contained in:
1 parent
0abe3706c8
commit
e6935b8fa4
173 files changed
+14975
-2295
No files matched your search
@@ -44,6 +44,54 @@
|
||||
- 模块元数据不由接口下发,前端读本地 schema JSON,改元数据无需重启后端。
|
||||
- `DbUtils` 是 SQL 唯一出口:标识符加 `[]`,`validateReadOnlySql()` 只允许查询。
|
||||
|
||||
## 工作流流程设置器(fms-vue/src/views/system/workflow)
|
||||
|
||||
- **代码现状 = 原始版本(2026-09-23 曾被重构,应用户要求已全部回滚)**:
|
||||
草稿是 `schemaVersion: 1`(`{definitionId, name, nodes, edges}`),编辑器是
|
||||
`WorkflowDesigner` + `WorkflowCanvas`(LogicFlow) + `WorkflowPropertyPanel` 三件套,
|
||||
节点坐标挂在 `node.x/y`,条件存单个叶子 `{field, operator, value}`,
|
||||
写入通道未实现(工具栏只有撤销/缩放/查看草稿 JSON)。
|
||||
**不要以为仓库里已经有卡片模式/流程树/条件构造器 —— 那些都被回滚了。**
|
||||
回滚前的完整实现留在 `D:\workspace\code\fms-workflow-refactor-backup-20260923\`(仓库外,含 `http.js` 的 get/put、
|
||||
`tests/unit/workflow-domain.spec.js`、改过 AST 形状的 mock SQL),需要时可取回。
|
||||
- **文档是目标,不是现状**:`FMS审批流程设置器交互设计.md`(旧名 `FMS审批流程交互重构设计.md`,
|
||||
已整体重写为 258 行)要求把设计器改成钉钉式递归流程树,并**明确作废**"线性卡片 + LogicFlow 高级模式"
|
||||
双编辑器方案(§3.2 不再用画布兜底,并行/服务节点等拓扑只读保护);
|
||||
`FMS审批流程设置器二次重构实施文档.md` 给出增量执行顺序(§1.1 的交互决策已锁定,不必再问);
|
||||
`FMS工作流与审批设计.md` 管表结构与运行语义(其 §19 的画布选型是旧方案)。
|
||||
参考交互项目:`D:\workspace\code\test\Workflow-Vue3`(只借交互,不复制代码/Element UI/私有字体)。
|
||||
- **这些文件未进 git**:`design.vue`、`designer/`(除 `index.vue` 外全部)、`sql/fms_workflow_mock.sql`
|
||||
都是未跟踪文件 —— 改它们之前先备份,`git restore` 救不回来(本地历史里也没有)。
|
||||
- **`workflow/index.vue` 要小心**:它虽然被 git 跟踪,但**工作区版本比 HEAD 新**(新增按钮、表格「设计」行操作
|
||||
都是未提交改动)。直接 `git restore` 会退回 HEAD 的 18 行空壳,把按钮冲掉 —— 要恢复就用带按钮的 76 行版本。
|
||||
- 表结构已建好:`sql/fms_workflow.sql`(13 张表)、`fms_workflow_module.sql`(视图 + s_module 注册)、
|
||||
`fms_workflow_menu.sql`(菜单 `workflow` / `approval*`)、`fms_workflow_mock.sql`(`expense_approval` 样本,
|
||||
覆盖 7 种节点类型 / 6 种审批方式 / 5 种审批人解析)。
|
||||
- **后端 `fms-api/src/main` 目前零工作流代码**:保存/校验/模拟/发布都要走流程服务,接口 404 时必须
|
||||
明确提示"服务未接入",绝不伪造成功。
|
||||
- 若将来重新做树形重构,踩过的坑:① `b_priority` 是**同一来源节点内**的判断顺序,不是全表序号;
|
||||
② 校验只约束**出边**,入边不能锁成 1(分支汇合点天生多条入线);③ 环要单独拦,否则递归不终止;
|
||||
④ 默认出口(`condition: null`)必须唯一且固定最后。
|
||||
|
||||
### 画布「一键整理」(dagre 自动布局,2026-09-23 已落地)
|
||||
|
||||
- 依赖 **`@logicflow/layout@2.1.5`**(peer 正好是 `@logicflow/core ^2.2.5`)。注意 dagre **不在**
|
||||
`@logicflow/extension` 里(那只有一个标注"未完善"的 AutoLayout)。
|
||||
- 必须**深路径导入** `import { Dagre } from '@logicflow/layout/es/dagre'`:包入口同时导出 `elkLayout`,
|
||||
从入口引会把 elkjs 打进产物(实测走深路径只 +92 kB,走入口会 +1MB 以上)。包没有 `exports` 字段,深路径可用。
|
||||
- 注册方式:`new LogicFlow({ plugins: [Dagre] })`,调用 `lf.extension.dagre.layout({...})`。
|
||||
插件实例由 `installPlugin` 的"非静态插件"分支创建(`Dagre` 只有 `static pluginName` + `render`,没有 `install`)。
|
||||
- **坑**:插件靠 `ToolOverlay` 的 `componentDidMount` → `triggerToolRender` 调用 `render(lf)` 才拿到
|
||||
`this.lf`;拿不到时 `layout()` 会**直接抛错**(它的 try/catch 只包住 applyDagreLayout)。
|
||||
所以 `autoLayout()` 里先兜底 `if (!dagre.lf) dagre.lf = lf`,并用 try/catch + 「坐标是否变化」判断结果
|
||||
—— 插件失败时只打 console.error,不能假定成功。
|
||||
- 布局走 `lf.renderRawData()` 整图重渲染:**会丢选中态**,但节点/连线 **id 保留**(`processEdges` 只改路径字段),
|
||||
所以上层按 nodeKey/edgeKey 回填审批人与条件仍然成立。坐标变化由实例的 `history` 自动记录(deepObserve + debounce)。
|
||||
- 布局后**必须 `snapshot()`** 把新坐标 emit 给上层,否则草稿里的 x/y 还是旧的。
|
||||
- 参数:`rankdir: 'TB'`(审批流程纵向)、`align: 'UL'`、`nodesep: 60`、`ranksep: 80`、`isDefaultAnchor: true`(重算连线路径)。
|
||||
- 测试:`tests/unit/workflow-canvas-layout.spec.js`(jsdom 挂载画布真跑一次布局;需给 `SVGElement.prototype.getBBox` 打桩,
|
||||
否则 LogicFlow 的 autoWrap 文本测量会挂)。
|
||||
|
||||
## 环境坑(本机特有)
|
||||
|
||||
- **编译/测试 fms-api 唯一可行命令**(start.cmd 里的 JDK/Maven 路径都是坏的):
|
||||
|
||||
Reference in new issue
Block a user