Commit Graph

858 Commits

Author SHA1 Message Date
hailin cd1d16fc7f feat(admin-web): 批量下载支持断点续传
- 下载前检查文件是否已存在
- 已存在的文件自动跳过
- 显示跳过数量和新下载数量

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 00:22:04 -08:00
hailin b2bace1687 feat(admin-web): 批量下载改为逐个下载到用户选择的目录
- 先弹出目录选择对话框让用户指定保存位置
- 逐个下载合同 PDF 到指定目录
- 显示下载进度(已下载数/总数)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 00:20:13 -08:00
hailin 9771a3d69d fix(admin-web): 修复 TypeScript 类型错误
将 Uint8Array[] 改为 ArrayBuffer[] 以兼容 Blob 构造函数

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 00:07:18 -08:00
hailin 91132ec167 feat(admin-web): 批量下载增加进度条显示
- 显示打包进度和下载进度两个阶段
- 进度条实时更新百分比
- 使用 File System Access API 支持用户选择保存位置

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 00:04:02 -08:00
hailin f97eacdc70 feat(admin-web): 批量下载支持选择保存路径
使用 File System Access API 让管理员可以选择文件保存位置,
而不是自动下载到默认目录。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-06 00:01:40 -08:00
hailin 8b7872d205 fix(admin-web): 批量下载完成后直接触发浏览器另存为对话框
- 创建任务后自动轮询等待完成
- 完成后使用 <a download> 触发浏览器下载对话框
- 按钮显示打包进度
- 打包期间禁用按钮防止重复点击

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:59:04 -08:00
hailin 15019206c8 fix(admin-web): 修复合同下载URL环境变量名错误
使用 NEXT_PUBLIC_API_BASE_URL 替代 NEXT_PUBLIC_API_URL,
与 .env.production 配置保持一致。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:37:46 -08:00
hailin d108d2c693 fix(admin-web): 合同管理省份筛选只使用6位代码
PROVINCE_CODE_NAMES 同时包含2位和6位省份代码,但数据库存储的是6位代码。
筛选下拉菜单只使用6位代码,避免查询不到数据。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 23:32:55 -08:00
hailin 86461a052d feat(contracts): 合同管理功能 - 查询/下载/批量打包
新增功能:
- 合同列表查询(支持省市、状态、时间筛选)
- 单个合同 PDF 下载(支持断点续传)
- 批量下载 ZIP 打包(异步任务处理)
- 增量下载(基于上次下载时间)
- 用户详情页合同 Tab

后端:
- planting-service: 内部合同查询 API
- admin-service: 合同管理控制器、服务、批量下载 Job
- 新增 contract_batch_download_tasks 表

前端:
- 新增独立合同管理页面 /contracts
- 用户详情页新增合同信息 Tab
- 侧边栏新增合同管理入口

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 22:50:17 -08:00
hailin 5bacd21840 feat(mobile-app): 为3个主导航页面添加下拉刷新功能
- TradingPage (兑换): 添加 RefreshIndicator,刷新时重新加载钱包和收益数据
- RankingPage (龙虎榜): 添加 RefreshIndicator,刷新时 invalidate leaderboardStatusProvider
  - 列表视图和待开启状态视图均支持下拉刷新
- MiningPage (监控): 使用 LayoutBuilder + IntrinsicHeight 模式实现
  - 刷新时并行加载用户数据、授权数据和钱包状态

注:ProfilePage 已有完整的下拉刷新实现,无需修改

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 21:50:43 -08:00
hailin a1aba14ccf feat(trade-password): 实现卖出交易的支付密码验证功能
## 后端改动

### auth-service
- user.aggregate.ts: 添加支付密码相关方法 (setTradePassword, verifyTradePassword, hasTradePassword)
- trade-password.service.ts: 新建支付密码业务逻辑服务
- trade-password.controller.ts: 新建支付密码 REST API (status/set/change/verify)
- user.repository.ts: 添加 tradePasswordHash 字段的持久化
- schema.prisma: 添加 trade_password_hash 字段
- migration 0003: 添加支付密码字段迁移

### trading-service
- audit-ledger.service.ts: 新建审计分类账服务 (Append-Only设计,仅INSERT)
- schema.prisma: 添加 AuditLedger 模型和 AuditActionType 枚举
- migration 0008: 添加审计分类账表迁移

