本体协作平台
M 2 · DOC-2026-024 · extracted

R7-通知触达与交易流水

原文 · 57 段(高亮 = 已被卡片引用)
p1# R7 · PayLater 通知触达与交易流水
p2> 面向产品 / 数据团队。本篇汇总两块:**一、通知与触达**(push / 邮件 / OTP / 站内提醒 / 原生事件上报)与 **二、交易流水**(交易列表入口、接口、`TRANSACTION_TYPE` 类型表)。 > 代码源:`/Users/leo/Allo Paylater/ifes-resm/src`(HEAD `fb597d5`)。 > 相关篇目:还款提醒文案逻辑配合 `11 账单还款`,提额奖励配合 `03 提额奖励`,质押配合 `04 质押`,会员配合 `07 会员`。术语见 [术语表](R2-术语表.md),字段见 [数据字段字典](R3-数据字段字典.md)。
p3总体结论:**前端不直接发 push/邮件**。触达分三类——
p41. **原生事件上报**:前端通过 `reportToOutside` 把事件上报给 Appsflyer / Insider / Firebase,由宿主 Allo App 与营销平台(Insider)驱动原生 push / 营销触达; 2. **邮件 / OTP**:由后端 API 下发,前端只触发接口并提示"已发送"; 3. **还款 / 逾期提醒**:纯站内文案 + banner/popup,阈值在前端按 `remainDays`(账单页 `dueDate` 差值)与后端下发的 `daysToDue` / `overdueTimes`(首页)判定。
p5---
p6## 一、通知与触达
p7### 1.1 原生事件上报总线 reportToOutside
p8`reportToOutside` 是触达的核心通道,把一个 event 同时上报给三家平台:
p9| 平台 | 作用 | 出处 | |---|---|---| | Appsflyer | 归因 | `plugins/hybrid/src/native-methods.js:198` | | Insider | 营销/engagement 平台,**宿主 App 接到事件后可驱动原生 push / 营销** | `:199` | | Firebase | 事件分析 | `:200` |
p10定义在 `plugins/hybrid/src/native-methods.js:197`。三个底层方法均有 `app_id === ALLO_APP_ID` 门控(`:145`/`:161`/`:178`),即**仅对 ALLO 渠道上报**。前端本身不发 push,只"上报事件"。
p11事件枚举在 `constants/stats/report-to-outside.js`(共 38 个 eventName),关键项:
p12| Key (file:line) | 业务含义 | |---|---| | `CLICK_APPLY_LANDING_PAGE` (:2) / `NOT_CLICK_APPLY_LANDING_PAGE` (:8) | 落地页勾选 TnC 并点申请 / 未点 | | `ON_BOARDING_PIN_INPUT` (:14) / `_NO_SUBMIT` (:20) | 开户输入 PIN | | `USER_CLICK_ON_VERIFY` (:26) / `_NO_SUBMIT` (:32) | OCR 后点验证 | | `FACE_VERIFICATION_SUCCESS` (:38) / `_FAILED` (:44) | 人脸核身成功 / 失败 | | `SUBMIT_LOAN_FORM` (:50) / `_NO_SUBMIT` (:56) | 提交贷款表单 | | `REJECTED_UNDERWRITTING` (:62) | 审批拒绝 | | `APPROVAL_IN_PROGRESS` (:68) | 审批中 | | `PAYLATER_APPROVED` (:74) / `_A` (:83) / `_B` (:92) | 审批通过(A/B) | | `REJECTED_PAYLATER_BUT_UPGRADED` (:101) | PL 拒绝但升级为 Prime | | `ENTER_GET_CASH_CLICK` (:113) | 进入取现 | | `VIEW_TRANSACTION_PAGE` (:161) | 进入交易记录页 | | `VIEW_BILLING_CYCLE_PAGE` (:167) | 进入账单页 | | `BILLING_CYCLE_REPAY_THIS_BILL_CLICK` (:173) / `_NO_CLICK` (:179) | 账单页点还款 | | `BILLING_CYCLE_REPAY_NOW_CLICK` (:185) / `_NO_CLICK` (:191) | 立即还款 | | `VIEW_COUPON_PAGE` (:209) / `VIEW_FAQ_PAGE` (:215) | 进入券中心 / FAQ | | `LIMITUP` (:221) / `LOAN_ACC_OPENED` (:227) / `LIQUIDITY_LOAN` (:233) | 提额 / 开户成功 / 流动性贷款 |
p13调用点遍布各页(`pages/pay-later/Index.vue`、`apply/`、`common/face`、`common/password/verify` 等),全部形如 `this.$native.reportToOutside({ params: REPORT_OUTSIDE.XXX })`。
p14**两处动态上报(不走上述枚举)**,定义在 `utils/report.js`:
p15- **开户成功上报** `reportOpenAccount()`(`utils/report.js:142`):开户成功/补报时,先查后端配置 `amsEventReportConfig`(moduleId=`OPEN_ACCT`)取 `eventNameList`,逐个 `reportToOutside`(`:188`),带 `PL_Level` / `value` / `currency:'IDR'` / `user_id`,再调 `amsAccountOpenAcctEventMarkReported` 标记已报(`:204`)。事件名**由后端下发**。 - **提额/质押锁额成功上报** `reportLockAmount()`(`utils/report.js:217`):质押成功时 `reportToOutside` eventName=`limit_lock_amount_success`,带 `user_id`。调用点 `pages/pay-later/flexible-limit/EnterAmount.vue:1033`(质押成功结果页)。
p16### 1.2 还款到期提醒(站内文案)
p17判定阈值有两处真源:账单页 `BillFooter.vue`(按 `dueDate` 现算)与首页 `home/Index.vue`(按后端 `daysToDue` / `overdueTimes`)。
p18**A. 账单页** `pages/pay-later/bill/components/BillFooter.vue` - `remainDays = dayjs(dueDate).diff(currentDate, 'days')`(`:34`) - 文案分支 `remianText`(`:39`): - `isOverDue` → `your_bill_is_n_days_overdue_please_repay_now` - `remainDays > 3` → 空(不提醒) - `remainDays === 0` → `please_repay_today_to_avoid_late_fee` - `remainDays === 1` → `dont_forget_to_repay_within_one_days` - 2–3 天 → `dont_forget_to_repay_within_n_days`(带 n)
p19**B. 首页** `pages/pay-later/home/Index.vue`(字段 `accountInfo.daysToDue`,后端返回) - 到期分支(`:175`):`daysToDue===0` → `please_repay_by_today_to_avoid_the_late_fee`;`===1` → `dont_forget_to_repay_within_day_by`;`2–3` → `dont_forget_to_repay_within_days_by`;else → `your_bill_is_ready_repay_by_etc` - 逾期分支(`:214`):`overdueTimes===1` 且 `IN_DUE` → `you_have_overdue_bill_etc`;否则 `your_bill_is_overdue_with_late_fee`(带罚息 `penaltyBal`);`overdueTimes>1` → `you_have_overdue_bills_etc` - 逾期改造 banner `showOverdueRestructureBanner`(computed `:596`,模板 `:217`)→ `adjust_repay_overdue_desc` + CTA `adjust`
p20**i18n 文案**(EN/ID 均已落地):
p21| key | EN | 出处 | |---|---|---| | `bill.index.please_repay_today_to_avoid_late_fee` | Please repay today to avoid late fee. | `locales/en/pay-later/bill.yml:22` | | `bill.index.dont_forget_to_repay_within_one_days` | Don't forget to repay within 1 day. | `bill.yml:12` | | `bill.index.dont_forget_to_repay_within_n_days` | Don't forget to repay within {n} days. | `bill.yml:11` | | `bill.index.your_bill_is_n_days_overdue_please_repay_now` | Your bill is {n} days overdue. Please repay now. | `bill.yml:29` | | `home.index.please_repay_by_today_to_avoid_the_late_fee` | Please repay by today to avoid the late fee. | `locales/en/pay-later/home.yml:38` | | `home.index.dont_forget_to_repay_within_day_by` / `_days_by` | Don't forget to repay within {days} day(s) by {date}. | `home.yml:23-24` | | `home.index.you_have_overdue_bill_etc` / `_bills_etc` | You have {day} overdue bill(s). Please repay now. | `home.yml:53-54` | | `home.index.your_bill_is_overdue_with_late_fee` | Your bill is overdue with late fee Rp{fee}… | `home.yml:58` | | `home.index.adjust_repay_overdue_desc` | Your bill is overdue. Please repay now. Or adjust your repayment plan… | `home.yml:80` |
p22ID 文案对应同名 key(如 `bill.yml:23` `Lunasi sekarang untuk hindari denda.`)。其它逾期变体见 `home.yml:111-173`、`bill.yml:40-45`。
p23### 1.3 邮件 / OTP
p24| 类型 | 触发时机 | 渠道 | 关键文案 / 接口 | 出处 | |---|---|---|---|---| | 改绑邮箱 | 提交新邮箱 | 邮件(后端发)+ toast | `general.we_have_sent_you_an_email_etc` / `amsAccountChangeUserInfo` | `pages/settings/profile/Email.vue:103-119` | | 邮箱验证发信 | 验证邮箱 | 邮件(后端发) | `we_have_send_you_an_email_etc` / `amsCommonVerifyEmailAddress`(`api.js:1555`,mock code `00`=已发/`01`=已验证) | `pages/common/email/EmailVerify.vue:148-173` | | 邮箱 OTP 校验 | 输入邮箱 OTP | OTP(邮件) | `amsCommonEmailVerifyOtp`(`api.js:765`) | `pages/common/otp/Index.vue:262-270` | | 取现 WhatsApp OTP | 取现确认 | OTP(WhatsApp 下发)+ 回执 | `coreTransNotifyOtp`(`api.js:2630`,OTP_RESULT 1/2),渠道 `GET_CASH_WHATSAPP` | `pages/pay-later/service/withdraw/Confirm.vue:404-439` |
p25mock 文件(`ams_common_verify_email_address.js`、`ams_common_email_verify_otp.js`、`core_trans_notify_otp.js`)均为占位假数据,真实下发由后端。
p26### 1.4 站内 banner / marquee / popup
p27| 类型 | 触发 | 渠道 | 出处 | |---|---|---|---| | 运营推荐跑马灯 | deals / 券中心 | 站内 Marquee(后端图片,4s 切) | `components/marquee/Marquee.vue`;`pages/deals/Index.vue:5`;`pages/coupons/Index.vue:12` | | 逾期改造 banner | overdue 且可改造 | 站内 banner | `home/Index.vue:217`(见 1.2) | | 新还款计划弹窗 | `negotiateRepaymentPlan.promiseResult` | 站内 popup | `home/Index.vue:466`(`NewRepaymentPlanPopup`) | | 取现挽留弹窗 | 取现返回 | 站内 popup | `home/Index.vue:467`(`InvestigationPopup`) | | 定位授权弹窗 | 强制上报 GPS 失败 | 站内 popup | `components/location-popup/LocationPopup.vue`;`utils/report.js`(`$LocationPopup.show`) | | 信用分引导弹窗 | 点首页问号 | 站内 popup | `pages/pay-later/home/NewUserTour.vue:121-143` |
p28### 1.5 提额奖励 push / 质押成功邮件 / 会员通知(前端踪迹)
p29| 业务事件 | 前端是否触达 | 结论 | |---|---|---| | 提额 / 质押锁额成功 | 是 | 前端驱动 `reportLockAmount()` → `reportToOutside` eventName=`limit_lock_amount_success`(`utils/report.js:217`,触发点 `flexible-limit/EnterAmount.vue:1033`)。渠道=原生上报(→ Insider 可驱动 push) | | 质押成功邮件 | 否 | 前端未发邮件(`service/convert`、`withdraw` 无 sendEmail/email API)。**待后端/营销** | | 会员购买通知 | 否 | `flexible-limit/Member.vue` 购买成功仅 UI 弹窗 + 返回(`_viewSuccess:941-1003`),无 reportToOutside/邮件/push。`PAY_LIMITUP_MEMBER`(`constants/category.js:27`)仅用于密码/刷脸流程控制。**待后端/营销** |
p30`LIMITUP` / `LOAN_ACC_OPENED` / `LIQUIDITY_LOAN` 三个枚举虽在 `report-to-outside.js` 定义,但代码内未见直接 `REPORT_OUTSIDE.LIMITUP` 调用——开户类事件实际通过 `reportOpenAccount` 的后端 `eventNameList` 动态下发,由后端配置触发。
p31### 1.6 汇总表
p32| 通知类型 | 触发时机 | 渠道 | 关键文案 / i18n key | 出处 file:line | |---|---|---|---|---| | 原生事件上报总线 | 各关键动作 | reportToOutside → Appsflyer/Insider/Firebase(Insider 可驱动原生 push/营销) | 38 个 eventName | `native-methods.js:197`;`constants/stats/report-to-outside.js` | | 开户成功上报 | 开户成功/补报 | reportToOutside(后端下发 eventNameList) | `PL_Level`/`value`/`currency`/`user_id` | `utils/report.js:142-211` | | 提额/质押锁额成功 | 质押成功结果页 | reportToOutside | `limit_lock_amount_success` | `utils/report.js:217`;`flexible-limit/EnterAmount.vue:1033` | | 还款到期提醒(账单页) | dueDate−今 ≤ 3 天 | 站内文案 | `please_repay_today_to_avoid_late_fee` / `dont_forget_to_repay_within_(one\|n)_days` | `BillFooter.vue:39-51` | | 逾期提醒(账单页) | `isOverDue` | 站内文案 | `your_bill_is_n_days_overdue_please_repay_now` | `BillFooter.vue:40-43` | | 还款到期提醒(首页) | daysToDue 0/1/2-3 | 站内文案 | `please_repay_by_today…` / `dont_forget_to_repay_within_day(s)_by` | `home/Index.vue:175-202` | | 逾期提醒(首页) | overdueTimes ≥ 1 | 站内文案 | `you_have_overdue_bill(s)_etc` / `your_bill_is_overdue_with_late_fee` | `home/Index.vue:214-237` | | 逾期改造 banner | overdue 且可改造 | 站内 banner | `adjust_repay_overdue_desc` | `home/Index.vue:217-222` | | 改绑邮箱 | 提交新邮箱 | 邮件(后端)+ toast | `general.
p33we_have_sent_you_an_email_etc` | `settings/profile/Email.vue:103-119` | | 邮箱验证发信 | 验证邮箱 | 邮件(后端) | `amsCommonVerifyEmailAddress` | `common/email/EmailVerify.vue:148-173` | | 邮箱 OTP 校验 | 输入邮箱 OTP | OTP(邮件) | `amsCommonEmailVerifyOtp` | `common/otp/Index.vue:262-270` | | 取现 WhatsApp OTP | 取现确认 | OTP(WhatsApp)+ 回执 | `coreTransNotifyOtp` | `service/withdraw/Confirm.vue:404-439` | | 运营推荐 Marquee | deals/券中心 | 站内跑马灯(后端图) | (后端图片) | `deals/Index.vue:5`;`coupons/Index.vue:12` | | 质押成功邮件 | — | **待后端/营销** | 前端未发 | — | | 会员购买通知 | — | **待后端/营销** | 前端仅 UI 弹窗 | `flexible-limit/Member.vue` |
p34---
p35## 二、交易流水
p36### 2.1 入口与接口
p37**交易列表页** `pages/pay-later/transaction/Index.vue`(路由 `PAY_LATER_TRANSACTION_INDEX`,`constants/routes.js:154`,标题 `pay_later.transaction.index.transaction_history`)。
p38**入口导航**(首页底部 "History" tab): - `pages/pay-later/home/Index.vue:838-843` — `onNavSelect()` - `pages/pay-later/home/Home.vue:1431-1436` — `onHistoryClick()`(先打 `BOTTOM_HISTORY_CLICK` 埋点) - `pages/pay-later/home/HomeV2.vue:1208-1212` — `onTabHistory()`
p39**列表接口** `coreTransQueryTransactionList`(`constants/api.js:325`): - `POST /core/trans/query/transaction_list`(`_id` 25700,desc `交易记录`) - 请求参数(`api.js:330-351`,含义见接口注释 `S:支付 C:借款 R:退款 P:还款 A:所有 EX:展期`): - `TRANSACTION_TYPE`(必填)= 类型筛选值,默认 `'A'`(全部) - `END_DATE` = 选中月份末日 `dayjs(month).add(1,'month').subtract(1,'day').format('YYYYMMDD')`(`Index.vue:217`) - `PAGESIZE` = `'20'`(`Index.vue:106,219`) - `LAST_ROW_KEY` = 首次 `'0'`,翻页送上页返回值(`Index.vue:108,220`) - 分页:读 `res.ret_data` 的 `NEXTPAGE_FLAG`(`'Y'`/`'N'`)、`LAST_ROW_KEY`、`TRANSACTION_LIST`(`Index.vue:225-228`);`onReachBottom` 与滚动到底前 800px 触发加载下一页。 - 月份选择限近 **180 天**(`Index.vue:99,185-197`)。 - 类型筛选项(`Index.vue:274-301`):`A`(All) / `ST`(PAYLATER) / `C`(Instant Cash) / `P`(Repayment) / `R`(Refund);`T`(分期消费) 选项被注释(`Index.vue:284-287`)。
p40**详情接口** `coreTransQueryTransactionDetail`(`api.js:2178`,`POST /core/trans/query/transaction_detail`,`_id` 25702)。`TransactionItem` 点击 → `Detail.vue` 按 `TRANSACTION_TYPE` 分发到三个详情页(`Detail.vue:18-52`),并带 `{type, orderId=BIZ_SEQ_NO, partnerOrderId=MER_BIZ_NO, receiptId=REF_NBR}`: - `S`/`T`/`R` → `Spending.vue` - `C` → `InstantCash.vue`(新版变体 `NewInstantCash.vue`,`PAY_LATER_TRANSACTION_NEW_INSTANT_CASH`,`routes.js:164`) - `P`/`DS`/`PS` → `Repayment.vue`
p41**退款/还款记录接口(独立)** `coreTransQueryRefundRepayRecord`(`api.js:2304`,`POST /core/trans/query/refund_repay_record`,`_id` 25704,desc 退款记录;参数 `STMT_DATE`/`TRANSACTION_TYPE`(R/P)/`PAGESIZE`/`LAST_ROW_KEY`)。由账单模块使用,非主交易列表。
p42### 2.2 TRANSACTION_TYPE 类型表
p43定义在 `constants/pay-later/transaction.js:10-20`(导出为 `TYPES`),标签取自 `TYPE_MAP`(`:23-45`),渲染为 `TransactionItem.vue:14` 金额下方灰色小标签。
p44| TYPE 值 | 常量名 | 含义 | 渲染标签 | 出处 file:line | |---|---|---|---|---| | `C` | `CASH_LOAN` | 借款 / 极速现金 | `TYPE_MAP` = Instant Cash;行标题 = `allo_wallet`(Allo wallet) | `transaction.js:11,24-26` | | `R` | `REFUND` | 退款 | = Refund;行标题 = `MERCHANT_NAME` 或 `transaction_at_merchant` | `transaction.js:12,27-29` | | `P` | `REPAYMENT` | 还款 | = Repayment;行标题 = `allo_wallet` | `transaction.js:13,30-32` | | `S` | `SPENDING_GENERAL` | 普通消费(一次性付款) | = PAYLATER;行标题 = `MERCHANT_NAME` 或 `transaction_at_merchant` | `transaction.js:14,33-35` | | `T` | `SPENDING_INSTALLMENT` | 分期消费 | = PAYLATER(同上);详情付款方式显示 `pay_later_installment` | `transaction.js:15,36-38` | | `ST` | `PAYLATER` | PayLater(消费类合并**筛选值**) | 仅用作筛选选项值(`Index.vue:282`),**非服务端行类型**,无 `TYPE_MAP` 项 | `transaction.js:16` | | `EX` | `EXTENSION` | 展期(extension) | 无 `TYPE_MAP` 项 → 主列表标签为空;仅由展期列表查询使用 | `transaction.js:17` | | `DS` | `DEPOSIT_SATISFACTION` | 质押余额代偿 | = Repayment;行标题 = `allo_wallet`;详情走 Repayment | `transaction.js:18,39-41` | | `PS` | `POINT_SATISFACTION` | 质押积分代偿 | = Repayment;行标题 = `mpc_points`(MPC Points);详情 "Repaid with" 显示 MPC Points | `transaction.js:19,42-44`;`TransactionItem.vue:70-71`;`Repayment.vue:69-73` |
p45行标题逻辑(`TransactionItem.vue:63-79`):`P`/`C`/`DS` → Allo wallet;`PS` → MPC Points;`S`/`T`/`R` → 商户名 `MERCHANT_NAME`(缺省 Transaction at Merchant);其它 → `--`。
p46**`EX`(展期)唯一实际请求点**:`pages/pay-later/service/convert/List.vue:80-84`,硬编码 `TRANSACTION_TYPE:'EX'` 拉取展期记录;主交易列表不渲染 `EX` 标签。
p47### 2.3 状态、金额方向、商户名
p48状态枚举均在 `constants/pay-later/transaction.js`: - 消费状态 `SPENDING_STATUSES`(`:48-52`):`S`=成功 / `F`=已结清 / `C`=失败 → 标签 successful / closed - 现金贷状态 `CASH_LOAN_STATUSES`(`:68-73`):`P`=处理中 / `S` / `F` / `C` → in_process / successful / failed - 还款状态 `REPAYMENT_STATUSES`(`:119-123`):`P` / `S` / `C` → in_process / success / failed - 退款类型 `REFUND_TYPES`(`:92-95`):`P`=部分 / `A`=全额(均显示 refunded) - 还款类型 `REPAYMENT_TYPES`(`:108-111`):`IOURepay`=提前还款 / `BillRepay`=账单还款;还款方式 `REPAYMENT_METHODS` `VA`=VA(`:114`)
p49状态在列表中以前缀行显示(cash-loan PENDING/FAIL、spending FAIL 时,`TransactionItem.vue:80-94`);详情页头部颜色由 `TITLE_TYPES`(pending=WARNING / fail=DANGER / 其余=SUCCESS)决定。
p50**金额方向**:交易列表/行**无 +/− 收支符号逻辑**,金额统一渲染 `Rp{{ item.TRANSACTION_AMT | toAmount }}`(`TransactionItem.vue:13`),无收入/支出区分(待补)。无 per-type 图标,仅右侧箭头 `arrow-right`(`TransactionItem.vue:16`)。
p51**会员交易商户名**:会员产品标签为 `limit_up_member` = "Limit Up Premium"(`locales/en/pay-later/flexible-limit.yml:224`、`home.yml:133`;ID 同名 key)。代码内**未见**专用于会员交易的商户名常量(如 "Pay to limit up premium");会员/Premium Fee 交易会落到某个还款/消费类型下,商户名由后端 `MERCHANT_NAME` 决定(**待后端**)。Wallet 概念 = `allo_wallet`("Allo wallet"),用作还款/借款/质押代偿行标题。
p52### 2.4 列表/详情响应字段(取自 mock)
p53`plugins/request/mock/core_trans_query_transaction_list.js` — `res.ret_data` 信封:`CODE`/`PRODUCT_CD`/`LAST_ROW_KEY`/`APP_ACCT_NO`/`APP_TYPE`/`NEXTPAGE_FLAG`/`DESC`/`TRANSACTION_LIST[]`。 单条:`TRANSACTION_AMT`、`REF_NBR`、`TRANSACTION_TIME`(`YYYYMMDDHHmmss`)、`MER_BIZ_NO`、`BIZ_SEQ_NO`、`TRANSACTION_TYPE`、`TRANSACTION_STATUS`、`MERCHANT_NAME`(仅 S/T/R 行)。
p54`core_trans_query_transaction_detail.js`:`CURR_TERM`、`TRANSACTION_NO`、`ORIG_TOTAL_TERM`、`REPAY_OPTION`、`ORIG_TRANSACTION_TYPE`、`MERCHANT_NAME`、`TRANSACTION_STATUS`、`TRANSACTION_AMT`、`REPAY_BANK_NAME`、`TRANSACTION_TIME`、`SCHEDULE_LIST[]`、`CURR_TOTAL_TERM` 等。详情页另读 `MERCHANDISE_NAME`/`ORDER_NO`/`UPFRONT_ADMIN_FEE`/`LOAN_REAL_AMT`/`IS_PAID`。
p55`core_trans_query_refund_repay_record.js`:信封含 `NEXTPAGE_FLG`(注意是 `_FLG` 非 `_FLAG`)与 `TRANSACTION_LISTS[]`(复数);单条另有 `REPAY_TYPE`、`SUB_TRANSACTION_TYPE`(`PointsSubstiuteRepay`[源码拼写如此] / `SubstituteRepay`,映射到 `models/pay-later/bill.js:94` 的 `subTransactionType`)。
p56---
p57> **说明**:本篇阈值/分支/字段以 HEAD `fb597d5` 前端代码为准。现网通知**实际文案、触发频率、push/营销编排**由宿主 Allo App 与 Insider/营销后台配置决定,前端不可见,相应项标注 **待后端/营销**。会员交易商户名、收支方向等前端无定义项标 **待补**。
抽出的卡片 · 66
规则DOC-2026-024#p3pending_review

