ARTICLE · 1175862
别再用 Excel 管 BOM 了,我写了一套 PLM 系统
它不是 ERP(管订单和财务),也不是 OA(管请假和报销),它只管一件事:一个产品是怎么被设计出来的,改过多少次,现在是什么状态。

最近公司上线了PLM系统,我也尝试做了一个简单的出来,现在挂在小全源码站。从ERP到MES,WMS,PLM,MIS等等系统的上线,其实现在很多制造业公司都趋向了信息化,这也是未来的趋势。

一、这套系统管什么
五个模块,串起来就是产品从立项到交付的完整链路:
产品管理:产品档案 + 无限级分类树,每个产品带版本和状态(草稿/已发布/已废弃)
零部件库:所有零件统一入库,区分标准件/通用件/自制件/外购件,带材料、规格、供应商、重量
BOM 管理:一个产品由哪些零件组成、用量多少、层级关系如何
文档管理:图纸、工艺文件、说明书的版本链
变更中心:改东西要走流程,全程留痕
配套的还有项目管理(带成员)、用户角色(6 种角色)、数据字典,以及一个 8 指标 + 4 图表的数据看板。

二、三个真正"PLM"的设计
很多自研系统做着做着就变成了"带权限的网盘"。区别就在下面这几个细节。
1. BOM 是树,不是表
BOM 明细表用 parent_item_id 指向自身,实现无限层级装配。查询时只发一条 SQL 拉全量明细,再在内存递归组装成树——避免了逐层查询的性能陷阱。
更关键的是发布即冻结:BOM 一旦发布为 RELEASED,就不允许再改,只能"新建版本"复制出一份新草稿。版本号自动递增,A.0 → A.1 → …… → A.9 → B.0。而 BOM 发布的那一刻,会自动回写关联产品的版本和状态——这就是 PLM 的核心闭环:物料结构一变,产品就跟着升级。
2. 文档要"检出 / 检入"
这是专业 PLM 的标志性功能,自研系统最容易漏掉。
检出 = 加锁,记录占用人;此时别人点检出会直接提示"文档已被他人检出"。检入 = 解锁,且只允许检出人本人操作。就这么一个字段,解决了两个人同时改一张图纸的问题。每次上传新版本还要填变更说明,版本历史完整保留。
3. 变更走 ECR → ECO 两段式
不是"改完提交一下",而是标准的两段流程:
ECR(变更申请)草稿 → 提交评审 → 批准 / 驳回
↓ 只有已批准才能派生,且一个 ECR 只能生成一个 ECO
ECO(变更单)草稿 → 提交审批 → 批准 → 执行
↓ 执行时自动把关联的 ECR 关闭
审批记录落在一张通用表上,用 业务类型 + 业务ID 同时支撑 ECR、ECO、文档、BOM 四类审批,前端渲染成审批时间线——谁在什么时候、同意还是驳回、意见是什么,一目了然。

三、技术实现
后端 Spring Boot 3.1.2(Java 17)+ MyBatis-Plus 3.5.5 + MySQL 8,JWT 做登录态;前端 Vue 3.3 + Vite 5 + Element Plus 2.4 + ECharts 5。
规模:15 张数据表、62 个后端类、11 个前端页面、84 个接口。没有过度设计,最大的 Service 也才 370 行,适合拿去二次开发。
编号用雪花 ID 自动生成(ECR-、ECO-、BOM-、DOC- 前缀),状态机校验遍布 Service 层——只有草稿能编辑、只有已批准能执行、已发布不允许直接改。这类"看起来啰嗦"的校验,恰恰是工程化程度的体现。
前端体验上,BOM 是左右分栏的树形编辑,变更中心是双页签 + 审批时间线抽屉,窄屏时侧栏自动变抽屉菜单。
四、最后
这套系统的价值,不在于代码量,而在于它把"产品数据该怎么管"这件事,用可执行的方式定义清楚了:万物有编号、万物有版本、万物有状态、万物可追溯。















































































