CRM 销售报价单 - 报价单号支持自定义(前端联调方案)
调整内容:报价单的「报价单号」由「系统自动生成、不可编辑」改为**支持用户自定义**:
新增时留空 = 系统自动生成;填写 = 使用用户填写的编号(需全库唯一)。
修改时留空 = 保持原编号不变;填写 = 替换为新编号(需全库唯一)。
前端需把该输入框放开编辑,并把提示文案改为「报价单号自定义」。
涉及页面
views/crm/saleQuotation/index.vue — 报价单列表页(列表展示的报价单号来源不变,无需改动)
views/crm/saleQuotation/modules/form.vue — 报价单新增/编辑弹窗(**本次改动主体**)
views/crm/saleQuotation/data.ts — 表单字段配置(**本次改动主体**)
业务流程与数据带入
- 新增报价单:打开弹窗 → 报价单号输入框默认为空 → 用户可填自定义编号,也可不填 → 提交时把
no 原样带给后端。不填由后端按编码规则自动生成。
- 编辑报价单:打开弹窗 → 调用
GET /crm/sale-quotation/get?id= 回填表单 → 报价单号输入框显示**原编号**(可修改)→ 提交时把 no 原样带给后端。不填(清空)表示保持原编号不变。
- 保存成功后:列表刷新,展示后端最终返回的报价单号(自定义编号或自动生成编号)。
API
| 方法 |
路径 |
说明 |
| POST |
/admin-api/crm/sale-quotation/create |
新增报价单,请求体新增选填 no |
| PUT |
/admin-api/crm/sale-quotation/update |
修改报价单,请求体新增选填 no |
| GET |
/admin-api/crm/sale-quotation/get |
回填编辑表单(no 已在响应中) |
请求参数新增:
| 参数 |
类型 |
必填 |
说明 |
| no |
String |
否 |
报价单号。长度 ≤ 32 字符;新增留空由系统自动生成;修改留空保持原值。填写时后端校验全库唯一 |
请求示例:
{
"no": "BJ-2026-001",
"name": "报价单A",
"customerId": 18336,
"ownerUserId": 17144,
"quotationTime": "2026-09-01 00:00:00",
"items": [
{ "itemId": 20529, "quotationPrice": 123.00, "count": 10, "taxPercent": 13.00 }
]
}
错误提示(后端已给出可执行文案):
| 场景 |
提示 |
| 编号已被占用(含已删除的报价单占用) |
报价单号【填写值】已被占用,不能重复使用。请换一个编号,或清空编号由系统自动生成(已删除的报价单也会占用其原编号) |
| 编号超长 |
报价单号长度不能超过 32 个字符 |
前端修改点(仅说明,不含代码)
data.ts 中「报价单号」字段配置:
- 去掉输入框的禁用(原为保存时自动生成、不可编辑),改为可编辑。
- 提示文案由「保存时自动生成」改为「**报价单号自定义**」,并补充「留空由系统自动生成」的说明。
- 校验规则:非必填;可加长度上限 32 的前端提示,避免提交后被后端拦截。
modules/form.vue:
- 新增/编辑弹窗打开时,报价单号输入框允许用户输入。
- 编辑态回填逻辑不变:
GET /crm/sale-quotation/get 已返回 no,会一并回填到表单。
- 提交逻辑不变:直接把表单值(含
no)提交给 create/update 接口。用户未填写时提交空值即可(后端按「留空」语义处理),无需前端自行生成编号。
字段展示规则
| 字段 |
展示位置 |
说明 |
| 报价单号 |
列表列、详情、表单输入框 |
后端返回的最终编号(自定义或自动生成) |
| 报价单号(输入框提示) |
新增/编辑表单 |
「报价单号自定义」,提示留空由系统生成 |
业务规则说明
| 场景 |
规则 |
| 新增,编号留空 |
后端按编码规则(BJ + 日期 + 序号)自动生成 |
| 新增,填写编号 |
使用用户填写的编号,需全库唯一 |
| 修改,编号留空 |
保持原编号不变(不会被清空) |
| 修改,填写编号 |
校验唯一后替换;与原编号相同视为未变更,允许保存 |
| 编号唯一性范围 |
覆盖**历史已删除**的报价单(数据库唯一索引不含逻辑删除标记),删除报价单后其编号不可再被使用 |
| 编号前后空格 |
后端提交前会做首尾去空格处理,纯空格等同留空 |
| 非草稿状态 |
报价单一旦提交/转合同,不允许修改(含编号),维持原有限制 |
注意事项
- 「留空」与「填写后删除内容」在后端是同一语义(保持/自动生成),前端无需区分。
- 编号建议使用字母、数字、短横线组合,避免使用特殊字符,便于后续打印与检索;后端仅做长度与唯一性校验。
- 编辑态若原报价单由系统自动生成编号,用户可直接改成自定义编号;改后原编号不会被释放,仍占用。
- 报价单号会带入「转合同」生成的合同备注(
由报价单[xxx]生成),若修改编号需注意历史合同备注中保留的是旧编号。
- 本次仅后端放开
no 字段与唯一性校验,前端放开输入框即可生效,无需其他接口配合。