Skip to content

v1.9.4 · 财富水位不再骗你说「需要至少 2 期」

Choose a tag to compare

@LuoDi-Nate LuoDi-Nate released this 06 Aug 13:48
· 154 commits to master since this release

财富水位不再骗你说「需要至少 2 期」

维护者报的 prod 问题:已经关账 3 期,报表页的财富水位一直显示

财富水位需要至少 2 期净资产数据 + 宏观基准

这句提示两个条件都不是真的

宏观基准根本不是条件 —— 缺了走三法均值 fallback。真正的判定只有两条:窗口内 <2 期,或者序列首点 ≤ 0。命中的是第二条,而且是结构性的。

给财富水位用的那条序列每期都减掉「本期首次出现账户的期末净值」,包括窗口首期 —— 而首期的「首次出现账户」按定义就是全部账户,于是首点恒等于 0。水位以首点为锚,锚 ≤ 0 直接判不可用。

结论:只要时间范围包含你家的首期,财富水位就永远不出现。

  • 新用户只有两三期 → 任何时间范围都含首期 → 这一节从来没出现过
  • 不只影响新用户:老用户新加一个账户后,1M / 3M 这种短窗口的首期会含「首次出现账户」,同样被打死

在 beta 上用 range=ALL 复现(1Y 正常、ALL 不可用)后才动手。

这个性质代码里早有记录:ReportsController v1.6.29 的注释写着「该序列首点按构造恒为 0(首期全部账户都算首次出现)→ 长年显示『期初净资产 −¥0』」。但当时只把 tooltip 那个消费方换成了另一条序列,财富水位这个主消费方留在了坏序列上 —— 典型的半修:发现了性质,只治了眼前的症状。

修法:首期那笔本金是起跑线,不是「注入」

窗口首期的开账基线不减。购买力线要拿这笔存量本金当基数复利;第二期起新出现的账户仍然剔除(那才是「本来就有、现在才开始记」的外部资本纳入,不该算成增值)。

零差异验证 —— 改指标口径前先建基线,基线取已发布的 v1.9.3 jar,采六个时间范围的 nominal/cpiLine/m2Line 序列指纹与全部百分比,改后逐项比对:

范围 修前 修后 结论
1M 不可用 不可用(原因:期数不足) 一致 · 窗口里确实只有 1 期
3M / 6M / YTD / 1Y 可用 可用 指纹与百分比逐字相同
ALL 不可用 可用 · 16 点 修复

已经能用的窗口一个数字都没动,只把坏掉的救回来。

顺带:兜底文案改成说真话

原文案三个错:① 期数够了也可能不可用(就是这个 bug),用户照提示继续记账永远不会好;② 「宏观基准」根本不是条件;③ 两种完全不同的处境给同一句话,没法自查。

现在按原因分开:

  • 期数不足 → 「这个时间范围里只有不到 2 期净资产数据。继续记账并关账……」
  • 起点净资产 ≤ 0(比如房贷大于总资产)→ 「购买力线是『起跑本金 × 通胀复利』,从零或负数起算没有意义……换一个起点净资产已转正的时间范围就能看到」

第二种是真实处境而不是数据不足,得说清楚,别让人白记几个月。

升级注意

  • 无 DB 迁移,回滚只回 jar
  • 只影响财富水位这一节的可用性判定与曲线锚点;已经能显示的时间范围数字不变(上表已验证)
  • 升级后如果某个时间范围仍然不显示,看提示语:说「不到 2 期」就是真的期数不够,说「起点净资产不是正数」就换一个更近的范围

486 单元测试(新增 NetWorthTrendExOpeningTest / WaterLevelServiceTest,其中 3 条专钉首点语义与零差异)· 554 黑盒回归(新增 v194-WL-ANCHOR / v194-WL-REASON)· 74 条 e2e 断言

设计文档:prd/v1.9.md 附录