前端不直接发送 push 或邮件。

"前端不直接发 push/邮件"

边界DOC-2026-024#p3pending_review

触达分为三类:原生事件上报、邮件/OTP、还款/逾期提醒。

"触达分三类——"

规则DOC-2026-024#p4pending_review

原生事件上报由前端通过 reportToOutside 把事件上报给 Appsflyer / Insider / Firebase,再由宿主 Allo App 与营销平台 Insider 驱动原生 push 或营销触达。

"**原生事件上报**:前端通过 `reportToOutside` 把事件上报给 Appsflyer / Insider / Firebase,由宿主 Allo App 与营销平台(Insider)驱动原生 push / 营销触达"

规则DOC-2026-024#p4pending_review

邮件/OTP 由后端 API 下发,前端只触发接口并提示"已发送"。

"**邮件 / OTP**:由后端 API 下发,前端只触发接口并提示"已发送""

规则DOC-2026-024#p4pending_review

还款/逾期提醒为纯站内文案加 banner/popup,阈值在前端按账单页的 remainDays(dueDate 差值)与后端下发的 daysToDue/overdueTimes(首页)判定。

"**还款 / 逾期提醒**:纯站内文案 + banner/popup,阈值在前端按 `remainDays`(账单页 `dueDate` 差值)与后端下发的 `daysToDue` / `overdueTimes`(首页)判定"

