123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
- namespace addons\shopro\traits;
- use think\Db;
- use think\exception\HttpResponseException;
- use app\admin\model\shopro\Coupon;
- use app\admin\model\shopro\user\Coupon as UserCouponModel;
- /**
- * 发放优惠券
- */
- trait CouponSend
- {
- /**
- * 用户自己领取优惠券
- *
- * @param [type] $id
- * @return void
- */
- public function getCoupon($id)
- {
- $user = auth_user();
- $userCoupon = Db::transaction(function () use ($user, $id) {
- $coupon = Coupon::normal() // 正常的可以展示的优惠券
- ->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)
- {
- $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);
- $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;
- }
- public function manualSend($users, $id)
- {
- $coupon = Coupon::canGet() // 在领取时间之内的
- ->lock(true)
- ->where('id', $id)
- ->find();
- if (!$coupon) {
- // 不在发放时间段
- error_stop('优惠券不在发放时间段');
- }
- if ($coupon->stock < count($users)) {
- // 库存不足
- error_stop('优惠券库存不足');
- }
- // 扣除库存
- $coupon->setDec('stock', count($users));
-
- $sends = [];
- foreach ($users as $user) {
- $current = [
- 'user_id' => $user->id,
- 'coupon_id' => $coupon->id,
- 'use_time' => null,
- 'createtime' => time(),
- 'updatetime' => time(),
- ];
- $sends[] = $current;
- }
- UserCouponModel::insertAll($sends);
- }
- /**
- * 发放优惠券
- *
- * @param array|object $user 发放用户
- * @param array|object $coupon 要发放的优惠券
- * @return array|object
- */
- private 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();
- }
- }
- }
|