Files
FamilyBook/app
laoyang 7ae595c8c2 生日卡重排:方框放"还剩几天"、右侧放农历日期 + 阳历日期 (#88)
用户 2026-11-05:「还有5天,也就是10月2号,这个不好。因为"还有5天"这个事情
比较重要,所以方形框里面应该写几天,比如还有5天就写5天;现在还有5天,
那个位置应该写上10月2日。如果是农历的话,就要写上农历十月二日。
下面还要写上阳历:换算完之后,今年阳历是多少?比如11月10日,
都放在右侧"满42周岁"这个位置。」

上一版信息分工正好是**反的**:方框里放了「日」(几号),右侧放了「还有 N 天」。
用户要的相反。

重排后:
  方框(84x84 浅主题色块)   = **还剩几天**(大数字)+ 下方「天」/「今天」
  右侧第一行                 = 日期(农历生日「农历十月初二」;其余「11月16日」)
  右侧第二行                 = 阳历换算(**只有农历生日才画**)
  右侧第三行                 = 满 N 周岁

服务端 Anniversary::occurrences() 补两个**成品文字**字段:
  lunar_label = 「十月初二」「闰四月初五」(农历生日才有)
  solar_md    = 「11月10日」(今年实际发生那天的公历月日)

⚠️ 农历文字为什么不在端上拼:Lunar 有完整的月名/日名对照表
   (正月/冬月/腊月、初一/廿三…),端上再抄一份必然漂移,
   而且闰月(闰四月)这种特例得一起处理。
⚠️ solar_md 用 $date(今年换算后的实际日期)而不是 $a['month']/$a['day']:
   农历生日的 month/day 是**农历**月日,直接拼出来会是错的公历。
⚠️ 公历生日时 dateSolar() 返回空串 ⇒ 不画第二行:
   那时第一行已经是「11月16日」,再画一次一模一样,纯噪音。
⚠️ days = 0(就是今天)时方框写「今」而不是「0」:
   0 看着像没数据,而且底下那行写「今天」,配成「今 / 今天」很奇怪。

实测服务端输出:
  高雪玉 的农历生日  days=5  lunar=十月初二  solar=11月10日  date=2026-11-10
  领证纪念日        days=7  lunar=(空)      solar=11月12日  date=2026-11-12
  杨永全 的农历生日  days=8  lunar=十月初五  solar=11月13日  date=2026-11-13
  杨永全 的生日      days=11 lunar=(空)      solar=11月16日  date=2026-11-16
  刘巧莲 的农历生日  days=29 lunar=十月廿六  solar=12月4日   date=2026-12-04

编译通过,已装真机。
2026-11-05 20:39:45 +08:00
..