定义DOC-2026-024#p8pending_review

reportToOutside 是触达的核心通道,把一个 event 同时上报给三家平台(Appsflyer、Insider、Firebase)。

"`reportToOutside` 是触达的核心通道,把一个 event 同时上报给三家平台"

规则DOC-2026-024#p10pending_review

三个底层上报方法均有 app_id === ALLO_APP_ID 门控,即仅对 ALLO 渠道上报。

"三个底层方法均有 `app_id === ALLO_APP_ID` 门控(`:145`/`:161`/`:178`),即**仅对 ALLO 渠道上报**"

规则DOC-2026-024#p10pending_review

前端本身不发送 push,只上报事件。

"前端本身不发 push,只"上报事件""

状态DOC-2026-024#p12pending_review

事件 REJECTED_PAYLATER_BUT_UPGRADED 表示 PayLater 被拒绝但升级为 Prime。

"`REJECTED_PAYLATER_BUT_UPGRADED` (:101) | PL 拒绝但升级为 Prime"

动作条件DOC-2026-024#p15pending_review

开户成功或补报时,reportOpenAccount 先查后端配置 amsEventReportConfig(moduleId=OPEN_ACCT)取 eventNameList,逐个 reportToOutside,并带 PL_Level/value/currency:'IDR'/user_id,再调 amsAccountOpenAcctEventMarkReported 标记已报。

