3 importorg.apache.commons.io.IOUtils;4 importorg.milyn.Smooks;5 importorg.milyn.smooks.edi.unedifact.UNEdifactReaderConfigurator;6 importorg.milyn.smooks.edi.unedifact.model.UNEdifactInterchange;7 importorg.milyn.smooks.edi.unedifact.model.UNEdifactInterchangeFactory;8 import org.milyn.smooks.edi.unedifact.model.r41.*;9 importorg.milyn.smooks.edi.unedifact.model.r41.types.DateTime;10 importorg.milyn.smooks.edi.unedifact.model.r41.types.MessageIdentifier;11 importorg.milyn.smooks.edi.unedifact.model.r41.types.Party;12 importorg.milyn.smooks.edi.unedifact.model.r41.types.SyntaxIdentifier;13
14 importjavax.xml.transform.stream.StreamResult;15 importjavax.xml.transform.stream.StreamSource;16 import java.io.*;17 importjava.text.SimpleDateFormat;18 importjava.util.ArrayList;19 importjava.util.Date;20 importjava.util.List;21
22 public classUNEdifactUtil {23
24 private static String dateformat = new SimpleDateFormat("yyyyMMddHHmm").format(newDate());25
26 /**
27 * 组装Interchange Header 报文交换头部28 *@paramsenderId29 *@paramrecipientId30 *@paramyymmddStr31 *@paramhhmmStr32 *@paramagreementNumber33 *@return
34 */
35 public staticUNB41 assembleUNB(String senderId, String recipientId, String yymmddStr, String hhmmStr, String agreementNumber){36 UNB41 interchangeHeader = newUNB41();37 SyntaxIdentifier syntaxIdentifier = newSyntaxIdentifier();38 syntaxIdentifier.setId("UNOA");39 syntaxIdentifier.setVersionNum("2");40 interchangeHeader.setSyntaxIdentifier(syntaxIdentifier);41
42 Party sender = newParty();43 sender.setId(senderId);44 sender.setCodeQualifier("ZZZ");45 interchangeHeader.setSender(sender);46
47 Party recipient = newParty();48 recipient.setId(recipientId);49 recipient.setCodeQualifier("ZZZ");50 interchangeHeader.setRecipient(recipient);51
52 DateTime dateTime = newDateTime();53 dateTime.setDate(yymmddStr);54 dateTime.setTime(hhmmStr);55 interchangeHeader.setDate(dateTime);56
57 interchangeHeader.setControlRef(agreementNumber);58 returninterchangeHeader;59 }60
61 /**
62 * 组装 Interchange Trailer 报文交换尾部63 *@paramagreementNumber64 *@return
65 */
66 public staticUNZ41 assembleUNZ(String agreementNumber){67 UNZ41 interchangeTrailer = newUNZ41();68 interchangeTrailer.setControlCount(1);69 interchangeTrailer.setControlRef(agreementNumber);70 returninterchangeTrailer;71 }72
73 /**
74 * 组装Message Header 报文头部75 *@paramagreementNumber76 *@return
77 */
78 public staticUNH41 assembleUNH(String agreementNumber){79 UNH41 messageHeader = newUNH41();80 messageHeader.setMessageRefNum(agreementNumber);81 MessageIdentifier messageIdentifier = newMessageIdentifier();82 messageIdentifier.setId("IFTMIN");83 messageIdentifier.setControllingAgencyCode("UN");84 messageIdentifier.setVersionNum("D");85 messageIdentifier.setReleaseNum("99B");86 messageHeader.setMessageIdentifier(messageIdentifier);87 returnmessageHeader;88 }89
90 /**
91 * 组装Message Trailer 报文尾部92 *@paramsegmentCount93 *@paramagreementNumber94 *@return
95 */
96 public static UNT41 assembleUNT(intsegmentCount, String agreementNumber){97 UNT41 messageTrailer = newUNT41();98 messageTrailer.setSegmentCount(segmentCount);99 messageTrailer.setMessageRefNum(agreementNumber);100 returnmessageTrailer;101 }102
103 /**
104 * java(message)转EDI报文105 *106 *@paramfactory 工厂类型107 *@parammessage 报文内容108 *@return
109 *@throwsException110 */
111 public static String toUNEdidact(String senderIdentification, String receiverIdentification, UNEdifactInterchangeFactory factory, Object message) throwsIOException{112 Date date = newDate();113 String yymmddStr = new SimpleDateFormat("yyMMdd").format(date);114 String hhmmStr = new SimpleDateFormat("HHmm").format(date);115 int randomNumber =(int)(Math.random() * 10000);116 //文件交换号
117 String agreementNumber = yymmddStr + hhmmStr +randomNumber;118 UNB41 interchangeHeader =assembleUNB(senderIdentification, receiverIdentification, yymmddStr, hhmmStr, agreementNumber);119 UNZ41 interchangeTrailer =assembleUNZ(agreementNumber);120 Integer line = 1;121 UNH41 messageHeader =assembleUNH(agreementNumber);122 UNT41 beforeMessageTrailer =assembleUNT(line, agreementNumber);123 String beforeMessage = javaToUNEdifact(factory, message,null, null, messageHeader, beforeMessageTrailer);124 line =StringUtil.messageLine(beforeMessage);125 UNT41 afterMessageTrailer =assembleUNT(line, agreementNumber);126 returnjavaToUNEdifact(factory,message,interchangeHeader,interchangeTrailer,messageHeader,afterMessageTrailer);127 }128
129
130 /**
131 *132 *@paramfactory 工厂类型133 *@parammessage 报文内容134 *@paraminterchangeHeader 报文头135 *@paraminterchangeTrailer 报文尾136 *@parammessageHeader 消息头137 *@parammessageTrailer 消息尾138 *@return国际标准EDI报文139 *@throwsIOException140 */
141 public staticString javaToUNEdifact(UNEdifactInterchangeFactory factory, Object message,142 UNB41 interchangeHeader, UNZ41 interchangeTrailer,143 UNH41 messageHeader, UNT41 messageTrailer) throwsIOException {144 StringWriter ediOutStream = newStringWriter();145
146 UNEdifactInterchange41 interchange = newUNEdifactInterchange41();147 interchange.setInterchangeHeader(interchangeHeader);148 interchange.setInterchangeTrailer(interchangeTrailer);149
150 UNEdifactMessage41 unEdifactMessage41 = newUNEdifactMessage41();151 unEdifactMessage41.setMessage(message);152 unEdifactMessage41.setInterchangeHeader(interchangeHeader);153 unEdifactMessage41.setMessageHeader(messageHeader);154 unEdifactMessage41.setMessageTrailer(messageTrailer);155 List unEdifactMessage41List = new ArrayList<>();156 unEdifactMessage41List.add(unEdifactMessage41);157 interchange.setMessages(unEdifactMessage41List);158
159 factory.toUNEdifact(interchange, ediOutStream);160 returnediOutStream.toString();161 }162
163 /**
164 * 国际标准的UN/EDIFact 转 xml165 *166 *@parammappingType 报文标准类型 例如:d99b-mapping167 *@paramfilePath 报文文件路径168 *@return
169 */
170 public staticString ediToXml(String mappingType, String filePath){171 Smooks smooks = newSmooks();172 StringWriter writer = newStringWriter();173 try{174 smooks.setReaderConfig(new UNEdifactReaderConfigurator("urn:org.milyn.edi.unedifact:"+mappingType+":*"));175 smooks.filterSource(new StreamSource(new FileInputStream(filePath)), newStreamResult(writer));176 returnwriter.toString();177 }catch(Exception e){178 e.printStackTrace();179 return null;180 }finally{181 smooks.close();182 IOUtils.closeQuietly(writer);183 }184 }185
186
187 /**
188 * 国际标准的UN/EDIFact 转 Object189 *190 *@paramfactory 工厂类型 例如:D93AInterchangeFactory191 *@paramfilePath 报文路径192 *@return
193 *@throwsIOException194 */
195 public static UNEdifactMessage41 edifactToObject(UNEdifactInterchangeFactory factory, String filePath) throwsIOException {196 InputStream stream = newFileInputStream(filePath);197 UNEdifactInterchange interchange =factory.fromUNEdifact(stream);198 if (interchange instanceofUNEdifactInterchange41) {199 UNEdifactInterchange41 interchange41 =(UNEdifactInterchange41) interchange;200 List message41List =interchange41.getMessages();201 if(message41List.size()>0){202 return message41List.get(0);203 }204 }205 return null;206 }207 }