用 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 产品的映射关系。
核心工作流
- 激活组件:在 AI 工具中调用
@odoo-edi-connector并指明交易集类型(如 850)及合作伙伴。 - 获取映射表:AI 输出完整的 EDI 段与 Odoo 字段对照表,涵盖交易号、日期、伙伴信息。
- 生成处理代码: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 文件,建议使用消息队列异步处理。
- ❌ 不要硬编码合作伙伴限定符,应在配置表中存储。
你可能还需要
暂无推荐