"开户成功/补报时,先查后端配置 `amsEventReportConfig`(moduleId=`OPEN_ACCT`)取 `eventNameList`,逐个 `reportToOutside`"

规则DOC-2026-024#p15pending_review

开户成功上报的事件名由后端下发。

"事件名**由后端下发**"

动作条件DOC-2026-024#p15pending_review

提额/质押锁额成功时,reportLockAmount 以 eventName=limit_lock_amount_success 调用 reportToOutside,并带 user_id。

"质押成功时 `reportToOutside` eventName=`limit_lock_amount_success`,带 `user_id`"

定义DOC-2026-024#p18pending_review

账单页 remainDays 定义为 dueDate 与当前日期的天数差 dayjs(dueDate).diff(currentDate,'days')。

"`remainDays = dayjs(dueDate).diff(currentDate, 'days')`"

动作条件DOC-2026-024#p18pending_review

账单页 isOverDue 为真时展示文案 your_bill_is_n_days_overdue_please_repay_now。

"`isOverDue` → `your_bill_is_n_days_overdue_please_repay_now`"

动作条件DOC-2026-024#p18pending_review

账单页当 remainDays > 3 时文案为空,不提醒。

"`remainDays > 3` → 空(不提醒)"

动作条件DOC-2026-024#p18pending_review

