作者 朱兆平

部分报文格式生成及验证

package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBExceptionType;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* CER
* Shipper's Certification
... ... @@ -10,7 +17,7 @@ package com.sunyo.wlpt.base.model.efreight.fwb;
* CER/ZHENGZHOU NAVITRANS
* CRLF
*/
public class FWB_CER {
public class FWB_CER extends BASE implements FWB_BASE{
/**
* NODE:CER
... ... @@ -22,4 +29,42 @@ public class FWB_CER {
* CER/ZHENGZHOU NAVITRANS
*/
private String cer_signature;
public String getCer_signature() throws FWBException {
String patternStr = "^[A-Z0-9-<=/\\s\\.]{0,20}$";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(cer_signature);
if (!matcher.find()){
throw new FWBException(FWBExceptionType.CER_ERROR);
}
return cer_signature;
}
public void setCer_signature(String cer_signature) {
this.cer_signature = cer_signature;
}
@Override
public String getFWBNodeText() throws FWBException {
String SPLIT_CODE = "/";
String CRLF = "\n";
StringBuilder sb = new StringBuilder("");
if (hasText(cer_signature)){
sb.append(getNodeName()).append(SPLIT_CODE).append(getCer_signature());
sb.append(CRLF);
}
return sb.toString();
}
@Override
public String getNodeName() {
return "CER";
}
}
... ...
package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBExceptionType;
... ...
package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBExceptionType;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* ISU
* Carrier's Execution
... ... @@ -11,7 +18,7 @@ package com.sunyo.wlpt.base.model.efreight.fwb;
* ISU/29MAY23/ZHENGZHOU/ZHU YUAN ZHANG
* CRLF
*/
public class FWB_ISU {
public class FWB_ISU extends BASE implements FWB_BASE{
/**
* NODE:ISU
* Day Mounth Year
... ... @@ -45,4 +52,74 @@ public class FWB_ISU {
* ZHU YUANZHANG
*/
private String isu_signature;
public String getIsu_day_mounth_year() throws FWBException {
String patternStr = "^[0-9]{2}[A-Z]{3}[0-9]{2}$";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(isu_day_mounth_year);
if (!matcher.find()){
throw new FWBException(FWBExceptionType.ISU_DATE_ERROR);
}
return isu_day_mounth_year;
}
public void setIsu_day_mounth_year(String isu_day_mounth_year) {
this.isu_day_mounth_year = isu_day_mounth_year;
}
public String getIsu_place_or_airport_code() throws FWBException {
String patternStr = "^[A-Z0-9-<=/\\s\\.]{1,17}$";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(isu_place_or_airport_code);
if (!matcher.find()){
throw new FWBException(FWBExceptionType.ISU_PLACE_ERROR);
}
return isu_place_or_airport_code;
}
public void setIsu_place_or_airport_code(String isu_place_or_airport_code) {
this.isu_place_or_airport_code = isu_place_or_airport_code;
}
public String getIsu_signature() throws FWBException {
String patternStr = "^[A-Z0-9-<=/\\s\\.]{0,20}$";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(isu_signature);
if (!matcher.find()){
throw new FWBException(FWBExceptionType.ISU_SIGN_ERROR);
}
return isu_signature;
}
public void setIsu_signature(String isu_signature) {
this.isu_signature = isu_signature;
}
@Override
public String getFWBNodeText() throws FWBException {
String SPLIT_CODE = "/";
String CRLF = "\n";
StringBuilder sb = new StringBuilder("");
sb.append(getNodeName())
.append(SPLIT_CODE).append(getIsu_day_mounth_year())
.append(SPLIT_CODE).append(getIsu_place_or_airport_code());
if (hasText(isu_signature)){
sb.append(SPLIT_CODE).append(getIsu_signature());
}
sb.append(CRLF);
return sb.toString();
}
@Override
public String getNodeName() {
return "ISU";
}
}
... ...
package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBExceptionType;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* OSI
* Other Service Infomation
* 其他服务信息
* O (O 可选, M 必填, C 指定条件下可选)
*
* 最多三行
* DEMO:(括号里面的是可选项)
* OSI/SAY TOTAL 8 PACKAGES PLEASE NOTIFY CONSIGNEE UPON FLIGHT ARRIVAL
* CRLF
*/
public class FWB_OSI {
public class FWB_OSI extends BASE implements FWB_BASE{
/**
* Parent NODE:OSI
... ... @@ -27,4 +34,46 @@ public class FWB_OSI {
* /ZV EA FILED SPX PER ATTACHED LIST CH RA 00195-01 31-05-23 16 46
*/
private String osi_text;
public String getOsi_text() throws FWBException {
String patternStr = "^[A-Z0-9-<=/\\s\\.]{1,65}$";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(osi_text);
if (!matcher.find()){
throw new FWBException(FWBExceptionType.OSI_TEXT_ERROR);
}
return osi_text;
}
public void setOsi_text(String osi_text) {
this.osi_text = osi_text;
}
@Override
public String getFWBNodeText() throws FWBException {
String SPLIT_CODE = "/";
String CRLF = "\n";
StringBuilder sb = new StringBuilder("");
if (hasText(osi_text)){
sb.append(getNodeName())
.append(SPLIT_CODE).append(getOsi_text());
sb.append(CRLF);
}
return sb.toString();
}
@Override
public String getNodeName() {
return "OSI";
}
}
... ...
package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
/**
* PPD
* Prepaid Charge Summary
... ... @@ -11,7 +14,7 @@ package com.sunyo.wlpt.base.model.efreight.fwb;
* /OA0/OC14/CT22227.8
* CRLF
*/
public class FWB_PPD {
public class FWB_PPD extends BASE implements FWB_BASE{
/**
* NODE:WT
... ... @@ -20,7 +23,7 @@ public class FWB_PPD {
* [0-9\.]{0,12}
* O (可选节点)
* DEMO:
* /WT/12306.99
* /WT12306.99
*/
private String ppd_weight_amount;
... ... @@ -31,7 +34,7 @@ public class FWB_PPD {
* [0-9\.]{0,12}
* O (可选节点)
* DEMO:
* /VC/12306.99
* /VC12306.99
*/
private String ppd_valuation_amount;
... ... @@ -79,4 +82,106 @@ public class FWB_PPD {
*/
private String ppd_charge_summary_total;
public String getPpd_weight_amount() {
return ppd_weight_amount;
}
public void setPpd_weight_amount(String ppd_weight_amount) {
this.ppd_weight_amount = ppd_weight_amount;
}
public String getPpd_valuation_amount() {
return ppd_valuation_amount;
}
public void setPpd_valuation_amount(String ppd_valuation_amount) {
this.ppd_valuation_amount = ppd_valuation_amount;
}
public String getPpd_taxes_amount() {
return ppd_taxes_amount;
}
public void setPpd_taxes_amount(String ppd_taxes_amount) {
this.ppd_taxes_amount = ppd_taxes_amount;
}
public String getPpd_other_charges_due_agent() {
return ppd_other_charges_due_agent;
}
public void setPpd_other_charges_due_agent(String ppd_other_charges_due_agent) {
this.ppd_other_charges_due_agent = ppd_other_charges_due_agent;
}
public String getPpd_other_charges_due_carrier() {
return ppd_other_charges_due_carrier;
}
public void setPpd_other_charges_due_carrier(String ppd_other_charges_due_carrier) {
this.ppd_other_charges_due_carrier = ppd_other_charges_due_carrier;
}
public String getPpd_charge_summary_total() {
return ppd_charge_summary_total;
}
public void setPpd_charge_summary_total(String ppd_charge_summary_total) {
this.ppd_charge_summary_total = ppd_charge_summary_total;
}
@Override
public String getFWBNodeText() throws FWBException {
String SPLIT_CODE = "/";
String CRLF = "\n";
StringBuilder sb = new StringBuilder("");
if (hasText(ppd_weight_amount)
|| hasText(ppd_valuation_amount)
|| hasText(ppd_taxes_amount)
|| hasText(ppd_other_charges_due_agent)
|| hasText(ppd_other_charges_due_carrier)
|| hasText(ppd_charge_summary_total)
){
sb.append(getNodeName());
if (hasText(ppd_weight_amount)
|| hasText(ppd_valuation_amount)
|| hasText(ppd_taxes_amount)
){
if (hasText(ppd_weight_amount)){
sb.append(SPLIT_CODE).append("WT").append(getPpd_weight_amount());
}
if (hasText(ppd_valuation_amount)){
sb.append(SPLIT_CODE).append("VC").append(getPpd_valuation_amount());
}
if (hasText(ppd_taxes_amount)){
sb.append(SPLIT_CODE).append("TX").append(getPpd_taxes_amount());
}
}
sb.append(CRLF);
if (hasText(ppd_other_charges_due_agent)){
sb.append(SPLIT_CODE).append("OA").append(getPpd_other_charges_due_agent());
}
if (hasText(ppd_other_charges_due_carrier)){
sb.append(SPLIT_CODE).append("OC").append(getPpd_other_charges_due_carrier());
}
sb.append(SPLIT_CODE).append("CT").append(getPpd_charge_summary_total());
sb.append(CRLF);
}
return sb.toString();
}
@Override
public String getNodeName() {
return "PPD";
}
}
... ...
... ... @@ -173,16 +173,16 @@ public class FWB_REF implements FWB_BASE{
if (StringUtils.hasLength(getRef_file_reference())){
if (StringUtils.hasText(getRef_file_reference())){
sb.append(SPLIT_CODE)
.append(getRef_file_reference());
}else {
sb.append(SPLIT_CODE);
}
if (StringUtils.hasLength(getRef_participant_id())
&& StringUtils.hasLength(getRef_participant_code())
&& StringUtils.hasLength(getRef_participant_airport())
if (StringUtils.hasText(getRef_participant_id())
&& StringUtils.hasText(getRef_participant_code())
&& StringUtils.hasText(getRef_participant_airport())
){
sb.append(SPLIT_CODE)
.append(getRef_participant_id());
... ...
package com.sunyo.wlpt.base.model.efreight.fwb;
import com.sunyo.wlpt.base.model.efreight.BASE;
import com.sunyo.wlpt.base.model.efreight.fwb.exception.FWBException;
/**
* RTD
* Rate Description
... ... @@ -13,7 +17,7 @@ package com.sunyo.wlpt.base.model.efreight.fwb;
* /4/NV/MC0.56
* CTLF
*/
public class FWB_RTD {
public class FWB_RTD extends BASE implements FWB_BASE{
/**
* NODE:P
* Number of Pieces
... ... @@ -106,7 +110,7 @@ public class FWB_RTD {
* DEMO:
* T2334.73
*/
private String rtd_rate_total;
private String rtd_total;
/**
* NODE:NG
... ... @@ -215,5 +219,212 @@ public class FWB_RTD {
*/
private String rtd_volume;
public String getRtd_number_pieces() {
return rtd_number_pieces;
}
public void setRtd_number_pieces(String rtd_number_pieces) {
this.rtd_number_pieces = rtd_number_pieces;
}
public String getRtd_combination_point() {
return rtd_combination_point;
}
public void setRtd_combination_point(String rtd_combination_point) {
this.rtd_combination_point = rtd_combination_point;
}
public String getRtd_gross_weight() {
return rtd_gross_weight;
}
public void setRtd_gross_weight(String rtd_gross_weight) {
this.rtd_gross_weight = rtd_gross_weight;
}
public String getRtd_rate_class() {
return rtd_rate_class;
}
public void setRtd_rate_class(String rtd_rate_class) {
this.rtd_rate_class = rtd_rate_class;
}
public String getRtd_commodity_NUM() {
return rtd_commodity_NUM;
}
public void setRtd_commodity_NUM(String rtd_commodity_NUM) {
this.rtd_commodity_NUM = rtd_commodity_NUM;
}
public String getRtd_charge_weight() {
return rtd_charge_weight;
}
public void setRtd_charge_weight(String rtd_charge_weight) {
this.rtd_charge_weight = rtd_charge_weight;
}
public String getRtd_rate_charge() {
return rtd_rate_charge;
}
public void setRtd_rate_charge(String rtd_rate_charge) {
this.rtd_rate_charge = rtd_rate_charge;
}
public String getRtd_total() {
return rtd_total;
}
public void setRtd_total(String rtd_total) {
this.rtd_total = rtd_total;
}
public String getRtd_goods_DES() {
return rtd_goods_DES;
}
public void setRtd_goods_DES(String rtd_goods_DES) {
this.rtd_goods_DES = rtd_goods_DES;
}
public String getRtd_goods_consol_DES() {
return rtd_goods_consol_DES;
}
public void setRtd_goods_consol_DES(String rtd_goods_consol_DES) {
this.rtd_goods_consol_DES = rtd_goods_consol_DES;
}
public String getRtd_goods_DIM_weightcode() {
return rtd_goods_DIM_weightcode;
}
public void setRtd_goods_DIM_weightcode(String rtd_goods_DIM_weightcode) {
this.rtd_goods_DIM_weightcode = rtd_goods_DIM_weightcode;
}
public String getRtd_goods_DIM_weight() {
return rtd_goods_DIM_weight;
}
public void setRtd_goods_DIM_weight(String rtd_goods_DIM_weight) {
this.rtd_goods_DIM_weight = rtd_goods_DIM_weight;
}
public String getRtd_measurement_code() {
return rtd_measurement_code;
}
public void setRtd_measurement_code(String rtd_measurement_code) {
this.rtd_measurement_code = rtd_measurement_code;
}
public String getRtd_measurement_info() {
return rtd_measurement_info;
}
public void setRtd_measurement_info(String rtd_measurement_info) {
this.rtd_measurement_info = rtd_measurement_info;
}
public String getRtd_volume_code() {
return rtd_volume_code;
}
public void setRtd_volume_code(String rtd_volume_code) {
this.rtd_volume_code = rtd_volume_code;
}
public String getRtd_volume() {
return rtd_volume;
}
public void setRtd_volume(String rtd_volume) {
this.rtd_volume = rtd_volume;
}
//todo: 还有NU,NS,NH,NO等信息后面完善
@Override
public String getFWBNodeText() throws FWBException {
String SPLIT_CODE = "/";
String CRLF = "\n";
StringBuilder sb = new StringBuilder("");
Integer lineNumber = 1;
sb.append(getNodeName()).append(SPLIT_CODE).append(lineNumber++);
;
if (hasText(rtd_number_pieces)){
sb.append(SPLIT_CODE).append("P").append(getRtd_number_pieces());
}
if (hasText(rtd_gross_weight)){
sb.append(SPLIT_CODE).append("K").append(getRtd_gross_weight());
}
if (hasText(rtd_rate_class)){
sb.append(SPLIT_CODE).append("C").append(getRtd_rate_class());
}
if (hasText(rtd_commodity_NUM)){
sb.append(SPLIT_CODE).append("S").append(getRtd_commodity_NUM());
}
if (hasText(rtd_charge_weight)){
sb.append(SPLIT_CODE).append("W").append(getRtd_charge_weight());
}
if (hasText(rtd_rate_charge)){
sb.append(SPLIT_CODE).append("R").append(getRtd_rate_charge());
}
if (hasText(rtd_total)){
sb.append(SPLIT_CODE).append("T").append(getRtd_total());
}
if (hasText(rtd_goods_DES) || hasText(rtd_goods_consol_DES)){
sb.append(CRLF);
if (hasText(rtd_goods_DES) && hasText(rtd_goods_consol_DES)){
sb.append(SPLIT_CODE).append("NG").append(SPLIT_CODE).append(getRtd_goods_DES());
sb.append(CRLF);
sb.append(SPLIT_CODE).append(lineNumber++).append(SPLIT_CODE)
.append("NC").append(SPLIT_CODE).append(getRtd_goods_consol_DES());
}else if (hasText(rtd_goods_DES)){
sb.append(SPLIT_CODE).append("NG").append(SPLIT_CODE).append(getRtd_goods_DES());
}else if (hasText(rtd_goods_consol_DES)){
sb.append(SPLIT_CODE).append("NC").append(SPLIT_CODE).append(getRtd_goods_consol_DES());
}
sb.append(CRLF);
}
if (hasText(getRtd_measurement_info())){
sb.append(SPLIT_CODE).append(lineNumber++).append(SPLIT_CODE).append("ND");
if (hasText(rtd_goods_DIM_weight)){
sb.append(getRtd_goods_DIM_weightcode()).append(getRtd_goods_DIM_weight());
}
sb.append(SPLIT_CODE);
sb.append(getRtd_measurement_code()).append(getRtd_measurement_info());
sb.append(CRLF);
}
sb.append(SPLIT_CODE).append(lineNumber++).append(SPLIT_CODE).append("NV").append(SPLIT_CODE)
.append(getRtd_volume_code()).append(getRtd_volume());
sb.append(CRLF);
return sb.toString();
}
@Override
public String getNodeName() {
return "RTD";
}
}
... ...
... ... @@ -83,6 +83,14 @@ public enum FWBExceptionType {
CER_ERROR("1613", "托运人认证签名信息格式有误"),
ISU_DATE_ERROR("1721", "承运人的执行信息航班日期格式有误"),
ISU_PLACE_ERROR("1726", "承运人的执行信息地址格式有误"),
ISU_SIGN_ERROR("1732", "承运人的执行信息签名格式有误"),
OSI_TEXT_ERROR("1830", "其他服务信息格式有误"),
REF_ERROR("203", "缺少 REF Sender Reference - Sender Office Message Address"),
REF_SOMA_REGEX_FAILD("2031", "REF- Sender Office Message Address RegEx Faild"),
REF_SPID_REGEX_FAILD("206", "REF- Sender Participant Idenfitication RegEx Faild,缺少关联节点信息"),
... ...
... ... @@ -16,6 +16,7 @@ public class FWBTest {
+ FWB_NFY_TEST()
+ FWB_ACC_TEST()
+ FWB_CVD_TEST()
+ FWB_RTD_TEST()
);
// REF_TEST();
... ... @@ -183,6 +184,33 @@ public class FWBTest {
return "";
}
static String FWB_RTD_TEST(){
//todo:做个计费单价x计费重量 与 total 总价的对比验证
FWB_RTD var = new FWB_RTD();
var.setRtd_number_pieces("3");
var.setRtd_gross_weight("174");
var.setRtd_rate_class("Q");
// var.setRtd_commodity_NUM("12398");
var.setRtd_charge_weight("176");
// var.setRtd_rate_charge("21.23");
// var.setRtd_total("198732.22");
var.setRtd_goods_DES("DELL COMPUTY");
var.setRtd_goods_consol_DES("CONSOLE");
// var.setRtd_goods_DIM_weightcode("W");
// var.setRtd_goods_DIM_weight("302.33");
var.setRtd_measurement_code("CMT");
var.setRtd_measurement_info("120-80-55/2");
var.setRtd_volume_code("MC");
var.setRtd_volume("27.76");
try {
String nodeText = var.getFWBNodeText() ;
return nodeText;
} catch (FWBException e) {
e.printStackTrace();
}
return "";
}
static void OCI_TEST(){
FWB_OCI fwb_oci = new FWB_OCI();
... ...