You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用EdiFabric创建自定义信封解析带DXS/DXE的DEX 894/895文件

DEX(Direct Exchange)是电子数据交换(EDI)的一种形式,由直接门店配送(DSD)经销商用于在配送时向零售商电子发送配送信息、发票或贷项通知单。DEX是行业标准,任何具备DEX能力的供应商均可向具备DEX能力的零售商电子发送发票,无论双方使用何种DEX软件。DEX已存在多年,被所有大型杂货零售商及众多小型连锁和便利店使用。

在EdiFabric中解析带DXS/DXE信封的DEX格式X12 894/895

DEX使用自定义的DXS(起始信封)和DXE(结束信封)包裹标准X12 894/895消息,与常规X12的ISA/GS信封体系不同。以下是两种在EdiFabric中处理这类文件的方法:


方法一:预处理拆分信封(快速落地)

无需修改EdiFabric核心逻辑,先提取出中间的标准X12内容再解析:

  1. 读取完整的DEX传输文本,按换行分割成行
  2. 定位从ST开头行到DXE开头行之前的所有内容,这部分就是标准X12消息
  3. 将提取出的内容拼接后,用EdiFabric的X12阅读器解析

示例代码(C#)

var dexRawContent = File.ReadAllText("dex_serial_input.txt");
var allLines = dexRawContent.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);

var x12MessageLines = new List<string>();
bool captureX12 = false;

foreach (var line in allLines)
{
    if (line.StartsWith("ST*"))
    {
        captureX12 = true;
        x12MessageLines.Add(line);
    }
    else if (line.StartsWith("DXE*"))
    {
        captureX12 = false;
        break;
    }
    else if (captureX12)
    {
        x12MessageLines.Add(line);
    }
}

// 拼接成可直接解析的X12文本
var x12Content = string.Join(Environment.NewLine, x12MessageLines);

// 解析894/895
using var x12Reader = new X12Reader(x12Content, new X12ReaderSettings { SkipTrailingSeparators = true });
while (x12Reader.Read())
{
    if (x12Reader.Message is EdiFabric.Core.Model.Edi.X12.M894 deliveryShipment)
    {
        // 处理配送装运(894)数据
        var shipmentId = deliveryShipment.G82?.ShipmentIdentificationNumber;
    }
    else if (x12Reader.Message is EdiFabric.Core.Model.Edi.X12.M895 invoice)
    {
        // 处理发票(895)数据
    }
}

方法二:自定义信封规则(原生支持)

如果需要EdiFabric直接识别DXS/DXE信封,可自定义信封类并配置阅读器:

1. 创建DXS和DXE信封实体类

using EdiFabric.Core.Annotations.Edi;
using EdiFabric.Core.Model.Edi;

[EdiSegment, EdiPath("DXS")]
public class DXS_Envelope : EdiSegment
{
    [EdiValue("X(10)", Path = "DXS/0", Mandatory = true)]
    public string SenderId { get; set; }

    [EdiValue("X(2)", Path = "DXS/1", Mandatory = true)]
    public string TransactionTypeCode { get; set; }

    [EdiValue("X(10)", Path = "DXS/2", Mandatory = true)]
    public string VersionReleaseIdentifier { get; set; }

    [EdiValue("X(5)", Path = "DXS/3", Mandatory = true)]
    public string ReceiverId { get; set; }

    [EdiValue("X(10)", Path = "DXS/4", Mandatory = true)]
    public string SenderReferenceNumber { get; set; }

    [EdiValue("X(1)", Path = "DXS/5", Mandatory = false)]
    public string ProcessingIndicator { get; set; }
}

[EdiSegment, EdiPath("DXE")]
public class DXE_Envelope : EdiSegment
{
    [EdiValue("X(5)", Path = "DXE/0", Mandatory = true)]
    public string ReceiverId { get; set; }

    [EdiValue("X(1)", Path = "DXE/1", Mandatory = true)]
    public string TransactionCount { get; set; }
}

2. 配置自定义阅读器

指定DXS为起始信封、DXE为结束信封,同时解析内部X12消息:

using EdiFabric.Framework.Readers;

var readerSettings = new ReaderSettings();
// 添加自定义信封的起始/结束标识
readerSettings.EnvelopeStartSegments.Add("DXS");
readerSettings.EnvelopeEndSegments.Add("DXE");

using var customReader = new EdiReader("dex_transmission.txt", readerSettings);
while (customReader.Read())
{
    // 读取DXS信封
    if (customReader.Segment is DXS_Envelope dxs)
    {
        var senderId = dxs.SenderId;
        var version = dxs.VersionReleaseIdentifier;
    }
    // 读取X12 894消息
    else if (customReader.Message is EdiFabric.Core.Model.Edi.X12.M894 m894)
    {
        // 处理894数据
    }
    // 读取X12 895消息
    else if (customReader.Message is EdiFabric.Core.Model.Edi.X12.M895 m895)
    {
        // 处理895数据
    }
    // 读取DXE信封
    else if (customReader.Segment is DXE_Envelope dxe)
    {
        var transactionCount = dxe.TransactionCount;
        // 可校验内部消息数量是否与DXE中的计数一致
    }
}

关键注意事项

  • DEX使用的X12版本多为005010UCS,确保EdiFabric解析器配置对应版本
  • 串口传入的DEX数据流需先解码为文本(如ASCII编码)再处理
  • 若DXE包含事务计数,建议验证其与实际解析出的X12消息数量是否匹配

内容的提问来源于stack exchange,提问作者dirq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:28:10