belongsTo('LotteryActivity', 'activity_id'); } /** * 关联用户 */ public function user() { return $this->belongsTo('app\common\model\User', 'user_id'); } /** * 关联奖品 */ public function prize() { return $this->belongsTo('LotteryPrize', 'prize_id'); } /** * 关联中奖记录 */ public function winRecord() { return $this->hasOne('LotteryWinRecord', 'draw_record_id'); } /** * 关联订单 */ public function order() { return $this->belongsTo('app\common\model\Order', 'trigger_order_id'); } /** * 获取触发类型文本 */ public function getTriggerTypeTextAttr($value, $data) { $types = [ self::TRIGGER_GOODS => '购买商品', self::TRIGGER_ORDER => '订单消费', self::TRIGGER_RECHARGE => '充值', self::TRIGGER_ACCUMULATE => '累计消费' ]; return isset($types[$data['trigger_type']]) ? $types[$data['trigger_type']] : '未知'; } /** * 获取中奖信息数据 */ public function getWinInfoDataAttr($value, $data) { return !empty($data['win_info']) ? json_decode($data['win_info'], true) : []; } /** * 设置中奖信息 */ public function setWinInfoAttr($value) { return is_array($value) ? json_encode($value) : $value; } /** * 创建抽奖记录 */ public static function createRecord($activityId, $userId, $prizeId, $isWin, $triggerType, $triggerOrderId = null, $triggerAmount = null, $winInfo = []) { $data = [ 'activity_id' => $activityId, 'user_id' => $userId, 'prize_id' => $prizeId, 'is_win' => $isWin ? 1 : 0, 'trigger_type' => $triggerType, 'trigger_order_id' => $triggerOrderId, 'trigger_amount' => $triggerAmount, 'win_info' => $winInfo ? json_encode($winInfo) : '', 'draw_ip' => request()->ip(), 'draw_time' => time(), 'device_info' => request()->header('user-agent', '') ]; return static::create($data); } /** * 获取用户抽奖次数 */ public static function getUserDrawCount($activityId, $userId, $timeRange = null) { $query = static::where('activity_id', $activityId) ->where('user_id', $userId); if ($timeRange) { if (isset($timeRange['start'])) { $query->where('draw_time', '>=', $timeRange['start']); } if (isset($timeRange['end'])) { $query->where('draw_time', '<=', $timeRange['end']); } } return $query->count(); } /** * 获取用户中奖次数 */ public static function getUserWinCount($activityId, $userId, $timeRange = null) { $query = static::where('activity_id', $activityId) ->where('user_id', $userId) ->where('is_win', 1); if ($timeRange) { if (isset($timeRange['start'])) { $query->where('draw_time', '>=', $timeRange['start']); } if (isset($timeRange['end'])) { $query->where('draw_time', '<=', $timeRange['end']); } } return $query->count(); } /** * 获取活动抽奖统计 */ public static function getActivityStats($activityId, $timeRange = null) { $query = static::where('activity_id', $activityId); if ($timeRange) { if (isset($timeRange['start'])) { $query->where('draw_time', '>=', $timeRange['start']); } if (isset($timeRange['end'])) { $query->where('draw_time', '<=', $timeRange['end']); } } return [ 'total_draw' => $query->count(), 'total_win' => $query->where('is_win', 1)->count(), 'total_people' => $query->distinct('user_id')->count() ]; } }