Files
jiu/client/lib/providers/license_purchase_provider.dart
T
wangjia 3888cf2d65 feat(client): 慢请求监控(>500ms 记日志+上报);拆除列表 provider 的 _cache 失败兜底
- SlowRequestInterceptor:单次 API 调用超 500ms 即 debugPrint long-request
  日志并经 ErrorReporter 上报(error_type=slow_api,按 method+归一路径 5 分钟
  节流)。服务端 GIN 日志只见自身处理耗时,网络往返段只有客户端可观测。
- 拆除 10 个列表 provider 的 _cache 失败兜底:实测线上接口客户端视角典型
  50-120ms、最坏约 270ms(列表类全部 <500ms),失败静默端旧数据弊大于利
  (曾放大跨账号残留问题),改为明确进入错误态由用户重试。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-15 00:49:29 +08:00

67 lines
1.9 KiB
Dart

// providers/license_purchase_provider.dart — 授权购买订单列表(订单管理 tab)。
// 后端 GET /license/purchases 只支持 page/page_size/status 三个查询轴;
// 套餐/关键词/下单时间筛选在列表屏做客户端过滤(当前页),与 stock_out 列表
// 屏「仓库」筛选同一established 口径(server 端无对应参数)。
import 'package:flutter_riverpod/flutter_riverpod.dart';
import '../core/auth/auth_state.dart';
import '../models/license.dart';
import 'license_provider.dart' show licenseRepositoryProvider;
final purchaseListProvider =
AsyncNotifierProvider<PurchaseListNotifier, PurchaseListResult>(
PurchaseListNotifier.new,
);
class PurchaseListNotifier extends AsyncNotifier<PurchaseListResult> {
int _page = 1;
int _pageSize = 10;
String _status = ''; // '' | pending | paid | failed
@override
Future<PurchaseListResult> build() async {
ref.watch(authStateProvider.select((s) => s.user?.shopId));
return _fetch();
}
Future<PurchaseListResult> _fetch() {
return ref.read(licenseRepositoryProvider).listPurchases(
page: _page,
pageSize: _pageSize,
status: _status.isEmpty ? null : _status,
);
}
int get page => _page;
int get pageSize => _pageSize;
String get currentStatus => _status;
void reload() {
// 保留上一次数据(isReloading)→ 屏幕可继续渲染旧内容 + 叠加半透明进度,不白屏。
state =
const AsyncValue<PurchaseListResult>.loading().copyWithPrevious(state);
_fetch().then((result) {
state = AsyncValue.data(result);
}, onError: (Object e, StackTrace st) {
state = AsyncValue.error(e, st);
});
}
void setPage(int p) {
_page = p;
reload();
}
void setPageSize(int size) {
_pageSize = size;
_page = 1;
reload();
}
void setStatus(String status) {
_status = status;
_page = 1;
reload();
}
}