canGet() // 在领取时间之内的 ->lock(true) ->where('id', $id) ->find(); if (!$coupon) { error_stop('优惠券未找到'); } $userCoupon = $this->send($user, $coupon); return $userCoupon; }); return $userCoupon; } /** * 赠送优惠券 * * @param array $user * @param array|string $ids * @return array */ public function giveCoupons($user, $ids) { // echo "
";
        // print_r($user);
        // print_r($user->id);
        // exit();
        $ids = is_array($ids) ? $ids : explode(',', $ids);

        $result = Db::transaction(function () use ($user, $ids) {
            $errors = [];       // 发送失败的优惠券,包含失败原因
            $success = [];      // 发送成功的优惠券
            $coupons = Coupon::statusHidden()     // 只查询隐藏券(后台发放的券)
                ->canGet()
                ->whereIn('id', $ids)
                ->select();

            $findCouponIds = array_column($coupons, 'id');        // 找到的优惠券 ids
            $nofundIds = array_diff($ids, $findCouponIds);
            foreach ($nofundIds as $nofund_id) {
                $errors[] = ['id', $nofund_id, 'error' => '优惠券未找到'];
            }

            foreach ($coupons as $coupon) {
                
                try {
                    
                    //$userCoupon = $this->send($user, $coupon);
                    if ($coupon->get_status == 'cannot_get') {
                        error_stop('您已经领取过了');
                    }

                    if ($coupon->stock <= 0) {
                        error_stop('优惠券已经被领完了');
                    }

                    $coupon->setDec('stock');

                    $userCoupon = new UserCouponModel();
                    $userCoupon->user_id = $user->id;
                    $userCoupon->coupon_id = $coupon->id;
                    $userCoupon->use_time = null;
                    $userCoupon->save();
                    $success[] = $coupon->id;
                } catch (HttpResponseException $e) {
                    $data = $e->getResponse()->getData();
                    $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
                    $errors[] = ['id' => $coupon->id, 'error' => $message];
                } catch (\Exception $e) {
                    $errors[] = ['id' => $coupon->id, 'error' => $e->getMessage()];
                }
            }

            $result['success'] = $success;
            $result['errors'] = $errors;

            return $result;
        });
        return $result;
    }


    /**
     * 发放优惠券
     *
     * @param array|object $user 发放用户
     * @param array|object $coupon 要发放的优惠券
     * @return array|object
     */
    public function send($user, $coupon) {
        if ($coupon->get_status == 'cannot_get') {
            error_stop('您已经领取过了');
        }

        if ($coupon->stock <= 0) {
            error_stop('优惠券已经被领完了');
        }

        $coupon->setDec('stock');

        $userCoupon = new UserCouponModel();
        $userCoupon->user_id = $user->id;
        $userCoupon->coupon_id = $coupon->id;
        $userCoupon->use_time = null;
        $userCoupon->save();

        return $userCoupon;
    }



    /**
     * 退回用户优惠券
     *
     * @param integer $user_coupon_id
     * @return void
     */
    public function backUserCoupon($user_coupon_id) 
    {
        $userCoupon = UserCouponModel::where('id', $user_coupon_id)->find();

        if ($userCoupon) {
            $userCoupon->use_time = null;
            $userCoupon->save();
        }
    }
}