import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../core/api/api_client.dart'; import '../core/auth/auth_state.dart'; import '../core/config/app_constants.dart'; import '../core/models/page_result.dart'; import '../models/inventory.dart'; import '../repositories/inventory_repository.dart'; import 'connectivity_provider.dart'; final inventoryRepositoryProvider = Provider((ref) { return InventoryRepository(ref.watch(apiClientProvider)); }); final inventoryListProvider = AsyncNotifierProvider>( InventoryListNotifier.new, ); /// 全店库存 KPI 汇总(不随分页;换店/网络恢复自动刷新)。 final inventorySummaryProvider = FutureProvider.autoDispose((ref) { ref.watch(authStateProvider.select((s) => s.user?.shopId)); ref.watch(networkRecoveryCountProvider); return ref.read(inventoryRepositoryProvider).getSummary(); }); class InventoryListNotifier extends AsyncNotifier> { int _page = 1; int _pageSize = AppConstants.defaultPageSize; int? _warehouseId; String _keyword = ''; String _code = ''; // 商品编码独立筛选(原型 codeInput) String _status = ''; // 三态筛选(空=后端默认排除已售) String _sortBy = ''; // 列头排序(空=默认 id 倒序) bool _sortAsc = true; List _series = []; List _spec = []; @override Future> build() async { ref.watch(authStateProvider.select((s) => s.user?.shopId)); ref.watch(networkRecoveryCountProvider); // 网络恢复时自动刷新 return _fetch(); } Future> _fetch() { return ref.read(inventoryRepositoryProvider).listInventory( warehouseId: _warehouseId, keyword: _keyword.isEmpty ? null : _keyword, code: _code.isEmpty ? null : _code, status: _status.isEmpty ? null : _status, sortBy: _sortBy.isEmpty ? null : _sortBy, sortAsc: _sortAsc, series: _series.isEmpty ? null : _series, spec: _spec.isEmpty ? null : _spec, page: _page, pageSize: _pageSize, ); } void setPage(int page) { _page = page; reload(); } void setPageSize(int pageSize) { _pageSize = pageSize; _page = 1; reload(); } void setWarehouseId(int? id) { _warehouseId = id; _page = 1; reload(); } void setKeyword(String keyword) { _keyword = keyword; _page = 1; reload(); } void setCode(String code) { _code = code; _page = 1; reload(); } void setStatus(String status) { _status = status; _page = 1; reload(); } void setSort(String sortBy, bool asc) { _sortBy = sortBy; _sortAsc = asc; _page = 1; reload(); } void setSeries(List series) { _series = series; _page = 1; reload(); } void setSpec(List spec) { _spec = spec; _page = 1; reload(); } void reload() { // 保留上一次数据(isReloading)→ 屏幕渲染旧内容 + 半透明进度,不白屏。 state = const AsyncValue>.loading() .copyWithPrevious(state); _fetch().then((result) { state = AsyncValue.data(result); }, onError: (e, st) { state = AsyncValue.error(e, st); }); } } final inventoryLogProvider = AsyncNotifierProvider>( InventoryLogNotifier.new, ); class InventoryLogNotifier extends AsyncNotifier> { int _page = 1; int _pageSize = AppConstants.defaultPageSize; @override Future> build() async { ref.watch(authStateProvider.select((s) => s.user?.shopId)); ref.watch(networkRecoveryCountProvider); return _fetch(); } Future> _fetch() { return ref.read(inventoryRepositoryProvider).listLogs( page: _page, pageSize: _pageSize, ); } void setPage(int page) { _page = page; reload(); } void setPageSize(int pageSize) { _pageSize = pageSize; _page = 1; reload(); } void reload() { state = const AsyncValue.loading(); _fetch().then((result) { state = AsyncValue.data(result); }, onError: (e, st) { state = AsyncValue.error(e, st); }); } }