belongsTo('LotteryActivity', 'activity_id'); } /** * 获取条件类型文本 */ public function getTypeTextAttr($value, $data) { $types = [ self::TYPE_GOODS => '购买指定商品', self::TYPE_ORDER_AMOUNT => '单笔订单消费满额', self::TYPE_RECHARGE => '单次充值满额', self::TYPE_ACCUMULATE => '活动期间累计消费满额' ]; return isset($types[$data['type']]) ? $types[$data['type']] : '未知'; } /** * 获取商品规则文本 */ public function getGoodsRuleTextAttr($value, $data) { $rules = [ self::GOODS_RULE_INCLUDE => '指定商品参与', self::GOODS_RULE_EXCLUDE => '指定商品不可参与' ]; return isset($rules[$data['goods_rule']]) ? $rules[$data['goods_rule']] : ''; } /** * 获取商品ID列表 */ public function getGoodsIdsListAttr($value, $data) { return !empty($data['goods_ids']) ? json_decode($data['goods_ids'], true) : []; } /** * 设置商品ID列表 */ public function setGoodsIdsAttr($value) { return is_array($value) ? json_encode($value) : $value; } /** * 验证订单是否满足条件 */ public function validateOrder($orderInfo) { switch ($this->type) { case self::TYPE_GOODS: return $this->validateGoodsCondition($orderInfo); case self::TYPE_ORDER_AMOUNT: return $this->validateOrderAmountCondition($orderInfo); case self::TYPE_RECHARGE: return $this->validateRechargeCondition($orderInfo); default: return false; } } /** * 验证商品条件 */ private function validateGoodsCondition($orderInfo) { if (empty($orderInfo['goods']) || empty($this->goods_ids_list)) { return false; } $orderGoodsIds = array_column($orderInfo['goods'], 'goods_id'); $conditionGoodsIds = $this->goods_ids_list; $intersection = array_intersect($orderGoodsIds, $conditionGoodsIds); if ($this->goods_rule == self::GOODS_RULE_INCLUDE) { // 指定商品参与:订单中必须包含指定商品 return !empty($intersection); } else { // 指定商品不可参与:订单中不能包含指定商品 return empty($intersection); } } /** * 验证订单金额条件 */ private function validateOrderAmountCondition($orderInfo) { $orderAmount = $orderInfo['total_amount'] ?? 0; return $orderAmount >= $this->condition_value; } /** * 验证充值条件 */ private function validateRechargeCondition($orderInfo) { if (($orderInfo['type'] ?? '') !== 'recharge') { return false; } $rechargeAmount = $orderInfo['amount'] ?? 0; return $rechargeAmount >= $this->condition_value; } /** * 验证累计消费条件 */ public function validateAccumulateCondition($userId, $activityId) { $activity = LotteryActivity::find($activityId); if (!$activity) { return false; } // 计算活动期间用户累计消费 $totalAmount = \app\common\model\Order::where('user_id', $userId) ->where('status', 'paid') ->where('createtime', '>=', $activity->start_time) ->where('createtime', '<=', $activity->end_time) ->sum('total_amount'); return $totalAmount >= $this->condition_value; } /** * 获取活动的有效条件 */ public static function getValidConditions($activityId) { return static::where('activity_id', $activityId) ->where('status', 1) ->order('id', 'asc') ->select(); } /** * 检查条件是否可重复获得奖励 */ public function canRepeat() { return $this->is_repeatable == 1; } /** * 获取奖励次数 */ public function getRewardTimes() { return $this->reward_times ?: 1; } }