# 数据模型文档：任务中心

## Tasks
- id BIGINT PK
- name VARCHAR(64)
- description TEXT
- status TINYINT（0禁用，1启用）
- start_time DATETIME
- end_time DATETIME
- visibility TINYINT（0隐藏，1展示）
- conditions_schema JSON（可选）
- created_at DATETIME
- updated_at DATETIME

## TaskTiers
- id BIGINT PK
- task_id BIGINT FK→Tasks.id
- metric ENUM（`first_order`/`order_count`/`invite_count`）
- operator ENUM（`>=`/`==`）
- threshold INT或JSON数组（阶梯）
- window ENUM（`activity_period`/`since_registration`）
- repeatable TINYINT（0否，1每档一次）
- priority INT（匹配优先级）
- created_at DATETIME
- updated_at DATETIME

## TaskRewards
- id BIGINT PK
- task_id BIGINT FK→Tasks.id
- tier_id BIGINT FK→TaskTiers.id
- reward_type ENUM（`points`/`coupon`/`item_card`/`title`）
- reward_payload JSON（如：积分数、券ID、卡ID、称号ID）
- quantity INT（库存/发放上限，可选）
- created_at DATETIME
- updated_at DATETIME

## UserTaskProgress
- id BIGINT PK
- user_id BIGINT
- task_id BIGINT
- metrics JSON（`order_count`、`invite_count`、`first_order`）
- claimed_tiers JSON数组（已领取档位ID）
- updated_at DATETIME
- created_at DATETIME

## TaskEventLogs
- id BIGINT PK
- event_id VARCHAR(64)
- source_type ENUM（`order`/`invite`）
- source_id BIGINT
- user_id BIGINT
- task_id BIGINT
- tier_id BIGINT
- idempotency_key VARCHAR(128)
- status ENUM（`granted`/`skipped`/`rejected`）
- result JSON（错误/风控原因或发奖明细）
- created_at DATETIME

## UserTitles（如复用现表则略）
- 复用`internal/repository/mysql/model/user_titles.gen.go`，如需从任务中心发放，记录来源`source_task_id/tier_id`

