feat: 重构充值提现功能,添加冷钱包管理
后端改动: - 新增冷钱包管理模块(ColdWallet实体、Mapper、Service、Controller) - 充值流程:创建订单→显示钱包地址→用户确认打款→管理员审核 - 提现流程:用户输入地址和联系方式→冻结余额→管理员审核 - OrderFund新增字段:walletId, walletAddress, withdrawContact, payTime, confirmTime 前端改动(monisuo-admin): - 新增冷钱包管理页面(wallets.vue) - 优化订单管理页面,支持新的状态流转 - 添加调试日志帮助排查登录问题 前端改动(flutter_monisuo): - 更新OrderFund模型支持新字段 - 充值成功后显示钱包地址弹窗 - 提现时收集提现地址和联系方式 - 新增资金订单页面 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import '../data/models/account_models.dart';
|
||||
import '../data/models/order_models.dart';
|
||||
import '../data/services/asset_service.dart';
|
||||
import '../data/services/fund_service.dart';
|
||||
import '../core/network/dio_client.dart';
|
||||
@@ -13,8 +14,10 @@ class AssetProvider extends ChangeNotifier {
|
||||
AccountFund? _fundAccount;
|
||||
List<AccountTrade> _tradeAccounts = [];
|
||||
List<AccountFlow> _flows = [];
|
||||
List<OrderFund> _fundOrders = [];
|
||||
bool _isLoading = false;
|
||||
bool _isLoadingFlows = false;
|
||||
bool _isLoadingOrders = false;
|
||||
String? _error;
|
||||
|
||||
AssetProvider(this._assetService, this._fundService);
|
||||
@@ -25,8 +28,10 @@ class AssetProvider extends ChangeNotifier {
|
||||
List<AccountTrade> get tradeAccounts => _tradeAccounts;
|
||||
List<AccountTrade> get holdings => _tradeAccounts;
|
||||
List<AccountFlow> get flows => _flows;
|
||||
List<OrderFund> get fundOrders => _fundOrders;
|
||||
bool get isLoading => _isLoading;
|
||||
bool get isLoadingFlows => _isLoadingFlows;
|
||||
bool get isLoadingOrders => _isLoadingOrders;
|
||||
String? get error => _error;
|
||||
|
||||
/// 加载资产总览
|
||||
@@ -120,8 +125,8 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 充值
|
||||
Future<ApiResponse<void>> deposit({required String amount, String? remark}) async {
|
||||
/// 充值 - 返回订单详情包含钱包地址
|
||||
Future<ApiResponse<Map<String, dynamic>>> deposit({required String amount, String? remark}) async {
|
||||
try {
|
||||
final response = await _fundService.deposit(amount: amount, remark: remark);
|
||||
if (response.success) {
|
||||
@@ -134,10 +139,33 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 提现
|
||||
Future<ApiResponse<void>> withdraw({required String amount, String? remark}) async {
|
||||
/// 确认已打款
|
||||
Future<ApiResponse<void>> confirmPay(String orderNo) async {
|
||||
try {
|
||||
final response = await _fundService.withdraw(amount: amount, remark: remark);
|
||||
final response = await _fundService.confirmPay(orderNo);
|
||||
if (response.success) {
|
||||
await loadFundOrders();
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('确认打款失败: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 提现
|
||||
Future<ApiResponse<Map<String, dynamic>>> withdraw({
|
||||
required String amount,
|
||||
required String withdrawAddress,
|
||||
String? withdrawContact,
|
||||
String? remark,
|
||||
}) async {
|
||||
try {
|
||||
final response = await _fundService.withdraw(
|
||||
amount: amount,
|
||||
withdrawAddress: withdrawAddress,
|
||||
withdrawContact: withdrawContact,
|
||||
remark: remark,
|
||||
);
|
||||
if (response.success) {
|
||||
await loadOverview();
|
||||
await loadFundAccount();
|
||||
@@ -148,6 +176,43 @@ class AssetProvider extends ChangeNotifier {
|
||||
}
|
||||
}
|
||||
|
||||
/// 加载充提订单
|
||||
Future<void> loadFundOrders({int? type, int pageNum = 1, int pageSize = 20}) async {
|
||||
_isLoadingOrders = true;
|
||||
notifyListeners();
|
||||
|
||||
try {
|
||||
final response = await _fundService.getOrders(
|
||||
type: type,
|
||||
pageNum: pageNum,
|
||||
pageSize: pageSize,
|
||||
);
|
||||
if (response.success && response.data != null) {
|
||||
final list = response.data!['list'] as List?;
|
||||
_fundOrders = _fundService.parseOrderList(list);
|
||||
}
|
||||
} catch (_) {
|
||||
// 忽略错误
|
||||
}
|
||||
|
||||
_isLoadingOrders = false;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
/// 取消订单
|
||||
Future<ApiResponse<void>> cancelOrder(String orderNo) async {
|
||||
try {
|
||||
final response = await _fundService.cancelOrder(orderNo);
|
||||
if (response.success) {
|
||||
await loadFundOrders();
|
||||
await loadFundAccount();
|
||||
}
|
||||
return response;
|
||||
} catch (e) {
|
||||
return ApiResponse.fail('取消订单失败: $e');
|
||||
}
|
||||
}
|
||||
|
||||
/// 刷新所有资产数据
|
||||
Future<void> refreshAll() async {
|
||||
await Future.wait([
|
||||
|
||||
Reference in New Issue
Block a user