2026-08-08-merge-approver-setting-design.md 4.4 KB

报价、合同审批人设置合并至系统管理

日期: 2026-08-08
状态: 设计已确认(方案 A)
选定方案: A — 单页上下分区、各自保存;菜单迁入「系统管理」;软隐藏 CRM 旧菜单
相关页面: 新 /#/system/approver-setting;旧 CRM 路由侧栏不可见

1. 目标

  1. 【CRM管理】下不再展示【报价单审批人设置】、【合同审批人设置】。
  2. 【系统管理】下新增菜单【报价、合同审批人设置】,进入后同一页:
    • 上方:报价单审批人设置(默认审批人 + 状态 + 重置/保存)
    • 下方:合同审批人设置(同上)
  3. 分区各自保存,改哪块存哪块;行为与现网两页一致。
  4. 提供幂等 SQL 迁移:插入新菜单、软隐藏旧菜单、将曾拥有任一旧菜单的角色挂上新菜单。

2. 非目标

  • 不合并后端数据表或统一为一个 save API。
  • 不改报价/合同「提交审批」预填逻辑。
  • 不物理删除旧 sys_menu、不强制清理旧 sys_role_menu。
  • 不抽公共组件(YAGNI;两区块可内联在同一页面)。

3. 已确认决策

项 结论
保存方式 分区各自「重置 / 保存」
菜单位置 「系统管理」下
菜单名称 报价、合同审批人设置
旧菜单 visible='0' 软隐藏;前端路由 isHide: true
实现路径 方案 A — 新页面拼装两套现有表单逻辑

4. 架构

web-admin/src/views/system/approver-setting/index.vue   # 新建:上下两 panel
web-admin/src/router/modules/sqxp.ts                   # 系统管理子路由 + 旧 CRM 路由隐藏
docs/sql/migrations/2026-08-08-merge-approver-setting-menu.sql
docs/web-admin-ui-pattern-index.md                     # 对照行更新(可选)

backend/app/api/crm_quote_routes.py                    # save 权限改为 system:approverSetting
backend/app/api/crm_contract_routes.py                 # 同上

4.1 页面约定

项 约定
路由 path approver-setting,component /system/approver-setting/index
菜单 perms / menuCode system:approverSetting
布局 page-container 内两个 section.panel,纵向排列,间距与现有多 panel 页一致
上 panel 标题 报价单审批人设置
下 panel 标题 合同审批人设置
用户下拉 fetchUserOptions 只加载一次,两区共用
API 仍调用现有 quote/contract approver-setting get/save
UI Fresh Mint;label-position="top";按钮带图标(RefreshLeft / Check)

旧页 crm/quote/approver-setting、crm/contract/approver-setting 源码可保留(直链仍可用),侧栏不展示。

4.2 权限(必做小改)

现网 save 接口守卫为:

  • crm:quote:approverSetting
  • crm:contract:approverSetting

菜单合并后,若角色仅有新菜单 system:approverSetting,保存会 403。因此:

  1. 两处 save 的 require_menu_code(...) 改为 system:approverSetting。
  2. GET 仍为 require_admin_or_super_admin(不变)。
  3. SQL:为曾拥有任一旧菜单的角色插入新菜单 sys_role_menu(幂等)。
  4. super_admin 仍放行,不依赖角色菜单。

4.3 菜单 SQL

项 值
新菜单 id SYS_APPROVER_SETTING(与 SYS_OPERLOG 风格一致)
parent_id SYSM000000000000000000000000000001
path approver-setting
component /system/approver-setting/index
perms system:approverSetting
order_num 9(操作日志之后)
旧菜单 id CRM3000000000000000000000000015、CRM3000000000000000000000000026 → visible='0'

开发环境 VITE_ACCESS_MODE=frontend 时侧栏以 sqxp.ts 为准,须前后端一并生效。

5. 验收

  1. 【CRM管理】侧栏不再出现两个旧审批人设置菜单。
  2. 【系统管理】出现【报价、合同审批人设置】,进入后上下两区可见。
  3. 上区保存只影响报价默认审批人;下区只影响合同。
  4. 重置各自重新拉取对应 get 接口。
  5. 原有「曾配置过的」角色打开新页后可成功保存(非仅 super_admin)。
  6. 报价/合同提交审批预填行为与改前一致。

6. 自检

  • 无 TBD/占位符
  • 与「分区各自保存」「挂系统管理」决策一致
  • 覆盖权限守卫缺口(避免只改菜单导致保存 403)
  • 范围限于菜单/页面合并 + 最小权限对齐,不扩后端业务