# 合同模块产品字段变更
## 变更说明
合同模块的产品来源从 **CRM 产品** 改为 **MDM 物料**,涉及字段名称变更。
---
## 数据库变更 SQL
```sql
-- =============================================
-- 合同产品表字段变更
-- =============================================
-- 1. 删除旧字段(如果有数据请先备份)
ALTER TABLE `crm_contract_product` DROP COLUMN `product_id`;
ALTER TABLE `crm_contract_product` DROP COLUMN `product_price`;
-- 2. 如果新字段不存在,则添加(根据实际情况判断是否需要执行)
-- ALTER TABLE `crm_contract_product` ADD COLUMN `item_id` bigint DEFAULT NULL COMMENT 'MDM物料编号' AFTER `contract_id`;
-- ALTER TABLE `crm_contract_product` ADD COLUMN `item_unit_id` bigint DEFAULT NULL COMMENT '计量单位编号' AFTER `item_id`;
-- ALTER TABLE `crm_contract_product` ADD COLUMN `item_price` decimal(24,6) DEFAULT NULL COMMENT '物料原价' AFTER `item_unit_id`;
```
---
## 涉及页面
- 合同表单页面(新建/编辑合同)
- 合同详情页面
---
## API 变更
### 1. 创建/更新合同接口
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /crm/contract/create | 创建合同 |
| PUT | /crm/contract/update | 更新合同 |
### 2. 请求参数变更(products 字段)
#### 旧字段(已废弃)
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| productId | Long | 是 | CRM 产品编号 |
| productPrice | BigDecimal | 否 | 产品价格 |
| sellingPrice | BigDecimal | 否 | 销售价(用作合同价) |
#### 新字段
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| itemId | Long | 是 | MDM 物料编号 |
| itemPrice | BigDecimal | 是 | 物料原价 |
| contractPrice | BigDecimal | 是 | 合同价格 |
| count | Integer | 是 | 数量 |
### 3. 请求示例
**旧格式(不再支持):**
```json
{
"name": "合同名称",
"customerId": 1,
"products": [
{
"productId": 4,
"sellingPrice": 1111,
"count": 10
}
]
}
```
**新格式:**
```json
{
"name": "合同名称",
"customerId": 1,
"products": [
{
"itemId": 4,
"itemPrice": 1000,
"contractPrice": 1111,
"count": 10
}
]
}
```
---
## 响应变更
### 合同详情接口响应
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /crm/contract/get | 获取合同详情 |
#### 产品明细字段变更
| 旧字段 | 新字段 | 说明 |
|--------|--------|------|
| productId | itemId | MDM 物料编号 |
| productName | itemName | 物料名称 |
| productNo | itemCode | 物料编码 |
| productUnit | itemUnitName | 计量单位名称 |
| productPrice | itemPrice | 物料原价 |
| - | itemBarCode | 物料条码(新增) |
---
## 前端修改点
### 1. 物料选择组件
将 **CRM 产品选择器** 改为 **MDM 物料选择器**。
```html
```
### 2. 物料选择回调
```js
methods: {
handleItemChange(item) {
// 选择物料后自动填充价格信息
this.product.itemId = item.id
this.product.itemPrice = item.salesPrice // 物料原价
this.product.contractPrice = item.salesPrice // 合同价格(默认等于原价,可修改)
}
}
```
### 3. 表格列字段修改
```html
```
### 4. data 数据修改
```js
// 产品明细数据结构
product: {
itemId: null, // MDM 物料编号
itemPrice: null, // 物料原价
contractPrice: null, // 合同价格
count: null // 数量
}
```
---
## MDM 物料选择器 API
### 获取物料列表
| 方法 | 路径 | 说明 |
|------|------|------|
| GET | /mdm/item/page | 分页查询物料 |
**请求参数:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| code | String | 否 | 物料编码 |
| name | String | 否 | 物料名称 |
| barCode | String | 否 | 物料条码 |
| status | Integer | 否 | 状态(0启用 1禁用),传 0 |
**响应字段:**
| 字段 | 类型 | 说明 |
|------|------|------|
| id | Long | 物料编号(即 itemId) |
| code | String | 物料编码 |
| name | String | 物料名称 |
| barCode | String | 物料条码 |
| salesPrice | BigDecimal | 销售价 |
| unitMeasureId | Long | 计量单位编号 |
| unitMeasureName | String | 计量单位名称 |
---
## 注意事项
1. **物料必须先启用**:只能选择状态为"启用"的 MDM 物料
2. **价格可修改**:`contractPrice` 默认等于物料原价,但可以手动修改
3. **过渡期**:后端暂时兼容 `productId` 和 `sellingPrice` 字段,但后续会移除兼容逻辑
4. **其他模块同步修改**:销售报价单也使用 MDM 物料,字段与合同一致