## 前端改动 (mining-app)

### 新增页面/组件
- trade_password_page.dart: 支付密码设置/修改页面 (6位数字)
- trade_password_dialog.dart: 交易时的支付密码验证弹窗

### 功能集成
- trading_page.dart: 卖出时检查支付密码
  - 未设置: 提示用户跳转设置页面
  - 已设置: 弹出验证弹窗,验证通过后才能卖出
- profile_page.dart: 账户设置增加"支付密码"入口
- user_providers.dart: 添加支付密码相关 Provider
- auth_remote_datasource.dart: 添加支付密码 API 调用
- api_endpoints.dart: 添加支付密码 API 端点
- routes.dart/app_router.dart: 添加支付密码页面路由

## 安全设计
- 支付密码独立于登录密码 (6位纯数字)
- 审计分类账采用链式哈希保证完整性
- 所有敏感操作记录不可变审计日志

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 18:12:39 -08:00
hailin 1c621c32ec feat(mobile-app): 暂时隐藏自助申请授权页面的"省团队"选项
- 在 _buildAuthorizationTypes() 方法中过滤掉 AuthorizationType.provinceTeam
- 现在"自助申请授权"页面只显示"社区"和"市团队"两个选项
- 原代码以注释形式保留,方便未来需要时快速恢复
- 相关枚举和后端逻辑保持不变,仅前端UI隐藏

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:46:02 -08:00
hailin d29454fc74 feat(admin-web): 省团队收益汇总明细增加来源用户列并修复账户名称显示
问题描述:
1. 省团队收益汇总的详细明细中缺少收益来源用户信息
2. 账户类型显示为数字(如7440000)而不是省名称

修改内容:

1. 后端 reward-service (reward-application.service.ts)
   - getRewardEntriesByType 方法返回值新增 sourceAccountSequence 字段
   - 该字段表示触发此收益的用户账户序列号(来自认种用户)

2. 后端 reporting-service (reward-service.client.ts)
   - RewardEntryDTO 接口新增 sourceAccountSequence 字段

3. 前端 admin-web
   - system-account.types.ts: RewardEntryDTO 新增 sourceAccountSequence 字段
   - system-account.types.ts: getAccountDisplayName 函数支持7开头的省团队账户
     示例:7440000 → "广东省团队 (7440000)"
   - SystemAccountsTab.tsx: 详细明细表格新增"来源用户"列

效果:
- 省团队收益明细现在显示:时间、账户(省名称)、来源用户、订单号、金额、状态
- 账户列显示格式:"{省名}省团队 ({账户序列号})"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:35:22 -08:00
hailin 04d3b2470a feat(admin-web): 将USDT显示文本统一替换为"绿积分"
根据业务需求,将管理后台中所有面向用户显示的"USDT"文本改为"绿积分":

修改文件及内容:
1. system-transfer/page.tsx (7处)
   - 错误提示: "最小划转金额为 1 USDT" → "最小划转金额为 1 绿积分"
   - 余额显示: "余额: xxx USDT" → "余额: xxx 绿积分"
   - 表单标签: "划转金额 (USDT)" → "划转金额 (绿积分)"
   - 表单提示: "最小划转金额为 1 USDT" → "最小划转金额为 1 绿积分"
   - 订单金额、详情弹窗金额、确认弹窗金额显示

2. userDetail.types.ts (2处)
   - DEPOSIT_USDT: 'USDT充值' → '绿积分充值'
   - USDT: 'USDT' → '绿积分'

3. users/[id]/page.tsx (1处)
   - DEPOSIT_USDT: 'USDT充值' → '绿积分充值'

4. formatters.ts (1处)
   - formatCurrency函数中 USDT: '积分 ' → '绿积分 '

注意:所有修改均为纯UI显示文本,不影响程序逻辑和功能。
映射对象的key保持不变,仅修改显示给用户的value值。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 17:29:27 -08:00
hailin 207b522754 feat(customer-service): 客服联系方式从硬编码改为后台可配置
将 mobile-app "联系客服" 弹窗的微信/QQ联系方式从硬编码改为
admin-web 后台动态配置,支持任意数量的联系方式管理。

