diff --git a/app/Amqp/Consumer/couponRebateConsumer.php b/app/Amqp/Consumer/couponRebateConsumer.php index a4f7e27..475c7b9 100644 --- a/app/Amqp/Consumer/couponRebateConsumer.php +++ b/app/Amqp/Consumer/couponRebateConsumer.php @@ -8,16 +8,27 @@ use Hyperf\Amqp\Result; use Hyperf\Amqp\Annotation\Consumer; use Hyperf\Amqp\Message\ConsumerMessage; use PhpAmqpLib\Message\AMQPMessage; +use App\Service\CouponRebateService; +use App\Service\CouponRebateServiceInterface; +use Hyperf\Di\Annotation\Inject; /** * @Consumer(exchange="couponRebate", routingKey="couponRebate", queue="couponRebate", name ="couponRebateConsumer", nums=1) */ class couponRebateConsumer extends ConsumerMessage { + /** + * @Inject + * @var CouponRebateService + */ + protected $CouponRebateService; + public function consumeMessage($data, AMQPMessage $message): string { var_dump($data); var_dump($message->getBody()); + $res = $this->CouponRebateService->couponRebate($data); + var_dump($res); if (false) { return Result::REQUEUE; } diff --git a/app/Controller/CouponRebateController.php b/app/Controller/CouponRebateController.php index c1b2b93..30cc5bb 100644 --- a/app/Controller/CouponRebateController.php +++ b/app/Controller/CouponRebateController.php @@ -25,11 +25,11 @@ use App\Service\CouponRebateService; class CouponRebateController extends BaseController { - /** + /** * @Inject * @var CouponRebateService */ - protected $CouponRebateService; + protected $CouponRebateService; /** * 用户是否领取过领取优惠券 @@ -50,13 +50,21 @@ class CouponRebateController extends BaseController return $this->success($res); } - + /** * 用户领取优惠券 * 2020.08.04 只领一张优惠券 - */ + */ public function userReceiveCoupon(CouponRebateReceiveRequest $validator) { return $this->success($this->CouponRebateService->userReceiveCoupon($this->request->all())); } + + public function couponRebate() + { + $order_id = $this->request->input('order_id', 0); + $res = $this->CouponRebateService->couponRebate($order_id); + return $this->success($res); + } + } diff --git a/app/Service/CouponRebateService.php b/app/Service/CouponRebateService.php index 9db3bc9..48d8596 100644 --- a/app/Service/CouponRebateService.php +++ b/app/Service/CouponRebateService.php @@ -13,7 +13,7 @@ use Exception; class CouponRebateService implements CouponRebateServiceInterface { - /** + /** * @Inject * @var Log */ @@ -30,7 +30,7 @@ class CouponRebateService implements CouponRebateServiceInterface $sendUserId = $params["send_user_id"]; $phone = $params["phone"]; $now = time(); - + // status : 0 领取成功 >0 领取失败 $result = [ 'status' => 1, @@ -49,113 +49,119 @@ class CouponRebateService implements CouponRebateServiceInterface Db::transaction( function() use ($id,$receiveType,$userId,$sendUserId,$phone,$now,&$result,&$errorData) { - try{ - //读写锁,完全控制,性能低 - $cp = Coupon::where('id', $id)->lockForUpdate() + try{ + //读写锁,完全控制,性能低 + $cp = Coupon::where('id', $id)->lockForUpdate() ->select('id','title','status','inventory','inventory_use','start_time','end_time','full_amount','discounts') ->first(); - - $couponReceiveType = CouponUserRecType::where('system_coupon_user_id',$cp->id)->select('one_receive_number'); - if (env('SUB_CHANNEL') == 1) { - $couponReceiveType->where('receive_type',$receiveType); - } - // 查询一次能领取的数量 - $crt = $couponReceiveType->first(); - - $cr = new CouponRec; - $cr->user_id = $userId; - $cr->system_coupon_user_id = $cp->id; - $cr->order_main_id = 0; - $cr->receive_time = $now; - $cr->number = $crt->one_receive_number; - $cr->number_remain = $crt->one_receive_number; - $cr->status = 0; - $cr->update_time = $now; - $cr->receive_type = $receiveType; - $cr->send_user_id = $sendUserId; - $cr->phone = $phone; - - //如果优惠卷库存小于等于已领取的数量 或者 未在活动时间内, 则返回领取失败的优惠券 - if ( - $cp->status != 1 - || - $cp->inventory <= $cp->inventory_use - || - $cp->inventory < ($cp->inventory_use+$cr->number) - || - $cp->start_time > $now - || - $cp->end_time < $now + $couponReceiveType = CouponUserRecType::where('system_coupon_user_id',$cp->id)->select('one_receive_number'); + + if (env('SUB_CHANNEL') == 1) { + $couponReceiveType->where('receive_type',$receiveType); + } + // 查询一次能领取的数量 + $crt = $couponReceiveType->first(); + + $cr = new CouponRec; + $cr->user_id = $userId; + $cr->system_coupon_user_id = $cp->id; + $cr->order_main_id = 0; + $cr->receive_time = $now; + $cr->number = $crt->one_receive_number; + $cr->number_remain = $crt->one_receive_number; + $cr->status = 0; + $cr->update_time = $now; + $cr->receive_type = $receiveType; + $cr->send_user_id = $sendUserId; + $cr->phone = $phone; + + //如果优惠卷库存小于等于已领取的数量 或者 未在活动时间内, 则返回领取失败的优惠券 + if ( + $cp->status != 1 + || + $cp->inventory <= $cp->inventory_use + || + $cp->inventory < ($cp->inventory_use+$cr->number) + || + $cp->start_time > $now + || + $cp->end_time < $now ) - { - $result['status'] = 2; - $result['coupon_text'] = '红包已经领完~'; + { + $result['status'] = 2; + $result['coupon_text'] = '红包已经领完~'; - $errorData['msg'] = '优惠券已经过期或者被禁用或者已领完'; - $this->log->event( - LogLabel::COUPON_LOG, - $errorData - ); - }else{ - // 判断是否领取过 存在记录则领取过 - $isReceive = CouponRec::select('id') - ->where('system_coupon_user_id',$id) - ->where('user_id',$userId) - ->exists(); - - if(!$isReceive){ - - $cp->inventory_use += $cr->number;//记录已领取的数量 - - if ( $cr->save() && $cp->save() ) { - $result['status'] = 0; - // $result['data'] = $cp; - $result['coupon_text'] = $cp['discounts'].'元红包'; - } - }else{ - $errorData['msg'] = '用户已经领取了此优惠券'; + $errorData['msg'] = '优惠券已经过期或者被禁用或者已领完'; $this->log->event( LogLabel::COUPON_LOG, $errorData - ); + ); + }else{ + // 判断是否领取过 存在记录则领取过 + $isReceive = CouponRec::select('id') + ->where('system_coupon_user_id',$id) + ->where('user_id',$userId) + ->exists(); + + if(!$isReceive){ + + $cp->inventory_use += $cr->number;//记录已领取的数量 + + if ( $cr->save() && $cp->save() ) { + $result['status'] = 0; + // $result['data'] = $cp; + $result['coupon_text'] = $cp['discounts'].'元红包'; + } + }else{ + $errorData['msg'] = '用户已经领取了此优惠券'; + $this->log->event( + LogLabel::COUPON_LOG, + $errorData + ); + } } + } catch (Exception $e){ + $errorData['msg'] = $e->getMessage(); + $this->log->event( + LogLabel::COUPON_LOG, + $errorData + ); } - } catch (Exception $e){ - $errorData['msg'] = $e->getMessage(); - $this->log->event( - LogLabel::COUPON_LOG, - $errorData - ); - } }); return $result; } + /* + * 判断用户是否已领取过优惠券 + * */ public function isCouponRebate($user_id) { $res = Db::table('ims_system_coupon_user as u') ->leftjoin('ims_system_coupon_user_receive as r','u.id','=','r.system_coupon_user_id') ->where([ - ['r.user_id','=',$user_id], - ['r.receive_type','=',4], - ['u.active_type','=',2], + ['r.user_id' ,'=', $user_id], + ['r.receive_type','=', 4], + ['u.active_type' ,'=', 2], ]) ->select('r.id') ->first(); return $res; } + /* + *获取活动信息 + */ public function getActiveInfo() { $time = time(); $res = Db::table('ims_system_coupon_user') ->where([ - ['status','=',1], - ['active_type','=',2], - ['start_time','<=',$time], - ['end_time','>',$time], + ['status' ,'=', 1], + ['active_type' ,'=', 2], + ['start_time' ,'<=', $time], + ['end_time' ,'>', $time], ]) ->whereRaw('inventory > inventory_use') ->orderBy('addtime','desc') @@ -163,4 +169,90 @@ class CouponRebateService implements CouponRebateServiceInterface return $res; } + /* + * 支付成功 返券 + */ + public function couponRebate($order_id) + { + + /* 判断优惠券类型是否为转发活动优惠券 */ + $coupon = Db::table('ims_system_coupon_user_receive as r') + ->leftjoin('ims_system_coupon_user_use as u', 'u.user_receive_id', '=', 'r.id') + ->where([ + ['u.order_main_id', '=', $order_id], + ['r.send_user_id', '>', 0], + ['r.rebate_type', '=', 1], + ['r.receive_type', '=', 4], + ['u.status', '=', 1], + ]) + ->select('r.id', 'r.send_user_id', 'u.system_coupon_id') + ->first(); + /* 如果使用的优惠券为转发活动优惠券 则给赠送者返一张优惠券*/ + if (isset($coupon->send_user_id) && ($coupon->send_user_id) > 0) { + //判断该优惠券是否有库存 +// $inventory = Db::table('system_coupon_user_receive as r'); +// if($inventory['inventory'] <= 0){ +// return '库存不足'; +// } + //判断用户是否已有该类型优惠券 + $exist_coupon = Db::table('ims_system_coupon_user_receive') + ->where([ + ['system_coupon_user_id', '=', $coupon->system_coupon_id], + ['user_id', '=', $coupon->send_user_id], + ['receive_type', '=', 5], + ['status', '=', 0], + ]) + ->select('id') + ->first(); + //return $exist_coupon; + //开启事务 + try { + /* + * 如果已有该优惠券 则领取数量 和 可用数量 自增1 + * 否则新增一条返券记录 + */ + $nowTime = time(); + $res = Db::table('ims_system_coupon_user_receive')->updateOrInsert( + [ + 'system_coupon_user_id' => $coupon->system_coupon_id, + 'user_id' => $coupon->send_user_id, + 'receive_type' => 5, + 'status' => 0, + ], + [ + 'order_main_id' => $order_id, + 'receive_time' => $nowTime, + 'number' => 1, + 'number_remain' => 1, + 'update_time' => $nowTime, + 'created_at' => $nowTime, + 'updated_at' => $nowTime, + ] + ); +// if ($res) { +// //首次返券更新rebate_type字段 防止重复返券 +// Db::table('system_coupon_user_receive')->where('id', $coupon->id)->update(['rebate_type' => 2]); +// //更新库存操作 +// Db::table('system_coupon_user') +// ->where('id', $coupon->id) +// ->increment('inventory_use'); +// } else { +// Db::rollBack(); +// return '事务失败'; +// } + // 提交 + Db::commit(); + } catch (\Exception $e) { + // 回滚 + Db::rollBack(); + return '返券失败'; + } + } else { +// $str1 = 'order_main_id:'.$this->order_id . ',未查询到用户领取优惠券信息['.$coupon.']'; +// $this->couponErrorLog($str1); + } + + + return $exist_coupon->id; + } } \ No newline at end of file diff --git a/app/Service/CouponRebateServiceInterface.php b/app/Service/CouponRebateServiceInterface.php index cc8c0ef..f7bc3a0 100644 --- a/app/Service/CouponRebateServiceInterface.php +++ b/app/Service/CouponRebateServiceInterface.php @@ -13,4 +13,6 @@ interface CouponRebateServiceInterface public function getActiveInfo(); + public function couponRebate($order_id); + } \ No newline at end of file diff --git a/config/routes.php b/config/routes.php index 0db0115..0f3633c 100644 --- a/config/routes.php +++ b/config/routes.php @@ -29,4 +29,5 @@ Router::addGroup('/v1/',function (){ Router::post('CouponRebate/isCouponRebate', 'App\Controller\CouponRebateController@isCouponRebate'); Router::post('CouponRebate/userReceiveCoupon', 'App\Controller\CouponRebateController@userReceiveCoupon'); Router::post('CouponRebate/getActiveInfo', 'App\Controller\CouponRebateController@getActiveInfo'); + Router::post('CouponRebate/couponRebate', 'App\Controller\CouponRebateController@couponRebate'); }); \ No newline at end of file