奖池渲染以及中奖逻辑

┌──────────────────────────────────────────┐

│ 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 号 = 查当月

相关推荐
喜欢打篮球的普通人17 小时前
LLVM 前端与优化层:Clang 如何把 C 代码变成 IR
c语言·前端·状态模式
m0_敲代码的彭于晏1681 天前
Vercel 前端部署与全栈开发实战指南
前端·状态模式
星恒随风2 天前
Linux线程同步与互斥(二):从日志系统与线程池设计,到线程安全单例、可重入函数和死锁原理
linux·运维·状态模式
学Linux的语莫3 天前
python中类的常见写法
开发语言·python·状态模式
223糖3 天前
Tool Calling 是什么?用后端接口的思路讲清楚
状态模式
染指11104 天前
151.Agent-LangGraph-Send发送(Map-Reduce模式)
人工智能·python·langchain·状态模式·agents
鸽鸽程序猿6 天前
【项目】【在线判题系统】竞赛发布与撤销发布
状态模式
lemon_sjdk6 天前
从一段真实的 Electron IM 前端代码,看高级前端的工程化修养
前端·electron·状态模式·im
Nebula_g6 天前
云禾外卖补充—项目整体后端运行逻辑-对流程的更深层次理解
java·开发语言·网络·数据库·状态模式·javase
Wang's Blog6 天前
Java 项目实战: 交友项目:登录链路回顾与今日任务地图
java·开发语言·状态模式·交友