## Backend (admin-service)

- 新增 Prisma 模型: ContactType 枚举(WECHAT/QQ) + CustomerServiceContact
- 新增迁移 SQL: 建表 + 2条索引 + 4条种子数据(保留现有硬编码联系方式)
- 新增双 Controller (参考 app-asset.controller.ts 模式):
  - AdminCustomerServiceContactController (admin/customer-service-contacts)
    GET 列表 / POST 新增 / PUT 更新 / DELETE 删除
  - PublicCustomerServiceContactController (customer-service-contacts)
    GET 仅返回 isEnabled=true,按 sortOrder 排序
- 注意: 公开 Controller 用 @Controller('customer-service-contacts')
  避免与全局前缀 api/v1 双重叠加

## Kong 网关

- 新增路由 admin-customer-service-contacts-public
  路径 /api/v1/customer-service-contacts → admin-service:3010
- Admin 端点由已有 admin-api 路由 (/api/v1/admin) 覆盖

## Admin-web

- endpoints.ts: 新增 CUSTOMER_SERVICE_CONTACTS 端点组
- customerServiceContactService.ts: CRUD 服务 (list/create/update/delete)
- settings/page.tsx: 新增"客服联系方式管理"区块
  表格展示(排序/类型/标签/联系方式/启停/操作) + 内联新增/编辑表单
- settings.module.scss: contactTable / contactForm / contactFormFields 样式

## Flutter Mobile-app

- storage_keys.dart: 新增 cachedCustomerServiceContacts 缓存 key
- customer_service_contact_service.dart: API + 缓存服务
  (内存5分钟TTL + SharedPreferences持久化 + 后台静默刷新)
- injection_container.dart: 注册 customerServiceContactServiceProvider
- profile_page.dart: _showCustomerServiceDialog() 从硬编码改为
  动态 API 加载,contacts 为空时显示"暂无客服联系方式"占位符

## 文件清单 (4 新建 + 9 修改)

新建:
- backend/.../migrations/20260205100000_add_customer_service_contacts/migration.sql
- backend/.../controllers/customer-service-contact.controller.ts
- frontend/admin-web/src/services/customerServiceContactService.ts
- frontend/mobile-app/lib/core/services/customer_service_contact_service.dart

修改:
- backend/.../prisma/schema.prisma
- backend/.../src/app.module.ts
- backend/api-gateway/kong.yml
- frontend/admin-web/src/infrastructure/api/endpoints.ts
- frontend/admin-web/src/app/(dashboard)/settings/page.tsx
- frontend/admin-web/src/app/(dashboard)/settings/settings.module.scss
- frontend/mobile-app/lib/core/storage/storage_keys.dart
- frontend/mobile-app/lib/core/di/injection_container.dart
- frontend/mobile-app/lib/features/profile/presentation/pages/profile_page.dart

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 05:00:25 -08:00
hailin 34ba209e44 fix(app-assets): 修复公开API路径双重前缀 + Kong网关路由缺失
问题:移动端配置的开屏图/引导图无效
根因:
1. PublicAppAssetController 和 PublicSystemConfigController 的
   @Controller('api/v1/xxx') 与 NestJS 全局前缀 api/v1 叠加,
   导致实际端点为 api/v1/api/v1/xxx(双重前缀)
2. Kong 网关缺少 /api/v1/app-assets 和 /api/v1/system-config 路由
3. Flutter 端使用 /admin-service/api/v1/xxx 路径,不匹配任何 Kong 路由

修复:
- 后端:Controller 路径去掉 api/v1 前缀,由全局前缀统一添加
- Kong:新增 admin-app-assets-public 和 admin-system-config-public 路由
- Flutter:API 路径改为 /app-assets 和 /system-config/display/settings

受影响文件:
- backend/api-gateway/kong.yml (新增2条路由)
- backend/.../app-asset.controller.ts (Controller路径修正)
- backend/.../system-config.controller.ts (Controller路径修正)
- frontend/.../app_asset_service.dart (API路径修正)
- frontend/.../system_config_service.dart (API路径修正)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-05 04:36:53 -08:00
hailin cba7ff590a fix(mining-app): K线蜡烛图最小实体高度优化,消除横线"-"显示
问题:销毁时段(无交易)的小时K线中,open ≈ close(价差仅 ~2.8e-10),
蜡烛实体映射到像素后高度接近0,旧代码强制最小1px导致显示为横线"-"。

