┌──────────────────────────────────────────┐
│ T1: 用户打开页面 │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 确定用户所属的主奖池 │
│ getPrizePoolSeqNumber(mobile) │
│ 例如: 返回 "3" (5次以下奖池) │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 同时获取主奖池和备用奖池 │
│ 主奖池ID: "3" │
│ 备用奖池ID: "3_backup" (通过映射获取) │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 遍历主奖池的每个奖品 │
│ 对每个奖品进行检查: │
│ │
│ 奖品A: 库存=0 ❌ → 用备用奖池的A'替换 ✅ │
│ 奖品B: 库存=100 ✅ → 直接使用 │
│ 奖品C: 已达上限 ❌ → 用备用奖池的C'替换 ✅│
│ 奖品D: 非POP客群 ❌ → 用备用奖池的D'替换 ✅│
│ 奖品E: 库存=50 ✅ → 直接使用 │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 返回混合后的奖品列表给前端 │
│ [A', B, C', D', E] │
│ (部分来自主奖池,部分来自备用奖池) │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 将可用奖品ID缓存到Redis │
│ Key: LUCKYTURN:PRIZEIDS:{mobile} │
│ Value: ["A'", "B", "C'", "D'", "E"] │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 前端: 渲染转盘,显示5个奖品 │
│ 用户看到的都是可抽的奖品 │
└──────────────┬───────────────────────────┘
│
⏰ 用户做任务、浏览...
│
▼
┌──────────────────────────────────────────┐
│ T2: 用户点击抽奖 │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 从Redis获取缓存的奖品ID列表 │
│ ["A'", "B", "C'", "D'", "E"] │
│ ⚠️ 注意: 这里不再查询备用奖池! │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 从这5个奖品中按概率抽取 │
│ 假设抽中: "C'" (来自备用奖池的奖品) │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 后端: 返回中奖结果 │
│ { winPrizeId: "C'", ... } │
└──────────────┬───────────────────────────┘
│
▼
┌──────────────────────────────────────────┐
│ 前端: 在转盘上找到"C'"的索引 │
│ 转盘转到对应位置 │
│ 显示中奖弹窗 │
└──────────────────────────────────────────┘
写法(最优、性能最好、Oracle 标准)
STARTDATE >= TRUNC(SYSDATE, 'MM')
✅ 最快 (可以走索引)✅ 最标准 (Oracle 专用)✅ 最准确
格式化写法(慢,不推荐)
TO_CHAR(STARTDATE, 'YYYY-MM') = TO_CHAR(SYSDATE, 'YYYY-MM')
❌ 无法用索引❌ 大数据量会卡
超简记忆
TRUNC (SYSDATE, 'MM') = 当月 1 号 >= 当月 1 号 = 查当月