# BD 手册：biz.dws_assistant_task_monthly

> 助教任务月度统计汇总表

## 基本信息

| 属性 | 值 |
|------|-----|
| Schema | biz |
| 表名 | dws_assistant_task_monthly |
| 所属库 | zqyy_app |
| 创建日期 | 2026-03-31 |
| 写入方 | `task_generator._update_task_stats()` |
| 读取方 | 看板 / 绩效报表（待接入） |
| 幂等策略 | UPSERT（`ON CONFLICT (site_id, assistant_id, stat_month) DO UPDATE`） |

## 用途

按助教 + 自然月维度汇总任务引擎的创建/完成/放弃/转移数据。每次 `task_generator.run()` 执行时，对当前门店的所有助教重新计算当月统计并 upsert。

## 字段定义

| 字段名 | 类型 | 可空 | 默认值 | 说明 |
|--------|------|------|--------|------|
| id | BIGSERIAL | NOT NULL | 自增 | 主键 |
| site_id | BIGINT | NOT NULL | — | 门店 ID |
| assistant_id | BIGINT | NOT NULL | — | 助教 ID |
| stat_month | DATE | NOT NULL | — | 统计月份（月初日期，如 2026-03-01） |
| recall_created | INT | NOT NULL | 0 | 当月创建的召回任务数（high_priority + priority） |
| follow_up_created | INT | NOT NULL | 0 | 当月创建的回访任务数 |
| relationship_created | INT | NOT NULL | 0 | 当月创建的关系构建任务数 |
| total_created | INT | NOT NULL | 0 | 当月创建的任务总数 |
| recall_completed | INT | NOT NULL | 0 | 当月完成的召回任务数 |
| follow_up_completed | INT | NOT NULL | 0 | 当月完成的回访任务数 |
| total_completed | INT | NOT NULL | 0 | 当月完成的任务总数 |
| abandoned_count | INT | NOT NULL | 0 | 当月放弃的任务数 |
| transferred_count | INT | NOT NULL | 0 | 当月转移的任务数 |
| updated_at | TIMESTAMPTZ | NOT NULL | NOW() | 最后更新时间 |

## 约束与索引

| 名称 | 类型 | 字段 |
|------|------|------|
| PK | PRIMARY KEY | id |
| UQ | UNIQUE | (site_id, assistant_id, stat_month) |
| idx_task_monthly_site_month | INDEX | (site_id, stat_month DESC) |
| idx_task_monthly_assistant | INDEX | (assistant_id, stat_month DESC) |

## 数据来源

统计数据从 `biz.coach_tasks` 表聚合：
- 按 `assigned_assistant_id` + `DATE_TRUNC('month', created_at)` 分组
- `recall_created` = COUNT WHERE task_type IN ('high_priority_recall', 'priority_recall')
- `follow_up_created` = COUNT WHERE task_type = 'follow_up_visit'
- `relationship_created` = COUNT WHERE task_type = 'relationship_building'
- `*_completed` = COUNT WHERE status = 'completed' AND 对应 task_type
- `abandoned_count` = COUNT WHERE status = 'abandoned'
- `transferred_count` = COUNT WHERE status = 'transferred'

## 兼容性

- ETL：无直接依赖（表由后端 task_generator 写入）
- 后端 API：待接入看板/绩效接口
- 小程序：无直接依赖

## 回滚策略

```sql
DROP TABLE IF EXISTS biz.dws_assistant_task_monthly;
```

## 关联变更

- 迁移脚本：`db/zqyy_app/migrations/2026-03-31__task_stats_tables.sql`
- 审计记录：`docs/audit/changes/2026-03-31__task-engine-overhaul.md`
- 关联表：`biz.coach_tasks`（数据源）、`dws.dws_member_assistant_relation_index`（C 层历史总计字段）
