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

如何为Smooks中UNEdifactInterchange41对象添加UNH头实现MSCONS导出?

解决Smooks生成MSCONS时添加UNH头的问题

我之前在使用Smooks的UN/EDIFACT D16B库生成MSCONS消息时,也碰到过同样的困惑——UNB是整个交换的头,而UNH是单个消息的头,不能直接加到UNEdifactInterchange41对象上,得和具体的MSCONS消息绑定。下面是具体的实现步骤和完整代码示例:

核心思路

UNH(Message Header)属于每个独立的EDIFACT消息(这里就是MSCONS),所以需要:

  1. 创建UNH41对象并设置必要属性(消息编号、类型、版本等)
  2. 将UNH41关联到MSCONS的MessageHeader中
  3. 把带UNH头的MSCONS消息添加到Interchange里

完整代码示例

import org.milyn.edi.unedifact.d16b.D16BInterchangeFactory;
import org.milyn.edi.unedifact.d16b.MSCONS.MSCONS;
import org.milyn.edi.unedifact.d16b.MSCONS.MessageHeader;
import org.milyn.smooks.edi.unedifact.model.r41.UNB41;
import org.milyn.smooks.edi.unedifact.model.r41.UNEdifactInterchange41;
import org.milyn.smooks.edi.unedifact.model.r41.UNH41;

import java.io.IOException;
import java.io.StringWriter;

public class MSCONSGenerator {
    public static void main(String[] args) throws IOException {
        // 初始化D16B交换工厂
        D16BInterchangeFactory interchangeFactory = D16BInterchangeFactory.getInstance();

        // 构建UNB交换头(你已经实现的部分,这里补充示例)
        UNB41 unbHeader = new UNB41();
        unbHeader.setSyntaxIdentifier("UNOC");
        unbHeader.setSyntaxVersionNumber("3");
        unbHeader.setSenderIdentification("YOUR_SENDER_ID");
        unbHeader.setRecipientIdentification("TARGET_RECEIVER_ID");
        unbHeader.setDateOfPreparation("240520"); // 格式:YYMMDD
        unbHeader.setTimeOfPreparation("1430");   // 格式:HHMM

        // 创建交换对象并绑定UNB头
        UNEdifactInterchange41 interchange = new UNEdifactInterchange41();
        interchange.setUnb(unbHeader);

        // --------------------------
        // 重点:构建MSCONS消息并添加UNH头
        // --------------------------
        MSCONS msconsMessage = new MSCONS();

        // 创建UNH消息头
        UNH41 unhHeader = new UNH41();
        unhHeader.setMessageReferenceNumber("MSCONS_0001"); // 唯一消息编号,自定义
        // 对应D16B版本的MSCONS消息标识
        unhHeader.setMessageTypeIdentifier("MSCONS");
        unhHeader.setMessageTypeVersionNumber("D");
        unhHeader.setMessageTypeReleaseNumber("16B");
        unhHeader.setControllingAgencyCoded("UN");
        unhHeader.setAssociationAssignedCode(""); // 无特殊需求可留空

        // 将UNH绑定到MSCONS的MessageHeader
        MessageHeader msconsMsgHeader = new MessageHeader();
        msconsMsgHeader.setUNH41(unhHeader);
        msconsMessage.setMessageHeader(msconsMsgHeader);

        // --------------------------
        // 补充MSCONS的业务数据(比如能源值相关字段)
        // --------------------------
        // 这里根据你的业务需求添加具体的Segment,例如:
        // - 能源计量数量(QTY段)
        // - 日期时间(DTM段)
        // - 产品信息(LIN段)
        // ...

        // 将MSCONS消息添加到交换对象
        interchange.addMessage(msconsMessage);

        // 生成最终的EDIFACT字符串
        StringWriter outputWriter = new StringWriter();
        interchangeFactory.write(interchange, outputWriter);

        // 输出结果
        System.out.println("生成的MSCONS EDIFACT内容:");
        System.out.println(outputWriter.toString());
    }
}

关键注意事项

  • UNH的唯一性:如果在同一个Interchange里添加多个MSCONS消息,每个消息的MessageReferenceNumber必须唯一。
  • 版本匹配:UNH里的MessageTypeVersionNumber和MessageTypeReleaseNumber必须和你使用的D16B版本对应,不能写错,否则接收方会解析失败。
  • 必填字段:除了UNH,MSCONS本身还有很多必填Segment(比如能源值对应的QTY、相关的DTM等),需要根据业务需求补充完整,不然生成的文件不符合MSCONS标准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:05:19