belongsTo('LotteryActivity', 'activity_id'); } /** * 关联商品 */ public function goods() { return $this->belongsTo('app\common\model\Goods', 'goods_id'); } /** * 关联商品SKU */ public function goodsSku() { return $this->belongsTo('app\common\model\Sku', 'goods_sku_id'); } /** * 关联优惠券 */ public function coupon() { return $this->belongsTo('app\common\model\Coupon', 'coupon_id'); } /** * 获取奖品类型文本 */ public function getTypeTextAttr($value, $data) { $types = [ self::TYPE_NO_PRIZE => '未中奖', self::TYPE_PHYSICAL => '实物奖品', self::TYPE_COUPON => '优惠券', self::TYPE_RED_PACKET => '红包', self::TYPE_EXCHANGE_CODE => '兑换码', self::TYPE_GOODS => '商城奖品' ]; return isset($types[$data['type']]) ? $types[$data['type']] : '未知'; } /** * 获取发放方式文本 */ public function getDeliverTypeTextAttr($value, $data) { $types = [ self::DELIVER_AUTO => '自动发放', self::DELIVER_MANUAL => '手动发放' ]; return isset($types[$data['deliver_type']]) ? $types[$data['deliver_type']] : '未知'; } /** * 获取兑换码列表 */ public function getExchangeCodesListAttr($value, $data) { return !empty($data['exchange_codes']) ? json_decode($data['exchange_codes'], true) : []; } /** * 设置兑换码列表 */ public function setExchangeCodesAttr($value) { return is_array($value) ? json_encode($value) : $value; } /** * 获取已使用兑换码列表 */ public function getUsedCodesListAttr($value, $data) { return !empty($data['used_codes']) ? json_decode($data['used_codes'], true) : []; } /** * 设置已使用兑换码列表 */ public function setUsedCodesAttr($value) { return is_array($value) ? json_encode($value) : $value; } /** * 检查奖品库存是否充足 */ public function hasStock($quantity = 1) { return $this->remain_stock >= $quantity; } /** * 减少库存 */ public function decreaseStock($quantity = 1) { if (!$this->hasStock($quantity)) { return false; } $this->remain_stock -= $quantity; $this->win_count += $quantity; return $this->save(); } /** * 获取可用的兑换码 */ public function getAvailableExchangeCode() { if ($this->type != self::TYPE_EXCHANGE_CODE) { return null; } $allCodes = $this->exchange_codes_list; $usedCodes = $this->used_codes_list; $availableCodes = array_diff($allCodes, $usedCodes); if (empty($availableCodes)) { return null; } return array_shift($availableCodes); } /** * 标记兑换码为已使用 */ public function markExchangeCodeUsed($code) { $usedCodes = $this->used_codes_list; if (!in_array($code, $usedCodes)) { $usedCodes[] = $code; $this->used_codes = json_encode($usedCodes); return $this->save(); } return true; } /** * 获取有效奖品(库存大于0且状态正常) */ public static function getValidPrizes($activityId) { return static::where('activity_id', $activityId) ->where('status', 1) ->where('remain_stock', '>', 0) ->order('sort_order', 'asc') ->select(); } /** * 检查是否已解锁(按人数解锁功能) */ public function isUnlocked($currentPeopleCount) { if (empty($this->unlock_people_num)) { return true; } return $currentPeopleCount >= $this->unlock_people_num; } }