账单页当 remainDays === 0 时展示文案 please_repay_today_to_avoid_late_fee。

"`remainDays === 0` → `please_repay_today_to_avoid_late_fee`"

动作条件DOC-2026-024#p18pending_review

账单页当 remainDays === 1 时展示文案 dont_forget_to_repay_within_one_days。

"`remainDays === 1` → `dont_forget_to_repay_within_one_days`"

动作条件DOC-2026-024#p18pending_review

账单页当 remainDays 为 2–3 天时展示文案 dont_forget_to_repay_within_n_days(带 n)。

"2–3 天 → `dont_forget_to_repay_within_n_days`(带 n)"

动作条件DOC-2026-024#p19pending_review

首页到期分支按后端 daysToDue 判定:===0 展示 please_repay_by_today_to_avoid_the_late_fee;===1 展示 dont_forget_to_repay_within_day_by;2–3 展示 dont_forget_to_repay_within_days_by;否则展示 your_bill_is_ready_repay_by_etc。

"到期分支(`:175`):`daysToDue===0` → `please_repay_by_today_to_avoid_the_late_fee`;`===1` → `dont_forget_to_repay_within_day_by`;`2–3` → `dont_forget_to_repay_within_days_by`;else → `your_bill_is_ready_repay_by_etc`"

