资讯动态

制造业物料分类编码规则:从一物多码到一码到底的落地拆解

发布时间:2026/10/14 9:21:42 来源:尧图企业网站定制
简介这份《制造业物料分类编码规则》文档面向制造业信息化人员、物料管理及ERP实施从业者用于解决物料标识混乱、分类标准不统一的问题帮助建立可扩展的编码体系。文档以12位码为例拆解产品编号、一级物料属性码、二级功能性能类别码、三级特征区分码与四位序列码的层级结构并延伸至文档编码说明标准件、外购件、电子元器件、自制件对应的一级编码4至7便于采购、仓储、生产与成本核算各环节统一检索。资源包共1个docx文件约18KB内容精炼适合直接作为企业编码规范模板或培训参考。目前已有2368人学习下载读者可据此快速理解编码逻辑结合自身产品线调整码位设计减少重复录入与查找错误为数据标准化和信息化建设提供落地思路。1. 制造业物料分类编码规则从一物多码到一码到底的落地拆解同一个物料采购叫它“六角螺栓M8×30”仓库叫它“螺丝8×30”生产叫它“紧固件-螺栓-8”财务叫它“原材料-五金件-001”。四个部门四套叫法月底对账时采购说买了三千仓库说入库两千八生产说领了两千九财务说账上只有两千七。这不是段子是很多制造企业ERP上线后最真实的日常。制造业物料分类编码规则要解决的就是让同一个物料在全公司只有一个名字、一个编号、一套属性从设计、采购、仓储、生产到财务全链路认同一张“身份证”。这套规则不是IT部门拍脑袋编出来的数字游戏它直接决定你的BOM能不能跑通、库存能不能算准、成本能不能归集。适合谁看正在做ERP实施、主数据治理、仓储数字化或者被“一物多码”折磨到想砸键盘的从业者。2. 编码规则怎么定从分类逻辑到码段设计的完整推演2.1 先定分类维度再谈编码结构很多团队一上来就讨论“用几位数字”“要不要带字母”这是典型的顺序颠倒。编码是分类结果的表达分类逻辑没理清编码规则就是空中楼阁。制造业物料分类的常见维度有四个用途、材质、工艺、形态。用途维度回答“这东西用来干什么”比如原材料、辅料、半成品、成品、包装材料、设备备件材质维度回答“这东西是什么做的”比如金属、塑料、橡胶、电子元器件工艺维度回答“这东西怎么来的”比如铸造件、机加工件、注塑件、钣金件形态维度回答“这东西长什么样”比如标准件、非标件、线材、板材。我一般建议中小制造企业优先采用“用途材质”两级分类因为这两个维度最稳定不会因为工艺调整或供应商更换而频繁变动。工艺和形态可以作为属性字段挂在编码后面而不是编进码段里。为什么因为工艺会变——同一个零件早期外协铸造后期自己机加工如果工艺编进了码段物料号就得跟着变BOM、库存、采购记录全部要改这就是典型的“编码翻车”场景。分类层级建议控制在三层以内。第一层是大类比如“01原材料”第二层是中类比如“0101金属材料”第三层是小类比如“010101钢材”。超过三层维护成本急剧上升而且一线人员根本记不住。三层以内配合搜索功能足够覆盖绝大多数制造场景。2.2 码段设计定长 vs 不定长有含义 vs 无含义码段设计有两个核心决策定长还是不定长有含义还是无含义。定长编码是指每个物料号的长度固定比如12位。不定长编码是长度可变比如“A-001”“B-1234”。定长的好处是系统处理方便数据库字段好定义打印标签格式统一坏处是分类扩展时可能位数不够被迫重构。不定长的好处是灵活坏处是排序、检索、校验都更麻烦。我的经验是如果企业物料种类在五万以内用定长10到12位足够超过五万考虑定长12到15位或者引入字母段压缩长度。不要用不定长后期系统对接时你会后悔。有含义编码是指码段本身携带分类信息比如前两位是大类、中间四位是中类、后四位是流水号。无含义编码是纯流水号比如000001、000002分类信息全部存在属性字段里。有含义编码的好处是人眼可读看到编号大概知道是什么东西坏处是分类调整时编码要跟着改而且码段一旦用完就没法扩展。无含义编码的好处是永远不用改坏处是必须依赖系统查询纸质单据上完全看不懂。常见做法是折中前几位用有含义的分类码后几位用无含义的流水号。比如“01-02-0001”01代表原材料02代表金属材料0001是流水号。这样既保留了分类可读性又给流水号留足了空间。流水号建议至少留四位也就是每个小类下最多9999个物料。如果某个小类预计会超过这个数要么细分小类要么流水号加到五位。2.3 用Python生成编码校验脚本规则定好之后最怕的是人工录入时手抖。下面这个脚本用来校验物料编码是否符合规则可以在ERP导入前批量跑一遍。import re # 编码规则2位大类 2位中类 4位流水号共8位数字 PATTERN re.compile(r^(\d{2})(\d{2})(\d{4})$) # 合法的大类和中类映射表 VALID_CATEGORIES { 01: [01, 02, 03], # 原材料金属、塑料、橡胶 02: [01, 02], # 辅料胶水、油漆 03: [01, 02, 03], # 半成品机加、焊接、装配 04: [01], # 成品 05: [01, 02], # 包装材料纸箱、泡沫 } def validate_code(code): 校验单个物料编码返回(是否合法, 错误信息) match PATTERN.match(code) if not match: return False, f格式错误{code} 不是8位数字 major, minor, serial match.groups() if major not in VALID_CATEGORIES: return False, f大类错误{major} 不在合法大类列表中 if minor not in VALID_CATEGORIES[major]: return False, f中类错误{major}-{minor} 不是合法组合 if serial 0000: return False, f流水号错误{code} 流水号不能为0000 return True, 校验通过 # 批量校验示例 codes [01010001, 01020002, 03010001, 06010001, 01010000] for c in codes: ok, msg validate_code(c) print(f{c}: {OK if ok else FAIL} - {msg})这段代码的逻辑很直接先用正则表达式检查格式再逐级校验大类和中类是否在合法映射表中最后排除流水号为0000的情况。参数方面PATTERN定义了编码的格式规则VALID_CATEGORIES是分类映射表实际使用时需要根据你企业的分类体系替换。validate_code函数返回布尔值和错误信息方便批量导入时定位问题行。这个脚本可以嵌入到ERP的数据导入接口里也可以在Excel导出后单独跑一遍把不合规的编码筛出来。2.4 属性字段设计编码之外的信息怎么挂编码只解决“唯一标识”问题不解决“描述清楚”问题。一个物料号“01010001”背后还需要知道它的名称、规格、材质、单位、供应商、安全库存、采购周期等信息。这些信息挂在属性字段里和编码一一对应。属性字段设计有三个原则第一必填字段要少而精名称、规格、单位、分类是必须的其他字段按需设置第二字段类型要统一比如“规格”字段不要有的写“M8×30”有的写“8*30”单位字段不要有的写“个”有的写“PCS”第三字段值尽量用下拉选择而不是自由输入减少人为差异。常见做法是建一张“物料主数据表”编码是主键其他字段是属性列。这张表由主数据管理员统一维护其他系统通过接口调用。不要允许各部门自己建物料、自己编编码这是“一物多码”的根源。3. 从Excel到ERP物料主数据迁移的实操步骤3.1 存量数据清洗先分类再合并最后补全大多数制造企业上ERP之前物料数据散落在Excel、老系统、纸质台账里。直接迁移过去就是把垃圾搬进新房子。必须先清洗。清洗分三步。第一步是分类把现有物料按新分类体系归入对应大类和中类。这一步最耗时建议用“关键词匹配人工复核”的方式。比如名称里含“螺栓”“螺母”“垫片”的归入“标准件”含“钢板”“圆钢”的归入“金属材料”。第二步是合并同一个物料在不同部门有不同叫法的合并成一条记录。合并依据是“名称规格材质单位”四要素四要素完全一致的就是同一个物料。第三步是补全合并后的记录把缺失的属性字段补上比如供应商、采购周期、安全库存。清洗过程中最常见的坑是“相似但不相同”。比如“M8×30螺栓”和“M8×35螺栓”名称相似但规格不同不能合并。再比如“不锈钢螺栓”和“镀锌螺栓”材质不同也不能合并。判断标准要严格宁可多留几条不要错合并。3.2 用pandas做批量清洗和编码生成存量数据清洗用pandas最顺手。下面这个脚本演示了从Excel读取、清洗、生成编码、导出全流程。import pandas as pd import re # 读取原始物料清单 df pd.read_excel(raw_materials.xlsx) # 清洗去除名称和规格中的多余空格 df[名称] df[名称].str.strip() df[规格] df[规格].str.strip() # 分类映射根据名称关键词归入大类和中类 def classify(name): 根据物料名称返回(大类码, 中类码) name str(name) if re.search(r螺栓|螺母|垫片|销|键, name): return 01, 01 # 原材料-标准件 elif re.search(r钢板|圆钢|角钢|槽钢, name): return 01, 02 # 原材料-钢材 elif re.search(r塑料|尼龙|聚氨酯, name): return 01, 03 # 原材料-塑料 elif re.search(r胶水|油漆|溶剂, name): return 02, 01 # 辅料-化学品类 elif re.search(r纸箱|泡沫|缠绕膜, name): return 05, 01 # 包装材料-纸箱类 else: return 99, 99 # 未分类需人工处理 df[[大类码, 中类码]] df[名称].apply( lambda x: pd.Series(classify(x)) ) # 生成流水号按大类中类分组组内从0001开始递增 df[流水号] df.groupby([大类码, 中类码]).cumcount() 1 df[流水号] df[流水号].apply(lambda x: f{x:04d}) # 拼接完整编码 df[物料编码] df[大类码] df[中类码] df[流水号] # 检查未分类项 unclassified df[df[大类码] 99] if len(unclassified) 0: print(f警告{len(unclassified)} 条记录未自动分类需人工处理) unclassified.to_excel(unclassified.xlsx, indexFalse) # 导出清洗后的物料主数据 df.to_excel(cleaned_materials.xlsx, indexFalse) print(f清洗完成共 {len(df)} 条记录)这段代码的核心逻辑是先做基础清洗去空格再用关键词匹配做自动分类然后按分类分组生成流水号最后拼接成完整编码。参数方面classify函数里的正则表达式需要根据你企业的物料命名习惯调整cumcount()保证同一分类下流水号连续不重复。未分类的记录会被单独导出需要人工判断后补充分类规则。这个脚本跑一遍能把几千条物料数据在几分钟内完成初步清洗和编码生成比手工快得多。3.3 导入ERP前的三个校验点数据清洗完导入ERP之前必须做三个校验。第一编码唯一性校验。用df[物料编码].duplicated().sum()检查是否有重复编码。如果有说明流水号生成逻辑有问题或者分类映射有冲突。第二必填字段完整性校验。检查名称、规格、单位、分类码是否有空值。空值记录不能导入否则ERP里会出现“无名物料”。第三分类合理性抽查。随机抽50条记录人工核对分类是否正确。自动分类不可能100%准确抽查能发现系统性问题。比如发现“不锈钢螺栓”被分到了“钢材”而不是“标准件”就需要调整关键词规则。这三个校验做完数据才能导入ERP。导入时建议先用测试环境跑一遍确认无误再导生产环境。4. 避坑指南物料编码落地中最容易翻车的五个场景4.1 分类太细导致编码膨胀现象某个企业把物料分成“原材料-金属-钢材-板材-冷轧板-深冲用冷轧板”六层结果每个小类下只有两三个物料编码表长得像电话号码本一线人员根本记不住。原因分类维度叠加过多把“用途、材质、工艺、形态”全部编进了码段。解决分类层级控制在三层以内工艺和形态作为属性字段而不是码段。已经分得太细的做一次分类合并把使用频率低的小类合并到上级分类。4.2 一物多码反复出现现象ERP上线三个月后仓库又新建了一个“六角螺栓M8×30”的物料号理由是“采购说这个跟之前那个不一样”。原因没有建立新物料申请审批流程任何人都能建物料。解决建立“主数据管理员”角色所有新物料申请必须经过管理员审核确认与现有物料不重复后才能生成新编码。同时开放物料查询权限让采购和仓库能自己查重。4.3 编码规则中途修改现象企业上了ERP之后发现原来的编码规则不够用想加两位“供应商代码”结果所有历史物料号都要改BOM、库存、采购订单全部受影响。原因编码规则设计时没有预留扩展位或者把易变信息编进了码段。解决编码规则一旦确定至少三年内不要改。如果确实需要扩展新增码段加在末尾不要插入中间。更好的做法是易变信息供应商、工艺、客户全部放在属性字段里不编进码段。4.4 属性字段值不统一现象同一个“单位”字段有的写“个”有的写“PCS”有的写“只”报表统计时数量对不上。原因属性字段允许自由输入没有做值域控制。解决所有属性字段尽量用下拉选择值域由主数据管理员统一维护。已经存在的不统一值做一次映射清洗比如“PCS”“只”统一映射为“个”。4.5 编码与BOM脱节现象设计部门在PLM系统里用“图号”作为物料标识ERP里用“物料编码”两套编号并行BOM导入时对不上。原因PLM和ERP没有做编码映射或者设计部门不参与物料编码规则制定。解决物料编码规则制定时设计、采购、仓储、生产、财务必须全部参与。PLM里的图号可以作为属性字段挂在物料主数据上但唯一标识必须统一用物料编码。系统对接时建立图号与物料编码的映射表。5. 进阶技巧用编码规则反推BOM健康度编码规则定好之后它不只是标识工具还能用来做数据质量监控。一个简单的技巧是通过编码的分布情况反推BOM和库存的健康度。比如统计每个中类下的物料数量。如果某个中类下物料数量异常多可能说明分类过细或者存在大量一物多码。如果某个中类下物料数量为零可能说明分类体系里有冗余节点。再比如统计编码的流水号连续性。如果流水号跳跃很大比如0001之后直接跳到0050说明中间有大量物料被删除或合并可能存在数据治理遗留问题。下面这个脚本用来做编码分布分析。import pandas as pd df pd.read_excel(cleaned_materials.xlsx) # 统计各大类物料数量 major_stats df.groupby(大类码).agg( 物料数量(物料编码, count), 中类数量(中类码, nunique) ).reset_index() # 统计各中类物料数量 minor_stats df.groupby([大类码, 中类码]).agg( 物料数量(物料编码, count) ).reset_index() # 找出物料数量异常的中类超过500或少于3 anomalies minor_stats[ (minor_stats[物料数量] 500) | (minor_stats[物料数量] 3) ] print(大类统计) print(major_stats.to_string(indexFalse)) print(\n异常中类数量500或3) print(anomalies.to_string(indexFalse)) # 检查流水号连续性 df[流水号_int] df[流水号].astype(int) df_sorted df.sort_values([大类码, 中类码, 流水号_int]) df_sorted[流水号_prev] df_sorted.groupby( [大类码, 中类码] )[流水号_int].shift(1) df_sorted[跳跃] df_sorted[流水号_int] - df_sorted[流水号_prev] gaps df_sorted[df_sorted[跳跃] 10] if len(gaps) 0: print(f\n发现 {len(gaps)} 处流水号跳跃超过10可能存在数据删除) print(gaps[[物料编码, 名称, 跳跃]].head(10).to_string(indexFalse))这段代码做了两件事一是按大类和中类统计物料数量找出异常集中或异常稀疏的分类节点二是检查流水号的连续性发现跳跃过大的记录。参数方面500和3这两个阈值需要根据你企业的物料规模调整跳跃 10也是经验值。这个分析跑完你能快速定位到分类体系里的问题区域比一条条翻物料表高效得多。我自己的习惯是每季度跑一次这个分析把异常分类和跳跃记录导出来发给各业务部门确认。有些跳跃是因为物料确实删了有些是因为分类调整时漏了记录。不管哪种查一遍心里有数。物料编码这件事定规则只是开始持续维护才是真正的功夫。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