diff --git a/app/Controller/CouponController.php b/app/Controller/CouponController.php index f470362..dd6d991 100644 --- a/app/Controller/CouponController.php +++ b/app/Controller/CouponController.php @@ -15,6 +15,8 @@ use App\Model\CouponUserRecType; use App\Model\Coupon; use App\Model\CouponRec; use Hyperf\DbConnection\Db; +use Hyperf\Redis\Redis; +use Hyperf\Utils\ApplicationContext; class CouponController extends BaseController { @@ -62,56 +64,58 @@ class CouponController extends BaseController } - /** - * 用户领取优惠卷 - */ public function userReceiveCoupon() { - - $userId = $this->request->input("user_id"); + $userId = $this->request->input("user_id"); $receiveType = $this->request->input("receive_type"); - $ids = $this->request->input("ids"); - $test = $this->request->input("test",0); - + $ids = $this->request->input("ids"); + $test = $this->request->input("test", 0); - $ids = is_array($ids)?implode(',',$ids):$ids; - - $cps = Coupon::whereIn('id', $ids)->get(); - $now = time(); + $ids = explode(',', $ids); + $cps = Coupon::whereIn('id', $ids)->get(); + $now = time(); $success = []; - $fail = []; + $fail = []; foreach ($cps as $key => $cp) { - - - $crt = CouponUserRecType::where('system_coupon_user_id',$cp->id)->first(); - - //TODO 会有超发情况 - $cr = new CouponRec; - $cr->user_id = $userId; + $crt = CouponUserRecType::where( + [ + 'system_coupon_user_id' => $cp->id, + 'receive_type' => $receiveType + ] + )->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->nnumber_remain = $crt->one_receive_number; - $cr->status = 0; - $cr->update_time = $now; - $cr->receive_type = $receiveType; - - if($test){ + $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; + if ($test && ($cp->id % 2)) { $fail[] = $cp; - }else{ - if($cr->save()){ - $success[] = $cp; - }else{ + } else { + //TODO 会有超发情况 + //如果优惠卷库存小于等于已领取的数量, 则返回领取失败的优惠券 + if ($cp->inventory<=$cp->inventory_use||$cp->inventory<=($cp->inventory_use+$cr->number)){ $fail[] = $cp; + }else{ + $cp->inventory_use += $cr->number;//记录已领取的数量 + if ($cr->save()&&$cp->save()) { + $success[] = $cp; + } else { + $fail[] = $cp; + } } } - + } return $this->success([ - 'success'=>$success, - 'fail'=>$fail, + 'success' => $success, + 'fail' => $fail, ]); } @@ -167,10 +171,14 @@ class CouponController extends BaseController $type = $this->request->input('type',1); # 店铺类型id $storetypeId = $this->request->input('storetype_id',0); + $storetypeIds = explode(',', str_replace(',', ',', $storetypeId)); // 获取用户优惠券 $currentTime = time(); + $container = ApplicationContext::getContainer(); + $redis = $container->get(Redis::class); + $couponIds = $redis->sMembers('coupon_'.date('Ymd').'_used_'.$userId); $data = Db::table('ims_system_coupon_user_receive as receive') ->select([ @@ -187,83 +195,25 @@ class CouponController extends BaseController ]) ->join('ims_system_coupon_user as coupon', 'coupon.id', '=', 'receive.system_coupon_user_id') ->where(['receive.user_id' => $userId]) - ->where(['receive.user_id' => $userId]) - ->whereIn('coupon.type', [1,$type]) ->whereIn('receive.status', [0,1]) - ->where('receive.number_remain', '>', 0) + ->where('receive.number_remain', '>', 0); + + if (is_array($couponIds)&&!empty($couponIds)) { + $data->whereNotIn('coupon.id', $couponIds); + } + + $data = $data->whereIn('coupon.type', [1,$type]) ->where('coupon.full_amount', '<=', $orderAmount) ->where('coupon.usable_start_time', '<=', $currentTime) ->where('coupon.usable_end_time', '>=', $currentTime) ->where('coupon.usable_number', '<=', Db::raw('receive.number_remain')) ->where('coupon.market_id', 'in', [0,$marketId]) - ->where(function ($query) use ($storetypeId) { - $query->whereOr( - [ - [ - ['coupon.type', 'in', [1,2]], - ['coupon.storetype_id', '=', 0] - ], - [ - ['coupon.type', 'in', [1,3]], - ['coupon.storetype_id', '=', $storetypeId] - ] - ] - ); - }) + ->whereIn('coupon.storetype_id', $storetypeIds) ->orderByRaw('coupon.discounts DESC, coupon.full_amount DESC') ->get(); - //var_dump($d); return $this->success($data); - // $coupons = CouponRec::alias('receive') - // ->field([ - // 'receive.id receive_id', - // 'receive.user_id', - // 'receive.number_remain', - // 'coupon.id', - // 'coupon.title', - // 'coupon.full_amount', - // 'coupon.discounts', - // 'coupon.usable_start_time', - // 'coupon.usable_end_time', - // 'coupon.discount_type' - // ]) - // ->withAttr('usable_start_time', function ($value){ - // return $value ? date('Y-m-d H:i:s', $value) : ''; - // }) - // ->withAttr('usable_end_time', function ($value){ - // return $value ? date('Y-m-d H:i:s', $value) : ''; - // }) - // ->join(Coupon::getTable() . ' coupon ', 'coupon.id=receive.system_coupon_user_id') - // ->where(['receive.user_id' => $userId]) - // ->whereIn('coupon.type', [1,$type]) - // ->whereIn('receive.status', [0,1]) - // ->where('receive.number_remain', '>', 0) - // ->where('coupon.full_amount', '<=', $orderAmount) - // ->where('coupon.usable_start_time', '<=', $currentTime) - // ->where('coupon.usable_end_time', '>=', $currentTime) - // ->where('coupon.usable_number', '<=', Db::raw('receive.number_remain')) - // ->where('coupon.market_id', 'in', [0,$marketId]) - // ->where(function ($query) use ($storetypeId) { - // $query->whereOr( - // [ - // [ - // ['coupon.type', 'in', [1,2]], - // ['coupon.storetype_id', '=', 0] - // ], - // [ - // ['coupon.type', 'in', [1,3]], - // ['coupon.storetype_id', '=', $storetypeId] - // ] - // ] - // ); - // }) - // ->order('coupon.discounts DESC, coupon.full_amount DESC') - // ->select() - // ->toArray(); - - // var_dump($coupons); } } diff --git a/app/Model/Model.php b/app/Model/Model.php index 82ebdb5..f606652 100644 --- a/app/Model/Model.php +++ b/app/Model/Model.php @@ -18,4 +18,5 @@ use Hyperf\ModelCache\CacheableInterface; abstract class Model extends BaseModel implements CacheableInterface { use Cacheable; + protected $dateFormat = 'U'; }