什么是EDI?关于电子数据交换(Electronic Data Interchange)的解释

EDI是电子数据交换的缩写,是指通过电子方式在不同的计算机系统之间交换数据的过程

探索电子数据交换(EDI)如何促进现代供应链管理

(图片由作者提供)

电子数据交换(EDI)是一种标准化的自动数据传输方法,用于计算机系统之间的数据传输。

随着供应链的数字化程度越来越高,有效的数据交换对于任何大型公司来说都是必不可少的。

系统之间相互通信的示例 - (图片由作者提供)

在复杂的供应商和分销商网络中,高效的数据通信至关重要。

EDI技术确保关键事务数据(如采购订单、发票、运输通知等)的顺畅流动。

采购管理的EDI应用 - (图片由作者提供)

在本文中,我们将揭示电子数据交换(EDI)在推动供应链运营中的关键作用,以及如何利用它来赋予数据分析能力。

我们将通过Python脚本演示EDI消息在仓库操作场景中如何转化为实际行动。

摘要I. 供应链管理中的EDI1. 任何大型企业都必备的工具2. 历史超过60年3. EDI标准4. 使用EDI的供应链流程II. 数据交换与运营管理1. 仓库操作模拟模型2. 使用Python构建模拟模型III. 商业智能的重要性1. 我们的操作对环境的影响是什么?2. 成为数据驱动的绿色组织IV. 结论

I. 供应链管理中的EDI

1. 任何大型企业都必备的工具

电子数据交换(EDI)诞生于对高效、可靠和安全数据交换的需求。

经过几十年的发展,它已经深入地成为任何大型现代企业都必备的工具。

它可以以标准化的格式自动传输业务文件。

应用示例 - (图片由作者提供)

这使得不同的系统可以使用共同的语言进行通信。

  • 一家公司想要向供应商发送包含商品信息、数量和预计交货日期的采购订单
  • 仓库想要通知承运商一个托盘已经准备好可以提货
  • 商店向中央配送中心发送补货订单

2. 历史超过60年

EDI于上世纪60年代末开发,最初用于传输航运和运输文件。

电子数据交换的简要历史 - (图片由作者提供)

多年来,EDI扩展了其功能,涵盖了各个行业,其中包括超过15万家供应链管理企业。

考虑到每天发生的大量交易,现在很难想象国际供应链在没有EDI的情况下运作。

3. EDI标准

EDI基于在多个地理位置使用的不同行业建立的标准运作。

行业和地理位置的标准非详尽列表 - (作者提供的图片)

然而,有两个主要的标准

  • ANSI X12:主要用于北美
  • EDIFACT:由联合国创建并在国际上使用

这些标准定义了EDI消息中的字符串格式和包含的信息。

它们确保在各个系统之间对数据的解释具有一致性。

将购买订单翻译为EDI消息的示例 - (作者提供的图片)

在上面的示例中,采购订单被翻译为EDI消息进行传输

  • 订单由采购团队创建并由供应商接收
  • 订单信息包括客户、供应商、交货地址和日期、发票地址以及有关订购物品的详细信息
  • 发票、交货和公司信息使用ID进行映射(公司ID,位置ID,…)

4. 使用EDI的供应链过程

随着供应链运营的复杂化,EDI消息成为关键事件的通信支柱,例如:

  • 入库货物到达仓库
  • 货物上架
  • 正在执行的拣货订单
  • 取消的出库货物

EDI消息使物流运营保持正常运转。

为了说明这个想法,我们将使用Python模拟创建和传输用于仓库运营管理的EDI消息。

II. 数据交换和运营管理

1. 仓库操作模拟模型

在我们的Python脚本中,我们将从EDI消息交换的角度复制几个仓储过程

  • 包含SKU和数量的入库货物消息
  • 包含SKU和上架位置的上架确认消息
物流运营 - (作者提供的图片)

这些消息使ERP和仓库管理系统(WMS)同步,提高效率并减少错误。

  • 消息1:通知仓库团队即将通过WMS(ERP -> WMS)进行入库的货物
  • 消息2:仓库团队通知分销计划团队已将托盘放置到库存中并准备好进行订购(WMS -> ERP)

2. 使用Python构建模拟模型