修复:将蜡烛实体最小高度从固定1px改为 max(bodyWidth * 0.4, 3.0)px,
即至少为蜡烛宽度的40%或3像素(取较大值),使 doji 蜡烛显示为
可辨识的小方块而非横线。有正常涨跌幅的蜡烛不受影响。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:31:52 -08:00
hailin ef5ac2bf94 fix(mining-app): 价格刷新倒计时与后端销毁调度器同步
- 倒计时不再从页面打开时任意起点开始
- 自动计算距下一个整分钟第3秒的剩余秒数作为初始值
  (销毁在每分钟第0秒执行,留3秒余量等数据库写完)
- 倒计时归零时通过 ref.invalidate 主动刷新价格数据
- 确保每次刷新都能拿到最新的销毁后价格

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:17:10 -08:00
hailin abb0da36a9 feat(mining-app): 兑换页价格刷新改为60秒并显示倒计时
- 价格 Provider 刷新间隔从15秒改为60秒,与后端销毁调度器同步
  (销毁每分钟执行一次,15秒内数据不会变化,避免无意义请求)
- 兑换页"当前积分股价值"右侧新增倒计时显示(60s→1s)
  让用户直观知道下次数据刷新时间

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 21:14:16 -08:00
hailin b639b5d499 fix(mining-app): 价格显示优化 + 涨跌幅精度再提升
- 兑换页顶部价格改用 formatPriceFull 显示完整零(不再用 0.0{n} 缩写)
- K线纵坐标有效数字从7位精简为4位,节省空间更简洁
- 涨跌幅精度再提升:后端 toFixed(8)→toFixed(12),前端 6位→10位小数

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:43:48 -08:00
hailin 2e91686a88 fix(mining-app): 优化页面文案与涨跌幅精度
- 兑换页顶部隐藏价格后方"积分值"文字,界面更简洁
- 兑换页"较上线首日"涨跌幅精度从2位小数提升至6位,每分钟销毁引起的涨幅尾数可见
- 兑换页"黑洞销毁量"文案改为"已销毁量",更直观易懂
- 贡献值页"积分股池实时余量"文案改为"100亿销毁剩余量"
- 后端 priceChangePercent 精度从 toFixed(2) 提升至 toFixed(8),支持前端高精度显示

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:23:59 -08:00
hailin dcc46c37b6 fix(mining-app): 价格有效数字从6位调整为7位,最后2位每分钟可见变化
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:12:15 -08:00
hailin f5d25afab8 fix(mining-app): 价格显示有效数字从3位增加到6位
每分钟销毁引起的价格变化约 4.66e-12(第7位有效数字),
原来只显示3位有效数字 0.0{5}979 无法观察到变化。
改为6位后 0.0{5}979941,最后一位每1-2分钟变化一次,
用户可在兑换页面实时观察到销毁带来的价格上涨。

影响范围:formatPrice、K线图Y轴/十字线、交易记录、挖矿记录

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 20:09:32 -08:00
hailin deffdab18b fix(mobile-upgrade): 股行App版本管理API地址改为 mapi.szaiai.com
mobile-upgrade 部署在榴莲皇后服务器上,股行的 mining-admin-service
运行在另一台服务器(103.39.231.240),需通过 mapi.szaiai.com 域名访问。
原配置 rwaapi.szaiai.com/mining-admin 无法路由到股行服务器,导致 30s 超时。

修改: NEXT_PUBLIC_MINING_API_URL 从 rwaapi.szaiai.com → mapi.szaiai.com

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 19:04:56 -08:00
hailin 59acea33fe feat(trading): K线图增加周/月/年周期
- 前端周期选项增加「周」「月」「年」
- 后端 parsePeriodToMinutes 增加 1w/1M/1y 映射
- getPeriodStart 对日历周期按自然边界对齐:
  - 1w → 周一 00:00 UTC(ISO 周标准)
  - 1M → 月初1日 00:00 UTC
  - 1y → 年初1月1日 00:00 UTC
