LotteryActivityService
是抽奖活动管理的专门服务类,负责处理抽奖活动的状态管理、验证、查询、创建、更新、删除等操作。该类专注于活动层面的业务逻辑,与核心抽奖逻辑分离,提供清晰的活动管理接口。
namespace app\common\Service\lottery;
class LotteryActivityService
{
// 活动状态检查方法
public static function isRunning(LotteryActivity $activity)
public static function isEnded(LotteryActivity $activity)
public static function isNotStarted(LotteryActivity $activity)
public static function isSuspended(LotteryActivity $activity)
public static function isCancelled(LotteryActivity $activity)
public static function isInDrawTime(LotteryActivity $activity)
// 活动查询方法
public static function getRunningActivities()
public static function getNotStartedActivities()
public static function getEndedActivities()
public static function getDisplayableActivities()
// 活动验证方法
public static function isValidStatus(LotteryActivity $activity)
public static function isValidLotteryType(LotteryActivity $activity)
// 活动信息方法
public static function getActivityStatusDescription(LotteryActivity $activity)
public static function canUserParticipate(LotteryActivity $activity, $userId)
public static function getActivityStatistics(LotteryActivity $activity)
// 活动管理方法
public static function batchUpdateStatus()
public static function createActivity($data)
public static function updateActivity(LotteryActivity $activity, $data)
public static function deleteActivity(LotteryActivity $activity)
// 奖品查询方法
public static function getPrizes($activityId = null, $page = 1, $pageSize = 10, $type = null)
public static function getActivityPrizeStats($activityId)
public static function getRunningActivityPrizes($page, $pageSize, $type)
public static function getActivityPrizes($activityId, $page, $pageSize, $type)
}
功能: 检查活动是否处于进行中状态。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否正在进行
逻辑:
STATUS_ONGOING
使用示例:
$activity = LotteryActivity::find(1);
if (LotteryActivityService::isRunning($activity)) {
echo "活动正在进行中";
}
功能: 检查活动是否已结束。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否已结束
逻辑:
STATUS_ENDED
或当前时间超过结束时间功能: 检查活动是否还未开始。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否未开始
逻辑:
STATUS_NOT_STARTED
且当前时间未到开始时间功能: 检查活动是否已暂停。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否已暂停
逻辑:
STATUS_SUSPENDED
功能: 检查活动是否已取消。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否已取消
逻辑:
STATUS_CANCELLED
功能: 检查当前时间是否在活动的抽奖时间范围内。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
是否在抽奖时间内
逻辑:
true
draw_time_start
和 draw_time_end
之间使用示例:
$activity = LotteryActivity::find(1);
if (LotteryActivityService::isInDrawTime($activity)) {
echo "当前在抽奖时间内";
} else {
echo "当前不在抽奖时间内";
}
功能: 获取所有正在进行的抽奖活动。
返回值: Collection
活动集合
查询条件:
STATUS_ONGOING
使用示例:
$runningActivities = LotteryActivityService::getRunningActivities();
foreach ($runningActivities as $activity) {
echo "活动名称:" . $activity->name;
}
功能: 获取所有未开始的抽奖活动。
返回值: Collection
活动集合
查询条件:
STATUS_NOT_STARTED
功能: 获取所有已结束的抽奖活动。
返回值: Collection
活动集合
查询条件:
STATUS_ENDED
或结束时间小于当前时间功能: 获取可显示的活动(排除逻辑状态)。
返回值: Collection
活动集合
查询条件:
功能: 验证活动状态是否有效。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
状态是否有效
验证逻辑:
LotteryEnum::isValidActivityStatus()
验证功能: 验证开奖方式是否有效。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
开奖方式是否有效
验证逻辑:
LotteryEnum::isValidLotteryType()
验证功能: 获取活动的详细状态描述。
参数:
$activity
(LotteryActivity): 活动对象返回值: string
状态描述
状态描述:
活动已取消
活动已暂停
活动已结束
活动进行中
活动未开始
未知状态
使用示例:
$activity = LotteryActivity::find(1);
$statusDesc = LotteryActivityService::getActivityStatusDescription($activity);
echo "活动状态:" . $statusDesc;
功能: 检查用户是否可以参与指定活动。
参数:
$activity
(LotteryActivity): 活动对象$userId
(int): 用户ID返回值: bool
是否可以参与
检查内容:
使用示例:
$activity = LotteryActivity::find(1);
$userId = 123;
if (LotteryActivityService::canUserParticipate($activity, $userId)) {
echo "用户可以参与活动";
} else {
echo "用户不能参与活动";
}
功能: 获取活动的统计信息。
参数:
$activity
(LotteryActivity): 活动对象返回值: array
统计信息
统计内容:
[
'total_participants' => 100, // 总参与人数
'total_winners' => 20, // 总中奖人数
'total_prizes' => 5, // 总奖品数量
'total_conditions' => 3 // 总参与条件数量
]
使用示例:
$activity = LotteryActivity::find(1);
$stats = LotteryActivityService::getActivityStatistics($activity);
echo "参与人数:" . $stats['total_participants'];
echo "中奖人数:" . $stats['total_winners'];
功能: 批量更新活动状态,处理过期和到期的活动。
逻辑:
使用示例:
// 通常在定时任务中调用
LotteryActivityService::batchUpdateStatus();
功能: 创建新的抽奖活动。
参数:
$data
(array): 活动数据返回值: LotteryActivity
创建的活动对象
验证内容:
异常: Exception
验证失败时抛出异常
使用示例:
$activityData = [
'name' => '新年抽奖活动',
'status' => LotteryEnum::STATUS_NOT_STARTED,
'lottery_type' => LotteryEnum::LOTTERY_TYPE_INSTANT,
'start_time' => time() + 3600,
'end_time' => time() + 86400,
// ... 其他字段
];
try {
$activity = LotteryActivityService::createActivity($activityData);
echo "活动创建成功,ID:" . $activity->id;
} catch (Exception $e) {
echo "活动创建失败:" . $e->getMessage();
}
功能: 更新现有活动信息。
参数:
$activity
(LotteryActivity): 活动对象$data
(array): 更新数据返回值: bool
更新是否成功
验证内容:
异常: Exception
验证失败时抛出异常
使用示例:
$activity = LotteryActivity::find(1);
$updateData = [
'name' => '更新后的活动名称',
'status' => LotteryEnum::STATUS_ONGOING
];
try {
$result = LotteryActivityService::updateActivity($activity, $updateData);
if ($result) {
echo "活动更新成功";
}
} catch (Exception $e) {
echo "活动更新失败:" . $e->getMessage();
}
功能: 删除抽奖活动。
参数:
$activity
(LotteryActivity): 活动对象返回值: bool
删除是否成功
验证内容:
异常: Exception
验证失败时抛出异常
使用示例:
$activity = LotteryActivity::find(1);
try {
$result = LotteryActivityService::deleteActivity($activity);
if ($result) {
echo "活动删除成功";
}
} catch (Exception $e) {
echo "活动删除失败:" . $e->getMessage();
}
功能: 获取奖品列表,支持按活动ID查询或查询进行中活动的奖品。
参数:
$activityId
(int|null): 活动ID,不传则查询进行中活动的奖品$page
(int): 页码,默认1$pageSize
(int): 每页数量,默认10$type
(array|null): 奖品类型筛选数组返回值: \think\Paginator
分页对象
返回格式:
[
'list' => [
[
'id' => 1,
'activity_id' => 1,
'name' => '一等奖',
'type' => 2,
'type_text' => '实物奖品',
'image' => '/uploads/prize1.jpg',
'description' => '奖品描述',
'probability' => 0.01,
'probability_percent' => 1.00,
'total_stock' => 10,
'remain_stock' => 8,
'stock_percent' => 80.00,
'win_prompt' => '恭喜中奖!',
'sort_order' => 1,
'unlock_people_num' => 100,
'is_unlocked' => true,
'activity_name' => '新年抽奖活动',
'activity_status' => 2,
'createtime' => 1640995200
]
],
'total' => 1
]
功能: 获取指定活动的奖品统计信息。
参数:
$activityId
(int): 活动ID返回值: array
统计信息
返回格式:
[
'total_prizes' => 5, // 总奖品数量
'total_stock' => 100, // 总库存
'remain_stock' => 80, // 剩余库存
'used_stock' => 20, // 已使用库存
'prize_types' => [ // 按类型统计
2 => [
'type' => 2,
'type_text' => '实物奖品',
'count' => 3,
'total_stock' => 3,
'remain_stock' => 2
]
],
'unlocked_prizes' => 4, // 已解锁奖品数量
'locked_prizes' => 1 // 未解锁奖品数量
]
功能: 获取所有进行中活动的奖品列表。
参数:
$page
(int): 页码,默认1$pageSize
(int): 每页数量,默认20$type
(int|array|null): 奖品类型筛选,支持单个类型或类型数组返回值: \think\Paginator
分页对象
功能: 获取指定活动的奖品列表。
参数:
$activityId
(int): 活动ID$page
(int): 页码,默认1$pageSize
(int): 每页数量,默认20$type
(int|array|null): 奖品类型筛选,支持单个类型或类型数组返回值: \think\Paginator
分页对象
// 获取所有活动状态
$activity = LotteryActivity::find(1);
if (LotteryActivityService::isRunning($activity)) {
echo "活动正在进行中";
} elseif (LotteryActivityService::isEnded($activity)) {
echo "活动已结束";
} elseif (LotteryActivityService::isNotStarted($activity)) {
echo "活动未开始";
} elseif (LotteryActivityService::isSuspended($activity)) {
echo "活动已暂停";
} elseif (LotteryActivityService::isCancelled($activity)) {
echo "活动已取消";
}
// 获取状态描述
$statusDesc = LotteryActivityService::getActivityStatusDescription($activity);
echo "活动状态:" . $statusDesc;
// 获取正在进行的活动
$runningActivities = LotteryActivityService::getRunningActivities();
echo "正在进行的活动数量:" . $runningActivities->count();
// 获取未开始的活动
$notStartedActivities = LotteryActivityService::getNotStartedActivities();
echo "未开始的活动数量:" . $notStartedActivities->count();
// 获取已结束的活动
$endedActivities = LotteryActivityService::getEndedActivities();
echo "已结束的活动数量:" . $endedActivities->count();
// 获取可显示的活动
$displayableActivities = LotteryActivityService::getDisplayableActivities();
echo "可显示的活动数量:" . $displayableActivities->count();
$activity = LotteryActivity::find(1);
$userId = 123;
// 检查用户是否可以参与
if (LotteryActivityService::canUserParticipate($activity, $userId)) {
echo "用户可以参与活动";
// 检查是否在抽奖时间内
if (LotteryActivityService::isInDrawTime($activity)) {
echo "当前在抽奖时间内,可以抽奖";
} else {
echo "当前不在抽奖时间内";
}
} else {
echo "用户不能参与活动";
}
$activity = LotteryActivity::find(1);
$stats = LotteryActivityService::getActivityStatistics($activity);
echo "活动统计信息:\n";
echo "总参与人数:" . $stats['total_participants'] . "\n";
echo "总中奖人数:" . $stats['total_winners'] . "\n";
echo "总奖品数量:" . $stats['total_prizes'] . "\n";
echo "总参与条件数量:" . $stats['total_conditions'] . "\n";
// 创建活动
$activityData = [
'name' => '测试抽奖活动',
'status' => LotteryEnum::STATUS_NOT_STARTED,
'lottery_type' => LotteryEnum::LOTTERY_TYPE_INSTANT,
'start_time' => time() + 3600,
'end_time' => time() + 86400,
'user_limit_type' => LotteryEnum::USER_LIMIT_ALL,
'person_limit_num' => 10,
'draw_time_enable' => 0
];
try {
$activity = LotteryActivityService::createActivity($activityData);
echo "活动创建成功,ID:" . $activity->id;
// 更新活动
$updateData = ['name' => '更新后的活动名称'];
$result = LotteryActivityService::updateActivity($activity, $updateData);
if ($result) {
echo "活动更新成功";
}
// 删除活动(如果允许)
$result = LotteryActivityService::deleteActivity($activity);
if ($result) {
echo "活动删除成功";
}
} catch (Exception $e) {
echo "操作失败:" . $e->getMessage();
}
// 在定时任务中调用
LotteryActivityService::batchUpdateStatus();
echo "活动状态批量更新完成";
// 获取指定活动的奖品列表
$activityId = 1;
$page = 1;
$pageSize = 20;
// 单个类型筛选
$type = 2; // 实物奖品类型
$paginate = LotteryActivityService::getActivityPrizes($activityId, $page, $pageSize, $type);
// 多个类型筛选
$types = [2, 3, 4]; // 实物奖品、积分、余额
$paginate = LotteryActivityService::getActivityPrizes($activityId, $page, $pageSize, $types);
echo "奖品数量:" . $paginate->total();
echo "当前页:" . $paginate->currentPage();
echo "总页数:" . $paginate->lastPage();
foreach ($paginate->items() as $prize) {
echo "奖品名称:" . $prize->name;
echo "中奖率:" . $prize->probability_percent . "%";
echo "库存百分比:" . $prize->stock_percent . "%";
}
// 获取进行中活动的奖品列表
$paginate = LotteryActivityService::getRunningActivityPrizes($page, $pageSize, $types);
echo "进行中活动奖品数量:" . $paginate->total();
// 获取活动奖品统计信息
$stats = LotteryActivityService::getActivityPrizeStats($activityId);
echo "总奖品数量:" . $stats['total_prizes'];
echo "总库存:" . $stats['total_stock'];
echo "剩余库存:" . $stats['remain_stock'];
echo "已使用库存:" . $stats['used_stock'];
echo "已解锁奖品:" . $stats['unlocked_prizes'];
echo "未解锁奖品:" . $stats['locked_prizes'];
// 按奖品类型统计
foreach ($stats['prize_types'] as $typeInfo) {
echo "奖品类型:" . $typeInfo['type_text'];
echo "数量:" . $typeInfo['count'];
echo "库存:" . $typeInfo['total_stock'];
echo "剩余:" . $typeInfo['remain_stock'];
}
无效的活动状态
- 状态验证失败无效的开奖方式
- 开奖方式验证失败进行中的活动不能删除
- 删除验证失败app\common\model\lottery\LotteryActivity
: 活动模型app\common\model\lottery\LotteryPrize
: 奖品模型app\common\Enum\LotteryEnum
: 抽奖枚举类think\Paginator
: ThinkPHP分页类