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