动作条件DOC-2026-024#p19pending_review

首页逾期分支:overdueTimes===1 且 IN_DUE 展示 you_have_overdue_bill_etc;否则展示 your_bill_is_overdue_with_late_fee(带罚息 penaltyBal);overdueTimes>1 展示 you_have_overdue_bills_etc。

"逾期分支(`:214`):`overdueTimes===1` 且 `IN_DUE` → `you_have_overdue_bill_etc`;否则 `your_bill_is_overdue_with_late_fee`(带罚息 `penaltyBal`);`overdueTimes>1` → `you_have_overdue_bills_etc`"

动作条件DOC-2026-024#p19pending_review

首页逾期改造 banner showOverdueRestructureBanner 展示时显示文案 adjust_repay_overdue_desc 与 CTA adjust。

"逾期改造 banner `showOverdueRestructureBanner`(computed `:596`,模板 `:217`)→ `adjust_repay_overdue_desc` + CTA `adjust`"

动作条件DOC-2026-024#p24pending_review

用户提交新邮箱触发改绑邮箱,由后端发送邮件并前端弹出 toast。

"改绑邮箱 | 提交新邮箱 | 邮件(后端发)+ toast"

状态DOC-2026-024#p24pending_review

邮箱验证发信接口 amsCommonVerifyEmailAddress 返回码:00 表示邮件已发送,01 表示邮箱已验证。

"mock code `00`=已发/`01`=已验证"

动作条件DOC-2026-024#p24pending_review

取现确认时通过 WhatsApp 下发 OTP(渠道标识 GET_CASH_WHATSAPP),接口 coreTransNotifyOtp 返回 OTP_RESULT 1/2 作为回执。

"取现 WhatsApp OTP | 取现确认 | OTP(WhatsApp 下发)+ 回执 | `coreTransNotifyOtp`(`api.js:2630`,OTP_RESULT 1/2),渠道 `GET_CASH_WHATSAPP`"