- 固定周期(1m~1d)仍使用 epoch 模运算,不受影响

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 18:42:38 -08:00
hailin c24f383501 fix(trading): K线Y轴动态缩放 + 价格显示格式统一 + 首日涨幅修复
- K线图Y轴改为只基于可见K线计算范围,实现动态缩放(类似TradingView)
- 价格显示统一使用 0.0{n}xxx 格式替代科学计数法,覆盖全局 formatPrice、
  K线图、交易记录页、挖矿记录页
- 修复"较上线首日"百分比始终显示 +0.00% 的问题:getFirstSnapshot 过滤
  price=0 的早期快照

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 18:36:26 -08:00
hailin f13814e577 fix(mobile-app): 排名详情页隐藏敏感统计字段
火柴人排名详情页 (UserProfilePage) 暂时隐藏以下显示元素(代码保留,注释隐藏):
- 统计卡片:引荐数、同伴数、本人认种数(仅保留"同伴认种")
- 基本信息卡片:用户ID (accountSequence)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 17:41:11 -08:00
hailin d075853a7f feat(app-assets): 应用图片管理 — 开屏图/引导图可从 admin-web 配置
新增从 admin-web 后台管理开屏图(2张)和引导图(5张+标题/副标题)的完整功能链路。
移动端优先使用后台配置的远程图片,无配置或加载失败时自动回退到本地 asset。

### Backend (admin-service)
- Prisma schema 新增 AppAssetType 枚举 + AppAsset 模型 (type/sortOrder 唯一约束)
- 新增 AdminAppAssetController: 图片上传(multipart)、列表查询、元数据更新、删除
- 新增 PublicAppAssetController: 公开查询接口供移动端消费 (仅返回 isEnabled=true)
- 新增数据库 migration: 20260204100000_add_app_assets

### Admin-web
- endpoints.ts 新增 APP_ASSETS 端点组
- 新增 appAssetService.ts: list/upload/update/delete 方法
- Settings 页新增"应用图片管理"区块: 开屏图 2 卡槽 + 引导图 5 卡槽
- 每个卡槽支持: 图片上传预览、启用/禁用开关、删除、引导图额外支持标题和副标题编辑

### Mobile-app (Flutter)
- 新增 AppAssetService: 3 级缓存策略 (内存 5min TTL → SharedPreferences → 后台静默刷新)
- splash_page.dart: 支持远程开屏图 (CachedNetworkImage),fallback 到本地 asset
- guide_page.dart: 支持远程引导图+标题/副标题覆盖,fallback 到本地 asset
- 替换 2 张开屏图为新版 (1280x1826/1834, ~245KB)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-04 11:20:26 -08:00
hailin 50dc18a224 feat(admin-web): 用户管理高级筛选增加"已认种/未认种"过滤
在用户管理页面的"用户状态"下拉框中新增"已认种"和"未认种"两个筛选选项。

实现方式:
- 复用后端已有的 minAdoptions/maxAdoptions 查询参数
- "已认种"映射为 minAdoptions=1(personalAdoptionCount >= 1)
- "未认种"映射为 maxAdoptions=0(personalAdoptionCount = 0)
- 与原有"正常/冻结"状态筛选互斥(同一下拉框)
- 切换筛选时自动重置分页到第 1 页

后端无改动:admin-service 的 ListUsersDto 和 UserQueryRepository
已支持 minAdoptions/maxAdoptions 参数及对应的 WHERE 条件。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 07:58:24 -08:00
hailin ebe7123583 feat(market-maker): 积分股(eUSDT)和积分值(fUSDT)使用独立 MPC 钱包
- Prisma: MarketMakerConfig 新增 eusdt_wallet_address 字段
- 后端: 初始化/更新配置时读取 EUSDT_MARKET_MAKER_ADDRESS 环境变量
- 后端: getConfig API 返回 eusdtWalletAddress
- 前端: 积分股充值弹窗使用 eusdtWalletAddress (不再共用 kavaWalletAddress)
- 前端: 积分值充值弹窗继续使用 kavaWalletAddress (fUSDT 钱包)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 03:39:54 -08:00
hailin 8cfd107a92 refactor(pool-accounts): 移除硬编码钱包名,改为从后端 API 动态获取
- 后端: 新增 GET /admin/pool-accounts 接口,返回从 .env 配置的池账户列表
- 前端: 新增 usePoolAccounts hook,动态渲染池账户卡片
- 前端: 提取 PoolAccountCard 子组件,消除重复代码
- 移除前端硬编码的 BURN_POOL_WALLET_NAME / MINING_POOL_WALLET_NAME 常量

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 02:57:40 -08:00
hailin a5f6b23a95 feat(pool-account): 池账户充值弹窗新增中心化充值 tab
与做市商管理一致,充值弹窗包含"中心化充值"和"区块链充值"两个 tab。
中心化充值直接调整池账户余额(ADJUSTMENT 类型分类账),无需区块链交易。

