# MDM 主数据模块改造 - 前端变更文档(第二阶段)
## 概述
本次改造将 ERP、MES、WMS 三个模块的物料/产品数据统一到 MDM(主数据管理)模块。
**改造范围**:物料/产品数据迁移及 SKU 管理
---
## 一、MDM 物料页面
### 涉及页面
- 新增页面:`/mdm/item` - MDM 物料主数据管理
### API 变更
| 方法 | 路径 | 说明 |
|------|------|------|
| POST | /mdm/item/create | 创建物料 |
| PUT | /mdm/item/update | 更新物料 |
| PUT | /mdm/item/update-status | 更新物料状态 |
| DELETE | /mdm/item/delete | 删除物料(实际为禁用) |
| GET | /mdm/item/get | 获取物料 |
| GET | /mdm/item/page | 获取物料分页 |
| GET | /mdm/item/list-by-ids | 获取物料列表 |
**请求参数(创建):**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| code | String | 是 | 物料编码 |
| name | String | 是 | 物料名称 |
| barCode | String | 否 | 物料条码 |
| specification | String | 否 | 规格型号 |
| categoryId | Long | 是 | 物料分类编号 |
| unitMeasureId | Long | 是 | 计量单位编号 |
| brandId | Long | 否 | 品牌编号 |
| itemType | Integer | 是 | 物料类型(1:物料, 2:产品, 3:半成品) |
| status | Integer | 否 | 状态(0:启用, 1:禁用) |
| purchasePrice | BigDecimal | 否 | 采购价格 |
| salesPrice | BigDecimal | 否 | 销售价格 |
| costPrice | BigDecimal | 否 | 成本价格 |
| safetyStock | BigDecimal | 否 | 安全库存 |
| minStock | BigDecimal | 否 | 最低库存 |
| maxStock | BigDecimal | 否 | 最高库存 |
| expiryDay | Integer | 否 | 保质期天数 |
| isBatchManaged | Boolean | 否 | 是否批次管理 |
| weight | BigDecimal | 否 | 重量(kg) |
| remark | String | 否 | 备注 |
**响应:**
```json
{
"code": 0,
"data": {
"id": 1,
"code": "ITEM001",
"name": "螺丝",
"barCode": "12345678",
"specification": "M8*20",
"categoryId": 1,
"categoryName": "五金配件",
"unitMeasureId": 1,
"unitMeasureName": "个",
"brandId": null,
"brandName": null,
"itemType": 1,
"status": 0,
"purchasePrice": 10.00,
"salesPrice": 15.00,
"costPrice": 8.00,
"safetyStock": 100,
"expiryDay": null,
"isBatchManaged": false,
"weight": 0.01,
"remark": "",
"createTime": "2024-01-01 12:00:00"
},
"msg": "操作成功"
}
```
---
## 二、ERP 产品页面修改
### 涉及页面
- `/erp/product` - ERP 产品管理(保留,数据源变更)
### 前端修改点
#### 1. API 调用变更
```js
// 原调用 ERP 产品 API
import { getProductPage, getProduct, createProduct, updateProduct } from '@/api/erp/product'
// 改为调用 MDM 物料 API(itemType=2 产品)
import { getItemPage, getItem, createItem, updateItem } from '@/api/mdm/item'
```
#### 2. 字段映射
| ERP 字段 | MDM 字段 | 说明 |
|----------|----------|------|
| id | id | 编号 |
| barCode | barCode | 条码(原 ERP 用 barCode,现统一) |
| barCode | code | 编码(原条码改为编码) |
| name | name | 名称 |
| standard | specification | 规格型号 |
| categoryId | categoryId | 分类编号 |
| unitId | unitMeasureId | 单位编号 |
| status | status | 状态 |
| purchasePrice | purchasePrice | 采购价格 |
| salePrice | salesPrice | 销售价格 |
| minPrice | minPrice | 最低价格 |
| expiryDay | expiryDay | 保质期天数 |
| weight | weight | 重量 |
| remark | remark | 备注 |
| - | itemType = 2 | 产品类型 |
#### 3. data 数据修改
```js
data() {
return {
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
code: '',
name: '',
categoryId: null,
itemType: 2, // 固定为产品类型
status: null
}
}
}
```
#### 4. 查询方法修改
```js
getList() {
this.loading = true
getItemPage({
...this.queryParams,
itemType: 2 // 产品类型
}).then(response => {
this.list = response.data.list
this.total = response.data.total
this.loading = false
})
}
```
#### 5. 表单字段映射修改
```html
```
#### 6. 表格列修改
```html
```
---
## 三、MES 物料页面修改
### 涉及页面
- `/mes/md/item` - MES 物料管理(保留,数据源变更)
### 前端修改点
#### 1. API 调用变更
```js
// 原调用 MES 物料 API
import { getItemPage, getItem, createItem, updateItem } from '@/api/mes/md/item'
// 改为调用 MDM 物料 API(itemType=1 物料)
import { getItemPage, getItem, createItem, updateItem } from '@/api/mdm/item'
```
#### 2. 字段映射
| MES 字段 | MDM 字段 | 说明 |
|----------|----------|------|
| id | id | 物料编号 |
| code | code | 物料编码 |
| name | name | 物料名称 |
| specification | specification | 规格型号 |
| itemTypeId | categoryId | 分类编号 |
| unitMeasureId | unitMeasureId | 单位编号 |
| status | status | 状态 |
| minStock | minStock | 最低库存 |
| maxStock | maxStock | 最高库存 |
| batchFlag | isBatchManaged | 是否批次管理 |
| highValue | highValue | 是否高值物料 |
| safeStockFlag | - | 是否启用安全库存(计算 safetyStock) |
| remark | remark | 备注 |
| - | itemType = 1 | 物料类型 |
#### 3. MES 特有功能保留
以下功能仍由 MES 模块管理,不在 MDM 中:
- **批次属性配置**:`/mes/md/item/batch-config` - 物料批次属性配置
- **BOM 配置**:`/mes/md/product-bom` - 产品 BOM 配置
- **SOP 配置**:`/mes/md/product-sop` - 产品 SOP 配置
- **SIP 配置**:`/mes/md/product-sip` - 产品 SIP 配置
这些页面需要通过物料 ID 关联 MDM 物料数据,查询时使用 `list-by-ids` 接口获取物料基础信息。
#### 4. 批次配置页面修改
```js
// 获取物料信息时使用 MDM API
import { getItemListByIds } from '@/api/mdm/item'
// 批次配置列表页面
methods: {
// 获取物料名称
getItemNames(itemIds) {
getItemListByIds(itemIds).then(response => {
const itemMap = {}
response.data.forEach(item => {
itemMap[item.id] = item.name
})
this.itemMap = itemMap
})
}
}
```
---
## 四、WMS 商品/SKU 页面修改
### 涉及页面
- `/wms/item` - WMS 商品管理(保留,数据源变更)
- `/wms/item-sku` - WMS SKU 管理(保留,数据源变更)
### 前端修改点
#### 1. API 调用变更
```js
// 原调用 WMS 商品 API
import { getItemPage, getItem } from '@/api/wms/item'
// 改为调用 MDM 物料 API
import { getItemPage, getItem } from '@/api/mdm/item'
// SKU 数据
import { getSkuPage, getSku } from '@/api/mdm/item-sku'
```
#### 2. 字段映射
| WMS 商品字段 | MDM 物料字段 | 说明 |
|--------------|--------------|------|
| id | id | 商品编号 |
| code | code | 商品编码 |
| name | name | 商品名称 |
| unit | - | 单位(需从 MDM 单位表获取名称) |
| categoryId | categoryId | 分类编号 |
| brandId | brandId | 品牌编号 |
| remark | remark | 备注 |
| WMS SKU 字段 | MDM SKU 字段 | 说明 |
|--------------|--------------|------|
| id | id | SKU 编号 |
| itemId | itemId | 商品编号 |
| code | code | SKU 编码 |
| name | name | SKU 名称 |
| barCode | barCode | SKU 条码 |
| length | length | 长度(cm) |
| width | width | 宽度(cm) |
| height | height | 高度(cm) |
| grossWeight | grossWeight | 毛重(kg) |
| netWeight | netWeight | 净重(kg) |
| costPrice | costPrice | 成本价 |
| sellingPrice | salePrice | 销售价 |
#### 3. 单位名称获取
```js
// WMS 商品原来 unit 是字符串,现在需要从 MDM 单位获取
import { getUnitListByIds } from '@/api/mdm/unit'
methods: {
// 获取单位名称
loadUnitNames() {
const unitIds = this.list.map(item => item.unitMeasureId).filter(id => id)
if (unitIds.length > 0) {
getUnitListByIds(unitIds.join(',')).then(response => {
const unitMap = {}
response.data.forEach(unit => {
unitMap[unit.id] = unit.name
})
this.unitMap = unitMap
})
}
}
}
```
---
## 五、新增前端 API 文件
### 文件路径:`src/api/mdm/item.js`
```js
import request from '@/utils/request'
// 创建物料
export function createItem(data) {
return request({
url: '/mdm/item/create',
method: 'post',
data: data
})
}
// 更新物料
export function updateItem(data) {
return request({
url: '/mdm/item/update',
method: 'put',
data: data
})
}
// 更新物料状态
export function updateItemStatus(id, status) {
return request({
url: '/mdm/item/update-status?id=' + id + '&status=' + status,
method: 'put'
})
}
// 删除物料
export function deleteItem(id) {
return request({
url: '/mdm/item/delete?id=' + id,
method: 'delete'
})
}
// 获取物料
export function getItem(id) {
return request({
url: '/mdm/item/get?id=' + id,
method: 'get'
})
}
// 获取物料分页
export function getItemPage(params) {
return request({
url: '/mdm/item/page',
method: 'get',
params: params
})
}
// 获取物料列表
export function getItemListByIds(ids) {
return request({
url: '/mdm/item/list-by-ids?ids=' + ids,
method: 'get'
})
}
```
### 文件路径:`src/api/mdm/item-sku.js`
```js
import request from '@/utils/request'
// 创建 SKU
export function createSku(data) {
return request({
url: '/mdm/item-sku/create',
method: 'post',
data: data
})
}
// 更新 SKU
export function updateSku(data) {
return request({
url: '/mdm/item-sku/update',
method: 'put',
data: data
})
}
// 删除 SKU
export function deleteSku(id) {
return request({
url: '/mdm/item-sku/delete?id=' + id,
method: 'delete'
})
}
// 获取 SKU
export function getSku(id) {
return request({
url: '/mdm/item-sku/get?id=' + id,
method: 'get'
})
}
// 获取 SKU 分页
export function getSkuPage(params) {
return request({
url: '/mdm/item-sku/page',
method: 'get',
params: params
})
}
// 获取物料的 SKU 列表
export function getSkuListByItemId(itemId) {
return request({
url: '/mdm/item-sku/list-by-item-id?itemId=' + itemId,
method: 'get'
})
}
```
---
## 六、选择器组件修改
### 物料选择器组件
各模块使用物料选择器时,需要传入 `itemType` 参数:
```vue
```
### 组件实现示例
```vue
```
---
## 七、注意事项
1. **物料类型区分**:
- `itemType=1`:物料(MES 使用)
- `itemType=2`:产品(ERP 使用)
- `itemType=3`:半成品
2. **删除操作**:MDM 物料删除实际为禁用操作,不做物理删除
3. **SKU 模式**:所有物料必须配置 SKU,ERP/MES 数据迁移时自动创建默认 SKU
4. **向后兼容**:原模块的 API 接口保留,内部调用 MDM API
5. **数据关联**:
- MES 批次配置、BOM 等通过物料 ID 关联
- WMS 库存、出入库等通过 SKU ID 关联
6. **权限配置**:需要为新页面配置菜单和权限