日期: 2026-08-01
状态: 已实现
选定方案: A — 租户级「报价单审批人设置」页 + 提交审批弹窗预填
相关 Demo: docs/fresh-mint-quote-approver-setting-demo.html
现状入口: web-admin 报价单管理 #/crm/quote(提交审批弹窗每次手选审批人)
workflow-conventions 目标能力,另项推进)submitQuote 审批链路语义(顺序审批、状态流转等保持不变)| 项 | 决策 |
|---|---|
| 配置粒度 | 租户级一份配置 |
| 提交时可改预填审批人 | 可以 |
| 谁维护设置 | 仅拥有「报价单审批人设置」菜单权限的角色 |
| 未配置时 | 与现在一样:审批人必填,弹窗为空,须手选 |
| 默认备注 | 首版不做 |
crm_quote_approver_setting新建表,遵守 database-conventions 公共字段顺序:id → 业务字段 → 公共字段。
| 字段 | 类型 | 说明 |
|---|---|---|
id |
VARCHAR(64) | UUID 主键 |
approver_ids |
VARCHAR(1000) | 有序审批人用户 ID,逗号分隔(与现提交 approverIds 语义一致) |
status |
CHAR(1) | 0 启用 / 1 停用;停用等同未配置 |
tenant_no |
… | 租户 |
order_num / remark / create_* / update_* / del_flag |
… | 公共字段 |
约定:
tenant_no 下有效(del_flag=0)记录至多一条:GET 取该条;PUT 无则 insert、有则 update(upsert),禁止同租户插入第二条有效记录。docs/sql/(及必要的 migrate 脚本)。backend/app/models/crm_models.py 新增 CrmQuoteApproverSettingbackend/app/crud/crm/quote_approver_setting.py(或同级模块)
get_setting(db, tenant_no) → dict | Nonesave_setting(db, tenant_no, approver_ids, status, user_info) → upsert保存时校验:审批人 ID 须为当前租户下存在且可用的用户;无效 ID 拒绝保存并提示。
挂在现有 CRM 路由体系(与 crm_quote_routes 同前缀风格),建议:
| 方法 | 路径(示意) | 说明 |
|---|---|---|
| POST | /api/web/.../crm/quote-approver-setting/get |
返回当前租户配置;无记录返回 { approverIds: [], status: '0' }(空列表不预填;默认启用避免设置页首次落到停用) |
| POST | /api/web/.../crm/quote-approver-setting/save |
Body:{ approverIds: string[], status: '0'\|'1' };有则更新、无则创建 |
约束:
tenant_no 过滤/写入,不信任客户端覆盖租户。submitQuote 入参:仍由前端提交最终 approverIds。#/crm/quote-approver-settingweb-admin/src/views/crm/quote/approver-setting/index.vue(表单配置页,非列表 CRUD)label-position="top";面板主标题走 panelTitleBarTextRules(「报价单审批人设置」)web-admin/src/api/crm/quote/ 增补 get/save setting改造所有会打开「提交审批」并选择审批人的入口,至少包括:
web-admin/src/views/crm/quote/index.vueweb-admin/src/views/crm/quote/components/QuoteFormPanel.vueApproverSelector.vue 仍被使用,一并预填行为:
approverIds;可选轻提示「已按审批人设置预填,可修改」。docs/web-admin-ui-pattern-index.md 选型时优先表单配置类模式(实现计划中写明 P 编号)。dialog-form-layout + form-grid-2,不新开交互范式。管理员 → 设置页 PUT → crm_quote_approver_setting
业务员 → 打开提交弹窗 → GET setting → 预填 approverIds(可改)
业务员 → 确定 → 现有 submitQuote({ id, approverIds, remark })
后端 → create_approval_records(现有逻辑)
| 场景 | 行为 |
|---|---|
| 设置中含已停用/已删用户 | 保存时校验失败;预填时过滤无效 ID,过滤后为空则当未配置 |
status=停用 |
不预填 |
| 清空审批人并保存 | 允许;之后不预填 |
| 多人顺序 | 与现网一致:按选择顺序依次审批 |
| 租户隔离 | 全部按 tenant_no |
| 层 | 触点 |
|---|---|
| SQL | docs/sql/ + migrate;新表 crm_quote_approver_setting |
| Backend | model、CRUD、CRM route 注册、权限 |
| Frontend | 设置页、API、菜单/路由、提交弹窗预填 |
| Docs | 本设计;可选更新 UI pattern 索引条目 |