订阅库存 · 充值激活 · 半月试用连续续费闭环 — 设计图稿 v2
按真实代码修订(2026-09-16):复用 8090 starter-google-subscription 现有入库/激活/告警,新增“短试用时长建模 + 目标到期连续续期编排”
图例: 已存在·直接复用 本次新增/改造 外部系统/云手机
结论:不新建库存中台,库存=google_capture_logs、激活记录=google_subscription_activations 已在跑;新增集中在“短试用可续期”与“客户目标到期编排”。
图 1 · 真实链路架构(8090 订阅服务为中枢,已上线)
供给侧
trial-farm 自动开通
MuMu/无影云手机,产 Super/Max 个人·家庭试用
POST(apiKey 鉴权·去重)⇄
/api/open/google-capture/report-batch
CaptureReportController(已存在)
8090 订阅服务
starter-google-subscription
google_capture_logs(库存)
plan_level·plan_scope·duration_months·subscription_expires_at·status 0/1/2/3
SubscriptionActivationService
取在库订阅激活给客户
google_subscription_activations(交付记录)
绑定客户 userId/username·subscriptionInfo 到期
开放激活 API:activate-next-super/max-personal(apiKey) 库存告警 Scheduler(Max=0 / Super<阈值 → 企微) 新增:短试用时长/临期识别 + 四类×时长看板
生产业务
module-virtual 个人充值订单
手机号短信 / 班级邀请码拿 token(已存在)
下单 super/max
客户权益表 + 连续续期 Job(新增)
客户
邀请链接 H5
个人:订阅直充客户 Duolingo 账号
家庭:addUserToFamily 拉入家庭
图 2 · 数据模型(复用两表 + 新增续期编排表)
google_capture_logs(库存·已存在)
product_id / purchase_token / signature / google_account(供给号)
plan_level=super|max plan_scope=personal|family
subscription_expires_at(真实到期,已落库)
status:0在库 1已激活 2失败 3验真异常
purchase_token_hash 幂等去重
▸补:term_days 短试用时长(14/7…),现 duration_months 仅识别 12m
google_subscription_activations(交付·已存在)
capture_log_id 关联库存
duolingo_username / user_id(绑定客户)、order_id
activation_status 0/1/2、subscription_info(含到期)
activated_by / activated_at
customer_entitlements(客户权益·新增)
客户身份(user_id/username/手机号/班级)
product_line=super|max shape=personal|family
target_end 目标到期(如购年卡=+365天)
current_end 当前实际到期 renew_count 已续次数
next_renew_at 下次续期点 state 正常/续期中/断约风险
每次续期写一条 entitlement_renewals(用了哪个 capture_log)
图 3 · 客户充值激活(身份双通道已具备,激活复用现成 API)
① 打开邀请链接 ② 手机号短信 或 班级邀请码 ③ 拿到客户 token(MagicLogin/UserTokens)
④ 下单 super/max(个人/家庭) ⑤ 激活:个人 activate-next-personal(token,401 刷 token/密码回退);家庭 addUserToFamily
⑥ 建 customer_entitlements:current_end=本次到期,target_end=购买时长 ⑦ 自动退班/简中/企微通知(已有)
图 4 · 半月试用连续续期闭环(核心新增,目标到期驱动)
定时扫描 next_renew_at 到期
current_end − 提前量 ≤ now
幂等锁该权益(防重复续) activate-next 同类型半月试用给客户
成功
回读 subscriptionInfo 新到期 → current_end 顺延 ~14 天、renew_count+1、写 renewals;若 current_end ≥ target_end 则置“已覆盖/完成”,否则算下一个 next_renew_at 继续
失败 / 库存不足
noPendingCapture=该类型半月库存空 → 企微告警 + 触发 trial-farm 增产;临断约升级 @all;激活 unknown 走对账不轻易判废。
个数动态算(不写死 24): 14 天试用 ≈ 26 个/年 7 天试用 ≈ 52 个/年 循环至 current_end ≥ target_end 自停
图 5 · 动态库存监控与落地阶段
库存看板(扩展现有告警/页面,零资金风险先做):Super/Max × 个人/家庭 × 时长(年卡12m / 半月14d / 7d…) 分组统计在库数量、最早 subscription_expires_at、临期/过期数、可覆盖客户人月数;现有“个人 Max=0、Super<阈值”告警扩展为四类 + 短试用临期 + 家庭维度 + “按当前消耗速率预计断货时间”。
P1 库存时长建模 + 监控(不碰资金)
  • capture_logs 补 term_days(由 SKU/offer 解析 14/7 天)
  • 四类×时长数量/临期看板,扩展告警与断货预测
P2 trial-farm 半月订阅入库
  • 复用 report-batch 上报(apiKey、去重),带 term_days/expires
  • 选货确认短试用可被 activate-next 命中(不被年卡验真误隔离)
P3 邀请链接统一入口
  • H5 手机号/班级码双通道(复用现有 token 链路)
  • 下单后建 customer_entitlements,激活复用现成 API
P4 连续续期 Job
  • 目标到期驱动循环 activate-next,幂等/补偿/告警
  • 库存水位联动 trial-farm 增产
已确认的决策:① 个人订阅用抓包 purchase 数据经内部接口直接激活客户账号(activate-next-personal 已在跑,参考最近 Max 激活);② trial-farm 与生产用 HTTP API + apiKey 鉴权推送解耦(复用 report-batch);③ 自动续费按客户链接/购买的目标到期,用半月试用“到期就续、续到覆盖一年”,个数由目标到期动态计算。
说明:本图基于仓库现有代码梳理,绿色为已上线可复用,蓝色为新增/改造,橙色为外部;字段名为建议稿,以最终 DDL/接口契约为准。