diff --git a/app/Controller/CouponRebateController.php b/app/Controller/CouponRebateController.php index 84ef098..dd9ed65 100644 --- a/app/Controller/CouponRebateController.php +++ b/app/Controller/CouponRebateController.php @@ -73,10 +73,20 @@ class CouponRebateController extends BaseController public function tieCouponActive(CouponRebateTieRequest $validator) { $couponForward = $this->request->input('coupon_forward_ids',[]); - $couponForward = is_array($couponForward) ? $couponForward : explode(',',$couponForward) ; + $couponForward = is_array($couponForward) ? implode(',',$couponForward) : $couponForward ; $couponRepay = $this->request->input('coupon_repay_id',0); $couponActivity = $this->request->input('coupon_activity',0); $res = $this->CouponRebateService->tieCouponActive($couponActivity,$couponForward,$couponRepay); return $this->success($res); } + + /** + * 清优惠券领取记录(SSDB) + */ + public function clearSsdbCouponReceiveByName(){ + $activity = $this->request->input('activity_type',0); + $userId = $this->request->input('user_id',0); + $get = $this->request->input('get',0); + return $this->success($this->CouponRebateService->clearSsdbCouponReceiveByName($activity,$userId, $get)); + } } diff --git a/app/Model/OrderMain.php b/app/Model/OrderMain.php new file mode 100644 index 0000000..7c7eb3d --- /dev/null +++ b/app/Model/OrderMain.php @@ -0,0 +1,10 @@ +0领取失败 @@ -54,119 +55,85 @@ class CouponRebateService implements CouponRebateServiceInterface ]; $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); + $activity = $ssdb->exec('hget', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY ,'activity'); $receiveSsdb = []; - // 判断是否已全部领取 - $couponActivity = $ssdb->exec('hget', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY,0); - $userReceiveCouponIds = $ssdb->exec('hgetall', SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $couponActivity . $userId); - if($userReceiveCouponIds !== false){ + // 判断是否已全部领取过 + $userReceive = $ssdb->exec('hgetall', SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $activity . $userId); + if($userReceive === false){ + $ids = $idsData; + }else{ + $userReceiveCouponIds = empty($userReceive) ? [] : $userReceive ; $ids = array_diff($idsData, $userReceiveCouponIds); $receiveSsdb = $userReceiveCouponIds; - }else{ - $ids = $idsData; } if(count($ids) > 0){ try{ - Db::transaction( function() use ($ids,$receiveType,$userId,$sendUserId,$phone,$now,&$result,&$errorData,&$receiveSsdb) { - + Db::transaction( function() use ($ids,$receiveType,$userId,$sendUserId,$phone,&$result,&$errorData,&$receiveSsdb) { + + $now = time(); $success = []; - $fail = []; - //读写锁,完全控制,性能低 + //获取优惠券信息 (读写锁,完全控制,性能低) $coupons = Coupon::whereIn('id', $ids)->lockForUpdate() - ->select('id','title','status','inventory','inventory_use','start_time','end_time','full_amount','discounts','active_type') + ->where('active_type',2) + ->where('status',1) + ->where('start_time', '<=', $now) + ->where('end_time', '>=', $now) + ->whereRaw('inventory > inventory_use') + ->select('id','title','inventory','inventory_use','full_amount','discounts','active_type') ->get(); foreach($coupons as $coupon){ $errorData['coupon_id'] = $coupon->id; - - //如果优惠卷库存小于等于已领取的数量 或者 未在活动时间内可领取, 否则返回领取失败的优惠券 - if ( - $coupon->status == 1 - && - $coupon->inventory > $coupon->inventory_use - && - $coupon->start_time <= $now - && - $coupon->end_time >= $now - && - $coupon->active_type == 2 - ) - { - - // 查询一次能领取的数量 - $couponReceiveType = CouponUserRecType::where('system_coupon_user_id',$coupon->id)->select('one_receive_number'); - if (env('SUB_CHANNEL') == 1) { - $couponReceiveType->where('receive_type',$receiveType); - } - $couponReceiveType = $couponReceiveType->first(); - - // 优惠券可领取数量 >= 本次领取数量 - if($coupon->inventory - $coupon->inventory_use >= $couponReceiveType->one_receive_number){ - - // 判断是否领取过 存在记录则领取过 - $isReceive = CouponRec::select('id') - ->where('system_coupon_user_id',$coupon->id) - ->where('user_id',$userId) - ->exists(); - - if(!$isReceive){ - //记录已领取的数量 - $coupon->inventory_use += $couponReceiveType->number; - - $couponReceive = new CouponRec; - $couponReceive->user_id = $userId; - $couponReceive->system_coupon_user_id = $coupon->id; - $couponReceive->order_main_id = 0; - $couponReceive->receive_time = $now; - $couponReceive->number = $couponReceiveType->one_receive_number; - $couponReceive->number_remain = $couponReceiveType->one_receive_number; - $couponReceive->status = 0; - $couponReceive->update_time = $now; - $couponReceive->receive_type = $receiveType; - $couponReceive->send_user_id = $sendUserId; - $couponReceive->phone = $phone; - - if ( $couponReceive->save() && $coupon->save() ) { - $success[] = $coupon; - $receiveSsdb[] = $coupon->id; - } + + // 查询一次能领取的数量 + $couponReceiveType = CouponUserRecType::where('system_coupon_user_id',$coupon->id)->select('one_receive_number'); + if (env('SUB_CHANNEL') == 1) { + $couponReceiveType->where('receive_type',$receiveType); + } + $couponReceiveType = $couponReceiveType->first(); + + // 优惠券可领取数量 >= 本次领取数量 + if($coupon->inventory - $coupon->inventory_use >= $couponReceiveType->one_receive_number){ + + // 判断是否领取过 存在记录则领取过 + $isReceive = CouponRec::select('id') + ->where('system_coupon_user_id',$coupon->id) + ->where('user_id',$userId) + ->exists(); + + if(!$isReceive){ + //记录已领取的数量 + $coupon->inventory_use += $couponReceiveType->number; + + $couponReceive = new CouponRec; + $couponReceive->user_id = $userId; + $couponReceive->system_coupon_user_id = $coupon->id; + $couponReceive->order_main_id = 0; + $couponReceive->receive_time = $now; + $couponReceive->number = $couponReceiveType->one_receive_number; + $couponReceive->number_remain = $couponReceiveType->one_receive_number; + $couponReceive->status = 0; + $couponReceive->update_time = $now; + $couponReceive->receive_type = $receiveType; + $couponReceive->send_user_id = $sendUserId; + $couponReceive->phone = $phone; + + if ( $couponReceive->save() && $coupon->save() ) { + $success[] = $coupon; + $receiveSsdb[] = $coupon->id; }else{ - $fail[] = $coupon; - $receiveSsdb[] = $coupon->id; - $result['status'] = 3; - $result['coupon_text'] = '您已领取!赶快去下单吧~'; - - $errorData['msg'] = '用户已经领取了优惠券'; + $errorData['msg'] = '添加优惠券到用户领取表或者记录已领取数量失败'; $this->log->event( LogLabel::COUPON_LOG, $errorData ); } - }else{ - $fail[] = $coupon; - $errorData['remain_receive_number'] = $coupon->inventory - $coupon->inventory_use; - $errorData['one_receive_number'] = $couponReceiveType->one_receive_number; - $errorData['msg'] = '优惠券剩余数量不足'; - $this->log->event( - LogLabel::COUPON_LOG, - $errorData - ); } - }else{ - $fail[] = $coupon; - $errorData['msg'] = '优惠券已经过期或者被禁用或者已领完'; - $this->log->event( - LogLabel::COUPON_LOG, - $errorData - ); } } - $result['data'] = [ - 'success' => $success, - 'fail' => $fail - ]; if(count($success) > 0){ $result['status'] = 0; $result['coupon_text'] = '恭喜您领取成功!'; @@ -187,8 +154,8 @@ class CouponRebateService implements CouponRebateServiceInterface $saveSsdb[] = $vssdb; } // 记录到ssdb - if(false === $ssdb->exec('multi_hset',SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $couponActivity . $userId, $saveSsdb)){ - $errorData['msg'] = '记录领取优惠券到ssdb失败'; + if(false === $ssdb->exec('multi_hset',SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $activity . $userId, $saveSsdb)){ + $errorData['msg'] = '记录领取优惠券到ssdb失败'; $this->log->event( LogLabel::COUPON_LOG, $errorData @@ -257,64 +224,19 @@ class CouponRebateService implements CouponRebateServiceInterface */ public function tieCouponActive($couponActivity, $couponForward, $couponRepay) { - $result = [ - 'forward' => true, - 'repay' => true, - 'activity' => true, - ]; - + $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); - // $rrss1 = $ssdb->exec('hgetall', SsdbKeysPrefix::COUPON_REBATE_FORWARD . $couponActivity); - // $rrss2 = $ssdb->exec('hget', SsdbKeysPrefix::COUPON_REBATE_REPAY . $couponActivity,0); - // $rrss3 = $ssdb->exec('hget', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY,0); - // return [$rrss1,$rrss2,$rrss3]; - - // 记录活动本次 activity_type 活动标志值 - if (false === $ssdb->exec('hset', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY, [0,$couponActivity])) { - - $this->log->event( - LogLabel::COUPON_LOG, - [ - 'coupon_activity' => $couponActivity, - 'msg' => '记录活动标志值(activity_type)到ssdb失败' - ] - ); - $result['activity'] = false; - }; - // 记录领取类型优惠券 - $forwardData = []; - foreach ($couponForward as $kForward => $vForward) { - $forwardData[] = $kForward; - $forwardData[] = $vForward; - } - - if (false === $ssdb->exec('multi_hset', SsdbKeysPrefix::COUPON_REBATE_FORWARD . $couponActivity, $forwardData)) { - - $this->log->event( - LogLabel::COUPON_LOG, - [ - 'coupon_activity' => $couponActivity, - 'coupon_forward' => $forwardData, - 'msg' => '绑定-领取-优惠券到ssdb失败' - ] - ); - $result['forward'] = false; - }; - - // 记录返还类型优惠券 - if (false === $ssdb->exec('hset', SsdbKeysPrefix::COUPON_REBATE_REPAY . $couponActivity, [0,$couponRepay])) { + $data = [ + 'activity', $couponActivity, + 'forward' , $couponForward, + 'repay' , $couponRepay + ]; - $this->log->event( - LogLabel::COUPON_LOG, - [ - 'coupon_activity' => $couponActivity, - 'coupon_Repay' => $couponRepay, - 'msg' => '绑定-返还-优惠券到ssdb失败' - ] - ); - $result['repay'] = false; - }; + $result = [ + 'result' => ($ssdb->exec('multi_hset', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY, $data) === false) ? false : true , + 'data' => $ssdb->exec('hgetall', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY) + ]; return $result; } @@ -445,4 +367,22 @@ class CouponRebateService implements CouponRebateServiceInterface ); return '返券成功'; } + + /** + * 清优惠券领取记录(SSDB) + */ + public function clearSsdbCouponReceiveByName($activity, $userId, $get = 0){ + + $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); + + if($get > 0){ + return [ + $ssdb->exec('hgetAll', SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $activity . $userId ), + $ssdb->exec('hgetAll', SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $userId ), + SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $activity . $userId + ]; + } + + return ( $ssdb->exec('hclear', SsdbKeysPrefix::COUPON_REBATE_RECEIVE . $activity . $userId ) === false) ? false : true; + } } \ No newline at end of file diff --git a/app/Service/CouponRebateServiceInterface.php b/app/Service/CouponRebateServiceInterface.php index 0e97dca..6b6edf9 100644 --- a/app/Service/CouponRebateServiceInterface.php +++ b/app/Service/CouponRebateServiceInterface.php @@ -15,6 +15,8 @@ interface CouponRebateServiceInterface public function tieCouponActive($couponActivity,$couponForward,$couponRepay); - public function couponRebate($order_id); + public function couponRebate($order_id); + + public function clearSsdbCouponReceiveByName($activity, $userId, $get = 0); } \ No newline at end of file diff --git a/app/Service/CouponService.php b/app/Service/CouponService.php index c0ff451..915dc6e 100644 --- a/app/Service/CouponService.php +++ b/app/Service/CouponService.php @@ -29,14 +29,15 @@ class CouponService implements CouponServiceInterface { /* 优惠券活动标志 2 */ $ssdb = ApplicationContext::getContainer()->get(SSDBTask::class); - $couponActivity = $ssdb->exec('hget', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY,0); + $couponActivity = $ssdb->exec('hgetall', SsdbKeysPrefix::COUPON_REBATE_ACTIVITY); + $activityType = $couponActivity === false ? 0 : $couponActivity['activity']; $result = [ 'active_type' => 1, 'not_receive' => [], 'jump_data' => [ - 'src' => "/zh_cjdianc/pages/couponrebate/index?activity_type=".$couponActivity, - 'src2' => "/zh_cjdianc/pages/couponrebate/index?activity_type=".$couponActivity, + 'src' => "/zh_cjdianc/pages/couponrebate/index?activity_type=".$activityType, + 'src2' => "/zh_cjdianc/pages/couponrebate/index?activity_type=".$activityType, 'coupons' => [] ] ]; @@ -67,10 +68,8 @@ class CouponService implements CouponServiceInterface // 当前用户可领的优惠券ID $couponIds = array_diff($c_ids, $cr_ids); - // 获取领取型优惠券 - $couponRebateIds = $ssdb->exec('hgetall',SsdbKeysPrefix::COUPON_REBATE_FORWARD.$couponActivity); - - $couponIds = ($couponRebateIds === false || empty($couponRebateIds)) ? $couponIds : array_merge($couponIds,$couponRebateIds) ; + // 获取领取型优惠券 + $couponIds = $couponActivity['forward'] === false ? $couponIds : array_merge($couponIds,explode(',',$couponActivity['forward'])); $whereC = [ ['u.end_time','>',$nowTime], diff --git a/app/Service/UserService.php b/app/Service/UserService.php new file mode 100644 index 0000000..c6a63b2 --- /dev/null +++ b/app/Service/UserService.php @@ -0,0 +1,31 @@ +where(['user_id' => $user_id]) + ->where(function ($query){ + $query->where('state', 'in', [4,5,10]) + ->orWhere('dm_state', 'in', [2,3]); + }) + ->exists(); + + return !$exist; + } +} \ No newline at end of file diff --git a/app/Service/UserServiceInterface.php b/app/Service/UserServiceInterface.php new file mode 100644 index 0000000..c5bf647 --- /dev/null +++ b/app/Service/UserServiceInterface.php @@ -0,0 +1,15 @@ + \App\Service\AdService::class, \App\Commons\Log::class => \App\Commons\Log::class, \App\Service\CouponRebateServiceInterface::class => \App\Service\CouponRebateService::class, + \App\Service\UserServiceInterface::class => \App\Service\UserService::class, ]; diff --git a/config/autoload/middlewares.php b/config/autoload/middlewares.php index 5eb19a5..2befbcd 100644 --- a/config/autoload/middlewares.php +++ b/config/autoload/middlewares.php @@ -11,8 +11,8 @@ declare(strict_types=1); */ return [ 'http' => [ + \App\Middleware\CorsMiddleware::class, \App\Middleware\Auth\ApiMiddleware::class, \Hyperf\Validation\Middleware\ValidationMiddleware::class, - \App\Middleware\CorsMiddleware::class, ], ]; diff --git a/config/routes.php b/config/routes.php index f2a579b..174546f 100644 --- a/config/routes.php +++ b/config/routes.php @@ -31,5 +31,7 @@ Router::addGroup('/v1/',function (){ Router::post('CouponRebate/getActiveInfo', 'App\Controller\CouponRebateController@getActiveInfo'); Router::post('CouponRebate/tieCouponActive', 'App\Controller\CouponRebateController@tieCouponActive'); - Router::post('CouponRebate/couponRebate', 'App\Controller\CouponRebateController@couponRebate'); + Router::post('CouponRebate/couponRebate', 'App\Controller\CouponRebateController@couponRebate'); + Router::post('CouponRebate/clearSsdbReceive', 'App\Controller\CouponRebateController@clearSsdbCouponReceiveByName'); + }); \ No newline at end of file