变更:
- wallet-service: pool-account.service 新增 centralizedDeposit 方法
- wallet-service: pool-account.controller 新增 POST /centralized-deposit
- admin-service: pool-account.controller 新增 POST /:walletName/centralized-deposit 代理
- frontend: configs.api + use-configs hook + configs page 充值弹窗 Tabs UI

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 02:26:31 -08:00
hailin 4f5b18be48 feat(pool-account): 实现池账户区块链充值检测和提现功能
为100亿销毁池和200万挖矿池实现完整的区块链充值/提现流程:
- 充值:独立扫描器检测 fUSDT 转入 → Kafka 事件 → wallet-service 入账
- 提现:前端 → admin-service 代理 → blockchain-service MPC签名转账 → wallet-service 记账

mining-blockchain-service:
- 新增 PoolAccountDeposit/PoolAccountBlockCheckpoint Prisma 模型
- 新增 PoolAccountDepositDetectionService(每5秒扫描 fUSDT 充值,每30秒更新确认数)
- 扩展 MPC 签名客户端支持 burnPool/miningPool 2-of-3 门限钱包
- 扩展 ERC20TransferService 支持池账户 fUSDT 转账
- 新增 API: POST /transfer/pool-account, GET /pool-accounts/:poolType/wallet-info
- 新增 Kafka topic 映射: pool_account.deposit.confirmed → pool_account.deposits

mining-wallet-service:
- TransactionType 枚举新增 BLOCKCHAIN_DEPOSIT/BLOCKCHAIN_WITHDRAW
- Seed: SHARE_POOL_A/B 初始余额改为0(完全靠链上充值)
- PoolAccountService 新增 blockchainDeposit()/blockchainWithdraw() 方法
- 新增 PoolAccountDepositConsumer 监听 Kafka 充值确认事件(Redis+DB 双重幂等)
- 新增 POST /pool-accounts/blockchain-withdraw 内部 API

mining-admin-service:
- 新增 PoolAccountController 代理到 wallet-service + blockchain-service
- GET /admin/pool-accounts/:walletName/balance(并行查询链下余额+链上钱包信息)
- POST /admin/pool-accounts/:walletName/blockchain-withdraw(先链上转账再记账)
- 新增配置: MINING_WALLET_SERVICE_URL, MINING_BLOCKCHAIN_SERVICE_URL, 池钱包用户名

frontend (mining-admin-web):
- 池账户 API 从 tradingClient (→trading-service) 改为 apiClient (→admin-service)
- 移除未使用的 tradingClient 和 axios 依赖

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 01:34:06 -08:00
hailin 4d2bcc7568 fix(mining-admin): 池账户钱包配置移到后端 .env,前端从 API 读取
做市商的 kavaWalletAddress 是后端 API 返回的,池账户应该一样。

- 后端 mining-blockchain-service/.env.example: 新增
  BURN_POOL_WALLET_USERNAME/ADDRESS 和
  MINING_POOL_WALLET_USERNAME/ADDRESS(同做市商钱包配置模式)
- 前端 .env.production: 移除 NEXT_PUBLIC_BURN/MINING_POOL 变量
- 前端 configs/page.tsx: 钱包地址改从 API 响应
  (poolAccountBalance.walletAddress) 读取,未配置时显示提示

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 00:14:38 -08:00
hailin 6dbb620e82 feat(mining-admin): 配置管理新增100亿销毁池和200万挖矿池账户
在配置管理页面新增两个池账户卡片,UI 风格对齐做市商管理中的
"现金余额(积分值)",仅支持区块链方式充值与提现:

