任务说明 — 现金贷业务时序与接口落地梳理

本文是梳理任务的工作笔记(目的/方法/进展/备忘),不是给开发的交付文档。给开发看的是同目录下 00-总览 + 各阶段文件。

目的

现金贷产品定义 的业务旅程,逐步映射到现网代码里真实存在的接口与调用时序,标注每一步能否跑通,暴露能力缺口,供研发对照代码评估改造点。

依据与方法

  • 代码来源gitlab/backend-cashloan 各服务 master 分支(已 pull 最新)。
  • 可信度:接口名、@RequestMapping 路径、Feign 客户端、调用顺序均来自源码核对,非推测。
  • 深度边界:到接口串联级;标「待读实现」处表示未深入方法内部逻辑。
  • 读法路径:前端 H5 → 业务网关(路由/鉴权/加解密)→ bns service-api(端点)→ bns business 层(编排)→ facility/outgoing Feign 调下游。
  • 工具code-toolset MCP。code_search(语义分级 def/ref/string,跨模块一次到位)是定位调用方、确认实现的主力,优于裸 grep。call_graph(LSP 符号级 callers/callees)用于追调用链,仅在单个 reactor 工作区内有效(如 fund-control),其外的调用者不出现、跨边界被调者解析到 jar 而非源码——0 结果须用 code_search 在更大范围复核。跨服务 Feign 调用(如 bns→fcs)任何工具都追不到(HTTP 边界),靠手工接口对应。

时序梳理标准(追踪到头)

每条调用链路必须追到终点,终点只有三类之一,不允许画到中间服务就停:

终点类型表现图中画法
① 系统内部闭环落本地表 / 查本地表 / 纯计算,不再外呼Note over 服务: ...(内部落库/查表)
② 外部三方打到 Smile Identity / 支付通道 / 银行 / NIBSS 等画到外部 participant,箭头指向它
③ 缺失系统不在代码库 / 被注释 / 留 TODO(如 Bridge、res)画到缺失节点并标 ✗

附加规则:

  • 每个 participant 必须有连线,没有连线的节点不许出现(孤立节点 = 梳理漏项)。
  • 每条连线必须有代码出处(接口名 / 类:行)。
  • bns 调下游服务的,继续追该下游服务的终点(跨服务追,直到落到上面三类之一)。

梳理教训(踩过的坑)

  • 锚定产品定义阶段,不自创阶段:试算、逾期是子步骤不是阶段(曾误把”试算”当独立阶段)。
  • 注释 / TODO 即事实:被 //todo/* */ 注释的调用标 ✗(当前不执行),不可当它在跑(风控决策/互斥/agg 通知都栽在这)。
  • 子流程不压成一行:像绑卡这种”取地址 → 跳转 → 回调”是子系统交互,要展开到终点,不能简化成单接口(绑卡曾被压成一行 routeRedirect)。
  • 声明的节点必须用到:曾在授信图里放了 FCS 节点却无连线——授信其实不调 FCS。
  • mermaid 文本禁用半角分号 ;:Note/消息文本里的 ; 触发 parse error,用逗号或、代替;同时避免 )+ 紧邻。
  • 不要用窄 grep 证伪「缺失」(04 放款栽过的大跟头,连栽两次):曾 grep paymentOrderPush/plutus-pay-charge/空 IPlutusClient 没命中就判”放款链路缺失”——错;再用 sendMessagePay(死代码)/doTransferOrder(实为订单归档) 误判”待确认”——又错。真实派发是 loanApplyCallBackBeforePaymentLA.executelaChannelPlutusPlutusLoanApplyPublisher.sendMsg(放款)/ BeforePaymentPlutusPublisher(还款)。教训:判”缺失”前用 call_graph 追 callees 把事件 publisher 抽象查全,别靠猜命名去 grep。
  • R/P/W = Reader/Processor/Writer(Spring Batch),不是业务语义;批处理逻辑常在 Processor,别只看 Writer。
  • 标 ✓ 前必须读实现体:端点存在 ≠ 已实现。applyOverFlowRepay/queryLoanForOverFlowRepay 端点在、却是 return null 空壳(超额还款栽过)。光看 service-api 接口清单会把空壳误标 ✓——下游接口要进 impl 确认非 return null/非空体。
  • 每个阶段/旁路文档结构统一:概述 → 时序图 → 接口落地表 → 缺口小结。即使是 FCS 纯内部流程也要画时序(含内部闭环终点),不可省图。

