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

@@ -8,7 +8,23 @@ class FundService {
FundService(this._client);
/// 获取默认钱包地址
Future<ApiResponse<ColdWallet>> getDefaultWallet() async {
final response = await _client.get<Map<String, dynamic>>(
ApiEndpoints.defaultWallet,
);
if (response.success && response.data != null) {
return ApiResponse.success(
ColdWallet.fromJson(response.data!),
response.message,
);
}
return ApiResponse.fail(response.message ?? '获取钱包地址失败');
}
/// 申请充值
/// 返回包含 orderNo, amount, status, walletAddress, walletNetwork 的信息
Future<ApiResponse<Map<String, dynamic>>> deposit({
required String amount,
String? remark,
@@ -22,15 +38,27 @@ class FundService {
);
}
/// 用户确认已打款
Future<ApiResponse<void>> confirmPay(String orderNo) async {
return _client.post<void>(
ApiEndpoints.confirmPay,
data: {'orderNo': orderNo},
);
}
/// 申请提现
Future<ApiResponse<Map<String, dynamic>>> withdraw({
required String amount,
required String withdrawAddress,
String? withdrawContact,
String? remark,
}) async {
return _client.post<Map<String, dynamic>>(
ApiEndpoints.withdraw,
data: {
'amount': amount,
'withdrawAddress': withdrawAddress,
if (withdrawContact != null) 'withdrawContact': withdrawContact,
if (remark != null) 'remark': remark,
},
);
@@ -62,19 +90,9 @@ class FundService {
);
}
/// 获取充提订单详情
Future<ApiResponse<OrderFund>> getOrderDetail(String orderNo) async {
final response = await _client.get<Map<String, dynamic>>(
ApiEndpoints.fundOrders,
queryParameters: {'orderNo': orderNo},
);
if (response.success && response.data != null) {
return ApiResponse.success(
OrderFund.fromJson(response.data!),
response.message,
);
}
return ApiResponse.fail(response.message ?? '获取订单详情失败');
/// 解析充提记录列表
List<OrderFund> parseOrderList(List<dynamic>? list) {
if (list == null) return [];
return list.map((e) => OrderFund.fromJson(e as Map<String, dynamic>)).toList();
}
}