本次改造将 ERP、MES、WMS 三个模块的物料/产品数据统一到 MDM(主数据管理)模块。
改造范围:物料/产品数据迁移及 SKU 管理
/mdm/item - MDM 物料主数据管理| 方法 | 路径 | 说明 |
|---|---|---|
| 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 | 否 | 备注 |
响应:
{
"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/product - ERP 产品管理(保留,数据源变更)// 原调用 ERP 产品 API
import { getProductPage, getProduct, createProduct, updateProduct } from '@/api/erp/product'
// 改为调用 MDM 物料 API(itemType=2 产品)
import { getItemPage, getItem, createItem, updateItem } from '@/api/mdm/item'
| 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 | 产品类型 |
data() {
return {
// 查询参数
queryParams: {
pageNo: 1,
pageSize: 10,
code: '',
name: '',
categoryId: null,
itemType: 2, // 固定为产品类型
status: null
}
}
}
getList() {
this.loading = true
getItemPage({
...this.queryParams,
itemType: 2 // 产品类型
}).then(response => {
this.list = response.data.list
this.total = response.data.total
this.loading = false
})
}
<!-- 原字段名 -->
<el-input v-model="form.barCode" placeholder="产品条码" />
<!-- 改为 -->
<el-input v-model="form.barCode" placeholder="产品条码" />
<el-input v-model="form.code" placeholder="产品编码" />
<!-- 原表格列 -->
<el-table-column prop="barCode" label="产品条码" />
<el-table-column prop="standard" label="规格" />
<!-- 改为 -->
<el-table-column prop="code" label="产品编码" />
<el-table-column prop="barCode" label="产品条码" />
<el-table-column prop="specification" label="规格型号" />
/mes/md/item - MES 物料管理(保留,数据源变更)// 原调用 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'
| 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 | 物料类型 |
以下功能仍由 MES 模块管理,不在 MDM 中:
/mes/md/item/batch-config - 物料批次属性配置/mes/md/product-bom - 产品 BOM 配置/mes/md/product-sop - 产品 SOP 配置/mes/md/product-sip - 产品 SIP 配置这些页面需要通过物料 ID 关联 MDM 物料数据,查询时使用 list-by-ids 接口获取物料基础信息。
// 获取物料信息时使用 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/item - WMS 商品管理(保留,数据源变更)/wms/item-sku - WMS SKU 管理(保留,数据源变更)// 原调用 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'
| 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 | 销售价 |
// 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
})
}
}
}
src/api/mdm/item.jsimport 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.jsimport 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 参数:
<!-- ERP 产品选择器 -->
<mdm-item-selector :item-type="2" @select="handleProductSelect" />
<!-- MES 物料选择器 -->
<mdm-item-selector :item-type="1" @select="handleItemSelect" />
<!-- WMS 商品选择器 -->
<mdm-item-selector :item-type="1" @select="handleItemSelect" />
<template>
<el-dialog title="选择物料" :visible.sync="visible" width="800px">
<el-table :data="list" @row-click="handleRowClick">
<el-table-column prop="code" label="编码" width="120" />
<el-table-column prop="name" label="名称" width="180" />
<el-table-column prop="specification" label="规格型号" width="120" />
<el-table-column prop="categoryName" label="分类" width="120" />
<el-table-column prop="unitMeasureName" label="单位" width="80" />
</el-table>
<pagination :total="total" :page.sync="queryParams.pageNo" @pagination="getList" />
</el-dialog>
</template>
<script>
import { getItemPage } from '@/api/mdm/item'
export default {
name: 'MdmItemSelector',
props: {
itemType: {
type: Number,
default: null
}
},
data() {
return {
visible: false,
list: [],
total: 0,
queryParams: {
pageNo: 1,
pageSize: 10
}
}
},
methods: {
show() {
this.visible = true
this.getList()
},
getList() {
getItemPage({
...this.queryParams,
itemType: this.itemType,
status: 0 // 只选择启用的
}).then(response => {
this.list = response.data.list
this.total = response.data.total
})
},
handleRowClick(row) {
this.$emit('select', row)
this.visible = false
}
}
}
</script>
itemType=1:物料(MES 使用)itemType=2:产品(ERP 使用)itemType=3:半成品删除操作:MDM 物料删除实际为禁用操作,不做物理删除
SKU 模式:所有物料必须配置 SKU,ERP/MES 数据迁移时自动创建默认 SKU
向后兼容:原模块的 API 接口保留,内部调用 MDM API
数据关联: