---
url: /blog/g0ybmov2/index.md
---
# 数据看板模板2 - 指标计算说明文档

***

## 📋 目录

* [一、KPI概览指标](数据看板指标计算说明.md#一kpi概览指标)
* [二、侧栏指标](数据看板指标计算说明.md#二侧栏指标)
* [三、转化漏斗指标](数据看板指标计算说明.md#三转化漏斗指标)
* [四、排行榜指标](数据看板指标计算说明.md#四排行榜指标)
* [五、订单状态说明](数据看板指标计算说明.md#五订单状态说明)
* [六、时间字段说明](数据看板指标计算说明.md#六时间字段说明)
* [七、售后状态说明](数据看板指标计算说明.md#七售后状态说明)
* [八、已修复指标汇总](数据看板指标计算说明.md#八已修复指标汇总)
* [九、数据完整性要求](数据看板指标计算说明.md#九数据完整性要求)
* [十、常见问题FAQ](数据看板指标计算说明.md#十常见问题faq)

***

## 一、KPI概览指标

### 指标汇总表（11个）

| 序号 | 指标名称 | 计算公式 | 统计时间字段 | 业务语义 | 状态过滤 | 修复状态 |
|------|---------|---------|------------|---------|---------|---------|
| 1 | **下单总额** | `SUM(price)` | `add_time` | 用户下单的商品总金额（含取消订单） | 全部状态 | 无需修复 |
| 2 | **成交总额（折扣前）** | `SUM(price)` | `add_time` | 有效订单的商品总金额（折扣前原价） | `status IN [2,3,4]` | 无需修复 |
| 3 | **成交总额（折扣后）** | `SUM(total_price)` | `add_time` | 有效订单的实际成交金额 | `status IN [2,3,4]` | 无需修复 |
| 4 | **运费/加价总计** | `SUM(increase_price)` | `add_time` | 订单的运费、加价等额外费用总额 | `status IN [2,3,4]` | 无需修复 |
| 5 | **有效订单数** | `COUNT(*)` | `add_time` | 当前时间段创建的有效订单数量 | `status IN [2,3,4]` | 无需修复 |
| 6 | **取消订单数** | `COUNT(*)` | `cancel_time` | 当前时间段实际取消的订单数量 | `status = 5` | **已修复** |
| 7 | **访问UV** | `'--'` | - | 访问店铺的独立访客数 | - | 待实现 |
| 8 | **签收订单数** | `COUNT(*)` | `collect_time` | 当前时间段实际签收的订单数量 | `status = 4` | **已修复** |
| 9 | **拒收订单数** | `COUNT(*)` | `upd_time` | 当前时间段被拒收的订单数量 | `status IN [7,8]` | **已修复** |
| 10 | **退款总额** | `SUM(price)` | `audit_time` | 当前时间段完成的售后退款总金额 | `status = 3`（售后表） | **已修复** |
| 11 | **退款订单数** | `COUNT(DISTINCT order_id)` | `audit_time` | 当前时间段完成售后的订单数量 | `status = 3`（售后表） | **已修复** |

***

### 详细说明

#### 1. 下单总额

**代码位置：** [StatsTemplate2Service.php:122-129](app/plugins/databoard/service/StatsTemplate2Service.php#L122-L129)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
SUM(price)
```

**业务语义：**

* 用户下单的商品总金额（使用订单的 `price` 字段）
* **包含取消订单**，反映用户下单意愿的总量

**字段说明：**

* `price` - 订单商品总价（折扣前原价）

***

#### 2. 成交总额（折扣前）

**代码位置：** [StatsTemplate2Service.php:151-154](app/plugins/databoard/service/StatsTemplate2Service.php#L151-L154)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
SUM(price)
```

**业务语义：**

* 有效订单的商品总金额（折扣前原价）
* 用于计算折扣率和佣金率

***

#### 3. 成交总额（折扣后）

**代码位置：** [StatsTemplate2Service.php:139-149](app/plugins/databoard/service/StatsTemplate2Service.php#L139-L149)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
SUM(total_price)
```

**业务语义：**

* 有效订单的实际成交金额（用户实付金额）
* 排除取消订单，反映实际销售收入

**字段说明：**

* `total_price` - 订单实付金额（折扣后）

***

#### 4. 运费/加价总计

**代码位置：** [StatsTemplate2Service.php:156-159](app/plugins/databoard/service/StatsTemplate2Service.php#L156-L159)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
SUM(increase_price)
```

**业务语义：**

* 订单的运费、加价等额外费用总额
* 用于评估物流成本

***

#### 5. 有效订单数

**代码位置：** [StatsTemplate2Service.php:161-164](app/plugins/databoard/service/StatsTemplate2Service.php#L161-L164)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
COUNT(*)
```

**业务语义：**

* 当前时间段创建的有效订单数量（订单笔数）
* 状态包括：待发货(2)、待收货(3)、已完成(4)

***

#### 6. 取消订单数

**代码位置：** [StatsTemplate2Service.php:166-180](app/plugins/databoard/service/StatsTemplate2Service.php#L166-L180)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND cancel_time >= $start    --  修复：按取消时间统计
  AND cancel_time <= $end
  AND cancel_time > 0
  AND status = 5
COUNT(*)
```

**业务语义：**

* 当前时间段**实际取消**的订单数量
* 按订单取消时间（`cancel_time`）统计，而非创建时间

**修复说明：**

* **修复前：** 按 `add_time`（订单创建时间）统计
* **修复后：** 按 `cancel_time`（取消时间）统计
* **修复原因：** 数据看板应反映"运营行为发生时间"

***

#### 7. 访问UV

**代码位置：** [StatsTemplate2Service.php:183-187](app/plugins/databoard/service/StatsTemplate2Service.php#L183-L187)

**当前状态：** 待实现

**计划实现：**

* 需要接入访问日志表或第三方统计（如百度统计、Google Analytics）
* 统计独立访客数（UV）

***

#### 8. 签收订单数

**代码位置：** [StatsTemplate2Service.php:189-203](app/plugins/databoard/service/StatsTemplate2Service.php#L189-L203)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND collect_time >= $start    --  修复：按签收时间统计
  AND collect_time <= $end
  AND collect_time > 0
  AND status = 4
COUNT(*)
```

**业务语义：**

* 当前时间段**实际签收**的订单数量
* 按用户签收时间统计

**修复说明：**

* **修复前：** 按 `add_time`（订单创建时间）统计
* **修复后：** 按 `collect_time`（签收时间）统计

***

#### 9. 拒收订单数

**代码位置：** [StatsTemplate2Service.php:205-218](app/plugins/databoard/service/StatsTemplate2Service.php#L205-L218)

**计算公式：**

```php
WHERE is_delete_time = 0
  AND upd_time >= $start        --  修复：按拒收时间统计（使用 upd_time 近似）
  AND upd_time <= $end
  AND status IN [7, 8]
COUNT(*)
```

**业务语义：**

* 当前时间段被拒收的订单数量
* 包括：退件中(7)、已退件(8)

**修复说明：**

* **修复前：** 按 `add_time`（订单创建时间）统计
* **修复后：** 按 `upd_time`（拒收时间）统计
* **注意事项：** 订单表无专门的拒收时间字段，使用 `upd_time` 作为近似值

***

#### 10. 退款总额

**代码位置：** [StatsTemplate2Service.php:221-239](app/plugins/databoard/service/StatsTemplate2Service.php#L221-L239)

**计算公式：**

```php
FROM sxo_order_aftersale      --  修复：从售后表统计
WHERE status = 3               -- 已完成
  AND audit_time >= $start     --  修复：按审核完成时间统计
  AND audit_time <= $end
  AND audit_time > 0
SUM(price)
```

**业务语义：**

* 当前时间段完成的售后退款总金额
* 从售后表（`OrderAftersale`）统计

**修复说明：**

* **修复前：** 从订单表统计，按 `add_time`
* **修复后：** 从售后表统计，按 `audit_time`（审核完成时间）

***

#### 11. 退款订单数

**代码位置：** [StatsTemplate2Service.php:241-260](app/plugins/databoard/service/StatsTemplate2Service.php#L241-L260)

**计算公式：**

```php
FROM sxo_order_aftersale
WHERE status = 3               -- 已完成
  AND audit_time >= $start     --  修复：按审核完成时间统计
  AND audit_time <= $end
  AND audit_time > 0
COUNT(DISTINCT order_id)
```

**业务语义：**

* 当前时间段完成售后的订单数量
* 去重订单ID（一个订单可能有多个商品）

***

## 二、侧栏指标

### 指标汇总表（7个）

| 序号 | 指标名称 | 计算公式 | 统计时间字段 | 业务语义 |
|------|---------|---------|------------|---------|
| 1 | **订单均价 (AOV)** | `SUM(total_price) / COUNT(*)` | `add_time` | 平均每笔订单的金额 |
| 2 | **COD复购率** | `(复购用户数 / 购买用户数) × 100%` | `add_time` + 24h时效过滤 | 货到付款订单的复购率 |
| 3 | **平均折扣率** | `SUM(优惠金额) / SUM(原价) × 100%` | `add_time` | 订单的平均折扣比例 |
| 4 | **平均佣金率** | `'--'` | - | 订单的平均佣金比例 |
| 5 | **平均连带率** | `SUM(购买商品总数) / COUNT(订单数)` | `add_time` | 平均每笔订单购买的商品件数 |
| 6 | **整体取消率** | `(取消订单数 / 总订单数) × 100%` | 分子：`cancel_time` 分母：`add_time` | 当前时间段创建的订单中，最终被取消的比例 |
| 7 | **核心拒收率** | `(拒收订单数 / 已发货订单数) × 100%` | 分子：`upd_time` 分母：`delivery_time` | 当前时间段发货的订单中，被拒收的比例 |

***

### 详细说明

#### 1. 订单均价 (AOV - Average Order Value)

**代码位置：** [StatsTemplate2Service.php:431-448](app/plugins/databoard/service/StatsTemplate2Service.php#L431-L448)

**计算公式：**

```php
AOV = SUM(total_price) / COUNT(*)

WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
```

**业务语义：**

* 平均每笔订单的金额（客单价）
* 衡量订单价值的重要指标

***

#### 2. COD复购率

**代码位置：** [StatsTemplate2Service.php:478-488](app/plugins/databoard/service/StatsTemplate2Service.php#L478-L488)

**计算公式：**

```php
复购率 = (复购用户数 / 购买用户数) × 100%

WHERE payment_id = COD支付方式ID
  AND (status != 5 OR upd_time < cutoff_time)  -- 排除24小时内取消的订单
```

**特殊逻辑：**

* 仅统计货到付款（COD）订单
* 考虑24小时取消时效（`upd_time < cutoff_time`）
* 复购用户：下单次数 ≥ 2 的用户

**业务语义：**

* 货到付款订单的复购率
* 反映用户的重复购买意愿

***

#### 3. 平均折扣率

**代码位置：** [StatsTemplate2Service.php:450-476](app/plugins/databoard/service/StatsTemplate2Service.php#L450-L476)

**计算公式：**

```php
折扣率 = SUM(preferential_price) / SUM(price_before_discount) × 100%

WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [2, 3, 4]
```

**业务语义：**

* 订单的平均折扣比例
* 优惠金额占商品原价的比例

***

#### 4. 平均佣金率

**当前状态：** 待实现

**计划实现：**

* 需要明确的佣金数据来源
* 可能需要从订单表或佣金表计算

***

#### 5. 平均连带率

**代码位置：** [StatsTemplate2Service.php:490-510](app/plugins/databoard/service/StatsTemplate2Service.php#L490-L510)

**计算公式：**

```php
连带率 = SUM(购买商品总数) / COUNT(订单数)

购买商品总数 = SUM(buy_number)
  FROM sxo_order_detail
  WHERE order_id IN (当前时间段的有效订单ID列表)
```

**业务语义：**

* 平均每笔订单购买的商品件数
* 衡量关联销售能力

***

#### 6. 整体取消率

**代码位置：** [StatsTemplate2Service.php:512-546](app/plugins/databoard/service/StatsTemplate2Service.php#L512-L546)

**计算公式：**

```php
整体取消率 = (取消订单数 / 总订单数) × 100%

-- 分母：当前时间段创建的订单总数
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
COUNT(*) AS total_orders

-- 分子：当前时间段取消的订单数（ 按取消时间统计）
WHERE is_delete_time = 0
  AND cancel_time >= $start    --  修复：按取消时间
  AND cancel_time <= $end
  AND cancel_time > 0
  AND status = 5
COUNT(*) AS cancel_orders
```

**业务语义：**

* 当前时间段创建的订单中，最终被取消的比例
* 分子：当前时间段取消的订单（按取消时间）
* 分母：当前时间段创建的订单（按创建时间）

**修复说明：**

* **修复前：** 分子分母都按 `add_time` 统计
* **修复后：** 分子按 `cancel_time` 统计，分母仍按 `add_time`
* **逻辑说明：** 衡量"当前创建的订单有多少被取消"

***

#### 7. 核心拒收率

**代码位置：** [StatsTemplate2Service.php:548-597](app/plugins/databoard/service/StatsTemplate2Service.php#L548-L597)

**计算公式：**

```php
核心拒收率 = (拒收订单数 / 已发货订单数) × 100%

-- 分子：当前时间段拒收的订单数（ 按拒收时间统计）
WHERE is_delete_time = 0
  AND upd_time >= $start       --  修复：按拒收时间
  AND upd_time <= $end
  AND status IN [7, 8]
COUNT(*) AS refuse_orders

-- 分母：当前时间段发货的订单数（ 按发货时间统计）
WHERE is_delete_time = 0
  AND delivery_time >= $start  --  修复：按发货时间
  AND delivery_time <= $end
  AND delivery_time > 0
  AND status IN [3, 4, 7, 8]
COUNT(*) AS shipped_orders
```

**业务语义：**

* 当前时间段发货的订单中，被拒收的比例
* 反映物流和商品质量情况

**修复说明：**

* **修复前：** 分子分母都按 `add_time` 统计
* **修复后：** 分子按 `upd_time`（拒收时间），分母按 `delivery_time`（发货时间）
* **逻辑统一：** 分子分母都按行为时间统计

**状态说明：**

* `3` = 已发货/待收货
* `4` = 已完成
* `7` = 退件中（已发货后被拒收）
* `8` = 已退件（已发货后被拒收）

***

## 三、转化漏斗指标

### 漏斗阶段表（5个阶段）

| 序号 | 阶段名称 | 统计维度 | 统计时间字段 | 计算公式 | 业务语义 |
|------|---------|---------|------------|---------|---------|
| 1 | **访问商店** | 用户数（UV） | `add_time`（浏览/加购/下单时间） | `COUNT(DISTINCT 浏览/加购/下单用户)` | 访问店铺的独立用户数 |
| 2 | **加入购物车** | 用户数（UV） | `add_time`（加购时间） | `COUNT(DISTINCT user_id)` | 加入购物车的独立用户数 |
| 3 | **发起结账** | 用户数（UV） | `add_time`（填写地址时间） | `COUNT(DISTINCT user_id)` | 进入结账流程的独立用户数 |
| 4 | **填写收货地址** | 用户数（UV） | `add_time`（填写地址时间） | `COUNT(DISTINCT user_id)` | 填写收货地址的独立用户数 |
| 5 | **下单用户数** | 用户数（UV） | `add_time`（下单时间） | `COUNT(DISTINCT user_id)` | 完成下单的独立用户数 |

**代码位置：** [StatsTemplate2Service.php:304-407](app/plugins/databoard/service/StatsTemplate2Service.php#L304-L407)

***

### 转化率计算

**阶段转化率：**

```
阶段转化率 = (当前阶段用户数 / 上一阶段用户数) × 100%
```

**全店最终转化率：**

```
最终转化率 = (下单用户数 / 访问商店用户数) × 100%
```

***

### 详细说明

#### 1. 访问商店

**数据来源：** 商品浏览、加购、下单的用户去重

**计算公式：**

```php
-- 合并浏览、加购、下单用户并去重
UNION (
  SELECT user_id FROM sxo_goods_browse WHERE add_time BETWEEN $start AND $end,
  SELECT user_id FROM sxo_cart WHERE add_time BETWEEN $start AND $end,
  SELECT user_id FROM sxo_order WHERE add_time BETWEEN $start AND $end
)
COUNT(DISTINCT user_id)
```

**业务语义：**

* 访问店铺的独立用户数（近似值）
* TODO: 更精确的做法是用 UV（页面访问统计）

***

#### 2. 加入购物车

**计算公式：**

```php
FROM sxo_cart
WHERE add_time >= $start
  AND add_time <= $end
GROUP BY user_id
COUNT(DISTINCT user_id)
```

**业务语义：**

* 加入购物车的独立用户数

***

#### 3. 发起结账

**计算公式：**

```php
FROM sxo_order_address
WHERE add_time >= $start
  AND add_time <= $end
COUNT(DISTINCT user_id)
```

**业务语义：**

* 填写收货地址的用户数（进入结账流程）
* TODO: 更精确的做法需要结账页面访问记录

***

#### 4. 填写收货地址

**计算公式：**

```php
FROM sxo_order o
JOIN sxo_order_address oa ON o.id = oa.order_id
WHERE o.is_delete_time = 0
  AND oa.add_time >= $start
  AND oa.add_time <= $end
GROUP BY o.user_id
COUNT(DISTINCT o.user_id)
```

**业务语义：**

* 填写收货地址的独立用户数

***

#### 5. 下单用户数

**计算公式：**

```php
FROM sxo_order
WHERE is_delete_time = 0
  AND add_time >= $start
  AND add_time <= $end
  AND status IN [1, 2, 3, 4]
GROUP BY user_id
COUNT(DISTINCT user_id)
```

**业务语义：**

* 完成下单的独立用户数
* 包括：待付款(1)、待发货(2)、待收货(3)、已完成(4)

***

## 四、排行榜指标

### 指标汇总表（3个）

| 序号 | 指标名称 | 排序依据 | 统计时间字段 | 业务语义 |
|------|---------|---------|------------|---------|
| 1 | **热卖商品排行** | 销量降序 | `add_time`（订单创建时间） | 按商品销量排序，前10名 |
| 2 | **商品加购排行** | 加购人数降序 | `add_time`（加购时间） | 按加购用户数排序，前10名 |
| 3 | **地区购买排行** | 下单人数降序 | `add_time`（下单时间） | 按地区下单用户数排序，前10名 |

***

### 详细说明

#### 1. 热卖商品排行

**代码位置：** [StatsTemplate2Service.php:613-659](app/plugins/databoard/service/StatsTemplate2Service.php#L613-L659)

**计算公式：**

```php
SELECT
  goods_id,
  title,
  SUM(buy_number) AS sales_count,
  SUM(total_price) AS sales_amount
FROM sxo_order_detail
WHERE order_id IN (
  SELECT id FROM sxo_order
  WHERE status <= 4
    AND add_time >= $start
    AND add_time <= $end
)
GROUP BY goods_id
ORDER BY sales_count DESC
LIMIT 10
```

**业务语义：**

* 热卖商品排行（按销量）
* 显示商品名称、销量、销售额

***

#### 2. 商品加购排行

**代码位置：** [StatsTemplate2Service.php:667-712](app/plugins/databoard/service/StatsTemplate2Service.php#L667-L712)

**计算公式：**

```php
SELECT
  goods_id,
  title,
  COUNT(DISTINCT user_id) AS add_count
FROM sxo_cart
WHERE add_time >= $start
  AND add_time <= $end
GROUP BY goods_id
ORDER BY add_count DESC
LIMIT 10
```

**业务语义：**

* 商品加购排行（按独立用户数）
* 显示商品名称、加购人数、加购率

***

#### 3. 地区购买排行

**代码位置：** [StatsTemplate2Service.php:719-758](app/plugins/databoard/service/StatsTemplate2Service.php#L719-L758)

**计算公式：**

```php
SELECT
  province_name,
  COUNT(DISTINCT user_id) AS buyer_count,
  SUM(total_price) AS total_amount,
  COUNT(id) AS order_count
FROM sxo_order o
JOIN sxo_order_address oa ON o.id = oa.order_id
WHERE o.is_delete_time = 0
  AND o.status IN [2, 3, 4]
  AND o.add_time >= $start
  AND o.add_time <= $end
GROUP BY province_name
ORDER BY buyer_count DESC
LIMIT 10
```

**业务语义：**

* 地区购买排行（按下单用户数）
* 显示地区名称、下单人数、客单价

***

## 五、订单状态说明

### 状态码表

| 状态码 | 状态名称 | 英文标识 | 说明 | 是否计入"有效订单" |
|--------|---------|---------|------|------------------|
| 0 | 待确认 | Pending | 等待商家确认订单 | ❌ |
| 1 | 待付款 | Unpaid | 等待用户付款 | ❌ |
| 2 | 待发货 | Paid | 用户已付款，等待发货 |  |
| 3 | 待收货 | Shipped | 已发货，等待用户签收 |  |
| 4 | 已完成 | Completed | 订单完成（已签收） |  |
| 5 | 已取消 | Cancelled | 订单已取消 | ❌ |
| 6 | 已关闭 | Closed | 订单关闭（超时等） | ❌ |
| 7 | 退件中 | Refunding | 退货/拒收流程中 | ❌ |
| 8 | 已退件 | Refunded | 已完成退货/拒收 | ❌ |

***

### 状态流转图

```
待确认(0)
  ↓
待付款(1) ←─────┐
  ↓             │
待发货(2)       │ 取消/关闭
  ↓             │
待收货(3) ──────┘
  ↓             │ 拒收
已完成(4) ──────┤
              ↓
          退件中(7)
              ↓
          已退件(8)
```

***

## 六、时间字段说明

### 订单表（sxo\_order）时间字段

| 字段名 | 字段含义 | 对应业务行为 | 类型 | 说明 |
|--------|---------|------------|------|------|
| `add_time` | 订单创建时间 | 用户下单 | int(10) | 订单生成时间 |
| `pay_time` | 支付时间 | 用户完成支付 | int(10) | 支付成功时间 |
| `confirm_time` | 确认时间 | 商家确认订单 | int(10) | 商家确认时间 |
| `delivery_time` | 发货时间 | 商家发货 | int(10) | **用于统计发货订单数** |
| `cancel_time` | 取消时间 | 订单被取消 | int(10) | **用于统计取消订单数** |
| `collect_time` | 签收时间 | 用户签收商品 | int(10) | **用于统计签收订单数** |
| `express_collect_time` | 快递签收时间 | 快递公司签收 | int(10) | 物流签收时间 |
| `close_time` | 关闭时间 | 订单关闭 | int(10) | 订单关闭时间 |
| `comments_time` | 评论时间 | 用户评论 | int(10) | 用户评价时间 |
| `upd_time` | 更新时间 | 任何状态更新 | int(11) | **用于统计拒收订单数** （近似值） |
| `is_delete_time` | 删除时间 | 订单被删除 | int(10) | 0=未删除，>0=删除时间 |

***

### 售后表（sxo\_order\_aftersale）时间字段

| 字段名 | 字段含义 | 对应业务行为 | 类型 | 说明 |
|--------|---------|------------|------|------|
| `add_time` | 添加时间 | 用户发起售后 | int(10) | 售后申请创建时间 |
| `apply_time` | 申请时间 | 用户申请售后 | int(10) | 售后申请时间 |
| `confirm_time` | 确认时间 | 商家确认售后 | int(10) | 售后确认时间 |
| `delivery_time` | 退货时间 | 用户退货 | int(10) | 退货发货时间 |
| `audit_time` | 审核时间 | 售后审核通过 | int(10) | **用于统计退款完成** |
| `cancel_time` | 取消时间 | 售后取消 | int(10) | 售后取消时间 |
| `upd_time` | 更新时间 | 任何状态更新 | int(10) | 最后更新时间 |

***

## 七、售后状态说明

### 状态码表

| 状态码 | 状态名称 | 说明 |
|--------|---------|------|
| 0 | 待确认 | 等待商家确认售后申请 |
| 1 | 待退货 | 商家已确认，等待用户退货 |
| 2 | 待审核 | 用户已退货，等待商家审核 |
| 3 | 已完成 | 售后完成（退款已到账） |
| 4 | 已拒绝 | 商家拒绝售后申请 |
| 5 | 已取消 | 用户取消售后申请 |

***

### 售后类型

| 类型码 | 类型名称 | 说明 |
|--------|---------|------|
| 0 | 仅退款 | 不需要退货，直接退款 |
| 1 | 退货退款 | 需要退货后退款 |

***

## 八、已修复指标汇总

### 修复清单表（7项）

| 序号 | 指标名称 | 修复位置 | 修复内容 | 修复时间字段 | 修复原因 |
|------|---------|---------|---------|------------|---------|
| 1 | **取消订单数** | [StatsTemplate2Service.php:166-174](app/plugins/databoard/service/StatsTemplate2Service.php#L166-L174) | `add_time` → `cancel_time` | `cancel_time` | 统计"实际取消时间" |
| 2 | **整体取消率** | [StatsTemplate2Service.php:512-546](app/plugins/databoard/service/StatsTemplate2Service.php#L512-L546) | 分子：`add_time` → `cancel_time` | `cancel_time` | 分子应统计当前时间段取消的订单 |
| 3 | **签收订单数** | [StatsTemplate2Service.php:189-197](app/plugins/databoard/service/StatsTemplate2Service.php#L189-L197) | `add_time` → `collect_time` | `collect_time` | 统计"实际签收时间" |
| 4 | **拒收订单数** | [StatsTemplate2Service.php:205-212](app/plugins/databoard/service/StatsTemplate2Service.php#L205-L212) | `add_time` → `upd_time` | `upd_time` | 统计"实际拒收时间"（无专用字段） |
| 5 | **退款总额** | [StatsTemplate2Service.php:221-239](app/plugins/databoard/service/StatsTemplate2Service.php#L221-L239) | 订单表 `add_time` → 售后表 `audit_time` | `audit_time` | 统计"售后完成时间" |
| 6 | **退款订单数** | [StatsTemplate2Service.php:241-260](app/plugins/databoard/service/StatsTemplate2Service.php#L241-L260) | 售后表 `add_time` → `audit_time` | `audit_time` | 统计"售后完成时间" |
| 7 | **核心拒收率分母** | [StatsTemplate2Service.php:558-567](app/plugins/databoard/service/StatsTemplate2Service.php#L558-L567) | `add_time` → `delivery_time` | `delivery_time` | 统计"实际发货时间" |

***

### 修复原则

**统一原则：所有行为类指标都按"行为发生时间"统计**

#### 修复前 vs 修复后对比

| 指标类型 | 修复前 | 修复后 | 业务意义 |
|---------|--------|--------|---------|
| **创建类** | 按 `add_time` 统计 | 按 `add_time` 统计 | 反映用户下单行为 |
| **行为类** | 按 `add_time` 统计 | 按**行为时间**统计 | 反映实际运营结果 |

**示例：**

```
场景：用户选择日期范围 "2026-01-15"

修复前：
- 取消订单数 = 2026-01-15 创建的订单中被取消的数量
- ❌ 问题：包括当天创建但后来才取消的订单

修复后：
- 取消订单数 = 2026-01-15 实际取消的订单数量
-  正确：反映当天的实际取消行为
```

***

## 九、数据完整性要求

### 必填时间字段

修复后的指标要求以下时间字段必须有值：

| 字段名 | 适用指标 | 要求 | 说明 |
|--------|---------|------|------|
| `cancel_time` | 取消订单数、整体取消率 | 必须 > 0 | 取消订单必须有取消时间 |
| `collect_time` | 签收订单数 | 必须 > 0 | 签收订单必须有签收时间 |
| `delivery_time` | 核心拒收率（分母） | 必须 > 0 | 已发货订单必须有发货时间 |
| `audit_time` | 退款总额、退款订单数 | 必须 > 0 | 完成的售后必须有审核时间 |

***

### 数据验证SQL

#### 检查取消订单时间完整性

```sql
-- 检查取消订单的 cancel_time 是否为空
SELECT COUNT(*) AS empty_cancel_time_count
FROM sxo_order
WHERE status = 5
  AND (cancel_time IS NULL OR cancel_time = 0);
```

#### 检查签收订单时间完整性

```sql
-- 检查已完成订单的 collect_time 是否为空
SELECT COUNT(*) AS empty_collect_time_count
FROM sxo_order
WHERE status = 4
  AND (collect_time IS NULL OR collect_time = 0);
```

#### 检查发货订单时间完整性

```sql
-- 检查已发货订单的 delivery_time 是否为空
SELECT COUNT(*) AS empty_delivery_time_count
FROM sxo_order
WHERE status IN [3, 4, 7, 8]
  AND (delivery_time IS NULL OR delivery_time = 0);
```

#### 检查售后审核时间完整性

```sql
-- 检查已完成售后的 audit_time 是否为空
SELECT COUNT(*) AS empty_audit_time_count
FROM sxo_order_aftersale
WHERE status = 3
  AND (audit_time IS NULL OR audit_time = 0);
```

***

## 十、常见问题FAQ

### Q1: 为什么"有效订单数"不按行为时间统计？

**A:** "有效订单数"反映的是**用户在当前时间段创建的订单量**，属于"下单行为"指标，应该按 `add_time` 统计。

这类指标包括：

* 下单总额
* 成交总额
* 有效订单数
* 订单均价(AOV)

而"取消订单数"、"签收订单数"等反映的是**运营结果**，应该按实际行为时间统计。

***

### Q2: 整体取消率的分母为什么仍按 `add_time`？

**A:** 整体取消率的业务含义是：

```
整体取消率 = 当前时间段取消的订单数 / 当前时间段创建的订单总数
```

* **分子：** 按取消时间统计（当前时间段取消的订单）
* **分母：** 按创建时间统计（当前时间段创建的订单）

这样计算的是：**当前创建的订单中有多少最终被取消**，符合业务语义。

***

### Q3: 拒收订单数为什么使用 `upd_time` 而不是专门的拒收时间字段？

**A:** 订单表（`sxo_order`）**没有专门的拒收时间字段**。使用 `upd_time` 作为近似值：

* **优点：** 可以近似反映拒收时间
* ⚠️ **缺点：** 任何状态更新都会修改 `upd_time`，精度不够

**建议：** 如果需要更精确的拒收统计，考虑添加 `refuse_time` 字段。

***

### Q4: 为什么退款指标从售后表统计而不是订单表？

**A:** 订单表的 `refund_price` 字段只记录退款金额，**无法准确反映退款完成时间**。

售后表（`sxo_order_aftersale`）的优势：

* 有明确的售后状态（`status = 3` 表示已完成）
* 有准确的审核完成时间（`audit_time`）
* 可以精确统计退款完成时间

***

### Q5: 转化漏斗为什么统计用户数而不是订单数？

**A:** 转化漏斗的核心目的是分析**用户行为转化路径**，应该按用户维度统计：

* **用户数维度：** 反映真实转化情况
* ❌ **订单数维度：** 一个用户可能下多笔订单，会重复计算

**示例：**

```
用户A 下单 3 笔
用户B 下单 2 笔

按订单数：下单阶段 = 5 笔
按用户数：下单阶段 = 2 人  正确
```

***

### Q6: COD复购率为什么有24小时时效过滤？

**A:** COD（货到付款）订单的特殊性：

* ⏰ **支付时效长：** 从下单到收货才支付，可能72小时+
* ❌ **取消率高：** 收货前都可能取消
* **24小时规则：** 排除刚下单还未稳定的订单

```php
// 有效订单条件：
// - 未取消订单（status != 5）
// - 或取消时间早于截止时间的订单（upd_time < cutoff_time）
```

***

### Q7: 历史数据的时间字段不完整怎么办？

**A:** 有以下解决方案：

1. **补充历史数据**（推荐）
   ```sql
   -- 示例：根据订单状态更新 cancel_time
   UPDATE sxo_order
   SET cancel_time = upd_time
   WHERE status = 5
     AND (cancel_time IS NULL OR cancel_time = 0);
   ```

2. **数据迁移脚本**：根据 `upd_time` 和 `status` 推算行为时间

3. **从修复日起生效**：只统计修复后的数据，历史数据保持原逻辑

***

### Q8: 如何验证修复后的数据是否正确？

**A:** 测试验证步骤：

1. **单日验证**

   ```
   选择某一天的数据，手动统计：
   - 取消订单数 = 查询当天 cancel_time 在该天的订单
   - 签收订单数 = 查询当天 collect_time 在该天的订单
   - 对比数据看板显示的数据
   ```

2. **跨日验证**
   ```
   订单场景：
   - 01-15 23:00 创建订单
   - 01-16 10:00 取消订单

   选择日期：01-16
   - 修复前：会计入（因为创建时间是01-15 23:00）
   - 修复后：应该计入（因为取消时间是01-16 10:00）
   ```

3. **环比验证**
   ```
   检查上期对比数据是否正确
   - 确认时间范围计算正确
   - 确认趋势计算正确
   ```

***

## 附录A：代码位置索引

### KPI概览

* [下单总额](app/plugins/databoard/service/StatsTemplate2Service.php#L122-L129)
* [成交总额（折扣后）](app/plugins/databoard/service/StatsTemplate2Service.php#L139-L149)
* [成交总额（折扣前）](app/plugins/databoard/service/StatsTemplate2Service.php#L151-L154)
* [运费/加价总计](app/plugins/databoard/service/StatsTemplate2Service.php#L156-L159)
* [有效订单数](app/plugins/databoard/service/StatsTemplate2Service.php#L161-L164)
* [取消订单数](app/plugins/databoard/service/StatsTemplate2Service.php#L166-L180)
* [签收订单数](app/plugins/databoard/service/StatsTemplate2Service.php#L189-L203)
* [拒收订单数](app/plugins/databoard/service/StatsTemplate2Service.php#L205-L218)
* [退款总额](app/plugins/databoard/service/StatsTemplate2Service.php#L221-L239)
* [退款订单数](app/plugins/databoard/service/StatsTemplate2Service.php#L241-L260)

### 侧栏指标

* [订单均价(AOV)](app/plugins/databoard/service/StatsTemplate2Service.php#L431-L448)
* [COD复购率](app/plugins/databoard/service/StatsTemplate2Service.php#L478-L488)
* [平均折扣率](app/plugins/databoard/service/StatsTemplate2Service.php#L450-L476)
* [平均连带率](app/plugins/databoard/service/StatsTemplate2Service.php#L490-L510)
* [整体取消率](app/plugins/databoard/service/StatsTemplate2Service.php#L512-L546)
* [核心拒收率](app/plugins/databoard/service/StatsTemplate2Service.php#L548-L597)

### 转化漏斗

* [转化漏斗数据](app/plugins/databoard/service/StatsTemplate2Service.php#L304-L407)

### 排行榜

* [热卖商品排行](app/plugins/databoard/service/StatsTemplate2Service.php#L613-L659)
* [商品加购排行](app/plugins/databoard/service/StatsTemplate2Service.php#L667-L712)
* [地区购买排行](app/plugins/databoard/service/StatsTemplate2Service.php#L719-L758)

***

## 附录B：术语表

| 术语 | 英文 | 解释 |
|------|------|------|
| UV | Unique Visitor | 独立访客数 |
| AOV | Average Order Value | 订单均价（客单价） |
| COD | Cash On Delivery | 货到付款 |
| KPI | Key Performance Indicator | 关键绩效指标 |

***

## 附录C：更新日志

| 版本 | 日期 | 更新内容 | 更新人 |
|------|------|---------|--------|
| v1.0 | 2026-01-28 | 初始版本，包含完整的指标计算说明和7项修复 | AI Assistant |

***

**文档结束**

如有疑问，请联系开发团队或查阅相关代码。
