# 合同 create — 报价单前置(P1) > **角色**:支撑报价单 **转合同**(`CrmQuoteServiceImpl.toContract`)及 `ToContractDialog`。 > **范围**:仅实现 **create 闭环**,不含合同审批/变更/模板等完整合同模块。 --- ## 须对齐的 Java | 文件 | 方法 | |------|------| | `CrmContractController.java` | `POST /` → `insertByBo` | | `CrmContractServiceImpl.java` | `insertByBo`(主表 + 产品明细) | | `CrmContractProductServiceImpl.java` | `batchInsert` / 明细保存 | 报价单转合同调用链(快照 `CrmQuoteServiceImpl.toContract` 时一并阅读): 1. 校验报价单 `accepted`、有产品、未转过 2. 组装 `CrmContractBo` + `CrmContractProductBo` 列表 3. `contractService.insertByBo` 4. 回写报价单 `status=contract`、`contract_id` ## 涉及表(最小集) | 表 | 说明 | |----|------| | `crm_contract` | 门户已有简化 Model,须补字段 + create CRUD | | `crm_contract_product` | **须新建** DDL | 其余合同表(approval/change/template…)**本阶段不做**。 ## 门户 API(最小) | 门户 | 说明 | |------|------| | POST `/web/crm/contract/add` | 对齐 Java `insertByBo` | | POST `/web/crm/contract/detail` | 转合同后可选查看 | | POST `/web/crm/contract/product/list` | 明细(若前端需要) | `toContract` 在报价单 CRUD 内调用 `create_contract_from_bo(...)`,不暴露为独立合同「从报价创建」路由亦可(与 Java 内联调用一致)。 ## 快照清单(P1-1 实施前执行) ```bash ./docs/crm-migration/scripts/snapshot-java.sh contract \ controller/CrmContractController.java \ service/impl/CrmContractServiceImpl.java \ service/impl/CrmContractProductServiceImpl.java \ domain/CrmContract.java \ domain/CrmContractProduct.java \ domain/bo/CrmContractBo.java \ domain/bo/CrmContractProductBo.java ``` ## 完成标准 - [x] 可从 Python 传入与 Java `toContract` 相同语义的 Bo,创建合同 + 产品行 - [ ] 报价单 `C14 转合同` 可联调(在报价单全量功能范围内,**不可 stub**)