这篇文章说明的改动点:
新增: |
entityDTO: |
request: |
1: AbstractRequest: 请求抽象类,继承RequestBaseEntity |
2: RequestBaseFile: 请求文件对象基类 |
response: |
2: AbstractResponse: 响应抽象类,继承ResponseBaseEntity |
3: ResponseBaseFile: 响应文件对象基类 |
4: AbcErpRespDTO: 农行接口统一响应DTO |
修改: |
entityDTO: |
共同点: |
1: 类名简化,request -> req, response -> resp |
2: 去掉get,set方法,用上lombok注解@Data |
3: 所有Double类型字段都换成BigDecimal类型,涉及到钱,稳妥点 |
request: |
1:所有接口requestDTO继承由RequestBaseEntity改成AbstractRequest,并指定AbstractRequest的泛型R,也就是对应的应答报文对象 |
2: IBAF04ReqDTO.FileObject.class、IBBF23ReqDTO.FileObject.class 文件对象类继承RequestBaseFile |
response: |
1:所有接口responseDTO继承由ResponseBaseEntity改成AbstractResponse |
2:CQRC09RespDTO.FileObject.class、IBAQ06RespDTO.IBAF04FileObject.class、IBAQ06RespDTO.IBBF23FileObject.class 文件对象类继承ResponseBaseFile |
RequestBaseEntity: 去掉isEncryption(查询时是否加密)属性 |
新增点:
request:
1: AbstractRequest: 请求抽象类,继承RequestBaseEntity。
- 原交易类型(transType)是给IBAQ06(批平台处理结果查询)使用的,因为IBAF04和IBBF23的交易结果都是调这个接口查询,所以需要知道原交易接口是什么。
- 泛型R是当前接口请求DTO对应的响应DTO,我用来获取它的class,后期方便转换应答对象。
- 方法:获取请求文件对象数据(getRequestFileObjectList),设置请求文件名(setRequestFileName),是带有请求文件的接口使用,在请求对象DTO里面重写这个方法。
import com.example.demo.constant.AbcInterfaceType;
import com.example.demo.dto.response.AbstractResponse;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
public abstract class AbstractRequest<R extends AbstractResponse> extends RequestBaseEntity {
/**
* 原交易类型
* */
@Setter
@Getter
private String transType;
/**
* 获取应答报文对象class
* @return Class<R>
*/
public Class<R> getRespEntityClass() {
return (Class<R>) AbcInterfaceType.typeOf(this).getResponseClass();
}
/**
* 获取农行接口类型
* @return AbcInterfaceType
*/
public AbcInterfaceType getAbcInterfaceType() {
return AbcInterfaceType.typeOf(this);
}
/**
* 获取农行接口类型code
* @return AbcInterfaceTypeCode
*/
public String getAbcInterfaceTypeCode() {
return AbcInterfaceType.typeOf(this).name();
}
/**
* 获取请求文件对象数据
* @return List<? extends RequestBaseFile>
*/
public List<? extends RequestBaseFile> getRequestFileObjectList() {
return null;
}
/**
* 设置请求文件名
* @param fileName 文件名
*/
public void setRequestFileName(String fileName) {}
}
2: RequestBaseFile: 请求文件对象基类
import lombok.Data;
import java.io.Serializable;
/**
* 请求文件对象基类
* */
@Data
public class RequestBaseFile implements Serializable {
private static final long serialVersionUID = 1L;
}
response:
2: AbstractResponse: 响应抽象类,继承ResponseBaseEntity
- 方法:setResponseFileObjectList:让带有响应文件对象的响应对象重写,现有两个接口会用到,CQRC09(查询账户明细(新全量)),IBAQ06(批平台交易结果查询)
import java.util.List;
public abstract class AbstractResponse extends ResponseBaseEntity{
/**
* 设置响应文件对象集合
* @param transType 原交易类型
* @param fileObjectList 响应文件对象List
*/
public void setResponseFileObjectList(String transType, List<ResponseBaseFile> fileObjectList) {}
}
3: ResponseBaseFile: 响应文件对象基类
import lombok.Data;
import java.io.Serializable;
/**
* 响应文件对象基类
* */
@Data
public class ResponseBaseFile implements Serializable {
private static final long serialVersionUID = 1L;
}
4: AbcErpRespDTO: 农行接口统一响应DTO
import lombok.Data;
import java.io.Serializable;
@Data
public class AbcErpRespDTO implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 请求报文
* */
private String requestMessage;
/**
* 错误信息
* */
private String errorMsg;
/**
* 是否已发送
* */
private boolean isAlreadyResq = false;
/**
* 响应报文
* */
private String responseMessage;
/**
* 响应对象
* */
private AbstractResponse abstractResponse;
/**
* 获取指定类型响应对象
* @param responseClass 指定类型
* @return R
*/
public <R extends AbstractResponse> R getResponseEntity(Class<R> responseClass) {
if (responseClass.isInstance(this.abstractResponse)) {
return responseClass.cast(this.abstractResponse);
}
return null;
}
}
修改点:
共同的修改点就不说了,直接说request的修改点
放一个IBBF23请求对象就行了,改动点基本都一样的。
- 首先当前类和内部类都增加@Data注解。
- 当前类继承AbstractRequest抽象类,并指定泛型(接口的应答对象IBBF23RespDTO)。
- 因为请求会带有文件,内部类FileObject继承请求文件基类RequestBaseFile。
- 因为请求会带有文件,所以重写getRequestFileObjectList,setRequestFileName两个方法。
import com.example.demo.dto.response.IBBF23RespDTO;
import lombok.Data;
import javax.xml.bind.annotation.*;
import java.math.BigDecimal;
import java.util.List;
/**
* IBBF23(他行汇总批量代发)请求报文字段
* */
@Data
@XmlRootElement(name = "ap")
public class IBBF23ReqDTO extends AbstractRequest<IBBF23RespDTO> {
private static final long serialVersionUID = 1L;
/**
* 总金额
* */
@XmlElement(name = "Amt")
private BigDecimal amt;
/**
* 文件标志 默认为1
* */
@XmlElement(name = "FileFlag")
private String fileFlag;
/**
* ???
* */
@XmlElement(name = "Cmp")
private Cmp cmp;
/**
* ???
* */
@XmlElement(name = "Corp")
private Corp corp;
/**
* 请求文件对象
* */
@XmlTransient
private List<FileObject> fileObjectList;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public static class Cmp {
/**
* 省市代码
* */
@XmlElement(name = "DbProv")
private String dbProv;
/**
* 账号
* */
@XmlElement(name = "DbAccNo")
private String dbAccNo;
/**
* 货币号
* */
@XmlElement(name = "DbCur")
private String dbCur;
/**
* 账簿号
* */
@XmlElement(name = "DbLogAccNo")
private String dbLogAccNo;
/**
* 总笔数
* */
@XmlElement(name = "SumNum")
private Integer sumNum;
/**
* 代付文件名
* */
@XmlElement(name = "BatchFileName")
private String batchFileName;
}
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public static class Corp {
/**
* 委托方户名
* */
@XmlElement(name = "DbAccName")
private String dbAccName;
/**
* 附言
* */
@XmlElement(name = "Postscript")
private String postscript;
/**
* 业务种类代码
* */
@XmlElement(name = "NVoucherType")
private String nvOucherType;
/**
* 合约号(94账号)
* */
@XmlElement(name = "NFAccNo")
private String nfAccNo;
}
// 请求文件对象
@Data
public static class FileObject extends RequestBaseFile {
/**
* 客户编号
* */
private String customerCode;
/**
* 收款人账号
* */
private String crBankNo;
/**
* 收款人姓名
* */
private String crAccName;
/**
* 币种
* */
private String cur;
/**
* 交易金额
* */
private BigDecimal amt;
/**
* 摘要
* */
private String excerpt;
/**
* 加急标志 0-不加急 1-加急
* */
private String urgentSign;
/**
* 收款方开户行名
* */
private String crBankBranchName;
/**
* 收款方开户行号
* */
private String crBankBranchNo;
}
@Override
public List<? extends RequestBaseFile> getRequestFileObjectList() {
return this.fileObjectList;
}
@Override
public void setRequestFileName(String fileName) {
this.cmp.setBatchFileName(fileName);
}
}
response:
改动点基本都一样,所以放一个IBAQ06接口的应答对象就行了。
- 首先当前类和内部类都增加@Data注解。
- 当前类继承AbstractResponse抽象类。
- 因为响应会带有文件,内部类IBAF04FileObject和IBBF23FileObject继承请求文件基类ResponseBaseFile。
- 因为响应会带有文件,所以重写setResponseFileObjectList这个方法,但因为IBAQ06这个接口是可以查IBAF04和IBBF23两个交易接口的交易结果,所以这个方法里面有一些逻辑。
import com.example.demo.constant.AbcInterfaceType;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.CollectionUtils;
import javax.xml.bind.annotation.*;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* IBAQ06(批平台处理结果查询)应答报文字段
* */
@XmlRootElement(name = "ap")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class IBAQ06RespDTO extends AbstractResponse {
private static final long serialVersionUID = 1L;
/**
* 原批交易类别(批交易码)
* */
@XmlElement(name = "TransType")
private String transType;
/**
* ????
* */
@XmlElement(name = "BatchPlat")
private BatchPlat batchPlat;
/**
* IBAF04应答报文返回的文件对象
* */
@XmlTransient
private List<IBAF04FileObject> IBAF04FileObjectList;
/**
* IBAF04应答报文返回的文件对象
* */
@XmlTransient
private List<IBBF23FileObject> IBBF23FileObjectList;
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public static class BatchPlat {
/**
* 批处理
* */
@XmlElement(name = "批处理")
private BatchHandler batchHandler;
/**
* 批处理信息类
* */
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public static class BatchHandler {
/**
* 状态
* */
@XmlElement(name = "状态")
private String status;
/**
* 子状态
* */
@XmlElement(name = "子状态")
private String substate;
/**
* 描述
* */
@XmlElement(name = "描述")
private String describe;
/**
* 成功金额
* */
@XmlElement(name = "成功金额")
private String successAmt;
/**
* 成功笔数
* */
@XmlElement(name = "成功笔数")
private String successNum;
/**
* 失败金额
* */
@XmlElement(name = "失败金额")
private String failAmt;
/**
* 失败笔数
* */
@XmlElement(name = "失败笔数")
private String failNum;
/**
* 异常金额
* */
@XmlElement(name = "异常金额")
private String exceptionAmt;
/**
* 异常笔数
* */
@XmlElement(name = "异常笔数")
private String exceptionNum;
/**
* 落地金额
* */
@XmlElement(name = "落地金额")
private String groundAmt;
/**
* 落地笔数
* */
@XmlElement(name = "落地笔数")
private String groundNum;
}
}
// 文件对象
@Data
public static class IBAF04FileObject extends ResponseBaseFile {
/**
* 客户编号
* */
private String customerCode;
/**
* 收款人姓名
* */
private String crAccName;
/**
* 收款人账号
* */
private String crBankNo;
/**
* 币种
* */
private String cur;
/**
* 账簿号
* */
private String accountBookCode;
/**
* 交易金额
* */
private BigDecimal amt;
/**
* 摘要
* */
private String excerpt;
/**
* 合约校验标志 01-强制校验 02-均不校验
* */
private String contractFlag;
/**
* 户名校验标志 0-否 1-是
* */
private String accountFlag;
/**
* 客户移动电话校验标识 0-否 1-是
* */
private String phoneFlag;
/**
* 移动电话
* */
private String phone;
/**
* 注册证件类型代码
* */
private String idCardType;
/**
* 证件号码
* */
private String idCardCode;
/**
* 处理结果
* */
private String handlerResult;
/**
* 返回码
* */
private String responseCode;
/**
* 返回码中文描述
* */
private String responseCodeDesc;
}
// 文件对象
@Data
public static class IBBF23FileObject extends ResponseBaseFile {
/**
* 交易序号
* */
private String tradeNo;
/**
* 客户请求序号
* */
private String customerCode;
/**
* 系统流水号
* */
private String systemSerialNo;
/**
* 交易日期
* */
private String tradeDate;
/**
* 交易类型
* */
private String tradeType;
/**
* 交易金额
* */
private BigDecimal amt;
/**
* 处理结果
* */
private String handlerResult;
/**
* 结果描述
* */
private String resultDesc;
/**
* 对方户名
* */
private String crAccName;
/**
* 对方账号
* */
private String crBankNo;
/**
* 用途
* */
private String useTo;
}
@Override
public void setResponseFileObjectList(String transType, List<ResponseBaseFile> fileObjectList) {
if (!CollectionUtils.isEmpty(fileObjectList)) {
if (StringUtils.equals(transType, AbcInterfaceType.IBAF04.name())) {
this.IBAF04FileObjectList = new ArrayList<>();
} else if (StringUtils.equals(transType, AbcInterfaceType.IBBF23.name())) {
this.IBBF23FileObjectList = new ArrayList<>();
} else {
return;
}
fileObjectList.forEach(obj -> {
if (StringUtils.equals(transType, AbcInterfaceType.IBAF04.name()) && IBAQ06RespDTO.IBAF04FileObject.class.isInstance(obj)) {
this.IBAF04FileObjectList.add((IBAQ06RespDTO.IBAF04FileObject) obj);
} else if (StringUtils.equals(transType, AbcInterfaceType.IBBF23.name()) && IBAQ06RespDTO.IBBF23FileObject.class.isInstance(obj)) {
this.IBBF23FileObjectList.add((IBAQ06RespDTO.IBBF23FileObject) obj);
}
});
}
}
}
RequestBaseEntity: 去掉isEncryption(查询时是否加密)属性。这个直接删掉就行了,这个属性这次改动直接写死了。
码字不易,于你有利,勿忘点赞