架构事实(跨阶段复用)

  • 两层网关 + Eureka 服务发现business-gateway(C 端入口,路由 /bns /agg /crs /fcs,Token/AES)+ middle-gateway/infrgateway(中台/服务网关,经 Eureka lb:// 路由 blc/ims/bfs/cfk/mkt/hapmt/plutus-pmt,每条路由套脱敏加解密)。“中台服务前端不直连”仅对 business-gateway 成立——中台服务经 middle-gateway 可达。bns 内部调下游仍走 Feign。内部服务别名:blc=bns-gateway、cfk=fcs、bfs=pfs、ims=ims、plutus-pmt=pmt。
  • bns 分层service-api@RequestMapping 端点)→ service-impl(薄,转调)→ business(编排核心,时序读这层)→ facility/outgoing(Feign 下游)。
  • 外部 Bridge(Transsnet,env TANK_BRIDGE_SERVICE 只在 fcs 接 4 个 Feign(风控/优惠券/大数据/发布),唯一活跃是发布 saveEventLog(放款/还款事件日志),其余全注释或空壳。bns 不接 bridge——bns 的风控决策/BVN/互斥/人脸调用均注释,目标是 res/大数据/crs。
  • 绑卡经跳转绕开网关:bns routeRedirect 返回 redirectUrl+bindCardType → 前端跳 IMS 托管页/通道页完成(银行卡走 token;银行账户走 Direct Debit + OTP)→ 通道回调 IMS → IMS 回调 bns bindCardCallBack
  • “判断类能力被系统性注释”是反复出现的模式:授信风控决策、借款大数据互斥、agg 变量通知均被注释/TODO;信息采集与落库链路完整,缺的是”判断”。这是评估改造点的核心结论。
  • 核验类能力同样空转:BVN/KYC 核验活跃路径(kycBvnMatch/kycDataPocket)只构造本地对象不外呼,真实第三方调用(queryBigdataBvn/bankBvnMatch)注释——授信”采集完整但核验/判断都不真实执行”。
  • fcs→pmt 资金派发走事件 publisher:放款 PlutusLoanApplyPublisher、还款 BeforePaymentPlutusPublisher(不同 publisher);BeforePaymentFactory(9 case:LA/AP/RP/CLP/CBP/BCP/RF/IP/DR,扣款前构造)+ AfterPaymentFactory(14+ case,回流销账);TxnType 枚举 30+ 种,主动还款=MP(非 AP,AP before 处理器空壳),详见 00-总览
  • 服务名易误导doTransferOrder 是”订单归档到历史表”非放款转账;sendMessagePay 是死代码。按名字猜功能会错,必须读实现 / 用 call_graph。

命名约定

  • 本任务目录:13-现金贷业务时序与接口落地/00-总览 + 0X-阶段名(编号对齐 05 系统交互 习惯)。
  • 手机分期后续同法另起 14-手机分期业务时序与接口落地/
  • 各阶段文件统一结构:概述 → 时序图(真实服务名)→ 接口落地表 → 缺口小结。

进展

阶段口径:按动作切分。试算/绑卡/合同/提交归入借款;首借/复借是借款内的 isFirstLoan 分支(符合「首借/复借是用信内分支」原则);逾期归入还款。

阶段文件状态
总览00-总览已出(随阶段补充缺口总表)
① 注册登录01-注册登录已出
② 授信02-授信已出
③ 借款(首借/复借分支,含试算/绑卡/合同/提交)03-借款已出
④ 放款04-放款已出
⑤ 还款(含逾期处置)05-还款已出
旁路 · 提额06-旁路-提额已出
旁路 · 超额还款07-旁路-超额还款已出
旁路 · 优惠券减免08-旁路-优惠券减免已出(整段注释,依赖外部 Bridge)
旁路 · 减免/调额09-旁路-减免调额已出
旁路 · 邀请返现暂不做(用户定,IInversionInviteClient→外部 agg)

已知问题 / 备忘

  • 结构性发现(已校正):风控决策/大数据 BVN/互斥/人脸核验在 bns(与 fcs)里均注释,目标据注释是 res/大数据/crs不是 bridge。bridge(TANK_BRIDGE_SERVICE)只在 fcs,且只剩发布 saveEventLog(放款/还款事件日志)活跃。评估”能否独立跑通”围绕 res/crs/大数据 三个未就绪模块,不是 bridge。
  • res 决策引擎仓库未拿到(本地无 res 目录);从调用方 riskPrice(bns/fcs 均注释)反推其契约。
  • 早期”bns 未推送”的判断不成立——bns 已推送可读(business-system 197 java + business-gateway 11 java)。
  • 验证码短信发送出口在 bns 中未见(无短信 Feign 客户端)。
  • CRS(征信/KYC)在现金贷主链路未被 bns 调用,与空壳现状一致。
  • 放款派发机制(④ 已更正):fcs→pmt 放款经事件桥 BeforePaymentPublisher.publish(EventType.FCS_BEFORE_PAYMENT)(事务提交后发消息到 pmt)→ PMT IThirdPayment.transfer 通道放款。链路是通的(先前误判为缺失已更正)。
  • 待确认(需后端讲解人):bns 提现申请单(applyStatus=C) → fcs 放款触发(createDebitOrder/doTransferOrder) 的精确衔接;PMT 消费 FCS_BEFORE_PAYMENT 的 binding 配置;建据(LoanInfo)时点。
  • 待确认(需深入读实现):多期销账细节——进入 ⑤ 还款阶段再定是否深读。