动作条件DOC-2026-024#p27pending_review

当账单处于逾期(overdue)且可改造时,站内展示逾期改造 banner。

"逾期改造 banner | overdue 且可改造"

动作条件DOC-2026-024#p27pending_review

根据 negotiateRepaymentPlan.promiseResult 触发站内新还款计划弹窗(NewRepaymentPlanPopup)。

"新还款计划弹窗 | `negotiateRepaymentPlan.promiseResult` | 站内 popup"

动作条件DOC-2026-024#p27pending_review

取现流程返回时触发站内取现挽留弹窗(InvestigationPopup)。

"取现挽留弹窗 | 取现返回 | 站内 popup"

动作条件DOC-2026-024#p27pending_review

强制上报 GPS 失败时触发站内定位授权弹窗(LocationPopup)。

"定位授权弹窗 | 强制上报 GPS 失败 | 站内 popup"

动作条件DOC-2026-024#p27pending_review

用户点击首页问号时触发信用分引导弹窗(NewUserTour)。

"信用分引导弹窗 | 点首页问号 | 站内 popup"

动作条件DOC-2026-024#p29pending_review

提额/质押锁额成功时,前端驱动 reportLockAmount() 通过 reportToOutside 上报 eventName=limit_lock_amount_success(原生上报,可驱动 Insider push)。

"前端驱动 `reportLockAmount()` → `reportToOutside` eventName=`limit_lock_amount_success`"

边界DOC-2026-024#p29pending_review

质押成功邮件前端不发送(service/convert、withdraw 无 sendEmail/email API),待后端/营销处理。

"质押成功邮件 | 否 | 前端未发邮件(`service/convert`、`withdraw` 无 sendEmail/email API)"

边界DOC-2026-024#p29pending_review

会员购买成功前端仅展示 UI 弹窗并返回,不做 reportToOutside/邮件/push,会员购买通知待后端/营销处理。

"会员购买通知 | 否 | `flexible-limit/Member.vue` 购买成功仅 UI 弹窗 + 返回"

规则DOC-2026-024#p30pending_review

开户类事件(LIMITUP/LOAN_ACC_OPENED/LIQUIDITY_LOAN)不在前端直接调用,而是通过 reportOpenAccount 的后端 eventNameList 动态下发、由后端配置触发。

"开户类事件实际通过 `reportOpenAccount` 的后端 `eventNameList` 动态下发,由后端配置触发"

动作条件DOC-2026-024#p32pending_review

账单页当到期日与今日之差 ≤ 3 天时,展示站内还款到期提醒文案。

"还款到期提醒(账单页) | dueDate−今 ≤ 3 天 | 站内文案"

动作条件DOC-2026-024#p32pending_review

账单页当 isOverDue 为真时,展示站内逾期提醒文案。

"逾期提醒(账单页) | `isOverDue` | 站内文案"

动作条件DOC-2026-024#p32pending_review

首页根据 daysToDue(0/1/2-3)展示对应的站内还款到期提醒文案。

"还款到期提醒(首页) | daysToDue 0/1/2-3 | 站内文案"

动作条件DOC-2026-024#p32pending_review

首页当 overdueTimes ≥ 1 时,展示站内逾期提醒文案。

"逾期提醒(首页) | overdueTimes ≥ 1 | 站内文案"

状态DOC-2026-024#p39pending_review

交易列表 TRANSACTION_TYPE 取值含义:S=支付、C=借款、R=退款、P=还款、A=所有、EX=展期。

"S:支付 C:借款 R:退款 P:还款 A:所有 EX:展期"

规则DOC-2026-024#p39pending_review

交易列表接口 TRANSACTION_TYPE 为必填的类型筛选值,默认 'A'(全部)。

"`TRANSACTION_TYPE`(必填)= 类型筛选值,默认 `'A'`(全部)"

规则DOC-2026-024#p39pending_review

交易列表的月份选择限制为近 180 天。

"月份选择限近 **180 天**"

规则DOC-2026-024#p39pending_review

交易列表类型筛选项为 A(All)/ST(PAYLATER)/C(Instant Cash)/P(Repayment)/R(Refund),T(分期消费) 选项被注释禁用。

"类型筛选项(`Index.vue:274-301`):`A`(All) / `ST`(PAYLATER) / `C`(Instant Cash) / `P`(Repayment) / `R`(Refund);`T`(分期消费) 选项被注释"

规则DOC-2026-024#p40pending_review

交易详情按 TRANSACTION_TYPE 分发:S/T/R 进入 Spending 详情页。

"`S`/`T`/`R` → `Spending.vue`"

规则DOC-2026-024#p40pending_review

交易详情按 TRANSACTION_TYPE 分发:C 进入 InstantCash 详情页(新版变体 NewInstantCash)。

"`C` → `InstantCash.vue`(新版变体 `NewInstantCash.vue`"

规则DOC-2026-024#p40pending_review

交易详情按 TRANSACTION_TYPE 分发:P/DS/PS 进入 Repayment 详情页。

"`P`/`DS`/`PS` → `Repayment.vue`"

定义DOC-2026-024#p41pending_review

退款/还款记录接口 coreTransQueryRefundRepayRecord 是独立接口,由账单模块使用,不属于主交易列表。

"由账单模块使用,非主交易列表。"

状态DOC-2026-024#p44pending_review

交易类型 C(CASH_LOAN)表示借款/极速现金。

"| `C` | `CASH_LOAN` | 借款 / 极速现金 |"

