--- name: fms-vue表单保存流程规范重构 overview: 按根目录《开发规范.md》的「详细表单页面设计」与「表单数据与变更检测」章节,将 fms-vue 三处详细表单保存主流程(module-management/index.vue、menu-management/index.vue、FmsModuleEditModal.vue)统一重构为 handleSave/beforeSave/buildSaveData/afterSave 五段式结构,补齐 origin 基线 + diff 保存 + 成功后重载;ModuleI18nPanel 退化为受控数据展示组件,i18n diff 上移到 index.vue 统一编排;并同步 i18n-type 等调用方与相关测试。 todos: - id: refactor-edit-modal content: 重构 FmsModuleEditModal:新增 origin 快照与编辑态 diff、拆分 handleSave/beforeSave/buildSaveData/afterSave、prop beforeSave 更名 onBeforeSave,无变化时不调保存接口;同步 i18n-type/index.vue 的 prop 绑定 status: completed - id: refactor-menu-save content: 用 [skill:lsp-code-analysis] 定位引用后,将 menu-management/index.vue 的 saveMenu 重构为内联五段式并补 s_menu/s_i18n diff 与无变化跳过,同步模板/hotkey/onSwitchSave status: completed - id: refactor-module-save-i18n content: 将 module-management/index.vue 的 saveModule 重构为内联五段式,并用 [subagent:code-explorer] 复核后把 i18n 基线/diff 统一上移、ModuleI18nPanel 改为受控展示组件、迁移 applySyncPlan 联动 status: completed - id: sync-tests-quality content: 删除引用缺失 composable 的 module-save-orchestration.spec.js 并清理残留引用,核对 module-dirty-sections.spec.js,运行 oxlint/oxfmt 与受影响单测 status: completed dependencies: - refactor-edit-modal - refactor-menu-save - refactor-module-save-i18n --- ## 用户需求 将 fms-vue 中「详细表单页面」的代码结构与命名统一重构,使其完全符合根目录 `开发规范.md` 中「详细表单页面设计」(52-62 行)与「表单数据与变更检测」(64-108 行)两条规范,消除"相似但不一致"的实现差异。 ## 重构范围(用户已确认) - 仅三处表单主流程:`module-management/index.vue`、`menu-management/index.vue`、`FmsModuleEditModal.vue`,及调用方 `i18n-type/index.vue` 的同步。 - 列表/内联保存保留专用名,**不改**:`saveToggle`、`saveChanges`、`deleteSelected`、`persistRowOrder`、`saveColumnSettings`、菜单/模块树的拖拽即时保存与启用切换。 - module-management 保存编排**保持内联在 index.vue**(不新建 composable)。 - ModuleI18nPanel **一并纳入统一**:i18n 的 origin/当前数据与 diff 由 index.vue 统一持有与计算,面板退化为受控数据展示组件。 - `beforeSave` 名称冲突处理:`FmsModuleEditModal` 的外部 prop `beforeSave` 改名(建议 `onBeforeSave`,模板 `:on-before-save`),组件内部标准方法使用规范名 `beforeSave()`。 ## 目标统一形态 每个入口遵循固定流程与命名:`handleSave()`(入口)→ `beforeSave()`(校验/字段同步/数据准备,false 终止)→ `buildSaveData()`(组装请求,返回 null 表示无变化不调接口)→ `saveObjectApi()` → `afterSave()`(成功后的 reload/状态更新)。编辑态必须有 `origin` 基线、只提交 diff 出的变化、无变化时不调用保存接口、成功后重新从服务端加载再更新基线。 ## 技术栈 Vue 3 `