⑤ 还款(含逾期处置)
产品定义:银行账号代扣(默认)/ 银行卡代扣 / 银行钱包转账(虚拟账号自动入账);逾期进入催收,达阈值锁机(Phase 2)。图例与服务名映射见 00-总览。
多触发 + 多 TxnType。真实分流见下方「分支清单」(读FinancialBusiness/BeforePaymentFactory/AfterPaymentFactory核实)。
⚠ TxnType 校正:主动还款实际是 MP(Manual Repayment),不是 AP(AP 处理器为空壳)。TxnType 枚举实有 30+ 种(00-总览 的 TxnType 表已据此修正)。
时序
sequenceDiagram autonumber actor C as 客户 participant App as 客户端 H5 participant Job as FCS-Job(dayend/autoCharge) participant FCS as FCS 账务 participant PFS as PFS 产品 participant PMT as PMT 支付 participant EXT as 外部三方(Paystack/Monnify) participant FDS as FDS 催收 C->>App: 查还款计划 App->>FCS: queryRepayPlanList(内部查表) alt 客户主动还款 C->>App: 发起还款 App->>FCS: activeCustomerRepayment → createOrder(TxnType MP) else 代扣调度 Job->>FCS: NormalWithholding/OverdueWithholding → s1200 批处理(TxnType RP) Note over FCS: 读到期账户 + paystackBulkChargePlutus else 大数据触发 FCS->>FCS: bigdataCallRepayment(TxnType BCP) end FCS->>PMT: BeforePaymentMessageUtils.sendMessageRepayPlutus → BeforePaymentPlutusPublisher PMT->>EXT: IThirdPayment.repayment(Mandate 代扣 / 卡扣) EXT-->>PMT: 扣款结果回调 PMT->>FCS: repayResult 回流 Note over FCS: AfterPaymentFactory 按 TxnType 分流销账处理器 FCS->>PFS: queryOffsetConfig 取销账规则 Note over FCS: PaymentHier 先费后本销账(单借据/客户级) + 结清判定 Job->>FCS: dayend 逾期处理(s3400 罚息/滞纳金/状态变更) FCS->>FDS: 逾期案件(数仓拉取→电核/外访) △ Phase2 完整催收
还款 TxnType 真实分流(核心校正)
| 入口方法 | TxnType | 含义 | 路径 | 销账处理器 | 状态 |
|---|---|---|---|---|---|
| activeCustomerRepayment(客户主动还款) | MP Manual Repayment | 客户级主动还款 | createOrder→发消息→回流 | afterPaymentMP | ✓ |
| artificialRepay(人工还款) | MR Manual Reformation | 单借据人工还款 | createOrder→回流 | afterPaymentMP | ✓ |
| 代扣调度(NormalWithholding/OverdueWithholding) | RP | 到期批量代扣 | beforePaymentRP→发消息 | afterPaymentRP | ✓ |
| partialRepayment | CLP Collection Repayment | 部分/催收还款 | beforePaymentCLP | afterPaymentCLP | ✓ |
| bigdataCallRepayment | BCP bigdata call repayment | 大数据触发还款 | beforePaymentBCP | afterPaymentBCP | ✓ |
| refund | RF refund | 退款(放款失败/超额) | beforePaymentRF | afterPaymentRF | ✓ |
| 渠道还款归类 | AP/PR/NC/HP/TP | paystack web/palmpay/normal/TP | — | afterPaymentAP | ✓(AP before 空壳) |
| 虚拟账户/plutus web | VP/PHP/DP/MRJ | 虚拟子账户/plutus web pay | — | afterPaymentMP | ✓ |
| 超额还款 | OFR Overflow Repay | 超额退/还 | — | afterPaymentOFR | ✓ |
| 拒付 | CBP ChargeBack | 资金拒付 | beforePaymentCBP(空壳) | afterPaymentCBP | △ before 空壳 |
| 逾期 charge | OC Overdue Charge | 逾期计费 | — | afterPaymentOC | ✓ |
| 人工小额 | DR Manual Small Amount | 运营小额还款 | beforePaymentDR | afterPaymentDR | ✓ |
架构细节:主动还款(MP)/人工(MR) 不经 BeforePaymentFactory(直接 createOrder + 发消息 + AfterPayment 销账);代扣(RP)/催收(CLP)/大数据(BCP)/退款(RF) 经 BeforePaymentFactory。AfterPaymentFactory 把多渠道 TxnType 归类到同一销账处理器(AP 类含 PR/NC/HP/TP;MP 类含 DP/MR/MRJ/VP/PHP)。
分支清单(穷举还款全部分支)
出处 FinancialBusiness / BeforePaymentFactory / AfterPaymentFactory / OrderTxnBusiness。状态 ✓活跃 / ✗空壳 / △部分。
| # | 分支 | 触发条件 | 处理 | 出处 | 状态 |
|---|---|---|---|---|---|
| 1 | 查还款计划 | 进还款页 | queryRepayPlanList/queryRepayPlanDetailList | INonfinancialService | ✓ |
| 2 | 还款试算 | 试算 | activeRepaymentCalc | INonfinancialService | ✓ |
| 3 | 客户主动还款 | App 发起 | activeCustomerRepayment → MP(客户级,带锁) | FinancialBusiness:357 | ✓ |
| 4 | 人工还款 | 单借据 | artificialRepay → MR | :312 | ✓ |
| 5 | 部分/催收还款 | partialRepayment | CLP | :605 | ✓ |
| 6 | 大数据触发还款 | bigdataCallRepayment | BCP | :650 | ✓ |
| 7 | 退款 | refund | RF(放款失败/超额) | :693 | ✓ |
| 8 | 代扣调度-正常 | Job 到期 | NormalWithholdingJobHandler → RP → paystackBulkChargePlutus | OrderTxnBusiness:596 | ✓ |
| 9 | 代扣调度-逾期 | Job 逾期 | OverdueWithholdingJobHandler → RP | fcs-job | ✓ |
| 10 | 还款消息派发 | 任意还款 | sendMessageRepayPlutus/sendMessageBulkRepayPlutus → BeforePaymentPlutusPublisher | BeforePaymentMessageUtils:227/237 | ✓ |
| 11 | 扣款执行 | PMT 收消息 | IThirdPayment.repayment(Monnify Mandate / Paystack 卡扣) | PMT | ✓ |
| 12 | 结果回流 | 扣款完成 | IInnerPaymentService.repayResult | PMT→FCS | ✓ |
| 13 | 销账分流 | 回流 | AfterPaymentFactory 按 TxnType 分流(14+ case) | AfterPaymentFactory | ✓ |
| 14 | 先费后本销账 | 销账 | PaymentHier + queryOffsetConfig(PFS) | afterpayment/posting | ✓ |
| 15 | 销账上下文 | 单借据/客户级 | loadDataForLoanRepay / loadDataForCustRepay | AcctContextFacility:154/190 | ✓ |
| 16 | 结清判定 | 销账后 | 全部还清判定 | PaymentHier | ✓ |
| 17 | 虚拟账户还款 | 钱包/转账 | vitualAccountRepay(VP) | IInnerPaymentService | ✓ |
| 18 | 各 web pay 渠道 | HP/PHP/PR | paystack/plutus web/palmpay → AP/MP 销账 | AfterPaymentFactory | ✓ |
| 19 | 超额还款 | OFR | afterPaymentOFR | AfterPaymentFactory | ✓ |
| 20 | 拒付 | CBP | beforePaymentCBP 空壳 / afterPaymentCBP | BeforePaymentFactory | △ before 空壳 |
| 21 | 逾期罚息 | dayend | B3423POverdueLoanIntAccu | fcs-job s3400 | ✓ |
| 22 | 逾期滞纳金 | dayend | B3424POverdueLoanLateFeeCalc | fcs-job | ✓ |
| 23 | 逾期状态变更 | dayend | B3422POverdueLoanStatusChange | fcs-job | ✓ |
| 24 | 逾期催收 | 逾期 | fds 案件(电核/外访);锁机/完整催收 Phase 2 | fds | △ Phase2 |
| 25 | 空壳避开 | 选接口 | activeRepayment/singleAtvRepayment/manualRepayment/manualWithhold/singleActiveRepaymentCalc | FinancialServiceImpl | ✗ return null |
接口落地
| # | 业务步骤 | 服务 | 真实接口 | 现状 | 说明 |
|---|---|---|---|---|---|
| 1 | 还款计划/明细 | FCS | queryRepayPlanList/queryRepayPlanDetailList;bns queryCustRepayInfo | ✓ | 内部查计划 |
| 2 | 还款试算 | FCS | activeRepaymentCalc | ✓ | singleActiveRepaymentCalc 为 return null 空壳 |
| 3 | 主动还款发起 | FCS | activeCustomerRepayment(客户级 MP)/ partialRepayment(CLP)/ artificialRepay(MR)/ bigdataCallRepayment(BCP) | ✓ | activeRepayment/singleAtvRepayment/manualRepayment/manualWithhold 均 return null 空壳,避开 |
| 4 | 代扣调度 | FCS-Job | NormalWithholdingJobHandler/OverdueWithholdingJobHandler → paystackBulkChargePlutus(RP) | ✓ | 读到期账户批扣 |
| 5 | 还款消息派发 | FCS→PMT | sendMessageRepayPlutus → BeforePaymentPlutusPublisher(事件) | ✓ | 还款用 Plutus publisher(放款用 PlutusLoanApply) |
| 6 | 扣款执行 | PMT→外部 | IThirdPayment.repayment(Monnify Mandate / Paystack 卡扣) | ✓ | 代扣授权完整 |
| 7 | 结果回流 | PMT→FCS | IInnerPaymentService.repayResult | ✓ | 通知销账 |
| 8 | 销账结清 | FCS+PFS | AfterPaymentFactory 分流 → PaymentHier + IProductClient.queryOffsetConfig | ✓ | 先费后本(单借据/客户级)+ 结清判定 |
| 9 | 逾期/罚息 | FCS-Job | dayend/s3400:罚息累计/滞纳金/逾期状态 | ✓ | 日终批处理 |
| 10 | 逾期催收 | FDS | 案件生成(数仓→电核/外访) | △ | 非完整催收系统;锁机/催收 Phase 2 |
| 11 | 虚拟账户还款 | PMT | IInnerPaymentService.vitualAccountRepay(VP) | ✓ | 钱包/转账→虚拟账号自动入账 |
| 12 | 退款 | FCS | refund(RF) | ✓ | 放款失败/超额退款 |
还款策略
还款的业务策略(触发/调度/通道路由/销账),是时序与接口之外的业务逻辑层。
触发策略
- 主动还款(客户在 App/H5 发起)→ TxnType MP(客户级,带锁)/ MR(单借据人工)。
- 代扣调度(job 自动)→ TxnType RP;分正常代扣 NC(当期到期)与逾期代扣 OC(逾期账户)。
代扣调度策略(Spring Batch,XXL-Job 触发)
- 正常代扣 NC(NormalWithholding):依赖日终(
waitDayEnd,payment 批量成功后)→ 清批次临时表 →B1211RReader 扫到期账户 →B1221PProcessor 生成代扣订单(RP)→B1230WWriter 发批量代扣消息;并发(thread_size)+ 分块批量(commit_size)。 - 逾期代扣 OC(OverdueWithholding):扫逾期账户(
maxOverdueDays限制)。 - 防重:仅处理
OrderStatus.I的订单(兜底防重复发)。
通道路由策略(统一在 PMT,同放款)
- fcs 只发批量代扣消息(
sendMessageBulkRepayPlutus→BeforePaymentPlutusPublisher),通道选择不在 fcs。 - PMT 收消息后走
PaymentManager.routeChannel(与放款同一套):身份分流(BVN→银行账户 / NIN→电子钱包 / Goldman)+ Apollo 通道优先级 + 银行可用性矩阵 + 扣款 pending 容灾轮转。详见 04-放款 > 放款通道路由策略。 - 实际启用通道在 Apollo,代码取不到。
销账策略(PaymentHier)
- 先费后本:按余额组件(
bal_compt:本/息/费/罚)+ 账龄 aging +pfs_offset_order配置顺序销账(顺序配置驱动,非硬编码)。 - 销账上下文两类:单借据(
loadDataForLoanRepay)/ 客户级(loadDataForCustRepay)。 - 复式记账(
fcs_posting_entry借贷方向)+ 销账分录(fcs_offset_entry)+ 结清判定。
扣款执行(PMT)
IThirdPayment.repayment:Monnify / NIBSS Mandate 代扣授权(Direct Debit)+ Paystack 卡扣(charge token)。- Mandate 授权在绑卡阶段建立(见 03-借款 绑卡),代扣时凭 Mandate 扣款。
缺口小结
- 还款主链路完整且通:计划/试算/主动还款(MP)/部分还款(CLP)/代扣(RP)/大数据触发(BCP)/退款(RF)/事件派发/扣款/回流/销账结清/逾期罚息 均具备,fcs→pmt 走事件桥。
- TxnType 远比早期记录丰富:枚举实有 30+ 种,还款相关 MP/MR/RP/CLP/BCP/RF/OFR/VP/HP/PHP/PR/NC/TP/DR/OC 等。主动还款=MP(非 AP);AP/CBP 的 before 处理器空壳。00-总览 的 TxnType 表已据此修正。
- 销账归类:AfterPaymentFactory 把多渠道 TxnType 归到同一销账处理器(AP 类、MP 类),销账上下文分单借据/客户级。
- 同名空壳需避开(return null):
activeRepayment/singleAtvRepayment/manualRepayment/manualWithhold/singleActiveRepaymentCalc——主动还款走activeCustomerRepayment/partialRepayment。 - 逾期罚息/滞纳金/状态齐备(dayend);完整催收作业系统缺失——fds 仅案件+电核/外访,锁机与系统化催收 Phase 2。