rwadurian/backend/services/planting-service/docs/ARCHITECTURE.md

424 lines
22 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Planting Service 架构文档
## 目录
- [概述](#概述)
- [架构模式](#架构模式)
- [分层架构](#分层架构)
- [领域模型](#领域模型)
- [数据流](#数据流)
- [技术栈](#技术栈)
- [目录结构](#目录结构)
---
## 概述
Planting Service 是 RWA Durian Queen 平台的核心微服务之一,负责处理榴莲树认种业务的完整生命周期。该服务采用 **领域驱动设计 (DDD)** 结合 **六边形架构 (Hexagonal Architecture)** 进行设计和实现。
### 核心职责
1. **认种订单管理** - 创建、支付、取消订单
2. **省市选择机制** - 5秒确认机制防止误操作
3. **资金分配** - 10种目标的精确分配总计2199 USDT/棵)
4. **持仓管理** - 用户认种持仓的统计与追踪
5. **资金池注入** - 5天批次管理机制
---
## 架构模式
### 领域驱动设计 (DDD)
```
┌─────────────────────────────────────────────────────────────────┐
│ Presentation Layer │
│ (Controllers, DTOs) │
├─────────────────────────────────────────────────────────────────┤
│ Application Layer │
│ (Application Services, Use Cases) │
├─────────────────────────────────────────────────────────────────┤
│ Domain Layer │
│ (Aggregates, Entities, Value Objects, Domain Services) │
├─────────────────────────────────────────────────────────────────┤
│ Infrastructure Layer │
│ (Repositories, External Services, Persistence) │
└─────────────────────────────────────────────────────────────────┘
```
### 六边形架构 (Ports & Adapters)
```
┌─────────────────────────┐
│ HTTP API │
│ (Primary Adapter) │
└───────────┬─────────────┘
┌───────────▼─────────────┐
│ │
┌───────────────┤ Application Core ├───────────────┐
│ │ │ │
│ │ ┌─────────────────┐ │ │
│ │ │ Domain Model │ │ │
│ │ │ │ │ │
│ │ │ - Aggregates │ │ │
│ │ │ - Services │ │ │
│ │ │ - Events │ │ │
│ │ └─────────────────┘ │ │
│ │ │ │
│ └─────────────────────────┘ │
│ │ │
▼ ▼ ▼
┌───────────┐ ┌───────────────┐ ┌───────────────┐
│ PostgreSQL│ │ Wallet Service│ │Referral Service│
│ (Prisma) │ │ (HTTP) │ │ (HTTP) │
└───────────┘ └───────────────┘ └───────────────┘
Secondary Secondary Secondary
Adapter Adapter Adapter
```
---
## 分层架构
### 1. API 层 (`src/api/`)
**职责**: 处理 HTTP 请求/响应,输入验证,认证授权
```
src/api/
├── controllers/ # 控制器
│ ├── health.controller.ts
│ ├── planting-order.controller.ts
│ └── planting-position.controller.ts
├── dto/ # 数据传输对象
│ ├── request/ # 请求 DTO
│ └── response/ # 响应 DTO
├── guards/ # 守卫
│ └── jwt-auth.guard.ts
└── api.module.ts
```
**设计原则**:
- 控制器仅负责 HTTP 协议处理
- DTO 用于数据验证和转换
- 不包含业务逻辑
### 2. Application 层 (`src/application/`)
**职责**: 编排业务用例,协调领域对象,事务管理
```
src/application/
├── services/
│ ├── planting-application.service.ts # 主应用服务
│ └── pool-injection.service.ts # 资金池注入服务
└── application.module.ts
```
**核心职责**:
- 用例编排
- 跨聚合协调
- 外部服务调用
- 事务边界控制
### 3. Domain 层 (`src/domain/`)
**职责**: 核心业务逻辑,业务规则验证
```
src/domain/
├── aggregates/ # 聚合根
│ ├── planting-order.aggregate.ts
│ ├── planting-position.aggregate.ts
│ └── pool-injection-batch.aggregate.ts
├── value-objects/ # 值对象
│ ├── tree-count.vo.ts
│ ├── province-city-selection.vo.ts
│ ├── fund-allocation.vo.ts
│ └── money.vo.ts
├── events/ # 领域事件
│ ├── planting-order-created.event.ts
│ ├── province-city-confirmed.event.ts
│ └── funds-allocated.event.ts
├── services/ # 领域服务
│ └── fund-allocation.service.ts
├── repositories/ # 仓储接口
│ ├── planting-order.repository.interface.ts
│ ├── planting-position.repository.interface.ts
│ └── pool-injection-batch.repository.interface.ts
└── domain.module.ts
```
**设计原则**:
- 聚合是事务一致性边界
- 值对象不可变
- 领域事件用于跨聚合通信
- 仓储接口定义在领域层
### 4. Infrastructure 层 (`src/infrastructure/`)
**职责**: 技术实现,外部系统集成
```
src/infrastructure/
├── persistence/
│ ├── prisma/
│ │ └── prisma.service.ts
│ ├── mappers/ # 领域对象<->持久化对象映射
│ │ ├── planting-order.mapper.ts
│ │ ├── planting-position.mapper.ts
│ │ └── pool-injection-batch.mapper.ts
│ └── repositories/ # 仓储实现
│ ├── planting-order.repository.impl.ts
│ ├── planting-position.repository.impl.ts
│ └── pool-injection-batch.repository.impl.ts
├── external/ # 外部服务客户端
│ ├── wallet-service.client.ts
│ └── referral-service.client.ts
└── infrastructure.module.ts
```
---
## 领域模型
### 聚合关系图
```
┌─────────────────────────────────────────────────────────────────────┐
│ PlantingOrder │
│ (聚合根 - 认种订单) │
│ │
│ ┌──────────────────┐ ┌────────────────────┐ │
│ │ TreeCount │ │ ProvinceCitySelection│ │
│ │ (认种数量) │ │ (省市选择) │ │
│ └──────────────────┘ └────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ FundAllocation[] │ │
│ │ (资金分配列表) │ │
│ │ │ │
│ │ POOL(90%) | OPERATION(5%) | PROVINCE(0.6%) | CITY(0.3%) ... │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
│ 1:N
┌─────────────────────────────────────────────────────────────────────┐
│ PlantingPosition │
│ (聚合根 - 用户持仓) │
│ │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ PositionDistribution[] │ │
│ │ (持仓分布 - 按省市统计) │ │
│ └──────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────────────┐
│ PoolInjectionBatch │
│ (聚合根 - 资金池注入批次) │
│ │
│ - 5天为一个批次周期 │
│ - 批量处理订单的资金池注入 │
│ - 状态: OPEN -> SCHEDULED -> INJECTING -> COMPLETED │
└─────────────────────────────────────────────────────────────────────┘
```
### 订单状态流转
```
┌──────────┐
│ CREATED │ ◄─── 创建订单
└────┬─────┘
│ selectProvinceCity()
┌──────────────────────┐
│ PROVINCE_CITY_SELECTED│ ◄─── 选择省市5秒等待
└────┬─────────────────┘
│ confirmProvinceCity() (5秒后)
┌──────────────────────┐
│PROVINCE_CITY_CONFIRMED│ ◄─── 确认省市
└────┬─────────────────┘
│ pay()
┌──────────┐
│ PAID │ ◄─── 支付完成
└────┬─────┘
│ allocateFunds()
┌────────────────┐
│ FUND_ALLOCATED │ ◄─── 资金分配完成
└────┬───────────┘
│ scheduleToBatch()
┌────────────────┐
│ POOL_SCHEDULED │ ◄─── 加入注入批次
└────┬───────────┘
│ markPoolInjected()
┌────────────────┐
│ POOL_INJECTED │ ◄─── 资金池注入完成
└────┬───────────┘
│ enableMining()
┌────────────────┐
│ MINING_ENABLED │ ◄─── 开始挖矿
└────────────────┘
任意状态PAID之前可转为:
┌───────────┐
│ CANCELLED │ ◄─── 取消订单
└───────────┘
```
### 资金分配模型
每棵树 **2199 USDT** 分配到 10 个目标:
| 序号 | 目标类型 | 金额 (USDT) | 比例 |
|-----|---------|------------|------|
| 1 | POOL (资金池) | 1979.1 | 90% |
| 2 | OPERATION (运营) | 109.95 | 5% |
| 3 | PROVINCE_AUTH (省代) | 13.194 | 0.6% |
| 4 | CITY_AUTH (市代) | 6.597 | 0.3% |
| 5 | COMMUNITY (社区长) | 10.995 | 0.5% |
| 6 | REFERRAL_L1 (一级推荐) | 32.985 | 1.5% |
| 7 | REFERRAL_L2 (二级推荐) | 21.99 | 1.0% |
| 8 | REFERRAL_L3 (三级推荐) | 10.995 | 0.5% |
| 9 | PLATFORM (平台) | 6.597 | 0.3% |
| 10 | RESERVE (储备) | 6.597 | 0.3% |
| **总计** | | **2199** | **100%** |
---
## 数据流
### 创建订单流程
```
┌──────┐ ┌────────────┐ ┌─────────────────┐ ┌──────────────┐
│Client│────▶│ Controller │────▶│ Application Svc │────▶│ Domain Layer │
└──────┘ └────────────┘ └─────────────────┘ └──────────────┘
│ │ │ │
│ POST /orders│ │ │
│ {treeCount} │ │ │
│ │ │ │
│ │ createOrder() │ │
│ │────────────────────▶│ │
│ │ │ │
│ │ │ 检查限购数量 │
│ │ │─────────────────────▶│
│ │ │ │
│ │ │ 检查余额 │
│ │ │─────────────────────▶│
│ │ │ (Wallet Service) │
│ │ │ │
│ │ │ 创建订单聚合 │
│ │ │─────────────────────▶│
│ │ │ │
│ │ │ 保存订单 │
│ │ │─────────────────────▶│
│ │ │ (Repository) │
│ │ │ │
│◀─────────────│◀────────────────────│◀─────────────────────│
│ OrderDTO │ │ │
```
### 支付订单流程
```
┌──────┐ ┌────────────┐ ┌─────────────────┐ ┌──────────────┐
│Client│────▶│ Controller │────▶│ Application Svc │────▶│ Domain Layer │
└──────┘ └────────────┘ └─────────────────┘ └──────────────┘
│ │ │ │
│ POST /pay │ │ │
│ │ payOrder() │ │
│ │────────────────────▶│ │
│ │ │ │
│ │ │ 1. 扣款 │
│ │ │─────────────────────▶│
│ │ │ (Wallet Service) │
│ │ │ │
│ │ │ 2. 获取推荐上下文 │
│ │ │─────────────────────▶│
│ │ │ (Referral Service) │
│ │ │ │
│ │ │ 3. 计算资金分配 │
│ │ │─────────────────────▶│
│ │ │ (FundAllocationSvc) │
│ │ │ │
│ │ │ 4. 执行资金分配 │
│ │ │─────────────────────▶│
│ │ │ (Wallet Service) │
│ │ │ │
│ │ │ 5. 更新用户持仓 │
│ │ │─────────────────────▶│
│ │ │ (Position Repo) │
│ │ │ │
│ │ │ 6. 加入注入批次 │
│ │ │─────────────────────▶│
│ │ │ (Batch Repo) │
│ │ │ │
│◀─────────────│◀────────────────────│◀─────────────────────│
│ PayResult │ │ │
```
---
## 技术栈
| 组件 | 技术选型 | 用途 |
|-----|---------|------|
| 框架 | NestJS 10.x | Web 框架 |
| 语言 | TypeScript 5.x | 开发语言 |
| 数据库 | PostgreSQL 16 | 主数据库 |
| ORM | Prisma 5.x | 数据访问 |
| 验证 | class-validator | 输入验证 |
| 文档 | Swagger/OpenAPI | API 文档 |
| 测试 | Jest + Supertest | 测试框架 |
| 容器 | Docker | 容器化部署 |
---
## 目录结构
```
planting-service/
├── docs/ # 文档目录
│ ├── ARCHITECTURE.md # 架构文档
│ ├── API.md # API 文档
│ ├── DEVELOPMENT.md # 开发指南
│ ├── TESTING.md # 测试文档
│ └── DEPLOYMENT.md # 部署文档
├── prisma/
│ ├── schema.prisma # 数据库模型
│ └── migrations/ # 数据库迁移
├── src/
│ ├── api/ # API 层
│ ├── application/ # 应用层
│ ├── domain/ # 领域层
│ ├── infrastructure/ # 基础设施层
│ ├── config/ # 配置
│ ├── shared/ # 共享模块
│ ├── app.module.ts # 根模块
│ └── main.ts # 入口文件
├── test/ # E2E 测试
├── docker-compose.yml # Docker 编排
├── docker-compose.test.yml # 测试环境编排
├── Dockerfile # 生产镜像
├── Dockerfile.test # 测试镜像
├── Makefile # 构建脚本
└── package.json
```
---
## 参考资料
- [领域驱动设计 (Eric Evans)](https://www.domainlanguage.com/ddd/)
- [六边形架构 (Alistair Cockburn)](https://alistair.cockburn.us/hexagonal-architecture/)
- [NestJS 官方文档](https://docs.nestjs.com/)
- [Prisma 官方文档](https://www.prisma.io/docs/)