编辑 | blame | 历史 | 原始文档

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 备注

响应:

{
  "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 调用变更

// 原调用 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 数据修改

data() {
  return {
    // 查询参数
    queryParams: {
      pageNo: 1,
      pageSize: 10,
      code: '',
      name: '',
      categoryId: null,
      itemType: 2,  // 固定为产品类型
      status: null
    }
  }
}

4. 查询方法修改

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. 表单字段映射修改

<!-- 原字段名 -->
<el-input v-model="form.barCode" placeholder="产品条码" />

<!-- 改为 -->
<el-input v-model="form.barCode" placeholder="产品条码" />
<el-input v-model="form.code" placeholder="产品编码" />

6. 表格列修改

<!-- 原表格列 -->
<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 物料页面修改

涉及页面

  • /mes/md/item - MES 物料管理(保留,数据源变更)

前端修改点

1. API 调用变更

// 原调用 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. 批次配置页面修改

// 获取物料信息时使用 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 调用变更

// 原调用 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. 单位名称获取

// 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

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

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 参数:

<!-- 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>

七、注意事项

  1. 物料类型区分
  • itemType=1:物料(MES 使用)
  • itemType=2:产品(ERP 使用)
  • itemType=3:半成品
  1. 删除操作:MDM 物料删除实际为禁用操作,不做物理删除

  2. SKU 模式:所有物料必须配置 SKU,ERP/MES 数据迁移时自动创建默认 SKU

  3. 向后兼容:原模块的 API 接口保留,内部调用 MDM API

  4. 数据关联

  • MES 批次配置、BOM 等通过物料 ID 关联
  • WMS 库存、出入库等通过 SKU ID 关联
  1. 权限配置:需要为新页面配置菜单和权限