Files
monisuo/ASSET_API_DIAGNOSIS.md
sion a4423e044b fix: 修复Flutter资产页面API接口字段名称不匹配问题
主要修改:
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前端资产页面现在可以正确显示用户资产
- 充值审批后余额正确更新
- 资金账户数据查询正常
2026-03-24 14:08:59 +08:00

6.2 KiB
Raw Blame History

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 字段
⚠️ 多余字段 fundFrozenpositions 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 (立即修复)

  1. 修改 getOverview() 方法的字段名
  2. 添加 totalProfit 字段

P1 (短期修复)

  1. 完善 /api/asset/trade 接口,添加盈亏计算
  2. 统一字段命名规范

P2 (长期优化)

  1. Flutter前端适配后端实际字段
  2. 添加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分钟