
InvenTree TME 条码插件实战指南自动识别 TME 产品条码的集成方案【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTreeInvenTree 是一个开源库存管理系统其内置插件机制允许通过扫描供应商条码自动识别入库物料。本文聚焦其中的TME Barcode PluginTME 条码插件讲解它如何解析 TME 官网tme.eu产品包装上的 QR Code 与 DataMatrix 条码、将条码字段映射为 InvenTree 内部数据、并据此匹配供应商零件与采购订单。读完本文你将掌握该插件的激活配置流程、底层条码解析与匹配原理、以及可验证的测试用例能够在自己的 InvenTree 实例中复现这套扫码收货工作流。插件功能定位TME Barcode Plugin 为 TME 产品提供条码支持。当从 TME 收到物料时扫描产品包装上的条码即可在 InvenTree 中自动识别该产品无需手动录入零件编号、订单号等信息。该插件属于 InvenTree 的内置供应商条码插件家族与 DigiKey、Mouser、LCSC 同类其设计遵循一个关键约束——Barcode Plugins 索引文档 明确指出这些插件只处理条码内的数据本身不与其供应商网站或 API 进行任何集成。条码数据用于根据插件设置匹配 InvenTree 中已存在的产品。也就是说扫描识别是纯离线、纯本地数据匹配的条码里有什么字段插件就解析什么字段再拿着这些字段去数据库里查找对应的SupplierPart供应商零件。从源码看插件的类定义位于 tme.py完整声明如下class TMEPlugin(SupplierBarcodeMixin, SettingsMixin, InvenTreePlugin): NAME TMEBarcodePlugin SLUG tmeplugin TITLE _(Supplier Integration - TME) DESCRIPTION _(Provides support for scanning TME barcodes) VERSION 1.0.1 AUTHOR _(InvenTree contributors)它同时继承了三个基类InvenTreePlugin插件基础、SettingsMixin提供可配置设置项以及SupplierBarcodeMixin提供供应商条码解析与匹配的默认实现。底层架构SupplierBarcodeMixin 解析管线官方文档说明该插件实现了 BarcodeMixin mixin 以提供自定义条码支持。在源码中SupplierBarcodeMixin定义于 mixins.py它继承自BarcodeMixin职责是为供应商条码的扫描函数提供默认实现自定义供应商条码插件只需实现extract_barcode_fields一个方法。SupplierBarcodeMixin定义了一套标准字段名常量作为各供应商条码字段与 InvenTree 内部数据的统一中间语言常量内部字段名含义CUSTOMER_ORDER_NUMBERcustomer_order_number客户订单号SUPPLIER_ORDER_NUMBERsupplier_order_number供应商订单号PACKING_LIST_NUMBERpacking_list_number装箱单号SHIP_DATEship_date发货日期CUSTOMER_PART_NUMBERcustomer_part_number客户零件号SUPPLIER_PART_NUMBERsupplier_part_number供应商零件号SKUPURCHASE_ORDER_LINEpurchase_order_line采购订单行QUANTITYquantity数量DATE_CODEdate_code日期代码LOT_CODElot_code批次代码COUNTRY_OF_ORIGINcountry_of_origin原产国MANUFACTURERmanufacturer制造商MANUFACTURER_PART_NUMBERmanufacturer_part_number制造商零件号MPN整个条码处理管线分为两层解析层extract_barcode_fields(barcode_data)将原始条码字符串解析成上述标准字段字典匹配层get_supplier_part()、get_manufacturer_part()等方法基于解析出的字段结合插件配置的供应商到数据库中查询唯一的匹配记录。TME 插件只在解析层做了高度定制因为它面对的条码格式特殊匹配层则完全复用 mixin 的通用实现。激活与供应商关联配置第一步激活插件TME 插件是一个可选optional插件默认未启用必须先在 InvenTree 管理后台admin center中启用。官方文档中的激活说明如下This plugin is anoptionalplugin, and must be enabled in the InvenTree admin center.在测试代码 test_supplier_barcodes.py 中也体现了这一前提——所有扫描测试的第一步都是通过插件注册表将插件状态置为启用registry.set_plugin_state(tmeplugin, True)其中tmeplugin正是TMEPlugin.SLUG。只有启用后条码扫描接口才会把条码数据路由给该插件处理。第二步在插件设置中指定供应商激活后用户必须在插件设置里指定该插件关联的供应商supplier从设置页的下拉列表中选择对应的供应商条目。在源码层面这个设置项由SettingsMixin的SETTINGS字典声明DEFAULT_SUPPLIER_NAME TME SETTINGS { SUPPLIER_ID: { name: _(Supplier), description: _(The Supplier which acts as TME), model: company.company, model_filters: {is_supplier: True}, } }关于SUPPLIER_ID这个设置项需要注意三点model: company.company设置值关联到公司Company模型model_filters: {is_supplier: True}下拉列表只展示被标记为供应商is_supplierTrue的公司避免误选普通客户或制造商匹配隔离插件只会在这个供应商的范围内查找SupplierPart从而确保不同供应商的同名 SKU 互不干扰。自动猜测供应商的兜底逻辑SupplierBarcodeMixin.get_supplier()还实现了自动猜测逻辑mixins.py如果SUPPLIER_ID未设置它会用DEFAULT_SUPPLIER_NAME TME做名称模糊匹配name__icontains且要求is_supplierTrue只有当匹配到的供应商恰好只有一个时才会自动写入SUPPLIER_ID并返回该供应商否则返回None。这个兜底逻辑降低了一开始就手动指定供应商的配置负担。支持的 TME 条码格式与字段映射TME 插件最核心的技术价值在于extract_barcode_fields()它同时支持三种条码形态并按优先级依次判定tme.pydef extract_barcode_fields(self, barcode_data: str) - dict[str, str]: barcode_fields {} if self.TME_IS_QRCODE_REGEX.fullmatch(barcode_data): # 1) TME 自定义 QR Code 格式 for item in barcode_data.split( ): if : in item: key, value item.split(:) if key in self.TME_QRCODE_FIELDS: barcode_fields[self.TME_QRCODE_FIELDS[key]] value elif self.TME_IS_OLD_BARCODE2D_REGEX.fullmatch(barcode_data): # 2) TME 旧版 2D 条码格式 for item in barcode_data.split( ): for k, v in self.ecia_field_map().items(): if item.startswith(k): barcode_fields[v] item[len(k):] else: # 3) 标准 ECIA / ISO-IEC 15434 2D 条码 barcode_fields self.parse_ecia_barcode2d(barcode_data) # 订单号特殊处理 if SupplierBarcodeMixin.SUPPLIER_ORDER_NUMBER in barcode_fields: order_number barcode_fields[SupplierBarcodeMixin.SUPPLIER_ORDER_NUMBER] order_number order_number.split(/)[0] barcode_fields[SupplierBarcodeMixin.SUPPLIER_ORDER_NUMBER] order_number return barcode_fields格式一TME 自定义 QR CodeTME 新版产品标签使用自定义 QR Code典型内容如下来自测试用例TME_QRCODEQTY:1 PN:WBP-302 PO:19361337/1 CPO:PO-2023-06-08-001337 MFR:WISHERENTERPRI SE MPN:WBP-302 RoHS https://www.tme.eu/details/WBP-302判断依据是正则TME_IS_QRCODE_REGEX([^\s:]:[^\s:]\s)(\S(\s|$))。解析时按空格切分遇到含:的字段段再做键值拆分最终通过TME_QRCODE_FIELDS映射为 InvenTree 标准字段TME 条码字段映射到的标准字段含义PNsupplier_part_number供应商零件号SKUCPOcustomer_order_number客户订单号POsupplier_order_number供应商订单号MPNmanufacturer_part_number制造商零件号QTYquantity数量注意测试样本中的RoHS、MFR、URL 等非映射字段会被安全忽略不会进入结果字典也不会导致解析失败。格式二TME 旧版 2D 条码TME 旧款包装使用另一种 2D 条码典型内容如下来自测试用例TME_DATAMATRIX_CODEPWBP-302 1PMPNWBP-302 Q1 K19361337/1该格式由正则TME_IS_OLD_BARCODE2D_REGEX(([^\s])(\s|$))识别会匹配几乎所有空格分隔内容所以它排在 QR Code 判定之后作为第二优先级。解析逻辑与 ECIA 格式共用同一张字段映射表ecia_field_map()逐项检查每个空格分隔的字段段是否以映射表中的前缀开头若命中则去掉前缀得到字段值。对照 ECIA 映射表完整定义见 mixins.py上面的样本可拆解为PWBP-302→ 前缀P→supplier_part_number WBP-3021PMPNWBP-302→ 前缀1P→manufacturer_part_number MPNWBP-302Q1→ 前缀Q→quantity 1K19361337/1→ 前缀K→customer_order_number 19361337/1格式三标准 ECIA / ISO-IEC 15434 2D 条码若前两种正则都不匹配插件会回退到行业通用的 ECIA 规范 2D 条码解析parse_ecia_barcode2d该规范参考 ECIA 官方文档同时支持 ISO/IEC 15434 格式。这类条码以固定头[)\x1e06\x1d开始、以\x1e\x04结尾字段之间以\x1d分隔。标准 ECIA 字段前缀映射表ecia_field_map()如下这也是 TME 旧版条码解析所复用的同一张表条码前缀标准字段Kcustomer_order_number1Ksupplier_order_number11Kpacking_list_number6Dship_date9D/10Ddate_code4K/14Kpurchase_order_lineP/30Psupplier_part_number1Pmanufacturer_part_number1Tlot_code4Lcountry_of_origin1VmanufacturerQquantity订单号的归一化处理无论走哪条解析分支extract_barcode_fields()最后都会对supplier_order_number供应商订单号做一次归一化取其/之前的部分。例如样本中的PO:19361337/1会被归一化为19361337。这样做的目的是剥离 TME 订单号中形如/1的订单行后缀使订单号能与 InvenTree 中采购订单的supplier_reference精确对齐。条码匹配与扫码收货流程供应商零件匹配get_supplier_part解析出标准字段后SupplierBarcodeMixin.get_supplier_part()负责完成数据库匹配mixins.py其匹配策略为必须至少具备 SKUsupplier_part_number或 MPNmanufacturer_part_number否则直接返回None若插件配置了供应商则先按supplier过滤SupplierPart实现供应商间隔离若有 SKU则按SKU精确过滤若过滤后仍有多个结果且存在 MPN则进一步按manufacturer_part__MPN收窄范围要求唯一匹配——只有恰好命中一条SupplierPart时才返回多匹配或零匹配都返回None。扫码接口与采购收货SupplierBarcodeMixin将上述能力封装为scan()/scan_receive_item()等默认扫描实现。在 InvenTree 中前端扫码后请求条码扫描 APIapi-barcode-scan插件注册表会按顺序让已启用的供应商条码插件尝试解析匹配成功后返回插件名、供应商零件乃至库存项信息。当条码包含采购订单信息如 TME 条码中的PO字段时还可走api-barcode-po-receive流程直接按采购订单收货入库。测试类SupplierBarcodePOReceiveTeststest_supplier_barcodes.py覆盖了该流程的关键规则采购订单必须已下达placed否则拒绝收货并提示 received against an order marked as...同一物料不可重复收货第二次会返回Item has already been received库存入库位置按请求指定位置 → 订单行目标位置 → 零件默认位置的优先级解析条码缺失数量字段时接口返回action_required并预填剩余待收数量用户需具备purchase_order.add角色权限否则返回 403。测试验证插件行为的可靠依据TME 插件的解析行为有明确的自动化测试保障位于 test_supplier_barcodes.pytest_tme_qrcodePOSTTME_QRCODE到扫描接口断言响应中的plugin为TMEBarcodePlugin并匹配到SKU WBP-302的供应商零件test_tme_barcode2dPOSTTME_DATAMATRIX_CODE旧版 2D 条码样本同样解析成功并匹配WBP-302。测试数据里两种条码格式都能解析出相同的 SKU这验证了extract_barcode_fields中QR Code 优先、旧 2D 次之、ECIA 兜底的多分支设计的正确性。你可以直接复用这两个样本QTY:1 PN:WBP-302 PO:19361337/1 ...与PWBP-302 1PMPNWBP-302 Q1 K19361337/1在自己的实例上验证插件是否正常工作。集成前提与限制前置数据TME 插件只做条码解析与本地匹配不会自动创建供应商、供应商零件或采购订单。扫描前必须在 InvenTree 中预先创建好 TME 供应商供应商文档、对应的SupplierPartSKU 需与条码中的PN一致以及已下达的采购订单。无网络集成插件不访问 TME API条码中的 URL 等字段仅作为文本出现不会被请求或校验。启用状态插件必须先在管理后台启用并在设置中关联供应商或满足自动猜测条件否则扫描不会命中该插件。小结TME Barcode Plugin 是 InvenTree扫码收货体系中的一块拼图它用约七十行核心逻辑tme.py优雅地兼容了 TME 自定义 QR Code、旧版 2D 条码与行业标准 ECIA 条码三种格式再借助SupplierBarcodeMixin的通用匹配层完成供应商零件与采购订单的自动关联。理解这套解析字段 → 标准字段映射 → 数据库唯一匹配的管线不仅能帮你正确配置 TME 扫描流程也能为开发其他供应商条码插件提供直接参考——只需继承SupplierBarcodeMixin并实现自己的extract_barcode_fields即可。【免费下载链接】InvenTreeOpen Source Inventory Management System项目地址: https://gitcode.com/GitHub_Trending/in/InvenTree创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考