R5-账户与借据状态机
PayLater 一个用户的当前处境由多个相互独立的状态维度叠加描述:开通/KYC、账户冻结/拦截态、账单态、借据/还款态、会员态、客群态。
"PayLater 一个用户的"当前处境"由多个相互独立的状态维度叠加描述"
开通/KYC 态入口来自后端 OPEN_STATUS(开户/KYC 状态),前端有 OPEN_STATUS_MAP(开户结果路由)与 PayLaterStatus(更细扩展枚举)两套枚举。
"入口来自后端 `OPEN_STATUS`(开户/KYC 状态)"
OPEN_STATUS=T017 表示待视频面签(待 VB):未开户,需完成视频面签 KYC。
"待视频面签 (待 VB) | `OPEN_STATUS = T017`"
OPEN_STATUS=T023 表示待 VB+补充资料:未开户,需同时完成视频面签和补充资料。
"待 VB + 补充资料 | `OPEN_STATUS = T023`"
OPEN_STATUS=T216 表示已开户(额度正常):开户成功,授信额度建立,可用。
"已开户(额度正常) | `OPEN_STATUS = T216`"
OPEN_STATUS=T217 表示开户管控/拒绝:开户被管控或拒绝,无法开户。
"开户管控 / 拒绝 | `OPEN_STATUS = T217`"
PayLaterStatus.Locked=ACTIVE_CREDIT_FREEZED 表示已开户额度锁定:已开户但额度异常、被锁定。
"Locked = ACTIVE_CREDIT_FREEZED` | 已开户但额度异常、被锁定"
表单层通过数字变体 currentPlaylaterStatus 等于 '1022' 或 '1017' 判断是否需要视频面签。
"`currentPlaylaterStatus === '1022' || '1017'`"
开通流转:未开户T211申请提交后进入待VB T017/待补料T022/待VB+补料T023,再到授信审批中T215;T215分流为已开户T216(进入正常用账)或开户管控/拒绝T217(终态);已开户T216额度异常则进入ACTIVE_CREDIT_FREEZED额度锁定。
"未开户 T211 → 申请提交"
账户冻结/可用态来源于后端 BLOCK_CODE 映射为 accountInfo.blockCode,构造时映射为 frozenState(ACCOUNT_FROZEN_STATE)。
"来源:后端 `BLOCK_CODE` →`accountInfo.blockCode`"
取款/支付前在 checkAccountBeforeWithdrawAndPay 按 blockCode 字符匹配进行拦截。
"取款/支付前在 `checkAccountBeforeWithdrawAndPay` 按字符匹配拦截"
blockCode 含 q 表示身份证待重传:账户未激活,弹窗要求重新上传身份证。
"身份证待重传 | `blockCode` 含 `q`"
blockCode 含 R|S|F|n|B 表示账户冻结:PayLater 不可用,弹窗账户已冻结。
"账户冻结 | `blockCode` 含 `R\|S\|F\|n\|B`"
blockCode 含 R/S 映射 frozenState=LOSS('RS'),表示账户挂失态。
"挂失态 | `blockCode` 含 `R` / `S`;`frozenState = ACCOUNT_FROZEN_STATE.LOSS('RS')`"
blockCode 含 F/n/B 映射 frozenState=LOCK('nBF'),表示风控锁定。
"风控锁定 | `blockCode` 含 `F` / `n` / `B`;`frozenState = ACCOUNT_FROZEN_STATE.LOCK('nBF')`"
blockCode 含 T 表示身份验证中:PayLater 未激活,弹窗身份验证中请等待。
"身份验证中 | `blockCode` 含 `T`"
blockCode 含 A|Z 或 acctStmtStatus=OVER_DUE,映射 frozenState=LOCK_PART('AZ'),表示财务系统部分锁定,弹窗引导还款。
"逾期 / 部分锁定 | `blockCode` 含 `A\|Z`;或 `acctStmtStatus === BILL_STATE_TYPE.OVER_DUE`;`frozenState = ACCOUNT_FROZEN_STATE.LOCK_PART('AZ')`"
blockCode 为空/NONE 映射 frozenState=NONE,表示账户可用无冻结。
"无冻结 | `blockCode` 为空 / `NONE`;`frozenState = ACCOUNT_FROZEN_STATE.NONE`"
accountInfo.emailVerifyRequired 为 true 表示需邮箱验证:PayLater 未激活,需先验证邮箱。
"需邮箱验证 | `accountInfo.emailVerifyRequired === true`"
拦截层叠加在已开户之上,任一命中即拦截取款/支付:blockCode q 重传身份证、R/S/F/n/B 账户冻结、T 身份验证中、A/Z或账单逾期引导还款、emailVerifyRequired 先验证邮箱;blockCode解除或邮箱已验则恢复可用。
"叠加在"已开户"之上的拦截层,任一命中即拦截取款/支付"
账单级状态为 STMT_STATUS_MAP;账户级 acctStmtStatus(=ACCT_STMT_STATUS)取值同为 BILL_STATE_TYPE(含 NONE)。
"账单级状态 `STMT_STATUS_MAP`"
账单状态为「未出账」时 STMT_STATUS=U(STMT_STATUS_MAP.NO_BILL / BILL_STATE_TYPE.NOT_IN_DUE),表示本期账单未出。
"未出账 | `STMT_STATUS = U`;`STMT_STATUS_MAP.NO_BILL` / `BILL_STATE_TYPE.NOT_IN_DUE` | 本期账单未出"
账单状态为「已出账」时 STMT_STATUS=N(STMT_STATUS_MAP.HAD_BILL / BILL_STATE_TYPE.IN_DUE),表示账单已出、待还款。
"已出账 | `STMT_STATUS = N`;`STMT_STATUS_MAP.HAD_BILL` / `BILL_STATE_TYPE.IN_DUE` | 账单已出,待还款"
账单状态为「已逾期」时 STMT_STATUS=O(STMT_STATUS_MAP.OVERDUE / BILL_STATE_TYPE.OVER_DUE),表示账单逾期未还。
"已逾期 | `STMT_STATUS = O`;`STMT_STATUS_MAP.OVERDUE` / `BILL_STATE_TYPE.OVER_DUE` | 账单逾期未还"
账单状态为「已还清」时 STMT_STATUS=F(STMT_STATUS_MAP.REPAID / BILL_STATE_TYPE.CLEAN_DUE),表示账单已结清。
"已还清 | `STMT_STATUS = F`;`STMT_STATUS_MAP.REPAID` / `BILL_STATE_TYPE.CLEAN_DUE` | 账单已结清"
账户级账单状态 acctStmtStatus=NONE(BILL_STATE_TYPE.NONE)表示无账单数据。
"无数据(账户级) | `acctStmtStatus = NONE`;`BILL_STATE_TYPE.NONE` | 无账单数据"
账单布尔 isNoBill 由 STMT_STATUS===U 判定,表示未出账。
"`isNoBill` | `STMT_STATUS === U` | 未出账"
账单布尔 isOverDue 由 OVERDUE_DAYS>0 判定为已逾期,按逾期天数判定而非直接读 STMT_STATUS。
"`isOverDue` | `OVERDUE_DAYS > 0` | 已逾期(按逾期天数判定,不直接读 STMT_STATUS)"
账单布尔 isCanRepay 由 STMT_STATUS===N 或 ===O 判定,表示已出账(含逾期)可还款。
"`isCanRepay` | `STMT_STATUS === N \|\| === O` | 已出账(含逾期)可还款"
账单布尔 isUnused 由 CUR_STMT_AMT===0 且 STMT_PAID_AMT===0 判定,表示本期未使用。
"`isUnused` | `CUR_STMT_AMT === 0 && STMT_PAID_AMT === 0` | 本期未使用"
账单布尔 isRepaid 由 STMT_STATUS===F 判定,表示已结清。
"`isRepaid` | `STMT_STATUS === F` | 已结清"
账户层使用态 ACCT_USE_STATUS(USE_STATE_TYPE)取值:W 未使用、H 当期有已出账单、N 当期无已出账单。
"账户层另有使用态 `ACCT_USE_STATUS`(`USE_STATE_TYPE`:`W` 未使用 / `H` 当期有已出账单 / `N` 当期无已出账单"
综合账户态 ACCOUNT_STATE 取值为 W/AC/NAC/RFC/OPC/NU/HN/HF/HO。
"综合账户态 `ACCOUNT_STATE`(`W/AC/NAC/RFC/OPC/NU/HN/HF/HO`"
账单状态流转:未出账 U 出账后变已出账 N;按期还清则已还清 F;到期未还变已逾期 O(OVERDUE_DAYS>0),还清后变已还清 F。
"未出账 U → 出账 → 已出账 N ├─ 按期还清 → 已还清 F └─ 到期未还 → 已逾期 O(OVERDUE_DAYS > 0)→ 还清 → 已还清 F"
借据(IOU)状态由 LOAN_STATUS_TYPE 表示。
"借据(IOU)状态 `LOAN_STATUS_TYPE`(`src/models/pay-later/loan.js:4-8`)"
借据状态 LOAN_STATUS_TYPE.SUCCESS=S 表示借据放款成功。
"借据成功 | `LOAN_STATUS_TYPE.SUCCESS = S` | 借据放款成功"
借据状态 LOAN_STATUS_TYPE.FAIL=F 表示借据放款失败。
"借据失败 | `LOAN_STATUS_TYPE.FAIL = F` | 借据放款失败"
借据状态 LOAN_STATUS_TYPE.WAIT=O 表示借据待处理/处理中。
"借据处理中 | `LOAN_STATUS_TYPE.WAIT = O` | 借据待处理 / 处理中"
还款状态 REPAYMENT_STATUSES.PENDING=P 表示还款交易处理中。
"还款处理中 | `REPAYMENT_STATUSES.PENDING = P` | 还款交易处理中"
还款状态 REPAYMENT_STATUSES.SUCCESSFUL=S 表示还款成功。
"还款成功 | `REPAYMENT_STATUSES.SUCCESSFUL = S` | 还款成功"
还款状态 REPAYMENT_STATUSES.FAIL=C 表示还款失败。
"还款失败 | `REPAYMENT_STATUSES.FAIL = C` | 还款失败"
还款类型 REPAYMENT_TYPES.EARLY_REPAYMENT=IOURepay 表示单笔借据提前结清。
"还款类型:借据提前结清 | `REPAYMENT_TYPES.EARLY_REPAYMENT = IOURepay` | 单笔借据提前结清"
还款类型 REPAYMENT_TYPES.BILL_REPAYMENT=BillRepay 表示按账单还款。
"还款类型:账单还款 | `REPAYMENT_TYPES.BILL_REPAYMENT = BillRepay` | 按账单还款"
展期重组状态 extensionStatus.S=success 表示展期/重组申请成功。
"展期重组成功 | `extensionStatus.S = success` | 展期 / 重组申请成功"
展期重组状态 extensionStatus.P=inprocess 表示展期/重组申请处理中。
"展期重组处理中 | `extensionStatus.P = inprocess` | 展期 / 重组申请处理中"
展期重组状态 extensionStatus.C=failed 表示展期/重组申请失败。
"展期重组失败 | `extensionStatus.C = failed` | 展期 / 重组申请失败"
字段 OVERDUE_DAYS 为数值型(默认 0),表示逾期天数,isOverDue 即由其 >0 判定。
"`OVERDUE_DAYS` | number(默认 0) | 逾期天数,`isOverDue` 即由 `>0` 判定"
字段 OVERDUE_TIMES 为数值型(默认 0),表示账单逾期次数。
"`OVERDUE_TIMES` | number(默认 0) | 账单逾期次数"
字段 HAS_REPAY 取值 Y/N(默认 N),表示是否有过还款。
"`HAS_REPAY` | `Y` / `N`(默认 N) | 是否有过还款"
展期重组申请通过 API /core/trans/extension/apply 发起,交易类型为 EXTENSION=EX。
"展期重组申请 API:`/core/trans/extension/apply`(`src/constants/api.js:1984`),交易类型 `EXTENSION = EX`"
借据流转:处理中 O 转成功 S(计入账单/可还款)或失败 F。
"借据:处理中 O → 成功 S(计入账单/可还款) / 失败 F"
逾期流转:账单逾期后可申请展期重组(处理中 P 转成功 S 或失败 C),还清后逾期解除。
"逾期:账单逾期 → 可申请展期重组(处理中 P → 成功 S / 失败 C)→ 还清后逾期解除"
LimitUp 会员用于额度成长,会员实体来自 API /core/account/limit-up-member/get,首页卡片显示态为 memberCardState。
"LimitUp 会员(额度成长)。会员实体来自 `/core/account/limit-up-member/get`"
会员激活(有效)的条件为 member.status===ACTIVE 且 expireTime>systemDate。
"会员激活 | `member.status === ACTIVE` 且 `expireTime > systemDate` | 会员有效"
会员卡片显示态 memberCardState=none(!isMemberVisible),表示不满足前置条件、卡片不展示。
"卡片:隐藏 | `memberCardState = none`(`!isMemberVisible`) | 不满足前置条件,卡片不展示"
会员卡片显示态 memberCardState=expiringSoon(isMemberExpiredSoon,距 expireTime≤7天),表示会员即将到期、提示续费。
"卡片:即将过期 | `memberCardState = expiringSoon`(`isMemberExpiredSoon`,距 `expireTime` ≤ 7 天) | 会员即将到期,提示续费"
会员卡片显示态 memberCardState=active(isMember),表示会员有效且非临期。
"卡片:活跃 | `memberCardState = active`(`isMember`) | 会员有效且非临期"
会员卡片显示态 memberCardState=inactive(可见但非会员/已过期),表示未开通或已过期、引导开通。
"卡片:非活跃 | `memberCardState = inactive`(可见但非会员 / 已过期) | 未开通或已过期,引导开通"
会员功能全局开关为 marketCode.startsWith('01'),即 marketCode 以 01 开头时会员功能启用。
"会员功能全局开关:`marketCode.startsWith('01')`"
会员提额比例取自 marketCode 第 3-4 位(getMemberPremiumPercent),仅会员 ACTIVE 时生效。
"会员提额比例取 `marketCode` 第 3-4 位(`getMemberPremiumPercent`,`src/utils/limit-up-utils.js:52`,仅会员 ACTIVE 时生效)"
会员态流转:非活跃 inactive 开通后转活跃 active;临近到期(≤7天)转即将过期 expiringSoon;续费转回活跃 active,过期转回非活跃 inactive。
"非活跃 inactive ──开通──→ 活跃 active ──临近到期(≤7天)──→ 即将过期 expiringSoon ├─ 续费 → 活跃 active └─ 过期 → 非活跃 inactive"
当前置条件不满足(邮箱/身份未验、账户冻结、未启用)时会员卡片隐藏为 none。
"前置条件不满足(邮箱/身份未验、账户冻结、未启用)→ 隐藏 none"
当 accountInfo.riskCode 含 Y001(isY001)时识别为 LimitUp 灵活额度用户,走灵活额度策略
"LimitUp 灵活额度用户 | `accountInfo.riskCode` 含 `Y001`(`PaylaterUserType.FlexibleLimitUser`);`isY001` | LimitUp 客群,走灵活额度策略"
当 marketCode 第 20 位 charAt(19)==='4' 时识别为 Beta 灰度新 UI,V2 授信结果页可见
"Beta(灰度新 UI) | `marketCode` 第 20 位 `charAt(19) === '4'`;`LIMIT_UP_USER_TIER.BETA` | 新 UI 灰度 Beta,V2 授信结果页可见"
当 marketCode 第 20 位 charAt(19)==='5' 时识别为 Gamma 灰度新 UI,主页/Mission 走 V2,授信结果页回退 V1
"Gamma(灰度新 UI) | `marketCode` 第 20 位 `charAt(19) === '5'`;`LIMIT_UP_USER_TIER.GAMMA` | 新 UI 灰度 Gamma,主页/Mission 走 V2,授信结果页回退 V1"
当 marketCode 第 20 位非 4/5 时识别为老 LimitUp(NONE 兜底),脏数据兜底走 V1
"老 LimitUp(NONE 兜底) | `marketCode` 第 20 位非 `4`/`5`;`LIMIT_UP_USER_TIER.NONE` | 脏数据兜底走 V1"
Alpha 是首页 UI 变体的页面版本标签,并非独立客群标识,不属于客群枚举
"Alpha | 首页 UI 变体(`pages/pay-later/home/Index.vue`),非客群枚举 | UI 页面版本标签,并非独立客群标识"
PaylaterUserType 用户类型枚举包含:Y002 Liquidity 用户、G001 不建议报送模型训练的正常客户、ZQ01 转分期用户、DBDP(在贷余额>0 需还清后才可复借)
"`Y002` Liquidity 用户、`G001` 不建议报送模型训练的正常客户、`ZQ01` 转分期用户、`DBDP`(在贷余额>0 需还清后才可复借)"
客群态相对静态,按字段判定,不在前端发生流转,作为投放/策略的分流标签叠加在各动态状态之上
"客群态相对静态(按字段判定,不在前端发生流转),主要作为投放/策略的分流标签,叠加在前述各动态状态之上。"
支用态(cashState)为前端派生枚举,由 stmtState/cashLimit/availableLimit/onceLoan 推导,决定首页 Instant Cash 入口的分流
"由 `stmtState`/`cashLimit`/`availableLimit`/`onceLoan` 推导,**决定首页 Instant Cash 入口的分流**"
cashState=W(NEW_CREDIT)表示首借用户(未借款未支付),派生条件为 stmtState=NEW_CREDIT,去向 Intro 教育页
"`W`(NEW_CREDIT) | 首借用户(未借款未支付) | `stmtState=NEW_CREDIT` | Intro 教育页"
cashState=AC(AVAILABLE_CREDIT)表示可借,派生条件为 cashLimit≥门槛,去向直接进取现流程
"`AC`(AVAILABLE_CREDIT) | 可借 | `cashLimit ≥ 门槛` | 直接进取现流程"
cashState=OPC(ONLY_PAY_CREDIT)表示只可支付不可取现,派生条件为 cashLimit=0 且 availableLimit≠0 且未借过,无取现入口
"`OPC`(ONLY_PAY_CREDIT) | 只可支付不可取现 | `cashLimit=0 且 availableLimit≠0 且未借过` | 无取现入口"
cashState=REPAY_FIRST_CREDIT 表示需先还款,派生条件为 stmtState=OVER_DUE,去向拦截引导还款
"REPAY_FIRST_CREDIT | 需先还款 | `stmtState=OVER_DUE` | 拦截引导还款"
cashState=NOT_AVILABLE_CREDIT 表示取现额度不足,派生条件为 cashLimit<门槛,去向额度不足提示
"NOT_AVILABLE_CREDIT | 取现额度不足 | `cashLimit < 门槛` | 额度不足提示"