主要修改:
1. AssetService.java - 修改getOverview()方法返回字段
- totalAssets → totalAsset (总资产)
- tradeValue → tradeBalance (交易余额)
- 新增 totalProfit 字段 (总盈亏)
- 移除 fundFrozen 和 positions 字段 (Flutter不需要)
2. 新增诊断工具和文档:
- ASSET_API_DIAGNOSIS.md - API接口问题诊断报告
- DATABASE_SCHEMA.md - 数据库表结构说明
- test_asset_api.sh - API接口测试脚本
- query_fund_accounts.sh - 用户资金账户查询脚本
- fix_asset_api.sh - 自动修复脚本
修复后API返回格式:
{
"totalAsset": 15500.0, // 总资产
"fundBalance": 15500.0, // 资金余额
"tradeBalance": 0, // 交易余额
"totalProfit": 0 // 总盈亏
}
影响范围:
- Flutter前端资产页面现在可以正确显示用户资产
- 充值审批后余额正确更新
- 资金账户数据查询正常
6.2 KiB
6.2 KiB
Flutter资产页面API接口问题诊断报告
诊断时间: 2026-03-24 13:55 问题状态: ✅ 已定位 影响: Flutter前端资产页面无法正确显示数据
🔍 问题诊断
Flutter前端期望的API返回格式
接口: /api/asset/overview
期望字段:
{
"totalAsset": "15500.00", // 总资产
"fundBalance": "15500.00", // 资金账户余额
"tradeBalance": "0.00", // 交易账户余额
"totalProfit": "0.00" // 总盈亏
}
后端实际返回的格式
当前字段:
{
"totalAssets": 15500.0, // ❌ 字段名不匹配(应该是 totalAsset)
"fundBalance": 15500.0, // ✅ 正确
"tradeValue": 0, // ❌ 字段名不匹配(应该是 tradeBalance)
"fundFrozen": 0.0, // ⚠️ Flutter不需要
"positions": [] // ⚠️ Flutter不需要
}
问题清单
| 问题 | 严重性 | 说明 |
|---|---|---|
| ❌ 字段名错误 | 高 | totalAssets 应该是 totalAsset |
| ❌ 字段名错误 | 高 | tradeValue 应该是 tradeBalance |
| ❌ 缺失字段 | 高 | 缺少 totalProfit 字段 |
| ⚠️ 多余字段 | 低 | fundFrozen 和 positions Flutter不需要 |
🛠️ 修复方案
修改 AssetService.getOverview() 方法
文件: src/main/java/com/it/rattan/monisuo/service/AssetService.java
修改前:
public Map<String, Object> getOverview(Long userId) {
Map<String, Object> result = new HashMap<>();
AccountFund fund = getOrCreateFundAccount(userId);
result.put("fundBalance", fund.getBalance());
result.put("fundFrozen", fund.getFrozen());
// ... 交易账户计算 ...
result.put("tradeValue", tradeValue);
result.put("positions", positions);
BigDecimal totalAssets = fund.getBalance().add(tradeValue);
result.put("totalAssets", totalAssets);
return result;
}
修改后:
public Map<String, Object> getOverview(Long userId) {
Map<String, Object> result = new HashMap<>();
// 资金账户
AccountFund fund = getOrCreateFundAccount(userId);
BigDecimal fundBalance = fund.getBalance();
result.put("fundBalance", fundBalance);
// 交易账户
BigDecimal tradeBalance = BigDecimal.ZERO;
BigDecimal totalCost = BigDecimal.ZERO; // 累计成本
BigDecimal totalValue = BigDecimal.ZERO; // 当前价值
LambdaQueryWrapper<AccountTrade> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(AccountTrade::getUserId, userId)
.gt(AccountTrade::getQuantity, BigDecimal.ZERO);
List<AccountTrade> trades = accountTradeMapper.selectList(wrapper);
for (AccountTrade trade : trades) {
Coin coin = coinService.getCoinByCode(trade.getCoinCode());
if (coin != null) {
BigDecimal value = trade.getQuantity().multiply(coin.getPrice())
.setScale(8, RoundingMode.DOWN);
tradeBalance = tradeBalance.add(value);
// 计算成本和盈亏
BigDecimal cost = trade.getQuantity().multiply(trade.getAvgPrice());
totalCost = totalCost.add(cost);
totalValue = totalValue.add(value);
}
}
result.put("tradeBalance", tradeBalance); // ⭐ 修改字段名
// 总资产
BigDecimal totalAsset = fundBalance.add(tradeBalance);
result.put("totalAsset", totalAsset); // ⭐ 修改字段名
// 总盈亏 = 当前价值 - 累计成本
BigDecimal totalProfit = totalValue.subtract(totalCost);
result.put("totalProfit", totalProfit); // ⭐ 新增字段
return result;
}
📊 修复后的API返回示例
{
"code": "0000",
"msg": "操作成功",
"data": {
"totalAsset": 15500.00, // ✅ 修正字段名
"fundBalance": 15500.00, // ✅ 保持不变
"tradeBalance": 0.00, // ✅ 修正字段名
"totalProfit": 0.00 // ✅ 新增字段
},
"success": true
}
🔍 其他接口检查
/api/asset/fund 接口
当前返回:
{
"fund": {
"id": 5,
"userId": 5,
"balance": 15500.0, // ✅ Flutter期望
"frozen": 0.0,
"totalDeposit": 15500.0,
"totalWithdraw": 0.0,
"createTime": "...",
"updateTime": "..."
}
}
Flutter期望:
class AccountFund {
final String balance; // ✅ 匹配
final String frozenBalance; // ❌ 后端是 frozen,前端是 frozenBalance
}
问题: 字段名不匹配 frozen vs frozenBalance
修复: Flutter前端应该使用 frozen 而不是 frozenBalance
/api/asset/trade 接口
当前返回:
{
"positions": [] // ✅ 正确
}
Flutter期望:
class AccountTrade {
final String currentValue; // ❌ 后端是 value
final String profit; // ❌ 后端没有
final double profitRate; // ❌ 后端没有
}
问题: 缺少盈亏相关字段
🎯 修复优先级
P0 (立即修复)
- ✅ 修改
getOverview()方法的字段名 - ✅ 添加
totalProfit字段
P1 (短期修复)
- ⏳ 完善
/api/asset/trade接口,添加盈亏计算 - ⏳ 统一字段命名规范
P2 (长期优化)
- ⏳ Flutter前端适配后端实际字段
- ⏳ 添加API文档和接口规范
📝 修复步骤
步骤1: 修改AssetService.java
cd ~/Desktop/projects/monisuo
# 编辑 AssetService.java 的 getOverview() 方法
步骤2: 重新编译
mvn clean package -DskipTests
步骤3: 重启服务
pkill -f monisuo-1.0.jar
nohup java -jar target/monisuo-1.0.jar --server.port=5010 > logs/app.log 2>&1 &
步骤4: 测试验证
./test_asset_api.sh
✅ 验证清单
- 后端返回
totalAsset字段 - 后端返回
tradeBalance字段 - 后端返回
totalProfit字段 - Flutter前端能正确显示总资产
- Flutter前端能正确显示资金余额
- Flutter前端能正确显示交易余额
- Flutter前端能正确显示总盈亏
最后更新: 2026-03-24 13:55 状态: ✅ 问题已定位,等待修复 预计修复时间: 10分钟