奖池渲染以及中奖逻辑

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

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

相关推荐
FungLeo2 天前
成为全栈·Vue 管理后台篇·分页只显示第一页:从接口total 定位到前端修复
前端·vue.js·状态模式·分页·naive ui·服务端分页·前端问题排查
严肃小白兔4 天前
TanStack Router 更新构建工具链:Node.js 兼容性、路由分割与前端工程实践
前端·node.js·状态模式
大江东去浪淘尽千古风流人物13 天前
【HexVIO】DSP卸载双目惯性VIO:Hexagon向量化前端与单帧融合调度深度解析
前端·状态模式·slam·dsp·vio·hexagon·移动端加速
吃一碗粉只付一碗钱14 天前
12-给SPA友好的401和403响应
c#·状态模式
sunlifenger14 天前
嵌入式部署,解锁张家港智慧灯杆的“极简组网”密码
科技·状态模式
上火的金鱼妹15 天前
关于多进程sse连接通知的实战
javascript·状态模式·sse
阿俊-全栈开发15 天前
LikeShop 小程序商城首页可配置弹窗的设计与实现(Java + uni-app)
小程序·状态模式·likeshop·likeshop开源商城
lingyubb16 天前
配音工具怎么选?从 TTS 合成链路看 6 个可量化参数
状态模式
平头哥技术团队17 天前
从预订问到退房:一间山野民宿的数字人「旅程地图」——Theme07_Homestay.vue 端到端拆解
状态模式·数字人