- 100亿销毁池 (wallet-22fd661f, 2-of-3 门限)
  地址: 0xdE2932D2A25e1698c1354A41e2e46B414C46F5a1
- 200万挖矿池 (wallet-974e78f5, 2-of-3 门限)
  地址: 0x8BC9091375ae8ef43ae011F0f9bAf10e51bC9D59

具体改动:
- .env.production: 新增 BURN_POOL / MINING_POOL 钱包名和地址环境变量
- configs.api.ts: 新增 tradingClient、PoolAccountBalance 接口、
  getPoolAccountBalance 和 poolAccountBlockchainWithdraw API
- use-configs.ts: 新增 usePoolAccountBalance (30s 刷新) 和
  usePoolAccountBlockchainWithdraw hooks
- configs/page.tsx: 新增两个并排池账户 Card,包含余额展示、
  QR 码充值弹窗、区块链提现弹窗(含 0x 地址校验)

后端需实现:
- GET  /admin/pool-accounts/:walletName/balance
- POST /admin/pool-accounts/:walletName/blockchain-withdraw

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-03 00:02:32 -08:00
hailin 6f43408da5 fix(mining-admin-web): docker-compose 自动连接 rwa-2-network
mining-admin-web 需要同时连接 rwa-network 和 rwa-2-network,
以便通过 Next.js rewrite 直连 rwa-2-network 上的后端服务。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:43:06 -08:00
hailin e99dc122ad fix(nginx): API 请求改为代理到 Next.js 而非直连 mining-admin-service
nginx /api/ 直连 mining-admin-service:3023 会绕过 Next.js rewrite,
导致 /api/trading 和 /api/mining 无法路由到对应服务 (404)。
改为代理到 Next.js (3100), 由 rewrite 规则分发到各后端服务。

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:36:55 -08:00
hailin 0b8c76f8b5 fix(mining-admin-web): Dockerfile 添加 build ARG 传入后端服务地址
next.config.js 的 rewrite 在 next build 时计算, Docker build 阶段
环境变量不可用导致 rewrite 使用 localhost 默认值 (容器内不可达)。

添加 ARG 将服务地址传入 build 阶段:
- NEXT_PUBLIC_API_URL -> mining-admin-service:3023
- TRADING_SERVICE_URL -> trading-service:3022
- MINING_SERVICE_URL -> mining-service:3021

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:32:29 -08:00
hailin 59efdb1f78 fix(mining-admin-web): 修复 API 请求超时和路由问题
问题:
- mining-admin-web 容器与后端服务在不同 Docker 网络, 无法通过公网 IP 回连 (hairpin NAT 失败)
- next.config.js 生产模式强制走 mapi.szaiai.com Kong 网关, 容器内无法访问
- client.ts 使用 NEXT_PUBLIC_API_URL 导致外部 URL 被 build 时内联到客户端包
- mining-service controller 有 mining/ 前缀, 直连模式 rewrite 丢失该前缀

修复:
- next.config.js: 改用 API_GATEWAY_URL 判断路由模式, 未设置则直连后端服务
- next.config.js: mining rewrite 保留 mining/ 前缀匹配 controller 路由
- client.ts: baseURL 固定为 /api, 所有请求统一走 Next.js rewrite 代理
- docker-compose.2.0.yml: 添加 TRADING_SERVICE_URL 和 MINING_SERVICE_URL 环境变量

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-02 01:14:19 -08:00
hailin 394f2529cd fix(mining-admin-web): ensure public dir exists in Docker build
mkdir -p public before build so COPY --from=builder /app/public works
even without static assets.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 22:03:44 -08:00
hailin ad51aa521f fix(mining-admin-web): add public/.gitkeep to fix Docker build
Dockerfile COPY --from=builder /app/public fails when public dir is missing.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 22:03:01 -08:00
hailin 88ad3ab53d feat: 2.0 API 域名从 rwaapi.szaiai.com 迁移到 mapi.szaiai.com
- mining-admin-web: .env.production, next.config.js fallback URL
- mining-app: environment.dart baseUrl, update_config.dart checkUpdateUrl
- docker-compose.2.0.yml: mining-admin-service UPLOAD_BASE_URL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 21:58:03 -08:00
hailin f39fd52001 feat(c2c-bot): rename HOT_WALLET to C2C_BOT_WALLET and change dUSDT to 绿积分
- Rename env vars HOT_WALLET_ADDRESS/USERNAME to C2C_BOT_WALLET_ADDRESS/USERNAME
  in mining-blockchain-service to avoid conflict with existing hot wallet
