# dws_assistant_daily_detail 助教日度业绩明细表

> 生成时间：2026-02-03

## 表信息

| 属性 | 值 |
|------|-----|
| Schema | dws |
| 表名 | dws_assistant_daily_detail |
| 主键 | id |
| 唯一键 | (site_id, assistant_id, stat_date) |
| 数据来源 | dwd_assistant_service_log + dwd_assistant_service_log_ex |
| 更新频率 | 每小时增量更新 |
| 说明 | 以"助教+日期"为粒度，汇总每日业绩明细 |

## 字段说明

| 序号 | 字段名 | 类型 | 可空 | 说明 |
|------|--------|------|------|------|
| 1 | id | BIGSERIAL | NO | 自增主键 |
| 2 | site_id | BIGINT | NO | 门店ID |
| 3 | tenant_id | BIGINT | NO | 租户ID |
| 4 | assistant_id | BIGINT | NO | 助教ID（dim_assistant.assistant_id） |
| 5 | assistant_nickname | VARCHAR(50) | YES | 助教花名（冗余，便于查询展示） |
| 6 | stat_date | DATE | NO | 统计日期 |
| 7 | assistant_level_code | INTEGER | YES | 助教等级代码（SCD2口径：取stat_date当日生效的等级） |
| 8 | assistant_level_name | VARCHAR(20) | YES | 助教等级名称（由 `level_code` 静态映射得出，不依赖 SCD2 返回值） |
| 9 | total_service_count | INTEGER | NO | 总服务次数 |
| 10 | base_service_count | INTEGER | NO | 基础课服务次数 |
| 11 | bonus_service_count | INTEGER | NO | 附加课服务次数 |
| 12 | room_service_count | INTEGER | NO | 包厢课服务次数 |
| 13 | total_seconds | INTEGER | NO | 总计费时长（秒） |
| 14 | base_seconds | INTEGER | NO | 基础课计费时长（秒） |
| 15 | bonus_seconds | INTEGER | NO | 附加课计费时长（秒） |
| 16 | room_seconds | INTEGER | NO | 包厢课计费时长（秒） |
| 17 | total_hours | NUMERIC(10,2) | NO | 总计费小时数 |
| 18 | base_hours | NUMERIC(10,2) | NO | 基础课小时数 |
| 19 | bonus_hours | NUMERIC(10,2) | NO | 附加课小时数 |
| 20 | room_hours | NUMERIC(10,2) | NO | 包厢课小时数 |
| 21 | total_ledger_amount | NUMERIC(12,2) | NO | 总计费金额（元） |
| 22 | base_ledger_amount | NUMERIC(12,2) | NO | 基础课计费金额 |
| 23 | bonus_ledger_amount | NUMERIC(12,2) | NO | 附加课计费金额 |
| 24 | room_ledger_amount | NUMERIC(12,2) | NO | 包厢课计费金额 |
| 25 | unique_customers | INTEGER | NO | 服务客户数（去重） |
| 26 | unique_tables | INTEGER | NO | 服务台桌数（去重） |
| 27 | trashed_seconds | INTEGER | NO | 被废除的服务时长（秒） |
| 28 | trashed_count | INTEGER | NO | 被废除的服务次数 |
| 29 | penalty_minutes | NUMERIC(10,2) | YES | 惩罚分钟数（定档折算）。公式：`actual_minutes × (1 - per_hour_contribution / 24)`，per_hour_contribution ≥ 24 时为 0 |
| 30 | penalty_reason | TEXT | YES | 惩罚原因描述（NULL=无违规） |
| 31 | is_exempt | BOOLEAN | NO | 是否豁免惩罚（豁免助教不计算惩罚） |
| 32 | per_hour_contribution | NUMERIC(10,2) | YES | 每小时贡献金额（= `base_ledger_amount / base_hours / overlap_count`，NULL=无违规或豁免） |
| 33 | created_at | TIMESTAMPTZ | NO | 创建时间 |
| 34 | updated_at | TIMESTAMPTZ | NO | 更新时间 |

## 数据来源

### 主要来源：dwd_assistant_service_log
```sql
SELECT 
    site_id,
    DATE(start_use_time) AS stat_date,
    site_assistant_id AS assistant_id,
    nickname AS assistant_nickname,
    COUNT(*) AS total_service_count,
    SUM(income_seconds) AS total_seconds,
    SUM(ledger_amount) AS total_ledger_amount,
    COUNT(DISTINCT tenant_member_id) AS unique_customers,
    COUNT(DISTINCT site_table_id) AS unique_tables
FROM dwd.dwd_assistant_service_log
WHERE is_delete = 0
GROUP BY site_id, DATE(start_use_time), site_assistant_id, nickname;
```

### 废除记录：dwd_assistant_service_log_ex

> ⚠️ `dwd_assistant_trash_event` 已于 2026-02-22 废弃，作废判断改用 `dwd_assistant_service_log_ex.is_trash`（0=正常，1=作废）。

```sql
SELECT 
    s.site_id,
    DATE(s.start_use_time) AS stat_date,
    s.site_assistant_id AS assistant_id,
    SUM(CASE WHEN ex.is_trash = 1 THEN s.income_seconds ELSE 0 END) AS trashed_seconds,
    COUNT(CASE WHEN ex.is_trash = 1 THEN 1 END) AS trashed_count
FROM dwd.dwd_assistant_service_log s
LEFT JOIN dwd.dwd_assistant_service_log_ex ex ON s.assistant_service_id = ex.assistant_service_id
WHERE s.is_delete = 0
GROUP BY s.site_id, DATE(s.start_use_time), s.site_assistant_id;
```

## 使用说明

**时间分层查询**
```sql
-- 近2天
SELECT * FROM dws.dws_assistant_daily_detail
WHERE stat_date >= CURRENT_DATE - 1;

-- 近1月
SELECT * FROM dws.dws_assistant_daily_detail
WHERE stat_date >= CURRENT_DATE - INTERVAL '1 month';

-- 月度汇总
SELECT 
    assistant_id,
    DATE_TRUNC('month', stat_date) AS stat_month,
    SUM(total_hours) AS total_hours,
    SUM(base_hours) AS base_hours,
    SUM(bonus_hours) AS bonus_hours,
    SUM(room_hours) AS room_hours
FROM dws.dws_assistant_daily_detail
GROUP BY assistant_id, DATE_TRUNC('month', stat_date);
```

**物化汇总层（可选）**
- L1~L4 物化视图：`mv_dws_assistant_daily_detail_l1` / `l2` / `l3` / `l4`
- 刷新任务：`DWS_MV_REFRESH_ASSISTANT_DAILY`

## 可回溯性

| 项目 | 说明 |
|------|------|
| 可回溯 | ✅ 完全可回溯 |
| 数据范围 | 2025-07-21 ~ 至今 |
| 依赖表 | dwd_assistant_service_log, dwd_assistant_service_log_ex, dim_assistant, dim_table, cfg_skill_type |
