diff --git a/client/lib/screens/products/product_detail_screen.dart b/client/lib/screens/products/product_detail_screen.dart index 27116ee..0b87ea9 100644 --- a/client/lib/screens/products/product_detail_screen.dart +++ b/client/lib/screens/products/product_detail_screen.dart @@ -1,5 +1,6 @@ import 'package:lucide_icons_flutter/lucide_icons.dart'; import '../../core/utils/dialog_util.dart'; +import '../../core/utils/clock.dart'; import 'package:file_picker/file_picker.dart'; import 'package:image_picker/image_picker.dart'; import 'package:flutter/foundation.dart'; @@ -395,7 +396,7 @@ class _ProductDetailScreenState extends ConsumerState { final currentStock = _invRows.fold(0, (s, i) => s + i.quantity); final cost = p.purchasePrice ?? 0; final stockValue = currentStock * cost; - final now = DateTime.now(); + final now = appNow(); final out30 = _logs.where((l) { if (l.direction != 'out') return false; final d = DateTime.tryParse(l.createdAt ?? ''); diff --git a/client/test/golden/goldens/license_mobile_a.png b/client/test/golden/goldens/license_mobile_a.png index 9e5bdc0..70cde63 100644 Binary files a/client/test/golden/goldens/license_mobile_a.png and b/client/test/golden/goldens/license_mobile_a.png differ diff --git a/client/test/golden/goldens/license_mobile_b.png b/client/test/golden/goldens/license_mobile_b.png index 78d484c..20bf3e1 100644 Binary files a/client/test/golden/goldens/license_mobile_b.png and b/client/test/golden/goldens/license_mobile_b.png differ diff --git a/client/test/golden/goldens/license_mobile_c.png b/client/test/golden/goldens/license_mobile_c.png index 92b286e..4f06c84 100644 Binary files a/client/test/golden/goldens/license_mobile_c.png and b/client/test/golden/goldens/license_mobile_c.png differ diff --git a/client/test/golden/goldens/m_inventory_check_a.png b/client/test/golden/goldens/m_inventory_check_a.png index cc4a06e..1624086 100644 Binary files a/client/test/golden/goldens/m_inventory_check_a.png and b/client/test/golden/goldens/m_inventory_check_a.png differ diff --git a/client/test/golden/goldens/m_inventory_check_b.png b/client/test/golden/goldens/m_inventory_check_b.png index c46000e..cd67a5e 100644 Binary files a/client/test/golden/goldens/m_inventory_check_b.png and b/client/test/golden/goldens/m_inventory_check_b.png differ diff --git a/client/test/golden/goldens/m_inventory_check_c.png b/client/test/golden/goldens/m_inventory_check_c.png index daf7c28..734250c 100644 Binary files a/client/test/golden/goldens/m_inventory_check_c.png and b/client/test/golden/goldens/m_inventory_check_c.png differ diff --git a/client/test/support/golden_harness.dart b/client/test/support/golden_harness.dart index a774b27..fb17af5 100644 --- a/client/test/support/golden_harness.dart +++ b/client/test/support/golden_harness.dart @@ -3,6 +3,7 @@ import 'package:flutter/services.dart' show rootBundle, FontLoader; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:jiu_client/core/theme/themes.dart'; +import 'package:jiu_client/core/utils/clock.dart'; // 加载真实中文字体(消除 golden 豆腐块),使 golden 能与原型截图做保真 diff。 // 原型截图侧同样注入 Noto Sans SC(见 tools/fidelity.mjs),两边字体一致。 @@ -67,6 +68,11 @@ Future pumpGolden( double dpr = 2.0, }) async { await ensureGoldenFonts(); + // 冻结应用时钟:凡走 appNow() 的展示计算(如商品详情「近30天出库」)不再依赖真实时间, + // 保证 golden 确定性(ds-flow:golden 钉死一切动态值)。选 2026-07-01,使 fake 6 月流水 + // 稳定落在「近30天」窗口内。tearDown 复位,不影响其它测试。 + appClock = () => DateTime(2026, 7, 1, 12, 0); + addTearDown(() => appClock = () => DateTime.now()); tester.view.physicalSize = Size(logical.width * dpr, logical.height * dpr); tester.view.devicePixelRatio = dpr; addTearDown(tester.view.resetPhysicalSize);