From 62d8c81857c5e9f2d6e5e02b8d3fd56eb5e82429 Mon Sep 17 00:00:00 2001 From: sion <450702724@qq.com> Date: Tue, 24 Mar 2026 13:33:23 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E6=B7=BB=E5=8A=A0=E5=85=85=E5=80=BC?= =?UTF-8?q?=E5=AE=A1=E6=89=B9=E5=AE=8C=E6=95=B4=E8=AF=8A=E6=96=AD=E6=8C=87?= =?UTF-8?q?=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增: - COMPLETE_DIAGNOSIS_GUIDE.md - 充值审批余额更新的完整诊断和修复方案 - test_approve.sh - 自动化审批测试脚本 包含: - 详细测试步骤 - 日志查看方法 - 数据库验证SQL - 常见问题诊断 - 根本原因分析 - 快速验证方法 --- COMPLETE_DIAGNOSIS_GUIDE.md | 350 ++++++++++++++++++++++++++++++++++++ test_approve.sh | 112 ++++++++++++ 2 files changed, 462 insertions(+) create mode 100644 COMPLETE_DIAGNOSIS_GUIDE.md create mode 100755 test_approve.sh diff --git a/COMPLETE_DIAGNOSIS_GUIDE.md b/COMPLETE_DIAGNOSIS_GUIDE.md new file mode 100644 index 0000000..2ae37b0 --- /dev/null +++ b/COMPLETE_DIAGNOSIS_GUIDE.md @@ -0,0 +1,350 @@ +# 充值审批余额未更新 - 完整诊断和修复方案 + +**问题**: 充值订单审批通过后,订单状态已更新为"已完成"(status=3),但用户资金账户余额没有增加 + +**服务状态**: ✅ 已启动 (端口 5010) + +**时间**: 2026-03-24 13:31 + +--- + +## 🔧 立即测试步骤 + +### 步骤 1: 准备测试数据 + +```bash +# 方式A: 使用前端操作 +1. 登录用户端 +2. 进入"充提"页面 +3. 点击"充值" +4. 输入金额(例如:100 USDT) +5. 点击"提交" +6. 点击"确认打款" + +# 方式B: 使用API(如果有已存在的订单) +# 查看待审批订单 +curl -X POST http://localhost:5010/admin/login \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"admin123"}' | jq -r '.data.token' + +# 使用返回的token查询 +curl http://localhost:5010/admin/order/pending?type=1&status=2 \ + -H "Authorization: Bearer " +``` + +### 步骤 2: 执行审批并查看日志 + +**终端1 - 监控日志**: +```bash +cd ~/Desktop/projects/monisuo +tail -f logs/app.log | grep --line-buffered -A30 "FundService.approve" +``` + +**终端2 - 执行审批**: +```bash +cd ~/Desktop/projects/monisuo +./test_approve.sh +``` + +### 步骤 3: 查看关键日志输出 + +**成功的日志应该包含**: +``` +[FundService.approve] 步骤1: 查询订单... + - 订单ID: 123 + - 订单类型: 充值 + - 当前状态: 2 + +[FundService.approve] 步骤2: 查询资金账户... + - 账户ID: 456 + - 用户ID: 789 + - 余额: 0.00 <-- 审批前余额 + - 冻结: 0.00 + +[FundService.approve] 步骤3: 确定最终状态: 3 (审批通过) + +[FundService.approve] 步骤4: 处理充值通过... + - 审批前余额: 0.00 + - 审批前累计充值: 0.00 + - 准备更新账户余额: 100.00 <-- 新余额 + - 准备更新累计充值: 100.00 + - 执行 SQL UPDATE (使用 LambdaUpdateWrapper)... + - 账户更新结果: 1 (1=成功, 0=失败) <-- 必须是1! + - 验证更新后余额: 100.00 <-- 验证成功! + - 验证更新后累计充值: 100.00 + +[FundService.approve] 创建资金流水记录... + - 流水记录创建成功 + +[充值审批成功] 订单号: F20260324001, 用户ID: 789, 充值金额: 100 USDT + +[FundService.approve] 步骤5: 更新订单状态... + - 当前状态: 2 + - 目标状态: 3 + - 执行 SQL UPDATE (使用 LambdaUpdateWrapper)... + - 订单更新结果: 1 (1=成功, 0=失败) +[FundService.approve] 步骤6: 验证更新结果... + - 验证查询结果: ID=123, 订单号=F20260324001, 状态=3 + - 状态验证通过 ✓ + +[审批完成] 订单号: F20260324001, 订单类型: 充值, 审批结果: 通过, 最终状态: 3 +``` + +--- + +## ❌ 如果日志显示失败 + +### 情况1: 账户更新结果: 0 + +**原因**: UPDATE语句执行失败 + +**诊断**: +```bash +# 查看完整SQL日志 +grep "UPDATE account_fund" logs/app.log | tail -5 +``` + +**修复**: 检查账户是否存在 +```sql +SELECT * FROM account_fund WHERE user_id = [用户ID]; +``` + +### 情况2: 验证更新后余额仍然是旧值 + +**原因**: 事务回滚或缓存问题 + +**诊断**: +```bash +# 查看事务日志 +grep -i "transaction\|rollback\|commit" logs/app.log | tail -10 +``` + +**修复**: 检查事务配置 + +### 情况3: 没有任何日志输出 + +**原因**: 服务未重启或代码未更新 + +**修复**: +```bash +# 1. 重新编译 +cd ~/Desktop/projects/monisuo +mvn clean package -DskipTests + +# 2. 重启服务 +pkill -f monisuo-1.0.jar +export JAVA_HOME=/opt/homebrew/Cellar/openjdk@17/17.0.18/libexec/openjdk.jdk/Contents/Home +export PATH=$JAVA_HOME/bin:$PATH +nohup java -jar target/monisuo-1.0.jar --server.port=5010 > logs/app.log 2>&1 & +``` + +--- + +## ✅ 数据库验证 + +### 查询订单状态 +```sql +SELECT + order_no, + user_id, + amount, + status, + approve_admin_id, + approve_time +FROM order_fund +WHERE order_no = '[订单号]'; +``` + +**期望结果**: status = 3, approve_time 有值 + +### 查询账户余额(关键!) +```sql +SELECT + user_id, + balance, + total_deposit, + frozen, + update_time +FROM account_fund +WHERE user_id = [用户ID]; +``` + +**期望结果**: +- balance = 原余额 + 充值金额 +- total_deposit = 原累计充值 + 充值金额 +- update_time = 审批时间 + +### 查询资金流水 +```sql +SELECT + flow_no, + flow_type, + amount, + balance_before, + balance_after, + related_order_no, + create_time +FROM account_flow +WHERE related_order_no = '[订单号]' +ORDER BY create_time DESC; +``` + +**期望结果**: +- flow_type = 1 (充值) +- amount = 充值金额 +- balance_before = 审批前余额 +- balance_after = 审批后余额 + +--- + +## 🔍 问题根本原因分析 + +### 可能的原因 + +1. **服务未重启** ⭐⭐⭐⭐⭐ + - 症状: 代码已修改但日志没有新格式的输出 + - 原因: Java应用需要重启才能加载新代码 + - 解决: 重启服务 + +2. **事务回滚** + - 症状: 日志显示更新成功,但数据库未变化 + - 原因: 方法后续步骤抛出异常 + - 解决: 检查完整日志,修复异常 + +3. **查询错误账户** + - 症状: 更新了账户,但查询的是另一个账户 + - 原因: user_id不匹配 + - 解决: 验证订单的user_id和账户的user_id + +4. **MyBatis缓存** + - 症状: 数据库已更新,但查询返回旧数据 + - 原因: MyBatis一级缓存或二级缓存 + - 解决: 清除缓存或禁用缓存 + +--- + +## 🛠️ 如果问题依然存在 + +### 收集以下信息 + +1. **完整审批日志** +```bash +grep -A100 "审批订单开始" logs/app.log | tail -120 > approval_debug.log +``` + +2. **SQL执行日志** +```bash +grep "UPDATE\|INSERT" logs/app.log | tail -20 > sql_debug.log +``` + +3. **事务日志** +```bash +grep -i "transaction\|rollback\|commit" logs/app.log | tail -20 > transaction_debug.log +``` + +4. **数据库查询结果** +```sql +-- 订单信息 +SELECT * FROM order_fund WHERE order_no = '[订单号]'; + +-- 账户信息 +SELECT * FROM account_fund WHERE user_id = [用户ID]; + +-- 流水记录 +SELECT * FROM account_flow WHERE related_order_no = '[订单号]'; + +-- 检查是否有多个账户 +SELECT * FROM account_fund WHERE user_id = [用户ID] ORDER BY update_time DESC; +``` + +--- + +## 📊 快速验证脚本 + +使用我创建的测试脚本: +```bash +cd ~/Desktop/projects/monisuo +./test_approve.sh +``` + +--- + +## 🎯 预期结果 + +### 成功的标志 +- ✅ 日志显示"账户更新结果: 1" +- ✅ 日志显示"验证更新后余额: [新余额]" +- ✅ 日志显示"充值审批成功" +- ✅ 日志显示"状态验证通过 ✓" +- ✅ 数据库账户余额已增加 +- ✅ 流水记录已创建 +- ✅ 订单状态为3 + +### 失败的标志 +- ❌ 日志显示"账户更新结果: 0" +- ❌ 日志显示"余额更新失败" +- ❌ 日志显示"Transaction rolled back" +- ❌ 数据库账户余额未变化 +- ❌ 没有流水记录 + +--- + +## 📝 关键代码位置 + +**充值审批核心逻辑**: `FundService.java` (行 330-380) + +```java +// 充值审批通过时的账户更新逻辑 +if (order.getType() == 1 && status == 2) { + // 1. 计算新余额 + BigDecimal newBalance = fund.getBalance().add(order.getAmount()); + BigDecimal newTotalDeposit = fund.getTotalDeposit().add(order.getAmount()); + + // 2. 使用 LambdaUpdateWrapper 显式更新 + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(AccountFund::getId, fund.getId()) + .set(AccountFund::getBalance, newBalance) // ⭐ 更新余额 + .set(AccountFund::getTotalDeposit, newTotalDeposit) // ⭐ 更新累计充值 + .set(AccountFund::getUpdateTime, LocalDateTime.now()); + + // 3. 执行更新 + int updateResult = accountFundMapper.update(null, wrapper); + + // 4. 验证更新 + AccountFund verifyFund = accountFundMapper.selectById(fund.getId()); + if (!verifyFund.getBalance().equals(newBalance)) { + throw new RuntimeException("余额更新失败"); + } + + // 5. 记录流水 + assetService.createFlow(...); +} +``` + +--- + +**最后更新**: 2026-03-24 13:31 +**服务状态**: ✅ 运行中 +**测试就绪**: ✅ 是 +**下一步**: 执行充值审批测试并查看日志 + +--- + +## 🚀 立即开始测试 + +```bash +# 终端1 - 监控日志 +cd ~/Desktop/projects/monisuo +tail -f logs/app.log | grep --line-buffered -A30 "FundService.approve" + +# 终端2 - 执行测试 +cd ~/Desktop/projects/monisuo +./test_approve.sh +``` + +或者使用前端操作: +1. 登录管理后台 +2. 进入"订单管理" -> "待审批订单" +3. 选择一个充值订单 +4. 点击"审批通过" +5. 查看终端1的日志输出 diff --git a/test_approve.sh b/test_approve.sh new file mode 100755 index 0000000..f2b0288 --- /dev/null +++ b/test_approve.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +BASE_URL="http://localhost:5010" + +echo "================================" +echo "充值审批测试" +echo "================================" + +# 1. 管理员登录 +echo -e "\n步骤1: 管理员登录..." +LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/login" \ + -H "Content-Type: application/json" \ + -d '{"username":"admin","password":"admin123"}') + +echo "登录响应: $LOGIN_RESPONSE" +TOKEN=$(echo $LOGIN_RESPONSE | grep -o '"token":"[^"]*' | cut -d'"' -f4) + +if [ -z "$TOKEN" ]; then + echo "❌ 登录失败" + exit 1 +fi + +echo "✅ 登录成功" +echo "Token: ${TOKEN:0:30}..." + +# 2. 获取待审批订单 +echo -e "\n步骤2: 获取待审批订单..." +PENDING_RESPONSE=$(curl -s "$BASE_URL/admin/order/pending?type=1&status=2" \ + -H "Authorization: Bearer $TOKEN") + +echo "待审批订单:" +echo "$PENDING_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$PENDING_RESPONSE" + +# 提取第一个订单号 +ORDER_NO=$(echo $PENDING_RESPONSE | grep -o '"orderNo":"[^"]*' | head -1 | cut -d'"' -f4) + +if [ -z "$ORDER_NO" ]; then + echo "❌ 没有待审批的充值订单" + echo "请先创建一个充值订单并确认打款" + exit 1 +fi + +echo -e "\n选择的订单号: $ORDER_NO" + +# 3. 查询订单详情(审批前) +echo -e "\n步骤3: 查询订单详情(审批前)..." +ORDER_DETAIL=$(curl -s "$BASE_URL/admin/order/list?orderNo=$ORDER_NO" \ + -H "Authorization: Bearer $TOKEN") + +echo "订单详情:" +echo "$ORDER_DETAIL" | python3 -m json.tool 2>/dev/null || echo "$ORDER_DETAIL" + +USER_ID=$(echo $ORDER_DETAIL | grep -o '"userId":[0-9]*' | head -1 | cut -d':' -f2) +AMOUNT=$(echo $ORDER_DETAIL | grep -o '"amount":[0-9.]*' | head -1 | cut -d':' -f2) + +echo -e "\n用户ID: $USER_ID" +echo "充值金额: $AMOUNT" + +# 4. 执行审批 +echo -e "\n步骤4: 执行审批(通过)..." +echo "查看后端日志(新开终端):" +echo "tail -f ~/Desktop/projects/monisuo/logs/app.log | grep -A30 'FundService.approve'" + +read -p "按回车继续执行审批..." + +APPROVE_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/order/approve" \ + -H "Content-Type: application/json" \ + -H "Authorization: Bearer $TOKEN" \ + -d "{\"orderNo\":\"$ORDER_NO\",\"status\":2,\"adminRemark\":\"测试审批通过\"}") + +echo -e "\n审批响应:" +echo "$APPROVE_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$APPROVE_RESPONSE" + +# 5. 等待事务提交 +echo -e "\n步骤5: 等待事务提交..." +sleep 3 + +# 6. 验证订单状态 +echo -e "\n步骤6: 验证订单状态..." +ORDER_AFTER=$(curl -s "$BASE_URL/admin/order/list?orderNo=$ORDER_NO" \ + -H "Authorization: Bearer $TOKEN") + +ORDER_STATUS=$(echo $ORDER_AFTER | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) +echo "订单状态: $ORDER_STATUS (期望: 3)" + +# 7. 查询用户余额(通过管理后台) +echo -e "\n步骤7: 查询用户资金账户..." +USER_DETAIL=$(curl -s "$BASE_URL/admin/user/detail?userId=$USER_ID" \ + -H "Authorization: Bearer $TOKEN") + +echo "用户详情:" +echo "$USER_DETAIL" | python3 -m json.tool 2>/dev/null || echo "$USER_DETAIL" + +BALANCE=$(echo $USER_DETAIL | grep -o '"balance":[0-9.]*' | head -1 | cut -d':' -f2) +TOTAL_DEPOSIT=$(echo $USER_DETAIL | grep -o '"totalDeposit":[0-9.]*' | head -1 | cut -d':' -f2) + +echo -e "\n================================" +echo "验证结果" +echo "================================" +echo "订单状态: $ORDER_STATUS (期望: 3)" +echo "账户余额: $BALANCE" +echo "累计充值: $TOTAL_DEPOSIT" +echo "充值金额: $AMOUNT" + +if [ "$ORDER_STATUS" == "3" ]; then + echo "✅ 订单状态正确" +else + echo "❌ 订单状态错误" +fi + +echo -e "\n请检查后端日志确认余额是否更新:" +echo "tail -50 ~/Desktop/projects/monisuo/logs/app.log | grep -A20 '充值审批'"