dde87a32b6
- 库存列表:窄屏隐藏页内大标题头;KPI 2×2 MKpiGrid(缺货卡 warn+点击筛选); MSearchRow(详搜钮开筛选 sheet:状态/规格/系列);卡片徽章换图标变体 - 库存盘点:窄屏卡片流(单号/范围·项数/进行中徽章带图标/差异/日期)+ 详情 sheet(drow 键值行)+ 底部操作条;DateTime.now→appNow 可注入时钟 - 财务:窄屏隐藏大标题头;KPI 2×2(收入 up 绿/支出 down 红/应收 warn); DsSeg 应收/应付/流水三分段 + 卡片流(类型徽章带图标、金额正负色) - golden:新增 m_inventory / m_inventory_check / m_finance 三屏×三主题 (390×844@2x);重生成既有 inventory_list_mobile / finance_mobile 基准 (桌面 golden 零改动) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
127 lines
4.5 KiB
Dart
127 lines
4.5 KiB
Dart
import 'package:flutter/material.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
import 'package:flutter_test/flutter_test.dart';
|
||
import 'package:shared_preferences/shared_preferences.dart';
|
||
import 'package:jiu_client/core/auth/auth_state.dart';
|
||
import 'package:jiu_client/core/models/page_result.dart';
|
||
import 'package:jiu_client/core/utils/clock.dart';
|
||
import 'package:jiu_client/models/finance.dart';
|
||
import 'package:jiu_client/models/stock_summary.dart';
|
||
import 'package:jiu_client/providers/finance_provider.dart';
|
||
import 'package:jiu_client/providers/stock_in_provider.dart';
|
||
import 'package:jiu_client/providers/stock_out_provider.dart';
|
||
import 'package:jiu_client/screens/finance/finance_screen.dart';
|
||
|
||
import '../support/golden_harness.dart';
|
||
|
||
/// 财务管理 窄屏形态 golden × 三主题(390×844 @2x)——对齐原型 m-finance.html:
|
||
/// 隐藏页内大标题头 + KPI 2×2(收入 up 绿 / 支出 down 红)+ DsSeg 三分段
|
||
/// + 应收卡片流(往来单位 + 金额 + 未结清徽章带图标)。fixtures 与桌面 golden 同套。
|
||
/// 更新基准:flutter test --update-goldens test/golden/finance_mobile_golden_test.dart
|
||
|
||
// 原型 SUMMARY 8 行
|
||
const _rows = [
|
||
PartnerFinanceRow(partnerId: 1, name: '华东酒类批发', recv: 128400, openCount: 2),
|
||
PartnerFinanceRow(partnerId: 2, name: '金樽商贸', recv: 86200, openCount: 1),
|
||
PartnerFinanceRow(partnerId: 3, name: '茅台华南经销', pay: 142800, openCount: 1),
|
||
PartnerFinanceRow(partnerId: 4, name: '鸿运餐饮连锁', recv: 74600, openCount: 1),
|
||
PartnerFinanceRow(partnerId: 5, name: '五粮液省级代理', pay: 96400, openCount: 1),
|
||
PartnerFinanceRow(
|
||
partnerId: 6, name: '盛世名酒城', recv: 52300, pay: 18600, openCount: 2),
|
||
PartnerFinanceRow(partnerId: 7, name: '御品烟酒行', recv: 31800, openCount: 1),
|
||
PartnerFinanceRow(partnerId: 8, name: '川渝糖酒集团', pay: 60400, openCount: 1),
|
||
];
|
||
|
||
// 原型 FLOWS 前 5 条(流水分段用;390×844 首屏展示应收卡片流)
|
||
const _flows = [
|
||
FinanceRecord(
|
||
id: 1,
|
||
type: 'receipt',
|
||
amount: 68000,
|
||
balance: 0,
|
||
status: 'closed',
|
||
partnerName: '华东酒类批发',
|
||
recordDate: '2026-06-20',
|
||
remark: '飞天茅台货款'),
|
||
FinanceRecord(
|
||
id: 2,
|
||
type: 'payment',
|
||
amount: 142800,
|
||
balance: 0,
|
||
status: 'closed',
|
||
partnerName: '茅台华南经销',
|
||
recordDate: '2026-06-19',
|
||
remark: '6月采购结算'),
|
||
FinanceRecord(
|
||
id: 3,
|
||
type: 'receipt',
|
||
amount: 42600,
|
||
balance: 0,
|
||
status: 'closed',
|
||
partnerName: '金樽商贸',
|
||
recordDate: '2026-06-18',
|
||
remark: '五粮液尾款'),
|
||
FinanceRecord(
|
||
id: 4,
|
||
type: 'receipt',
|
||
amount: 31500,
|
||
balance: 0,
|
||
status: 'closed',
|
||
partnerName: '鸿运餐饮连锁',
|
||
recordDate: '2026-06-17',
|
||
remark: '宴会用酒'),
|
||
FinanceRecord(
|
||
id: 5,
|
||
type: 'payment',
|
||
amount: 96400,
|
||
balance: 0,
|
||
status: 'closed',
|
||
partnerName: '五粮液省级代理',
|
||
recordDate: '2026-06-16',
|
||
remark: '普五补货'),
|
||
];
|
||
|
||
class _FakeFinanceList extends FinanceListNotifier {
|
||
@override
|
||
Future<PageResult<FinanceRecord>> build() async =>
|
||
const PageResult(data: _flows, total: 5, page: 1, pageSize: 50);
|
||
@override
|
||
void setType(String type) {}
|
||
@override
|
||
void setMonth(String month) {}
|
||
@override
|
||
void setRange(String startDate, String endDate) {}
|
||
@override
|
||
void setPage(int page) {}
|
||
@override
|
||
void setPageSize(int pageSize) {}
|
||
@override
|
||
void reload() {}
|
||
}
|
||
|
||
List<Override> _overrides() => [
|
||
financeListProvider.overrideWith(() => _FakeFinanceList()),
|
||
financePartnerRowsProvider.overrideWith((ref) async => _rows),
|
||
// 环比凑成原型 ▲8.4% / ▼3.1%
|
||
stockOutSummaryProvider.overrideWith((ref) async =>
|
||
const StockSummary(monthAmount: 1860000, lastMonthAmount: 1715867)),
|
||
stockInSummaryProvider.overrideWith((ref) async =>
|
||
const StockSummary(monthAmount: 1320000, lastMonthAmount: 1362229)),
|
||
isReadonlyProvider.overrideWithValue(false),
|
||
];
|
||
|
||
void main() {
|
||
TestWidgetsFlutterBinding.ensureInitialized();
|
||
SharedPreferences.setMockInitialValues({});
|
||
appClock = () => DateTime(2026, 7, 13, 9, 30, 15);
|
||
|
||
goldenAcrossThemes(
|
||
'finance 窄屏(m-finance)',
|
||
goldenPrefix: 'm_finance',
|
||
child: () => const Scaffold(body: FinanceScreen()),
|
||
overrides: _overrides,
|
||
logical: const Size(390, 844),
|
||
dpr: 2,
|
||
);
|
||
}
|