BNBS 贷款底座新业务系统
一、系统概述
BNBS 不是单一职责的小型服务,而是一套围绕贷款底座前台产品域构建的组合系统。按代码结构看,它至少同时承担了 4 类职责:
- 前端通用网关(CGI)
- 产品 ADM / DCN 业务编排
- 批扣与资金中台(MID-BATCH / MID-FS)
- 批量文件、对账、通知、断点恢复等配套基础能力
从仓库 README、启动模块、包结构和配置可以确认,BNBS 的定位更接近“产品域编排层 + 资金/批扣中台”,而不是会计核心或借据核心。
| 属性 | 值 |
|---|---|
| Group ID | cn.webank.cnc.nbs |
| Artifact ID | bnbs-parent |
| 父 POM | cn.webank.cnc.sdk:zcnc-sdk-parent-for-coe:4.1.37-SNAPSHOT |
| Java 版本 | Java 21 |
| 构建方式 | Maven 多模块 |
| 数据库 | 贷款 bnbsdb,信用卡 ccnbsdb |
| 主要通信方式 | RMB 消息总线 |
| 活跃部署形态 | ADM union app、DCN union app |
| 系统编号 | 贷款 ADM U554,贷款 DCN U492,信用卡 ADM U857,信用卡 DCN U836 |
| 代码规模 | 3757 个 Java、266 个 XML、4845 个 SQL |
二、模块结构
BNBS 根 POM 只有 5 个一级模块,但内部再次拆分成 CGI、核心业务、中台和启动壳 4 层。
2.1 一级模块
| 模块 | 角色 |
|---|---|
bnbs-core | 产品域核心业务,覆盖 ADM、DCN、批量、断点恢复、共享组件 |
bnbs-cgi | 前端通用网关层,负责协议转换、报文定义、渠道适配 |
bnbs-mid | 资金中台与批扣中台,覆盖 MID-FS、MID-BATCH |
bnbs-service-adm-union-app | ADM 联合部署启动壳 |
bnbs-service-dcn-union-app | DCN 联合部署启动壳 |
2.2 bnbs-core 子模块
| 子模块 | 作用 |
|---|---|
bnbs-comm-def | 参数类、枚举、通用定义 |
bnbs-dao | DAO 与 MyBatis 层 |
bnbs-facility | 共享 facility、工具、环境、流水号等 |
bnbs-comm | 联机/批量通用组件、远程 RMB 调用、BaseContext |
bnbs-service-adm | ADM 联机业务 |
bnbs-service-dcn | DCN 联机业务 |
bnbs-batch-dcn | DCN 批量任务 |
bnbs-batch-adm | ADM 批量任务 |
bnbs-breakpoint | 断点恢复/补偿能力 |
bnbs-core-facade | 对外监听抽象与门面定义 |
2.3 bnbs-cgi 子模块
| 子模块 | 作用 |
|---|---|
bnbs-cgi-dao | CGI 独立 DAO |
bnbs-cgi-comm-def | CGI 报文与定义 |
bnbs-cgi-comm | CGI 公共组件 |
bnbs-cgi-facility | CGI 层基础设施 |
bnbs-cgi-service-adm | CGI 服务入口与状态机执行 |
2.4 bnbs-mid 子模块
| 子模块 | 作用 |
|---|---|
bnbs-mid-dao | 中台 DAO |
bnbs-mid-comm-def | 中台定义 |
bnbs-mid-facility | 中台公共能力、RMB 发送、任务设施 |
bnbs-midfs-service-dcn | 联机资金中台 |
bnbs-mid-batch-dcn | 批扣中台批量任务 |
bnbs-mid-facade | 中台对外门面 |
2.5 架构演化特征
- 原先的
NbsServiceDcnApplication、NbsBatchDcnApplication、NbsMidFsApplication、NbsMidBatchApplication等启动类仍在仓库中,但均已注释停用。 - 当前有效形态是“联合部署”:用
union-app把 CGI、ADM、DCN、批量、中台聚合到更少的运行单元中。 - 这意味着排障时不能只看模块名,要同时区分“代码归属模块”和“实际部署单元”。
三、启动与部署形态
3.1 ADM 联合部署
主类:cn.webank.cnc.nbs.NbsServiceAdmUnionApplication
关键特征:
@SpringBootApplication@EnableScheduling@EnableAsync@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)- 扫描
cn.webank.cnc.bnbs、cn.webank.cnc.nbs、cn.webank.cnc.rcbs.**等包 @ImportResource({"classpath:biz/biz-context.xml", "classpath:xml/biz-context.xml"})
配置文件中可确认:
startup.mode=uniondomain.name=LOANsystemId=U554
3.2 DCN 联合部署
主类:cn.webank.cnc.nbs.NbsServiceDcnUnionApplication
关键特征:
- 比 ADM 启动壳引入更多模块:
mid、clrengine、fct、migration、nbs.bclfs、批量模块等 @EnableCaching@ImportResource({"classpath:biz/biz-context.xml", "classpath:mid/biz-context.xml", "classpath:batchdcn/biz-context.xml", "classpath:midbatch/biz-context.xml"})
配置文件中可确认:
startup.mode=uniondomain.name=LOANsystemId=U492
3.3 双产品线共仓
BNBS 同一套代码同时支持贷款和信用卡两条产品线:
- 贷款:
bnbsdb - 信用卡:
ccnbsdb
配置目录也分成 4 套:
bnbs-service-adm-union-appbnbs-service-dcn-union-appccnbs-service-adm-union-appccnbs-service-dcn-union-app
这说明 BNBS 不是单纯“贷款系统”,而是一个贷款/信用卡共仓、多部署、多库的产品域平台。
四、包架构与代码组织
BNBS 的联机代码高度状态机化、上下文化、服务码化。
4.1 bnbs-service-dcn
bnbs-service-dcn 是最核心的对客编排层,目录结构非常能说明问题:
context/*:按服务码或业务域拆分的上下文对象,实测一级子目录43个state/*:状态机状态实现,一级域包9个action/*:外部系统或子流程动作,一级域包11个flowAction/*:流程动作编排层service/impl:RMB 入口和通用入口service/callback:异步回调facility/fs、facility/nfs:金融/非金融侧基础设施remote/mes、remote/edm:远程系统适配rppcenter/*:还款计划/承诺支付相关独立子域
从目录命名可明确识别的集成方向包括:
action/tcs:风控/交易控制相关action/cvs:信核/核验回调action/cps:核心信用处理系统action/mes:消息/通知action/ref:外部审批/核验结果action/fs/action/midFs:资金转账action/dps:文件/数据处理侧
4.2 bnbs-service-adm
ADM 层比 DCN 更聚焦于“客户建档前与产品配置相关的流程”:
action/ecif、action/dcn、action/contractstate/ecif、state/contract、state/channelLimitflowAction/contractpsc/*、ecif/*
结合 README 和入口服务码,ADM 的主责非常清晰:
- 开户预审
- 欢迎页/前置产品逻辑
- ECIF 查询与建档前校验
- 名单校验
- 合同决策与合同校验
- 客户信息创建前置处理
4.3 bnbs-cgi-service-adm
CGI 层是前端通用网关,不承担产品核心决策,但负责:
- 渠道协议转换
- 报文定义隔离
- DCN 路由定位
- 请求合法性校验
- 页面返回码和文案映射
- 会话/客户级缓存
对应包结构有:
contextstateactionprocesshandlerserviceserviceCodeEnum
这与 README 对 CGI 的定位完全一致。
4.4 bnbs-mid
bnbs-mid 明显是一个独立的中台域:
bnbs-midfs-service-dcn:联机资金转账bnbs-mid-batch-dcn:批量扣款、对账、通知、文件处理bnbs-mid-facility:RMB 发送、任务、灰度、公共能力
其中 MidWayFsOnlineServiceImpl 注释直接写明:
- 资金中台联机接口在子系统合并后通过本地消息调用
- 不再对外单独暴露 RMB 服务
这说明在当前联合部署形态下,MID-FS 已被嵌入 BNBS DCN 运行单元内部。
4.5 通用入口模板
StandardModuleOnlineServiceImpl 是 BNBS 的关键骨架类。它负责:
- RMB 报文解析
- 提取公共字段并打平
- 装载
TxnServiceAttribute - 执行接口级数据修正
IFixProc - 落交易流水
TM_TRACE_NBS - 调用状态机/业务流程
process() - 统一组装响应报文与返回码
它同时依赖:
StateMachineConsoleStateMachineConsoleForConfigBreakpointFacilityGrayCtlFacilityUnifiedParameterFacilityModuleDbFacility
因此 BNBS 的主处理模式可以概括为:
RMB 入口 -> 数据修正 -> 配置装载 -> 状态机执行 -> 统一响应
五、对外入口与通信模式
5.1 通信形态
BNBS 基本是纯消息驱动系统:
- 全仓库
@RmbMap标注约196处 @RestController/@Controller为0
也就是说,BNBS 对外几乎不暴露标准 REST API,核心能力都通过 RMB 服务号承接。
5.2 主要服务入口
| 入口类 | 服务数 | 角色 |
|---|---|---|
RcbsCgiOnlineService4LoanImpl | 33 个 @RmbMap | 贷款 CGI 前台网关入口 |
BnbsOnlineServiceForLoanAdmImpl | 8 个 @RmbMap | 贷款 ADM 联机入口 |
BnbsOnlineServiceForRetailLoanDcnImpl | 55 个 @RmbMap | 贷款 DCN 联机入口 |
BnbsOnlineServiceForCreditCardAdmImpl | 多个 | 信用卡 ADM 入口 |
BnbsOnlineServiceForCreditCardDcnImpl | 多个 | 信用卡 DCN 入口 |
MidFsAsyncOnlineServiceImpl | 1 个回调入口 | 资金中台异步回调 |
5.3 服务码家族
README 中对接口 ID 命名规则写得很明确:
CG:授信LA:借款RA:还款NQ:非金融查询NW:非金融写交易RN:运营内管CS:客服TN:通知
代码目录也与这一规则高度一致,例如:
context/cg1001context/la1003context/ra1201state/operate/rn0011flowAction/tn2001
5.4 CGI 报文定义隔离
CGI 层额外定义了一套隔离规则:
CGI-REQxxxCGI-RSPxxx
目的是把 CGI 报文定义与产品 ADM/DCN 层的接口定义隔开,避免同名冲突。这一点来自 README,且与 bnbs-cgi-comm-def、serviceCodeEnum 的结构相互印证。
六、核心业务域分析
6.1 CGI 网关域
作用:
- 前端请求协议转换
- 基础校验
- 页面码映射
- 渠道到产品域的路由
它本身不是最终业务处理者,而是 BNBS 产品域的前置接入层。
6.2 ADM 预处理域
作用:
- 客户建档前校验
- ECIF 前置处理
- 名单校验
- 合同决策
- 产品配置类功能
ADM 更像“开户/签约前的产品治理层”。
6.3 DCN 对客编排域
作用:
- 对客借款、授信、还款、个人中心、证件上传、影像回调等主流程
- 组合调用风控、核验、核心账务、消息、合同、资金等外部能力
- 状态机推进与流程异常处理
这部分是 BNBS 最核心、也最复杂的业务中枢。
6.4 MID-FS 资金中台
作用:
- 联机资金转账
- 不同转账策略编排
- 对接存款核心(DEPOSIT)和支付系统(UPP)
MidWayFsOnlineServiceImpl 的实现里可看到:
- 幂等处理
- 流控
- 交易历史记录
- 发送 RMB / 取目标 DCN / 自定义返回码装配
所以 MID-FS 不是简单工具模块,而是独立的资金处理子系统。
6.5 MID-BATCH / DCN-BATCH
README 与包目录都显示 BNBS 有两条批量能力线:
bnbs-batch-dcn:产品域批量,如批扣、提醒、文件处理、合同归档bnbs-mid-batch-dcn:中台批量,如扣款策略、对账、通知、资金文件处理
bnbs-mid-batch-dcn/README.md 明确提到:
- 自扣兼容客户账户不存在场景
- 公众号 openId 落库
- 免息券到期提醒
- 通知类 JOB 拆分
说明该层已深度承担运营通知和文件作业逻辑。
七、数据库与脚本结构
7.1 分库模型
BNBS 明确按产品线分库:
- 贷款:
bnbsdb - 信用卡:
ccnbsdb
同时遵循:
- DDL 共用一套表结构
- DML 按贷款/信用卡分别维护
7.2 元数据目录
metadata 目录结构非常清晰:
table-model/adm/ddltable-model/adm/dml/loantable-model/adm/dml/credit-cardtable-model/dcn/ddltable-model/dcn/dml/loantable-model/dcn/dml/credit-card
这意味着 BNBS 的脚本治理是“ADM/DCN 分层 + loan/card 分产品线”的。
7.3 关键表域
按 DDL 文件名可归纳出 4 组核心数据域。
7.3.1 客户与产品
TM_NBS_CUSTTM_NBS_CUST_PRODUCTTM_NBS_CUST_PRODUCT_CREDITTM_NBS_CUST_ATTR_PHONETM_BANK_CARD_LIST_HST
7.3.2 流程与追踪
TM_MAIN_TRANSTM_TRANS_FLOWTM_TRANS_FLOW_IDCARDTM_STATE_MACHINE_CTLTM_STATE_MACHINE_FLOW_CONFTM_TRACE_NBSTM_TRACE_NBS_EXT
7.3.3 合同、决策与风控配置
TM_AGREEMENT_LOANTM_CONTRACT_PRE_SIGNTM_CONTRACT_SIGN_TASK_HSTTM_DECISIONTM_DECISION_GROUPTM_PARA_GROUP_CONTRACT
7.3.4 批量、清算与扣款
TM_PRE_WITHHOLD_PLANTM_BATCH_CPS_DDREQ_LKTM_CLR_BATCH_FILE_ITEMTM_CLR_BATCH_FILE_CFGTM_BCLFS_BA_WITHHOLD_SUMMARYTM_BCLFS_UDS_LK_DTL
7.4 脚本治理
dbScript/:增量版本脚本metadata/:完整初始化口径
README 还明确要求版本开发完成后把增量脚本同步回 metadata,这说明团队是把 metadata 当作“最终全量基线”来管理的。
八、业务主链路理解
以下链路是基于代码结构和入口职责的推断,不等同于单笔请求必然经过的完整实时路径。
8.1 前台对客链路
- 渠道请求先进入 CGI 网关
- CGI 做协议转换、报文校验、文案码映射、DCN 路由
- 贷款主流程进入 DCN 编排层
- 建档前或合同前置流程进入 ADM 编排层
- DCN/ADM 按状态机组合调用外部系统并返回结果
8.2 借款与还款链路
从 BnbsOnlineServiceForRetailLoanDcnImpl 的服务码可以直接看出,它覆盖了:
- 借款反欺诈
- 放款接口与放款结果查询
- 借款试算
- 主动还款/预约还款/还款结果查询
- 借据详情/借据列表/还款记录查询
- 合同签署、合同校验、合同决策
因此 BNBS 在贷款产品域里承担的是“客户流程组合层”,而不是只负责某一个局部动作。
8.3 资金与批量链路
- 联机资金转账进入 MID-FS
- 产品批扣、对账、提醒进入 BNBS-BATCH 或 MID-BATCH
- 文件经 FPS / BCLFS / 中台文件设施处理
- 结果回调或通知再回流到 BNBS 对客流程
九、与其他系统的边界关系
按代码里的包名和入口设计,可以较确定地看出 BNBS 会直接编排或依赖以下能力:
CPS:核心信用处理/账务能力TCS:风控或交易控制能力CVS:信核/影像审批结果MES:消息通知REF:外部审批/核验结果回传MID-FS:资金中台BCLFS/UPP/DEPOSIT:文件与资金清算侧
所以 BNBS 的边界不是“一个简单产品服务”,而是连接前台渠道、风控、核验、核心账务、资金和批量的综合编排平台。
十、结论
BNBS 的本质可以概括为:
- 前台渠道网关:
CGI - 产品前置治理:
ADM - 对客主流程编排:
DCN - 资金/批扣中台:
MID-FS、MID-BATCH
它最鲜明的技术特征有 3 个:
- 强状态机驱动:上下文、状态、流程动作全部按服务码拆分
- 强消息驱动:几乎完全以 RMB 作为系统间通信方式
- 强联合部署:逻辑模块边界清晰,但运行时已明显聚合
后续如果要继续深挖 BNBS,最值得优先按下面顺序切入:
bnbs-service-dcn/service/impl的入口类StandardModuleOnlineServiceImpl的process()调度链context/state/action对应的具体服务码实现bnbs-mid中的 MID-FS / MID-BATCH 资金与批扣逻辑