424 lines
22 KiB
Markdown
424 lines
22 KiB
Markdown
# 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/)
|