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(); } } }