From ea4c21689246751948c12e9d8c35a141555e273b Mon Sep 17 00:00:00 2001 From: sion <450702724@qq.com> Date: Wed, 25 Mar 2026 22:41:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- APPROVAL_BALANCE_FIX_ACTION.md | 105 ------ APPROVAL_COMPREHENSIVE_FIX.md | 330 ------------------- APPROVAL_DEBUG_REPORT.md | 200 ------------ APPROVAL_DIAGNOSTIC_PLAN.md | 156 --------- APPROVAL_FIX_REPORT.md | 325 ------------------ ASSET_API_DIAGNOSIS.md | 259 --------------- COMPLETE_DIAGNOSIS_GUIDE.md | 350 -------------------- DATABASE_SCHEMA.md | 385 ---------------------- DEPLOY_GUIDE.md | 160 --------- DIAGNOSTIC_APPROVAL_FLOW.md | 73 ----- EMERGENCY_BALANCE_FIX.md | 321 ------------------ FILE_LIST.md | 256 --------------- FINAL_APPROVAL_FIX_REPORT.md | 418 ------------------------ FINAL_FIX_SUMMARY.md | 289 ---------------- FINAL_REPORT.md | 203 ------------ FIX_CHECKLIST.md | 102 ------ FIX_SUMMARY.md | 217 ------------ FLUTTER_HEALTH_REPORT.md | 392 ---------------------- PROMPT_APPLY_STYLES.md | 306 ----------------- PROMPT_CLEAN_CODE.md | 242 -------------- PROMPT_THEME_FIX.md | 201 ------------ PUSH_IMPLEMENTATION_GUIDE.md | 411 ----------------------- STACKOVERFLOW_FIX_REPORT.md | 185 ----------- START_HERE.md | 125 ------- TEST_README.md | 167 ---------- check_cold_wallet.md | 216 ------------ check_database.sh | 45 --- check_status.sh | 32 -- deploy/build_local.sh | 2 +- deploy_flutter_web.sh | 50 --- diagnose_approval.sh | 223 ------------- diagnose_db.sh | 72 ---- diagnostic_report.sh | 93 ------ fix_asset_api.sh | 77 ----- fix_orders.sql | 28 -- flutter_monisuo/PROMPT.md | 104 ------ flutter_monisuo/PROMPT_MODERNIZATION.md | 169 ---------- flutter_monisuo/PROMPT_PHASE2.md | 199 ----------- one_click_test.sh | 92 ------ query_fund_accounts.sh | 71 ---- quick_test.sh | 65 ---- summary.sh | 57 ---- test_approval.sh | 110 ------- test_approve.sh | 112 ------- test_approve_fix.sh | 170 ---------- test_approve_order.sh | 129 -------- test_asset_api.sh | 107 ------ test_complete_flow.sh | 234 ------------- test_deposit_api.sh | 113 ------- test_deposit_direct.sh | 46 --- test_fix.sh | 164 ---------- test_flutter_asset.sh | 89 ----- test_fund_flow.sh | 168 ---------- test_fund_flow_report.md | 193 ----------- test_new_approval.sh | 194 ----------- test_wallet_only.sh | 28 -- verify_balance.sh | 187 ----------- verify_database.sh | 169 ---------- 58 files changed, 1 insertion(+), 9985 deletions(-) delete mode 100644 APPROVAL_BALANCE_FIX_ACTION.md delete mode 100644 APPROVAL_COMPREHENSIVE_FIX.md delete mode 100644 APPROVAL_DEBUG_REPORT.md delete mode 100644 APPROVAL_DIAGNOSTIC_PLAN.md delete mode 100644 APPROVAL_FIX_REPORT.md delete mode 100644 ASSET_API_DIAGNOSIS.md delete mode 100644 COMPLETE_DIAGNOSIS_GUIDE.md delete mode 100644 DATABASE_SCHEMA.md delete mode 100644 DEPLOY_GUIDE.md delete mode 100644 DIAGNOSTIC_APPROVAL_FLOW.md delete mode 100644 EMERGENCY_BALANCE_FIX.md delete mode 100644 FILE_LIST.md delete mode 100644 FINAL_APPROVAL_FIX_REPORT.md delete mode 100644 FINAL_FIX_SUMMARY.md delete mode 100644 FINAL_REPORT.md delete mode 100644 FIX_CHECKLIST.md delete mode 100644 FIX_SUMMARY.md delete mode 100644 FLUTTER_HEALTH_REPORT.md delete mode 100644 PROMPT_APPLY_STYLES.md delete mode 100644 PROMPT_CLEAN_CODE.md delete mode 100644 PROMPT_THEME_FIX.md delete mode 100644 PUSH_IMPLEMENTATION_GUIDE.md delete mode 100644 STACKOVERFLOW_FIX_REPORT.md delete mode 100644 START_HERE.md delete mode 100644 TEST_README.md delete mode 100644 check_cold_wallet.md delete mode 100755 check_database.sh delete mode 100755 check_status.sh delete mode 100755 deploy_flutter_web.sh delete mode 100755 diagnose_approval.sh delete mode 100755 diagnose_db.sh delete mode 100755 diagnostic_report.sh delete mode 100755 fix_asset_api.sh delete mode 100644 fix_orders.sql delete mode 100644 flutter_monisuo/PROMPT.md delete mode 100644 flutter_monisuo/PROMPT_MODERNIZATION.md delete mode 100644 flutter_monisuo/PROMPT_PHASE2.md delete mode 100755 one_click_test.sh delete mode 100755 query_fund_accounts.sh delete mode 100755 quick_test.sh delete mode 100755 summary.sh delete mode 100755 test_approval.sh delete mode 100755 test_approve.sh delete mode 100755 test_approve_fix.sh delete mode 100755 test_approve_order.sh delete mode 100755 test_asset_api.sh delete mode 100755 test_complete_flow.sh delete mode 100755 test_deposit_api.sh delete mode 100755 test_deposit_direct.sh delete mode 100755 test_fix.sh delete mode 100755 test_flutter_asset.sh delete mode 100755 test_fund_flow.sh delete mode 100644 test_fund_flow_report.md delete mode 100755 test_new_approval.sh delete mode 100755 test_wallet_only.sh delete mode 100755 verify_balance.sh delete mode 100755 verify_database.sh diff --git a/APPROVAL_BALANCE_FIX_ACTION.md b/APPROVAL_BALANCE_FIX_ACTION.md deleted file mode 100644 index 27d4cb7..0000000 --- a/APPROVAL_BALANCE_FIX_ACTION.md +++ /dev/null @@ -1,105 +0,0 @@ -# 充值审批余额不更新 - 磰急修复方案 - -## ⚠️ 问题紧急程度: HIGH -用户反馈订单状态已更新,但余额未增加! -## 🎯 磁急修复步骤 -### 步骤 1: 重启后端服务(最关键!) -```bash -# 埥找并停止旧进程 -ps aux | grep monisuo -pkill -f monisuo-1.0.jar -# 重新启动 -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar --server.port=5010 -# 实时查看日志 -tail -f logs/spring.log | grep -A20 "FundService.approve" -``` -### 步骤 2: 查看关键日志 -审批时应该看到: -``` -[FundService.approve] 步骤1: 查询订单... - - 订单ID: 123 - - 订单类型: 充值 - - 当前状态: 2 -[FundService.approve] 步骤2: 查询资金账户... - - 账户ID: 456 - - 余额: 100.00000000 <-- 这是旧余额 -[FundService.approve] 步骤4: 处理充值通过... - - 审批前余额: 100.00000000 - - 准备更新账户余额: 200.00000000 - - 执行 SQL UPDATE (使用 LambdaUpdateWrapper)... - - 账户更新结果: 1 (1=成功, 0=失败) - - 验证更新后余额: 200.00000000 <-- 确认更新成功! -[FundService.approve] 创建资金流水记录... - - 流水记录创建成功 -[充值审批成功] 订单号: xxx, 用户ID: yyy, 充值金额: 100 USDT -``` -### 步骤 3: 数据库验证 -```sql --- 1. 查询订单状态 -SELECT order_no, status, approve_time FROM order_fund WHERE order_no = '订单号'; --- 2. 查询账户余额(关键!) -SELECT user_id, balance, total_deposit, update_time -FROM account_fund -WHERE user_id = 用户ID; --- 3. 查询流水记录 -SELECT * FROM account_flow -WHERE related_order_no = '订单号' -ORDER BY create_time DESC; -``` -## 🔧 如果重启后问题依然存在 -### 修复方案 A: 强制刷新 MyBatis 缓存 -在 approve 方法开始添加: -```java -// 清除可能的缓存 -sqlSession.clearCache(); -``` -### 修复方案 B: 添加最终验证 -在 approve 方法最后添加 -```java -// 最终验证 -AccountFund finalCheck = accountFundMapper.selectById(fund.getId()); -System.out.println("[最终检查] 数据库中的实际余额: " + finalCheck.getBalance()); -if (!finalCheck.getBalance().equals(newBalance)) { - System.err.println("[严重错误] 余额更新失败! 期望: " + newBalance + ", 实际: " + finalCheck.getBalance()); - throw new RuntimeException("余额更新失败,请联系管理员"); -} -``` -### 修复方案 C: 检查是否有异常被吞掉 -检查 GlobalExceptionHandler 是否捕获了异常 -## 📊 风险评估 -- **风险等级**: 中等 -- **影响范围**: 充值功能不可用 -- **修复时间**: 5-10分钟(重启服务) -- **回滚风险**: 低(只是重启服务) -## 🚀 执行命令 -```bash -# 1. 重启服务 -cd ~/Desktop/projects/monisuo -pkill -f monisuo-1.0.jar -nohup java -jar target/monisuo-1.0.jar > logs/spring.log 2>&1 & -# 2. 查看日志 -tail -f logs/spring.log | grep --line-buffer -A30 "FundService.approve" -# 3. 测试审批 -# 使用前端或 curl 测试 -# 4. 查看日志输出 -grep -A50 "充值审批成功" logs/spring.log -``` -## ✅ 成功标志 -看到以下日志说明修复成功: -``` -✅ 账户更新结果: 1 -✅ 验证更新后余额: xxx (新余额) -✅ 最终检查] 数据库中的实际余额: xxx (新余额) -✅ 充值审批成功 -``` -## ❌ 失败标志 -``` -❌ 账户更新结果: 0 -❌ 余额更新失败 -❌ Transaction rolled back -``` ---- -**最后更新**: 2026-03-24 09:55 -**状态**: 等待重启服务并测试 -**预期修复时间**: 5-10分钟 diff --git a/APPROVAL_COMPREHENSIVE_FIX.md b/APPROVAL_COMPREHENSIVE_FIX.md deleted file mode 100644 index ba4671f..0000000 --- a/APPROVAL_COMPREHENSIVE_FIX.md +++ /dev/null @@ -1,330 +0,0 @@ -# 订单审批状态不更新 - 完整诊断和修复报告 - -**诊断时间**: 2026-03-24 09:30 -**问题状态**: 🔍 完整诊断完成 -**修复状态**: ✅ 已应用多项修复 - ---- - -## 🎯 问题描述 - -**用户反馈**: 管理员审批通过后,订单状态仍然没有变化 -**已修复**: MetaObjectHandler 已添加,但问题依然存在 -**当前状态**: 需要系统性诊断和修复 - ---- - -## 🔍 已完成的诊断和修复 - -### 1. ✅ MetaObjectHandler 已添加 -**文件**: `src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java` -**状态**: 已创建并配置 -**作用**: 自动填充 `createTime` 和 `updateTime` 字段 - -### 2. ✅ MyBatis Plus 配置已完善 -**文件**: `src/main/resources/application-dev.yml` -**新增配置**: -```yaml -mybatis-plus: - global-config: - db-config: - id-type: auto - update-strategy: not_null - insert-strategy: not_null -``` - -### 3. ✅ 详细日志配置已添加 -**文件**: `src/main/resources/application-dev.yml` -**新增配置**: -```yaml -logging: - level: - com.it.rattan.monisuo: DEBUG - com.it.rattan.monisuo.mapper: DEBUG - org.springframework.jdbc: DEBUG - org.springframework.transaction: DEBUG - org.mybatis: DEBUG -``` - -### 4. ✅ FundService.approve() 已优化 -**状态**: 已使用 LambdaUpdateWrapper 显式更新 -**特点**: -- 详细的日志输出 -- 使用 LambdaUpdateWrapper 强制更新所有字段 -- 更新后立即验证 -- 完整的错误处理 - -### 5. ✅ 前端 vconsole 已添加 -**文件**: `monisuo-admin/src/main.ts` -**状态**: 已添加 vconsole 支持 -**效果**: 开发环境下可以查看控制台日志 - ---- - -## 🔬 可能的根本原因分析 - -### 假设 1: 事务未正确提交 ⭐⭐⭐⭐⭐ -**可能性**: 非常高 -**原因**: -- Spring Boot 的自动事务配置可能不完整 -- 主应用类缺少 `@EnableTransactionManagement` 注解 -- 事务可能在某些情况下回滚 - -**验证方法**: -```bash -# 查看日志中的事务相关信息 -grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log -``` - -**修复方案**: -```java -@SpringBootApplication -@EnableTransactionManagement -public class SpcCloudApplication { - // ... -} -``` - -### 假设 2: 数据库连接或权限问题 ⭐⭐⭐⭐ -**可能性**: 高 -**原因**: -- 数据库用户权限不足 -- 连接池配置问题 -- 数据库触发器干扰 - -**验证方法**: -```sql --- 直接查询数据库验证 -SELECT id, order_no, status, approve_admin_id, approve_time, update_time -FROM order_fund -WHERE order_no = 'F20260324001343000000'; -``` - -### 假设 3: MyBatis Plus 更新策略问题 ⭐⭐⭐ -**可能性**: 中等 -**原因**: -- `update-strategy: not_null` 可能导致某些字段不更新 -- 字段值为 null 时被跳过 - -**已修复**: 已使用 LambdaUpdateWrapper.set() 显式设置所有字段 - -### 假设 4: 前端调用参数错误 ⭐⭐ -**可能性**: 低 -**原因**: -- 前端传递的 status 值不正确 -- 参数格式问题 - -**验证方法**: 使用 vconsole 查看前端发送的请求 - ---- - -## 🛠️ 推荐的修复步骤 - -### 步骤 1: 添加显式事务管理 -**修改文件**: `src/main/java/com/it/rattan/SpcCloudApplication.java` - -```java -package com.it.rattan; - -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.servlet.ServletComponentScan; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.transaction.annotation.EnableTransactionManagement; // 新增 - -@SpringBootApplication -@ServletComponentScan(basePackages ={"com.it.rattan"}) -@ComponentScan(basePackages ={"com.it.rattan"}) -@EnableTransactionManagement // 新增 -public class SpcCloudApplication { - public static void main(String[] args) { - SpringApplication.run(SpcCloudApplication.class, args); - } -} -``` - -### 步骤 2: 本地测试验证 -```bash -# 编译 -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests - -# 停止旧服务 -pkill -f "monisuo-1.0.jar" - -# 启动新服务(带详细日志) -java -jar target/monisuo-1.0.jar --server.port=5010 - -# 查看日志 -tail -f logs/app.log | grep -A20 "FundService.approve" -``` - -### 步骤 3: 执行测试脚本 -```bash -# 运行自动化测试 -./test_approval.sh -``` - -### 步骤 4: 检查日志输出 -**关键日志标识**: -``` -[FundService.approve] 步骤1: 查询订单... -[FundService.approve] 步骤2: 查询资金账户... -[FundService.approve] 步骤3: 确定最终状态... -[FundService.approve] 步骤4: 处理审批通过逻辑... -[FundService.approve] 步骤5: 更新订单状态... - - 订单更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤6: 验证更新结果... - - 验证查询结果: ID=xxx, 状态=3 - - 状态验证通过 ✓ -``` - -**异常日志标识**: -``` -❌ 订单更新失败! updateById返回: 0 -❌ 状态验证失败! 期望状态: 3, 实际状态: 2 -❌ Transaction rolled back -``` - ---- - -## 📊 测试验证清单 - -### 本地测试 -- [ ] 编译成功 (`mvn clean package -DskipTests`) -- [ ] 服务启动成功 -- [ ] 管理员登录成功 -- [ ] 获取待审批订单成功 -- [ ] 执行审批操作成功 -- [ ] 日志显示"状态验证通过 ✓" -- [ ] 数据库中订单状态已更新 -- [ ] 用户余额/冻结已更新 - -### 生产测试 -- [ ] 部署到生产环境 -- [ ] 执行真实审批操作 -- [ ] 验证订单状态变化 -- [ ] 验证资金账户变化 -- [ ] 检查日志无异常 - ---- - -## 🚀 部署指令 - -### 本地环境 -```bash -# 编译 -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests - -# 停止旧服务 -pkill -f "monisuo-1.0.jar" - -# 启动新服务 -nohup java -jar target/monisuo-1.0.jar > logs/app.log 2>&1 & - -# 查看日志 -tail -f logs/app.log -``` - -### 生产环境 -```bash -# 1. 上传 jar 包 -scp target/monisuo-1.0.jar root@8.155.172.147:/path/to/monisuo/ - -# 2. SSH 登录 -ssh root@8.155.172.147 - -# 3. 备份旧版本 -cp /path/to/monisuo/monisuo-1.0.jar /path/to/monisuo/monisuo-1.0.jar.backup - -# 4. 替换新版本 -mv /path/to/monisuo/monisuo-1.0.jar.new /path/to/monisuo/monisuo-1.0.jar - -# 5. 重启服务 -systemctl restart monisuo -# 或 -pkill -f "monisuo-1.0.jar" -nohup java -jar /path/to/monisuo/monisuo-1.0.jar > /var/log/monisuo/app.log 2>&1 & - -# 6. 查看日志 -tail -f /var/log/monisuo/app.log -``` - ---- - -## 🔧 前端 vconsole 使用说明 - -### 如何启用 -**文件**: `monisuo-admin/src/main.ts` -**状态**: 已配置,开发环境自动启用 - -### 使用方法 -1. 启动前端开发服务器: `cd monisuo-admin && pnpm dev` -2. 打开浏览器访问: `http://localhost:5173` -3. 点击右下角的绿色 "+" 按钮 -4. 查看 Console 标签页中的日志 - -### 可以查看的内容 -- 所有 API 请求和响应 -- Console 日志输出 -- Network 请求详情 -- Element 元素信息 -- Storage 存储数据 - ---- - -## 📝 修改文件清单 - -### 后端修改 -1. ✅ **新增**: `MyBatisPlusMetaObjectHandler.java` - 自动填充处理器 -2. ✅ **修改**: `application-dev.yml` - MyBatis Plus 配置 -3. ✅ **修改**: `application-dev.yml` - 日志配置 -4. ⏳ **待修改**: `SpcCloudApplication.java` - 添加 @EnableTransactionManagement -5. ✅ **新增**: `test_approval.sh` - 自动化测试脚本 - -### 前端修改 -1. ✅ **新增依赖**: `vconsole` - 移动端调试工具 -2. ✅ **修改**: `main.ts` - 集成 vconsole - ---- - -## ⚠️ 重要提示 - -### 如果问题依然存在 - -**请提供以下信息**: - -1. **完整的审批日志** -```bash -grep -A30 "FundService.approve" /var/log/monisuo/app.log -``` - -2. **数据库查询结果** -```sql -SELECT * FROM order_fund WHERE order_no='订单号' ORDER BY update_time DESC LIMIT 1; -``` - -3. **事务日志** -```bash -grep -i "transaction\|rollback\|commit" /var/log/monisuo/app.log | tail -20 -``` - -4. **SQL 执行日志** -```bash -grep "UPDATE order_fund" /var/log/monisuo/app.log | tail -5 -``` - -### 临时解决方案 - -如果事务问题无法立即解决,可以尝试: -1. 在 approve 方法上添加 `@Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRED)` -2. 使用编程式事务管理 -3. 在 Controller 层添加 `@Transactional` 注解 - ---- - -**最后更新**: 2026-03-24 09:30 -**状态**: ✅ 诊断完成,待添加 @EnableTransactionManagement -**下一步**: 修改主应用类并测试 diff --git a/APPROVAL_DEBUG_REPORT.md b/APPROVAL_DEBUG_REPORT.md deleted file mode 100644 index a90570d..0000000 --- a/APPROVAL_DEBUG_REPORT.md +++ /dev/null @@ -1,200 +0,0 @@ -# 审批订单问题排查报告 - -## 问题描述 -管理员审批充值订单后: -1. ❌ 订单状态完全没有变化 -2. ❌ 用户资金账户余额没有增加 - -## 已完成的修复 - -### 1. 添加详细的调试日志 - -#### AdminController.java -在 `approveOrder()` 方法中添加了详细日志: -- ✅ 接收到的完整参数 -- ✅ 参数解析结果 -- ✅ 参数校验结果 -- ✅ FundService 调用前后日志 -- ✅ 异常捕获和打印 - -#### FundService.java -在 `approve()` 方法中添加了详细日志: -- ✅ 步骤1: 查询订单(包含订单详细信息) -- ✅ 步骤2: 查询资金账户(包含账户详细信息) -- ✅ 步骤3: 确定最终状态 -- ✅ 步骤4: 处理审批逻辑(充值/提现,通过/驳回) -- ✅ 步骤5: 更新订单状态 -- ✅ 步骤6: 验证更新结果 -- ✅ 每个数据库操作的返回值 - -### 2. 日志输出示例 - -审批通过时,控制台会输出类似以下日志: - -``` -==================== 审批订单开始 ==================== -[AdminController] 接收到的完整参数: {orderNo=xxx, status=2, ...} -[AdminController] 解析后的参数: - - orderNo: xxx - - status: 2 - - rejectReason: null - - adminRemark: 测试审批 -[AdminController] 开始调用 fundService.approve()... - -[FundService.approve] 开始处理审批 -[FundService.approve] 参数: orderNo=xxx, status=2, adminId=1, adminName=管理员 -[FundService.approve] 步骤1: 查询订单... -[FundService.approve] 订单查询成功: - - 订单ID: 123 - - 订单号: xxx - - 用户ID: 456 - - 用户名: testuser - - 订单类型: 充值 - - 当前状态: 2 - - 金额: 100.00 -[FundService.approve] 步骤2: 查询资金账户... -[FundService.approve] 资金账户查询成功: - - 账户ID: 789 - - 用户ID: 456 - - 余额: 500.00 - - 冻结: 0.00 -[FundService.approve] 步骤3: 确定最终状态: 3 (审批通过) -[FundService.approve] 步骤4: 处理审批通过逻辑... -[FundService.approve] 处理充值通过... - - 审批前余额: 500.00 - - 准备更新账户余额: 600.00 - - 账户更新结果: 1 (1=成功, 0=失败) - - 审批后余额: 600.00 -[FundService.approve] 创建资金流水记录... - - 流水记录创建成功 -[充值审批成功] 订单号: xxx, 用户ID: 456, 充值金额: 100.00 USDT -[FundService.approve] 步骤5: 更新订单状态... - - 当前状态: 2 - - 目标状态: 3 - - 准备执行数据库更新... - - 订单更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤6: 验证更新结果... - - 验证查询结果: ID=123, 状态=3 - - 状态验证通过 ✓ -[审批完成] 订单号: xxx, 订单类型: 充值, 审批结果: 通过, 最终状态: 3, 审批人: 管理员 -[FundService.approve] 处理完成 -==================== 审批订单结束 ==================== -``` - -## 测试步骤 - -### 1. 重新编译项目 -```bash -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests -``` - -### 2. 重启后端服务 -```bash -# 停止旧服务(如果正在运行) -# kill -9 $(ps aux | grep monisuo-1.0.jar | grep -v grep | awk '{print $2}') - -# 启动新服务(确保能看到控制台日志) -java -jar target/monisuo-1.0.jar -``` - -### 3. 运行测试脚本 - -#### 快速测试 -```bash -./quick_test.sh -``` - -#### 完整测试 -```bash -./test_approve_order.sh -``` - -### 4. 检查日志输出 - -在运行测试脚本时,观察后端控制台的日志输出,查看: -- ✅ 参数是否正确接收 -- ✅ 订单是否成功查询 -- ✅ 资金账户是否成功查询 -- ✅ 数据库更新操作的返回值(应该是1) -- ✅ 验证查询的结果 - -## 可能的问题和解决方案 - -### 问题1: 日志没有输出 -**原因**: System.out.println 可能被重定向或过滤 -**解决**: 检查日志配置,或者查看应用日志文件 - -### 问题2: updateById 返回 0 -**原因**: -- 数据库连接失败 -- 订单ID不存在 -- 乐观锁冲突 - -**解决**: -- 检查数据库连接配置 -- 查看详细日志中的订单ID -- 检查是否有并发更新 - -### 问题3: 状态更新了但前端没刷新 -**原因**: 前端缓存问题 -**解决**: -- 前端已经配置了 queryClient.invalidateQueries() -- 检查前端网络请求是否成功 -- 手动刷新页面 - -### 问题4: 事务未提交 -**原因**: @Transactional 注解配置问题 -**解决**: -- 检查 Spring 事务管理器配置 -- 查看是否有异常导致事务回滚 -- 检查数据库连接池配置 - -## 数据库验证 - -### 1. 查询订单状态 -```sql -SELECT id, order_no, user_id, type, status, amount, - approve_admin_id, approve_time, admin_remark -FROM order_fund -WHERE order_no = '订单号'; -``` - -### 2. 查询用户资金账户 -```sql -SELECT id, user_id, balance, frozen, total_deposit, total_withdraw -FROM account_fund -WHERE user_id = 用户ID; -``` - -### 3. 查询资金流水 -```sql -SELECT * FROM account_flow -WHERE user_id = 用户ID -ORDER BY create_time DESC -LIMIT 10; -``` - -## 状态映射规则 - -### 充值订单 -- 前端传 `status=2` (通过) → 后端最终状态 `3` (已完成) -- 前端传 `status=3` (驳回) → 后端最终状态 `4` (已驳回) - -### 提现订单 -- 前端传 `status=2` (通过) → 后端最终状态 `2` (已完成) -- 前端传 `status=3` (驳回) → 后端最终状态 `3` (已驳回) - -## 下一步 - -1. **运行测试**: 执行 `./quick_test.sh` 并观察日志 -2. **检查数据库**: 使用 SQL 验证数据是否真的更新 -3. **查看前端**: 检查前端是否正确显示最新状态 -4. **报告结果**: 将测试结果和日志输出发送给开发者 - -## 联系信息 - -如有问题,请提供: -- 测试脚本的输出 -- 后端控制台的完整日志 -- 数据库查询结果 diff --git a/APPROVAL_DIAGNOSTIC_PLAN.md b/APPROVAL_DIAGNOSTIC_PLAN.md deleted file mode 100644 index 0ffbde6..0000000 --- a/APPROVAL_DIAGNOSTIC_PLAN.md +++ /dev/null @@ -1,156 +0,0 @@ -# 订单审批状态不更新 - 系统性诊断计划 - -**诊断时间**: 2026-03-24 09:20 -**问题状态**: 🔍 深度诊断中 - ---- - -## 🎯 问题描述 - -**现象**: 管理员审批通过后,订单状态仍然没有变化 -**已修复**: MetaObjectHandler 已添加,但问题依然存在 -**需要**: 系统性检查整个审批流程的每个环节 - ---- - -## 🔍 诊断清单 - -### 1. Controller 层检查 -- [ ] AdminController.approveOrder() 参数接收是否正确 -- [ ] 返回值是否正确 -- [ ] 是否有异常被捕获但未正确处理 - -### 2. Service 层检查 -- [ ] FundService.approve() 方法事务是否正常 -- [ ] updateById() 是否真的执行成功 -- [ ] 是否有多个数据源或事务冲突 -- [ ] 异常处理是否正确 - -### 3. Mapper 层检查 -- [ ] OrderFundMapper 的 SQL 是否正确生成 -- [ ] 是否有自定义的 XML 映射覆盖默认行为 -- [ ] 字段映射是否正确 - -### 4. 实体类检查 -- [ ] OrderFund 的字段映射是否正确 -- [ ] 是否有字段被 @TableField(select=false) 忽略 -- [ ] status 字段是否在更新策略中 - -### 5. 数据库检查 -- [ ] update_time 字段是否存在 -- [ ] 字段类型是否匹配 -- [ ] 是否有触发器或存储过程干扰 - -### 6. 事务配置检查 -- [ ] 主应用类是否需要 @EnableTransactionManagement -- [ ] 事务传播行为是否正确 -- [ ] 是否有嵌套事务问题 - ---- - -## 🛠️ 修复策略 - -### 策略 A: 添加事务显式配置 -```java -@SpringBootApplication -@EnableTransactionManagement -public class SpcCloudApplication { - // ... -} -``` - -### 策略 B: 修改 approve 方法,使用显式更新 -```java -@Transactional(rollbackFor = Exception.class) -public void approve(...) { - // 使用 LambdaUpdateWrapper 显式更新 - LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); - wrapper.eq(OrderFund::getId, order.getId()) - .set(OrderFund::getStatus, finalStatus) - .set(OrderFund::getApproveAdminId, adminId) - // ... 其他字段 - orderFundMapper.update(null, wrapper); -} -``` - -### 策略 C: 添加数据库级别的调试日志 -```yaml -logging: - level: - com.it.rattan.monisuo.mapper: DEBUG - org.springframework.transaction: DEBUG -``` - -### 策略 D: 验证数据库更新 -在 approve 方法中添加: -```java -// 更新后立即查询验证 -OrderFund updated = orderFundMapper.selectById(order.getId()); -System.out.println("更新后状态: " + updated.getStatus()); -``` - ---- - -## 📝 执行步骤 - -### 步骤 1: 添加调试日志配置 -文件: `application-dev.yml` -```yaml -logging: - level: - com.it.rattan.monisuo: DEBUG - com.it.rattan.monisuo.mapper: DEBUG - org.springframework.jdbc: DEBUG - org.springframework.transaction: DEBUG - org.mybatis: DEBUG -``` - -### 步骤 2: 修改 approve 方法 -- 添加更详细的日志 -- 使用 LambdaUpdateWrapper 显式更新 -- 添加更新后验证 - -### 步骤 3: 测试验证 -- 本地启动服务 -- 执行审批操作 -- 查看完整日志链路 -- 验证数据库状态 - ---- - -## 🔬 可能的根本原因 - -### 假设 1: 事务未提交 -**原因**: Spring Boot 自动配置的事务管理可能因为某些原因未生效 -**验证**: 查看事务日志,检查是否真的提交 -**修复**: 显式添加 @EnableTransactionManagement - -### 假设 2: updateById() 更新了但条件不匹配 -**原因**: MyBatis Plus 的 updateById 可能因为字段为 null 而跳过更新 -**验证**: 查看 SQL 日志,确认 UPDATE 语句 -**修复**: 使用 LambdaUpdateWrapper 显式设置所有字段 - -### 假设 3: 缓存或连接池问题 -**原因**: 数据库连接池或 MyBatis 缓存导致读取到旧数据 -**验证**: 直接查询数据库验证 -**修复**: 清除缓存或禁用缓存 - -### 假设 4: 字段类型不匹配 -**原因**: Java 的 Integer 和数据库的 tinyint 类型转换问题 -**验证**: 查看实体类字段类型和数据库字段类型 -**修复**: 确保类型一致 - ---- - -## ✅ 下一步行动 - -1. **立即执行**: 添加完整的调试日志配置 -2. **修改代码**: 使用 LambdaUpdateWrapper 显式更新 -3. **本地测试**: 启动服务并执行完整测试 -4. **分析日志**: 查看完整的 SQL 执行链路 -5. **修复问题**: 根据日志分析结果修复根本原因 - ---- - -**预计完成时间**: 30 分钟 -**风险评估**: 中等(可能涉及事务配置) diff --git a/APPROVAL_FIX_REPORT.md b/APPROVAL_FIX_REPORT.md deleted file mode 100644 index 7ed0dd6..0000000 --- a/APPROVAL_FIX_REPORT.md +++ /dev/null @@ -1,325 +0,0 @@ -# 订单审批状态不更新问题修复报告 - -**修复时间**: 2026-03-24 08:20 -**修复状态**: ✅ 完成 -**测试状态**: ⏳ 待部署测试 - ---- - -## 🎯 问题诊断 - -### 问题现象 -管理员审批通过后,订单状态没有变化。 - -### 根本原因 -1. **缺少 MetaObjectHandler** - 实体类使用了 `@TableField(fill = FieldFill.INSERT_UPDATE)` 注解,但没有对应的处理器来自动填充时间字段 -2. **MyBatis Plus 配置不完整** - 缺少必要的全局配置,导致字段更新策略不明确 - -### 影响范围 -- 所有订单审批操作(充值审批、提现审批) -- 数据库更新操作可能失败或不完整 - ---- - -## 🛠️ 修复方案 - -### 1. 新增 MetaObjectHandler 处理器 - -**文件**: `src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java` - -```java -package com.it.rattan.monisuo.config; - -import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; -import org.apache.ibatis.reflection.MetaObject; -import org.springframework.stereotype.Component; -import java.time.LocalDateTime; - -/** - * MyBatis Plus 自动填充处理器 - * 自动填充 createTime 和 updateTime 字段 - */ -@Component -public class MyBatisPlusMetaObjectHandler implements MetaObjectHandler { - - /** - * 插入时自动填充 - */ - @Override - public void insertFill(MetaObject metaObject) { - System.out.println("[MetaObjectHandler] 执行插入自动填充..."); - setFieldValByName("createTime", LocalDateTime.now(), metaObject); - setFieldValByName("updateTime", LocalDateTime.now(), metaObject); - } - - /** - * 更新时自动填充 - */ - @Override - public void updateFill(MetaObject metaObject) { - System.out.println("[MetaObjectHandler] 执行更新自动填充..."); - setFieldValByName("updateTime", LocalDateTime.now(), metaObject); - } -} -``` - -**作用**: -- 插入数据时自动填充 `createTime` 和 `updateTime` -- 更新数据时自动填充 `updateTime` -- 避免手动设置时间字段可能导致的冲突 - ---- - -### 2. 完善 MyBatis Plus 配置 - -**文件**: `src/main/resources/application-dev.yml` - -**新增配置**: -```yaml -mybatis-plus: - mapper-locations: classpath*:com/it/rattan/monisuo/mapper/*.xml - global-config: - db-config: - # 主键类型 AUTO-自增 - id-type: auto - # 字段策略 NOT_NULL-非null判断 - update-strategy: not_null - insert-strategy: not_null - # 关闭 MP3.0 的 banner - banner: false - configuration: - # 开启驼峰命名转换 - map-underscore-to-camel-case: true - # 打印 SQL 日志(开发环境) - log-impl: org.apache.ibatis.logging.stdout.StdOutImpl -``` - -**关键配置说明**: -- `id-type: auto` - 主键自增策略 -- `update-strategy: not_null` - 更新时只更新非 null 字段 -- `insert-strategy: not_null` - 插入时只插入非 null 字段 -- `log-impl: StdOutImpl` - 开启 SQL 日志输出,方便调试 - ---- - -## ✅ 修复后的效果 - -### 1. 自动填充机制 -- ✅ 插入订单时自动填充 `createTime` 和 `updateTime` -- ✅ 更新订单时自动填充 `updateTime` -- ✅ 无需手动设置时间字段 - -### 2. 审批流程日志输出 -审批订单时会看到以下日志: -``` -[MetaObjectHandler] 执行更新自动填充... -[FundService.approve] 步骤5: 更新订单状态... - - 当前状态: 2 - - 目标状态: 3 - - 准备执行数据库更新... - - 订单更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤6: 验证更新结果... - - 验证查询结果: ID=123, 状态=3 - - 状态验证通过 ✓ -``` - -### 3. SQL 日志输出 -开启 SQL 日志后,可以看到实际的更新语句: -```sql -UPDATE order_fund -SET status=3, - approve_admin_id=1, - approve_admin_name='管理员', - approve_time='2026-03-24 08:20:00', - admin_remark='审批通过', - update_time='2026-03-24 08:20:00' -WHERE id=123 -``` - ---- - -## 📦 部署步骤 - -### 本地测试 -```bash -# 1. 编译项目 -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests - -# 2. 停止旧服务 -pkill -f "monisuo-1.0.jar" - -# 3. 启动新服务 -java -jar target/monisuo-1.0.jar --server.port=5010 - -# 4. 查看日志 -tail -f logs/app.log -``` - -### 生产环境部署 -```bash -# 1. 上传 jar 包到服务器 -scp target/monisuo-1.0.jar root@8.155.172.147:/path/to/monisuo/ - -# 2. SSH 登录服务器 -ssh root@8.155.172.147 - -# 3. 停止旧服务 -systemctl stop monisuo -# 或 -pkill -f "monisuo-1.0.jar" - -# 4. 启动新服务 -systemctl start monisuo -# 或 -nohup java -jar /path/to/monisuo/monisuo-1.0.jar > /var/log/monisuo/app.log 2>&1 & - -# 5. 查看日志 -tail -f /var/log/monisuo/app.log -``` - ---- - -## 🧪 测试验证 - -### 测试步骤 - -1. **登录管理后台** -```bash -curl -X POST http://localhost:5010/admin/login \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}' -``` - -2. **获取待审批订单** -```bash -curl http://localhost:5010/admin/order/pending \ - -H "Authorization: Bearer " -``` - -3. **审批订单** -```bash -# 充值审批通过 -curl -X POST http://localhost:5010/admin/order/approve \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer " \ - -d '{"orderNo":"F20260324001343000000","status":2,"adminRemark":"审批通过"}' - -# 提现审批通过 -curl -X POST http://localhost:5010/admin/order/approve \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer " \ - -d '{"orderNo":"F20260324001343000001","status":2,"adminRemark":"审批通过"}' -``` - -4. **验证订单状态** -```bash -curl http://localhost:5010/admin/order/list \ - -H "Authorization: Bearer " -``` - -### 预期结果 -- ✅ 充值订单审批通过后,状态从 `2(待确认)` 变为 `3(已完成)` -- ✅ 提现订单审批通过后,状态从 `1(待审批)` 变为 `2(已完成)` -- ✅ 日志中显示 `[MetaObjectHandler] 执行更新自动填充...` -- ✅ 日志中显示 `订单更新结果: 1 (1=成功, 0=失败)` -- ✅ 日志中显示 `状态验证通过 ✓` - ---- - -## 📝 修改文件清单 - -1. ✅ **新增**: `src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java` - - 自动填充处理器 - -2. ✅ **修改**: `src/main/resources/application-dev.yml` - - 完善MyBatis Plus 配置 - - 添加全局配置 - - 开启 SQL 日志 - ---- - -## 🔍 问题总结 - -### 为什么会出现这个问题? - -1. **Lombok + MyBatis Plus 的陷阱** - - 实体类使用了 `@TableField(fill = FieldFill.INSERT_UPDATE)` 注解 - - 但没有配置 `MetaObjectHandler` 来处理自动填充 - - 导致更新时 `updateTime` 字段可能为 null,影响整个更新操作 - -2. **配置不完整** - - MyBatis Plus 缺少全局配置 - - 字段更新策略不明确 - - 没有开启 SQL 日志,难以调试 - -### 最佳实践 - -1. ✅ **配置 MetaObjectHandler** - - 使用 `@TableField(fill = ...)` 注解时,必须配置对应的处理器 - - 避免手动设置时间字段 - -2. ✅ **完善 MyBatis Plus 配置** - - 明确主键策略 - - 明确字段更新策略 - - 开发环境开启 SQL 日志 - -3. ✅ **添加详细日志** - - 关键操作添加日志输出 - - 验证更新结果 - - 方便问题排查 - ---- - -## 🚀 下一步建议 - -### 短期优化 -1. ✅ 部署并测试修复 -2. ⏳ 监控审批功能是否正常 -3. ⏳ 检查日志输出是否符合预期 - -### 长期优化 -1. ⏳ 添加单元测试 -2. ⏳ 添加集成测试 -3. ⏳ 完善监控告警 -4. ⏳ 优化日志输出格式 - ---- - -**修复完成时间**: 2026-03-24 08:20 -**修复状态**: ✅ 代码已修复,待部署测试 -**信心度**: ⭐⭐⭐⭐⭐ (5/5) - ---- - -## 附录:审批流程说明 - -### 充值订单审批流程 -``` -用户申请充值 (status=1 待付款) - ↓ -用户确认打款 (status=2 待确认) - ↓ -管理员审批 - ├─ 通过 → status=3 (已完成) + 增加余额 - └─ 驳回 → status=4 (已驳回) -``` - -### 提现订单审批流程 -``` -用户申请提现 (status=1 待审批) + 冻结余额 - ↓ -管理员审批 - ├─ 通过 → status=2 (已完成) + 扣除冻结 - └─ 驳回 → status=3 (已驳回) + 解冻退还 -``` - -### 审批接口参数说明 -```json -{ - "orderNo": "订单号", - "status": "审批结果:2=通过, 3=驳回", - "rejectReason": "驳回原因(驳回时必填)", - "adminRemark": "管理员备注(可选)" -} -``` diff --git a/ASSET_API_DIAGNOSIS.md b/ASSET_API_DIAGNOSIS.md deleted file mode 100644 index 1e763f2..0000000 --- a/ASSET_API_DIAGNOSIS.md +++ /dev/null @@ -1,259 +0,0 @@ -# Flutter资产页面API接口问题诊断报告 - -**诊断时间**: 2026-03-24 13:55 -**问题状态**: ✅ 已定位 -**影响**: Flutter前端资产页面无法正确显示数据 - ---- - -## 🔍 问题诊断 - -### Flutter前端期望的API返回格式 - -**接口**: `/api/asset/overview` - -**期望字段**: -```json -{ - "totalAsset": "15500.00", // 总资产 - "fundBalance": "15500.00", // 资金账户余额 - "tradeBalance": "0.00", // 交易账户余额 - "totalProfit": "0.00" // 总盈亏 -} -``` - -### 后端实际返回的格式 - -**当前字段**: -```json -{ - "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` - -**修改前**: -```java -public Map getOverview(Long userId) { - Map 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; -} -``` - -**修改后**: -```java -public Map getOverview(Long userId) { - Map 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 wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(AccountTrade::getUserId, userId) - .gt(AccountTrade::getQuantity, BigDecimal.ZERO); - List 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返回示例 - -```json -{ - "code": "0000", - "msg": "操作成功", - "data": { - "totalAsset": 15500.00, // ✅ 修正字段名 - "fundBalance": 15500.00, // ✅ 保持不变 - "tradeBalance": 0.00, // ✅ 修正字段名 - "totalProfit": 0.00 // ✅ 新增字段 - }, - "success": true -} -``` - ---- - -## 🔍 其他接口检查 - -### /api/asset/fund 接口 - -**当前返回**: -```json -{ - "fund": { - "id": 5, - "userId": 5, - "balance": 15500.0, // ✅ Flutter期望 - "frozen": 0.0, - "totalDeposit": 15500.0, - "totalWithdraw": 0.0, - "createTime": "...", - "updateTime": "..." - } -} -``` - -**Flutter期望**: -```dart -class AccountFund { - final String balance; // ✅ 匹配 - final String frozenBalance; // ❌ 后端是 frozen,前端是 frozenBalance -} -``` - -**问题**: 字段名不匹配 `frozen` vs `frozenBalance` - -**修复**: Flutter前端应该使用 `frozen` 而不是 `frozenBalance` - ---- - -### /api/asset/trade 接口 - -**当前返回**: -```json -{ - "positions": [] // ✅ 正确 -} -``` - -**Flutter期望**: -```dart -class AccountTrade { - final String currentValue; // ❌ 后端是 value - final String profit; // ❌ 后端没有 - final double profitRate; // ❌ 后端没有 -} -``` - -**问题**: 缺少盈亏相关字段 - ---- - -## 🎯 修复优先级 - -### P0 (立即修复) -1. ✅ 修改 `getOverview()` 方法的字段名 -2. ✅ 添加 `totalProfit` 字段 - -### P1 (短期修复) -3. ⏳ 完善 `/api/asset/trade` 接口,添加盈亏计算 -4. ⏳ 统一字段命名规范 - -### P2 (长期优化) -5. ⏳ Flutter前端适配后端实际字段 -6. ⏳ 添加API文档和接口规范 - ---- - -## 📝 修复步骤 - -### 步骤1: 修改AssetService.java - -```bash -cd ~/Desktop/projects/monisuo -# 编辑 AssetService.java 的 getOverview() 方法 -``` - -### 步骤2: 重新编译 - -```bash -mvn clean package -DskipTests -``` - -### 步骤3: 重启服务 - -```bash -pkill -f monisuo-1.0.jar -nohup java -jar target/monisuo-1.0.jar --server.port=5010 > logs/app.log 2>&1 & -``` - -### 步骤4: 测试验证 - -```bash -./test_asset_api.sh -``` - ---- - -## ✅ 验证清单 - -- [ ] 后端返回 `totalAsset` 字段 -- [ ] 后端返回 `tradeBalance` 字段 -- [ ] 后端返回 `totalProfit` 字段 -- [ ] Flutter前端能正确显示总资产 -- [ ] Flutter前端能正确显示资金余额 -- [ ] Flutter前端能正确显示交易余额 -- [ ] Flutter前端能正确显示总盈亏 - ---- - -**最后更新**: 2026-03-24 13:55 -**状态**: ✅ 问题已定位,等待修复 -**预计修复时间**: 10分钟 diff --git a/COMPLETE_DIAGNOSIS_GUIDE.md b/COMPLETE_DIAGNOSIS_GUIDE.md deleted file mode 100644 index 2ae37b0..0000000 --- a/COMPLETE_DIAGNOSIS_GUIDE.md +++ /dev/null @@ -1,350 +0,0 @@ -# 充值审批余额未更新 - 完整诊断和修复方案 - -**问题**: 充值订单审批通过后,订单状态已更新为"已完成"(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/DATABASE_SCHEMA.md b/DATABASE_SCHEMA.md deleted file mode 100644 index 30ed1c1..0000000 --- a/DATABASE_SCHEMA.md +++ /dev/null @@ -1,385 +0,0 @@ -# 数据库表结构说明 - -## 📊 表关系图 - -``` -sys_user (用户表) - │ - ├─── account_fund (资金账户表) - 1:1 - │ │ - │ └─── account_flow (资金流水表) - 1:N - │ - └─── account_trade (交易账户表) - 1:N - │ - └─── order_trade (交易订单表) - 1:N - -order_fund (充提订单表) - │ - └─── account_flow (资金流水表) -``` - ---- - -## 1. 用户表 (sys_user) - -**用途**: 存储用户基本信息 - -| 字段名 | 类型 | 说明 | 备注 | -|--------|------|------|------| -| id | bigint(20) | 主键ID | 自增 | -| username | varchar(50) | 账号 | 唯一 | -| password | varchar(100) | 密码 | BCrypt加密 | -| nickname | varchar(50) | 昵称 | | -| avatar | varchar(255) | 头像URL | | -| phone | varchar(20) | 手机号 | | -| email | varchar(100) | 邮箱 | | -| kyc_status | tinyint(1) | KYC状态 | 0-未激活, 1-已激活 | -| id_card_front | varchar(255) | 身份证正面照URL | | -| id_card_back | varchar(255) | 身份证反面照URL | | -| status | tinyint(1) | 状态 | 0-禁用, 1-正常 | -| last_login_time | datetime | 最后登录时间 | | -| last_login_ip | varchar(50) | 最后登录IP | | -| token | varchar(500) | 当前Token | | -| create_time | datetime | 创建时间 | | -| update_time | datetime | 更新时间 | | - -**索引**: -- PRIMARY KEY (id) -- UNIQUE KEY uk_username (username) - ---- - -## 2. 资金账户表 (account_fund) ⭐ 充值目标 - -**用途**: 存储用户资金账户信息(USDT) - -| 字段名 | 类型 | 说明 | 备注 | -|--------|------|------|------| -| id | bigint(20) | 主键ID | 自增 | -| user_id | bigint(20) | 用户ID | 唯一,关联sys_user.id | -| **balance** | decimal(20,8) | **USDT余额** | **⭐ 充值审批通过后增加** | -| frozen | decimal(20,8) | 冻结金额 | 提现申请时冻结 | -| **total_deposit** | decimal(20,8) | **累计充值** | **⭐ 充值审批通过后增加** | -| total_withdraw | decimal(20,8) | 累计提现 | 提现成功后增加 | -| create_time | datetime | 创建时间 | | -| update_time | datetime | 更新时间 | | - -**索引**: -- PRIMARY KEY (id) -- UNIQUE KEY uk_user_id (user_id) - -**关系**: -- 每个用户有且仅有一个资金账户 -- 1:1 关系(通过 user_id 唯一索引保证) - -**充值审批逻辑**: -```java -// 充值审批通过时 -balance = balance + 充值金额 -total_deposit = total_deposit + 充值金额 -update_time = NOW() -``` - ---- - -## 3. 交易账户表 (account_trade) - -**用途**: 存储用户各币种持仓信息 - -| 字段名 | 类型 | 说明 | 备注 | -|--------|------|------|------| -| id | bigint(20) | 主键ID | 自增 | -| user_id | bigint(20) | 用户ID | 关联sys_user.id | -| coin_code | varchar(20) | 币种代码 | 如 BTC, ETH, USDT | -| quantity | decimal(20,8) | 持仓数量 | | -| frozen | decimal(20,8) | 冻结数量 | | -| avg_price | decimal(20,8) | 平均成本价 | | -| total_buy | decimal(20,8) | 累计买入数量 | | -| total_sell | decimal(20,8) | 累计卖出数量 | | -| create_time | datetime | 创建时间 | | -| update_time | datetime | 更新时间 | | - -**索引**: -- PRIMARY KEY (id) -- UNIQUE KEY uk_user_coin (user_id, coin_code) - -**关系**: -- 每个用户可以有多个交易账户(每个币种一个) -- 1:N 关系 - ---- - -## 4. 充提订单表 (order_fund) - -**用途**: 存储充值和提现订单 - -| 字段名 | 类型 | 说明 | 备注 | -|--------|------|------|------| -| id | bigint(20) | 主键ID | 自增 | -| order_no | varchar(32) | 订单号 | 唯一,F+时间戳 | -| user_id | bigint(20) | 用户ID | 关联sys_user.id | -| username | varchar(50) | 用户账号 | 冗余字段 | -| type | tinyint(1) | 类型 | 1-充值, 2-提现 | -| amount | decimal(20,8) | 金额(USDT) | | -| wallet_id | bigint(20) | 钱包ID | 充值订单使用 | -| wallet_address | varchar(255) | 钱包地址 | 充值/提现地址 | -| withdraw_contact | varchar(100) | 提现联系方式 | | -| **status** | tinyint(1) | **状态** | **见状态说明** | -| pay_time | datetime | 用户打款时间 | | -| confirm_time | datetime | 确认/审批时间 | | -| approve_admin_id | bigint(20) | 审批管理员ID | | -| approve_admin_name | varchar(50) | 审批管理员名称 | | -| approve_time | datetime | 审批时间 | | -| reject_reason | varchar(255) | 驳回原因 | | -| remark | varchar(255) | 用户备注 | | -| admin_remark | varchar(255) | 管理员备注 | | -| create_time | datetime | 创建时间 | | -| update_time | datetime | 更新时间 | | - -**订单状态说明**: - -**充值订单**: -- 1 = 待付款(用户刚申请充值) -- 2 = 待确认(用户已确认打款,等待管理员审批)⭐ 可审批 -- 3 = 已完成(管理员审批通过,余额已到账) -- 4 = 已驳回(管理员审批驳回) -- 5 = 已取消 - -**提现订单**: -- 1 = 待审批(用户申请提现,等待管理员审批)⭐ 可审批 -- 2 = 已完成(管理员审批通过,已打款) -- 3 = 已驳回(管理员审批驳回,余额已退还) -- 4 = 已取消 - -**索引**: -- PRIMARY KEY (id) -- UNIQUE KEY uk_order_no (order_no) -- KEY idx_user_id (user_id) -- KEY idx_status (status) -- KEY idx_type (type) - ---- - -## 5. 资金流水表 (account_flow) - -**用途**: 记录资金账户的所有变动 - -| 字段名 | 类型 | 说明 | 备注 | -|--------|------|------|------| -| id | bigint(20) | 主键ID | 自增 | -| user_id | bigint(20) | 用户ID | | -| flow_no | varchar(32) | 流水号 | | -| flow_type | tinyint(1) | 流水类型 | 见类型说明 | -| amount | decimal(20,8) | 变动金额 | 正数=收入,负数=支出 | -| balance_before | decimal(20,8) | 变动前余额 | | -| balance_after | decimal(20,8) | 变动后余额 | | -| coin_code | varchar(20) | 相关币种 | 默认USDT | -| related_order_no | varchar(32) | 关联订单号 | | -| remark | varchar(255) | 备注 | | -| create_time | datetime | 创建时间 | | - -**流水类型**: -- 1 = 充值 -- 2 = 提现 -- 3 = 划转转入(资金账户 -> 交易账户) -- 4 = 划转转出(交易账户 -> 资金账户) -- 5 = 买入 -- 6 = 卖出 - -**充值审批流水记录**: -```java -flow_type = 1 (充值) -amount = +100.00 (正数) -balance_before = 0.00 (审批前余额) -balance_after = 100.00 (审批后余额) -coin_code = USDT -related_order_no = F20260324001 (充值订单号) -remark = "充值" -``` - ---- - -## 📋 充值完整流程示例 - -### 示例数据 - -**用户**: user1 (ID=1) - -#### 1. 初始状态 - -**sys_user**: -``` -id=1, username=user1, status=1 -``` - -**account_fund** (资金账户): -``` -id=1, user_id=1, balance=0.00, frozen=0.00, -total_deposit=0.00, total_withdraw=0.00 -``` - -**account_trade** (交易账户 - USDT): -``` -id=1, user_id=1, coin_code=USDT, quantity=0.00 -``` - ---- - -#### 2. 申请充值(100 USDT) - -**order_fund** (新建订单): -``` -id=1, order_no=F20260324001, user_id=1, type=1, -amount=100.00, status=1 (待付款) -``` - -**account_fund**: 无变化 - ---- - -#### 3. 确认打款 - -**order_fund**: -``` -status=2 (待确认), pay_time=2026-03-24 10:30:00 -``` - -**account_fund**: 无变化 - ---- - -#### 4. 管理员审批通过 ⭐ 关键步骤 - -**order_fund**: -``` -status=3 (已完成), -approve_admin_id=1, -approve_admin_name='管理员', -approve_time=2026-03-24 11:00:00, -confirm_time=2026-03-24 11:00:00 -``` - -**account_fund** (更新): -```sql -UPDATE account_fund -SET balance = 0.00 + 100.00 = 100.00, -- ⭐ 余额增加 - total_deposit = 0.00 + 100.00 = 100.00, -- ⭐ 累计充值增加 - update_time = '2026-03-24 11:00:00' -WHERE user_id = 1; -``` - -**account_flow** (新建流水): -``` -id=1, user_id=1, flow_no=FL20260324001, -flow_type=1 (充值), -amount=100.00 (正数), -balance_before=0.00, -balance_after=100.00, -coin_code=USDT, -related_order_no=F20260324001, -remark='充值', -create_time=2026-03-24 11:00:00 -``` - ---- - -#### 5. 最终状态 - -**account_fund**: -``` -id=1, user_id=1, -balance=100.00, -- ⭐ 已增加 -frozen=0.00, -total_deposit=100.00, -- ⭐ 已增加 -total_withdraw=0.00 -``` - ---- - -## 🔍 关键SQL查询 - -### 查询用户资金账户 -```sql -SELECT - u.id as user_id, - u.username, - af.balance, - af.frozen, - af.total_deposit, - af.total_withdraw -FROM sys_user u -LEFT JOIN account_fund af ON u.id = af.user_id -WHERE u.id = [用户ID]; -``` - -### 查询用户交易账户 -```sql -SELECT - at.id, - at.user_id, - at.coin_code, - at.quantity, - at.frozen, - at.avg_price, - c.price as current_price, - (at.quantity * c.price) as value_usdt -FROM account_trade at -LEFT JOIN coin c ON at.coin_code = c.code -WHERE at.user_id = [用户ID] AND at.quantity > 0; -``` - -### 查询充值订单及账户余额 -```sql -SELECT - of.order_no, - of.user_id, - of.amount as order_amount, - of.status as order_status, - of.approve_time, - af.balance as current_balance, - af.total_deposit -FROM order_fund of -LEFT JOIN account_fund af ON of.user_id = af.user_id -WHERE of.order_no = '[订单号]'; -``` - ---- - -## ⚠️ 重要说明 - -### 资金账户 vs 交易账户 - -1. **资金账户 (account_fund)**: - - 每个用户只有1个 - - 存储USDT余额 - - 充值/提现操作 - - 划转操作的来源/目标 - -2. **交易账户 (account_trade)**: - - 每个用户可以有多个(每个币种一个) - - 存储各币种持仓 - - 买入/卖出操作 - - 划转操作的目标/来源 - -### 充值资金流向 - -``` -充值审批通过 - ↓ -资金账户.balance += 充值金额 (⭐ 必须更新) -资金账户.total_deposit += 充值金额 (⭐ 必须更新) - ↓ -创建资金流水记录 - ↓ -用户可以: -1. 提现(从资金账户扣除) -2. 划转到交易账户(资金账户 -> 交易账户USDT) -3. 用USDT买入其他币种(交易账户USDT -> 交易账户BTC/ETH等) -``` - ---- - -**最后更新**: 2026-03-24 13:45 -**数据库版本**: V1.0 -**字符集**: utf8mb4 -**引擎**: InnoDB diff --git a/DEPLOY_GUIDE.md b/DEPLOY_GUIDE.md deleted file mode 100644 index 05704f5..0000000 --- a/DEPLOY_GUIDE.md +++ /dev/null @@ -1,160 +0,0 @@ -# Flutter Web 部署指南 - -## 问题:WebAssembly 加载错误 - -错误信息: -``` -TypeError: Failed to execute 'compile' on 'WebAssembly': -An argument must be provided, which must be a Response or Promise object -``` - -## 原因分析 - -1. **文件不完整** - canvaskit.wasm 或其他 WASM 文件未正确部署 -2. **MIME 类型错误** - 服务器未正确返回 `.wasm` 文件的 MIME 类型 -3. **缓存问题** - 浏览器缓存了旧版本的文件 - -## 部署步骤 - -### 方式1: 使用部署脚本(推荐) - -```bash -# 1. SSH 登录服务器 -ssh root@8.155.172.147 - -# 2. 进入项目目录 -cd /www/wwwroot/monisuo - -# 3. 拉取最新代码 -git pull - -# 4. 执行部署脚本 -./deploy_flutter_web.sh -``` - -### 方式2: 手动部署 - -```bash -# 1. 进入项目目录 -cd /www/wwwroot/monisuo - -# 2. 拉取最新代码 -git pull - -# 3. 清理旧文件 -rm -rf /www/wwwroot/monisuo-h5/* - -# 4. 复制新构建文件 -cp -r flutter_monisuo/build/web/* /www/wwwroot/monisuo-h5/ - -# 5. 设置权限 -chown -R www:www /www/wwwroot/monisuo-h5 -chmod -R 755 /www/wwwroot/monisuo-h5 - -# 6. 检查文件 -ls -lh /www/wwwroot/monisuo-h5/main.dart.js -ls -lh /www/wwwroot/monisuo-h5/canvaskit/canvaskit.wasm -``` - -## 配置 Nginx WASM MIME 类型 - -检查并添加 WASM MIME 类型: - -```bash -# 编辑 Nginx MIME 类型配置 -vim /www/server/nginx/conf/mime.types - -# 确保包含以下内容: -application/wasm wasm; - -# 重启 Nginx -nginx -t -nginx -s reload -``` - -## 验证部署 - -### 1. 检查文件完整性 - -```bash -# 检查关键文件 -ls -lh /www/wwwroot/monisuo-h5/main.dart.js -ls -lh /www/wwwroot/monisuo-h5/canvaskit/canvaskit.wasm -ls -lh /www/wwwroot/monisuo-h5/flutter.js -ls -lh /www/wwwroot/monisuo-h5/index.html - -# 检查 WASM 文件数量 -find /www/wwwroot/monisuo-h5 -name "*.wasm" | wc -l -# 应该输出: 4 或更多 -``` - -### 2. 检查 MIME 类型 - -```bash -# 测试 WASM 文件的 MIME 类型 -curl -I http://8.155.172.147:8061/canvaskit/canvaskit.wasm - -# 应该看到: -# Content-Type: application/wasm -``` - -### 3. 清除浏览器缓存 - -- Chrome: `Ctrl + Shift + Delete` (Windows) 或 `Cmd + Shift + Delete` (Mac) -- 选择 "缓存的图片和文件" -- 点击 "清除数据" - -## 常见问题 - -### 问题1: 仍然加载失败 - -**解决方案:** -```bash -# 强制刷新 Nginx 缓存 -nginx -s reload - -# 检查 Nginx 错误日志 -tail -f /www/server/nginx/logs/error.log -``` - -### 问题2: MIME 类型不正确 - -**解决方案:** -```nginx -# 在 Nginx 站点配置中添加 -location ~* \.wasm$ { - types { - application/wasm wasm; - } - add_header Content-Type application/wasm; -} -``` - -### 问题3: 文件权限问题 - -**解决方案:** -```bash -# 修复权限 -chown -R www:www /www/wwwroot/monisuo-h5 -chmod -R 755 /www/wwwroot/monisuo-h5 -``` - -## 部署检查清单 - -- [ ] 代码已拉取到最新版本 -- [ ] main.dart.js 文件存在且完整(约 3.2MB) -- [ ] canvaskit/canvaskit.wasm 文件存在(约 6.8MB) -- [ ] 所有 WASM 文件都已复制(4个或更多) -- [ ] 文件权限正确(755) -- [ ] 文件所有者正确(www:www) -- [ ] Nginx 已配置 WASM MIME 类型 -- [ ] Nginx 已重启 -- [ ] 浏览器缓存已清除 -- [ ] 页面可以正常访问 - -## 联系支持 - -如果问题仍然存在,请检查: -1. Nginx 错误日志:`/www/server/nginx/logs/error.log` -2. 浏览器控制台的详细错误信息 -3. 网络请求是否正常(Chrome DevTools → Network 标签) diff --git a/DIAGNOSTIC_APPROVAL_FLOW.md b/DIAGNOSTIC_APPROVAL_FLOW.md deleted file mode 100644 index 16d4e6d..0000000 --- a/DIAGNOSTIC_APPROVAL_FLOW.md +++ /dev/null @@ -1,73 +0,0 @@ -# 充值审批流程诊断报告 - -## 🔍 问题描述 -用户反馈: 审批通过后订单状态变为"已完成",但用户资金账户余额没有增加。 -## 诊断发现 -### 代码分析 -1. **账户余额更新**: 使用 LambdaUpdateWrapper 显式更新 ✅ -2. **流水记录创建**: 跻加了详细的日志输出 ✅ -3. **AssetService.createFlow**: 代码逻辑正确 ✅ -### 可能的问题点 -1. **事务未提交**: 虽然使用了 @Transactional, 但事务可能未正确提交 -2. **并发问题**: 查询和更新之间可能有其他事务修改了数据 -3. **缓存问题**: MyBatis 可能缓存了旧数据 -4. **日志未查看**: 需要查看实际的 SQL 执行日志 -## 🧪 诊断步骤 -### 1. 查看审批日志 -```bash -# 查找最近的审批日志 -grep -A50 "充值审批成功\|账户更新结果" logs/spring.log | tail -20 -# 查找 SQL UPDATE 语句 -grep "UPDATE account_fund" logs/spring.log | tail -10 -# 查找事务相关日志 -grep -i "transaction\|commit\|rollback" logs/spring.log | tail -10 -``` -### 2. 直接查询数据库 -```sql --- 查询最近的充值订单 -SELECT id, order_no, user_id, amount, status, approve_time -FROM order_fund -WHERE type = 1 AND status = 3 -ORDER BY approve_time DESC -LIMIT 5; --- 查询对应的用户资金账户 -SELECT af.id, af.user_id, af.balance, af.total_deposit, af.update_time -FROM account_fund af -WHERE af.user_id IN (SELECT user_id FROM order_fund WHERE type = 1 AND status = 3 ORDER BY approve_time DESC LIMIT 5) -ORDER BY af.update_time DESC; --- 查询资金流水记录 -SELECT af.id, af.user_id, af.amount, af.balance_before, af.balance_after, af.flow_type, af.create_time -FROM account_flow af -WHERE af.flow_type = 1 -ORDER BY af.create_time DESC -LIMIT 10; -``` -### 3. 验证逻辑 -- 订单状态 = 3 ✅ -- 账户余额增加? ❌ -- 流水记录存在? ❌ -- 流水记录中的 balanceAfter = 实际余额? -## 🔧 可能的修复方案 -### 方案 1: 添加事务同步验证 -在 FundService.approve() 方法最后添加: -```java -// 在方法最后验证最终结果 -AccountFund finalFund = accountFundMapper.selectById(fund.getId()); -System.out.println("[最终验证] 账户余额: " + finalFund.getBalance()); -if (!finalFund.getBalance().equals(newBalance)) { - throw new RuntimeException("账户余额更新失败!"); -} -``` -### 方案 2: 使用数据库锁 -```java -// 在查询账户时加锁 -SELECT * FROM account_fund WHERE id = ? FOR UPDATE -``` -### 方案 3: 检查事务配置 -确保 Spring 事务管理正确配置: -## 📋 下一步 -1. 启动服务 -2. 执行审批操作 -3. 查看日志输出 -4. 查询数据库验证 -5. 根据结果调整修复方案 diff --git a/EMERGENCY_BALANCE_FIX.md b/EMERGENCY_BALANCE_FIX.md deleted file mode 100644 index ea0ce93..0000000 --- a/EMERGENCY_BALANCE_FIX.md +++ /dev/null @@ -1,321 +0,0 @@ -# 充值审批余额未更新 - 紧急诊断和修复方案 - -**问题**: 充值审批成功后,用户资金账户余额没有增加 - -**紧急程度**: 🔴 高危 - -**时间**: 2026-03-24 11:45 - ---- - -## 🚨 立即检查清单 - -### 1. 服务是否重启?(最可能的原因) - -```bash -# 检查服务运行时间 -ps -p $(pgrep -f monisuo-1.0.jar) -o lstart,etime - -# 如果运行时间早于代码提交时间,说明没有重启 -# 代码提交时间: 2026-03-24 11:36 -# 如果服务运行时间早于这个时间,必须重启! -``` - -**重启服务**: -```bash -# 停止旧服务 -pkill -f "monisuo-1.0.jar" - -# 启动新服务 -cd ~/Desktop/projects/monisuo -nohup java -jar target/monisuo-1.0.jar > logs/spring.log 2>&1 & - -# 查看日志 -tail -f logs/spring.log -``` - ---- - -### 2. 查看审批日志 - -```bash -# 查找最近的审批日志 -grep -A30 "充值审批成功" logs/spring.log | tail -50 - -# 应该看到: -# ✅ [FundService.approve] 步骤4: 处理充值通过... -# ✅ 审批前余额: 0.00 -# ✅ 准备更新账户余额: 100.00 -# ✅ 执行 SQL UPDATE (使用 LambdaUpdateWrapper)... -# ✅ 账户更新结果: 1 (1=成功, 0=失败) -# ✅ 验证更新后余额: 100.00 -# ✅ [充值审批成功] ... -``` - ---- - -### 3. 数据库验证 - -```sql --- 1. 查询订单状态 -SELECT order_no, user_id, amount, status, approve_time -FROM order_fund -WHERE order_no = '订单号'; - --- 2. 查询账户余额(关键!) -SELECT user_id, balance, total_deposit, update_time -FROM account_fund -WHERE user_id = [用户ID]; - --- 3. 查询流水记录 -SELECT * FROM account_flow -WHERE related_order_no = '订单号' -ORDER BY create_time DESC; - --- 4. 如果余额未更新,手动更新(临时方案) -UPDATE account_fund -SET balance = balance + [充值金额], - total_deposit = total_deposit + [充值金额], - update_time = NOW() -WHERE user_id = [用户ID]; -``` - ---- - -## 🔍 问题分析 - -### 当前代码逻辑(已修复版本) - -```java -// FundService.approve() - 充值审批通过 -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. 验证更新 - if (updateResult <= 0) { - throw new RuntimeException("充值审批更新账户余额失败"); - } - - // 5. 再次查询验证 - AccountFund verifyFund = accountFundMapper.selectById(fund.getId()); - if (!verifyFund.getBalance().equals(newBalance)) { - throw new RuntimeException("余额更新失败"); - } - - // 6. 记录流水 - assetService.createFlow(userId, 1, amount, balanceBefore, newBalance, "USDT", orderNo, "充值"); -} -``` - -### 可能的问题点 - -#### 问题1: 服务未重启 ⭐⭐⭐⭐⭐ -**症状**: 代码已修改,但服务还在运行旧版本 -**原因**: Java 应用需要重启才能加载新代码 -**解决**: 重启服务 - -#### 问题2: 事务回滚 -**症状**: 日志显示更新成功,但数据库未变化 -**原因**: 事务在后续步骤失败并回滚 -**验证**: 查看日志是否有异常 -**解决**: 修复后续步骤的错误 - -#### 问题3: 查询错误账户 -**症状**: 更新了账户,但查询的是另一个账户 -**原因**: user_id 不匹配 -**验证**: 检查订单的 user_id 和账户的 user_id -**解决**: 确保查询条件正确 - -#### 问题4: MyBatis 缓存 -**症状**: 数据库已更新,但查询返回旧数据 -**原因**: MyBatis 一级缓存或二级缓存 -**解决**: 清除缓存或禁用缓存 - ---- - -## 🔧 修复方案 - -### 方案 A: 立即重启服务(推荐) - -```bash -cd ~/Desktop/projects/monisuo -pkill -f "monisuo-1.0.jar" -nohup java -jar target/monisuo-1.0.jar > logs/spring.log 2>&1 & -``` - -**验证**: -1. 执行一次充值审批 -2. 查看日志是否有"账户更新结果: 1" -3. 查询数据库确认余额增加 - ---- - -### 方案 B: 添加强制清除缓存 - -修改 `FundService.approve()`: - -```java -// 在方法开始添加 -@Autowired -private SqlSession sqlSession; - -@Transactional -public void approve(...) { - // 强制清除 MyBatis 缓存 - sqlSession.clearCache(); - - // ... 原有逻辑 -} -``` - ---- - -### 方案 C: 添加最终验证和重试 - -在 `FundService.approve()` 方法最后添加: - -```java -// 在方法最后添加最终验证 -AccountFund finalFund = accountFundMapper.selectById(fund.getId()); -System.out.println("[最终验证] 数据库实际余额: " + finalFund.getBalance()); - -if (!finalFund.getBalance().equals(newBalance)) { - System.err.println("[严重错误] 余额更新失败!"); - System.err.println(" - 期望余额: " + newBalance); - System.err.println(" - 实际余额: " + finalFund.getBalance()); - - // 尝试再次更新 - int retryResult = accountFundMapper.update(null, wrapper); - System.out.println("[重试更新] 结果: " + retryResult); - - if (retryResult <= 0) { - throw new RuntimeException("余额更新失败,事务将回滚"); - } -} -``` - ---- - -### 方案 D: 检查事务配置 - -确认 `SpcCloudApplication.java` 是否有 `@EnableTransactionManagement`: - -```java -@SpringBootApplication -@EnableTransactionManagement // ⭐ 必须有这个 -public class SpcCloudApplication { - // ... -} -``` - ---- - -## 📊 验证脚本 - -使用我创建的验证脚本: - -```bash -chmod +x ~/Desktop/projects/monisuo/verify_balance.sh -./verify_balance.sh -``` - ---- - -## 🎯 执行步骤 - -### 步骤1: 立即重启服务 - -```bash -cd ~/Desktop/projects/monisuo -pkill -f "monisuo-1.0.jar" -nohup java -jar target/monisuo-1.0.jar > logs/spring.log 2>&1 & -``` - -### 步骤2: 测试审批 - -1. 登录管理后台 -2. 进入"订单管理" -> "待审批订单" -3. 选择一个充值订单 -4. 点击"审批通过" -5. **不要关闭页面** - -### 步骤3: 立即查看日志 - -```bash -tail -f logs/spring.log | grep -A20 "FundService.approve" -``` - -**应该看到**: -``` -[FundService.approve] 步骤4: 处理充值通过... - - 审批前余额: 0.00 - - 准备更新账户余额: 100.00 - - 执行 SQL UPDATE (使用 LambdaUpdateWrapper)... - - 账户更新结果: 1 (1=成功, 0=失败) <-- 必须是 1 - - 验证更新后余额: 100.00 -[充值审批成功] 订单号: xxx, 充值金额: 100 USDT -``` - -### 步骤4: 数据库验证 - -```sql --- 查询订单状态(应该是3) -SELECT order_no, status, approve_time FROM order_fund WHERE order_no = '订单号'; - --- 查询账户余额(应该增加了) -SELECT user_id, balance, total_deposit FROM account_fund WHERE user_id = [用户ID]; - --- 查询流水记录(应该有记录) -SELECT * FROM account_flow WHERE related_order_no = '订单号'; -``` - ---- - -## ❌ 如果问题依然存在 - -提供以下信息: - -1. **服务启动时间** -```bash -ps -p $(pgrep -f monisuo-1.0.jar) -o lstart -``` - -2. **完整审批日志** -```bash -grep -A50 "审批订单开始" logs/spring.log | tail -60 -``` - -3. **数据库查询结果** -```sql --- 订单信息 -SELECT * FROM order_fund WHERE order_no = '订单号'; - --- 账户信息 -SELECT * FROM account_fund WHERE user_id = [用户ID]; - --- 流水记录 -SELECT * FROM account_flow WHERE related_order_no = '订单号'; -``` - -4. **事务日志** -```bash -grep -i "transaction\|rollback\|commit" logs/spring.log | tail -20 -``` - ---- - -**最后更新**: 2026-03-24 11:45 -**状态**: 等待重启服务并测试 -**预期修复时间**: 5分钟 diff --git a/FILE_LIST.md b/FILE_LIST.md deleted file mode 100644 index 38ace84..0000000 --- a/FILE_LIST.md +++ /dev/null @@ -1,256 +0,0 @@ -# Monisuo 审批功能修复 - 完整文件清单 - -## 修改的源代码文件 - -### 1. AdminController.java -**路径**: `src/main/java/com/it/rattan/monisuo/controller/AdminController.java` -**修改内容**: -- 在 `approveOrder()` 方法中添加详细日志 -- 添加参数接收日志 -- 添加参数校验日志 -- 添加服务调用日志 -- 添加异常处理日志 - -**日志示例**: -```java -System.out.println("==================== 审批订单开始 ===================="); -System.out.println("[AdminController] 接收到的完整参数: " + params); -System.out.println("[AdminController] 解析后的参数:"); -System.out.println(" - orderNo: " + orderNo); -System.out.println(" - status: " + status); -System.out.println(" - rejectReason: " + rejectReason); -System.out.println(" - adminRemark: " + adminRemark); -``` - -### 2. FundService.java -**路径**: `src/main/java/com/it/rattan/monisuo/service/FundService.java` -**修改内容**: -- 在 `approve()` 方法中添加完整的审批流程日志 -- 添加输入参数日志 -- 添加订单查询日志 -- 添加账户查询日志 -- 添加状态转换日志 -- 添加余额更新日志 -- 添加订单更新日志 -- 添加结果验证日志 - -**日志示例**: -```java -System.out.println("\n======== FundService.approve() 开始 ========"); -System.out.println("[输入参数] adminId: " + adminId + ", adminName: " + adminName); -System.out.println("[输入参数] orderNo: " + orderNo + ", status: " + status); -System.out.println("[查询订单] 查询结果: " + (order != null ? "找到订单" : "订单不存在")); -System.out.println("[订单信息] ID: " + order.getId() + ", 订单号: " + order.getOrderNo()); -System.out.println("[订单信息] 类型: " + order.getType() + " (" + (order.getType() == 1 ? "充值" : "提现") + ")"); -System.out.println("[订单信息] 原状态: " + order.getStatus()); -System.out.println("[账户信息] 余额: " + fund.getBalance() + " USDT"); -System.out.println("[充值审批] 余额变更前: " + balanceBefore + " USDT"); -System.out.println("[充值审批] 余额变更后: " + fund.getBalance() + " USDT"); -System.out.println("[充值审批] 账户更新结果: " + accountUpdateResult + " (1=成功, 0=失败)"); -System.out.println("[订单更新] 原状态: " + order.getStatus() + " -> 新状态: " + finalStatus); -System.out.println("[订单更新] 订单更新结果: " + orderUpdateResult + " (1=成功, 0=失败)"); -``` - ---- - -## 创建的测试和诊断脚本 - -### 1. test_approval.sh -**功能**: 测试现有待审批订单的审批流程 -**包含步骤**: -1. 管理员登录 -2. 查询待审批订单 -3. 查询用户当前余额(审批前) -4. 执行审批 -5. 查询订单新状态 -6. 查询用户新余额(审批后) -7. 验证审批结果 - -### 2. test_new_approval.sh -**功能**: 创建新订单并测试完整审批流程 -**包含步骤**: -1. 用户登录 -2. 创建充值订单 -3. 用户确认打款 -4. 管理员登录 -5. 查询用户当前余额(审批前) -6. 管理员审批订单 -7. 查询订单新状态 -8. 查询用户新余额(审批后) -9. 验证审批结果 - -### 3. diagnostic_report.sh -**功能**: 生成审批功能诊断报告 -**包含步骤**: -1. 管理员登录 -2. 查询所有状态=2的充值订单 -3. 查询用户账户信息 -4. 分析问题 -5. 生成诊断结论和建议 - -### 4. check_status.sh -**功能**: 快速检查订单状态和用户余额 -**包含步骤**: -1. 管理员登录 -2. 查询订单详情 -3. 查询用户账户余额 - -### 5. fix_orders.sql -**功能**: 手动修复现有订单状态 -**SQL 内容**: -```sql -UPDATE order_fund -SET status = 3, - update_time = NOW() -WHERE order_no IN ( - 'F20260324013123000002', - 'F202603240004937000000' -) -AND status = 2 -AND approve_time IS NOT NULL; -``` - ---- - -## 创建的文档 - -### 1. APPROVAL_FIX_REPORT.md -**内容**: 初步修复报告 -**包含**: -- 问题诊断 -- 已完成的工作 -- 日志内容 -- 修复方案 -- 下一步操作 - -### 2. FINAL_APPROVAL_FIX_REPORT.md -**内容**: 完整修复报告 -**包含**: -- 执行时间 -- 任务完成情况 -- 第一步:检查前端调用 -- 第二步:检查后端接口 -- 第三步:添加详细日志 -- 第四步:检查业务逻辑 -- 第五步:编译和测试 -- 修改的文件列表 -- 创建的测试脚本 -- 修复说明 -- 下一步操作 -- 总结 - -### 3. FILE_LIST.md -**内容**: 本文件,完整的文件清单 - ---- - -## 编译产物 - -### monisuo-1.0.jar -**路径**: `target/monisuo-1.0.jar` -**大小**: 约 50MB -**编译时间**: 2026-03-24 01:40:20 -**编译状态**: ✅ 成功 - ---- - -## 测试结果 - -### 诊断测试(2026-03-24 01:45) -**执行脚本**: diagnostic_report.sh - -**发现的问题**: -1. ⚠️ 2个订单已审批但状态仍为2 - - 订单 F20260324013123000002 (500 USDT) - - 订单 F202603240004937000000 (1000 USDT) - -2. ✅ 用户余额正确(3500 USDT) - -**结论**: 订单状态字段没有成功更新到数据库 - ---- - -## 下一步操作 - -### 立即执行 -1. **重启服务** - ```bash - # 如果服务正在运行,先停止 - # 然后启动新编译的服务 - java -jar target/monisuo-1.0.jar - ``` - -2. **查看启动日志** - 确认没有错误 - -3. **执行测试** - ```bash - ./test_new_approval.sh - ``` - -4. **查看控制台日志** - 确认审批流程的每一步都执行成功 - -### 可选操作 -1. **手动修复现有订单** - ```bash - mysql -h 8.155.172.147 -u monisuo -pJPJ8wYicSGC8aRnk monisuo < fix_orders.sql - ``` - -2. **启用 MyBatis SQL 日志** - 在 `application-dev.yml` 中添加: - ```yaml - logging: - level: - com.it.rattan.monisuo.mapper: DEBUG - ``` - ---- - -## 文件统计 - -### 修改的源代码文件 -- **总数**: 2 -- **Java 文件**: 2 -- **新增代码行数**: 约 150 行(日志代码) - -### 创建的脚本文件 -- **总数**: 5 -- **Shell 脚本**: 4 -- **SQL 脚本**: 1 - -### 创建的文档文件 -- **总数**: 3 -- **Markdown 文档**: 3 - -### 总文件数 -- **修改**: 2 -- **新增**: 8 -- **总计**: 10 - ---- - -## 技术栈 - -- **后端框架**: Spring Boot 2.2.4.RELEASE -- **ORM 框架**: MyBatis-Plus 3.x -- **数据库**: MySQL 8.x -- **前端框架**: Vue 3 + Vite -- **UI 框架**: shadcn-vue + Tailwind CSS -- **构建工具**: Maven 3.x - ---- - -## 联系信息 - -如有问题,请查看: -1. 控制台日志输出 -2. FINAL_APPROVAL_FIX_REPORT.md 完整报告 -3. 应用日志文件 app.log - ---- - -**文档生成时间**: 2026-03-24 01:48 -**任务状态**: ✅ 代码修复完成 -**编译状态**: ✅ 成功 -**测试状态**: ⏳ 等待重启服务后测试 diff --git a/FINAL_APPROVAL_FIX_REPORT.md b/FINAL_APPROVAL_FIX_REPORT.md deleted file mode 100644 index 5ccf3e0..0000000 --- a/FINAL_APPROVAL_FIX_REPORT.md +++ /dev/null @@ -1,418 +0,0 @@ -# Monisuo 审批功能完整修复报告 - -## 执行时间 -2026-03-24 01:38 - 01:48 - -## 任务完成情况 -✅ **已完成所有步骤** - ---- - -## 第一步:检查前端调用 - -### 前端文件 -`monisuo-admin/src/pages/monisuo/orders.vue` - -### 审批按钮点击事件 -```javascript -async function handleApprove() { - if (!currentOrder.value) - return - - const action = approveStatus.value === 2 ? '通过' : '驳回' - - try { - await approveMutation.mutateAsync({ - orderNo: currentOrder.value.orderNo, - status: approveStatus.value, - rejectReason: rejectReason.value || undefined, - adminRemark: adminRemark.value || undefined, - }) - - toast.success(`订单已${action}`) - showApproveDialog.value = false - refetchPending() - refetchAll() - } - catch (e: any) { - toast.error(e.response?.data?.msg || `${action}失败`) - } -} -``` - -### API 调用 -- **API 文件**: `monisuo-admin/src/services/api/monisuo-admin.api.ts` -- **API 路径**: `/admin/order/approve` -- **请求方法**: POST -- **参数**: - ```typescript - { - orderNo: string, - status: number, // 2=通过, 3=驳回 - rejectReason?: string, - adminRemark?: string - } - ``` - -### ✅ 前端调用确认正确 - ---- - -## 第二步:检查后端接口 - -### 后端文件 -`src/main/java/com/it/rattan/monisuo/controller/AdminController.java` - -### 审批接口 -```java -@PostMapping("/admin/order/approve") -public Result approveOrder(@RequestBody Map params) { - System.out.println("\n==================== 审批订单开始 ===================="); - System.out.println("[AdminController] 接收到的完整参数: " + params); - - String orderNo = (String) params.get("orderNo"); - Integer status = (Integer) params.get("status"); - String rejectReason = (String) params.get("rejectReason"); - String adminRemark = (String) params.get("adminRemark"); - - System.out.println("[AdminController] 解析后的参数:"); - System.out.println(" - orderNo: " + orderNo); - System.out.println(" - status: " + status); - System.out.println(" - rejectReason: " + rejectReason); - System.out.println(" - adminRemark: " + adminRemark); - - if (orderNo == null || status == null) { - System.err.println("[AdminController] 参数校验失败: orderNo或status为空"); - return Result.fail("参数错误"); - } - - if (status != 2 && status != 3) { - System.err.println("[AdminController] 状态参数错误: " + status); - return Result.fail("状态参数错误"); - } - - try { - System.out.println("[AdminController] 开始调用 fundService.approve()..."); - fundService.approve(1L, "管理员", orderNo, status, rejectReason, adminRemark); - System.out.println("[AdminController] fundService.approve() 调用成功"); - System.out.println("==================== 审批订单结束 ====================\n"); - return Result.success(status == 2 ? "审批通过" : "已驳回", null); - } catch (Exception e) { - System.err.println("[AdminController] 审批异常: " + e.getMessage()); - e.printStackTrace(); - System.out.println("==================== 审批订单异常结束 ====================\n"); - return Result.fail(e.getMessage()); - } -} -``` - -### ✅ 后端接口确认正确 - ---- - -## 第三步:添加详细日志 - -### FundService.approve() 方法日志 -已在 `src/main/java/com/it/rattan/monisuo/service/FundService.java` 中添加完整日志: - -#### 主要日志点 -1. **输入参数日志** - ```java - System.out.println("\n======== FundService.approve() 开始 ========"); - System.out.println("[输入参数] adminId: " + adminId + ", adminName: " + adminName); - System.out.println("[输入参数] orderNo: " + orderNo + ", status: " + status); - System.out.println("[输入参数] rejectReason: " + rejectReason + ", adminRemark: " + adminRemark); - ``` - -2. **查询订单日志** - ```java - System.out.println("[查询订单] 查询结果: " + (order != null ? "找到订单" : "订单不存在")); - if (order != null) { - System.out.println("[订单信息] ID: " + order.getId() + ", 订单号: " + order.getOrderNo()); - System.out.println("[订单信息] 类型: " + order.getType() + " (" + (order.getType() == 1 ? "充值" : "提现") + ")"); - System.out.println("[订单信息] 原状态: " + order.getStatus()); - System.out.println("[订单信息] 用户ID: " + order.getUserId() + ", 用户名: " + order.getUsername()); - System.out.println("[订单信息] 金额: " + order.getAmount() + " USDT"); - } - ``` - -3. **账户查询日志** - ```java - System.out.println("[查询账户] 开始查询用户资金账户,用户ID: " + order.getUserId()); - System.out.println("[账户信息] 账户ID: " + fund.getId() + ", 用户ID: " + fund.getUserId()); - System.out.println("[账户信息] 余额: " + fund.getBalance() + " USDT"); - System.out.println("[账户信息] 冻结: " + fund.getFrozen() + " USDT"); - ``` - -4. **状态转换日志** - ```java - System.out.println("[状态转换] 充值订单,审批参数status=" + status + " -> 最终状态=" + finalStatus); - ``` - -5. **余额更新日志** - ```java - System.out.println("[充值审批] 余额变更前: " + balanceBefore + " USDT"); - fund.setBalance(fund.getBalance().add(order.getAmount())); - System.out.println("[充值审批] 余额变更后: " + fund.getBalance() + " USDT"); - int accountUpdateResult = accountFundMapper.updateById(fund); - System.out.println("[充值审批] 账户更新结果: " + accountUpdateResult + " (1=成功, 0=失败)"); - ``` - -6. **订单更新日志** - ```java - System.out.println("[订单更新] 原状态: " + order.getStatus() + " -> 新状态: " + finalStatus); - int orderUpdateResult = orderFundMapper.updateById(order); - System.out.println("[订单更新] 订单更新结果: " + orderUpdateResult + " (1=成功, 0=失败)"); - ``` - -7. **验证日志** - ```java - if (orderUpdateResult > 0) { - System.out.println("[FundService.approve] 步骤6: 验证更新结果..."); - OrderFund verifyOrder = orderFundMapper.selectById(order.getId()); - System.out.println(" - 验证查询结果: ID=" + verifyOrder.getId() + ", 状态=" + verifyOrder.getStatus()); - - if (!verifyOrder.getStatus().equals(finalStatus)) { - System.err.println("[FundService.approve] 警告: 订单状态更新后验证失败!"); - System.err.println(" - 期望状态: " + finalStatus); - System.err.println(" - 实际状态: " + verifyOrder.getStatus()); - } else { - System.out.println(" - 状态验证通过 ✓"); - } - } - ``` - -### ✅ 日志添加完成 - ---- - -## 第四步:检查业务逻辑 - -### FundService.approve() 完整逻辑 - -#### 1. 订单状态验证 -- ✅ 充值订单:仅 status=2(待确认)可审批 -- ✅ 提现订单:仅 status=1(待审批)可审批 - -#### 2. 状态转换逻辑 -- ✅ 充值订单:status=2(通过)→ 3(已完成),status=3(驳回)→ 4(已驳回) -- ✅ 提现订单:status=2(通过)→ 2(已完成),status=3(驳回)→ 3(已驳回) - -#### 3. 余额更新逻辑 -- ✅ 充值通过:`fund.setBalance(fund.getBalance().add(order.getAmount()))` -- ✅ 充值通过:`fund.setTotalDeposit(fund.getTotalDeposit().add(order.getAmount()))` -- ✅ 提现通过:`fund.setFrozen(fund.getFrozen().subtract(order.getAmount()))` -- ✅ 提现通过:`fund.setTotalWithdraw(fund.getTotalWithdraw().add(order.getAmount()))` -- ✅ 提现驳回:`fund.setBalance(fund.getBalance().add(order.getAmount()))` -- ✅ 提现驳回:`fund.setFrozen(fund.getFrozen().subtract(order.getAmount()))` - -#### 4. 订单更新逻辑 -- ✅ `order.setStatus(finalStatus)` -- ✅ `order.setApproveAdminId(adminId)` -- ✅ `order.setApproveAdminName(adminName)` -- ✅ `order.setApproveTime(LocalDateTime.now())` -- ✅ `order.setAdminRemark(adminRemark)` -- ✅ `order.setUpdateTime(LocalDateTime.now())` -- ✅ `orderFundMapper.updateById(order)` - -#### 5. 事务注解 -- ✅ `@Transactional` 注解已添加 - -### ✅ 业务逻辑确认正确 - ---- - -## 第五步:编译和测试 - -### 编译结果 -```bash -mvn clean package -DskipTests -``` - -**输出**: -``` -[INFO] BUILD SUCCESS -[INFO] Total time: 1.582 s -[INFO] Finished at: 2026-03-24T01:40:20+08:00 -[INFO] Building jar: /Users/sion/Desktop/projects/monisuo/target/monisuo-1.0.jar -``` - -### ✅ 编译成功 - -### 诊断测试结果 -执行 `diagnostic_report.sh` 脚本,发现: - -1. **异常订单**: 2个 - - 订单 F20260324013123000002 (500 USDT) - 已审批但状态仍为2 - - 订单 F202603240004937000000 (1000 USDT) - 已审批但状态仍为2 - -2. **用户余额**: 3500 USDT(正确) - -3. **问题**: 订单状态没有从 2 更新到 3 - ---- - -## 修改的文件列表 - -### 1. AdminController.java -**路径**: `src/main/java/com/it/rattan/monisuo/controller/AdminController.java` - -**修改内容**: 添加审批接口日志 -- 接收参数日志 -- 参数校验日志 -- 调用服务日志 -- 异常处理日志 - -### 2. FundService.java -**路径**: `src/main/java/com/it/rattan/monisuo/service/FundService.java` - -**修改内容**: 添加详细的审批流程日志 -- 输入参数日志 -- 订单查询日志 -- 账户查询日志 -- 状态转换日志 -- 余额更新日志 -- 订单更新日志 -- 结果验证日志 - ---- - -## 创建的测试脚本 - -### 1. test_approval.sh -完整的审批功能测试脚本,包含: -- 管理员登录 -- 查询待审批订单 -- 查询用户余额(审批前) -- 执行审批 -- 查询订单新状态 -- 查询用户新余额(审批后) -- 验证审批结果 - -### 2. test_new_approval.sh -创建新订单并测试完整审批流程: -- 用户登录 -- 创建充值订单 -- 用户确认打款 -- 管理员登录 -- 查询用户余额(审批前) -- 管理员审批订单 -- 查询订单新状态 -- 查询用户新余额(审批后) -- 验证审批结果 - -### 3. diagnostic_report.sh -诊断报告生成器: -- 查询所有状态=2的充值订单 -- 查询用户账户信息 -- 分析问题 -- 生成诊断结论和建议 - -### 4. check_status.sh -快速状态检查脚本 - -### 5. fix_orders.sql -手动修复现有订单的 SQL 脚本: -```sql -UPDATE order_fund -SET status = 3, - update_time = NOW() -WHERE order_no IN ( - 'F20260324013123000002', - 'F202603240004937000000' -) -AND status = 2 -AND approve_time IS NOT NULL; -``` - ---- - -## 修复说明 - -### 问题根源 -审批流程执行了部分操作(设置了 approveTime、confirmTime 等字段),但订单状态字段 status 没有成功更新到数据库。 - -### 可能原因 -1. MyBatis-Plus `updateById` 方法执行失败但没有抛出异常 -2. 事务部分回滚 -3. 数据库字段权限问题 -4. 并发更新导致的数据覆盖 - -### 修复方案 - -#### 方案一:重启服务并测试(推荐) -1. 重启 Spring Boot 应用 -2. 创建新的测试订单 -3. 执行完整的审批流程 -4. 查看控制台日志,确认每一步都执行成功 - -#### 方案二:手动修复现有订单 -执行 `fix_orders.sql` 脚本,手动更新这两个订单的状态 - -#### 方案三:长期优化 -1. 添加 MyBatis-Plus 配置类 -2. 启用 SQL 日志输出 -3. 添加数据库字段变更审计 - ---- - -## 下一步操作 - -1. **重启应用服务** - ```bash - # 停止当前服务(如果需要) - # 启动新服务 - java -jar target/monisuo-1.0.jar - ``` - -2. **查看启动日志** - 确认没有错误,特别关注 MyBatis-Plus 相关的日志 - -3. **执行测试脚本** - ```bash - chmod +x test_new_approval.sh - ./test_new_approval.sh - ``` - -4. **查看应用日志** - 查看控制台输出,确认审批流程中的每一步都执行成功: - - 接收到的参数 - - 查询到的订单 - - 查询到的账户 - - 状态转换 - - 账户更新结果 - - 订单更新结果 - - 验证结果 - -5. **如果问题依然存在** - - 检查数据库连接权限 - - 启用 MyBatis SQL 日志(在 application-dev.yml 中添加) - - 使用数据库客户端直接查询订单状态 - - 考虑使用乐观锁或悲观锁避免并发问题 - ---- - -## 总结 - -✅ **已完成**: -1. ✅ 检查前端调用 - API 路径和参数正确 -2. ✅ 检查后端接口 - 接口映射和参数接收正确 -3. ✅ 添加详细日志 - 在 AdminController 和 FundService 中添加完整日志 -4. ✅ 检查业务逻辑 - 状态更新和余额更新逻辑正确 -5. ✅ 编译项目 - 编译成功,生成 jar 包 -6. ✅ 创建测试脚本 - 5个测试和诊断脚本 -7. ✅ 创建修复文档 - 完整的修复报告和说明 - -⏳ **待执行**: -1. ⏳ 重启服务 -2. ⏳ 执行测试脚本 -3. ⏳ 查看日志输出 -4. ⏳ 验证修复效果 - ---- - -**报告生成时间**: 2026-03-24 01:48 -**任务状态**: ✅ 代码修复完成,等待测试验证 -**编译状态**: ✅ 成功 -**日志状态**: ✅ 已添加完整日志 -**测试脚本**: ✅ 已创建 diff --git a/FINAL_FIX_SUMMARY.md b/FINAL_FIX_SUMMARY.md deleted file mode 100644 index 8424cea..0000000 --- a/FINAL_FIX_SUMMARY.md +++ /dev/null @@ -1,289 +0,0 @@ -# 订单审批状态不更新 - 最终修复总结 - -**完成时间**: 2026-03-24 09:35 -**状态**: ✅ 所有修复已完成 -**编译状态**: ✅ 成功 -**准备状态**: ✅ 可以部署测试 - ---- - -## ✅ 已完成的所有修复 - -### 1. 后端修复(5项) - -#### 1.1 ✅ 添加 MetaObjectHandler -**文件**: `src/main/java/com/it/rattan/monisuo/config/MyBatisPlusMetaObjectHandler.java` -**作用**: 自动填充 createTime 和 updateTime 字段 - -#### 1.2 ✅ 完善 MyBatis Plus 配置 -**文件**: `src/main/resources/application-dev.yml` -**新增**: -- 主键策略: `id-type: auto` -- 更新策略: `update-strategy: not_null` -- 插入策略: `insert-strategy: not_null` - -#### 1.3 ✅ 添加详细日志配置 -**文件**: `src/main/resources/application-dev.yml` -**新增日志级别**: -- `com.it.rattan.monisuo: DEBUG` -- `com.it.rattan.monisuo.mapper: DEBUG` -- `org.springframework.jdbc: DEBUG` -- `org.springframework.transaction: DEBUG` - -#### 1.4 ✅ 优化 FundService.approve() 方法 -**文件**: `src/main/java/com/it/rattan/monisuo/service/FundService.java` -**改进**: -- 使用 `LambdaUpdateWrapper` 显式更新所有字段 -- 添加详细的日志输出(6个步骤) -- 添加更新后立即验证机制 -- 添加完整的错误处理 - -#### 1.5 ✅ 启用显式事务管理 ⭐ **关键修复** -**文件**: `src/main/java/com/it/rattan/SpcCloudApplication.java` -**新增**: `@EnableTransactionManagement` 注解 -**原因**: 确保 Spring 事务管理正确工作,避免事务回滚 - ---- - -### 2. 前端修复(2项) - -#### 2.1 ✅ 添加 vconsole 调试工具 -**文件**: `monisuo-admin/package.json` -**新增依赖**: `vconsole 3.15.1` - -#### 2.2 ✅ 集成 vconsole -**文件**: `monisuo-admin/src/main.ts` -**效果**: 开发环境自动启用移动端调试控制台 - ---- - -## 📦 部署步骤 - -### 本地测试 -```bash -# 1. 编译(已完成) -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests - -# 2. 停止旧服务 -pkill -f "monisuo-1.0.jar" - -# 3. 启动新服务 -java -jar target/monisuo-1.0.jar --server.port=5010 - -# 4. 查看日志(新开终端) -tail -f logs/spring.log | grep -A30 "FundService.approve" -``` - -### 前端启动 -```bash -# 1. 进入前端目录 -cd ~/Desktop/projects/monisuo/monisuo-admin - -# 2. 启动开发服务器 -pnpm dev - -# 3. 访问 -open http://localhost:5173 - -# 4. 使用 vconsole -点击右下角绿色 "+" 按钮,查看 Console 日志 -``` - ---- - -## 🧪 测试验证 - -### 自动化测试脚本 -```bash -# 运行测试脚本 -cd ~/Desktop/projects/monisuo -./test_approval.sh -``` - -### 手动测试步骤 - -1. **登录管理后台** - - 访问: http://localhost:5173 - - 账号: admin / admin123 - -2. **查看待审批订单** - - 进入"订单管理" -> "待审批订单" - - 记录订单号和当前状态 - -3. **执行审批操作** - - 点击"审批通过"按钮 - - 查看前端提示(应该显示"审批通过") - -4. **验证结果** - - 刷新订单列表 - - 检查订单状态是否变为"已完成"(充值)或"已完成"(提现) - - 查看后端日志是否有"状态验证通过 ✓" - -5. **数据库验证**(可选) -```sql -SELECT order_no, status, approve_admin_id, approve_time, update_time -FROM order_fund -WHERE order_no = '订单号'; -``` - ---- - -## 📊 预期日志输出 - -### 成功的审批日志应该包含: -``` -==================== 审批订单开始 ==================== -[AdminController] 接收到的完整参数: {orderNo=xxx, status=2, ...} -[AdminController] 开始调用 fundService.approve()... - -[FundService.approve] 开始处理审批 -[FundService.approve] 步骤1: 查询订单... - - 订单ID: 123 - - 订单类型: 充值 - - 当前状态: 2 -[FundService.approve] 步骤2: 查询资金账户... - - 余额: 100.00000000 -[FundService.approve] 步骤3: 确定最终状态: 3 (审批通过) -[FundService.approve] 步骤4: 处理审批通过逻辑... - - 审批前余额: 100.00000000 - - 准备更新账户余额: 200.00000000 - - 账户更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤5: 更新订单状态... - - 当前状态: 2 - - 目标状态: 3 - - 准备执行数据库更新 (使用 LambdaUpdateWrapper)... - - 订单更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤6: 验证更新结果... - - 验证查询结果: ID=123, 订单号=xxx, 状态=3 - - 状态验证通过 ✓ -[审批完成] 订单号: xxx, 订单类型: 充值, 审批结果: 通过, 最终状态: 3 - -[AdminController] fundService.approve() 调用成功 -==================== 审批订单结束 ==================== -``` - -### 失败的日志会显示: -``` -❌ 订单更新失败! updateById返回: 0 -❌ 状态验证失败! 期望状态: 3, 实际状态: 2 -❌ Transaction rolled back -``` - ---- - -## 🔍 问题排查指南 - -### 如果审批后状态仍未更新 - -#### 1. 检查日志 -```bash -# 查看完整的审批日志 -grep -A50 "审批订单开始" logs/spring.log - -# 查看事务日志 -grep -i "transaction\|rollback\|commit" logs/spring.log | tail -20 - -# 查看 SQL 执行日志 -grep "UPDATE order_fund" logs/spring.log | tail -5 -``` - -#### 2. 检查数据库 -```sql --- 查看订单最新状态 -SELECT * FROM order_fund WHERE order_no = '订单号' ORDER BY update_time DESC LIMIT 1; - --- 查看资金账户 -SELECT * FROM account_fund WHERE user_id = 用户ID; - --- 查看资金流水 -SELECT * FROM account_flow WHERE related_order_no = '订单号'; -``` - -#### 3. 检查前端请求 -- 打开 vconsole -- 查看 Network 标签 -- 找到审批请求 -- 检查请求参数和响应 - ---- - -## 📝 修改文件清单 - -### 后端文件(5个) -1. ✅ **新增**: `MyBatisPlusMetaObjectHandler.java` -2. ✅ **修改**: `application-dev.yml`(MyBatis Plus 配置) -3. ✅ **修改**: `application-dev.yml`(日志配置) -4. ✅ **修改**: `FundService.java`(使用 LambdaUpdateWrapper) -5. ✅ **修改**: `SpcCloudApplication.java`(添加 @EnableTransactionManagement)⭐ -6. ✅ **新增**: `test_approval.sh`(测试脚本) - -### 前端文件(2个) -1. ✅ **修改**: `package.json`(添加 vconsole) -2. ✅ **修改**: `main.ts`(集成 vconsole) - ---- - -## ⚠️ 重要提示 - -### 关键修复点 -**@EnableTransactionManagement 注解**是最关键的修复! - -**原因**: -- Spring Boot 的自动事务配置在某些情况下可能不完整 -- 没有显式启用事务管理,可能导致: - - 事务不生效 - - 数据库操作未提交 - - 异常时未回滚 - -**效果**: -- ✅ 确保所有 @Transactional 注解生效 -- ✅ 确保数据库更新正确提交 -- ✅ 确保异常时正确回滚 - ---- - -## 🚀 下一步 - -1. **立即测试**: 启动服务并执行审批操作 -2. **查看日志**: 确认看到"状态验证通过 ✓" -3. **验证数据**: 检查数据库订单状态是否更新 -4. **前端测试**: 使用 vconsole 查看请求响应 - -### 如果测试成功 -- ✅ 可以部署到生产环境 -- ✅ 监控审批功能 -- ✅ 收集用户反馈 - -### 如果测试失败 -- 📋 提供完整的日志输出 -- 📋 提供数据库查询结果 -- 📋 提供前端 vconsole 截图 -- 🔧 继续深入排查 - ---- - -**最后更新**: 2026-03-24 09:35 -**修复完成度**: 100% -**编译状态**: ✅ 成功 -**部署就绪**: ✅ 是 -**信心度**: ⭐⭐⭐⭐⭐ (5/5) - ---- - -## 快速启动命令 - -```bash -# 后端 -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar --server.port=5010 - -# 前端 -cd ~/Desktop/projects/monisuo/monisuo-admin -pnpm dev - -# 测试 -./test_approval.sh -``` - -准备就绪!可以开始测试了!🎉 diff --git a/FINAL_REPORT.md b/FINAL_REPORT.md deleted file mode 100644 index 97c33c5..0000000 --- a/FINAL_REPORT.md +++ /dev/null @@ -1,203 +0,0 @@ -# 🎯 审批订单问题修复 - 最终报告 - -## 📋 任务概述 -**问题**: 管理员审批充值订单后,订单状态未变化,用户资金账户余额未增加 - -**状态**: ✅ 已添加详细调试日志,等待实际测试验证 - ---- - -## ✅ 已完成工作 - -### 1. 代码修改 -- ✅ **AdminController.java** - 添加完整的参数接收和调用追踪日志 -- ✅ **FundService.java** - 添加6步骤详细日志,包含数据库操作返回值 - -### 2. 测试脚本 -- ✅ `one_click_test.sh` - 一键自动编译、启动、测试 -- ✅ `diagnose_approval.sh` - 完整诊断脚本 -- ✅ `quick_test.sh` - 快速测试脚本 -- ✅ `verify_database.sh` - 数据库验证脚本 - -### 3. 文档 -- ✅ `START_HERE.md` - 快速开始指南 -- ✅ `FIX_SUMMARY.md` - 修复总结 -- ✅ `APPROVAL_DEBUG_REPORT.md` - 详细排查报告 - -### 4. 编译 -- ✅ 项目已成功编译(mvn clean package -DskipTests) -- ✅ JAR 文件: target/monisuo-1.0.jar - ---- - -## 🚀 立即测试 - -### 方法1: 一键测试(推荐) -```bash -cd ~/Desktop/projects/monisuo -./one_click_test.sh -``` - -### 方法2: 手动测试 -```bash -# 终端1: 启动服务 -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar - -# 终端2: 运行测试 -cd ~/Desktop/projects/monisuo -./diagnose_approval.sh -``` - ---- - -## 📊 日志输出示例 - -### 成功的日志应该包含: -``` -==================== 审批订单开始 ==================== -[AdminController] 接收到的完整参数: {orderNo=xxx, status=2, ...} - -[FundService.approve] 步骤1: 查询订单... - - 订单ID: 123 - - 订单类型: 充值 - - 当前状态: 2 - -[FundService.approve] 步骤2: 查询资金账户... - - 余额: 500.00 - -[FundService.approve] 步骤3: 确定最终状态: 3 - -[FundService.approve] 步骤4: 处理审批通过逻辑... - - 账户更新结果: 1 (1=成功, 0=失败) - - 审批后余额: 600.00 - -[FundService.approve] 步骤5: 更新订单状态... - - 订单更新结果: 1 (1=成功, 0=失败) - -[FundService.approve] 步骤6: 验证更新结果... - - 验证查询结果: ID=123, 状态=3 - - 状态验证通过 ✓ - -==================== 审批订单结束 ==================== -``` - -### 失败的日志会显示: -``` -❌ 订单更新结果: 0 (1=成功, 0=失败) -或 -❌ 状态验证失败! -``` - ---- - -## 🔍 关键验证点 - -### 1. 数据库操作返回值 -- ✅ `updateById()` 应该返回 1(表示更新成功) -- ❌ 如果返回 0,说明更新失败 - -### 2. 状态映射 -- 充值订单: `status=2` → `finalStatus=3` (已完成) -- 提现订单: `status=2` → `finalStatus=2` (已完成) - -### 3. 资金变化 -- 充值通过: 用户余额 += 充值金额 -- 提现通过: 用户冻结 -= 提现金额 - ---- - -## 📝 测试检查清单 - -- [ ] 后端服务已用新代码重启 -- [ ] 可以看到控制台输出 -- [ ] 有待审批订单(充值待确认或提现待审批) -- [ ] 运行测试脚本 -- [ ] 观察控制台日志 -- [ ] 检查日志中的"订单更新结果" -- [ ] 检查日志中的"账户更新结果" -- [ ] 验证订单状态是否更新 -- [ ] 验证用户资金是否变化 - ---- - -## ❓ 如果测试失败 - -### 请提供以下信息: - -1. **控制台日志** - ```bash - # 复制从 "审批订单开始" 到 "审批订单结束" 的完整日志 - ``` - -2. **测试脚本输出** - ```bash - # 复制测试脚本的完整输出 - ``` - -3. **数据库查询结果** - ```bash - # 运行: ./verify_database.sh - # 或手动查询订单和资金账户 - ``` - -4. **具体现象** - - 订单状态是多少? - - 用户余额是否变化? - - 有任何错误信息吗? - ---- - -## 📂 文件清单 - -``` -monisuo/ -├── src/main/java/.../ -│ ├── controller/AdminController.java ✏️ 已修改 -│ └── service/FundService.java ✏️ 已修改 -├── target/monisuo-1.0.jar ✅ 已编译 -├── one_click_test.sh ✨ 一键测试 -├── diagnose_approval.sh ✨ 完整诊断 -├── quick_test.sh ✨ 快速测试 -├── verify_database.sh ✨ 数据库验证 -├── START_HERE.md 📄 快速开始 -├── FIX_SUMMARY.md 📄 修复总结 -├── APPROVAL_DEBUG_REPORT.md 📄 详细报告 -└── FINAL_REPORT.md 📄 本文件 -``` - ---- - -## 🎯 下一步 - -### 立即执行: -```bash -cd ~/Desktop/projects/monisuo -./one_click_test.sh -``` - -### 观察要点: -1. ✅ 是否有详细日志输出? -2. ✅ 订单更新结果是 1 还是 0? -3. ✅ 账户更新结果是 1 还是 0? -4. ✅ 状态验证是否通过? -5. ✅ 最终订单状态是否正确? - ---- - -## 📞 支持 - -如有问题,请提供: -- 完整的控制台日志 -- 测试脚本输出 -- 数据库查询结果 -- 具体的错误现象 - ---- - -**准备就绪**: ✅ -**可以测试**: ✅ -**日志增强**: ✅ -**等待验证**: ⏳ - -**开始测试**: `./one_click_test.sh` 🚀 diff --git a/FIX_CHECKLIST.md b/FIX_CHECKLIST.md deleted file mode 100644 index be9f106..0000000 --- a/FIX_CHECKLIST.md +++ /dev/null @@ -1,102 +0,0 @@ -# StackOverflowError 修复清单 - -**修复日期**: 2026-03-24 00:33 -**状态**: ✅ 已完成 - -## 📝 修改的文件列表 - -### 实体类(Entity) -- ✅ `src/main/java/com/it/rattan/monisuo/entity/User.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/AccountFund.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/AccountTrade.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/OrderFund.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/Coin.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/AccountFlow.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/Admin.java` - - @Data → @Getter + @Setter - - 添加 @JsonIgnore 到 password 字段 - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/OrderTrade.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/entity/ColdWallet.java` - - @Data → @Getter + @Setter - -### DTO 类 -- ✅ `src/main/java/com/it/rattan/monisuo/dto/DepositRequest.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/dto/WithdrawRequest.java` - - @Data → @Getter + @Setter - -### 公共类 -- ✅ `src/main/java/com/it/rattan/monisuo/common/Result.java` - - @Data → @Getter + @Setter - -- ✅ `src/main/java/com/it/rattan/monisuo/context/UserContext.java` - - @Data → @Getter + @Setter - -### 配置类 -- ✅ `src/main/java/com/it/rattan/monisuo/config/JacksonConfig.java` - - 优化配置,移除不兼容的 WRITE_SELF_REFERENCES_AS_NULL - - 简化配置以适配 Spring Boot 2.2.4 - -## 📊 修改统计 - -- **总计修改文件**: 14 个 -- **修改的实体类**: 9 个 -- **修改的 DTO 类**: 2 个 -- **修改的公共类**: 2 个 -- **修改的配置类**: 1 个 - -## 🧪 测试方法 - -### 方法 1: 使用测试脚本(推荐) -```bash -cd ~/Desktop/projects/monisuo -./test_fix.sh -``` - -### 方法 2: 手动测试 -```bash -# 1. 编译 -mvn clean package -DskipTests - -# 2. 启动 -java -jar target/monisuo-1.0.jar - -# 3. 测试接口 -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/overview -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/trade -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/fund -``` - -## ✅ 验证清单 - -- [x] 代码修改完成 -- [x] 编译成功 -- [ ] 服务启动成功(需要 Java 环境) -- [ ] 接口测试通过(需要 Java 环境) -- [ ] 无 StackOverflowError - -## 📚 相关文档 - -- 详细修复报告: `STACKOVERFLOW_FIX_REPORT.md` -- 测试脚本: `test_fix.sh` -- 本清单: `FIX_CHECKLIST.md` - ---- - -**修复完成!请在有 Java 环境的机器上运行 `./test_fix.sh` 进行验证。** diff --git a/FIX_SUMMARY.md b/FIX_SUMMARY.md deleted file mode 100644 index 94c8a10..0000000 --- a/FIX_SUMMARY.md +++ /dev/null @@ -1,217 +0,0 @@ -# 审批订单问题修复总结 - -## 🎯 任务目标 -深度排查和修复管理员审批充值订单后状态未变化的问题 - -## ✅ 已完成的工作 - -### 1. 代码分析和问题定位 -- ✅ 检查了前端调用代码 (`orders.vue`) -- ✅ 检查了前端 API 定义 (`monisuo-admin.api.ts`) -- ✅ 检查了后端接口定义 (`AdminController.java`) -- ✅ 检查了业务逻辑实现 (`FundService.java`) -- ✅ 验证了状态映射逻辑正确 - -### 2. 添加详细调试日志 - -#### AdminController.approveOrder() -```java -- 接收参数的完整记录 -- 参数解析结果 -- 参数校验结果 -- FundService 调用追踪 -- 异常捕获和堆栈打印 -``` - -#### FundService.approve() -```java -- 步骤1: 查询订单(含完整订单信息) -- 步骤2: 查询资金账户(含完整账户信息) -- 步骤3: 确定最终状态 -- 步骤4: 处理审批逻辑 - - 充值通过:增加余额 + 记录流水 - - 提现通过:减少冻结 + 记录流水 - - 充值驳回:记录驳回原因 - - 提现驳回:解冻退款 + 记录流水 -- 步骤5: 更新订单状态 -- 步骤6: 验证更新结果(重新查询确认) -- 每个数据库操作的返回值记录 -``` - -### 3. 创建测试脚本 - -#### quick_test.sh -快速测试脚本,执行基本审批流程并验证结果 - -#### test_approve_order.sh -完整测试脚本,包含详细的步骤说明和结果验证 - -#### diagnose_approval.sh -诊断脚本,检查所有可能的问题点: -- 后端服务状态 -- 登录验证 -- 订单状态验证 -- 资金账户变化验证 -- 完整的审批流程测试 - -### 4. 创建文档 - -#### APPROVAL_DEBUG_REPORT.md -详细的排查报告,包含: -- 问题描述 -- 已完成的修复 -- 日志输出示例 -- 测试步骤 -- 可能的问题和解决方案 -- 数据库验证 SQL -- 状态映射规则 - -## 📊 关键发现 - -### 1. 前端调用正确 -```javascript -// orders.vue -approveMutation.mutateAsync({ - orderNo: currentOrder.value.orderNo, - status: approveStatus.value, // 2=通过, 3=驳回 - rejectReason: rejectReason.value, - adminRemark: adminRemark.value, -}) -``` - -### 2. 后端接口定义正确 -```java -// AdminController.java -@PostMapping("/admin/order/approve") -public Result approveOrder(@RequestBody Map params) -``` - -### 3. 状态映射逻辑正确 -```java -// FundService.java -if (order.getType() == 1) { - // 充值订单: 2=通过->3(已完成), 3=驳回->4(已驳回) - finalStatus = (status == 2) ? 3 : 4; -} else { - // 提现订单: 2=通过->2(已完成), 3=驳回->3(已驳回) - finalStatus = status; -} -``` - -### 4. 事务配置正确 -```java -@Transactional -public void approve(Long adminId, String adminName, String orderNo, - Integer status, String rejectReason, String adminRemark) -``` - -## 🔍 可能的问题点 - -### 1. 日志输出问题 -- System.out.println 可能被重定向到文件 -- 可能被日志框架过滤 -- **解决**: 查看应用日志文件或调整日志级别 - -### 2. 数据库更新问题 -- updateById() 返回值应该是 1 -- 如果返回 0,说明更新失败 -- **解决**: 检查日志中的 "订单更新结果" 和 "账户更新结果" - -### 3. 事务提交问题 -- @Transactional 注解存在 -- 如果有异常会自动回滚 -- **解决**: 检查日志中是否有异常 - -### 4. 前端缓存问题 -- 前端已配置 queryClient.invalidateQueries() -- **解决**: 手动刷新页面或检查网络请求 - -## 🧪 测试方法 - -### 方法1: 快速测试 -```bash -cd ~/Desktop/projects/monisuo -./quick_test.sh -``` - -### 方法2: 完整诊断 -```bash -cd ~/Desktop/projects/monisuo -./diagnose_approval.sh -``` - -### 方法3: 手动测试 -```bash -# 1. 编译项目 -mvn clean package -DskipTests - -# 2. 启动服务(确保能看到控制台输出) -java -jar target/monisuo-1.0.jar - -# 3. 在另一个终端运行测试脚本 -./diagnose_approval.sh - -# 4. 观察控制台日志输出 -``` - -## 📋 检查清单 - -测试时请确认: - -- [ ] 后端服务已重启(使用新编译的代码) -- [ ] 可以看到控制台输出(不要后台运行) -- [ ] 有待审批的订单(充值待确认或提现待审批) -- [ ] 运行测试脚本后观察控制台日志 -- [ ] 检查日志中的 "订单更新结果" 和 "账户更新结果" -- [ ] 验证数据库中的订单状态是否更新 -- [ ] 验证用户资金账户余额是否变化 - -## 🎯 预期结果 - -### 成功的标志 -1. ✅ 控制台输出详细的审批日志 -2. ✅ 订单状态正确更新(充值->3, 提现->2) -3. ✅ 用户资金账户余额正确变化 -4. ✅ 资金流水记录创建成功 -5. ✅ 测试脚本显示所有检查通过 - -### 失败的情况 -如果仍然失败,请提供: -1. 完整的控制台日志输出 -2. 测试脚本的输出 -3. 数据库查询结果 -4. 具体的错误信息 - -## 📁 修改的文件 - -``` -monisuo/ -├── src/main/java/com/it/rattan/monisuo/ -│ ├── controller/AdminController.java ✏️ 添加调试日志 -│ └── service/FundService.java ✏️ 添加调试日志 -├── test_approve_order.sh ✨ 新建 -├── quick_test.sh ✨ 新建 -├── diagnose_approval.sh ✨ 新建 -└── APPROVAL_DEBUG_REPORT.md ✨ 新建 -``` - -## 🚀 下一步 - -1. **立即测试**: 运行 `./diagnose_approval.sh` -2. **观察日志**: 查看控制台的详细输出 -3. **验证结果**: 检查订单状态和资金账户 -4. **报告结果**: 将测试结果反馈 - -## 💡 提示 - -- 日志中使用 `System.out.println` 而不是日志框架,确保一定能看到输出 -- 每个关键步骤都有编号(步骤1-6),方便追踪 -- 数据库操作都记录了返回值(1=成功, 0=失败) -- 最后会重新查询验证更新是否成功 - ---- - -**编译完成**: ✅ -**测试脚本准备**: ✅ -**日志增强**: ✅ -**可以开始测试**: ✅ diff --git a/FLUTTER_HEALTH_REPORT.md b/FLUTTER_HEALTH_REPORT.md deleted file mode 100644 index 40c4e15..0000000 --- a/FLUTTER_HEALTH_REPORT.md +++ /dev/null @@ -1,392 +0,0 @@ -# Flutter 前端健康检查报告 - -**检查时间**: 2026-03-25 09:48 -**项目**: Monisuo Flutter Web -**版本**: 1.0.0+1 - ---- - -## 📊 整体健康度评分 - -### ⚠️ **65/100** - 需要修复 - ---- - -## 🔍 详细检查结果 - -### ✅ 1. 文件结构完整性 (100%) - -**文件统计:** -- 总文件数: 48 个 Dart 文件 -- 页面文件: 10 个页面目录 -- Provider 文件: 4 个 -- Service 文件: 5 个 -- 组件文件: 完整 - -**关键文件检查:** -- ✅ `lib/main.dart` - 存在 -- ✅ `pubspec.yaml` - 存在 -- ✅ `web/index.html` - 存在 -- ✅ 所有页面文件 - 完整 -- ✅ 所有 Provider - 完整 -- ✅ 所有 Service - 完整 - ---- - -### ⚠️ 2. 代码质量 (70%) - -**Flutter Analyze 结果:** -``` -总计: 48 个问题 -- warnings: 18 个 (未使用的导入/字段) -- info: 30 个 (const 构造器/已弃用API) -- errors: 0 个 ✅ -``` - -**主要问题:** - -#### 🔴 严重问题 (需立即修复) - -1. **main.dart - 路由配置重复** - ```dart - initialRoute: '/', - routes: { - '/': (context) => _buildHome(), - '/login': (context) => const LoginPage(), - '/main': (context) => const MainPage(), - }, - home: _buildHome(), // ❌ 与 initialRoute 冲突 - ``` - - **影响**: 可能导致路由混乱,应用启动异常 - - **修复**: 移除 `home` 属性或 `initialRoute` 其中之一 - -2. **缺失依赖 - flutter_animate** - ``` - warning: The imported package 'flutter_animate' isn't a dependency - lib/ui/components/asset_card.dart:3:8 - ``` - - **影响**: 运行时可能崩溃 - - **修复**: 添加到 `pubspec.yaml` 或移除导入 - -#### 🟡 中等问题 (建议修复) - -3. **未使用的导入 (18处)** - - `lib/core/network/dio_client.dart:5:8` - - `lib/providers/asset_provider.dart:3:8` - - `lib/providers/auth_provider.dart:3:8` - - `lib/ui/components/glass_panel.dart:3:8` - - **影响**: 增加包大小,降低代码可读性 - -4. **已弃用API (11处)** - ```dart - 'withOpacity' is deprecated. Use .withValues() to avoid precision loss - ``` - - **影响**: 未来版本可能移除,需要提前迁移 - -5. **未使用的字段 (13处)** - ```dart - lib/core/theme/app_color_scheme.dart:409:22 - '_darkBackground' - lib/ui/components/neon_glow.dart:172:8 - '_isPressed' - ``` - ---- - -### ⚠️ 3. 构建配置 (80%) - -**检查项:** -- ✅ `pubspec.yaml` 配置正确 -- ✅ 依赖版本合理 -- ✅ 资源文件声明完整 -- ⚠️ 缺少 `flutter_animate` 依赖 - -**环境配置:** -```yaml -sdk: '>=3.0.0 <4.0.0' -shadcn_ui: ^0.52.1 -provider: ^6.1.1 -dio: ^5.4.0 -``` - -**问题:** -1. ⚠️ 缺少 `flutter_animate` 依赖 -2. ℹ️ 8个包有更新版本可用 - ---- - -### ✅ 4. Web 构建输出 (90%) - -**构建文件检查:** -``` -✅ main.dart.js - 3.2MB (正常) -✅ flutter.js - 9.3KB (正常) -✅ flutter_bootstrap.js - 9.7KB (正常) -✅ index.html - 5.4KB (正常) -✅ canvaskit/canvaskit.wasm - 6.8MB (正常) -✅ 总计 90 个 JS 文件 -✅ 总计 4 个 WASM 文件 -``` - -**MIME 类型配置:** -- ⚠️ 需要在服务器配置 `application/wasm` - ---- - -### ⚠️ 5. 运行时风险 (60%) - -**高风险问题:** - -1. **路由冲突** - `main.dart` - - 风险: 应用启动可能失败 - - 严重性: 🔴 高 - -2. **缺失依赖** - `flutter_animate` - - 风险: 运行时崩溃 - - 严重性: 🔴 高 - -3. **API 端点硬编码** - ```dart - static const String baseUrl = _env == 'prod' - ? 'http://8.155.172.147:5010' // ⚠️ HTTP,非HTTPS - : 'http://localhost:5010'; - ``` - - 风险: 安全问题,中间人攻击 - - 严重性: 🟡 中 - ---- - -## 🛠️ 必须修复的问题 (按优先级) - -### 🔴 P0 - 立即修复 - -#### 1. 修复路由配置冲突 - -**文件**: `lib/main.dart` - -**当前代码:** -```dart -Widget _buildMaterialApp(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: Theme.of(context), - localizationsDelegates: const [...], - builder: (context, child) => ShadAppBuilder(child: child!), - initialRoute: '/', - routes: { - '/': (context) => _buildHome(), - '/login': (context) => const LoginPage(), - '/main': (context) => const MainPage(), - }, - home: _buildHome(), // ❌ 删除这行 - ); -} -``` - -**修复后:** -```dart -Widget _buildMaterialApp(BuildContext context) { - return MaterialApp( - debugShowCheckedModeBanner: false, - theme: Theme.of(context), - localizationsDelegates: const [...], - builder: (context, child) => ShadAppBuilder(child: child!), - initialRoute: '/', - routes: { - '/': (context) => _buildHome(), - '/login': (context) => const LoginPage(), - '/main': (context) => const MainPage(), - }, - // ✅ 移除 home 属性,使用 initialRoute + routes - ); -} -``` - -#### 2. 添加缺失的依赖 - -**文件**: `pubspec.yaml` - -**添加:** -```yaml -dependencies: - flutter_animate: ^4.5.0 -``` - -**或者移除导入:** -```dart -// lib/ui/components/asset_card.dart -// 删除: import 'package:flutter_animate/flutter_animate.dart'; -// 使用: import 'package:shadcn_ui/shadcn_ui.dart'; (已包含) -``` - ---- - -### 🟡 P1 - 尽快修复 - -#### 3. 清理未使用的导入 - -**影响文件:** -- `lib/core/network/dio_client.dart` (1处) -- `lib/providers/asset_provider.dart` (1处) -- `lib/providers/auth_provider.dart` (1处) -- `lib/ui/components/glass_panel.dart` (1处) - -#### 4. 修复已弃用API - -**替换方案:** -```dart -// 旧代码 -color.withOpacity(0.1) - -// 新代码 -color.withValues(alpha: 0.1) -``` - -#### 5. 使用 HTTPS - -**文件**: `lib/core/constants/api_endpoints.dart` - -```dart -static const String baseUrl = _env == 'prod' - ? 'https://8.155.172.147:5010' // ✅ 使用 HTTPS - : 'http://localhost:5010'; -``` - ---- - -### 🟢 P2 - 优化建议 - -1. 清理未使用的字段 (13处) -2. 使用 const 构造器 (30处) -3. 更新依赖到最新版本 (8个包) -4. 添加代码注释和文档 - ---- - -## 📋 部署前检查清单 - -### 本地验证 -- [ ] 修复路由配置冲突 -- [ ] 添加缺失的依赖 -- [ ] 运行 `flutter clean` -- [ ] 运行 `flutter pub get` -- [ ] 运行 `flutter analyze` (无 errors) -- [ ] 本地测试 `flutter run -d chrome` -- [ ] 构建生产版本 `flutter build web --release --dart-define=ENV=prod` - -### 服务器配置 -- [ ] 配置 Nginx MIME 类型 (`application/wasm`) -- [ ] 上传所有构建文件 -- [ ] 检查文件权限 (755) -- [ ] 检查文件所有者 (www:www) -- [ ] 重启 Nginx - -### 部署后验证 -- [ ] 清除浏览器缓存 -- [ ] 访问 http://8.155.172.147:8061 -- [ ] 检查浏览器控制台无错误 -- [ ] 测试登录功能 -- [ ] 测试页面导航 -- [ ] 检查网络请求正常 - ---- - -## 🎯 修复步骤(一键脚本) - -创建修复脚本 `fix_flutter_issues.sh`: - -```bash -#!/bin/bash -set -e - -echo "🔧 开始修复 Flutter 问题..." - -# 1. 修复路由配置 -echo "1️⃣ 修复路由配置..." -sed -i '' '/home: _buildHome(),/d' lib/main.dart - -# 2. 添加缺失依赖 -echo "2️⃣ 添加缺失依赖..." -if ! grep -q "flutter_animate" pubspec.yaml; then - sed -i '' '/shadcn_ui:.*/a\ - flutter_animate: ^4.5.0 -' pubspec.yaml -fi - -# 3. 清理并重新获取依赖 -echo "3️⃣ 清理并重新获取依赖..." -flutter clean -flutter pub get - -# 4. 运行分析 -echo "4️⃣ 运行代码分析..." -flutter analyze - -# 5. 重新构建 -echo "5️⃣ 重新构建 Web 应用..." -flutter build web --release --dart-define=ENV=prod - -echo "✅ 修复完成!" -echo "📦 构建文件位于: build/web" -``` - ---- - -## 📈 改进建议 - -### 短期 (1-2天) -1. ✅ 修复所有 P0 问题 -2. ✅ 清理代码警告 -3. ✅ 完善错误处理 -4. ✅ 添加单元测试 - -### 中期 (1周) -1. 🔄 迁移到 HTTPS -2. 🔄 优化包大小 -3. 🔄 添加性能监控 -4. 🔄 完善日志系统 - -### 长期 (1月) -1. 📋 升级依赖版本 -2. 📋 重构代码架构 -3. 📋 添加 CI/CD -4. 📋 完善文档 - ---- - -## 🚨 当前无法打开的根本原因 - -### 1. **路由配置冲突** (70% 可能性) - - `initialRoute` 和 `home` 同时存在 - - 导致 Flutter 不知道使用哪个作为首页 - -### 2. **WebAssembly 加载失败** (20% 可能性) - - MIME 类型未配置 - - 文件未正确上传 - -### 3. **缺失依赖** (10% 可能性) - - `flutter_animate` 未声明 - - 运行时错误 - ---- - -## ✅ 结论 - -**当前状态**: ⚠️ **不健康 - 需要修复** - -**建议行动**: -1. **立即**: 修复路由配置冲突 -2. **立即**: 添加缺失依赖 -3. **尽快**: 清理代码警告 -4. **重新构建并部署** - -**预期效果**: 修复后健康度可提升至 **90/100** - ---- - -**报告生成时间**: 2026-03-25 09:48:00 -**下次检查建议**: 修复完成后 diff --git a/PROMPT_APPLY_STYLES.md b/PROMPT_APPLY_STYLES.md deleted file mode 100644 index 9322558..0000000 --- a/PROMPT_APPLY_STYLES.md +++ /dev/null @@ -1,306 +0,0 @@ -# 应用新设计系统到 Flutter 项目 - -You are running a development task using the **monisuo-dev skill** workflow. - -## 背景 - -我们已经完成了 Monisuo 项目的现代化改造,现在需要应用一套全新的设计系统,包括: -- Material Design 3 配色方案 -- Space Grotesk + Manrope 字体组合 -- Glass Panel 和 Neon Glow 效果 -- 组件化开发 - -## 参考文件 - -- **Feature Spec**: `docs/features/apply-new-styles.md` (必读) -- **样式参考**: - - `页面样式/交易.txt` - 交易页面完整样式 - - `页面样式/行情.txt` - 行情页面完整样式 - - `页面样式/我的.txt` - 我的页面完整样式 - - `页面样式/充值弹窗.txt` - 充值弹窗样式 - - `页面样式/提现弹窗.txt` - 提现弹窗样式 - -## 任务要求 - -### ✅ 必须遵守 -1. **不破坏现有 API 接口** - 所有接口调用保持不变 -2. **不修改业务逻辑** - 只更新 UI/UX -3. **不修改数据模型** - Model 类保持不变 -4. **渐进式更新** - 分步骤更新,避免大规模重构 - -### 🎯 核心任务 - -#### Phase 1: 创建设计系统和基础组件 (2小时) - -1. **更新颜色系统** (`lib/core/theme/app_color_scheme.dart`) - - 添加 Material Design 3 颜色 - - Primary: #72dcff (青色) - - Secondary: #dd8bfb (紫色) - - Tertiary: #afffd1 (绿色) - - Error: #ff716c (红色) - - Surface 系列: #0b0e14, #161a21, #1c2028, #22262f - -2. **更新字体系统** (`lib/core/theme/app_theme.dart`) - - 添加 Google Fonts 依赖 - - Space Grotesk (标题) - - Manrope (正文) - - 配置 TextTheme - -3. **创建 GlassPanel 组件** (`lib/ui/components/glass_panel.dart`) - ```dart - class GlassPanel extends StatelessWidget { - final Widget child; - final double blur; - final Color? backgroundColor; - final BorderRadius? borderRadius; - - // 实现毛玻璃效果 - } - ``` - -4. **创建 NeonGlow 组件** (`lib/ui/components/neon_glow.dart`) - ```dart - class NeonGlow extends StatelessWidget { - final Widget child; - final Color glowColor; - final double blurRadius; - - // 实现霓虹光效 - } - ``` - -#### Phase 2: 更新页面样式 (3小时) - -5. **更新交易页面** (`lib/ui/pages/trade/trade_page.dart`) - - 应用新的颜色系统 - - 使用 GlassPanel 组件 - - 添加 NeonGlow 效果 - - 保持现有 API 调用不变 - -6. **更新行情页面** (`lib/ui/pages/market/market_page.dart`) - - 应用新的卡片样式 - - 使用新的颜色系统 - - 保持现有列表逻辑 - -7. **更新我的页面** (`lib/ui/pages/mine/mine_page.dart`) - - 应用新的卡片样式 - - 使用新的颜色系统 - - 保持现有功能 - -8. **更新充值弹窗** (`lib/ui/pages/asset/asset_page.dart`) - - 应用新的弹窗样式 - - 使用 GlassPanel - - 保持现有逻辑 - -9. **更新提现弹窗** (`lib/ui/pages/asset/asset_page.dart`) - - 应用新的弹窗样式 - - 使用 GlassPanel - - 保持现有逻辑 - -#### Phase 3: 测试和优化 (1小时) - -10. **运行 Flutter Analyze** - ```bash - cd flutter_monisuo - flutter analyze - ``` - - 确保 0 errors - - 修复 warnings - -11. **测试应用** - ```bash - flutter run -d chrome - ``` - - 测试所有页面显示正常 - - 测试主题切换功能 - - 验证 API 调用正常 - -12. **优化性能** - - 检查毛玻璃效果性能 - - 优化不必要的重建 - - 确保流畅度 - -#### Phase 4: 构建和部署 (0.5小时) - -13. **构建生产版本** - ```bash - flutter build web --release --dart-define=ENV=prod - ``` - -14. **提交代码** - ```bash - git add . - git commit -m "feat(ui): 应用新设计系统 - - - 更新颜色系统为 Material Design 3 - - 添加 Space Grotesk 和 Manrope 字体 - - 创建 GlassPanel 和 NeonGlow 组件 - - 更新所有页面样式 - - 保持现有 API 接口不变" - - git push - ``` - -## 设计系统详情 - -### 颜色系统 (Material Design 3) - -```dart -// Primary (青色) -primary: #72dcff -primaryDim: #00c3ed -primaryContainer: #00d2ff - -// Secondary (紫色) -secondary: #dd8bfb -secondaryDim: #ce7eec -secondaryContainer: #6e208c - -// Tertiary (绿色) -tertiary: #afffd1 -tertiaryDim: #00efa0 -tertiaryContainer: #00ffab - -// Error (红色) -error: #ff716c -errorDim: #d7383b -errorContainer: #9f0519 - -// Surface (深色背景) -background: #0b0e14 -surface: #0b0e14 -surfaceDim: #0b0e14 -surfaceBright: #282c36 -surfaceContainerLowest: #000000 -surfaceContainerLow: #10131a -surfaceContainer: #161a21 -surfaceContainerHigh: #1c2028 -surfaceContainerHighest: #22262f - -// On Surface (文字) -onSurface: #ecedf6 -onSurfaceVariant: #a9abb3 -outline: #73757d -outlineVariant: #45484f -``` - -### 字体系统 - -```dart -// Headline (标题) -fontFamily: Space Grotesk -fontWeight: 300-700 - -// Body (正文) -fontFamily: Manrope -fontWeight: 300-700 - -// Label (标签) -fontFamily: Manrope -fontWeight: 500-700 -``` - -### 组件样式 - -#### GlassPanel (毛玻璃效果) -```css -background: rgba(34, 38, 47, 0.4) -backdrop-filter: blur(20px) -border: 1px solid rgba(69, 72, 79, 0.15) -``` - -#### NeonGlow (霓虹光效) -```css -/* Primary Glow */ -box-shadow: 0 0 20px rgba(114, 220, 255, 0.15) - -/* Secondary Glow */ -box-shadow: 0 0 20px rgba(221, 139, 251, 0.15) - -/* Tertiary Glow */ -box-shadow: 0 0 25px rgba(175, 255, 209, 0.2) -``` - -## 执行规则 - -1. **严格遵循 Phase 顺序** - 不要跳跃 -2. **增量提交** - 每完成一个 Phase 就提交 -3. **保持兼容性** - 不破坏现有功能 -4. **测试验证** - 每个阶段都要测试 -5. **文档更新** - 更新 CHANGELOG - -## 完成标准 - -当所有任务完成时: -- ✅ 所有页面使用新设计系统 -- ✅ **深色主题样式完整** -- ✅ **亮色主题样式完整** -- ✅ **主题切换功能正常** -- ✅ flutter analyze 0 errors -- ✅ 应用运行正常 -- ✅ API 调用正常 -- ✅ 代码已提交 - -### ⚠️ 重要提示:必须支持明暗主题 - -**深色主题 (Dark Theme)** -- 背景:深色 (#0b0e14, #161a21) -- 文字:亮色 (#ecedf6, #a9abb3) -- GlassPanel:深色半透明 -- NeonGlow:明亮效果 - -**亮色主题 (Light Theme)** -- 背景:浅色 (#FFFFFF, #FAFAFA) -- 文字:深色 (#0b0e14, #161a21) -- GlassPanel:浅色半透明 -- NeonGlow:柔和效果 - -**实现方式**: -- 在 `app_color_scheme.dart` 中定义 `lightShad` 和 `darkShad` -- 在 `app_theme.dart` 中定义 `lightTheme` 和 `darkTheme` -- 使用 `ThemeProvider` (已存在) 进行主题切换 -- 所有组件必须响应主题变化 - -### ⚠️ 重要提示:必须使用中文 - -**所有UI文字必须使用中文**: -- ✅ 按钮文字:Buy → 买入,Sell → 卖出 -- ✅ 标签文字:Price → 价格,Amount → 数量 -- ✅ 提示文字:Available → 可用,Fee → 手续费 -- ✅ 页面标题:Trade → 交易,Market → 行情,Assets → 资产 -- ✅ 弹窗标题:Deposit → 充值,Withdraw → 提现 -- ✅ 状态文字:Completed → 已完成,Pending → 待处理 - -**参考翻译**: -``` -Trade → 交易 -Market → 行情 -Assets → 资产 -Profile → 我的 -Buy → 买入 -Sell → 卖出 -Price → 价格 -Amount → 数量 -Total → 总计 -Fee → 手续费 -Available → 可用 -Balance → 余额 -Deposit → 充值 -Withdraw → 提现 -Order → 订单 -History → 历史 -Search → 搜索 -All → 全部 -Hot → 热门 -Favorites → 收藏 -Real-time → 实时 -24h High → 24小时最高 -24h Low → 24小时最低 -24h Vol → 24小时成交量 -Place Buy Order → 下买单 -Place Sell Order → 下卖单 -``` - ---- - -**开始执行吧!让 Monisuo 拥有最现代化的 UI!** 🚀✨ diff --git a/PROMPT_CLEAN_CODE.md b/PROMPT_CLEAN_CODE.md deleted file mode 100644 index 76dfc60..0000000 --- a/PROMPT_CLEAN_CODE.md +++ /dev/null @@ -1,242 +0,0 @@ -# Clean Code 优化 - 最近提交的文件 - -You are running a development task using the **clean-code skill** to optimize recently modified files. - -## 任务目标 - -使用 Clean Code 原则优化最近提交的前后端文件,提升代码质量和可维护性。 - -## 参考文件 - -- **Clean Code 技能**: `.agents/skills/clean-code/SKILL.md` (必读) -- **Flutter 风格指南**: Effective Dart -- **Java 风格指南**: 阿里巴巴 Java 开发手册 - -## 需要优化的文件 - -### Flutter 前端文件 (10个) - -**核心文件**: -1. `flutter_monisuo/lib/core/theme/app_color_scheme.dart` - 颜色系统 -2. `flutter_monisuo/lib/ui/pages/home/home_page.dart` - 首页 -3. `flutter_monisuo/lib/ui/pages/main/main_page.dart` - 主页面 -4. `flutter_monisuo/lib/ui/pages/market/market_page.dart` - 行情页面 -5. `flutter_monisuo/lib/ui/pages/trade/trade_page.dart` - 交易页面 -6. `flutter_monisuo/lib/ui/pages/asset/asset_page.dart` - 资产页面 -7. `flutter_monisuo/lib/ui/pages/mine/mine_page.dart` - 我的页面 - -**组件文件**: -8. `flutter_monisuo/lib/ui/components/asset_card.dart` - 资产卡片 -9. `flutter_monisuo/lib/ui/components/glass_panel.dart` - 毛玻璃面板 -10. `flutter_monisuo/lib/ui/components/neon_glow.dart` - 霓虹光效 - -### Java 后端文件 (可选) - -如果发现 Java 文件需要优化,也可以一并处理。 - -## 优化重点 - -### 1. 有意义的命名 -```dart -// ❌ 坏 -final d = DateTime.now(); -final c = colorScheme; - -// ✅ 好 -final currentDate = DateTime.now(); -final colorScheme = Theme.of(context).colorScheme; -``` - -### 2. 函数优化 -```dart -// ❌ 坏 - 函数太长 -Widget build(BuildContext context) { - // 100+ 行代码... -} - -// ✅ 好 - 拆分为小函数 -Widget build(BuildContext context) { - return Column( - children: [ - _buildHeader(context), - _buildContent(context), - _buildFooter(context), - ], - ); -} - -Widget _buildHeader(BuildContext context) { ... } -Widget _buildContent(BuildContext context) { ... } -Widget _buildFooter(BuildContext context) { ... } -``` - -### 3. 减少嵌套 -```dart -// ❌ 坏 - 嵌套太深 -if (user != null) { - if (user.isActive) { - if (user.hasPermission) { - // ... - } - } -} - -// ✅ 好 - 提前返回 -if (user == null) return; -if (!user.isActive) return; -if (!user.hasPermission) return; - -// ... -``` - -### 4. 提取常量 -```dart -// ❌ 坏 - 魔法数字 -padding: EdgeInsets.all(16), -borderRadius: BorderRadius.circular(12), - -// ✅ 好 - 使用常量 -padding: EdgeInsets.all(AppSpacing.md), -borderRadius: BorderRadius.circular(AppRadius.lg), -``` - -### 5. 移除重复代码 -```dart -// ❌ 坏 - 重复代码 -Text('首页', style: TextStyle(fontSize: 12, color: colorScheme.primary)), -Text('行情', style: TextStyle(fontSize: 12, color: colorScheme.primary)), - -// ✅ 好 - 提取为函数 -Text('首页', style: _labelStyle(context)), -Text('行情', style: _labelStyle(context)), - -TextStyle _labelStyle(BuildContext context) { - return TextStyle( - fontSize: 12, - color: Theme.of(context).colorScheme.primary, - ); -} -``` - -### 6. 添加必要注释 -```dart -// ❌ 坏 - 多余注释 -// 设置文字颜色 -color: colorScheme.primary - -// ✅ 好 - 解释为什么 -// 使用 primary 颜色而不是 onSurface,确保在浅色主题下也有足够对比度 -color: colorScheme.primary -``` - -## 执行规则 - -1. **逐个文件优化** - 不要批量修改 -2. **保持功能不变** - 只优化代码结构,不改变逻辑 -3. **保持中文字符** - 不要修改任何中文文字 -4. **使用 AppSpacing 和 AppRadius** - 替换硬编码的数字 -5. **拆分大函数** - 函数超过 50 行就拆分 -6. **减少嵌套层级** - 不超过 3 层嵌套 -7. **提取重复代码** - DRY 原则 - -## 优化流程 - -### Phase 1: Flutter 核心页面 (60分钟) - -**优先级 P0**: -1. `home_page.dart` - 首页 -2. `main_page.dart` - 主页面 -3. `mine_page.dart` - 我的页面 - -**优先级 P1**: -4. `market_page.dart` - 行情页面 -5. `trade_page.dart` - 交易页面 -6. `asset_page.dart` - 资产页面 - -**每个文件优化步骤**: -- 检查函数长度,拆分大函数 -- 检查嵌套层级,减少嵌套 -- 提取重复代码 -- 使用 AppSpacing/AppRadius 替换魔法数字 -- 优化命名 -- 添加必要注释 - -### Phase 2: 组件文件 (30分钟) - -7. `asset_card.dart` -8. `glass_panel.dart` -9. `neon_glow.dart` -10. `app_color_scheme.dart` - -### Phase 3: 测试验证 (15分钟) - -11. **运行代码分析** - ```bash - flutter analyze - ``` - - 确保 0 errors - -12. **测试应用** - ```bash - flutter run -d chrome - ``` - - 验证所有功能正常 - - 验证主题切换正常 - -### Phase 4: 提交代码 (10分钟) - -13. **提交优化后的代码** - ```bash - git add . - git commit -m "refactor: 使用 Clean Code 原则优化代码质量 - - - 拆分大函数为小函数 - - 减少嵌套层级 - - 提取重复代码 - - 使用 AppSpacing/AppRadius 替换魔法数字 - - 优化命名和添加注释 - - 提升代码可读性和可维护性" - - git push - ``` - -## Clean Code 检查清单 - -每个文件优化后,检查以下项: - -- [ ] 函数长度 < 50 行 -- [ ] 嵌套层级 ≤ 3 层 -- [ ] 没有魔法数字 -- [ ] 没有重复代码 -- [ ] 命名清晰有意义 -- [ ] 添加了必要注释 -- [ ] 单一职责原则 -- [ ] DRY 原则 - -## 注意事项 - -### ⚠️ 必须保持 -- ✅ 所有功能不变 -- ✅ 所有中文字符不变 -- ✅ 所有 API 调用不变 -- ✅ 主题切换功能正常 - -### ❌ 禁止操作 -- ❌ 修改业务逻辑 -- ❌ 修改 API 接口 -- ❌ 修改数据模型 -- ❌ 删除现有功能 -- ❌ 修改中文文字 - -## 完成标准 - -- ✅ 所有文件优化完成 -- ✅ flutter analyze 0 errors -- ✅ 所有功能正常 -- ✅ 代码可读性提升 -- ✅ 代码可维护性提升 -- ✅ 所有中文文字保持不变 - ---- - -**开始执行吧!让代码更干净、更优雅!** 🧹✨ diff --git a/PROMPT_THEME_FIX.md b/PROMPT_THEME_FIX.md deleted file mode 100644 index 5bb59ae..0000000 --- a/PROMPT_THEME_FIX.md +++ /dev/null @@ -1,201 +0,0 @@ -# 修复主题切换 - 动态颜色系统 - -You are running a development task using the **monisuo-dev skill** workflow. - -## 问题诊断 - -当前代码存在严重问题: -- ❌ **所有颜色都是硬编码的** `AppColorScheme.dark*` -- ❌ **主题切换功能不生效** -- ❌ **只有深色主题,没有浅色主题** - -## 目标 - -修复主题切换功能,确保所有页面支持明暗主题动态切换。 - -## 参考文件 - -- **Feature Spec**: `docs/features/theme-dynamic-colors.md` (必读) -- **ThemeProvider**: `lib/providers/theme_provider.dart` (已存在) -- **颜色系统**: `lib/core/theme/app_color_scheme.dart` - -## 任务清单 - -### Phase 1: 检查 ThemeProvider (15分钟) - -1. **检查 ThemeProvider 实现** - ```dart - // lib/providers/theme_provider.dart - - 确保主题切换逻辑正确 - - 确保持久化工作正常 - ``` - -2. **检查主题配置** - ```dart - // lib/core/theme/app_theme.dart - - 确保 lightTheme 和 darkTheme 都已定义 - - 确保 ShadTheme 配置正确 - ``` - -### Phase 2: 修复所有页面的颜色 (90分钟) - -3. **替换所有硬编码颜色** - - **通用替换规则**: - ```dart - // ❌ 错误 - 硬编码 - AppColorScheme.darkBackground - AppColorScheme.darkOnSurface - AppColorScheme.darkPrimary - AppColorScheme.darkSecondary - // ... 等等 - - // ✅ 正确 - 动态 - Theme.of(context).colorScheme.background - Theme.of(context).colorScheme.onSurface - Theme.of(context).colorScheme.primary - Theme.of(context).colorScheme.secondary - ``` - -4. **需要修改的文件**(按优先级): - - **P0 - 主要页面**: - - `lib/ui/pages/home/home_page.dart` - - `lib/ui/pages/market/market_page.dart` - - `lib/ui/pages/trade/trade_page.dart` - - `lib/ui/pages/asset/asset_page.dart` - - `lib/ui/pages/mine/mine_page.dart` - - **P1 - 订单页面**: - - `lib/ui/pages/orders/orders_page.dart` - - `lib/ui/pages/orders/fund_order_card.dart` - - `lib/ui/pages/orders/fund_orders_list.dart` - - `lib/ui/pages/orders/fund_orders_page.dart` - - **P2 - 组件**: - - `lib/ui/components/glass_panel.dart` - - `lib/ui/components/neon_glow.dart` - - `lib/ui/components/gradient_button.dart` - - `lib/ui/components/asset_card.dart` - - `lib/ui/components/coin_card.dart` - - `lib/ui/components/trade_button.dart` - -5. **特殊处理**: - - **GlassPanel**: 需要根据主题调整透明度 - - **NeonGlow**: 需要根据主题调整光效强度 - - **渐变按钮**: 需要根据主题调整渐变色 - -### Phase 3: 测试验证 (15分钟) - -6. **运行代码分析** - ```bash - flutter analyze - ``` - - 确保 0 errors - -7. **测试主题切换** - ```bash - flutter run -d chrome - ``` - - 测试深色主题 - - 测试浅色主题 - - 测试主题切换动画 - - 验证所有页面响应主题变化 - -8. **视觉验证** - - 检查对比度(WCAG AA 标准) - - 检查颜色一致性 - - 检查主题切换流畅度 - -### Phase 4: 构建部署 (10分钟) - -9. **构建生产版本** - ```bash - flutter build web --release --dart-define=ENV=prod - ``` - -10. **提交代码** - ```bash - git add . - git commit -m "fix(ui): 修复主题切换功能,支持明暗主题动态切换 - - - 替换所有硬编码颜色为动态颜色 - - 所有页面使用 Theme.of(context) - - 支持深色和浅色主题切换 - - 修复 GlassPanel 和 NeonGlow 组件的主题适配 - - 测试主题切换功能正常" - - git push - ``` - -## 颜色映射表 - -| 硬编码颜色 | 动态颜色 | -|-----------|---------| -| `AppColorScheme.darkBackground` | `Theme.of(context).colorScheme.background` | -| `AppColorScheme.darkOnSurface` | `Theme.of(context).colorScheme.onSurface` | -| `AppColorScheme.darkOnSurfaceVariant` | `Theme.of(context).colorScheme.onSurfaceVariant` | -| `AppColorScheme.darkPrimary` | `Theme.of(context).colorScheme.primary` | -| `AppColorScheme.darkSecondary` | `Theme.of(context).colorScheme.secondary` | -| `AppColorScheme.darkTertiary` | `Theme.of(context).colorScheme.tertiary` | -| `AppColorScheme.darkSurface` | `Theme.of(context).colorScheme.surface` | -| `AppColorScheme.darkSurfaceBright` | `Theme.of(context).colorScheme.surfaceBright` | -| `AppColorScheme.darkSurfaceContainer` | `Theme.of(context).colorScheme.surfaceContainer` | -| `AppColorScheme.darkSurfaceHigh` | `Theme.of(context).colorScheme.surfaceContainerHigh` | -| `AppColorScheme.darkOutline` | `Theme.of(context).colorScheme.outline` | -| `AppColorScheme.darkOutlineVariant` | `Theme.of(context).colorScheme.outlineVariant` | -| `AppColorScheme.neonGlowPrimary` | `Theme.of(context).colorScheme.primary.withOpacity(0.15)` | - -## 特殊组件处理 - -### GlassPanel - -```dart -// ❌ 错误 -color: AppColorScheme.darkSurfaceBright.withValues(alpha: 0.4) - -// ✅ 正确 -color: Theme.of(context).colorScheme.surfaceBright.withOpacity( - Theme.of(context).brightness == Brightness.dark ? 0.4 : 0.6 -) -``` - -### NeonGlow - -```dart -// ❌ 错误 -BoxShadow( - color: AppColorScheme.neonGlowPrimary, - blurRadius: 15, -) - -// ✅ 正确 -BoxShadow( - color: Theme.of(context).colorScheme.primary.withOpacity( - Theme.of(context).brightness == Brightness.dark ? 0.15 : 0.08 - ), - blurRadius: 15, -) -``` - -## 执行规则 - -1. **逐个文件修改** - 不要批量修改 -2. **测试每个页面** - 修改完一个页面就测试 -3. **保持功能不变** - 只修改颜色,不修改逻辑 -4. **确保主题切换流畅** - 避免闪烁 -5. **保持中文字符** - 不要修改任何中文文字 - -## 完成标准 - -- ✅ 所有页面使用动态颜色 -- ✅ 主题切换功能正常 -- ✅ 深色主题显示正常 -- ✅ 浅色主题显示正常 -- ✅ flutter analyze 0 errors -- ✅ 所有功能正常 -- ✅ 所有中文文字保持不变 - ---- - -**开始执行吧!让主题切换功能正常工作!** 🚀🎨 diff --git a/PUSH_IMPLEMENTATION_GUIDE.md b/PUSH_IMPLEMENTATION_GUIDE.md deleted file mode 100644 index 3ce3dfe..0000000 --- a/PUSH_IMPLEMENTATION_GUIDE.md +++ /dev/null @@ -1,411 +0,0 @@ -# Monisuo 推送功能实现指南 - -## 概述 - -本文档详细说明如何在Monisuo虚拟货币交易平台中实现推送通知功能。 - -## 架构设计 - -### 1. 推送服务选择 - -**推荐方案**: 极光推送 (JPush) - -**理由**: -- 国内推送到达率高(>95%) -- 支持iOS和Android双平台 -- 提供完整的Flutter SDK -- 免费版支持100万条/月 -- 提供REST API和SDK两种方式 - -**备选方案**: 个推 (Getui) - -## 2. 系统架构 - -``` -[管理员审批] → [后端服务] → [JPush服务器] → [用户手机] - ↓ ↓ ↓ ↓ - 创建推送任务 调用JPush API 推送消息 显示通知 -``` - -## 3. 实现步骤 - -### 步骤1: 注册极光推送 - -1. 访问 https://www.jiguang.cn/ -2. 注册账号并登录 -3. 创建应用 -4. 获取AppKey和Master Secret - -### 步骤2: 后端集成 - -#### 2.1 添加依赖 - -```xml - - cn.jpush - jpush-client - 3.5.8 - -``` - -#### 2.2 配置文件 - -```yaml -# application.yml -jpush: - app-key: your-app-key - master-secret: your-master-secret - production: false # 开发环境使用false -``` - -#### 2.3 推送服务类 - -```java -package com.it.rattan.monisuo.service; - -import cn.jiguang.common.resp.DefaultResult; -import cn.jpush.api.JPushClient; -import cn.jpush.api.push.PushResult; -import cn.jpush.api.push.model.Message; -import cn.jpush.api.push.model.Notification; -import cn.jpush.api.push.model.Platform; -import cn.jpush.api.push.model.PushPayload; -import cn.jpush.api.push.model.audience.Audience; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.util.Map; - -@Service -public class JPushService { - - @Value("${jpush.app-key}") - private String appKey; - - @Value("${jpush.master-secret}") - private String masterSecret; - - @Value("${jpush.production}") - private boolean production; - - private JPushClient jPushClient; - - public JPushService() { - jPushClient = new JPushClient(masterSecret, appKey); - } - - /** - * 向指定用户发送推送 - */ - public void sendToUser(String userId, String title, String content, Map extras) { - try { - PushPayload payload = PushPayload.newBuilder() - .setPlatform(Platform.all()) - .setAudience(Audience.alias(userId)) - .setNotification(Notification.alert(content)) - .setMessage(Message.content(content).setExtras(extras)) - .setOptions(cn.jpush.api.push.model.Options.newBuilder() - .setApnsProduction(production) - .build()) - .build(); - - PushResult result = jPushClient.sendPush(payload); - - if (result.statusCode == 200) { - System.out.println("推送成功: " + result.msgId); - } else { - System.err.println("推送失败: " + result.statusCode); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** - * 向所有用户发送推送 - */ - public void sendToAll(String title, String content) { - try { - PushPayload payload = PushPayload.newBuilder() - .setPlatform(Platform.all()) - .setAudience(Audience.all()) - .setNotification(Notification.alert(content)) - .build(); - - jPushClient.sendPush(payload); - } catch (Exception e) { - e.printStackTrace(); - } - } -} -``` - -#### 2.4 推送控制器 - -```java -package com.it.rattan.monisuo.controller; - -import com.it.rattan.monisuo.common.Result; -import com.it.rattan.monisuo.service.JPushService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.HashMap; -import java.util.Map; - -@RestController -@RequestMapping("/api/push") -public class PushController { - - @Autowired - private JPushService jPushService; - - /** - * 发送充值审批通知 - */ - @PostMapping("/deposit/approval") - public Result sendDepositApproval( - @RequestParam String userId, - @RequestParam String orderNo, - @RequestParam String amount, - @RequestParam boolean approved) { - - String title = approved ? "充值审批通过" : "充值审批驳回"; - String content = approved - ? "您的充值订单已审批通过,金额: " + amount + " USDT" - : "您的充值订单已被驳回,金额: " + amount + " USDT"; - - Map extras = new HashMap<>(); - extras.put("type", "order"); - extras.put("orderNo", orderNo); - extras.put("approved", String.valueOf(approved)); - - jPushService.sendToUser(userId, title, content, extras); - - return Result.success("推送成功"); - } - - /** - * 发送提现审批通知 - */ - @PostMapping("/withdraw/approval") - public Result sendWithdrawApproval( - @RequestParam String userId, - @RequestParam String orderNo, - @RequestParam String amount, - @RequestParam boolean approved) { - - String title = approved ? "提现审批通过" : "提现审批驳回"; - String content = approved - ? "您的提现申请已处理,金额: " + amount + " USDT" - : "您的提现申请已被驳回,金额: " + amount + " USDT"; - - Map extras = new HashMap<>(); - extras.put("type", "order"); - extras.put("orderNo", orderNo); - extras.put("approved", String.valueOf(approved)); - - jPushService.sendToUser(userId, title, content, extras); - - return Result.success("推送成功"); - } -} -``` - -### 步骤3: 在审批流程中集成推送 - -修改 `FundService.approve()` 方法: - -```java -@Transactional -public void approve(...) { - // ... 原有审批逻辑 ... - - // 审批成功后发送推送 - if (order.getType() == 1) { - // 充值审批 - jPushService.sendToUser( - order.getUserId().toString(), - status == 2 ? "充值审批通过" : "充值审批驳回", - "订单号: " + orderNo + ", 金额: " + order.getAmount() + " USDT", - Map.of("type", "order", "orderNo", orderNo) - ); - } else { - // 提现审批 - jPushService.sendToUser( - order.getUserId().toString(), - status == 2 ? "提现审批通过" : "提现审批驳回", - "订单号: " + orderNo + ", 金额: " + order.getAmount() + " USDT", - Map.of("type", "order", "orderNo", orderNo) - ); - } -} -``` - -## 4. 推送场景设计 - -### 场景1: 充值审批通过 - -```json -{ - "userId": "5", - "title": "充值审批通过", - "content": "您的充值订单已审批通过,金额: 100 USDT", - "extras": { - "type": "order", - "orderNo": "F20260324001", - "approved": "true" - } -} -``` - -**触发时机**: 管理员点击"审批通过"按钮后 - -### 场景2: 提现审批驳回 - -```json -{ - "userId": "5", - "title": "提现审批驳回", - "content": "您的提现申请已被驳回,金额: 50 USDT", - "extras": { - "type": "order", - "orderNo": "F20260324002", - "approved": "false", - "reason": "余额不足" - } -} -``` - -**触发时机**: 管理员点击"审批驳回"按钮后 - -### 场景3: 系统公告 - -```json -{ - "title": "系统维护通知", - "content": "系统将于今晚22:00-23:00进行维护,届时暂停服务", - "extras": { - "type": "announcement" - } -} -``` - -**触发时机**: 后台管理页面发布系统公告 - -## 5. 测试方法 - -### 5.1 本地测试 - -1. **启动后端服务** -```bash -cd ~/Desktop/projects/monisuo -mvn spring-boot:run -``` - -2. **发送测试推送** -```bash -curl -X POST http://localhost:5010/api/push/deposit/approval \ - -H "Content-Type: application/json" \ - -d "userId=5&orderNo=F20260324001&amount=100&approved=true" -``` - -3. **检查推送日志** -```bash -tail -f logs/app.log | grep "推送" -``` - -### 5.2 极光推送控制台测试 - -1. 登录极光推送控制台 -2. 选择应用 -3. 点击"推送" -> "发送通知" -4. 选择"别名"推送 -5. 输入用户别名(userId) -6. 填写标题和内容 -7. 点击"立即发送" - -## 6. 监控与统计 - -### 6.1 推送统计 - -在极光推送控制台可以查看: -- 推送到达率 -- 推送打开率 -- 推送失败原因 -- 用户活跃度 - -### 6.2 日志记录 - -在 `application.yml` 中添加: - -```yaml -logging: - level: - com.it.rattan.monisuo.service.JPushService: DEBUG -``` - -## 7. 费用估算 - -### 7.1 免费版 -- 100万条推送/月 -- 适用于中小规模应用 -- 基本统计功能 - -### 7.2 付费版 -- 无限制推送 -- 高级统计功能 -- 优先技术支持 - -**推荐**: 初期使用免费版,用户量增长后再考虑升级 - -## 8. 安全性考虑 - -### 8.1 API密钥保护 -- AppKey和Master Secret不要提交到Git -- 使用环境变量或配置中心管理 - -### 8.2 推送内容审核 -- 敏感词过滤 -- 内容长度限制 - -### 8.3 推送频率限制 -- 避免频繁推送打扰用户 -- 设置推送间隔(如1分钟内不重复推送) - -## 9. 最佳实践 - -### 9.1 推送时机 -- 充值/提现审批:立即推送 -- 系统公告:定时推送 -- 资产变动:延迟推送(汇总后推送) - -### 9.2 推送内容 -- 标题简洁明了(<20字) -- 内容包含关键信息(订单号、金额等) -- 避免过度营销 - -### 9.3 错误处理 -- 推送失败时记录日志 -- 重大通知支持重试 -- 提供站内信作为备选 - -## 10. 后续优化 - -### 10.1 站内信系统 -- 推送失败时存入数据库 -- 用户可以在应用内查看历史消息 - -### 10.2 推送模板 -- 使用模板管理推送内容 -- 支持多语言推送 - -### 10.3 推送策略 -- 根据用户活跃度调整推送频率 -- 支持用户自定义推送设置 - ---- - -**文档版本**: V1.0 -**最后更新**: 2026-03-24 -**作者**: Monisuo开发团队 diff --git a/STACKOVERFLOW_FIX_REPORT.md b/STACKOVERFLOW_FIX_REPORT.md deleted file mode 100644 index 545e472..0000000 --- a/STACKOVERFLOW_FIX_REPORT.md +++ /dev/null @@ -1,185 +0,0 @@ -# StackOverflowError 修复报告 - -**修复时间**: 2026-03-24 00:33 -**修复人员**: AI Subagent -**项目路径**: ~/Desktop/projects/monisuo - -## 🔍 问题分析 - -### 原始问题 -多个核心接口报 StackOverflowError: -- /api/asset/overview -- /api/asset/trade -- /api/asset/fund -- /api/fund/deposit - -### 根本原因 -1. **Lombok @Data 注解问题**: 所有实体类使用了 @Data 注解,会自动生成 toString()、equals()、hashCode() 方法,可能导致循环调用 -2. **Jackson 序列化配置不完善**: 缺少防止循环引用的配置 - -## ✅ 修复内容 - -### 1. 实体类修复(共 9 个文件) - -将所有实体类的 `@Data` 替换为 `@Getter` + `@Setter`,避免 toString() 可能导致的循环调用: - -| 文件 | 修改内容 | -|------|---------| -| User.java | @Data → @Getter + @Setter | -| AccountFund.java | @Data → @Getter + @Setter | -| AccountTrade.java | @Data → @Getter + @Setter | -| OrderFund.java | @Data → @Getter + @Setter | -| Coin.java | @Data → @Getter + @Setter | -| AccountFlow.java | @Data → @Getter + @Setter | -| Admin.java | @Data → @Getter + @Setter + @JsonIgnore on password | -| OrderTrade.java | @Data → @Getter + @Setter | -| ColdWallet.java | @Data → @Getter + @Setter | - -### 2. DTO 类修复(共 2 个文件) - -| 文件 | 修改内容 | -|------|---------| -| DepositRequest.java | @Data → @Getter + @Setter | -| WithdrawRequest.java | @Data → @Getter + @Setter | - -### 3. 公共类修复(共 2 个文件) - -| 文件 | 修改内容 | -|------|---------| -| Result.java | @Data → @Getter + @Setter | -| UserContext.java | @Data → @Getter + @Setter | - -### 4. Jackson 配置优化 - -优化了 `JacksonConfig.java`,简化配置以适配 Spring Boot 2.2.4 版本: -- 移除了不兼容的 `WRITE_SELF_REFERENCES_AS_NULL` 配置 -- 保留了核心的序列化配置 -- 确保与 Jackson 2.10.x 版本兼容 - -## 📊 修复效果 - -### 编译结果 -``` -[INFO] BUILD SUCCESS -[INFO] Total time: 1.560 s -``` - -### 修改统计 -- **修改文件数**: 14 个 -- **添加注解**: @Getter, @Setter -- **移除注解**: @Data -- **新增注解**: @JsonIgnore (Admin.password) - -## 🎯 修复原理 - -### 为什么 @Data 会导致 StackOverflowError? - -Lombok 的 @Data 注解会生成: -- @Getter -- @Setter -- @ToString -- @EqualsAndHashCode -- @RequiredArgsConstructor - -其中,`@ToString` 和 `@EqualsAndHashCode` 可能导致问题: -1. 如果实体类有自引用或相互引用,toString() 会无限递归 -2. equals() 和 hashCode() 也可能陷入循环调用 - -### 解决方案 - -使用 `@Getter` + `@Setter` 代替 `@Data`: -- ✅ 保留 getter/setter 功能 -- ✅ 避免 toString() 循环调用 -- ✅ 避免 equals/hashCode 问题 -- ✅ 更安全、更可控 - -## 🧪 测试建议 - -### 1. 启动服务 -```bash -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar -``` - -### 2. 测试接口 -```bash -# 测试资产总览 -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/overview - -# 测试交易账户 -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/trade - -# 测试资金账户 -curl -H "Authorization: Bearer " http://localhost:8080/api/asset/fund - -# 测试充值 -curl -X POST -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"amount": 100}' \ - http://localhost:8080/api/fund/deposit -``` - -### 3. 验证结果 -- ✅ 所有接口正常响应,无 StackOverflowError -- ✅ 返回的 JSON 数据格式正确 -- ✅ 性能正常,无异常日志 - -## 📝 注意事项 - -### 1. 不要恢复 @Data 注解 -- 即使将来修改实体类,也不要恢复 @Data 注解 -- 始终使用 @Getter + @Setter - -### 2. 新增实体类规范 -- 新增实体类时,使用 @Getter + @Setter -- 不要使用 @Data -- 如果需要 toString(),手动添加并排除可能循环的字段 - -### 3. 如果需要 @ToString -```java -@Getter -@Setter -@ToString(exclude = {"problematicField"}) -public class SomeEntity { - // ... -} -``` - -### 4. 如果需要 @EqualsAndHashCode -```java -@Getter -@Setter -@EqualsAndHashCode(exclude = {"problematicField"}) -public class SomeEntity { - // ... -} -``` - -## 🔄 回滚方案 - -如果修复后出现其他问题,可以通过 Git 回滚: - -```bash -cd ~/Desktop/projects/monisuo -git status # 查看修改的文件 -git diff # 查看具体修改 -git checkout -- . # 回滚所有修改(谨慎使用) -``` - -## ✨ 总结 - -本次修复彻底解决了 StackOverflowError 问题,通过以下措施: - -1. **根本原因修复**: 将所有实体类的 @Data 替换为 @Getter + @Setter -2. **安全增强**: 为敏感字段添加 @JsonIgnore 注解 -3. **配置优化**: 简化 Jackson 配置,确保兼容性 -4. **代码规范**: 建立了新的实体类编写规范 - -**修复状态**: ✅ 已完成 -**编译状态**: ✅ 成功 -**待测试**: ⏳ 需要在有 Java 环境的机器上测试 - ---- - -**最后更新**: 2026-03-24 00:33 -**文档版本**: v1.0 diff --git a/START_HERE.md b/START_HERE.md deleted file mode 100644 index 2b85b7d..0000000 --- a/START_HERE.md +++ /dev/null @@ -1,125 +0,0 @@ -# 🚀 快速开始 - 审批订单测试指南 - -## ⚡ 一键测试(推荐) - -```bash -cd ~/Desktop/projects/monisuo -./one_click_test.sh -``` - -这个脚本会自动: -1. ✅ 编译项目 -2. ✅ 停止旧进程 -3. ✅ 启动新服务 -4. ✅ 运行完整测试 -5. ✅ 显示测试结果 - -## 📊 手动测试 - -### 1. 编译和启动 -```bash -cd ~/Desktop/projects/monisuo -mvn clean package -DskipTests -java -jar target/monisuo-1.0.jar -``` - -### 2. 运行测试(另一个终端) -```bash -cd ~/Desktop/projects/monisuo -./diagnose_approval.sh -``` - -## 🔍 查看日志 - -### 实时查看日志 -```bash -# 如果使用 one_click_test.sh -tail -f /tmp/monisuo_test.log - -# 查看审批相关日志 -grep -A 50 "审批订单开始" /tmp/monisuo_test.log -``` - -### 日志关键信息 -``` -==================== 审批订单开始 ==================== -[AdminController] 接收到的完整参数: {...} -[FundService.approve] 步骤1: 查询订单... -[FundService.approve] 步骤2: 查询资金账户... -[FundService.approve] 步骤3: 确定最终状态: 3 -[FundService.approve] 步骤4: 处理审批通过逻辑... -[FundService.approve] 步骤5: 更新订单状态... - - 订单更新结果: 1 (1=成功, 0=失败) -[FundService.approve] 步骤6: 验证更新结果... - - 状态验证通过 ✓ -``` - -## ✅ 成功标志 - -如果看到以下信息,说明测试成功: - -1. **测试脚本输出**: - ``` - ✅✅✅ 订单状态更新成功!状态 = 3 (已完成) - ✅✅✅ 余额增加正确! - ``` - -2. **控制台日志**: - ``` - - 订单更新结果: 1 (1=成功, 0=失败) - - 账户更新结果: 1 (1=成功, 0=失败) - - 状态验证通过 ✓ - ``` - -## ❌ 如果失败 - -### 检查点1: 订单更新结果 -``` -如果看到: 订单更新结果: 0 (1=成功, 0=失败) -说明: 数据库更新失败 -解决: 检查数据库连接、订单ID是否正确 -``` - -### 检查点2: 账户更新结果 -``` -如果看到: 账户更新结果: 0 (1=成功, 0=失败) -说明: 资金账户更新失败 -解决: 检查用户ID、账户是否存在 -``` - -### 检查点3: 状态验证失败 -``` -如果看到: 状态验证失败! -说明: 更新成功但立即查询状态不对 -解决: 可能是事务问题或缓存问题 -``` - -## 📞 需要帮助? - -如果测试失败,请提供: -1. 完整的控制台日志(复制粘贴) -2. 测试脚本的输出 -3. 数据库查询结果(如果可能) - -## 📝 测试前准备 - -确保: -- [ ] 有待审批的订单(充值待确认 或 提现待审批) -- [ ] 数据库连接正常 -- [ ] 端口 5010 未被占用 - -## 🎯 预期行为 - -### 充值订单审批 -- 审批前: status = 2 (待确认) -- 审批后: status = 3 (已完成) -- 资金变化: 用户余额 += 充值金额 - -### 提现订单审批 -- 审批前: status = 1 (待审批) -- 审批后: status = 2 (已完成) -- 资金变化: 用户冻结 -= 提现金额 - ---- - -**开始测试**: `./one_click_test.sh` 或 `./diagnose_approval.sh` diff --git a/TEST_README.md b/TEST_README.md deleted file mode 100644 index 68b37a6..0000000 --- a/TEST_README.md +++ /dev/null @@ -1,167 +0,0 @@ -# 测试脚本使用说明 - -## 快速开始 - -### 1. 确保服务正在运行 - -```bash -# 检查服务状态 -curl http://localhost:8080/health - -# 如果未运行,启动服务 -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar -``` - -### 2. 运行测试 - -#### 方式一:快速测试(推荐) -```bash -cd ~/Desktop/projects/monisuo -./test_approve_fix.sh -``` - -这个脚本会: -- 自动登录管理员账号 -- 查询待审批订单 -- 执行审批操作 -- 验证订单状态和余额 - -#### 方式二:完整测试 -```bash -cd ~/Desktop/projects/monisuo -./test_complete_flow.sh -``` - -这个脚本会执行更详细的测试,包括: -- 服务状态检查 -- 审批前余额记录 -- 审批操作 -- 审批后余额验证 -- 详细测试报告 - -### 3. 查看测试结果 - -测试脚本会输出详细的测试过程和结果: - -``` -✓ 所有测试通过! - -测试结果汇总: -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -1. ✓ 订单状态更新正确 - 充值订单: 待确认(2) → 已完成(3) - -2. ✓ 用户余额变化正确 - 余额: 50.00 → 150.00 USDT (+100.00) - -3. ✓ 资金流水记录已生成 -━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ -``` - -## 手动测试 - -如果没有待审批订单,可以手动创建: - -### 1. 用户登录 -```bash -curl -X POST http://localhost:8080/api/user/login \ - -H "Content-Type: application/json" \ - -d '{"username":"testuser","password":"password"}' -``` - -### 2. 申请充值 -```bash -curl -X POST http://localhost:8080/api/fund/deposit \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"amount":100}' -``` - -### 3. 确认打款 -```bash -curl -X POST http://localhost:8080/api/fund/confirm \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"orderNo":"F20260324001"}' -``` - -### 4. 管理员审批 -```bash -curl -X POST http://localhost:8080/admin/order/approve \ - -H "Authorization: Bearer " \ - -H "Content-Type: application/json" \ - -d '{"orderNo":"F20260324001","status":2,"adminRemark":"审批通过"}' -``` - -## 测试数据 - -### 默认管理员账号 -- 用户名: `admin` -- 密码: `admin123` - -### 测试订单状态 -- 充值订单: - - 1 = 待付款 - - 2 = 待确认(用户已确认打款) - - 3 = 已完成(管理员审批通过)✅ - - 4 = 已驳回 - - 5 = 已取消 - -- 提现订单: - - 1 = 待审批 - - 2 = 已完成(管理员审批通过)✅ - - 3 = 已驳回 - - 4 = 已取消 - -## 常见问题 - -### Q1: 测试脚本报错 "服务未运行" -**A**: 先启动后端服务: -```bash -cd ~/Desktop/projects/monisuo -java -jar target/monisuo-1.0.jar -``` - -### Q2: 没有待审批订单 -**A**: 先创建测试订单: -1. 用户登录 -2. 申请充值 -3. 确认打款 -4. 再次运行测试脚本 - -### Q3: 登录失败 -**A**: 检查数据库中是否有管理员账号,默认账号是 `admin/admin123` - -### Q4: 余额未变化 -**A**: 检查日志输出,确认审批操作是否成功执行 - -## 日志查看 - -### 查看应用日志 -```bash -# 如果使用 nohup 启动 -tail -f nohup.out - -# 或者直接查看控制台输出 -``` - -### 关键日志 -``` -[充值审批] 订单号: xxx, 用户ID: xxx, 充值金额: xxx, 审批前余额: xxx, 审批后余额: xxx -[审批完成] 订单号: xxx, 订单类型: 充值, 审批结果: 通过, 最终状态: 3, 审批人: 管理员 -``` - -## 修复验证清单 - -- [ ] 服务正常启动 -- [ ] 管理员登录成功 -- [ ] 查询到待审批订单 -- [ ] 审批操作成功 -- [ ] 订单状态正确(充值:3, 提现:2) -- [ ] 用户余额正确变化 -- [ ] 资金流水记录生成 - -## 联系方式 - -如有问题,请查看修复报告:`APPROVAL_FIX_REPORT.md` diff --git a/check_cold_wallet.md b/check_cold_wallet.md deleted file mode 100644 index 9a77ae2..0000000 --- a/check_cold_wallet.md +++ /dev/null @@ -1,216 +0,0 @@ -# 充值功能检查报告 - -## 🔍 问题诊断 - -### ❌ 核心问题:缺少 `cold_wallet` 表 - -**数据库初始化脚本 `sql/init.sql` 中没有创建 `cold_wallet` 表** - -#### 影响: -1. **后端报错**: `ColdWalletService.getDefaultWallet()` 返回 `null` -2. **接口失败**: 充值接口返回 "系统暂未配置充值地址" -3. **前端异常**: 用户无法看到充值钱包地址 - ---- - -## ✅ 已修复内容 - -### 1. 更新数据库初始化脚本 - -**文件**: `sql/init.sql` - -**新增内容**: -```sql --- 11. 冷钱包地址表 -CREATE TABLE `cold_wallet` ( - `id` bigint(20) NOT NULL AUTO_INCREMENT, - `name` varchar(50) NOT NULL COMMENT '钱包名称', - `address` varchar(255) NOT NULL COMMENT '钱包地址', - `network` varchar(20) NOT NULL DEFAULT 'TRC20' COMMENT '网络类型', - `is_default` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否默认', - `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - --- 插入默认测试钱包 -INSERT INTO `cold_wallet` VALUES -('USDT-TRC20 主钱包', 'TRX1234567890abcdefghijklmnopqrstuvwxyz1234', 'TRC20', 1, 1); -``` - -### 2. 创建补丁脚本 - -**文件**: `sql/patch_cold_wallet.sql` - -用于已有数据库的增量更新。 - -### 3. 补充 order_fund 表字段 - -**新增字段**: -- `wallet_id` - 关联冷钱包ID -- `wallet_address` - 钱包地址(冗余) -- `withdraw_contact` - 提现联系方式 -- `pay_time` - 用户打款时间 -- `confirm_time` - 确认/审批时间 - ---- - -## 📋 执行步骤 - -### 方式一:全新安装 - -```bash -# 1. 创建数据库 -mysql -u root -p -e "CREATE DATABASE monisuo DEFAULT CHARSET utf8mb4;" - -# 2. 执行初始化脚本(已包含 cold_wallet 表) -mysql -u root -p monisuo < sql/init.sql -``` - -### 方式二:已有数据库(推荐) - -```bash -# 执行补丁脚本 -mysql -u monisuo -p monisuo < sql/patch_cold_wallet.sql -``` - -### 方式三:手动执行 SQL - -```sql --- 连接数据库 -mysql -u monisuo -p monisuo - --- 执行以下 SQL(从 sql/patch_cold_wallet.sql 复制) -CREATE TABLE `cold_wallet` (...); -INSERT INTO `cold_wallet` VALUES (...); -ALTER TABLE `order_fund` ADD COLUMN ...; -``` - ---- - -## 🧪 测试验证 - -### 1. 数据库验证 - -```sql --- 检查表是否创建成功 -SHOW TABLES LIKE 'cold_wallet'; - --- 检查默认钱包数据 -SELECT * FROM cold_wallet WHERE is_default = 1; - --- 检查 order_fund 表结构 -DESC order_fund; -``` - -### 2. 接口测试 - -```bash -# 运行测试脚本 -./test_deposit_api.sh -``` - -### 3. 前端测试 - -1. 启动后端服务 -2. 登录前端应用 -3. 进入"资产"页面 -4. 点击"充值"按钮 -5. 输入充值金额 -6. 检查是否显示钱包地址 - ---- - -## 🎯 充值流程说明 - -### 用户端流程 - -``` -1. 用户申请充值 - POST /api/fund/deposit - 参数: { amount: "100", remark: "充值" } - -2. 系统返回充值信息 - 返回: { - orderNo: "FD20260323...", - walletAddress: "TRX123...", - walletNetwork: "TRC20", - amount: "100" - } - -3. 用户线下打款到指定地址 - -4. 用户确认已打款 - POST /api/fund/confirmPay - 参数: { orderNo: "FD20260323..." } - -5. 等待管理员审批 - 订单状态: 待确认 (status=2) -``` - -### 管理员审批流程 - -``` -1. 查看待审批订单 - GET /admin/fund/orders?status=2 - -2. 审批通过/驳回 - POST /admin/fund/approve - 参数: { - orderNo: "FD20260323...", - status: 2, // 2=通过, 3=驳回 - rejectReason: "驳回原因", - adminRemark: "管理员备注" - } - -3. 审批通过后自动入账 - - 用户余额增加 - - 记录资金流水 -``` - ---- - -## 📊 订单状态流转 - -### 充值订单 - -``` -申请充值 → 待付款(1) → 用户确认打款 → 待确认(2) → 管理员审批 - ↓ - 已完成(3) / 已驳回(4) - -用户可随时取消 → 已取消(5) -``` - -### 提现订单 - -``` -申请提现 → 待审批(1) → 管理员审批 → 已完成(2) / 已驳回(3) - ↓ - 驳回后自动解冻余额 - -用户可随时取消 → 已取消(4) -``` - ---- - -## ⚠️ 注意事项 - -1. **冷钱包必须配置**: 至少要有一个 `is_default=1, status=1` 的钱包地址 -2. **权限验证**: 所有充值接口需要用户登录(Token 验证) -3. **金额验证**: 充值金额必须大于 0 -4. **事务安全**: 所有资金操作使用事务(@Transactional) -5. **数据冗余**: order_fund 表中冗余了 wallet_address,避免关联查询 - ---- - -## 🚀 下一步建议 - -1. ✅ **立即执行**: 运行 `sql/patch_cold_wallet.sql` 补丁 -2. ✅ **重启后端**: 确保新表结构生效 -3. ✅ **运行测试**: 执行 `./test_deposit_api.sh` 验证 -4. ✅ **前端测试**: 在资产页面测试充值功能 - ---- - -**生成时间**: 2026-03-23 18:10 -**修复状态**: ✅ 代码已修复,等待数据库补丁执行 diff --git a/check_database.sh b/check_database.sh deleted file mode 100755 index 5f5401b..0000000 --- a/check_database.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash -# ============================================= -# 数据库检查脚本 -# ============================================= - -DB_HOST="8.155.172.147" -DB_PORT="3306" -DB_NAME="monisuo" -DB_USER="monisuo" -DB_PASS="JPJ8wYicSGC8aRnk" - -echo "==========================================" -echo "Monisuo 数据库检查" -echo "==========================================" -echo "" - -# 检查 cold_wallet 表是否存在 -echo "【1】检查 cold_wallet 表是否存在..." -mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME -e "SHOW TABLES LIKE 'cold_wallet';" 2>/dev/null - -if [ $? -eq 0 ]; then - echo "✅ cold_wallet 表存在" - - echo "" - echo "【2】检查默认钱包地址..." - mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME -e "SELECT id, name, address, network, is_default, status FROM cold_wallet WHERE is_default=1 AND status=1;" 2>/dev/null - - echo "" - echo "【3】检查所有钱包..." - mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME -e "SELECT id, name, network, is_default, status FROM cold_wallet;" 2>/dev/null -else - echo "❌ cold_wallet 表不存在,需要执行补丁脚本" - echo "" - echo "执行命令:" - echo "mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME < sql/patch_cold_wallet.sql" -fi - -echo "" -echo "【4】检查 order_fund 表结构..." -mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME -e "DESC order_fund;" 2>/dev/null | grep -E "wallet|pay_time|confirm_time|withdraw_contact" - -echo "" -echo "==========================================" -echo "检查完成" -echo "==========================================" diff --git a/check_status.sh b/check_status.sh deleted file mode 100755 index 82310d2..0000000 --- a/check_status.sh +++ /dev/null @@ -1,32 +0,0 @@ -#!/bin/bash - -# 检查订单状态脚本 - -BASE_URL="http://localhost:5010" - -# 管理员登录 -echo "管理员登录..." -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.data.token') - -# 查询订单详情 -echo "" -echo "查询订单 F20260324013123000002 详情..." -ORDER1=$(curl -s -X GET "$BASE_URL/admin/order/list?pageNum=1&pageSize=20&type=1&status=2" \ - -H "Authorization: Bearer $TOKEN") - -echo "$ORDER1" | jq '.data.list[] | select(.orderNo == "F20260324013123000002") | {orderNo, status, approveTime, confirmTime}' - -echo "" -echo "查询订单 F202603240004937000000 详情..." -echo "$ORDER1" | jq '.data.list[] | select(.orderNo == "F202603240004937000000") | {orderNo, status, approveTime, confirmTime}' - -echo "" -echo "查询用户 5 的账户余额..." -USER_DETAIL=$(curl -s -X GET "$BASE_URL/admin/user/detail?userId=5" \ - -H "Authorization: Bearer $TOKEN") - -echo "$USER_DETAIL" | jq '.data.fund | {balance, frozen, totalDeposit, totalWithdraw}' diff --git a/deploy/build_local.sh b/deploy/build_local.sh index 7e0d0cb..56f8a87 100644 --- a/deploy/build_local.sh +++ b/deploy/build_local.sh @@ -20,7 +20,7 @@ build_flutter() { flutter pub get log "1.2 构建 Web..." - flutter build web --release + flutter build apk --release --dart-define=ENV=prod if [ ! -d "build/web" ]; then log "❌ Flutter 构建失败" diff --git a/deploy_flutter_web.sh b/deploy_flutter_web.sh deleted file mode 100755 index 142da82..0000000 --- a/deploy_flutter_web.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/bin/bash -# ============================================ -# Flutter Web 部署脚本 - 解决 WASM 加载问题 -# ============================================ -set -e - -PROJECT_DIR="/www/wwwroot/monisuo" -FLUTTER_WEB_DIR="/www/wwwroot/monisuo-h5" - -echo "🚀 开始部署 Flutter Web..." - -# 1. 进入项目目录 -cd $PROJECT_DIR - -# 2. 拉取最新代码 -echo "📥 拉取最新代码..." -git fetch origin -git reset --hard origin/main - -# 3. 清理旧文件 -echo "🗑️ 清理旧文件..." -rm -rf $FLUTTER_WEB_DIR/* - -# 4. 复制新构建文件 -echo "📦 复制构建文件..." -cp -r $PROJECT_DIR/flutter_monisuo/build/web/* $FLUTTER_WEB_DIR/ - -# 5. 检查关键文件 -echo "✅ 检查关键文件..." -ls -lh $FLUTTER_WEB_DIR/main.dart.js -ls -lh $FLUTTER_WEB_DIR/canvaskit/canvaskit.wasm - -# 6. 设置权限 -echo "🔐 设置权限..." -chown -R www:www $FLUTTER_WEB_DIR -chmod -R 755 $FLUTTER_WEB_DIR - -# 7. 检查 Nginx 配置(如果需要) -echo "📋 检查 Nginx MIME 类型配置..." -NGINX_CONF="/www/server/nginx/conf/mime.types" -if grep -q "application/wasm" $NGINX_CONF; then - echo "✅ WASM MIME 类型已配置" -else - echo "⚠️ 需要添加 WASM MIME 类型到 Nginx 配置" - echo "请在 $NGINX_CONF 中添加:" - echo " application/wasm wasm;" -fi - -echo "✅ Flutter Web 部署完成!" -echo "🌐 访问地址: http://8.155.172.147:8061" diff --git a/diagnose_approval.sh b/diagnose_approval.sh deleted file mode 100755 index f99ee28..0000000 --- a/diagnose_approval.sh +++ /dev/null @@ -1,223 +0,0 @@ -#!/bin/bash - -# 审批订单完整诊断脚本 -# 检查所有可能的问题点 - -BASE_URL="http://localhost:5010" - -echo "==========================================" -echo "审批订单完整诊断" -echo "==========================================" -echo "" - -# 检查后端服务是否运行 -echo "1. 检查后端服务..." -if curl -s --connect-timeout 2 "${BASE_URL}/actuator/health" > /dev/null 2>&1; then - echo "✅ 后端服务正在运行" -else - echo "⚠️ 后端服务可能未运行或健康检查端点不可用" - echo " 尝试连接: ${BASE_URL}" -fi -echo "" - -# 登录 -echo "2. 管理员登录..." -LOGIN_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -if echo "${LOGIN_RESPONSE}" | grep -q '"token"'; then - echo "✅ 登录成功" - TOKEN=$(echo ${LOGIN_RESPONSE} | grep -o '"token":"[^"]*"' | cut -d'"' -f4) -else - echo "❌ 登录失败" - echo "响应: ${LOGIN_RESPONSE}" - exit 1 -fi -echo "" - -# 查询待审批订单 -echo "3. 查询待审批订单..." -PENDING=$(curl -s -X GET "${BASE_URL}/admin/order/pending?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer ${TOKEN}") - -echo "响应预览: " -echo "${PENDING}" | python3 -m json.tool 2>/dev/null | head -30 -echo "" - -ORDER_COUNT=$(echo ${PENDING} | grep -o '"orderNo"' | wc -l | tr -d ' ') -echo "找到 ${ORDER_COUNT} 个待审批订单" -echo "" - -if [ "$ORDER_COUNT" -eq 0 ]; then - echo "⚠️ 没有待审批订单,创建测试订单步骤:" - echo " 1. 用户登录小程序" - echo " 2. 创建充值订单" - echo " 3. 用户确认打款" - echo " 4. 重新运行此脚本" - exit 0 -fi - -# 选择第一个订单 -ORDER_NO=$(echo ${PENDING} | grep -o '"orderNo":"[^"]*"' | head -1 | cut -d'"' -f4) -ORDER_TYPE=$(echo ${PENDING} | grep -A 10 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"type":[0-9]*' | head -1 | cut -d':' -f2) -ORDER_STATUS=$(echo ${PENDING} | grep -A 10 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) -USER_ID=$(echo ${PENDING} | grep -A 10 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"userId":[0-9]*' | head -1 | cut -d':' -f2) -AMOUNT=$(echo ${PENDING} | grep -A 10 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"amount":[0-9.]*' | head -1 | cut -d':' -f2) - -echo "选择测试订单:" -echo " 订单号: ${ORDER_NO}" -echo " 类型: ${ORDER_TYPE} (1=充值, 2=提现)" -echo " 当前状态: ${ORDER_STATUS}" -echo " 用户ID: ${USER_ID}" -echo " 金额: ${AMOUNT}" -echo "" - -# 验证订单状态是否可审批 -echo "4. 验证订单状态..." -if [ "$ORDER_TYPE" = "1" ]; then - if [ "$ORDER_STATUS" = "2" ]; then - echo "✅ 充值订单状态正确(待确认)" - else - echo "❌ 充值订单状态不正确(需要状态2,实际${ORDER_STATUS})" - exit 1 - fi -else - if [ "$ORDER_STATUS" = "1" ]; then - echo "✅ 提现订单状态正确(待审批)" - else - echo "❌ 提现订单状态不正确(需要状态1,实际${ORDER_STATUS})" - exit 1 - fi -fi -echo "" - -# 查询用户资金账户(审批前) -echo "5. 查询用户资金账户(审批前)..." -USER_DETAIL=$(curl -s -X GET "${BASE_URL}/admin/user/detail?userId=${USER_ID}" \ - -H "Authorization: Bearer ${TOKEN}") - -BALANCE_BEFORE=$(echo ${USER_DETAIL} | grep -o '"balance":[0-9.]*' | head -1 | cut -d':' -f2) -FROZEN_BEFORE=$(echo ${USER_DETAIL} | grep -o '"frozen":[0-9.]*' | head -1 | cut -d':' -f2) - -echo "审批前资金账户:" -echo " 余额: ${BALANCE_BEFORE}" -echo " 冻结: ${FROZEN_BEFORE}" -echo "" - -# 执行审批 -echo "==========================================" -echo "6. 执行审批操作(通过)" -echo "==========================================" -echo "重要:请观察后端控制台日志输出!" -echo "" - -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 "审批响应:" -echo "${APPROVE_RESPONSE}" | python3 -m json.tool 2>/dev/null || echo "${APPROVE_RESPONSE}" -echo "" - -if echo "${APPROVE_RESPONSE}" | grep -q '"code":"0"'; then - echo "✅ 审批接口返回成功" -else - echo "❌ 审批接口返回失败" - exit 1 -fi -echo "" - -# 等待并验证 -echo "7. 等待2秒后验证结果..." -sleep 2 -echo "" - -# 查询订单状态(审批后) -echo "8. 查询订单状态(审批后)..." -ORDER_LIST=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer ${TOKEN}") - -NEW_STATUS=$(echo ${ORDER_LIST} | grep -A 20 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) - -echo "订单新状态: ${NEW_STATUS}" -if [ "$ORDER_TYPE" = "1" ]; then - EXPECTED_STATUS="3" - STATUS_TEXT="已完成" -else - EXPECTED_STATUS="2" - STATUS_TEXT="已完成" -fi - -if [ "$NEW_STATUS" = "$EXPECTED_STATUS" ]; then - echo "✅✅✅ 订单状态更新成功!状态 = ${NEW_STATUS} (${STATUS_TEXT})" -else - echo "❌ 订单状态更新失败!期望 ${EXPECTED_STATUS},实际 ${NEW_STATUS}" -fi -echo "" - -# 查询用户资金账户(审批后) -echo "9. 查询用户资金账户(审批后)..." -USER_DETAIL_AFTER=$(curl -s -X GET "${BASE_URL}/admin/user/detail?userId=${USER_ID}" \ - -H "Authorization: Bearer ${TOKEN}") - -BALANCE_AFTER=$(echo ${USER_DETAIL_AFTER} | grep -o '"balance":[0-9.]*' | head -1 | cut -d':' -f2) -FROZEN_AFTER=$(echo ${USER_DETAIL_AFTER} | grep -o '"frozen":[0-9.]*' | head -1 | cut -d':' -f2) - -echo "审批后资金账户:" -echo " 余额: ${BALANCE_AFTER}" -echo " 冻结: ${FROZEN_AFTER}" -echo "" - -# 验证余额变化 -if [ "$ORDER_TYPE" = "1" ]; then - # 充值:余额应该增加 - echo "验证充值订单余额变化:" - echo " 审批前余额: ${BALANCE_BEFORE}" - echo " 审批后余额: ${BALANCE_AFTER}" - echo " 充值金额: ${AMOUNT}" - - # 使用 awk 进行浮点数计算 - BALANCE_DIFF=$(awk "BEGIN {print ${BALANCE_AFTER} - ${BALANCE_BEFORE}}") - echo " 余额变化: ${BALANCE_DIFF}" - - if [ "$(awk "BEGIN {print (${BALANCE_DIFF} == ${AMOUNT})}")" = "1" ]; then - echo "✅✅✅ 余额增加正确!" - else - echo "⚠️ 余额变化与充值金额不匹配" - fi -else - # 提现:冻结应该减少 - echo "验证提现订单冻结变化:" - echo " 审批前冻结: ${FROZEN_BEFORE}" - echo " 审批后冻结: ${FROZEN_AFTER}" - echo " 提现金额: ${AMOUNT}" - - FROZEN_DIFF=$(awk "BEGIN {print ${FROZEN_BEFORE} - ${FROZEN_AFTER}}") - echo " 冻结变化: ${FROZEN_DIFF}" - - if [ "$(awk "BEGIN {print (${FROZEN_DIFF} == ${AMOUNT})}")" = "1" ]; then - echo "✅✅✅ 冻结减少正确!" - else - echo "⚠️ 冻结变化与提现金额不匹配" - fi -fi -echo "" - -echo "==========================================" -echo "诊断完成" -echo "==========================================" -echo "" -echo "📋 检查清单:" -echo " 1. 后端控制台是否有详细日志输出?" -echo " 2. 订单状态是否正确更新?" -echo " 3. 用户资金账户是否正确变化?" -echo " 4. 是否有任何错误或异常?" -echo "" -echo "如果所有检查都通过,说明审批功能正常工作!" -echo "如果有任何失败,请查看后端控制台日志以获取详细信息。" diff --git a/diagnose_db.sh b/diagnose_db.sh deleted file mode 100755 index f667447..0000000 --- a/diagnose_db.sh +++ /dev/null @@ -1,72 +0,0 @@ -#!/bin/bash -# 数据库诊断脚本 - 检查订单审批状态 - -MYSQL_HOST="8.155.172.147" -MYSQL_USER="monisuo" -MYSQL_PASS="JPJ8wYicSGC8aRnk" -MYSQL_DB="monisuo" - -echo "==========================================" -echo "订单审批数据库诊断" -echo "==========================================" - -echo "" -echo "1. 检查 order_fund 表结构:" -echo "------------------------------------------" -mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e "DESCRIBE order_fund;" 2>/dev/null - -echo "" -echo "2. 查询所有待审批订单:" -echo "------------------------------------------" -mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e " -SELECT id, order_no, type, - CASE type WHEN 1 THEN '充值' WHEN 2 THEN '提现' END as type_name, - status, - CASE - WHEN type = 1 THEN - CASE status - WHEN 1 THEN '待付款' - WHEN 2 THEN '待确认' - WHEN 3 THEN '已完成' - WHEN 4 THEN '已驳回' - WHEN 5 THEN '已取消' - END - WHEN type = 2 THEN - CASE status - WHEN 1 THEN '待审批' - WHEN 2 THEN '已完成' - WHEN 3 THEN '已驳回' - WHEN 4 THEN '已取消' - END - END as status_name, - amount, approve_admin_id, approve_time, update_time -FROM order_fund -ORDER BY create_time DESC -LIMIT 10; -" 2>/dev/null - -echo "" -echo "3. 查询最近更新的订单:" -echo "------------------------------------------" -mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e " -SELECT id, order_no, status, approve_admin_id, approve_admin_name, approve_time, update_time -FROM order_fund -WHERE update_time IS NOT NULL -ORDER BY update_time DESC -LIMIT 5; -" 2>/dev/null - -echo "" -echo "4. 检查 account_fund 表:" -echo "------------------------------------------" -mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -e " -SELECT id, user_id, balance, frozen, total_deposit, total_withdraw, update_time -FROM account_fund -ORDER BY update_time DESC -LIMIT 5; -" 2>/dev/null - -echo "" -echo "==========================================" -echo "诊断完成" -echo "==========================================" diff --git a/diagnostic_report.sh b/diagnostic_report.sh deleted file mode 100755 index bff970f..0000000 --- a/diagnostic_report.sh +++ /dev/null @@ -1,93 +0,0 @@ -#!/bin/bash - -# 完整的审批功能测试报告生成器 - -echo "==========================================" -echo "Monisuo 审批功能诊断报告" -echo "生成时间: $(date '+%Y-%m-%d %H:%M:%S')" -echo "==========================================" -echo "" - -BASE_URL="http://localhost:5010" - -# 1. 管理员登录 -echo "[1] 管理员登录" -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.data.token') - -if [ -z "$TOKEN" ] || [ "$TOKEN" = "null" ]; then - echo "✗ 管理员登录失败" - exit 1 -fi - -echo "✓ 管理员登录成功" -echo "" - -# 2. 查询所有充值订单(状态=2) -echo "[2] 查询所有状态=2的充值订单" -ORDERS_RESPONSE=$(curl -s -X GET "$BASE_URL/admin/order/list?type=1&status=2&pageNum=1&pageSize=20" \ - -H "Authorization: Bearer $TOKEN") - -echo "$ORDERS_RESPONSE" | jq -r '.data.list[] | "订单号: \(.orderNo), 金额: \(.amount), 状态: \(.status), 审批时间: \(.approveTime // "无"), 确认时间: \(.confirmTime // "无")"' - -TOTAL=$(echo "$ORDERS_RESPONSE" | jq -r '.data.total') -echo "" -echo "待确认订单总数(API返回): $TOTAL" -echo "" - -# 3. 查询用户5的账户信息 -echo "[3] 查询用户5的账户信息" -USER_DETAIL=$(curl -s -X GET "$BASE_URL/admin/user/detail?userId=5" \ - -H "Authorization: Bearer $TOKEN") - -BALANCE=$(echo "$USER_DETAIL" | jq -r '.data.fund.balance') -FROZEN=$(echo "$USER_DETAIL" | jq -r '.data.fund.frozen') -TOTAL_DEPOSIT=$(echo "$USER_DETAIL" | jq -r '.data.fund.totalDeposit') -TOTAL_WITHDRAW=$(echo "$USER_DETAIL" | jq -r '.data.fund.totalWithdraw') - -echo "余额: $BALANCE USDT" -echo "冻结: $FROZEN USDT" -echo "累计充值: $TOTAL_DEPOSIT USDT" -echo "累计提现: $TOTAL_WITHDRAW USDT" -echo "" - -# 4. 分析问题 -echo "[4] 问题分析" -echo "--------------------" - -# 获取所有状态=2的订单 -ORDER_COUNT=$(echo "$ORDERS_RESPONSE" | jq -r '.data.list | length') - -if [ "$ORDER_COUNT" -gt 0 ]; then - echo "⚠️ 发现 $ORDER_COUNT 个状态=2的充值订单,但部分可能已被审批" - echo "" - - # 检查每个订单 - echo "$ORDERS_RESPONSE" | jq -r '.data.list[] | select(.approveTime != null) | .orderNo' | while read ORDER_NO; do - echo " 订单 $ORDER_NO - 已审批但状态仍为2" - done - - echo "" - echo "【诊断结论】" - echo "1. 订单状态没有正确更新到数据库" - echo "2. 可能原因:" - echo " - MyBatis-Plus updateById 方法执行失败" - echo " - 事务回滚" - echo " - 数据库连接问题" - echo "" - echo "【建议修复】" - echo "1. 检查数据库连接和权限" - echo "2. 检查 MyBatis-Plus 配置" - echo "3. 查看应用日志,确认 updateById 是否执行成功" - echo "4. 添加数据库字段更新日志" -else - echo "✓ 没有发现异常订单" -fi - -echo "" -echo "==========================================" -echo "诊断完成" -echo "==========================================" diff --git a/fix_asset_api.sh b/fix_asset_api.sh deleted file mode 100755 index a623090..0000000 --- a/fix_asset_api.sh +++ /dev/null @@ -1,77 +0,0 @@ -#!/bin/bash - -echo "================================" -echo "修复资产API接口" -echo "================================" - -# 备份原文件 -echo "步骤1: 备份原文件..." -cp src/main/java/com/it/rattan/monisuo/service/AssetService.java \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java.backup - -echo "✅ 备份完成" -echo "" - -# 使用 sed 修改文件 -echo "步骤2: 修改AssetService.java..." - -# 1. 修改 totalAssets -> totalAsset -sed -i '' 's/put("totalAssets"/put("totalAsset"/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -# 2. 修改 tradeValue -> tradeBalance -sed -i '' 's/put("tradeValue"/put("tradeBalance"/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -# 3. 修改变量名 -sed -i '' 's/BigDecimal tradeValue/BigDecimal tradeBalance/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -sed -i '' 's/tradeValue = tradeValue/tradeBalance = tradeBalance/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -sed -i '' 's/tradeValue\.add/tradeBalance.add/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -sed -i '' 's/BigDecimal totalAssets/BigDecimal totalAsset/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -sed -i '' 's/totalAssets = fund/totalAsset = fund/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -sed -i '' 's/\.add(tradeValue)/.add(tradeBalance)/g' \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java - -echo "✅ 修改完成" -echo "" - -# 编译 -echo "步骤3: 编译项目..." -mvn clean package -DskipTests 2>&1 | tail -20 - -if [ $? -eq 0 ]; then - echo "✅ 编译成功" - echo "" - - echo "步骤4: 重启服务..." - pkill -f monisuo-1.0.jar - sleep 2 - - 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 & - - echo "等待服务启动..." - sleep 15 - - echo "✅ 服务已重启" - echo "" - - echo "步骤5: 测试验证..." - ./test_asset_api.sh -else - echo "❌ 编译失败" - echo "恢复备份..." - cp src/main/java/com/it/rattan/monisuo/service/AssetService.java.backup \ - src/main/java/com/it/rattan/monisuo/service/AssetService.java -fi diff --git a/fix_orders.sql b/fix_orders.sql deleted file mode 100644 index 619d1af..0000000 --- a/fix_orders.sql +++ /dev/null @@ -1,28 +0,0 @@ --- 修复现有订单状态 --- 将已审批但状态仍为2的订单更新为状态3(已完成) - -UPDATE order_fund -SET status = 3, - update_time = NOW() -WHERE order_no IN ( - 'F20260324013123000002', - 'F202603240004937000000' -) -AND status = 2 -AND approve_time IS NOT NULL; - --- 验证更新结果 -SELECT - id, - order_no, - type, - status, - amount, - approve_time, - confirm_time, - update_time -FROM order_fund -WHERE order_no IN ( - 'F20260324013123000002', - 'F202603240004937000000' -); diff --git a/flutter_monisuo/PROMPT.md b/flutter_monisuo/PROMPT.md deleted file mode 100644 index 161094b..0000000 --- a/flutter_monisuo/PROMPT.md +++ /dev/null @@ -1,104 +0,0 @@ -# 目标 - -为 Flutter 数字货币应用 (monisuo) 设计并实现一套专业、一致、响应式的主题系统,确保: -- 视觉一致性 -- 良好的可读性 (对比度 >= 4.5:1) -- 响应式布局 -- 专业的金融应用风格 -- **杜绝文字和背景颜色一样无法区分的情况** - -## 参考文件 - -- `specs/theme-design.md` - 主题设计规范 (颜色系统、间距、圆角、文字样式) -- `AGENTS.md` - 项目说明和注意事项 -- `IMPLEMENTATION_PLAN.md` - 实施计划 (Phase 6: 主题系统深度优化) - -## 设计原则 - -1. **一致性** - 所有页面使用统一的设计语言 -2. **可读性** - 确保文字与背景对比度充足 (WCAG AA 标准 >= 4.5:1) -3. **响应式** - 适配不同屏幕尺寸 -4. **专业性** - 符合金融/交易类应用的专业感 -5. **无障碍** - 避免颜色冲突,杜绝文字和背景颜色一样无法区分的情况 - -## 禁止事项 - -- ❌ 文字与背景颜色相同 -- ❌ 低对比度组合 (对比度 < 4.5) -- ❌ 仅用颜色区分状态 -- ❌ 过小的触摸目标 (< 44px) -- ❌ 不一致的组件样式 -- ❌ 硬编码颜色值 - -## 当前任务: Phase 6 主题系统深度优化 - -### P0 - 立即执行 (核心基础) - -1. **6.1 颜色系统重构** - - 重构 `lib/core/constants/app_colors.dart` - - 统一主色调 (#00D4AA 青绿色系) - - 标准化涨跌色 (#00C853 绿 / #FF5252 红) - - 优化背景色层次 (#0F0F1A -> #1A1A2E -> #16213E) - - 清理 `coin_card.dart` 等文件中的硬编码颜色 - -2. **6.4 Shadcn 主题定制** - - 创建自定义 ShadColorScheme (品牌绿色) - - 更新 `main.dart` 使用自定义主题 - -### P1 - 高优先级 - -1. **6.2 文字样式系统** - - 创建 `lib/core/theme/app_text_styles.dart` - - 标题样式 (h1-h4)、正文样式、数字样式 - -2. **6.3 间距与圆角系统** - - 创建 `lib/core/theme/app_spacing.dart` - - 统一间距常量、圆角常量、响应式断点 - -### P2 - 中优先级 - -1. **6.5 组件样式统一** - - 优化按钮、卡片、输入框样式 - -2. **6.6 页面样式优化** - - 所有页面应用新主题系统 - -### P3 - 验证 - -1. **6.7 对比度检查** - - 验证所有文字/背景组合 >= 4.5:1 - -## 完成标准 - -- [ ] 颜色系统完整且无重复定义 -- [ ] 所有文字/背景对比度 >= 4.5:1 -- [ ] 无硬编码颜色值 -- [ ] 统一的间距和圆角系统 -- [ ] 所有页面使用新主题 -- [ ] `flutter analyze` 无错误 -- [ ] 应用可正常运行 - -## 技术栈 - -- Flutter -- shadcn_ui (UI 组件库) -- Lucide Icons - -## 注意事项 - -- ⚠️ **不要修改业务逻辑** -- ⚠️ **不要修改 API 调用** -- ⚠️ **不要修改 Provider 逻辑** -- ⚠️ **不要删除现有功能** -- ⚠️ **确保文字和背景颜色区分明显** -- ⚠️ **每次修改后运行 flutter analyze** - -## 开始指令 - -开始工作: -1. 读取 `specs/theme-design.md` 了解设计规范 -2. 读取 `IMPLEMENTATION_PLAN.md` 了解实施计划 -3. 按 P0 -> P1 -> P2 -> P3 优先级执行 -4. 完成后更新 IMPLEMENTATION_PLAN.md 状态 - -Let's create a professional theme system for the Monisuo Flutter app! 🎨 diff --git a/flutter_monisuo/PROMPT_MODERNIZATION.md b/flutter_monisuo/PROMPT_MODERNIZATION.md deleted file mode 100644 index 82ac8e9..0000000 --- a/flutter_monisuo/PROMPT_MODERNIZATION.md +++ /dev/null @@ -1,169 +0,0 @@ -# Flutter Monisuo 现代化改造 - -You are running a Ralph BUILDING loop for this goal: **将 Flutter Monisuo 应用打造为现代化、简约、专业的虚拟货币交易平台**。 - -## 背景 - -当前应用已完成 shadcn_ui 集成和基础主题配置,但需要全面现代化改造,包括: -1. ✅ 支持明暗主题切换 -2. ✅ 现代化弹窗布局 -3. ✅ 整体布局设计优化 -4. ✅ 统一字号、颜色、间距 -5. ✅ 色彩交互一致性 -6. ✅ 现代化简约风格(Vercel/Linear 风格) - -## 参考文件 - -- `specs/modernization-v2.md` - **现代化设计规范(必读)** -- `specs/theme-design.md` - 原有主题设计 -- `AGENTS.md` - 项目说明和命令 -- `~/.agents/skills/superdesign-flutter/SKILL.md` - Flutter 设计技能 - -## 任务优先级 - -### P0 - 核心基础设施(必须完成) - -1. **明暗主题系统** - - [ ] 创建 `ThemeProvider`(lib/providers/theme_provider.dart) - - [ ] 更新 `main.dart` 使用 `MultiProvider` - - [ ] 创建浅色主题配置(lib/core/theme/light_theme.dart) - - [ ] 更新深色主题配置(lib/core/theme/dark_theme.dart) - - [ ] 在 `mine_page.dart` 添加主题切换开关 - -2. **颜色系统重构** - - [ ] 更新 `lib/core/constants/app_colors.dart` 使用新的颜色定义 - - [ ] 确保所有颜色符合现代设计规范(modernization-v2.md) - - [ ] 移除所有硬编码颜色 - -3. **字体系统集成** - - [ ] 添加 `google_fonts` 到 `pubspec.yaml` - - [ ] 配置 Inter 字体为主字体 - - [ ] 配置 JetBrains Mono 为数字字体 - - [ ] 更新 `app_theme.dart` 使用 Google Fonts - -### P1 - 组件现代化(高优先级) - -4. **间距与圆角系统** - - [ ] 创建 `lib/core/theme/app_spacing.dart`(Spacing 类) - - [ ] 创建 `lib/core/theme/app_border_radius.dart`(BorderRadius 类) - - [ ] 更新所有页面使用统一的间距和圆角 - -5. **按钮组件优化** - - [ ] 更新所有按钮符合现代设计规范 - - [ ] 确保最小触摸目标 44x44 - - [ ] 统一按钮样式(primary/secondary/ghost) - -6. **卡片组件优化** - - [ ] 更新所有卡片使用边框代替阴影 - - [ ] 统一圆角和内边距 - - [ ] 确保背景色正确 - -7. **输入框优化** - - [ ] 统一输入框样式 - - [ ] 优化焦点状态 - - [ ] 确保足够的内边距 - -### P2 - 弹窗现代化(中优先级) - -8. **标准弹窗** - - [ ] 创建现代弹窗模板(lib/ui/shared/modern_dialog.dart) - - [ ] 更新所有 AlertDialog 为现代样式 - - [ ] 统一弹窗圆角和内边距 - -9. **底部抽屉** - - [ ] 创建现代底部抽屉模板(lib/ui/shared/modern_bottom_sheet.dart) - - [ ] 添加拖动指示器 - - [ ] 优化圆角和布局 - -### P3 - 页面优化(标准优先级) - -10. **登录页面** - - [ ] 优化布局和间距 - - [ ] 添加明暗主题支持 - - [ ] 确保输入框和按钮现代化 - -11. **首页** - - [ ] 优化卡片布局 - - [ ] 添加明暗主题支持 - - [ ] 统一间距和圆角 - -12. **行情页** - - [ ] 优化列表项布局 - - [ ] 添加明暗主题支持 - - [ ] 统一间距和圆角 - -13. **交易页** - - [ ] 优化表单布局 - - [ ] 添加明暗主题支持 - - [ ] 统一按钮和输入框 - -14. **资产页** - - [ ] 优化卡片布局 - - [ ] 添加明暗主题支持 - - [ ] 统一间距和圆角 - -15. **我的页面** - - [ ] 添加主题切换开关 - - [ ] 优化列表项布局 - - [ ] 统一间距和圆角 - -### P4 - 验证与优化(低优先级) - -16. **对比度检查** - - [ ] 使用对比度检查工具验证所有文字/背景组合 - - [ ] 确保对比度 >= 4.5:1(WCAG AA) - -17. **响应式布局** - - [ ] 添加响应式断点支持 - - [ ] 测试不同屏幕尺寸 - -18. **动画优化** - - [ ] 添加过渡动画 - - [ ] 确保动画流畅(60fps) - -## 执行规则 - -1. **按优先级执行**:P0 → P1 → P2 → P3 → P4 -2. **增量提交**:每完成一个子任务就提交 -3. **保持功能**:不要破坏现有功能 -4. **遵循规范**:严格遵循 `specs/modernization-v2.md` -5. **测试验证**:每完成一个模块运行 `flutter analyze` - -## 完成标准 - -当所有任务完成时,在 `IMPLEMENTATION_PLAN.md` 中添加: - -``` -STATUS: COMPLETE -``` - -## 注意事项 - -- ❌ **不要修改业务逻辑**(Provider、Service、API) -- ❌ **不要修改数据模型** -- ❌ **不要破坏现有功能** -- ✅ **只修改 UI/UX 相关代码** -- ✅ **保持代码整洁** -- ✅ **添加必要的注释** - -## 提交信息格式 - -``` -feat(ui): <简短描述> - -- <详细说明1> -- <详细说明2> -``` - -示例: -``` -feat(ui): 添加明暗主题切换支持 - -- 创建 ThemeProvider -- 配置浅色和深色主题 -- 在我的页面添加主题切换开关 -``` - ---- - -**开始吧!让 Monisuo 成为最现代化的 Flutter 应用!** 🚀 diff --git a/flutter_monisuo/PROMPT_PHASE2.md b/flutter_monisuo/PROMPT_PHASE2.md deleted file mode 100644 index ba621ac..0000000 --- a/flutter_monisuo/PROMPT_PHASE2.md +++ /dev/null @@ -1,199 +0,0 @@ -# Flutter Monisuo 页面优化(Phase 2) - -You are running a Ralph BUILDING loop for this goal: **完成 P3 和 P4 任务,优化所有页面使用新的设计系统**。 - -## 背景 - -P0、P1、P2 任务已完成: -- ✅ ThemeProvider 和明暗主题切换 -- ✅ 颜色系统(AppColorScheme) -- ✅ 间距与圆角系统(AppSpacing、AppRadius) -- ✅ 现代弹窗和底部抽屉模板 - -现在需要将这些设计系统应用到所有页面。 - -## 参考文件 - -- `specs/modernization-v2.md` - 现代化设计规范(必读) -- `lib/core/theme/app_color_scheme.dart` - 颜色系统 -- `lib/core/theme/app_spacing.dart` - 间距与圆角系统 -- `lib/ui/shared/modern_dialog.dart` - 现代弹窗模板 -- `lib/ui/shared/modern_bottom_sheet.dart` - 现代底部抽屉模板 -- `AGENTS.md` - 项目说明 - -## 任务优先级 - -### P3 - 页面优化(必须完成) - -#### 1. 登录页面 (login_page.dart) -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 确保输入框和按钮符合触摸目标(44x44) -- [ ] 使用 Theme.of(context) 替换硬编码颜色 -- [ ] 添加主题切换支持(浅色/深色) - -#### 2. 首页 (home_page.dart) -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 使用 AppColorScheme 颜色 -- [ ] 优化卡片布局 -- [ ] 添加主题切换支持 - -#### 3. 行情页 (market_page.dart) -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 使用 AppColorScheme 颜色 -- [ ] 优化搜索框和列表项 -- [ ] 添加主题切换支持 - -#### 4. 交易页 (trade_page.dart) -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 使用 AppColorScheme 颜色 -- [ ] 优化表单布局 -- [ ] 添加主题切换支持 - -#### 5. 资产页 (asset_page.dart) -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 使用 AppColorScheme 颜色 -- [ ] 优化卡片布局 -- [ ] 添加主题切换支持 - -#### 6. 我的页面 (mine_page.dart) - 部分完成 -- [ ] 使用 AppSpacing 替换硬编码间距 -- [ ] 使用 AppRadius 替换硬编码圆角 -- [ ] 优化列表项布局 -- [ ] 确保主题切换开关正常工作 - -#### 7. 更新现有弹窗 -- [ ] 查找所有使用 AlertDialog 的地方 -- [ ] 替换为 ModernDialog -- [ ] 或使用 ShadDialog - -### P4 - 验证与优化(高优先级) - -#### 8. 对比度检查 -- [ ] 检查所有文字/背景组合 -- [ ] 确保对比度 >= 4.5:1(WCAG AA) -- [ ] 修复低对比度问题 - -#### 9. 响应式布局 -- [ ] 使用 AppBreakpoints 测试不同屏幕尺寸 -- [ ] 确保移动端和平板端布局正常 - -#### 10. 动画优化(可选) -- [ ] 添加主题切换过渡动画 -- [ ] 添加页面过渡动画 -- [ ] 确保动画流畅(60fps) - -## 执行规则 - -1. **按优先级执行**:先完成所有 P3 页面优化,再进行 P4 验证 -2. **增量提交**:每完成一个页面就提交 -3. **保持功能**:不要破坏现有功能 -4. **遵循规范**:严格遵循 `specs/modernization-v2.md` -5. **使用设计系统**: - - 使用 `AppSpacing` 间距(xs/sm/md/lg/xl/xxl) - - 使用 `AppRadius` 圆角(sm/md/lg/xl/xxl/full) - - 使用 `AppColorScheme` 颜色 - - 使用 `Theme.of(context)` 获取主题 -6. **测试验证**:每完成一个页面运行 `flutter analyze` - -## 代码示例 - -### 使用 AppSpacing -```dart -// ❌ 错误 - 硬编码 -SizedBox(height: 16) -Padding(padding: EdgeInsets.all(16)) - -// ✅ 正确 - 使用 AppSpacing -SizedBox(height: AppSpacing.md) -Padding(padding: EdgeInsets.all(AppSpacing.md)) -Padding(padding: AppSpacing.pagePadding) -``` - -### 使用 AppRadius -```dart -// ❌ 错误 - 硬编码 -BorderRadius.circular(12) - -// ✅ 正确 - 使用 AppRadius -BorderRadius.circular(AppRadius.lg) -AppRadius.radiusLg -``` - -### 使用颜色系统 -```dart -// ❌ 错误 - 硬编码 -color: Color(0xFF00D4AA) - -// ✅ 正确 - 使用 AppColorScheme -color: AppColorScheme.primaryDark -color: AppColorScheme.getChangeColor(isUp) -``` - -### 使用主题 -```dart -// ✅ 正确 - 从主题获取颜色 -final theme = ShadTheme.of(context); -color: theme.colorScheme.primary -style: theme.textTheme.h3 -``` - -## 完成标准 - -当所有任务完成时,在 `IMPLEMENTATION_PLAN.md` 中更新: - -``` -### 7.4 P3 - 页面优化 ✅ -- [x] 7.4.1 登录页面现代化 -- [x] 7.4.2 首页现代化 -- [x] 7.4.3 行情页现代化 -- [x] 7.4.4 交易页现代化 -- [x] 7.4.5 资产页现代化 -- [x] 7.4.6 我的页面现代化 - -### 7.5 P4 - 验证与优化 ✅ -- [x] 7.5.1 对比度检查(WCAG AA >= 4.5:1) -- [x] 7.5.2 响应式布局测试 -- [x] 7.5.3 动画优化 - -STATUS: COMPLETE -``` - -## 注意事项 - -- ❌ **不要修改业务逻辑**(Provider、Service、API) -- ❌ **不要修改数据模型** -- ❌ **不要破坏现有功能** -- ✅ **只修改 UI/UX 相关代码** -- ✅ **保持代码整洁** -- ✅ **使用设计系统常量** -- ✅ **避免硬编码值** - -## 提交信息格式 - -``` -feat(ui): 优化 <页面名称> 使用现代设计系统 - -- 使用 AppSpacing 替换硬编码间距 -- 使用 AppRadius 替换硬编码圆角 -- 使用 AppColorScheme 颜色 -- 添加主题切换支持 -``` - -示例: -``` -feat(ui): 优化登录页面使用现代设计系统 - -- 使用 AppSpacing 替换硬编码间距 -- 使用 AppRadius 替换硬编码圆角 -- 确保触摸目标 >= 44x44 -- 添加主题切换支持 -``` - ---- - -**开始吧!让所有页面都现代化!** 🎨✨ diff --git a/one_click_test.sh b/one_click_test.sh deleted file mode 100755 index 81b03ee..0000000 --- a/one_click_test.sh +++ /dev/null @@ -1,92 +0,0 @@ -#!/bin/bash - -# 一键测试脚本 - 自动编译、启动、测试 - -PROJECT_DIR=~/Desktop/projects/monisuo -JAR_NAME="monisuo-1.0.jar" -PID_FILE="/tmp/monisuo_test.pid" -LOG_FILE="/tmp/monisuo_test.log" - -echo "==========================================" -echo "审批订单一键测试" -echo "==========================================" -echo "" - -# 进入项目目录 -cd ${PROJECT_DIR} - -# 1. 编译项目 -echo "步骤1: 编译项目..." -mvn clean package -DskipTests > /dev/null 2>&1 - -if [ ! -f "target/${JAR_NAME}" ]; then - echo "❌ 编译失败" - exit 1 -fi -echo "✅ 编译成功" -echo "" - -# 2. 停止旧进程 -echo "步骤2: 停止旧进程..." -if [ -f "${PID_FILE}" ]; then - OLD_PID=$(cat ${PID_FILE}) - if ps -p ${OLD_PID} > /dev/null 2>&1; then - echo "停止进程 ${OLD_PID}..." - kill -9 ${OLD_PID} 2>/dev/null - sleep 2 - fi - rm -f ${PID_FILE} -fi -echo "✅ 清理完成" -echo "" - -# 3. 启动服务(后台运行,日志输出到文件) -echo "步骤3: 启动后端服务..." -echo "日志文件: ${LOG_FILE}" -nohup java -jar target/${JAR_NAME} > ${LOG_FILE} 2>&1 & -NEW_PID=$! -echo ${NEW_PID} > ${PID_FILE} -echo "进程ID: ${NEW_PID}" -echo "" - -# 4. 等待服务启动 -echo "步骤4: 等待服务启动..." -MAX_WAIT=30 -WAIT_COUNT=0 -while [ ${WAIT_COUNT} -lt ${MAX_WAIT} ]; do - if curl -s http://localhost:5010/admin/login > /dev/null 2>&1; then - echo "✅ 服务启动成功" - break - fi - echo -n "." - sleep 1 - WAIT_COUNT=$((WAIT_COUNT + 1)) -done -echo "" - -if [ ${WAIT_COUNT} -eq ${MAX_WAIT} ]; then - echo "❌ 服务启动超时" - echo "查看日志: tail -50 ${LOG_FILE}" - exit 1 -fi -echo "" - -# 5. 运行测试 -echo "步骤5: 运行审批测试..." -echo "==========================================" -bash ${PROJECT_DIR}/diagnose_approval.sh -echo "==========================================" -echo "" - -# 6. 询问是否查看日志 -echo "测试完成!" -echo "" -echo "📋 查看详细日志:" -echo " tail -100 ${LOG_FILE}" -echo "" -echo "🔍 搜索审批相关日志:" -echo " grep -A 50 '审批订单开始' ${LOG_FILE}" -echo "" -echo "🛑 停止服务:" -echo " kill ${NEW_PID}" -echo "" diff --git a/query_fund_accounts.sh b/query_fund_accounts.sh deleted file mode 100755 index 99f5f83..0000000 --- a/query_fund_accounts.sh +++ /dev/null @@ -1,71 +0,0 @@ -#!/bin/bash - -BASE_URL="http://localhost:5010" - -# 1. 登录 -echo "================================" -echo "查询用户资金账户数据" -echo "================================" -echo "" - -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -TOKEN=$(echo $LOGIN_RESPONSE | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success'): - print(data['data']['token']) -" 2>/dev/null) - -if [ -z "$TOKEN" ]; then - echo "❌ 登录失败" - echo "$LOGIN_RESPONSE" - exit 1 -fi - -echo "✅ 登录成功" -echo "" - -# 2. 查询用户列表 -echo "步骤1: 查询用户列表..." -USER_LIST=$(curl -s "$BASE_URL/admin/user/list?pageNum=1&pageSize=100" \ - -H "Authorization: Bearer $TOKEN") - -echo "$USER_LIST" | python3 -m json.tool 2>/dev/null || echo "$USER_LIST" -echo "" - -# 提取用户ID列表 -USER_IDS=$(echo "$USER_LIST" | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success') and data['data'].get('list'): - for user in data['data']['list']: - print(user['id']) -" 2>/dev/null) - -if [ -z "$USER_IDS" ]; then - echo "❌ 没有找到用户" - exit 1 -fi - -# 3. 查询每个用户的资金账户 -echo "步骤2: 查询每个用户的资金账户..." -echo "" - -for USER_ID in $USER_IDS; do - echo "================================" - echo "用户ID: $USER_ID" - echo "================================" - - USER_DETAIL=$(curl -s "$BASE_URL/admin/user/detail?userId=$USER_ID" \ - -H "Authorization: Bearer $TOKEN") - - echo "$USER_DETAIL" | python3 -m json.tool 2>/dev/null || echo "$USER_DETAIL" - echo "" -done - -echo "================================" -echo "查询完成" -echo "================================" diff --git a/quick_test.sh b/quick_test.sh deleted file mode 100755 index dccfe90..0000000 --- a/quick_test.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# 简单的审批测试 - 使用curl直接调用API - -BASE_URL="http://localhost:5010" - -echo "==========================================" -echo "简单审批测试" -echo "==========================================" - -# 1. 登录获取token -echo "1. 登录..." -LOGIN_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -TOKEN=$(echo ${LOGIN_RESPONSE} | grep -o '"token":"[^"]*"' | cut -d'"' -f4) - -if [ -z "$TOKEN" ]; then - echo "❌ 登录失败" - echo "${LOGIN_RESPONSE}" - exit 1 -fi - -echo "✅ 登录成功" -echo "" - -# 2. 获取待审批订单 -echo "2. 查询待审批订单..." -PENDING=$(curl -s -X GET "${BASE_URL}/admin/order/pending?pageNum=1&pageSize=5" \ - -H "Authorization: Bearer ${TOKEN}") - -ORDER_NO=$(echo ${PENDING} | grep -o '"orderNo":"[^"]*"' | head -1 | cut -d'"' -f4) - -if [ -z "$ORDER_NO" ]; then - echo "⚠️ 没有待审批订单" - exit 0 -fi - -echo "找到订单: ${ORDER_NO}" -echo "" - -# 3. 执行审批 -echo "3. 执行审批..." -RESULT=$(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 "响应: ${RESULT}" -echo "" - -# 4. 验证结果 -sleep 1 -echo "4. 验证结果..." -VERIFY=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=5" \ - -H "Authorization: Bearer ${TOKEN}") - -STATUS=$(echo ${VERIFY} | grep -A 20 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) - -if [ "$STATUS" = "3" ]; then - echo "✅ 成功!订单状态 = 3" -else - echo "❌ 失败!订单状态 = ${STATUS} (期望3)" -fi diff --git a/summary.sh b/summary.sh deleted file mode 100755 index 45cea7c..0000000 --- a/summary.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# 最终执行总结 - -echo "==========================================" -echo "审批订单修复 - 执行总结" -echo "==========================================" -echo "" - -echo "✅ 已完成的工作:" -echo "" -echo "1. 代码修改:" -echo " - AdminController.java: 添加详细日志" -echo " - FundService.java: 添加6步骤追踪日志" -echo "" -echo "2. 项目编译:" -echo " - mvn clean package -DskipTests" -echo " - 生成: target/monisuo-1.0.jar" -echo "" -echo "3. 测试脚本:" -echo " - one_click_test.sh (一键测试)" -echo " - diagnose_approval.sh (完整诊断)" -echo " - quick_test.sh (快速测试)" -echo " - verify_database.sh (数据库验证)" -echo "" -echo "4. 文档:" -echo " - START_HERE.md (快速开始)" -echo " - FINAL_REPORT.md (最终报告)" -echo " - FIX_SUMMARY.md (修复总结)" -echo " - APPROVAL_DEBUG_REPORT.md (详细报告)" -echo "" - -echo "🚀 立即测试:" -echo "" -echo " cd ~/Desktop/projects/monisuo" -echo " ./one_click_test.sh" -echo "" - -echo "📋 预期结果:" -echo "" -echo " 控制台会输出详细日志:" -echo " - [AdminController] 接收参数" -echo " - [FundService.approve] 步骤1-6" -echo " - 订单更新结果: 1 (成功)" -echo " - 账户更新结果: 1 (成功)" -echo " - 状态验证通过 ✓" -echo "" - -echo "✅ 成功标志:" -echo " - 订单状态: 3 (充值已完成)" -echo " - 用户余额: 增加充值金额" -echo " - 资金流水: 创建成功" -echo "" - -echo "==========================================" -echo "准备就绪,可以开始测试!" -echo "==========================================" diff --git a/test_approval.sh b/test_approval.sh deleted file mode 100755 index d2e51b7..0000000 --- a/test_approval.sh +++ /dev/null @@ -1,110 +0,0 @@ -#!/bin/bash - -# 订单审批功能测试脚本 -# 用于诊断审批后订单状态不更新的问题 - -BASE_URL="http://localhost:5010" -ADMIN_TOKEN="" - -echo "================================" -echo "订单审批功能诊断测试" -echo "================================" -echo "" - -# 1. 管理员登录 -echo "步骤1: 管理员登录..." -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -echo "登录响应: $LOGIN_RESPONSE" -ADMIN_TOKEN=$(echo $LOGIN_RESPONSE | grep -o '"token":"[^"]*' | cut -d'"' -f4) -echo "Token: ${ADMIN_TOKEN:0:20}..." -echo "" - -# 2. 获取待审批订单列表 -echo "步骤2: 获取待审批订单..." -PENDING_RESPONSE=$(curl -s "$BASE_URL/admin/order/pending" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -echo "待审批订单响应:" -echo "$PENDING_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$PENDING_RESPONSE" -echo "" - -# 提取第一个订单号 -ORDER_NO=$(echo $PENDING_RESPONSE | grep -o '"orderNo":"[^"]*' | head -1 | cut -d'"' -f4) -if [ -z "$ORDER_NO" ]; then - echo "❌ 没有待审批的订单" - exit 1 -fi - -echo "选择的订单号: $ORDER_NO" -echo "" - -# 3. 查询订单详情(审批前) -echo "步骤3: 查询订单详情(审批前)..." -DETAIL_RESPONSE=$(curl -s "$BASE_URL/admin/order/list?orderNo=$ORDER_NO" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -echo "订单详情(审批前):" -echo "$DETAIL_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$DETAIL_RESPONSE" - -BEFORE_STATUS=$(echo $DETAIL_RESPONSE | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) -echo "审批前状态: $BEFORE_STATUS" -echo "" - -# 4. 执行审批(通过) -echo "步骤4: 执行审批(通过)..." -APPROVE_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/order/approve" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $ADMIN_TOKEN" \ - -d "{\"orderNo\":\"$ORDER_NO\",\"status\":2,\"adminRemark\":\"测试审批通过\"}") - -echo "审批响应:" -echo "$APPROVE_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$APPROVE_RESPONSE" -echo "" - -# 5. 等待2秒,确保事务提交 -echo "步骤5: 等待事务提交..." -sleep 2 -echo "" - -# 6. 再次查询订单详情(审批后) -echo "步骤6: 查询订单详情(审批后)..." -DETAIL_RESPONSE_AFTER=$(curl -s "$BASE_URL/admin/order/list?orderNo=$ORDER_NO" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -echo "订单详情(审批后):" -echo "$DETAIL_RESPONSE_AFTER" | python3 -m json.tool 2>/dev/null || echo "$DETAIL_RESPONSE_AFTER" - -AFTER_STATUS=$(echo $DETAIL_RESPONSE_AFTER | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) -echo "审批后状态: $AFTER_STATUS" -echo "" - -# 7. 验证状态是否改变 -echo "================================" -echo "验证结果:" -echo "================================" -echo "审批前状态: $BEFORE_STATUS" -echo "审批后状态: $AFTER_STATUS" - -if [ "$BEFORE_STATUS" != "$AFTER_STATUS" ]; then - echo "✅ 状态已改变!" -else - echo "❌ 状态未改变!" - echo "" - echo "可能的原因:" - echo "1. 事务回滚了" - echo "2. 数据库更新失败" - echo "3. 查询到了缓存数据" - echo "" - echo "建议检查:" - echo "1. 查看后端日志,搜索 '[FundService.approve]'" - echo "2. 直接查询数据库验证:" - echo " SELECT id, order_no, status, approve_admin_id, approve_time FROM order_fund WHERE order_no='$ORDER_NO';" -fi - -echo "" -echo "================================" -echo "测试完成" -echo "================================" diff --git a/test_approve.sh b/test_approve.sh deleted file mode 100755 index f2b0288..0000000 --- a/test_approve.sh +++ /dev/null @@ -1,112 +0,0 @@ -#!/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 '充值审批'" diff --git a/test_approve_fix.sh b/test_approve_fix.sh deleted file mode 100755 index a4e7b72..0000000 --- a/test_approve_fix.sh +++ /dev/null @@ -1,170 +0,0 @@ -#!/bin/bash - -# 测试审批充值订单修复 -# 作者: OpenClaw AI Assistant -# 日期: 2026-03-24 - -BASE_URL="http://localhost:8080" -ADMIN_TOKEN="" - -# 颜色输出 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -echo -e "${YELLOW}========================================${NC}" -echo -e "${YELLOW}测试审批充值订单修复${NC}" -echo -e "${YELLOW}========================================${NC}\n" - -# 1. 管理员登录 -echo -e "${YELLOW}[步骤1] 管理员登录${NC}" -LOGIN_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/login" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "admin", - "password": "admin123" - }') - -echo "登录响应: $LOGIN_RESPONSE" - -# 提取token -ADMIN_TOKEN=$(echo $LOGIN_RESPONSE | grep -o '"token":"[^"]*"' | sed 's/"token":"//;s/"//') -if [ -z "$ADMIN_TOKEN" ]; then - echo -e "${RED}✗ 登录失败,无法获取token${NC}" - exit 1 -fi -echo -e "${GREEN}✓ 登录成功,Token: ${ADMIN_TOKEN:0:20}...${NC}\n" - -# 2. 查询待审批订单 -echo -e "${YELLOW}[步骤2] 查询待审批订单${NC}" -PENDING_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/order/pending?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -echo "待审批订单响应: $PENDING_RESPONSE" - -# 检查是否有待审批的充值订单 -PENDING_COUNT=$(echo $PENDING_RESPONSE | grep -o '"total":[0-9]*' | sed 's/"total"://') -echo -e "${GREEN}✓ 待审批订单数量: $PENDING_COUNT${NC}\n" - -if [ "$PENDING_COUNT" -eq 0 ]; then - echo -e "${YELLOW}⚠ 没有待审批订单,请先创建测试订单${NC}" - echo -e "${YELLOW}提示: 使用以下API创建测试订单${NC}" - echo " POST ${BASE_URL}/api/fund/deposit" - echo " {\"amount\": 100}" - echo " POST ${BASE_URL}/api/fund/confirm" - echo " {\"orderNo\": \"ORDER_NO\"}" - exit 0 -fi - -# 提取第一个待审批订单的订单号 -ORDER_NO=$(echo $PENDING_RESPONSE | grep -o '"orderNo":"[^"]*"' | head -1 | sed 's/"orderNo":"//;s/"//') -ORDER_TYPE=$(echo $PENDING_RESPONSE | grep -o '"type":[0-9]' | head -1 | sed 's/"type"://') -ORDER_AMOUNT=$(echo $PENDING_RESPONSE | grep -o '"amount":[0-9.]*' | head -1 | sed 's/"amount"://') - -if [ -z "$ORDER_NO" ]; then - echo -e "${RED}✗ 无法提取订单号${NC}" - exit 1 -fi - -echo -e "${GREEN}✓ 找到待审批订单${NC}" -echo " 订单号: $ORDER_NO" -echo " 类型: $([ "$ORDER_TYPE" = "1" ] && echo "充值" || echo "提现")" -echo " 金额: $ORDER_AMOUNT USDT\n" - -# 3. 获取用户当前余额(通过订单详情) -echo -e "${YELLOW}[步骤3] 获取订单详情${NC}" -ORDER_USERID=$(echo $PENDING_RESPONSE | grep -o '"userId":[0-9]*' | head -1 | sed 's/"userId"://') -echo " 用户ID: $ORDER_USERID\n" - -# 4. 审批通过 -echo -e "${YELLOW}[步骤4] 审批通过订单${NC}" -APPROVE_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/order/approve" \ - -H "Authorization: Bearer $ADMIN_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{ - \"orderNo\": \"$ORDER_NO\", - \"status\": 2, - \"adminRemark\": \"测试审批通过\" - }") - -echo "审批响应: $APPROVE_RESPONSE" - -# 检查审批是否成功 -if echo "$APPROVE_RESPONSE" | grep -q '"success":true'; then - echo -e "${GREEN}✓ 审批成功${NC}\n" -else - echo -e "${RED}✗ 审批失败${NC}" - echo "$APPROVE_RESPONSE" - exit 1 -fi - -# 5. 查询订单最终状态 -echo -e "${YELLOW}[步骤5] 验证订单状态${NC}" -sleep 1 # 等待数据库更新 - -ALL_ORDERS_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=100" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -# 提取该订单的最新状态 -FINAL_STATUS=$(echo "$ALL_ORDERS_RESPONSE" | grep -A 20 "\"orderNo\":\"$ORDER_NO\"" | grep -o '"status":[0-9]' | head -1 | sed 's/"status"://') - -echo " 订单最终状态: $FINAL_STATUS" - -# 验证状态是否正确 -if [ "$ORDER_TYPE" = "1" ]; then - # 充值订单,应该是 3(已完成) - if [ "$FINAL_STATUS" = "3" ]; then - echo -e "${GREEN}✓ 充值订单状态正确(3=已完成)${NC}\n" - else - echo -e "${RED}✗ 充值订单状态错误,期望: 3,实际: $FINAL_STATUS${NC}\n" - echo "状态说明: 1=待付款, 2=待确认, 3=已完成, 4=已驳回, 5=已取消" - exit 1 - fi -else - # 提现订单,应该是 2(已完成) - if [ "$FINAL_STATUS" = "2" ]; then - echo -e "${GREEN}✓ 提现订单状态正确(2=已完成)${NC}\n" - else - echo -e "${RED}✗ 提现订单状态错误,期望: 2,实际: $FINAL_STATUS${NC}\n" - echo "状态说明: 1=待审批, 2=已完成, 3=已驳回, 4=已取消" - exit 1 - fi -fi - -# 6. 查看用户余额变化(需要查询用户详情) -echo -e "${YELLOW}[步骤6] 验证用户余额${NC}" -USER_DETAIL_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/user/detail?userId=$ORDER_USERID" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -echo "用户详情响应: $USER_DETAIL_RESPONSE" - -# 提取余额 -FUND_BALANCE=$(echo "$USER_DETAIL_RESPONSE" | grep -o '"balance":[0-9.]*' | sed 's/"balance"://') -TOTAL_DEPOSIT=$(echo "$USER_DETAIL_RESPONSE" | grep -o '"totalDeposit":[0-9.]*' | sed 's/"totalDeposit"://') - -echo " 资金账户余额: $FUND_BALANCE USDT" -echo " 累计充值: $TOTAL_DEPOSIT USDT" - -if [ "$ORDER_TYPE" = "1" ]; then - echo -e "${GREEN}✓ 充值订单已入账,用户余额应增加 $ORDER_AMOUNT USDT${NC}\n" -else - echo -e "${GREEN}✓ 提现订单已完成,冻结金额已扣除 $ORDER_AMOUNT USDT${NC}\n" -fi - -# 测试总结 -echo -e "${YELLOW}========================================${NC}" -echo -e "${GREEN}✓ 所有测试通过!${NC}" -echo -e "${YELLOW}========================================${NC}" -echo "" -echo "修复验证结果:" -echo " 1. ✓ 订单状态正确更新" -if [ "$ORDER_TYPE" = "1" ]; then - echo " 充值订单: 待确认(2) -> 已完成(3)" -else - echo " 提现订单: 待审批(1) -> 已完成(2)" -fi -echo " 2. ✓ 用户资金账户余额正确更新" -echo " 3. ✓ 资金流水记录已生成" -echo "" -echo "修复完成!" diff --git a/test_approve_order.sh b/test_approve_order.sh deleted file mode 100755 index 3a13d68..0000000 --- a/test_approve_order.sh +++ /dev/null @@ -1,129 +0,0 @@ -#!/bin/bash - -# 审批订单测试脚本 -# 用于测试管理员审批充值订单的完整流程 - -BASE_URL="http://localhost:5010" -ADMIN_TOKEN="" - -echo "==========================================" -echo "审批订单测试脚本" -echo "==========================================" -echo "" - -# 1. 管理员登录 -echo "步骤1: 管理员登录..." -LOGIN_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/login" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "admin", - "password": "admin123" - }') - -echo "登录响应: ${LOGIN_RESPONSE}" -echo "" - -# 提取token -ADMIN_TOKEN=$(echo ${LOGIN_RESPONSE} | grep -o '"token":"[^"]*"' | cut -d'"' -f4) -echo "Token: ${ADMIN_TOKEN}" -echo "" - -if [ -z "$ADMIN_TOKEN" ]; then - echo "❌ 登录失败,无法获取token" - exit 1 -fi - -echo "✅ 登录成功" -echo "" - -# 2. 查询待审批订单 -echo "步骤2: 查询待审批订单..." -PENDING_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/order/pending?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer ${ADMIN_TOKEN}") - -echo "待审批订单响应:" -echo "${PENDING_RESPONSE}" | python3 -m json.tool 2>/dev/null || echo "${PENDING_RESPONSE}" -echo "" - -# 提取第一个订单号 -ORDER_NO=$(echo ${PENDING_RESPONSE} | grep -o '"orderNo":"[^"]*"' | head -1 | cut -d'"' -f4) -echo "第一个待审批订单号: ${ORDER_NO}" -echo "" - -if [ -z "$ORDER_NO" ]; then - echo "⚠️ 没有待审批订单,无法继续测试" - exit 0 -fi - -# 3. 查询订单详情(审批前) -echo "步骤3: 查询订单详情(审批前)..." -ORDER_LIST_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=1" \ - -H "Authorization: Bearer ${ADMIN_TOKEN}") - -echo "订单列表响应:" -echo "${ORDER_LIST_RESPONSE}" | python3 -m json.tool 2>/dev/null || echo "${ORDER_LIST_RESPONSE}" -echo "" - -# 4. 执行审批操作 -echo "==========================================" -echo "步骤4: 执行审批操作(通过)" -echo "==========================================" -echo "订单号: ${ORDER_NO}" -echo "审批状态: 2 (通过)" -echo "" - -APPROVE_RESPONSE=$(curl -s -X POST "${BASE_URL}/admin/order/approve" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer ${ADMIN_TOKEN}" \ - -d "{ - \"orderNo\": \"${ORDER_NO}\", - \"status\": 2, - \"adminRemark\": \"测试审批通过\" - }") - -echo "审批响应: ${APPROVE_RESPONSE}" -echo "" - -# 检查审批结果 -if echo "${APPROVE_RESPONSE}" | grep -q '"code":"0"'; then - echo "✅ 审批接口调用成功" -else - echo "❌ 审批接口调用失败" -fi -echo "" - -# 5. 等待几秒后查询订单状态 -echo "步骤5: 等待2秒后查询订单状态..." -sleep 2 - -echo "查询订单详情(审批后)..." -VERIFY_RESPONSE=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer ${ADMIN_TOKEN}") - -echo "订单列表响应:" -echo "${VERIFY_RESPONSE}" | python3 -m json.tool 2>/dev/null || echo "${VERIFY_RESPONSE}" -echo "" - -# 查找刚才审批的订单 -echo "验证订单 ${ORDER_NO} 的状态..." -ORDER_STATUS=$(echo ${VERIFY_RESPONSE} | grep -A 20 "\"orderNo\":\"${ORDER_NO}\"" | grep -o '"status":[0-9]*' | head -1 | cut -d':' -f2) -echo "订单状态: ${ORDER_STATUS}" -echo "" - -if [ "$ORDER_STATUS" = "3" ]; then - echo "✅✅✅ 测试成功!订单状态已更新为 3 (已完成)" -elif [ "$ORDER_STATUS" = "2" ]; then - echo "⚠️ 警告:订单状态仍为 2 (待确认),审批可能未生效" -else - echo "❌ 测试失败!订单状态异常: ${ORDER_STATUS}" -fi -echo "" - -echo "==========================================" -echo "测试完成" -echo "==========================================" -echo "" -echo "请检查后端日志输出,查看详细的审批流程日志:" -echo " - [AdminController] 开头的日志" -echo " - [FundService.approve] 开头的日志" -echo "" diff --git a/test_asset_api.sh b/test_asset_api.sh deleted file mode 100755 index f8bd7fa..0000000 --- a/test_asset_api.sh +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash - -BASE_URL="http://localhost:5010" - -echo "================================" -echo "测试资产API接口" -echo "================================" - -# 1. 用户登录 -echo -e "\n步骤1: 用户登录..." -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/api/user/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"abcd","password":"abcd123"}') - -echo "登录响应: $LOGIN_RESPONSE" -TOKEN=$(echo $LOGIN_RESPONSE | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success'): - print(data['data']['token']) -" 2>/dev/null) - -if [ -z "$TOKEN" ]; then - echo "❌ 登录失败" - exit 1 -fi - -echo "✅ 登录成功" -echo "Token: ${TOKEN:0:30}..." - -# 2. 测试资产总览接口 -echo -e "\n================================" -echo "测试 /api/asset/overview 接口" -echo "================================" -OVERVIEW_RESPONSE=$(curl -s "$BASE_URL/api/asset/overview" \ - -H "Authorization: Bearer $TOKEN") - -echo "$OVERVIEW_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$OVERVIEW_RESPONSE" - -# 分析字段 -echo -e "\n字段分析:" -echo "$OVERVIEW_RESPONSE" | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success') and data.get('data'): - print('后端返回的字段:') - for key in data['data'].keys(): - print(f' - {key}: {type(data[\"data\"][key]).__name__}') - print('\nFlutter期望的字段:') - print(' - totalAsset (总资产)') - print(' - fundBalance (资金余额)') - print(' - tradeBalance (交易余额)') - print(' - totalProfit (总盈亏)') -" - -# 3. 测试资金账户接口 -echo -e "\n================================" -echo "测试 /api/asset/fund 接口" -echo "================================" -FUND_RESPONSE=$(curl -s "$BASE_URL/api/asset/fund" \ - -H "Authorization: Bearer $TOKEN") - -echo "$FUND_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$FUND_RESPONSE" - -# 4. 测试交易账户接口 -echo -e "\n================================" -echo "测试 /api/asset/trade 接口" -echo "================================" -TRADE_RESPONSE=$(curl -s "$BASE_URL/api/asset/trade" \ - -H "Authorization: Bearer $TOKEN") - -echo "$TRADE_RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$TRADE_RESPONSE" - -echo -e "\n================================" -echo "问题诊断" -echo "================================" -echo "$OVERVIEW_RESPONSE" | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success') and data.get('data'): - backend_fields = set(data['data'].keys()) - flutter_expected = {'totalAsset', 'fundBalance', 'tradeBalance', 'totalProfit'} - - print('后端返回字段:', sorted(backend_fields)) - print('Flutter期望字段:', sorted(flutter_expected)) - print() - - missing = flutter_expected - backend_fields - extra = backend_fields - flutter_expected - - if missing: - print('❌ 缺失字段:', sorted(missing)) - if extra: - print('⚠️ 额外字段:', sorted(extra)) - - # 检查字段名称不匹配 - if 'totalAssets' in backend_fields and 'totalAsset' in flutter_expected: - print('⚠️ 字段名称不匹配: totalAssets vs totalAsset') - if 'tradeValue' in backend_fields and 'tradeBalance' in flutter_expected: - print('⚠️ 字段名称不匹配: tradeValue vs tradeBalance') - if 'totalProfit' not in backend_fields: - print('⚠️ 缺失字段: totalProfit') -" - -echo "================================" -echo "测试完成" -echo "================================" diff --git a/test_complete_flow.sh b/test_complete_flow.sh deleted file mode 100755 index 2bf8286..0000000 --- a/test_complete_flow.sh +++ /dev/null @@ -1,234 +0,0 @@ -#!/bin/bash - -# 完整测试:创建充值订单 -> 确认打款 -> 管理员审批 -> 验证余额 -# 作者: OpenClaw AI Assistant -# 日期: 2026-03-24 - -BASE_URL="http://localhost:8080" -USER_TOKEN="" -ADMIN_TOKEN="" - -# 颜色输出 -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -echo -e "${YELLOW}========================================${NC}" -echo -e "${YELLOW}完整业务流程测试${NC}" -echo -e "${YELLOW}========================================${NC}\n" - -# 检查服务是否运行 -echo -e "${BLUE}[检查] 检查服务状态${NC}" -if ! curl -s "${BASE_URL}/health" > /dev/null 2>&1; then - echo -e "${RED}✗ 服务未运行,请先启动服务${NC}" - echo "启动命令: cd ~/Desktop/projects/monisuo && java -jar target/monisuo-1.0.jar" - exit 1 -fi -echo -e "${GREEN}✓ 服务运行正常${NC}\n" - -# 1. 用户登录(如果需要) -echo -e "${YELLOW}[步骤1] 用户登录${NC}" -# 这里假设已经有测试用户,如果没有需要先注册 -# USER_LOGIN_RESPONSE=$(curl -s -X POST "${BASE_URL}/api/user/login" ...) -# 暂时跳过,使用已有的测试数据 - -# 2. 管理员登录 -echo -e "${YELLOW}[步骤2] 管理员登录${NC}" -ADMIN_LOGIN=$(curl -s -X POST "${BASE_URL}/admin/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"admin","password":"admin123"}') - -ADMIN_TOKEN=$(echo $ADMIN_LOGIN | grep -o '"token":"[^"]*"' | sed 's/"token":"//;s/"//') -if [ -z "$ADMIN_TOKEN" ]; then - echo -e "${RED}✗ 管理员登录失败${NC}" - echo "$ADMIN_LOGIN" - exit 1 -fi -echo -e "${GREEN}✓ 管理员登录成功${NC}\n" - -# 3. 查询当前待审批订单 -echo -e "${YELLOW}[步骤3] 查询当前待审批订单${NC}" -PENDING=$(curl -s -X GET "${BASE_URL}/admin/order/pending?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -PENDING_COUNT=$(echo $PENDING | grep -o '"total":[0-9]*' | sed 's/"total"://') -echo "待审批订单数量: $PENDING_COUNT" - -if [ "$PENDING_COUNT" -gt 0 ]; then - echo -e "${GREEN}✓ 已有待审批订单,直接使用${NC}\n" - - # 提取订单信息 - ORDER_NO=$(echo $PENDING | grep -o '"orderNo":"[^"]*"' | head -1 | sed 's/"orderNo":"//;s/"//') - ORDER_TYPE=$(echo $PENDING | grep -o '"type":[0-9]' | head -1 | sed 's/"type"://') - ORDER_AMOUNT=$(echo $PENDING | grep -o '"amount":[0-9.]*' | head -1 | sed 's/"amount"://') - ORDER_STATUS=$(echo $PENDING | grep -o '"status":[0-9]' | head -1 | sed 's/"status"://') - USER_ID=$(echo $PENDING | grep -o '"userId":[0-9]*' | head -1 | sed 's/"userId"://') - - echo "订单信息:" - echo " 订单号: $ORDER_NO" - echo " 类型: $([ "$ORDER_TYPE" = "1" ] && echo "充值" || echo "提现")" - echo " 状态: $ORDER_STATUS" - echo " 金额: $ORDER_AMOUNT USDT" - echo " 用户ID: $USER_ID" - echo "" -else - echo -e "${YELLOW}⚠ 没有待审批订单${NC}" - echo -e "${YELLOW}请先创建测试订单:${NC}" - echo " 1. 用户登录获取token" - echo " 2. POST ${BASE_URL}/api/fund/deposit {\"amount\": 100}" - echo " 3. POST ${BASE_URL}/api/fund/confirm {\"orderNo\": \"ORDER_NO\"}" - echo "" - echo "或使用以下命令快速测试:" - echo " ./test_approve_fix.sh" - exit 0 -fi - -# 4. 获取用户审批前余额 -echo -e "${YELLOW}[步骤4] 获取用户审批前余额${NC}" -USER_DETAIL=$(curl -s -X GET "${BASE_URL}/admin/user/detail?userId=$USER_ID" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -BALANCE_BEFORE=$(echo "$USER_DETAIL" | grep -o '"balance":[0-9.]*' | sed 's/"balance"://') -FROZEN_BEFORE=$(echo "$USER_DETAIL" | grep -o '"frozen":[0-9.]*' | sed 's/"frozen"://') - -echo "审批前资产:" -echo " 余额: $BALANCE_BEFORE USDT" -echo " 冻结: $FROZEN_BEFORE USDT\n" - -# 5. 审批订单 -echo -e "${YELLOW}[步骤5] 审批订单${NC}" -APPROVE_RESULT=$(curl -s -X POST "${BASE_URL}/admin/order/approve" \ - -H "Authorization: Bearer $ADMIN_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{ - \"orderNo\": \"$ORDER_NO\", - \"status\": 2, - \"adminRemark\": \"自动化测试审批\" - }") - -echo "审批响应: $APPROVE_RESULT" - -if echo "$APPROVE_RESULT" | grep -q '"success":true'; then - echo -e "${GREEN}✓ 审批成功${NC}\n" -else - echo -e "${RED}✗ 审批失败${NC}" - exit 1 -fi - -# 6. 等待并查询订单最终状态 -echo -e "${YELLOW}[步骤6] 验证订单最终状态${NC}" -sleep 1 - -ALL_ORDERS=$(curl -s -X GET "${BASE_URL}/admin/order/list?pageNum=1&pageSize=100&type=$ORDER_TYPE" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -FINAL_STATUS=$(echo "$ALL_ORDERS" | grep -A 20 "\"orderNo\":\"$ORDER_NO\"" | grep -o '"status":[0-9]' | head -1 | sed 's/"status"://') - -echo "订单最终状态: $FINAL_STATUS" - -# 验证状态 -if [ "$ORDER_TYPE" = "1" ]; then - # 充值订单 - EXPECTED_STATUS=3 - STATUS_NAME="已完成" - if [ "$FINAL_STATUS" = "3" ]; then - echo -e "${GREEN}✓ 充值订单状态正确(3=已完成)${NC}\n" - else - echo -e "${RED}✗ 充值订单状态错误,期望: 3,实际: $FINAL_STATUS${NC}" - echo "状态说明: 1=待付款, 2=待确认, 3=已完成, 4=已驳回, 5=已取消" - exit 1 - fi -else - # 提现订单 - EXPECTED_STATUS=2 - STATUS_NAME="已完成" - if [ "$FINAL_STATUS" = "2" ]; then - echo -e "${GREEN}✓ 提现订单状态正确(2=已完成)${NC}\n" - else - echo -e "${RED}✗ 提现订单状态错误,期望: 2,实际: $FINAL_STATUS${NC}" - echo "状态说明: 1=待审批, 2=已完成, 3=已驳回, 4=已取消" - exit 1 - fi -fi - -# 7. 获取用户审批后余额 -echo -e "${YELLOW}[步骤7] 验证用户余额变化${NC}" -USER_DETAIL_AFTER=$(curl -s -X GET "${BASE_URL}/admin/user/detail?userId=$USER_ID" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -BALANCE_AFTER=$(echo "$USER_DETAIL_AFTER" | grep -o '"balance":[0-9.]*' | sed 's/"balance"://') -FROZEN_AFTER=$(echo "$USER_DETAIL_AFTER" | grep -o '"frozen":[0-9.]*' | sed 's/"frozen"://') - -echo "审批后资产:" -echo " 余额: $BALANCE_AFTER USDT" -echo " 冻结: $FROZEN_AFTER USDT\n" - -# 计算余额变化 -echo -e "${YELLOW}[步骤8] 验证余额变化${NC}" -if [ "$ORDER_TYPE" = "1" ]; then - # 充值订单:余额应该增加 - EXPECTED_BALANCE=$(echo "$BALANCE_BEFORE $ORDER_AMOUNT" | awk '{printf "%.2f", $1 + $2}') - echo "充值订单验证:" - echo " 审批前余额: $BALANCE_BEFORE USDT" - echo " 充值金额: $ORDER_AMOUNT USDT" - echo " 期望余额: $EXPECTED_BALANCE USDT" - echo " 实际余额: $BALANCE_AFTER USDT" - - # 比较余额(允许0.01的误差) - DIFF=$(echo "$BALANCE_AFTER $EXPECTED_BALANCE" | awk '{printf "%.2f", $1 - $2}') - ABS_DIFF=${DIFF#-} - - if [ $(echo "$ABS_DIFF < 0.01" | bc) -eq 1 ]; then - echo -e "${GREEN}✓ 充值入账成功,余额增加 $ORDER_AMOUNT USDT${NC}\n" - else - echo -e "${RED}✗ 余额变化不正确,差额: $DIFF USDT${NC}\n" - exit 1 - fi -else - # 提现订单:冻结应该减少 - EXPECTED_FROZEN=$(echo "$FROZEN_BEFORE $ORDER_AMOUNT" | awk '{printf "%.2f", $1 - $2}') - echo "提现订单验证:" - echo " 审批前冻结: $FROZEN_BEFORE USDT" - echo " 提现金额: $ORDER_AMOUNT USDT" - echo " 期望冻结: $EXPECTED_FROZEN USDT" - echo " 实际冻结: $FROZEN_AFTER USDT" - - # 比较冻结金额 - DIFF=$(echo "$FROZEN_AFTER $EXPECTED_FROZEN" | awk '{printf "%.2f", $1 - $2}') - ABS_DIFF=${DIFF#-} - - if [ $(echo "$ABS_DIFF < 0.01" | bc) -eq 1 ]; then - echo -e "${GREEN}✓ 提现完成,冻结金额减少 $ORDER_AMOUNT USDT${NC}\n" - else - echo -e "${RED}✗ 冻结金额变化不正确,差额: $DIFF USDT${NC}\n" - exit 1 - fi -fi - -# 测试总结 -echo -e "${YELLOW}========================================${NC}" -echo -e "${GREEN}✓✓✓ 所有测试通过!✓✓✓${NC}" -echo -e "${YELLOW}========================================${NC}\n" - -echo "测试结果汇总:" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "1. ✓ 订单状态更新正确" -if [ "$ORDER_TYPE" = "1" ]; then - echo " 充值订单: 待确认(2) → 已完成(3)" -else - echo " 提现订单: 待审批(1) → 已完成(2)" -fi -echo "" -echo "2. ✓ 用户余额变化正确" -if [ "$ORDER_TYPE" = "1" ]; then - echo " 余额: $BALANCE_BEFORE → $BALANCE_AFTER USDT (+$ORDER_AMOUNT)" -else - echo " 冻结: $FROZEN_BEFORE → $FROZEN_AFTER USDT (-$ORDER_AMOUNT)" -fi -echo "" -echo "3. ✓ 资金流水记录已生成" -echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" -echo "" -echo -e "${GREEN}修复验证完成!审批逻辑工作正常。${NC}\n" diff --git a/test_deposit_api.sh b/test_deposit_api.sh deleted file mode 100755 index c0deb73..0000000 --- a/test_deposit_api.sh +++ /dev/null @@ -1,113 +0,0 @@ -#!/bin/bash -# ============================================= -# 充值功能测试脚本 -# ============================================= - -BASE_URL="http://localhost:5010" -TOKEN="" - -echo "==========================================" -echo "Monisuo 充值功能测试" -echo "==========================================" -echo "" - -# 1. 测试健康检查 -echo "【1】测试后端服务健康检查..." -curl -s "$BASE_URL/health" | jq . 2>/dev/null || curl -s "$BASE_URL/health" -echo "" -echo "" - -# 2. 登录获取Token -echo "【2】登录获取Token..." -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/api/user/login" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "testuser", - "password": "test123456" - }') - -echo "$LOGIN_RESPONSE" | jq . 2>/dev/null || echo "$LOGIN_RESPONSE" -TOKEN=$(echo "$LOGIN_RESPONSE" | jq -r '.data.token' 2>/dev/null) - -if [ -z "$TOKEN" ] || [ "$TOKEN" = "null" ]; then - echo "❌ 登录失败,尝试注册新用户..." - - REGISTER_RESPONSE=$(curl -s -X POST "$BASE_URL/api/user/register" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "testuser", - "password": "test123456", - "phone": "13800138000" - }') - - echo "$REGISTER_RESPONSE" | jq . 2>/dev/null || echo "$REGISTER_RESPONSE" - TOKEN=$(echo "$REGISTER_RESPONSE" | jq -r '.data.token' 2>/dev/null) -fi - -if [ -z "$TOKEN" ] || [ "$TOKEN" = "null" ]; then - echo "❌ 无法获取Token,测试终止" - exit 1 -fi - -echo "✅ Token获取成功: ${TOKEN:0:20}..." -echo "" - -# 3. 获取默认钱包地址 -echo "【3】获取默认钱包地址..." -WALLET_RESPONSE=$(curl -s -X GET "$BASE_URL/api/wallet/default" \ - -H "Authorization: Bearer $TOKEN") - -echo "$WALLET_RESPONSE" | jq . 2>/dev/null || echo "$WALLET_RESPONSE" - -WALLET_ADDRESS=$(echo "$WALLET_RESPONSE" | jq -r '.data.address' 2>/dev/null) -if [ -z "$WALLET_ADDRESS" ] || [ "$WALLET_ADDRESS" = "null" ]; then - echo "❌ 钱包地址获取失败,请检查数据库中是否有冷钱包数据" - echo "提示:请执行 sql/patch_cold_wallet.sql 脚本" -fi -echo "" - -# 4. 申请充值 -echo "【4】申请充值 100 USDT..." -DEPOSIT_RESPONSE=$(curl -s -X POST "$BASE_URL/api/fund/deposit" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d '{ - "amount": "100", - "remark": "测试充值" - }') - -echo "$DEPOSIT_RESPONSE" | jq . 2>/dev/null || echo "$DEPOSIT_RESPONSE" - -ORDER_NO=$(echo "$DEPOSIT_RESPONSE" | jq -r '.data.orderNo' 2>/dev/null) -if [ -z "$ORDER_NO" ] || [ "$ORDER_NO" = "null" ]; then - echo "❌ 充值申请失败" -else - echo "✅ 充值申请成功,订单号: $ORDER_NO" -fi -echo "" - -# 5. 确认打款 -if [ -n "$ORDER_NO" ] && [ "$ORDER_NO" != "null" ]; then - echo "【5】确认已打款..." - CONFIRM_RESPONSE=$(curl -s -X POST "$BASE_URL/api/fund/confirmPay" \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d "{ - \"orderNo\": \"$ORDER_NO\" - }") - - echo "$CONFIRM_RESPONSE" | jq . 2>/dev/null || echo "$CONFIRM_RESPONSE" - echo "" -fi - -# 6. 查看充提记录 -echo "【6】查看充提记录..." -ORDERS_RESPONSE=$(curl -s -X GET "$BASE_URL/api/fund/orders?pageNum=1&pageSize=10" \ - -H "Authorization: Bearer $TOKEN") - -echo "$ORDERS_RESPONSE" | jq . 2>/dev/null || echo "$ORDERS_RESPONSE" -echo "" - -echo "==========================================" -echo "测试完成!" -echo "==========================================" diff --git a/test_deposit_direct.sh b/test_deposit_direct.sh deleted file mode 100755 index f76073a..0000000 --- a/test_deposit_direct.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash -# ============================================= -# 充值功能直接测试脚本 -# ============================================= - -BASE_URL="http://localhost:5010" - -echo "==========================================" -echo "Monisuo 充值功能直接测试" -echo "==========================================" -echo "" - -# 1. 获取默认钱包地址(无需登录) -echo "【1】测试获取默认钱包地址..." -curl -s -X GET "$BASE_URL/api/wallet/default" | jq . 2>/dev/null || curl -s -X GET "$BASE_URL/api/wallet/default" -echo "" -echo "" - -# 2. 模拟充值申请(需要登录,这里会失败) -echo "【2】测试充值申请(无Token,预期失败)..." -curl -s -X POST "$BASE_URL/api/fund/deposit" \ - -H "Content-Type: application/json" \ - -d '{"amount":"100","remark":"测试充值"}' | jq . 2>/dev/null || \ - curl -s -X POST "$BASE_URL/api/fund/deposit" \ - -H "Content-Type: application/json" \ - -d '{"amount":"100","remark":"测试充值"}' -echo "" -echo "" - -# 3. 检查数据库中的钱包数据 -echo "【3】检查数据库钱包数据..." -mysql -h 8.155.172.147 -P 3306 -u monisuo -pJPJ8wYicSGC8aRnk monisuo -e "SELECT id, name, network, is_default, status FROM cold_wallet;" 2>/dev/null -echo "" - -echo "==========================================" -echo "测试完成!" -echo "==========================================" -echo "" -echo "✅ 数据库补丁已成功执行" -echo "✅ cold_wallet 表已创建" -echo "✅ 默认钱包地址已插入" -echo "" -echo "📋 下一步:" -echo "1. 启动后端服务(如果未运行)" -echo "2. 使用前端登录后测试充值功能" -echo "3. 或使用有效用户Token测试API" diff --git a/test_fix.sh b/test_fix.sh deleted file mode 100755 index 1fd17ff..0000000 --- a/test_fix.sh +++ /dev/null @@ -1,164 +0,0 @@ -#!/bin/bash - -# StackOverflowError 修复测试脚本 -# 使用方法: ./test_fix.sh - -echo "======================================" -echo " Monisuo StackOverflowError 修复测试" -echo "======================================" -echo "" - -# 颜色定义 -GREEN='\033[0;32m' -RED='\033[0;31m' -YELLOW='\033[1;33m' -NC='\033[0m' # No Color - -# 检查 Java 环境 -echo "1️⃣ 检查 Java 环境..." -if ! command -v java &> /dev/null; then - echo -e "${RED}❌ 未找到 Java 环境${NC}" - echo "请先安装 Java: https://www.java.com/download/" - exit 1 -fi - -JAVA_VERSION=$(java -version 2>&1 | head -n 1) -echo -e "${GREEN}✅ Java 环境: $JAVA_VERSION${NC}" -echo "" - -# 编译项目 -echo "2️⃣ 编译项目..." -cd "$(dirname "$0")" - -if [ ! -f "pom.xml" ]; then - echo -e "${RED}❌ 未找到 pom.xml${NC}" - exit 1 -fi - -mvn clean package -DskipTests -if [ $? -ne 0 ]; then - echo -e "${RED}❌ 编译失败${NC}" - exit 1 -fi - -echo -e "${GREEN}✅ 编译成功${NC}" -echo "" - -# 检查是否有旧的进程在运行 -echo "3️⃣ 检查旧进程..." -OLD_PID=$(ps aux | grep 'monisuo-1.0.jar' | grep -v grep | awk '{print $2}') -if [ ! -z "$OLD_PID" ]; then - echo -e "${YELLOW}⚠️ 发现旧进程 (PID: $OLD_PID),正在停止...${NC}" - kill -9 $OLD_PID - sleep 2 -fi -echo -e "${GREEN}✅ 没有旧进程${NC}" -echo "" - -# 启动服务 -echo "4️⃣ 启动服务..." -nohup java -jar target/monisuo-1.0.jar > app.log 2>&1 & -APP_PID=$! -echo -e "${GREEN}✅ 服务已启动 (PID: $APP_PID)${NC}" -echo "⏳ 等待服务启动..." -sleep 10 -echo "" - -# 检查服务状态 -echo "5️⃣ 检查服务状态..." -if ps -p $APP_PID > /dev/null; then - echo -e "${GREEN}✅ 服务正在运行${NC}" -else - echo -e "${RED}❌ 服务启动失败${NC}" - echo "查看日志: tail -100 app.log" - exit 1 -fi -echo "" - -# 检查启动日志 -echo "6️⃣ 检查启动日志..." -if tail -50 app.log | grep -q "Started SpcCloudApplication"; then - echo -e "${GREEN}✅ 服务启动成功${NC}" -elif tail -50 app.log | grep -q "Error\|Exception"; then - echo -e "${RED}❌ 启动过程中发现错误${NC}" - echo "错误日志:" - tail -50 app.log | grep -A 5 "Error\|Exception" - exit 1 -else - echo -e "${YELLOW}⚠️ 未找到启动成功标志,请手动检查${NC}" -fi -echo "" - -# 测试接口 -echo "7️⃣ 测试核心接口(需要登录 Token)..." -echo "注意: 以下测试需要有效的 Authorization Token" -echo "" - -read -p "是否要测试接口?(y/n) " -n 1 -r -echo "" -if [[ ! $REPLY =~ ^[Yy]$ ]]; then - echo "跳过接口测试" - echo "" - echo "======================================" - echo -e "${GREEN}✅ 修复验证完成${NC}" - echo "服务正在运行,PID: $APP_PID" - echo "日志文件: app.log" - echo "======================================" - exit 0 -fi - -read -p "请输入 Authorization Token: " TOKEN - -if [ -z "$TOKEN" ]; then - echo -e "${YELLOW}⚠️ 未提供 Token,跳过接口测试${NC}" -else - echo "" - echo "测试 /api/asset/overview..." - RESPONSE=$(curl -s -w "\n%{http_code}" -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/asset/overview) - HTTP_CODE=$(echo "$RESPONSE" | tail -n 1) - BODY=$(echo "$RESPONSE" | head -n -1) - - if [ "$HTTP_CODE" = "200" ]; then - echo -e "${GREEN}✅ /api/asset/overview - 成功${NC}" - echo "响应: $BODY" - else - echo -e "${RED}❌ /api/asset/overview - 失败 (HTTP $HTTP_CODE)${NC}" - echo "响应: $BODY" - fi - echo "" - - echo "测试 /api/asset/trade..." - RESPONSE=$(curl -s -w "\n%{http_code}" -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/asset/trade) - HTTP_CODE=$(echo "$RESPONSE" | tail -n 1) - BODY=$(echo "$RESPONSE" | head -n -1) - - if [ "$HTTP_CODE" = "200" ]; then - echo -e "${GREEN}✅ /api/asset/trade - 成功${NC}" - echo "响应: $BODY" - else - echo -e "${RED}❌ /api/asset/trade - 失败 (HTTP $HTTP_CODE)${NC}" - echo "响应: $BODY" - fi - echo "" - - echo "测试 /api/asset/fund..." - RESPONSE=$(curl -s -w "\n%{http_code}" -H "Authorization: Bearer $TOKEN" http://localhost:8080/api/asset/fund) - HTTP_CODE=$(echo "$RESPONSE" | tail -n 1) - BODY=$(echo "$RESPONSE" | head -n -1) - - if [ "$HTTP_CODE" = "200" ]; then - echo -e "${GREEN}✅ /api/asset/fund - 成功${NC}" - echo "响应: $BODY" - else - echo -e "${RED}❌ /api/asset/fund - 失败 (HTTP $HTTP_CODE)${NC}" - echo "响应: $BODY" - fi - echo "" -fi - -echo "======================================" -echo -e "${GREEN}✅ 所有测试完成${NC}" -echo "服务正在运行,PID: $APP_PID" -echo "停止服务: kill $APP_PID" -echo "查看日志: tail -f app.log" -echo "======================================" diff --git a/test_flutter_asset.sh b/test_flutter_asset.sh deleted file mode 100755 index 45daae0..0000000 --- a/test_flutter_asset.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -BASE_URL="http://localhost:5010" - -echo "================================" -echo "测试Flutter资产页面API调用" -echo "================================" - -# 1. 用户登录 -echo -e "\n步骤1: 用户登录..." -LOGIN_RESPONSE=$(curl -s -X POST "$BASE_URL/api/user/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"abcd","password":"abcd123"}') - -TOKEN=$(echo $LOGIN_RESPONSE | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success'): - print(data['data']['token']) -" 2>/dev/null) - -if [ -z "$TOKEN" ]; then - echo "❌ 登录失败" - exit 1 -fi - -echo "✅ 登录成功" - -# 2. 测试资产总览(Flutter首页调用) -echo -e "\n================================" -echo "测试1: /api/asset/overview (资产总览)" -echo "================================" -OVERVIEW=$(curl -s "$BASE_URL/api/asset/overview" \ - -H "Authorization: Bearer $TOKEN") -echo "$OVERVIEW" | python3 -m json.tool - -# 3. 测试资金账户(Flutter资金账户Tab调用) -echo -e "\n================================" -echo "测试2: /api/asset/fund (资金账户)" -echo "================================" -FUND=$(curl -s "$BASE_URL/api/asset/fund" \ - -H "Authorization: Bearer $TOKEN") -echo "$FUND" | python3 -m json.tool - -# 4. 测试交易账户(Flutter交易账户Tab调用) -echo -e "\n================================" -echo "测试3: /api/asset/trade (交易账户)" -echo "================================" -TRADE=$(curl -s "$BASE_URL/api/asset/trade" \ - -H "Authorization: Bearer $TOKEN") -echo "$TRADE" | python3 -m json.tool - -# 5. 分析数据结构 -echo -e "\n================================" -echo "数据分析" -echo "================================" -echo "$FUND" | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success') and data.get('data'): - fund = data['data'].get('fund', {}) - print('资金账户数据:') - print(f' - balance: {fund.get(\"balance\")}') - print(f' - frozen: {fund.get(\"frozen\")}') - print(f' - total_deposit: {fund.get(\"totalDeposit\")}') - print(f' - total_withdraw: {fund.get(\"totalWithdraw\")}') - - if fund.get('balance') == 0: - print('\n⚠️ 余额为0,但数据库中应该有15500') - else: - print(f'\n✅ 余额正确: {fund.get(\"balance\")}') -" - -echo "$TRADE" | python3 -c " -import sys, json -data = json.load(sys.stdin) -if data.get('success') and data.get('data'): - positions = data['data'].get('positions', []) - print(f'\n交易账户持仓数: {len(positions)}') - if positions: - for pos in positions: - print(f' - {pos.get(\"coinCode\")}: {pos.get(\"quantity\")} (价值: {pos.get(\"value\")} USDT)') - else: - print(' 暂无持仓') -" - -echo -e "\n================================" -echo "测试完成" -echo "================================" diff --git a/test_fund_flow.sh b/test_fund_flow.sh deleted file mode 100755 index b17247b..0000000 --- a/test_fund_flow.sh +++ /dev/null @@ -1,168 +0,0 @@ -#!/bin/bash -# ============================================= -# 资金充值/提现功能测试脚本 -# 版本: 1.0 -# 日期: 2026-03-23 -# ============================================= - -set -e - -# 磀色配置 -BASE_URL="http://8.155.172.147:5010" -DB_HOST="8.155.172.147" -DB_PORT="3306" -DB_NAME="monisuo" -DB_USER="monisuo" -DB_PASS="JPJ8wYicSGC8aRnk" - -MYSQL_CMD="/opt/homebrew/Cellar/mysql-client/9.6.0/bin/mysql" - -MYSQL="${MYSQL_CMD} -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS}" - -DB_HOST="8.155.172.147" -DB_PORT="3306" -DB_NAME="monisuo" -DB_USER="monisuo" -DB_PASS="JPJ8wYicSGC8aRnk" - -echo "==========================================" -echo "Phase 1: 环境检查" -echo "==========================================" -echo "" - -# 检查后端服务 -echo "检查后端服务状态..." -BACKEND_RESPONSE=$(curl -s http://localhost:5010/health 2>/dev/null || echo "后端服务运行中") -if [ -z "$BACKEND_RESPONSE" ]; then - echo "❌ 后端服务未运行, echo "⚠️ 请先启动后端服务" - echo " 提示: 后端服务已在远程服务器上运行" - echo " 或者使用以下命令启动本地服务:" - echo " cd ~/Desktop/projects/monisuo" - echo " java -jar target/monisuo-1.0.jar --server.port=5010" - exit 1 -fi - -echo "" -echo "==========================================" -echo "Phase 2: 数据库补丁检查" -echo "==========================================" -echo "" - -# 检查数据库补丁 -echo "检查 cold_wallet 表..." -${MYSQL} -e "SHOW TABLES LIKE 'cold_wallet';" 2>/dev/null | echo "✅ cold_wallet 表存在" -if [ $? -eq 0 ]; then - echo "检查默认钱包..." - ${MYSQL} -e "SELECT * FROM cold_wallet WHERE is_default=1;" 2>/dev/null - echo "✅ 默认钱包存在" -else - echo "❌ cold_wallet 表不存在, echo "请执行数据库补丁: mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} < ~/Desktop/projects/monisuo/sql/patch_cold_wallet.sql - exit 1 -fi - -echo "" -echo "==========================================" -echo "Phase 3: 功能测试" -echo "==========================================" -echo "" - -# 测试钱包接口 (无需登录) -echo "测试钱包接口..." -WALLET_RESPONSE=$(curl -s http://localhost:5010/api/wallet/default) -if echo "$WALLET_RESPONSE" | grep -q '"success":true'; then - echo "✅ 风险接口正常" -else - echo "❌ 錶包接口异常, echo "响应: $WALLET_RESPONSE" - exit 1 -fi -echo "" - -# 测试登录 -echo "测试登录..." -LOGIN_RESPONSE=$(curl -s -X POST http://localhost:5010/api/user/login \ - -H "Content-Type: application/json" \ - -d '{"username":"testuser","password":"test123456"}' 2>/dev/null) - -if echo "$LOGIN_RESPONSE" | grep -q '"success":true'; then - TOKEN=$(echo "$LOGIN_RESPONSE" | grep -o '"token"' | sed 's/\"//g') - echo "✅ 登录成功" - echo "Token: ${TOKEN:0:20}..." -else - echo "❌ 登录失败" - echo "响应: $LOGIN_RESPONSE" - exit 1 -fi -echo "" - -# 测试充值 -echo "测试充值申请..." -DEPOSIT_RESPONSE=$(curl -s -X POST http://localhost:5010/api/fund/deposit \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"amount":"100","remark":"测试充值"}' 2>/dev/null) -if echo "$DEPOSIT_RESPONSE" | grep -q '"success":true'; then - echo "✅ 充值申请成功" - ORDER_NO=$(echo "$DEPOSIT_RESPONSE" | grep -o '"orderNo"' | sed 's/\"//g') - echo "订单号: $ORDER_NO" -else - echo "❌ 充值申请失败" - echo "响应: $DEPOSIT_RESPONSE" - exit 1 -fi -echo "" - -# 测试确认打款 -echo "测试确认打款..." -CONFIRM_RESPONSE=$(curl -s -X POST http://localhost:5010/api/fund/confirmPay \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d "{\"orderNo\":\"$ORDER_NO\"}" 2>/dev/null) -if echo "$CONFIRM_RESPONSE" | grep -q '"success":true'; then - echo "✅ 确认打款成功" -else - echo "❌ 确认打款失败" - echo "响应: $CONFIRM_RESPONSE" - exit 1 -fi -echo "" - -# 测试查询订单 -echo "查询充值订单..." -ORDERS_RESPONSE=$(curl -s http://localhost:5010/api/fund/orders?type=1&pageSize=10 \ - -H "Authorization: Bearer $TOKEN") -if echo "$ORDERS_RESPONSE" | grep -q '"success":true'; then - echo "✅ 查询订单成功" - ORDER_COUNT=$(echo "$ORDERS_RESPONSE" | grep -o '"list"' | sed 's/}' | wc -l) - echo "订单数量: $ORDER_COUNT" -else - echo "❌ 查询订单失败" - echo "响应: $ORDERS_RESPONSE" - exit 1 -fi -echo "" - -# 测试提现 -echo "测试提现申请..." -WITHDRAW_RESPONSE=$(curl -s -X POST http://localhost:5010/api/fund/withdraw \ - -H "Content-Type: application/json" \ - -H "Authorization: Bearer $TOKEN" \ - -d '{"amount":"50","withdrawAddress":"TRXTest123","withdrawContact":"test@example.com","remark":"测试提现"}' 2>/dev/null) -if echo "$WITHDRAW_RESPONSE" | grep -q '"success":true'; then - echo "✅ 提现申请成功" - WITHDRAW_ORDER_NO=$(echo "$WITHDRAW_RESPONSE" | grep -o '"orderNo"' | sed 's/\"//g') - echo "提现订单号: $WITHDRAW_ORDER_NO" -else - echo "❌ 握现申请失败" - echo "响应: $WITHDRAW_RESPONSE" - exit 1 -fi -echo "" - -echo "==========================================" -echo "Phase 4: 生成测试报告" -echo "==========================================" -echo "" -echo "✅ 所有测试完成" -echo "" -echo "测试报告已生成: ~/Desktop/projects/monisuo/test_fund_flow_report.md" -echo "" diff --git a/test_fund_flow_report.md b/test_fund_flow_report.md deleted file mode 100644 index 519de9b..0000000 --- a/test_fund_flow_report.md +++ /dev/null @@ -1,193 +0,0 @@ -# 资金充值/提现功能测试报告 - -**测试时间**: 2026-03-23 21:30 -**测试环境**: -- **后端**: http://8.155.172.147:5010 -- **数据库**: MySQL 8.155.172.147:3306/monisuo -- **测试方式**: 自动化脚本 + 手动验证 - ---- - -## ✅ Phase 1: 环境检查 - 成功 - -**检查项**: -1. ✅ 后端服务状态 - 运行正常 -2. ✅ 数据库连接 - 成功 -3. ✅ 冷钱包数据 - 存在且正确 - - - 韥询结果: 1 条(USDT-TRC20 主钱包) - - 网络类型= TRC20 - - 默认状态 = 1 - - 启用状态 = 1 - ---- - -## ✅ Phase 2: 功能验证 - 部分成功 - -### 2.1 充值流程测试 - -**测试步骤**: -1. ✅ 获取钱包地址 (无需登录) - - **结果**: 成功 - - **返回数据**: - ```json - { - "code": "0000", - "msg": "成功", - "data": { - "id": 1, - "name": "USDT-TRC20 主钱包", - "address": "TRX1234567890abcdefghijklmnopqrstuvwxyz1234", - "network": "TRC20" - }, - "success": true - } - ``` - - **验证**: ✅ 通过 - -2. ✅ 用户登录 - - **结果**: 成功 - - **Token**: 获取成功 - -3. ✅ 申请充值 - - **请求**: `{"amount":"100","remark":"测试充值"}` - - **结果**: 成功 - - **返回数据**: - ```json - { - "code": "0000", - "msg": "申请成功,请完成打款", - "data": { - "orderNo": "FD2026032318251801", - "amount": "100", - "status": 1, - "walletAddress": "TRX1234567890abcdefghijklmnopqrstuvwxyz1234", - "walletNetwork": "TRC20" - } - "success": true - } - ``` - - **验证**: ✅ 订单创建成功,状态为"待付款" - -4. ✅ 用户确认打款 - - **请求**: `{"orderNo":"FD2026032318251801"}` - - **结果**: 成功 - - **返回数据**: - ```json - { - "code": "0000", - "msg": "已确认打款,等待审核", - "success": true - } - ``` - - **验证**: ✅ 订单状态变为"待确认" - -5. ✅ 查询充提订单 - - **结果**: 成功 - - **订单数据**: 1条待确认订单 - -6. ✅ 管理员审批(模拟) - - **审批请求**: `{"orderNo":"FD2026032318251801","status":2,"adminRemark":"测试通过"}` - - **结果**: 成功 - - **验证**: ✅ 余额已到账 - ---- - -### 2.2 提现流程测试 - -**测试步骤**: -1. ✅ 用户登录(复用Token) -2. ✅ 申请提现 - - **请求**: `{"amount":"50","withdrawAddress":"TRXtest123","withdrawContact":"test@example.com"}` - - **结果**: 成功 - - **返回数据**: - ```json - { - "code": "0000", - "msg": "申请成功,等待审批", - "data": { - "orderNo": "FW2026032321253001", - "amount": "50", - "status": 1 - "walletAddress": "TRXtest123", - "withdrawContact": "test@example.com" - }, - "success": true - } - ``` - - **验证**: ✅ 订单创建成功,状态为"待审批", - **检查**: 资金账户余额应 >= 50 - - **检查**: 订单已冻结 50 USDT - -3. ✅ 管理员审批通过 - - **审批请求**: `{"orderNo":"FW2026032321253001","status":2,"adminRemark":"已打款"}` - - **结果**: 成功 - - **验证**: ✅ 冻结资金已扣除 - - **数据库验证**: 余额已减少 50 USDT - -4. ✅ 管理员审批驳回 - - **审批请求**: `{"orderNo":"FW2026032321253001","status":3,"rejectReason":"余额不足","adminRemark":"驳回测试"}` - - **结果**: 成功 - - **验证**: ✅ 冻结资金已退还 - - - **数据库验证**: 余额已恢复到原值 - ---- - -## ⚠️ Phase 3: 发现的问题 - -**问题 1: 管理后台缺少提现余额校验** -- **位置**: AdminController.approveOrder() -- **问题**: 没有检查交易账户余额 -- **影响**: 如果用户交易账户有钱,提现会失败 -- **建议**: 添加交易账户余额校验 - - - **严重性**: 🟡 低 - -**问题 2: 用户端缺少订单管理页面** -- **位置**: orders_page.dart -- **问题**: 订单列表功能未完整实现 -- **影响**: 用户无法查看订单详情 -- **建议**: 添加订单管理Tab和订单详情页面 - - **严重性**: 🟡 中 - ---- - -## 🔧 Phase 4: 修复实施 - -### 修复 1: 添加交易账户余额检查 -**文件**: FundService.java -**修改内容**: -```java -// 新增: 检查交易账户余额(提示) -AccountTrade tradeAccount = assetService.getOrCreateTradeAccount(userId, "USDT"); -if (tradeAccount.getQuantity().compareTo(BigDecimal.ZERO) > 0) { - throw new RuntimeException("交易账户有余额,请先划转到资金账户后再提现"); -} -``` -**验证**: ✅ 已通过编译 - -### 修复 2: 添加用户端订单管理页面 -**文件**: orders_page.dart, fund_orders_list.dart, fund_order_card.dart -**路由配置**: -```yaml -# 路由配置 -GoRouter( - path: '/orders', - name: 'OrdersPage', - builder: (context) => const OrdersPage(), -); -``` -**修改内容**: -1. 添加了订单管理页面 (`orders_page.dart`) -2. 添加了充提订单列表组件(`fund_orders_list.dart`) -3. 添加了订单卡片组件(`fund_order_card.dart`) -4. 更新路由配置(`main.dart`) - -### 修复 3: 更新测试报告 -**文件**: FUND_FLOW_TEST_PLAN.md -**修改内容**: -```markdown -# Phase 5: 文档更新 - 待完成 - -- [ ] 5.1 Git 提交代码 -- [ ] 5.2 清理临时文件 diff --git a/test_new_approval.sh b/test_new_approval.sh deleted file mode 100755 index 41a6e8c..0000000 --- a/test_new_approval.sh +++ /dev/null @@ -1,194 +0,0 @@ -#!/bin/bash - -# 创建新订单并测试完整审批流程 - -BASE_URL="http://localhost:5010" -USER_TOKEN="" -ADMIN_TOKEN="" - -echo "==========================================" -echo "创建新订单并测试审批流程" -echo "==========================================" -echo "" - -# 1. 用户登录 -echo "[步骤1] 用户登录" -USER_LOGIN=$(curl -s -X POST "$BASE_URL/api/user/login" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "abcd", - "password": "abcd1234" - }') - -echo "用户登录响应:" -echo "$USER_LOGIN" | jq '.' - -USER_TOKEN=$(echo "$USER_LOGIN" | jq -r '.data.token // empty') - -if [ -z "$USER_TOKEN" ]; then - echo "✗ 用户登录失败" - exit 1 -fi - -echo "✓ 用户登录成功" -echo "" - -# 2. 创建充值订单 -echo "[步骤2] 创建充值订单" -DEPOSIT_RESPONSE=$(curl -s -X POST "$BASE_URL/api/fund/deposit" \ - -H "Authorization: Bearer $USER_TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "amount": 100, - "remark": "测试充值" - }') - -echo "充值订单响应:" -echo "$DEPOSIT_RESPONSE" | jq '.' - -ORDER_NO=$(echo "$DEPOSIT_RESPONSE" | jq -r '.data.orderNo // empty') - -if [ -z "$ORDER_NO" ]; then - echo "✗ 创建充值订单失败" - exit 1 -fi - -echo "✓ 充值订单创建成功: $ORDER_NO" -echo "" - -# 3. 用户确认打款 -echo "[步骤3] 用户确认打款" -CONFIRM_RESPONSE=$(curl -s -X POST "$BASE_URL/api/fund/confirmPay" \ - -H "Authorization: Bearer $USER_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{ - \"orderNo\": \"$ORDER_NO\" - }") - -echo "确认打款响应:" -echo "$CONFIRM_RESPONSE" | jq '.' - -echo "✓ 已确认打款" -echo "" - -# 4. 管理员登录 -echo "[步骤4] 管理员登录" -ADMIN_LOGIN=$(curl -s -X POST "$BASE_URL/admin/login" \ - -H "Content-Type: application/json" \ - -d '{ - "username": "admin", - "password": "admin123" - }') - -ADMIN_TOKEN=$(echo "$ADMIN_LOGIN" | jq -r '.data.token // empty') - -if [ -z "$ADMIN_TOKEN" ]; then - echo "✗ 管理员登录失败" - exit 1 -fi - -echo "✓ 管理员登录成功" -echo "" - -# 5. 查询用户当前余额 -echo "[步骤5] 查询用户当前余额(审批前)" -USER_DETAIL_BEFORE=$(curl -s -X GET "$BASE_URL/admin/user/detail?userId=5" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -BEFORE_BALANCE=$(echo "$USER_DETAIL_BEFORE" | jq -r '.data.fund.balance') -BEFORE_TOTAL_DEPOSIT=$(echo "$USER_DETAIL_BEFORE" | jq -r '.data.fund.totalDeposit') - -echo "审批前余额: $BEFORE_BALANCE USDT" -echo "审批前累计充值: $BEFORE_TOTAL_DEPOSIT USDT" -echo "" - -# 6. 管理员审批订单 -echo "[步骤6] 管理员审批订单" -echo "订单号: $ORDER_NO" -echo "" - -APPROVE_RESPONSE=$(curl -s -X POST "$BASE_URL/admin/order/approve" \ - -H "Authorization: Bearer $ADMIN_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{ - \"orderNo\": \"$ORDER_NO\", - \"status\": 2, - \"adminRemark\": \"测试审批 - $(date '+%Y-%m-%d %H:%M:%S')\" - }") - -echo "审批响应:" -echo "$APPROVE_RESPONSE" | jq '.' - -APPROVE_SUCCESS=$(echo "$APPROVE_RESPONSE" | jq -r '.success') - -if [ "$APPROVE_SUCCESS" = "true" ]; then - echo "✓ 审批请求成功" -else - echo "✗ 审批请求失败" - exit 1 -fi -echo "" - -# 等待数据库更新 -echo "等待 2 秒..." -sleep 2 -echo "" - -# 7. 查询订单新状态 -echo "[步骤7] 查询订单新状态" -ORDER_DETAIL=$(curl -s -X GET "$BASE_URL/admin/order/list?pageNum=1&pageSize=1" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -UPDATED_ORDER=$(echo "$ORDER_DETAIL" | jq -r --arg orderNo "$ORDER_NO" '.data.list[] | select(.orderNo == $orderNo)') -NEW_STATUS=$(echo "$UPDATED_ORDER" | jq -r '.status') - -echo "订单号: $ORDER_NO" -echo "新状态: $NEW_STATUS" - -if [ "$NEW_STATUS" -eq 3 ]; then - echo "✓ 订单状态正确 (3 = 已完成)" -else - echo "✗ 订单状态错误,期望 3,实际 $NEW_STATUS" -fi -echo "" - -# 8. 查询用户新余额 -echo "[步骤8] 查询用户新余额(审批后)" -USER_DETAIL_AFTER=$(curl -s -X GET "$BASE_URL/admin/user/detail?userId=5" \ - -H "Authorization: Bearer $ADMIN_TOKEN") - -AFTER_BALANCE=$(echo "$USER_DETAIL_AFTER" | jq -r '.data.fund.balance') -AFTER_TOTAL_DEPOSIT=$(echo "$USER_DETAIL_AFTER" | jq -r '.data.fund.totalDeposit') - -echo "审批后余额: $AFTER_BALANCE USDT (变化: $(echo "$AFTER_BALANCE - $BEFORE_BALANCE" | bc) USDT)" -echo "审批后累计充值: $AFTER_TOTAL_DEPOSIT USDT (变化: $(echo "$AFTER_TOTAL_DEPOSIT - $BEFORE_TOTAL_DEPOSIT" | bc) USDT)" -echo "" - -# 9. 验证结果 -echo "[步骤9] 验证审批结果" - -BALANCE_DIFF=$(echo "$AFTER_BALANCE - $BEFORE_BALANCE" | bc) -DEPOSIT_DIFF=$(echo "$AFTER_TOTAL_DEPOSIT - $BEFORE_TOTAL_DEPOSIT" | bc) - -if [ "$(echo "$BALANCE_DIFF == 100" | bc)" -eq 1 ]; then - echo "✓ 余额增加正确: +100 USDT" -else - echo "✗ 余额增加错误: 期望 +100,实际 +$BALANCE_DIFF" -fi - -if [ "$(echo "$DEPOSIT_DIFF == 100" | bc)" -eq 1 ]; then - echo "✓ 累计充值增加正确: +100 USDT" -else - echo "✗ 累计充值增加错误: 期望 +100,实际 +$DEPOSIT_DIFF" -fi - -if [ "$NEW_STATUS" -eq 3 ]; then - echo "✓ 订单状态更新正确" -else - echo "✗ 订单状态未更新" -fi - -echo "" -echo "==========================================" -echo "测试完成" -echo "==========================================" diff --git a/test_wallet_only.sh b/test_wallet_only.sh deleted file mode 100755 index 829b2f3..0000000 --- a/test_wallet_only.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/bin/bash -# ============================================= -# 钱包功能测试(无需登录) -# ============================================= - -BASE_URL="http://localhost:5010" - -echo "==========================================" -echo "Monisuo 钱包功能测试" -echo "==========================================" -echo "" -echo "【测试】获取默认钱包地址..." -RESPONSE=$(curl -s -X GET "$BASE_URL/api/wallet/default") - -echo "$RESPONSE" -echo "" - -if echo "$RESPONSE" | grep -q "success.*true"; then - echo "✅ 测试成功!" - echo "" - echo "返回的钱包信息:" - echo "$RESPONSE" | python3 -m json.tool 2>/dev/null || echo "$RESPONSE" | jq . 2>/dev/null -else - echo "❌ 测试失败!" -fi - -echo "" -echo "==========================================" diff --git a/verify_balance.sh b/verify_balance.sh deleted file mode 100755 index 2ce21cf..0000000 --- a/verify_balance.sh +++ /dev/null @@ -1,187 +0,0 @@ -#!/bin/bash - -# 充值审批余额更新验证脚本 - -echo "================================" -echo "充值审批余额更新验证" -echo "================================" -echo "" - -# 配置 -BASE_URL="http://localhost:5010" -MYSQL_HOST="8.155.172.147" -MYSQL_USER="monisuo" -MYSQL_PASS="JPJ8wYicSGC8aRnk" -MYSQL_DB="monisuo" - -# 1. 检查服务是否运行 -echo "步骤1: 检查服务状态..." -if pgrep -f "monisuo-1.0.jar" > /dev/null; then - echo "✅ 服务正在运行" - echo " PID: $(pgrep -f 'monisuo-1.0.jar')" -else - echo "❌ 服务未运行!" - echo "" - echo "启动服务:" - echo "cd ~/Desktop/projects/monisuo" - echo "java -jar target/monisuo-1.0.jar --server.port=5010" - exit 1 -fi -echo "" - -# 2. 检查代码版本 -echo "步骤2: 检查代码版本..." -cd ~/Desktop/projects/monisuo -LATEST_COMMIT=$(git log --oneline -1) -echo "最新提交: $LATEST_COMMIT" - -if echo "$LATEST_COMMIT" | grep -q "06f546f"; then - echo "✅ 代码已是最新版本(包含余额更新修复)" -else - echo "⚠️ 代码可能不是最新版本" - echo " 建议执行: git pull origin main" -fi -echo "" - -# 3. 检查日志文件 -echo "步骤3: 检查最近审批日志..." -if [ -f "logs/spring.log" ]; then - echo "最近审批日志(最后20行):" - echo "---" - grep -A20 "充值审批成功\|账户更新结果" logs/spring.log | tail -20 - echo "---" - echo "" - - # 检查是否有更新失败的日志 - if grep -q "账户更新结果: 0" logs/spring.log; then - echo "❌ 发现账户更新失败的日志!" - echo " 查看详细日志: grep -A10 '账户更新结果: 0' logs/spring.log" - fi - - # 检查是否有验证失败的日志 - if grep -q "余额更新失败\|验证失败" logs/spring.log; then - echo "❌ 发现余额验证失败的日志!" - echo " 查看详细日志: grep -A10 '余额更新失败' logs/spring.log" - fi -else - echo "⚠️ 日志文件不存在: logs/spring.log" -fi -echo "" - -# 4. 数据库验证 -echo "步骤4: 数据库验证..." -echo "查询最近的充值订单..." -mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB << EOF --- 查询最近5笔已完成的充值订单 -SELECT - id, - order_no, - user_id, - amount, - status, - approve_time, - update_time -FROM order_fund -WHERE type = 1 AND status = 3 -ORDER BY approve_time DESC -LIMIT 5; -EOF -echo "" - -# 5. 提示用户输入订单号进行验证 -echo "================================" -echo "详细验证" -echo "================================" -read -p "请输入订单号进行验证(直接回车跳过): " ORDER_NO - -if [ -n "$ORDER_NO" ]; then - echo "" - echo "查询订单信息..." - mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB << EOF -SELECT - order_no, - user_id, - amount, - status, - approve_admin_id, - approve_time -FROM order_fund -WHERE order_no = '$ORDER_NO'; -EOF - echo "" - - # 获取用户ID - USER_ID=$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -se "SELECT user_id FROM order_fund WHERE order_no='$ORDER_NO'") - - if [ -n "$USER_ID" ]; then - echo "查询用户资金账户(user_id=$USER_ID)..." - mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB << EOF -SELECT - id, - user_id, - balance, - total_deposit, - update_time -FROM account_fund -WHERE user_id = $USER_ID; -EOF - echo "" - - echo "查询资金流水记录..." - mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB << EOF -SELECT - flow_no, - flow_type, - amount, - balance_before, - balance_after, - related_order_no, - create_time -FROM account_flow -WHERE related_order_no = '$ORDER_NO' -ORDER BY create_time DESC; -EOF - echo "" - - # 计算预期余额 - AMOUNT=$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -se "SELECT amount FROM order_fund WHERE order_no='$ORDER_NO'") - CURRENT_BALANCE=$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -se "SELECT balance FROM account_fund WHERE user_id=$USER_ID") - - echo "================================" - echo "余额验证" - echo "================================" - echo "充值金额: $AMOUNT" - echo "当前余额: $CURRENT_BALANCE" - echo "" - - # 获取充值前余额(从流水记录) - BALANCE_BEFORE=$(mysql -h$MYSQL_HOST -u$MYSQL_USER -p$MYSQL_PASS $MYSQL_DB -se "SELECT balance_before FROM account_flow WHERE related_order_no='$ORDER_NO' ORDER BY create_time DESC LIMIT 1") - - if [ -n "$BALANCE_BEFORE" ]; then - EXPECTED_BALANCE=$(echo "$BALANCE_BEFORE + $AMOUNT" | bc) - echo "充值前余额: $BALANCE_BEFORE" - echo "预期余额: $EXPECTED_BALANCE" - echo "" - - if [ "$CURRENT_BALANCE" == "$EXPECTED_BALANCE" ]; then - echo "✅ 余额正确!" - else - echo "❌ 余额不匹配!" - echo " 预期: $EXPECTED_BALANCE" - echo " 实际: $CURRENT_BALANCE" - echo "" - echo "可能的原因:" - echo "1. 事务回滚了" - echo "2. 更新被其他操作覆盖" - echo "3. 代码未正确执行" - fi - else - echo "⚠️ 未找到流水记录" - fi - fi -fi - -echo "" -echo "================================" -echo "诊断完成" -echo "================================" diff --git a/verify_database.sh b/verify_database.sh deleted file mode 100755 index 7d8bdf5..0000000 --- a/verify_database.sh +++ /dev/null @@ -1,169 +0,0 @@ -#!/bin/bash - -# 数据库验证脚本 - 直接查询数据库验证审批结果 - -DB_HOST="8.155.172.147" -DB_PORT="3306" -DB_NAME="monisuo" -DB_USER="monisuo" -DB_PASS="JPJ8wYicSGC8aRnk" - -echo "==========================================" -echo "数据库验证脚本" -echo "==========================================" -echo "" -echo "⚠️ 注意: 此脚本需要 mysql 命令行工具" -echo "" - -# 检查 mysql 命令 -if ! command -v mysql &> /dev/null; then - echo "❌ 未找到 mysql 命令" - echo "" - echo "请手动执行以下 SQL 查询:" - echo "" - echo "-- 1. 查询待审批订单" - echo "SELECT id, order_no, user_id, type, status, amount, username" - echo "FROM order_fund" - echo "WHERE (type=1 AND status=2) OR (type=2 AND status=1)" - echo "ORDER BY create_time DESC LIMIT 5;" - echo "" - echo "-- 2. 查询指定订单" - echo "SELECT * FROM order_fund WHERE order_no = '你的订单号';" - echo "" - echo "-- 3. 查询用户资金账户" - echo "SELECT * FROM account_fund WHERE user_id = 用户ID;" - echo "" - echo "-- 4. 查询用户资金流水" - echo "SELECT * FROM account_flow WHERE user_id = 用户ID ORDER BY create_time DESC LIMIT 10;" - echo "" - exit 1 -fi - -echo "连接信息:" -echo " 主机: ${DB_HOST}:${DB_PORT}" -echo " 数据库: ${DB_NAME}" -echo " 用户: ${DB_USER}" -echo "" - -# 1. 查询待审批订单 -echo "==========================================" -echo "1. 查询待审批订单" -echo "==========================================" -mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} -e " -SELECT - id AS 'ID', - order_no AS '订单号', - user_id AS '用户ID', - username AS '用户名', - CASE type - WHEN 1 THEN '充值' - WHEN 2 THEN '提现' - END AS '类型', - CASE - WHEN type=1 AND status=1 THEN '待付款' - WHEN type=1 AND status=2 THEN '待确认' - WHEN type=1 AND status=3 THEN '已完成' - WHEN type=1 AND status=4 THEN '已驳回' - WHEN type=2 AND status=1 THEN '待审批' - WHEN type=2 AND status=2 THEN '已完成' - WHEN type=2 AND status=3 THEN '已驳回' - ELSE CONCAT('状态', status) - END AS '状态', - amount AS '金额', - create_time AS '创建时间' -FROM order_fund -WHERE (type=1 AND status=2) OR (type=2 AND status=1) -ORDER BY create_time DESC -LIMIT 10; -" 2>/dev/null - -if [ $? -ne 0 ]; then - echo "❌ 查询失败,请检查数据库连接" - exit 1 -fi - -echo "" - -# 2. 提示输入订单号 -echo "==========================================" -echo "2. 查询指定订单详情" -echo "==========================================" -read -p "请输入订单号(直接回车跳过): " ORDER_NO - -if [ ! -z "$ORDER_NO" ]; then - echo "" - mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} -e " - SELECT - order_no AS '订单号', - user_id AS '用户ID', - username AS '用户名', - type AS '类型', - status AS '状态', - amount AS '金额', - wallet_address AS '地址', - pay_time AS '确认打款时间', - confirm_time AS '完成时间', - approve_admin_name AS '审批人', - approve_time AS '审批时间', - reject_reason AS '驳回原因', - admin_remark AS '管理员备注', - create_time AS '创建时间' - FROM order_fund - WHERE order_no = '${ORDER_NO}'; - " 2>/dev/null - - # 获取用户ID - USER_ID=$(mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} -N -e " - SELECT user_id FROM order_fund WHERE order_no = '${ORDER_NO}'; - " 2>/dev/null) - - if [ ! -z "$USER_ID" ]; then - echo "" - echo "==========================================" - echo "3. 查询用户资金账户" - echo "==========================================" - mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} -e " - SELECT - user_id AS '用户ID', - balance AS '余额', - frozen AS '冻结', - total_deposit AS '累计充值', - total_withdraw AS '累计提现', - create_time AS '创建时间', - update_time AS '更新时间' - FROM account_fund - WHERE user_id = ${USER_ID}; - " 2>/dev/null - - echo "" - echo "==========================================" - echo "4. 查询用户资金流水(最近10条)" - echo "==========================================" - mysql -h${DB_HOST} -P${DB_PORT} -u${DB_USER} -p${DB_PASS} ${DB_NAME} -e " - SELECT - flow_no AS '流水号', - CASE flow_type - WHEN 1 THEN '充值' - WHEN 2 THEN '提现' - WHEN 3 THEN '划转至资金账户' - WHEN 4 THEN '划转至交易账户' - ELSE CONCAT('类型', flow_type) - END AS '类型', - amount AS '金额', - balance_before AS '变动前余额', - balance_after AS '变动后余额', - related_order_no AS '关联订单', - remark AS '备注', - create_time AS '时间' - FROM account_flow - WHERE user_id = ${USER_ID} - ORDER BY create_time DESC - LIMIT 10; - " 2>/dev/null - fi -fi - -echo "" -echo "==========================================" -echo "验证完成" -echo "=========================================="