状态DOC-2026-024#p44pending_review

交易类型 R(REFUND)表示退款。

"| `R` | `REFUND` | 退款 |"

状态DOC-2026-024#p44pending_review

交易类型 P(REPAYMENT)表示还款。

"| `P` | `REPAYMENT` | 还款 |"

状态DOC-2026-024#p44pending_review

交易类型 S(SPENDING_GENERAL)表示普通消费(一次性付款)。

"| `S` | `SPENDING_GENERAL` | 普通消费(一次性付款) |"

状态DOC-2026-024#p44pending_review

交易类型 T(SPENDING_INSTALLMENT)表示分期消费。

"| `T` | `SPENDING_INSTALLMENT` | 分期消费 |"

边界DOC-2026-024#p44pending_review

交易类型 ST(PAYLATER)为消费类合并筛选值,仅用作筛选选项值,非服务端行类型,无 TYPE_MAP 项。

"仅用作筛选选项值(`Index.vue:282`),**非服务端行类型**,无 `TYPE_MAP` 项"

状态DOC-2026-024#p44pending_review

交易类型 EX(EXTENSION)表示展期,无 TYPE_MAP 项,主列表标签为空,仅由展期列表查询使用。

"无 `TYPE_MAP` 项 → 主列表标签为空;仅由展期列表查询使用"

状态DOC-2026-024#p44pending_review

交易类型 DS(DEPOSIT_SATISFACTION)表示质押余额代偿,标签为 Repayment。

"| `DS` | `DEPOSIT_SATISFACTION` | 质押余额代偿 |"

状态DOC-2026-024#p44pending_review

交易类型 PS(POINT_SATISFACTION)表示质押积分代偿,标签为 Repayment,行标题为 MPC Points。

"| `PS` | `POINT_SATISFACTION` | 质押积分代偿 |"

动作条件DOC-2026-024#p45pending_review

交易行标题逻辑:P/C/DS 显示 Allo wallet;PS 显示 MPC Points;S/T/R 显示商户名 MERCHANT_NAME(缺省 Transaction at Merchant);其它显示 --。

"`P`/`C`/`DS` → Allo wallet;`PS` → MPC Points;`S`/`T`/`R` → 商户名 `MERCHANT_NAME`(缺省 Transaction at Merchant);其它 → `--`"

边界DOC-2026-024#p46pending_review

展期(EX)的唯一实际请求点为展期列表页,硬编码 TRANSACTION_TYPE:'EX' 拉取展期记录;主交易列表不渲染 EX 标签。

"硬编码 `TRANSACTION_TYPE:'EX'` 拉取展期记录;主交易列表不渲染 `EX` 标签。"

状态DOC-2026-024#p48pending_review

消费状态 SPENDING_STATUSES 取值:S=成功、F=已结清、C=失败,标签分别为 successful/closed。

"消费状态 `SPENDING_STATUSES`(`:48-52`):`S`=成功 / `F`=已结清 / `C`=失败 → 标签 successful / closed"

状态DOC-2026-024#p48pending_review

现金贷状态 CASH_LOAN_STATUSES 取值:P=处理中、S、F、C,标签为 in_process/successful/failed。

"现金贷状态 `CASH_LOAN_STATUSES`(`:68-73`):`P`=处理中 / `S` / `F` / `C` → in_process / successful / failed"

状态DOC-2026-024#p48pending_review

还款状态 REPAYMENT_STATUSES 取值:P、S、C,标签为 in_process/success/failed。

"还款状态 `REPAYMENT_STATUSES`(`:119-123`):`P` / `S` / `C` → in_process / success / failed"

状态DOC-2026-024#p48pending_review

退款类型 REFUND_TYPES 取值:P=部分退款、A=全额退款,均显示 refunded。

"退款类型 `REFUND_TYPES`(`:92-95`):`P`=部分 / `A`=全额(均显示 refunded)"

状态DOC-2026-024#p48pending_review

还款类型 REPAYMENT_TYPES 取值:IOURepay=提前还款、BillRepay=账单还款;还款方式 REPAYMENT_METHODS VA=VA。

"还款类型 `REPAYMENT_TYPES`(`:108-111`):`IOURepay`=提前还款 / `BillRepay`=账单还款"

动作条件DOC-2026-024#p49pending_review

详情页头部颜色由 TITLE_TYPES 决定:pending=WARNING、fail=DANGER、其余=SUCCESS。

"详情页头部颜色由 `TITLE_TYPES`(pending=WARNING / fail=DANGER / 其余=SUCCESS)决定。"

边界DOC-2026-024#p50pending_review

交易列表/行无 +/− 收支符号逻辑,金额统一渲染,无收入/支出区分。

"交易列表/行**无 +/− 收支符号逻辑**,金额统一渲染 `Rp{{ item.TRANSACTION_AMT | toAmount }}`"

定义DOC-2026-024#p51pending_review

会员产品标签为 limit_up_member,显示为 Limit Up Premium。

"会员产品标签为 `limit_up_member` = "Limit Up Premium""

定义DOC-2026-024#p51pending_review

Wallet 概念为 allo_wallet(Allo wallet),用作还款/借款/质押代偿的行标题。

"Wallet 概念 = `allo_wallet`("Allo wallet"),用作还款/借款/质押代偿行标题。"

规则DOC-2026-024#p53pending_review

交易列表单条中的 MERCHANT_NAME 字段仅在 S/T/R 行出现。

"`MERCHANT_NAME`(仅 S/T/R 行)"