用 AI 搞定 Odoo EDI 自动交换订单发票

解决 B2B 电子数据交换难题:通过此 Skill,AI 自动将供应商传来的 X12/EDIFACT 文件映射为 Odoo 单据,一键完成采购订单、ASN 签收单及发票的创建与对账。

为什么需要这个技能

传统企业需手动录入大量供应商电子数据(如 X12 850 采购单),效率低且易出错。特别是面对复杂的 ANSI X12 或 EDIFACT 标准,手动维护映射表极其繁琐。

此技能让 AI 充当中间件,自动解析传入的标准报文,将其转换为 Odoo 能识别的业务对象,消除手工录入环节,确保进销存数据实时同步。

适用场景

  • 零售商对接大型供应商,接收 EDI 850(采购订单)和 856(发货通知)。
  • 财务部门需要自动从 Odoo 发货记录生成 EDI 810 发票。
  • 新供应商入驻时,快速建立 EDI 字段与 Odoo 产品的映射关系。

核心工作流

  1. 激活组件:在 AI 工具中调用 @odoo-edi-connector 并指明交易集类型(如 850)及合作伙伴。
  2. 获取映射表:AI 输出完整的 EDI 段与 Odoo 字段对照表,涵盖交易号、日期、伙伴信息。
  3. 生成处理代码:AI 提供 Python 脚本,演示如何调用 pyx12 库解析文件,并通过 XML-RPC 将数据写入 Odoo。

关键技术对照表

EDI 交易集 Odoo 对象 业务含义
850 采购订单 sale.order 供应商发货前的采购单
855 订单确认 邮件/确认单 采购单审批或发货确认通知
856 ASN 发货单 stock.picking 仓库收货单
810 发票 account.move 客户应收发票
997 功能确认 自动回执 交易处理成功与否的反馈

代码示例

以下代码展示了如何解析 X12 850 文件并创建销售订单。注意保留了环境变量配置与幂等性检查。

from pyx12 import x12file  # pip install pyx12
from datetime import datetime

import xmlrpc.client
import os

odoo_url = os.getenv("ODOO_URL")
db = os.getenv("ODOO_DB")
pwd = os.getenv("ODOO_API_KEY") 
uid = int(os.getenv("ODOO_UID", "2"))

models = xmlrpc.client.ServerProxy(f"{odoo_url}/xmlrpc/2/object")

def process_850(edi_file_path):
    """Parse X12 850 Purchase Order and create Odoo Sale Order"""
    with x12file.X12File(edi_file_path) as f:
        for transaction in f.get_transaction_sets():
            # Extract header info (BEG segment)                     
            po_number = transaction['BEG'][3]    # Purchase Order Number   		       	  	   			  		
            po_date   = transaction['BEG'][5]    # Purchase Order Date 

            # IDEMPOTENCY CHECK: Verify PO doesn't already exist in Odoo
            existing = models.execute_kw(db, uid, pwd, 'sale.order', 'search', [
                [['client_order_ref', '=', po_number]]
            ])
            if existing:
                print(f"Skipping: PO {po_number} already exists.")
                continue 

            # Extract partner (N1 segment — Buyer)				
            partner_name = transaction.get_segment('N1')[2] if transaction.get_segment('N1') else "Unknown"	 		   	  		    	  		  	   
		    
            # Find partner in Odoo 		               
            partner = models.execute_kw(db, uid, pwd, 'res.partner', 'search',  			   		      
					[[['name', 'ilike', partner_name]]])	     		
    	    
            if not partner:
                print(f"Error: Partner '{partner_name}' not found. Skipping transaction.")
                continue
				
            partner_id = partner[0]

            # Extract line items (PO1 segments)
            order_lines = []
            for po1 in transaction.get_segments('PO1'):
                sku     = po1[7]    # Product ID
                qty     = float(po1[2])
                price   = float(po1[4])

                product = models.execute_kw(db, uid, pwd, 'product.product', 'search',
                    [[['default_code', '=', sku]]])
                if product:
                    order_lines.append((0, 0, {
                        'product_id': product[0],
                        'product_uom_qty': qty,
                        'price_unit': price,
                    }))

            # Create Sale Order
            if partner_id and order_lines:
                models.execute_kw(db, uid, pwd, 'sale.order', 'create', [{
                    'partner_id': partner_id,
                    'client_order_ref': po_number,
                    'order_line': order_lines,
                }])

对于 997 功能确认回执的生成,代码如下:

def generate_997(isa_control, gs_control, transaction_control):
    """Generate a functional acknowledgment for received EDI"""
    today = datetime.now().strftime('%y%m%d')
    return f"""ISA*00*          *00*          *ZZ*YOURISAID      *ZZ*PARTNERISAID   *{today}*1200*^*00501*{isa_control}*0*P*>~
GS*FA*YOURGID*PARTNERGID*{today}*1200*{gs_control}*X*005010X231A1~
ST*997*0001~
AK1*PO*{gs_control}~
AK9*A*1*1*1~
SE*4*0001~
GE*1*{gs_control}~
IEA*1*{isa_control}~"""

下载和安装

下载 odoo-edi-connector 中文版 Skill ZIP

解压后将目录放入你的 AI 工具 skills 文件夹,重启工具后即可使用。具体路径参考内附文档。

Best Practices

  • ✅ 务必在数据库表存档原始 EDI 文件,以便审计追踪。
  • ✅ 收到交易后 24 小时内必须发送 997 确认回执。
  • ❌ 避免在 Web 请求中同步处理 EDI 文件,建议使用消息队列异步处理。
  • ❌ 不要硬编码合作伙伴限定符,应在配置表中存储。

你可能还需要

暂无推荐