hailin
cf07eb03be
feat(snapshot): 数据快照备份服务全量实现(纯新增,零侵入)
...
一套代码两处部署的在线备份编排服务,为 1.0 认种分配系统和 2.0 算力挖矿系统
分别提供 PostgreSQL / Redis / Kafka / ZooKeeper / MinIO / Uploads 的在线备份能力。
管理员在 admin-web / mining-admin-web 中选择备份目标和存储方式,点击备份后系统
串行执行各组件备份,通过 Socket.IO WebSocket 实时推送进度到前端。
## 后端 snapshot-service(NestJS 10 + Prisma 5 + SQLite)
架构: DDD 四层(api / application / domain / infrastructure)
- api 层:
· SnapshotController — REST API(创建/查询/删除/下载)含 Range/206 断点续传
· SnapshotGateway — Socket.IO WebSocket 实时推送 5 类事件
· HealthController — 健康检查
· CreateSnapshotDto — class-validator 验证
· toSnapshotResponse — BigInt→string 序列化
- application 层:
· SnapshotOrchestratorService — 核心编排引擎
- startSnapshot() 异步启动,不阻塞 HTTP
- 按 PG→Redis→Kafka→ZK→MinIO→Uploads 顺序串行执行
- 单目标失败不中断整体任务
- MinIO 模式: 备份完上传到 MinIO 后删除本地临时文件
- LOCAL 模式: 保留在服务器临时目录供下载
- @Cron(EVERY_HOUR) 自动清理过期本地备份(默认 72h)
- runningTaskId 防止并发执行
- domain 层:
· BackupTarget 枚举(6 种目标)+ BACKUP_TARGET_ORDER 执行顺序
· SnapshotStatus 枚举(PENDING/RUNNING/COMPLETED/FAILED)
· StorageType 枚举(MINIO/LOCAL)
· BackupHandler 接口 + BACKUP_HANDLER_TOKEN
- infrastructure 层:
· 6 个备份 Handler(均实现 BackupHandler 接口):
- PostgresBackupHandler: pg_basebackup 通过网络流式备份,解析 stderr 进度
- RedisBackupHandler: BGSAVE + LASTSAVE 轮询 + 打包 dump.rdb/AOF
- KafkaBackupHandler: archiver 打包数据卷,按字节计算进度
- ZookeeperBackupHandler: archiver 打包 data/ + log/
- MinioBackupHandler: SDK 列举并下载所有桶(排除备份桶)后打包
- UploadsBackupHandler: archiver 打包上传文件目录
· 2 个存储适配器:
- MinioStorageAdapter: fPutObject 上传 / removeObjects 批量删除
- LocalStorageAdapter: 本地临时目录管理 + 过期清理
· PrismaService (SQLite) + SnapshotRepository (完整 CRUD)
· BACKUP_HANDLER_TOKEN 工厂: 根据 AVAILABLE_TARGETS 环境变量过滤可用 handler
- Prisma Schema (SQLite):
· SnapshotTask: 主表,targets 存 JSON 字符串,totalSize 用 BigInt
· SnapshotDetail: 明细表,每个目标一行,@@index([taskId])
· onDelete: Cascade 级联删除
- Dockerfile: 多阶段构建,生产镜像安装 postgresql-client + mc (MinIO CLI)
SQLite 使用 prisma db push 而非 migrate deploy
- 部署端口: 1.0 系统 = 3099,2.0 系统 = 3199
## Docker Compose overlay(纯新增,不修改现有 docker-compose)
- docker-compose.snapshot.yml (1.0):
· 挂载 redis_data/kafka_data/zookeeper_data/zookeeper_log/admin_uploads_data 只读卷
· AVAILABLE_TARGETS=POSTGRES,REDIS,KAFKA,ZOOKEEPER,MINIO,UPLOADS
· 依赖 postgres + redis 健康检查
- docker-compose.2.0-snapshot.yml (2.0 standalone):
· 挂载 redis_2_data/mining-admin-uploads/trading-uploads 只读卷
· AVAILABLE_TARGETS=POSTGRES,REDIS,UPLOADS
· 依赖 postgres-2 + redis-2 健康检查
## 前端 admin-web(Next.js 15 + SCSS)
- 新增 /snapshots 页面: 创建备份表单 + 实时进度条 + 历史列表 + 下载/删除
- 新增 useSnapshotWebSocket hook: Socket.IO 连接 + 5 类事件监听
- 新增 snapshot.api.ts: 独立 fetch(不走通用 apiClient,snapshot 服务独立端口)
- 新增 snapshot.types.ts: 共享类型定义
- 新增 page.module.scss: 表单/进度条/表格样式
- 修改 Sidebar.tsx: 添加「数据快照」菜单项
- package.json: 添加 socket.io-client 依赖
## 前端 mining-admin-web(Next.js 14 + Tailwind CSS)
- 新增 /snapshots 页面: 同 admin-web 功能,Tailwind CSS 风格
- 新增 useSnapshotWebSocket hook
- 新增 snapshot.api.ts + snapshot.types.ts
- 修改 sidebar.tsx: 添加「数据快照」菜单项 + HardDrive 图标
- package.json: 添加 socket.io-client 依赖
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 21:53:09 -08:00
hailin
b3a3652f21
feat(transfer): 树转让功能全量实现(纯新增,零侵入)
...
实现已认种果树所有权在用户间转让的完整功能。采用方案一:
独立 transfer-service 微服务 + Saga 编排器模式。
=== 架构设计 ===
- Saga 编排器 8 步正向流程:卖方确认 → 冻结资金 → 锁定树 →
变更所有权 → 调整算力 → 更新统计 → 结算资金 → 完成
- 补偿回滚:任一步骤失败自动反向补偿(解冻资金 → 解锁树)
- 13 种状态:PENDING → SELLER_CONFIRMED → PAYMENT_FROZEN →
TREES_LOCKED → OWNERSHIP_TRANSFERRED → CONTRIBUTION_ADJUSTED →
STATS_UPDATED → PAYMENT_SETTLED → COMPLETED / CANCELLED /
FAILED / ROLLING_BACK / ROLLED_BACK
=== Phase 1-2: transfer-service(独立微服务) ===
新建文件:
- Prisma Schema:transfer_orders + transfer_status_logs + outbox_events
- Domain:TransferOrder 聚合根 + TransferFeeService(5% 手续费)
- Application:TransferApplicationService + SagaOrchestratorService
- Infrastructure:Kafka 事件消费/生产 + Outbox Pattern
- API:TransferController(用户端)+ AdminTransferController(管理端)
- External Clients:wallet/planting/identity-service HTTP 客户端
- Docker + 环境配置
=== Phase 3: 现有微服务扩展(纯追加) ===
planting-service:
- Prisma schema 追加 transferLockId 可空字段
- InternalTransferController:锁定/解锁/执行 3 个新端点
- Kafka handlers:transfer-lock/execute/rollback 事件处理
- main.ts 追加 Kafka consumer group 配置
referral-service:
- PlantingTransferredHandler:处理转让后团队统计更新
- TeamStatisticsAggregate 追加 handleTransfer() 方法
- TeamStatisticsRepository 追加 adjustForTransfer() 方法
- ProvinceCityDistribution 追加 transferTrees() 方法
contribution-service:
- TransferOwnershipHandler:处理所有权变更事件
- TransferAdjustmentService:算力调整(879 行核心逻辑)
- Prisma schema 追加 transferOrderId 可空字段
- ContributionAccount 追加 applyTransferAdjustment() 方法
=== Phase 4A: wallet-service(3 个新内部端点) ===
新建文件:
- FreezeForTransferDto / UnfreezeForTransferDto / SettleTransferDto
- FreezeForTransferCommand / UnfreezeForTransferCommand / SettleTransferPaymentCommand
- InternalTransferWalletController(POST freeze/unfreeze/settle-transfer)
修改文件:
- wallet-application.service.ts 追加 3 组方法(+437 行):
freezeForTransfer / unfreezeForTransfer / settleTransferPayment
(乐观锁 + 3 次重试 + Prisma $transaction + 幂等检查)
- 结算操作:单事务内更新 3 个钱包(买方扣减 + 卖方入账 + 手续费归集)
=== Phase 4B: admin-web(转让管理页面) ===
新建文件:
- transferService.ts:API 调用服务 + 完整类型定义
- useTransfers.ts:React Query hooks(list/detail/stats/forceCancel)
- /transfers/page.tsx:列表页(统计卡片 + 搜索筛选 + 分页 + 13 种状态 badge)
- /transfers/[transferOrderNo]/page.tsx:详情页(Saga 时间线 + 状态日志 + 强制取消)
- transfers.module.scss:完整样式
修改文件:
- endpoints.ts 追加 TRANSFERS 端点配置
- Sidebar.tsx 追加「转让管理」菜单项
- hooks/index.ts 追加 useTransfers 导出
=== Phase 4C: mobile-app(转让 UI) ===
新建文件:
- transfer_service.dart:Flutter API 服务 + Model(TransferOrder/Detail/StatusLog)
- transfer_list_page.dart:转让记录列表(全部/转出/转入 Tab + 下拉刷新)
- transfer_detail_page.dart:转让详情(Saga 时间线 + 确认/取消操作)
- transfer_initiate_page.dart:发起转让表单(手续费自动计算)
修改文件:
- injection_container.dart 追加 transferServiceProvider
- route_paths.dart + route_names.dart 追加 3 个路由
- app_router.dart 追加 3 个 GoRoute
- profile_page.dart 追加「发起转让」+「转让记录」按钮行
=== 基础设施 ===
- docker-compose.yml 追加 transfer-service 容器配置
- deploy.sh 追加 transfer-service 部署
- init-databases.sh 追加 transfer_db 数据库初始化
=== 纯新增原则 ===
所有变更均为追加式修改,不修改任何现有业务逻辑:
- 新增 nullable 字段(不影响现有数据)
- 新增 enum 值(不影响现有枚举使用)
- 新增 providers/controllers(不影响现有依赖注入)
- 新增页面/路由(不影响现有页面行为)
回滚方式:删除 transfer-service 目录 + 移除各服务中带 [2026-02-19] 标记的代码
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-19 03:44:02 -08:00
hailin
765a4f41d3
feat(pre-planting): Admin Web 预种管理页面 + Sidebar 入口
...
[2026-02-17] Admin Web 预种计划管理页面完整实现
新增文件:
- (dashboard)/pre-planting/page.tsx: 预种管理页面
- 预种开关控制卡片(开启/关闭 + 状态徽章)
- 四格统计卡片(总订单、总份数、总金额、合成树数)
- Tab 切换:预种订单 / 用户持仓 / 合并记录
- 订单表格:订单号、用户、份数、金额、状态标签、时间
- 持仓表格:用户、累计份数、待合并进度、合成树数、省市
- 合并表格:合并号、用户、树数、来源订单、合同状态、挖矿状态
- 搜索过滤、刷新、加载/错误/空状态处理
- pre-planting.module.scss: 页面样式
- 开关状态卡片(渐变背景,开/关不同主题色)
- 统计网格(4列响应式)
- Tab、表格、状态标签样式
修改文件:
- Sidebar.tsx: 新增"预种管理"菜单项(数据统计与系统维护之间)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-18 05:54:21 -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
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
38fa1f807d
fix(admin-web): 修复 React hooks 规则违规问题
...
- 将所有 useCallback hooks 移动到条件返回之前
- React 要求所有 hooks 必须在任何条件返回之前调用
- 解决客户端异常 "a client-side exception has occurred" 错误
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 06:13:09 -08:00
hailin
603f41f9ca
fix(admin-web): 修复固定账户组件空值检查和 hooks 顺序
...
- 添加 data 空值检查防止 undefined 错误
- 将 useState hooks 移到条件返回之前(React hooks 规则)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 06:05:42 -08:00
hailin
02fa87f6c8
fix(admin-web): 过滤掉不存在的固定系统账户
...
- 添加 filter 过滤掉 data 为 null 的账户
- 修复空白卡片显示问题(账户数据不存在时不显示卡片)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 05:41:58 -08:00
hailin
6350b36e1a
feat(reporting, admin-web): 添加省/市区域账户累计转出统计
...
- 后端 reporting-service: RegionAccountInfo 和汇总接口添加 totalTransferred 字段
- 后端 wallet-service client: 更新 AllSystemAccountsResponse 类型定义
- 前端 admin-web: SystemAccountsTab 组件显示累计转出列
- 前端类型: RegionAccountsSummary 添加 totalTransferred 字段
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:45:56 -08:00
hailin
230e0d98b6
chore(admin-web): 隐藏分类账明细Tab
...
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 04:21:15 -08:00
hailin
1354055f09
fix(admin-web): 修复固定账户明细显示错误
...
问题:点击某账户卡片时显示其他账户的明细
原因:前端硬编码了 accountSequence 与字段名的对应关系,与后端映射不一致
修复:从后端返回数据中读取真实的 accountSequence,而不是硬编码
- accounts 数组现在从 data.xxx.accountSequence 动态获取序列号
- 更新类型定义注释,说明序列号由后端分配
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 23:24:09 -08:00
hailin
d28723f141
fix(wallet-service): 修正固定账户类型映射顺序
...
修复 getAllSystemAccounts 中 fixedAccountTypes 映射错误:
- S0000000001 应为 COST_ACCOUNT (运营1),而非 HQ_COMMUNITY
- S0000000002 应为 OPERATION_ACCOUNT (运营2),而非 COST_ACCOUNT
- S0000000003 应为 HQ_COMMUNITY (总部储蓄),而非 OPERATION_ACCOUNT
此修复确保固定账户的余额、收入和分类账明细正确对应。
同时移除前端调试日志。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 23:20:41 -08:00
hailin
fa0fd3adb3
debug(admin-web): 添加分类账数据匹配调试日志
...
添加 console.log 输出,用于调试固定账户明细数据匹配问题。
请在浏览器开发者工具控制台查看输出,确认后端返回的数据格式。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 23:13:00 -08:00
hailin
e1aec6c2c3
refactor(admin-web): 固定账户明细改为在公共区域显示
...
将固定系统账户的分类账明细从每个卡片内部展开改为在卡片网格下方
的公共区域显示。点击任一账户的"查看明细"按钮,明细表格在下方
完整展示,提供更好的阅读体验。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 22:58:30 -08:00
hailin
d6b3f04612
feat(admin-web): 固定系统账户卡片添加查看分类账明细按钮
...
在固定系统账户卡片下方添加"查看明细"按钮,点击后展开显示
该账户的分类账流水记录,包括时间、类型、金额、余额和备注。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 22:50:03 -08:00
hailin
d53b1c7499
fix(admin-web): 修复 ExpiredRewardsSection 中 ApiResponse 类型使用错误
...
ApiResponse<T> 类型只有 code, message, data 属性,没有 success
将 response.success && response.data 改为 response.data
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 22:44:37 -08:00
hailin
e9c0196d68
feat(admin-web): 添加过期收益明细查询功能
...
- reward-service: 添加 getExpiredRewardsEntries API 查询过期收益明细
- reporting-service: 添加过期收益明细转发接口和类型定义
- admin-web: 过期收益统计区域新增"查看明细"按钮
- 支持分页浏览过期收益记录
- 支持按权益类型筛选
- 显示过期时间、用户ID、账户、权益类型、金额、订单号
回滚方式:删除各服务中标注 [2026-01-07] 的代码块
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 22:36:31 -08:00
hailin
e01c7efc3c
fix(admin-web): 修复区域账户显示省市名称
...
- getAccountDisplayName 支持6位区域代码(如 330100)
- 330100 → 浙江01市 (330100)
- 440600 → 广东06市 (440600)
- RegionAccountsSection 使用 regionCode 解析名称,不依赖后端 regionName
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 21:46:49 -08:00
hailin
2d9d6ceed7
feat(admin-web): 系统账户显示正式名称并保留编码
...
- 添加 SYSTEM_ACCOUNT_NAMES 映射:S0000000001-S0000000006 映射到正式名称
- 添加 PROVINCE_CODE_NAMES 映射:中国省份行政区划代码映射
- 添加 getAccountDisplayName 函数:统一显示格式 "名称 (编码)"
- FixedAccountsSection: 固定账户显示为 "总部账户 (S0000000001)" 格式
- RegionAccountsSection: 区域账户合并显示名称和编码
- LedgerAccountCard: 分类账卡片显示完整账户信息
- FeeAccountSection: 手续费归集账户显示正式名称
- RewardTypeSummarySection: 收益明细显示账户正式名称
- OfflineSettlementSection: 面对面结算明细显示账户正式名称
回滚方式:恢复 imports,删除映射常量和 getAccountDisplayName 函数
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 21:29:14 -08:00
hailin
4e5d9685a1
feat(admin-web): 添加面对面结算明细列表功能
...
- wallet-service: 新增 getOfflineSettlementEntries 方法和 API
- reporting-service: 新增客户端方法和 API 转发
- admin-web: 添加明细列表组件和样式,支持展开/收起
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 20:40:12 -08:00
hailin
4df9895863
feat(admin-web): 完善系统账户报表收益统计显示
...
- 分享引荐收益汇总:显示所有状态(PENDING/SETTLEABLE/SETTLED/EXPIRED)的完整数据
- 面对面结算:改为从 wallet_ledger_entries 表查询 SPECIAL_DEDUCTION 类型
- 新增按状态分组统计表格和详细分类卡片
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 20:11:09 -08:00
hailin
b947fe8205
feat(admin-web): add system account transfer management page
...
- Add system-transfer page with transfer form and order history
- Add SystemWithdrawalService for API calls
- Add useSystemWithdrawal hooks for React Query integration
- Add system-withdrawal types definitions
- Add navigation menu item for system transfer
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 10:30:35 -08:00
hailin
4b5270f130
feat(admin-web): 添加系统账户收益类型详细明细列表功能
...
为系统账户报表中的5个收益类型汇总Tab添加详细明细查看功能:
- 手续费账户汇总:点击"查看详细明细"展开手续费记录列表
- 省团队收益汇总:展开省团队权益记录列表
- 市团队收益汇总:展开市团队权益记录列表
- 分享引荐收益汇总:展开分享权益记录列表
- 社区收益汇总:展开社区权益记录列表
后端变更:
- reward-service: 添加 getRewardEntriesByType、getFeeEntriesDetailed 方法
- reward-service: 添加 /statistics/reward-entries-by-type、/statistics/fee-entries-detailed 接口
- reporting-service: 添加对应的聚合接口
前端变更:
- 添加 RewardEntryDTO、RewardEntriesResponse 类型定义
- 添加 getRewardEntriesByType、getFeeEntriesDetailed API 方法
- FeeAccountSection、RewardTypeSummarySection 组件添加详细明细列表展开功能
- 添加分页支持(每页20条)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 09:19:15 -08:00
hailin
99b725db0a
feat(admin-web): 添加系统账户收益类型汇总统计功能
...
在数据统计-系统账户中新增5个统计Tab:
- 手续费账户汇总:统计成本费、运营费、总部社区基础费、RWAD底池注入
- 省团队收益汇总:统计省团队权益收益
- 市团队收益汇总:统计市团队权益收益
- 分享引荐收益汇总:统计分享权益收益
- 社区收益汇总:统计社区权益收益
后端变更:
- reward-service: 添加 getRewardsSummaryByType、getAllRewardTypeSummaries 方法
- reporting-service: 聚合收益类型汇总统计接口
前端变更:
- 添加 RewardTypeSummary、FeeAccountSummary 类型定义
- 添加 getRewardTypeSummaries API 方法
- 添加 FeeAccountSection、RewardTypeSummarySection 组件
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-06 08:54:35 -08:00
hailin
191b37a5de
fix(admin-web): add null checks to prevent crash in system account report tabs
...
面对面结算和过期收益Tab在数据为空时会崩溃,添加空值检查修复此问题。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 00:15:14 -08:00
hailin
0f3c26c6fa
fix(admin-web): update account names and change USDT to 绿积分
...
- Rename account labels:
- 成本账户 → 总部储备
- 运营账户 → 运营账户1
- 总部社区 → 运营账户2
- RWAD待发放池 → 积分股池
- Change all USDT displays to 绿积分 throughout the system account report
- Add getAssetTypeLabel function for asset type mapping in ledger details
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 23:58:16 -08:00
hailin
44a1023cdd
feat(admin-web): add ledger detail display for system accounts
...
- Add getAllLedger API method in systemAccountReportService
- Add LedgerEntryDTO, FixedAccountLedger, RegionAccountLedger types
- Add ALL_LEDGER endpoint
- Update SystemAccountsTab with ledger detail tab
- Add expandable card UI for viewing account ledger entries
- Add styles for ledger cards and tables
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 23:45:17 -08:00
hailin
6e395ce58c
feat(reporting): add system account report aggregation feature
...
## Changes
- Add system account report aggregation APIs in reporting-service
- Add internal statistics APIs in wallet-service, reward-service, authorization-service
- Add system accounts tab in admin-web statistics page
- Enhanced metadata in reward entries for traceability
## Backend Changes
- wallet-service: Add offline settlement summary and system accounts balances APIs
- reward-service: Add expired rewards summary API
- authorization-service: Add fixed accounts list, region accounts summary APIs
- reporting-service: Add HTTP clients and aggregation service for system account reports
## Frontend Changes
- admin-web: Add SystemAccountsTab component with fixed accounts, region summaries,
offline settlement stats, and expired rewards display
## Rollback Instructions
Each file includes rollback comments with [2026-01-04] tag marking new additions.
To rollback: delete files marked as new, remove code sections marked with date comments.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 22:06:58 -08:00
hailin
d81e230639
refactor(admin-web): 简化授权管理页面,独立共管钱包功能
...
将授权管理页面的共管钱包功能独立成单独页面,并简化授权管理页面:
授权管理页面简化:
- 移除共管钱包部分(已独立)
- 移除后端不支持的复杂配置表单(考核规则、阶梯目标等)
- 保留核心功能:授权列表、筛选、创建授权、撤销授权
- 添加创建授权对话框(用户+类型+地区+跳过考核期)
- 添加撤销授权对话框(带原因输入)
- 支持5种授权类型:社区、省团队、正式省公司、市团队、正式市公司
共管钱包独立页面:
- 新建 /co-managed-wallet 页面
- 复用现有 CoManagedWalletSection 组件
- 侧边栏添加"共管钱包"菜单项
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 18:09:19 -08:00
hailin
a609600cd8
feat(fiat-withdrawal): add complete fiat withdrawal system
...
实现完整的法币提现功能,支持银行卡、支付宝、微信三种收款方式。
此功能与现有的区块链划转功能完全独立,互不影响。
## 后端 (wallet-service)
### 数据库
- 新增 `fiat_withdrawal_orders` 表存储法币提现订单
- 与现有 `withdrawal_orders` 表(区块链划转)完全分离
- 添加完整索引支持高效查询
### 领域层
- 新增 `FiatWithdrawalStatus` 枚举(与 WithdrawalStatus 独立)
- 流程: PENDING -> FROZEN -> REVIEWING -> APPROVED -> PAYING -> COMPLETED
- 或 REJECTED / FAILED / CANCELLED
- 新增 `PaymentMethod` 枚举: BANK_CARD / ALIPAY / WECHAT
- 新增 `FiatWithdrawalOrder` 聚合根
- 新增 `IFiatWithdrawalOrderRepository` 仓储接口
- 新增 `FIAT_WITHDRAWAL` 账本流水类型
### 应用层
- 新增 `FiatWithdrawalApplicationService` 处理业务逻辑
- 发送短信验证码
- 申请法币提现(冻结余额)
- 提交审核
- 审核通过/驳回
- 开始打款
- 完成打款
### API层
- 新增 `FiatWithdrawalController` 提供用户端API
- POST /wallet/fiat-withdrawal/send-sms - 发送验证码
- POST /wallet/fiat-withdrawal - 申请提现
- GET /wallet/fiat-withdrawal - 获取提现记录
- 新增内部API供管理端调用
- GET /api/v1/wallets/fiat-withdrawals - 查询订单
- POST /api/v1/wallets/fiat-withdrawals/:orderNo/review - 审核
- POST /api/v1/wallets/fiat-withdrawals/:orderNo/start-payment - 开始打款
- POST /api/v1/wallets/fiat-withdrawals/:orderNo/complete-payment - 完成打款
## 前端 (admin-web)
- 新增法币提现审核管理页面 `/withdrawals`
- 支持按状态分 Tab 查看订单
- 支持审核通过/驳回
- 支持打款操作
- 支持查看订单详情
## 前端 (mobile-app)
- 新增 `WithdrawFiatPage` 法币提现页面
- 支持选择银行卡/支付宝/微信
- 输入收款账户信息
- 新增 `WithdrawFiatConfirmPage` 确认页面
- 短信验证码验证
- 密码验证
- 在 `WalletService` 中添加法币提现相关方法和模型
## 重要说明
此功能与现有的区块链划转功能 (withdraw_usdt_page.dart) 完全独立:
- 独立的数据库表
- 独立的聚合根
- 独立的状态枚举
- 独立的API端点
- 独立的前端页面
原有的区块链划转功能保持不变,不受任何影响。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 06:39:11 -08:00
hailin
d614d18e97
Revert "feat(withdrawal): implement fiat withdrawal with bank/alipay/wechat"
...
This reverts commit 288d894746 .
2026-01-03 05:44:43 -08:00
hailin
288d894746
feat(withdrawal): implement fiat withdrawal with bank/alipay/wechat
...
Add complete fiat withdrawal feature that allows users to withdraw
green credits (绿积分) to their bank card, Alipay, or WeChat account
with 1:1 CNY conversion. Key changes:
Backend (wallet-service):
- Update Prisma schema with fiat withdrawal fields (paymentMethod,
bankName, bankCardNo, cardHolderName, alipay*, wechat*, review fields)
- Rewrite withdrawal status enum for fiat flow: PENDING → FROZEN →
REVIEWING → APPROVED → PAYING → COMPLETED (or REJECTED/FAILED)
- Add PaymentMethod enum: BANK_CARD, ALIPAY, WECHAT
- Update WithdrawalOrderAggregate with new fiat withdrawal methods
- Add review/payment workflow methods in WalletApplicationService
- Add internal API endpoints for admin withdrawal management
- Remove blockchain withdrawal event handler (no longer needed)
Frontend (admin-web):
- Add withdrawal review management page at /withdrawals
- Add tabs for reviewing/approved/paying order states
- Add withdrawal service and React Query hooks
- Add types for withdrawal orders and payment methods
- Add sidebar menu item for withdrawal review
Frontend (mobile-app):
- Add withdrawFiat() method to WalletService
- Add PaymentMethod enum with BANK_CARD/ALIPAY/WECHAT
- Create new WithdrawFiatPage for fiat withdrawal input
- Create WithdrawFiatConfirmPage with SMS + password verification
- Add routes for /withdraw/fiat and /withdraw/fiat/confirm
- Keep existing withdraw/usdt (划转) pages unchanged
Note: The existing withdraw_usdt_page.dart is for point-to-point
transfer (划转), which is a different feature from fiat withdrawal.
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-03 05:28:05 -08:00
hailin
28e0396a65
feat(pending-actions): add user pending actions system
...
Add a fully optional pending actions system that allows admins to configure
specific tasks that users must complete after login.
Backend (identity-service):
- Add UserPendingAction model to Prisma schema
- Add migration for user_pending_actions table
- Add PendingActionService with full CRUD operations
- Add user-facing API (GET list, POST complete)
- Add admin API (CRUD, batch create)
Admin Web:
- Add pending actions management page
- Support single/batch create, edit, cancel, delete
- View action details including completion time
- Filter by userId, actionCode, status
Flutter Mobile App:
- Add PendingActionService and PendingActionCheckService
- Add PendingActionsPage for forced task execution
- Integrate into splash_page login flow
- Users must complete all pending tasks in priority order
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-02 18:22:51 -08:00
hailin
b1234bc434
feat(admin-web): 添加 TSS WASM 集成,实现与 Service-Party-App 功能对等
...
## 功能概述
Admin-Web 现在可以作为独立的 TSS 参与方参与共管钱包创建,
与 Service-Party-App 桌面应用功能完全对等。
## 主要变更
### 1. TSS WASM 模块 (backend/mpc-system/services/tss-wasm/)
- main.go: Go WASM 模块,封装 bnb-chain/tss-lib
- 支持 keygen 和 signing 操作
- 通过 syscall/js 与 JavaScript 通信
### 2. Admin-Web TSS 库 (frontend/admin-web/src/lib/tss/)
- tss-wasm-loader.ts: WASM 加载器
- tss-client.ts: 高级 TSS 客户端 API
- grpc-web-client.ts: gRPC-Web 客户端连接 Message Router
### 3. 本地存储模块 (frontend/admin-web/src/lib/storage/)
- share-storage.ts: IndexedDB 加密存储
- 使用 AES-256-GCM 加密,PBKDF2 密钥派生
### 4. React Hooks
- useTSSClient.ts: TSS 客户端状态管理
- useShareStorage.ts: 存储操作封装
### 5. 组件更新
- CreateWalletModal.tsx: 集成 TSS 客户端
- 添加密码保护对话框
- 实现真实 keygen 流程
- 自动保存 share 到 IndexedDB
- CoManagedWalletSection.tsx: 使用真实 API
- coManagedWalletService.ts: API 服务层
### 6. WASM 文件
- frontend/admin-web/public/wasm/tss.wasm (~19MB)
- frontend/admin-web/public/wasm/wasm_exec.js (Go 运行时)
## 技术栈
- Go 1.21+ (WASM 编译)
- bnb-chain/tss-lib v2.0.2 (TSS 协议)
- Web Crypto API (AES-256-GCM)
- IndexedDB (本地存储)
- gRPC-Web (消息路由)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 01:39:43 -08:00
hailin
c328d8b59b
feat(mobile-app,admin): 添加系统维护功能和通知徽章功能
...
系统维护功能:
- 后端: 添加系统维护配置实体、仓库和控制器
- 后端: 添加维护模式拦截器,返回503状态码
- admin-web: 添加系统维护管理页面,支持创建/编辑/开关维护配置
- mobile-app: 添加维护状态检查服务和阻断弹窗
- mobile-app: 在启动页、向导页集成维护检查
- mobile-app: 支持App从后台恢复时自动检查维护状态
通知徽章功能:
- 添加通知徽章Provider,监听登录状态自动刷新
- 底部导航栏"我的"标签显示未读通知红点
- 进入通知页面自动刷新徽章状态
- 切换账号、退出登录自动清除徽章
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 23:26:01 -08:00
hailin
fea01642e7
feat(co-managed-wallet): 添加分布式多方共管钱包创建功能
...
## 功能概述
实现分布式多方共管钱包创建功能,包括 Admin-Web 扩展和 Service-Party 桌面应用。
## 主要变更
### 1. Admin-Web 扩展 (前端)
- 新增 CoManagedWalletSection 组件 (frontend/admin-web/src/components/features/co-managed-wallet/)
- 在授权管理页面添加共管钱包入口卡片
- 实现创建钱包向导: 配置 → 邀请 → 生成 → 完成
- 包含组件: ThresholdConfig, InviteQRCode, ParticipantList, SessionProgress, WalletResult
### 2. Admin-Service 后端 API
- 新增共管钱包领域实体和枚举 (domain/entities/co-managed-wallet.entity.ts)
- 新增 REST 控制器 (api/controllers/co-managed-wallet.controller.ts)
- 新增服务层 (application/services/co-managed-wallet.service.ts)
- 新增 Prisma 模型: CoManagedWalletSession, CoManagedWallet
- 更新 app.module.ts 注册新模块
### 3. Session Coordinator 扩展 (Go)
- 新增会话类型: SessionTypeCoManagedKeygen ("co_managed_keygen")
- 扩展 MPCSession 实体添加 WalletName 和 InviteCode 字段
- 更新 PostgreSQL 和 Redis 适配器支持新字段
- 新增数据库迁移: 008_add_co_managed_wallet_fields
### 4. Service-Party 桌面应用 (新项目)
- 位置: backend/mpc-system/services/service-party-app/
- 技术栈: Electron + React + TypeScript + Vite
- 包含模块:
- gRPC 客户端 (连接 Message Router)
- TSS 处理器 (子进程方式运行 Go TSS 协议)
- 本地加密存储 (AES-256-GCM)
- 页面: Home, Join, Create, Session, Settings
## 修改的现有文件 (便于回滚)
1. backend/mpc-system/services/session-coordinator/domain/entities/mpc_session.go
- 添加 SessionTypeCoManagedKeygen 常量
- 添加 IsKeygen() 方法
- 添加 WalletName, InviteCode 字段
- 更新 ReconstructSession, ToDTO, SessionDTO
2. backend/mpc-system/services/session-coordinator/adapters/output/postgres/session_postgres_repo.go
- 更新 SQL 查询包含 wallet_name, invite_code
- 更新 Save, FindByUUID, FindByStatus 等方法
- 更新 scanSessions, sessionRow
3. backend/mpc-system/services/session-coordinator/adapters/output/redis/session_cache_adapter.go
- 更新 sessionCacheEntry 结构
- 更新 sessionToCacheEntry, cacheEntryToSession
4. backend/services/admin-service/prisma/schema.prisma
- 新增 WalletSessionStatus 枚举
- 新增 CoManagedWalletSession, CoManagedWallet 模型
5. backend/services/admin-service/src/app.module.ts
- 导入并注册共管钱包相关组件
6. frontend/admin-web/src/app/(dashboard)/authorization/page.tsx
- 导入并添加 CoManagedWalletSection
7. frontend/admin-web/src/infrastructure/api/endpoints.ts
- 添加 CO_MANAGED_WALLETS API 端点
## 回滚说明
如需回滚此功能:
1. 回滚数据库迁移: 运行 008_add_co_managed_wallet_fields.down.sql
2. 删除新增文件夹:
- backend/mpc-system/services/service-party-app/
- frontend/admin-web/src/components/features/co-managed-wallet/
- backend/services/admin-service/src/**/co-managed-wallet*
3. 恢复修改的文件到前一个版本
4. 运行 prisma generate 重新生成 Prisma 客户端
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-27 21:39:07 -08:00
hailin
41a47b1b53
feat(admin-web): 添加用户标签分配和查看用户功能
...
- 在标签卡片添加"分配用户"和"查看用户"按钮
- 实现批量分配用户到标签的弹窗
- 实现查看标签下用户列表和移除用户功能
- 添加批量分配API (batch-assign)
- 添加获取标签用户API (tag/:id/users)
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 17:36:07 -08:00
hailin
18f24d5f4b
fix(frontend): 修复API响应格式解析问题
...
- 修复userTagService.getTags返回分页响应{items, total}的解析
- 修复audienceSegmentService.getSegments返回分页响应的解析
- 更新组件正确提取items数组
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 17:21:48 -08:00
hailin
b5e45c4532
feat(user-profile): 实现用户画像系统和通知定向功能
...
后端 (admin-service):
- 新增用户标签系统:标签分类、标签定义、用户标签分配
- 新增分类规则引擎:支持自动打标规则
- 新增人群包管理:支持复杂条件组合筛选用户
- 增强通知系统:支持按标签、按人群包、指定用户定向发送
- 新增自动标签同步定时任务
- Prisma Schema 扩展支持新数据模型
前端 (admin-web):
- 通知管理页面新增 Tab 切换:通知列表、用户标签、人群包
- 用户标签管理:分类管理、标签 CRUD、颜色/类型配置
- 人群包管理:条件组编辑器、逻辑运算符配置
- 通知编辑器:支持按标签筛选和指定用户定向
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-24 16:19:05 -08:00
hailin
5d0264db92
feat(admin-web): 添加通知管理功能
...
- 创建通知管理 API 服务 (notificationService.ts)
- 添加通知列表页面,支持创建/编辑/删除/启用禁用
- 添加侧边栏"通知管理"菜单入口
- 支持按类型筛选通知
- 表单支持设置发布时间和过期时间
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-23 22:46:33 -08:00
hailin
9d693b743b
fix(dashboard): 修复 ActivityType 类型不兼容错误
...
将 RecentActivity 组件的 ActivityItem 接口替换为
使用统一的 DashboardActivity 类型,确保类型一致性。
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 02:41:37 -08:00
hailin
900db13e8d
feat(admin-web): 实现 Dashboard 页面真实 API 接入
...
## 概述
将 admin-web Dashboard 页面从模拟数据改为真实 API 调用,
使用 React Query 实现数据获取、缓存和自动刷新。
## 新增文件
- dashboardService.ts: Dashboard API 服务封装
- useDashboard.ts: React Query hooks
- dashboard.types.ts: Dashboard 类型定义
## API 接入
- /dashboard/stats: 统计卡片(总认种量、总用户数、省/市公司数)
- /dashboard/charts: 趋势图表(支持 7d/30d/90d 周期切换)
- /dashboard/region: 区域分布
- /dashboard/activities: 最近活动
## UI 优化
- 添加加载骨架屏
- 添加错误重试机制
- 添加空数据提示
- 优化图表周期切换交互
🤖 Generated with [Claude Code](https://claude.com/claude-code )
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 00:31:49 -08:00
hailin
747e4ae8ef
refactor(mpc-system): migrate to party-driven architecture with PartyID-based routing
...
- Remove Address field from PartyEndpoint (parties connect to router themselves)
- Update K8s Discovery to only manage PartyID and Role labels
- Add Party registration and SessionEvent protobuf definitions
- Implement PartyRegistry and SessionEventBroadcaster domain logic
- Add RegisterParty and SubscribeSessionEvents gRPC handlers
- Prepare infrastructure for party-driven MPC coordination
This is the first phase of migrating from coordinator-driven to party-driven
architecture following international MPC system design patterns.
2025-12-05 08:11:28 -08:00
hailin
ef5e9aec3f
.
2025-11-26 02:09:53 -08:00
hailin
f6ede89b18
PC Web App draft 0.1 Okay.
2025-11-26 01:58:34 -08:00