让我们使用EDI标准ANSI X12模拟这些消息交换

  1. 入库:货物在仓库收到EDI消息(仓库发货订单 – 940)通知仓库即将到达的货物及其详细信息。
  2. 上架:在收到货物后,货物存储在特定位置,ERP返回确认EDI消息(仓库库存转移收据建议 – 944)以确认上架。
  3. 拣货:对于订单,从存储位置中拣选物品,EDI消息(仓库发货订单 – 940)可用于指示仓库拣选哪些物品。
  4. 出库:发货给客户,EDI消息(仓库发货通知 – 945)发送给ERP以确认货物已发货。

这是Python脚本的简化版本,

# 作者: Samir Saci# 注意: 该脚本已经为教育目的进行了简化。class EDIMessage:    def __init__(self, message_id):        self.message_id = message_id        self.content = ""    def add_segment(self, segment):        self.content += segment + "\n"    def get_message(self):        return f"ST*{self.message_id}*1\n{self.content}SE*2*1"class Warehouse:    def __init__(self):        self.inventory = {}    def receive_inbound(self, message):        lines = message.content.split("\n")        for line in lines:            if line.startswith("N1"):                _, _, sku, quantity, unit = line.split("*")                self.inventory[sku] = self.inventory.get(sku, 0) + int(quantity)        print("收到入库货物:\n", message.content)    def process_putaway(self, sku):        message = EDIMessage("944")        if sku in self.inventory:            message.add_segment(f"N1*ST*{sku}*{self.inventory[sku]}*个")            print("上架确认:\n", message.get_message())            return message        else:            print("库存中找不到该商品。")    def process_picking(self, message):        lines = message.content.split("\n")        for line in lines:            if line.startswith("N1"):                _, _, sku, quantity, unit = line.split("*")                if self.inventory[sku] >= int(quantity):                    self.inventory[sku] -= int(quantity)                else:                    print(f"商品 {sku} 的数量不足")        print("处理拣货订单:\n", message.content)    def process_outbound(self, picking_message):        message = EDIMessage("945")        lines = picking_message.content.split("\n")        for line in lines:            if line.startswith("N1"):                _, _, sku, quantity, unit = line.split("*")                message.add_segment(f"N1*ST*{sku}*{quantity}*箱")        print("出库货物确认:\n", message.get_message())        return message

初始化模型并创建入库订单

  • 以纸箱形式收到的2个不同的商品
  • {数量1: 50个, 数量2: 40个}
# 初始化模型warehouse = Warehouse()# 入库处理inbound_message = EDIMessage("940")inbound_message.add_segment("N1*ST*SKU123*50*个")inbound_message.add_segment("N1*ST*SKU124*40*个")warehouse.receive_inbound(inbound_message)print("SKU123 的库存: {} 个".format(warehouse.inventory["SKU123"]))print("SKU124 的库存: {:,} 个".format(warehouse.inventory["SKU124"]))

输出结果如下,

N1*ST*SKU123*50*个N1*ST*SKU124*40*个SKU123 的库存: 50 个SKU124 的库存: 40 个
  • 已传输的两条消息
  • 收到货物的库存已根据收到的数量进行了更新

上架确认

# 上架处理warehouse.process_putaway("SKU123")
  • 此消息发送了一个针对“SKU123”的上架确认
ST*944*1N1*ST*SKU123*50*个SE*2*1

拣货订单和出库货物

  • 两个商品的拣货数量低于库存水平
# 拣货处理 (为订单拣货)picking_message = EDIMessage("940")picking_message.add_segment("N1*ST*SKU123*10*个")picking_message.add_segment("N1*ST*SKU124*5*个")warehouse.process_picking(picking_message)print("SKU123 的库存: {} 个".format(warehouse.inventory["SKU123"]))print("SKU124 的库存: {:,} 个".format(warehouse.inventory["SKU124"]))# 出库处理 (发货)warehouse.process_outbound()

输出结果,

N1*ST*SKU123*10*个N1*ST*SKU124*5*个SKU123 的库存: 40 个SKU124 的库存: 35 个ST*945*1N1*ST*SKU123*10*个N1*ST*SKU124*5*个SE*2*1
  • 2个拣货订单,其中“SKU123”有10个箱子,“SKU124”有5个箱子
  • 库存已更新
  • 发货订单正在使用拣货数量

错误检测与处理

我们引入这个模型并不仅仅是为了编码。

这个想法是要了解在编写或读取消息时如何创建各种检查来处理错误。