- Update docker-compose.2.0.yml with new env var names
- Change all "dUSDT" labels to "绿积分" on C2C Bot admin page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 08:40:45 -08:00
hailin 251e37f772 feat(c2c-bot): 添加C2C Bot管理页面,支持运行时开关和热钱包查看
- 新增C2C Bot管理页面(mining-admin-web):Bot开关、热钱包余额/地址/QR码、统计、订单历史
- 新增admin API端点(trading-service):status/enable/disable/orders
- 重构Bot调度器enabled为Redis驱动,支持运行时开关(多实例安全)
- C2cOrderRepository新增findBotPurchasedOrders和getBotStats查询方法
- 侧边栏添加C2C Bot导航入口

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 04:47:28 -08:00
hailin bf772967f5 feat(mining): 批量补发30%分配到运营和总部账户,并添加交易筛选器
- 批量补发时将剩余30%分配到运营(12%)和总部(18%)系统账户
- SystemMiningAccountRepository.mine()支持referenceId/referenceType参数
- BatchMiningExecution新增operationAmount/headquartersAmount字段(含DB迁移)
- 三层架构(mining-service→admin-service→admin-web)全链路支持referenceType筛选
- 系统账户交易记录页面增加"全部/批量补发"筛选按钮

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 04:25:20 -08:00
hailin bcfa5143e3 fix(mining-app): C2C订单详情页自动刷新,列表刷新间隔缩短
- 订单详情 Provider 活跃状态(PENDING/MATCHED/PAID)每10秒自动刷新
  过期/完成/取消后停止刷新,节省资源
- 市场订单和我的订单列表刷新间隔从1分钟缩短到30秒
- 离开订单详情页时立即刷新市场和我的订单列表
  确保过期恢复的新PENDING订单及时在列表中显示

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:23:21 -08:00
hailin 7f2479d995 fix(mining-app): 更新弹窗不可点击外部关闭,订单详情按买卖角色显示不同倒计时文案
- 更新提示弹窗 barrierDismissible 始终为 false,防止用户误触关闭
- 订单详情页根据买家/卖家角色显示不同的倒计时提示文案
  - 买方:你需要在xx:xx内完成付款 / 等待卖方确认收款
  - 卖方:对方将在xx:xx内完成付款 / 请在xx:xx内确认收款

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 01:58:53 -08:00
hailin 73a617b88c fix(c2c): 单价和总金额单位改为绿积分,待付款提示改为对方
- C2C市场列表/接单弹窗中单价和总金额单位从"积分值"改为"绿积分"
- 订单详情待付款倒计时提示改为"对方将在xx:xx内完成付款"

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 00:57:30 -08:00
hailin 64d998c7b3 fix(trading): 卖出金额超过可用积分股时提示并禁用确认按钮
- 新增 _getSellValidationError 校验方法
- 输入金额反算的积分股数量 > 可用余额时显示红色提示
- 校验失败时禁用"确认交易"按钮(灰色)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:29:33 -08:00
hailin b8f8831516 feat: PENDING订单自动过期、接单显示余额、积分股金额输入
1. C2C PENDING订单24小时自动过期并解冻冻结资产
   - 新增 DEFAULT_PENDING_TIMEOUT_HOURS 常量
   - findExpiredOrders 支持 PENDING 状态查询
   - expireOrder 处理 PENDING 卖单解冻

2. C2C接单对话框显示卖方可用余额
   - 确认出售时显示用户账户可用积分值(非订单数量)
   - 新增订单数量行,方便对比

3. 积分股兑换页面新增金额输入
   - 卖出时显示金额输入框(积分值),与数量双向联动
   - 输入数量自动计算金额,输入金额自动反算数量
   - 全部按钮同步更新两个字段

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-31 22:15:47 -08:00