实现已认种果树所有权在用户间转让的完整功能。采用方案一: 独立 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> |
||
|---|---|---|
| .. | ||
| .claude | ||
| admin-service | ||
| auth-service | ||
| authorization-service | ||
| backup-service | ||
| blockchain-service | ||
| contribution-service | ||
| docs | ||
| identity-service | ||
| leaderboard-service | ||
| mining-admin-service | ||
| mining-blockchain-service | ||
| mining-service | ||
| mining-wallet-service | ||
| mpc-service | ||
| planting-service | ||
| presence-service | ||
| referral-service | ||
| reporting-service | ||
| reward-service | ||
| scripts | ||
| trading-service | ||
| transfer-service | ||
| wallet-service | ||
| .env.example | ||
| .gitignore | ||
| README.md | ||
| deploy-mining.sh | ||
| deploy.sh | ||
| docker-compose.2.0.yml | ||
| docker-compose.infra.yml | ||
| docker-compose.yml | ||
| init-multiple-dbs.sh | ||
README.md
RWA Backend Services
统一部署管理 RWA 后端微服务。
架构概览
┌─────────────────────────────────────────────────────────────────┐
│ 192.168.1.100 (Gateway) │
│ ┌─────────────┐ ┌─────────────────────────────────────────┐ │
│ │ Nginx │ │ MPC-System (Go) │ │
│ │ (Reverse │ │ - session-coordinator (:8081) │ │
│ │ Proxy) │ │ - message-router (:8082) │ │
│ │ │ │ - server-party-1/2/3 (:8083-8085) │ │
│ └─────────────┘ │ - account-service (:8080) │ │
│ └─────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
│
│ Internal Network
▼
┌─────────────────────────────────────────────────────────────────┐
│ 192.168.1.111 (Backend) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Docker Compose Services │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ PostgreSQL │ │ Redis │ │ Kafka │ │ │
│ │ │ (:5432) │ │ (:6379) │ │ (:9092) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ identity │ │ wallet │ │ backup │ │ │
│ │ │ (:3000) │ │ (:3001) │ │ (:3002) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ planting │ │ referral │ │ reward │ │ │
│ │ │ (:3003) │ │ (:3004) │ │ (:3005) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │ mpc │ │ leaderboard │ │ reporting │ │ │
│ │ │ (:3006) │ │ (:3007) │ │ (:3008) │ │ │
│ │ └─────────────┘ └─────────────┘ └─────────────┘ │ │
│ │ │ │
│ │ ┌─────────────┐ ┌─────────────┐ │ │
│ │ │authorization│ │ admin │ │ │
│ │ │ (:3009) │ │ (:3010) │ │ │
│ │ └─────────────┘ └─────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
快速开始
1. 首次安装
# 进入服务目录
cd ~/rwadurian/backend/services
# 运行安装(自动生成安全密钥)
./deploy.sh install
2. 构建镜像
./deploy.sh build
3. 启动服务
./deploy.sh up
4. 检查状态
./deploy.sh status
./deploy.sh health
常用命令
| 命令 | 说明 |
|---|---|
./deploy.sh install |
首次安装,生成配置 |
./deploy.sh build |
构建所有 Docker 镜像 |
./deploy.sh up |
启动所有服务 |
./deploy.sh down |
停止所有服务 |
./deploy.sh restart |
重启所有服务 |
./deploy.sh status |
查看服务状态 |
./deploy.sh health |
检查服务健康 |
./deploy.sh logs |
查看所有日志 |
./deploy.sh logs <service> |
查看指定服务日志 |
./deploy.sh migrate |
运行数据库迁移 |
./deploy.sh rebuild-svc <name> |
重建指定服务 |
服务列表
| 服务 | 端口 | 说明 |
|---|---|---|
| identity-service | 3000 | 身份认证服务 |
| wallet-service | 3001 | 钱包账本服务 |
| backup-service | 3002 | MPC 备份服务 |
| planting-service | 3003 | 认种服务 |
| referral-service | 3004 | 推荐系统服务 |
| reward-service | 3005 | 奖励服务 |
| mpc-service | 3006 | MPC 中间层服务 |
| leaderboard-service | 3007 | 排行榜服务 |
| reporting-service | 3008 | 报表服务 |
| authorization-service | 3009 | 授权服务 |
| admin-service | 3010 | 管理后台服务 |
基础设施
| 服务 | 端口 | 说明 |
|---|---|---|
| PostgreSQL | 5432 | 主数据库 |
| Redis | 6379 | 缓存/会话 |
| Kafka | 9092 | 消息队列 |
| Zookeeper | 2181 | Kafka 协调 |
环境配置
配置文件 .env 由 ./deploy.sh install 自动生成,包含:
- 数据库密码
- JWT 密钥
- 加密密钥
- MPC 系统地址
重要: .env 文件包含敏感信息,请勿提交到 Git!
与 MPC-System 集成
mpc-service 需要连接到运行在 192.168.1.100 上的 MPC-System:
- Session Coordinator:
http://192.168.1.100:8081 - Message Router:
ws://192.168.1.100:8082
确保 192.168.1.111 能够访问 192.168.1.100 的这些端口。
故障排除
查看服务日志
./deploy.sh logs identity-service
重建单个服务
./deploy.sh rebuild-svc mpc-service
数据库连接问题
# 进入 postgres 容器
docker exec -it rwa-postgres psql -U rwa_user -d rwa_identity
清理重新开始
./deploy.sh clean # 删除所有容器和数据
./deploy.sh install
./deploy.sh build
./deploy.sh up