EDI并不免于数据质量问题,如

  • 缺少数据、错误的数据格式、无效的代码等
  • 逻辑不一致导致重大运营中断

因此,实施强大的数据检查和验证对于确保电子数据交换的准确性和可靠性至关重要。

接收订单的错误处理示例

def receive_inbound(self, message):    lines = message.content.split("\n")    for line in lines:        if line.startswith("N1"):            try:                _, _, sku, quantity, unit = line.split("*")                                # SKU或数量缺失                if not sku or not quantity:                    print("错误:SKU或数量缺失。")                    return                                # 数量为整数                quantity = int(quantity)                               # 负数或零的数量                if quantity <= 0:                    print("错误:数量必须为正数。")                    return                self.inventory[sku] = self.inventory.get(sku, 0) + quantity            except ValueError:                print("错误:数据格式不正确。")                return                print("接收入库货物:\n", message.content)

这段代码是:

  • 检查整数格式的数量是否缺失
  • 验证所有数量是否为正数
  • 如果需要,引发错误

使用Python,您可以支持基础设施团队自动化测试新EDI消息的开发。

III. EDI对数据分析的威力

通过连接多样化的计算机系统,EDI不仅支持日常运营,还作为数据分析的真正宝库。

每个EDI交易都携带着宝贵的信息,

  • 时间戳、位置和原因代码,提供货物的可追溯性和过程(es)性能的衡量
  • 数量、价格和物料信息,可用于建模物料、财务和信息流
什么是供应链分析?—(作者提供的图像)

这些宝贵的数据来源可用于

  • 描述过去的事件:描述性分析
  • 分析缺陷和事件:诊断性分析
  • 预测未来事件:预测性分析
  • 设计最佳流程和决策:指导性分析

让我们深入了解每种类型的分析,以了解它们如何依赖良好的EDI基础设施。

描述性和诊断性分析

描述性分析是了解过去发生了什么。

通过正确设置EDI消息,我们可以将历史交易数据映射到获得过去绩效的见解。

使用时间戳跟踪的分销过程示例—(作者提供的图像)

例如,EDI消息可以在您的分销链的每个阶段更新状态

  1. 每个事件与时间戳相关联(从订单创建到店铺交付)
  2. 实际时间戳可以与预期时间戳进行比较
  3. 然后可以分析延迟以找出根本原因
预期与实际时间每个过程的差异—(作者提供的图像)
  • 预计时间是根据与运营团队达成的目标交货时间计算的
  • ERP、WMS、货运代理系统和商店管理系统都使用EDI通信时间戳

使用商业智能工具,您可以收集和处理这些时间戳,创建自动报告跟踪分销链上的货物。

💡 更多细节

什么是供应链控制塔?,Samir Saci,Towards Data Science

供应链管理中的数字孪生

我们谈论的是一个代表供应链中涉及的各种组件和过程的计算机模型,包括分销中心、运输网络和制造设施。

使用Python的简单数字孪生 —(作者提供的图片)

EDI交易可以帮助您提供实时数据,以保持数字孪生的更新。

使用Python构建的简单数字孪生的示例 —(作者提供的图片)

假设您已经构建了一个简单的数字孪生,其中包括:

  • 模拟运输、商店、仓库和工厂操作的模型
  • 沿着链路复制信息和货物流动的连接

您可以将EDI流量连接到:

  • 仓库模型,估计在EDI消息中接收的订单批次的提取时间
  • 工厂模型,将订单数量与实际生产能力进行比较

这是一个很好的工具,可以使用通过EDI传递的真实订单模拟和分析不同的场景,而不会干扰实际操作。

💡 更多细节

什么是供应链数字孪生?,Samir Saci,Towards Data Science

什么是供应链分析?,Samir Saci,Towards Data Science

结论

了解电子数据交换(EDI)在供应链管理中的作用,可以让我们了解数据传输对现代业务运营的重要性。

电子数据交换作为一个关键技术,为各种计算机系统之间的高效通信提供了基础。

随着您的行业继续拥抱数字化,EDI将成为您转型之旅中的战略组成部分。

参考资料

  • FIPS PUB 161–2:电子数据交换(EDI),国家标准与技术研究院
  • 什么是供应链数字孪生?,Samir Saci,Towards Data Science
  • 什么是供应链分析?,Samir Saci,Towards Data Science