新增:健康事件时间线接入真实数据(T2-14 时间线半边)

- 时间线页:occurred_at DESC cursor 分页 + 月分组组头,四态齐备;
  六类事件经 RecordTypeDot 映射(增补喂养/洗护/测量三型,色族复用
  已审计色对),类型 TagPill 双通道
- 事件录入表单:六类类型选择器、金额以元录入/整数分传输(money.dart
  换算)、UTC 时间戳约定与体重表单一致
- 事件编辑页:顶层 PATCH 差量提交(title/notes/amountCents + version),
  40902 照 T2-12 模式自动经时间线检索取新 version 重提(保留输入)
- 档案页:月度花费卡接 summary.monthlyExpense(分→元展示)、tz 透传
  设备时区固定偏移(T2-13 遗留③)、健康时间线导航入口
- 埋点:health_record 域 create 三事件 + viewed(recordType=health_event)
  挂通;新增 edit_succeeded/failed 封装(failureReason 含 conflict)
- 测试 224 → 250 全绿(+26);analyze 0 问题;format 无 diff

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-08 13:49:48 +08:00
parent c91f18a845
commit e186ba3da9
15 changed files with 2274 additions and 23 deletions
+21 -2
View File
@@ -4,8 +4,8 @@ import 'package:patbond_flutter/core/theme/app_theme.dart';
import 'package:patbond_flutter/core/widgets/record_type_dot.dart';
void main() {
testWidgets('五类映射齐备:图标 + 双色(05 §2 表)', (tester) async {
// 映射表唯一出口:五类各有图标、底色、图标色、文字色、文案。
testWidgets('全类型映射齐备:图标 + 双色(05 §2 表 + T2-14 增补三型', (tester) async {
// 映射表唯一出口:各类型均有图标、底色、图标色、文字色、文案。
expect(recordTypeStyles.length, RecordType.values.length);
expect(
recordTypeStyles[RecordType.weight]!.iconColor,
@@ -26,6 +26,25 @@ void main() {
expect(recordTypeStyles[RecordType.medical]!.inkColor, AppColors.errorDark);
expect(recordTypeStyles[RecordType.other]!.inkColor, AppColors.inkSoft);
expect(recordTypeStyles[RecordType.medical]!.label, '就医');
// T2-14 增补三型:色族复用已审计色对,仅图标/文案区分。
expect(
recordTypeStyles[RecordType.feeding]!.inkColor,
AppColors.successInk,
);
expect(recordTypeStyles[RecordType.feeding]!.label, '喂养');
expect(
recordTypeStyles[RecordType.grooming]!.inkColor,
AppColors.accentDark,
);
expect(recordTypeStyles[RecordType.grooming]!.label, '洗护');
expect(
recordTypeStyles[RecordType.measurement]!.inkColor,
AppColors.primaryDark,
);
expect(recordTypeStyles[RecordType.measurement]!.label, '测量');
// 三型图标彼此不同(与既有五型也不重复),保证图标通道可辨。
final icons = {for (final style in recordTypeStyles.values) style.icon};
expect(icons.length, RecordType.values.length);
});
testWidgets('圆标渲染:尺寸档正确、图标为 dot 的 50%、底为基色 8% 淡染', (tester) async {