# 任务中心优化方案

## 1. 现状分析
当前任务中心 (`internal/service/task_center/service.go`) 在奖励发放和进度更新逻辑上存在以下隐患：

1.  **错误处理缺失 (Critical)**: `grantTierRewards` 方法中，调用 `userSvc` (积分、优惠券等) 的返回值被直接忽略 (`_ = ...`)。如果发放失败，系统仍会记录“已发放”日志，导致用户无法收到奖励且无法补发。
2.  **并发安全问题 (High)**:
    -   `OnOrderPaid` 和 `OnInviteSuccess` 中，进度更新（如 `OrderCount++`）是在内存中计算后保存，存在“丢失更新”风险。
    -   `matchAndGrant` 中 `ClaimedTiers` 的更新也存在并发覆盖风险，可能导致同一个奖励被多次领取或领取状态丢失。
3.  **事务一致性 (Medium)**: 奖励发放（User Service）与日志记录（Task Log）不在同一事务中。虽然完全一致性难以在不重构的前提下实现，但目前的“忽略错误”加剧了不一致风险。

## 2. 优化方案

### 2.1 强化错误处理
在 `grantTierRewards` 中，严格检查每一个奖励发放接口的返回值。
-   如果任何一个奖励发放失败，立即返回错误。
-   利用外层事务回滚机制，确保 `TaskEventLog` 不会被写入（状态不会变为 granted）。
-   *副作用*: 对于包含多个奖励的任务，如果中途失败，可能会导致部分奖励重复发放（下次重试时）。但在当前架构下，这是优于“完全不发”的权衡选择。

### 2.2 并发控制与原子更新
1.  **原子计数**: 使用 SQL 层面的原子递增 (`order_count = order_count + 1`) 替代内存自增。
2.  **悲观锁**: 在读取 `UserTaskProgress` 时使用 `SELECT ... FOR UPDATE`，确保同一用户的并发事件（如并发支付）串行处理，防止状态覆盖。

### 2.3 代码重构
-   优化 `OnOrderPaid` 和 `OnInviteSuccess` 逻辑，确保 `matchAndGrant` 在锁的保护范围内执行。

## 3. 实施步骤
1.  修改 `internal/service/task_center/service.go`:
    -   重构 `OnOrderPaid` / `OnInviteSuccess` 使用事务和锁。
    -   重构 `grantTierRewards` 增加错误处理。
2.  验证修改。

## 4. 验收标准
- [ ] 模拟发奖失败场景，确保不会记录 `TaskEventLog`。
- [ ] 代码审查确认所有 `userSvc` 调用均处理了 error。
- [ ] 确认进度更新使用了锁机制。
