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:
sion
2026-03-22 23:15:23 +08:00
parent a476d0a23b
commit 91227b7e51
21 changed files with 2225 additions and 229 deletions

View File

@@ -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([