# 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. **权限配置**:需要为新页面配置菜单和权限