# 订单状态与佣金系统搜索结果总结

## 搜索范围
- 关键词：订单状态、冻结、差价佣金、order status、frozen、commission
- 搜索范围：整个项目代码库
- 文件类型：Go 源代码文件

## 核心发现

### 1. 订单状态定义（无冻结状态）
**重要发现**：订单本身**没有冻结状态**，只有支付状态和佣金状态。

#### 订单支付状态（4 种）
- `PaymentStatusPending = 1`：待支付
- `PaymentStatusPaid = 2`：已支付
- `PaymentStatusCancelled = 3`：已取消
- `PaymentStatusRefunded = 4`：已退款

#### 订单佣金状态（2 种）
- `CommissionStatusPending = 1`：待计算
- `CommissionStatusCalculated = 2`：已计算

**文件位置**：`internal/model/order.go:98-110`

### 2. 冻结状态存在于钱包，不在订单
**重要发现**：冻结状态是钱包的概念，用于提现流程。

#### 代理钱包状态（3 种）
- `AgentWalletStatusNormal = 1`：正常
- `AgentWalletStatusFrozen = 2`：冻结（整个钱包冻结）
- `AgentWalletStatusClosed = 3`：关闭

#### 钱包冻结余额字段
- `balance`：总余额
- `frozen_balance`：冻结余额（用于提现）
- 可用余额 = balance - frozen_balance

**文件位置**：`pkg/constants/wallet.go:17-22`、`internal/model/agent_wallet.go:15-16`

### 3. 订单状态流转逻辑

#### 支付方式决定初始状态
1. **线下支付（offline）**：创建时直接为 `PaymentStatusPaid`
2. **钱包支付（wallet）**：创建时直接为 `PaymentStatusPaid`
3. **微信/支付宝（wechat/alipay）**：创建时为 `PaymentStatusPending`，支付回调后变为 `PaymentStatusPaid`

#### 订单超时自动取消
- 待支付订单 30 分钟未支付自动取消
- 状态变为 `PaymentStatusCancelled`
- 解冻钱包余额（如有）

**文件位置**：`internal/service/order/service.go:1314-1385`

### 4. 订单与佣金的关系

#### 佣金计算触发条件
- 订单支付成功后立即入队佣金计算任务
- 异步处理，不阻塞订单创建

#### 佣金类型
1. **成本价差佣金**（cost_diff）
   - 计算方式：销售价 - 销售成本价
   - 沿代理链向上分配

2. **一次性佣金**（one_time）
   - 仅非代购订单触发
   - 仅首次购买时触发

**文件位置**：`internal/service/commission_calculation/service.go:74-230`

### 5. 佣金提现流程（3 阶段）

#### 阶段 1：代理发起申请
- 验证可用余额
- **冻结余额**（frozen_balance += amount）
- 创建提现申请（Status = 待审核）

#### 阶段 2a：平台审核通过
- 检查冻结余额
- **从冻结余额扣款**（frozen_balance -= amount）
- 更新提现申请（Status = 已通过）

#### 阶段 2b：平台审核拒绝
- **解冻余额**（frozen_balance -= amount）
- 更新提现申请（Status = 已拒绝）

**文件位置**：
- 发起申请：`internal/service/shop_commission/service.go:517-649`
- 审核通过：`internal/service/commission_withdrawal/service.go:145-256`
- 审核拒绝：`internal/service/commission_withdrawal/service.go:258-310`

## 关键代码位置

| 功能 | 文件 | 行数 |
|------|------|------|
| 订单模型定义 | `internal/model/order.go` | 9-138 |
| 订单支付状态常量 | `internal/model/order.go` | 98-104 |
| 订单佣金状态常量 | `internal/model/order.go` | 106-110 |
| 订单创建逻辑 | `internal/service/order/service.go` | 114-928 |
| 订单超时取消 | `internal/service/order/service.go` | 1314-1385 |
| 佣金计算 | `internal/service/commission_calculation/service.go` | 74-230 |
| 提现申请 | `internal/service/shop_commission/service.go` | 517-649 |
| 提现审核 | `internal/service/commission_withdrawal/service.go` | 145-310 |
| 钱包模型 | `internal/model/agent_wallet.go` | 9-94 |
| 钱包常量 | `pkg/constants/wallet.go` | 1-234 |

## 重要业务规则

### 订单支付规则
1. 待支付订单 30 分钟未支付自动取消
2. 取消时解冻钱包余额（如有）
3. 防止重复下单（幂等性检查）

### 佣金计算规则
1. 成本价差佣金：仅当 `销售价 > 销售成本价` 时计算
2. 一次性佣金：仅非代购订单首次购买时触发
3. 佣金链路断裂时标记为待审核

### 提现规则
1. 提现申请时冻结余额
2. 可用余额 = 总余额 - 冻结余额
3. 手续费 = 提现金额 × 费率 / 10000

## 数据流向图

```
订单创建
  ├─ 线下/钱包支付 → PaymentStatus=2(已支付) → 激活套餐 → 入队佣金计算
  └─ 微信/支付宝 → PaymentStatus=1(待支付) → 支付回调 → PaymentStatus=2 → 激活套餐 → 入队佣金计算
                                          ↓
                                  30分钟超时 → PaymentStatus=3(已取消)

佣金计算
  ├─ 成本价差佣金：销售价 - 销售成本价 → 沿代理链分配 → 入账分佣钱包
  └─ 一次性佣金：非代购订单首次购买 → 入账分佣钱包

提现流程
  ├─ 代理申请 → 冻结余额 → 创建申请(待审核)
  ├─ 平台通过 → 从冻结余额扣款 → 更新申请(已通过)
  └─ 平台拒绝 → 解冻余额 → 更新申请(已拒绝)
```

## 生成的文档

已生成两份详细文档：

1. **order_status_commission_analysis.md**
   - 完整的系统分析报告
   - 包含所有状态定义、流程、数据模型
   - 适合深入理解系统设计

2. **order_status_quick_reference.md**
   - 快速参考指南
   - 包含速查表、常见问题、SQL 查询
   - 适合日常开发查询

## 关键发现总结

### ✅ 已确认
- 订单有支付状态和佣金状态，但**没有冻结状态**
- 冻结状态存在于**代理钱包**，用于提现流程
- 差价佣金通过 `seller_cost_price` 字段计算
- 佣金与订单的关系通过 `commission_status` 字段维护

### ⚠️ 注意事项
- 订单超时自动取消不会触发佣金计算
- 代购订单不计算一次性佣金
- 提现时冻结的余额在审核通过时直接扣款，不是解冻后再扣

### 📌 最佳实践
- 查询订单时同时检查 `payment_status` 和 `commission_status`
- 查询可提现金额时使用 `balance - frozen_balance`
- 提现流程中使用事务确保数据一致性

