本次优化对消费抽奖营销活动系统进行了重大升级,实现了三种抽奖方式的统一处理流程,提升了系统的可维护性、扩展性和数据一致性。
handleLotteryByType()
: 根据开奖方式分流处理createParticipationRecord()
: 统一创建参与记录入口用户抽奖 → 验证资格 → 消耗机会 → 创建记录 → 根据方式处理 → 更新状态 → 返回结果
const DRAW_STATUS_PARTICIPATED = 1; // 已参与(等待开奖)
const DRAW_STATUS_WIN = 2; // 已中奖
const DRAW_STATUS_NO_WIN = 3; // 未中奖
-- shop_lottery_draw_record 表新增
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '抽奖状态: 1=已参与 2=已中奖 3=未中奖',
`prize_id` int(11) NOT NULL DEFAULT '0' COMMENT '奖品ID,0表示未开奖',
-- 新增索引
KEY `idx_status` (`status`)
shop_lottery_user_chance_record
表结构executeInstantDraw()
: 执行即抽即中抽奖逻辑createParticipationRecord() // 创建参与记录
↓
executeInstantDraw() // 立即执行抽奖
├── 获取可用奖品
├── 执行抽奖算法
├── 减少奖品库存
├── 更新记录状态
├── 创建中奖记录(如果中奖)
├── 自动发放奖品
└── 更新活动统计
↓
返回抽奖结果
handleTimeLottery()
: 处理定时抽奖参与processScheduledLotteries()
: 定时任务处理入口(公开方法)executeScheduledDraw()
: 执行定时开奖executeDrawForRecord()
: 为单个记录执行开奖// 用户参与阶段
createParticipationRecord() // 创建参与记录
↓
handleTimeLottery() // 处理定时抽奖
├── 验证开奖时间
└── 返回等待状态
// 定时任务阶段
processScheduledLotteries() // 定时任务入口
├── 查询到期活动
├── executeScheduledDraw() // 执行定时开奖
│ └── executeDrawForRecord() // 为每个记录开奖
└── 更新活动状态
# Linux Cron 配置
* * * * * /usr/bin/php /path/to/project/think lottery:process-scheduled
handlePeopleLottery()
: 处理按人数抽奖createParticipationRecord() // 创建参与记录
↓
handlePeopleLottery() // 处理按人数抽奖
├── 查询当前参与人数
├── 检查是否达到开奖人数
├── 如果达标:触发批量开奖
└── 如果不足:返回等待状态
-- 为抽奖记录表添加status字段
ALTER TABLE shop_lottery_draw_record ADD `status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '抽奖状态: 1=已参与 2=已中奖 3=未中奖' AFTER `prize_id`;
-- 修改prize_id字段默认值
ALTER TABLE shop_lottery_draw_record MODIFY `prize_id` int(11) NOT NULL DEFAULT '0' COMMENT '奖品ID,0表示未开奖';
-- 添加状态字段索引
ALTER TABLE shop_lottery_draw_record ADD KEY `idx_status` (`status`);
LotteryService.php
LotteryEnum.php
# 配置定时任务处理定时开奖
* * * * * /usr/bin/php /path/to/project/think lottery:process-scheduled
优化完成时间: 2024年12月 涉及文件: LotteryService.php, LotteryEnum.php, 相关文档 测试状态: 待测试 上线状态: 待部署