java农业银行-企业银行ERP接口开发(后续)(代码改造-3)

本文介绍了对农行接口中的请求和响应类进行重构,包括引入AbstractRequest和AbstractResponse抽象类,简化类名,移除冗余方法,使用Lombok注解,以及对涉及金钱的字段类型调整。同时,针对特定接口的文件对象类进行了扩展和管理,删除了不再需要的isEncryption属性。
摘要由CSDN通过智能技术生成

这篇文章说明的改动点:

新增:
        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(查询时是否加密)属性。这个直接删掉就行了,这个属性这次改动直接写死了。


码字不易,于你有利,勿忘点赞

农业银行 ERP 接口开发是指开发适用于农业银行企业资源规划(ERP)系统的接口ERP 系统可以帮助银行实现信息的集成、业务流程的优化和效率的提升。接口开发主要是为了与其他系统进行数据的互通和交换。 在农业银行 ERP 接口开发过程中,首先需要进行需求分析和系统设计。根据银行的具体需求,确定需要开发接口功能、数据格式、传输方式等。接下来,开发人员根据设计方案进行编码和测试,确保接口的正确性和稳定性。 银行 ERP 接口开发的关键是与现有系统的对接。农业银行可能拥有多个系统,如核心银行系统、账户管理系统、风险管理系统等。在开发过程中,需要与这些系统进行数据的交换和同步。因此,开发人员需要熟悉银行系统的架构和接口规范,并与相关系统的开发人员进行紧密合作。 另外,农业银行 ERP 接口开发还需要考虑数据的安全性和稳定性。银行作为金融机构,对数据的保密和可靠性要求非常高。因此,在接口开发过程中,需要采取合适的安全措施,如身份验证、数据加密和防止数据篡改等。同时,开发人员还需要测试接口在各种情况下的稳定性和扩展性,以确保接口能够在高负载和异常情况下正常工作。 综上所述,农业银行 ERP 接口开发是一个复杂而重要的任务。它需要开发人员具备深入的银行业务和系统知识,同时还要有丰富的编码和测试经验。只有通过合理的需求分析、系统设计和与相关系统的对接,才能开发出满足农业银行需求的稳定、安全的接口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值