• 新银行开发模式


    开发步骤

    银企直联服务和代理之前通过 grpc 交互,需要编写 proto 文件来定义交互数据结构。

    proto 文件编写

    编写之前可以先学习 proto3 的官方指南

    hzero-starter-ebank-proxy 里包含银行统一封装的服务,rpc 方法,消息定义,枚举。

    proto 注意事项如下

    新增银行标志

    src/main/proto/common/enum.proto 里的枚举 BankMark 。例如工商银行。

    // 银行标识
    enum BankMark {
      BM_BOC = 0; // 中国银行
      BM_ICBC = 1; // 工商银行
    }
    

    新增银行接口

    在对应的包下的 service.proto 里添加 rpc 方法。例如 签退

    // 基础金融服务
    service FundService {
      // 签到
      rpc SignIn (SignInRequest) returns (SignInResponse) {}
      // 签退
      rpc SignOut (SignOutRequest) returns (SignOutResponse) {}
    }
    

    message.proto 里添加消息定义

    enum.proto 里添加枚举

    代理新增银行对应内部实现

    在代理应用 hzero-ebank-proxy 的包 org.hzero.ebank.proxy.infra.bank 下新增内部实现。例如工商银行

    新增包 org.hzero.ebank.proxy.infra.bank.icbc

    新增服务定义和实现 org.hzero.ebank.proxy.infra.bank.icbc.service

    新增 DO org.hzero.ebank.proxy.infra.bank.icbc.dataobject

    新增转换器,将银行 DO 转换为统一 grpc 消息对象 org.hzero.ebank.proxy.infra.bank.icbc.converter

    由于 grpc 消息对象字段的值不能为空,需使用 ObjectUtils.defaultIfNull 来提供默认值

    银企直联服务在提取字段值的时候,需排除默认值干扰,StringUtils.defaultIfBlank(content.getDraftId(), null),保证数据库表字段值为 null

    代理新增对应 grpc 方法实现

    在代理应用 hzero-ebank-proxy 的包 org.hzero.ebank.proxy.app.service.impl 下所有的实现类的各个方法实现新增新银行的实现。

    例如

        @Override
        public ListResponse listDraft(ListRequest request) {
            ListResponse resp;
            if (BankMark.BM_BOC.equals(request.getBankMark())) {
                resp = BocDraftListRespDoConverter.doToDto(bocDraftService.list(BocDraftListReqDoConverter.dtoTodo(request,
                        bocDraftService.newB2eHeadDO(TransactionCode.BOC_DRAFT_LIST), BocDraftListQueryType.I1.getCode())),
                        request.getPage());
            } else {
                throw new BocException(ResponseCode.BANK_MARK_NOT_EXISTS);
            }
            return resp;
        }
    

    新增工商银行实现

        @Override
        public ListResponse listDraft(ListRequest request) {
            ListResponse resp;
            if (BankMark.BM_BOC.equals(request.getBankMark())) {
                resp = BocDraftListRespDoConverter.doToDto(bocDraftService.list(BocDraftListReqDoConverter.dtoTodo(request,
                        bocDraftService.newB2eHeadDO(TransactionCode.BOC_DRAFT_LIST), BocDraftListQueryType.I1.getCode())),
                        request.getPage());
            } else if (BankMark.BM_ICBC.equals(request.getBankMark())) {
                resp = IcbcDraftListRespDoConverter.doToDto(icbcDraftService.list(IcbcDraftListReqDoConverter.dtoTodo(
                        request, icbcDraftService.newB2eHeadDO(TransactionCode.ICBC_DRAFT_LIST)),
                        request.getPage()));
            } else {
                throw new BocException(ResponseCode.BANK_MARK_NOT_EXISTS);
            }
            return resp;
        }