diff --git a/app/Admin/Controllers/Activity/IndexController.php b/app/Admin/Controllers/Activity/IndexController.php index 44d2423..b7b7e02 100644 --- a/app/Admin/Controllers/Activity/IndexController.php +++ b/app/Admin/Controllers/Activity/IndexController.php @@ -1,247 +1,267 @@ -title; - } - - /** - * Index interface. - * @param Content $content - * @return Content - */ - public function index(Content $content) - { - return $content - ->title($this->title()) - ->description($this->description['index'] ?? trans('admin.list')) - ->body($this->grid()); - } - - /** - * Edit interface. - * @param mixed $id - * @param Content $content - * @return Content - */ - public function edit($id, Content $content) - { - return $content - ->title($this->title()) - ->description($this->description['edit'] ?? trans('admin.edit')) - ->body($this->form($id)->edit($id)); - } - - /** - * Create interface. - * @param Content $content - * @return Content - */ - public function create(Content $content) - { - return $content - ->title($this->title()) - ->description($this->description['create'] ?? trans('admin.create')) - ->body($this->form()); - } - - protected function grid() - { - $grid = new Grid(new Activity); - $grid->model()->with(['grants.user', 'verifications.user']); - $grid->actions(function ($actions) { - $actions->disableView(); - }); - - $grid->filter(function ($filter) { - $filter->column(1 / 2, function ($filter) { - $filter->equal('status', '状态')->select(Activity::STATUS); - $filter->equal('type', '类型')->select(Activity::TYPES); - - $users = User::whereHas('identity', function ($query) { - $query->where('identity_id', 1); - })->get()->pluck('nickname', 'id'); - - }); - - $filter->column(1 / 2, function ($filter) { - $filter->between('start_at', '开始时间')->datetime(); - $filter->between('end_at', '结束时间')->datetime(); - }); - - }); - - $grid->column('id', '#ID#'); - $grid->column('title', '活动名称'); - $grid->column('code', '活动编号'); - $grid->column('rule.code', '卡券规则'); - $grid->column('类型')->display(function () { - return $this->type_text; - }); - - $grid->column('days', '延期(天)'); - $grid->column('rule.full', '满足金额'); - $grid->column('rule.take', '扣除金额'); - $grid->column('发券') - ->display(function () { - return $this->grants->pluck('user_nickname'); - }) - ->label() - ->hide(); - - $grid->column('核券') - ->display(function () { - return $this->verifications->pluck('user_nickname'); - }) - ->label() - ->hide(); - - $grid->column('开始时间')->display(function () { - return $this->type == Activity::TYPE_SCOPE ? $this->start_at->format('Y-m-d') : '---'; - }); - $grid->column('结束时间')->display(function () { - return $this->type == Activity::TYPE_SCOPE ? $this->end_at->format('Y-m-d') : '---'; - }); - - $grid->status('状态')->switch([ - 'on' => ['value' => 1, 'text' => '正常', 'color' => 'primary'], - 'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'], - ]); - - $grid->column('created_at', '创建时间'); - - return $grid; - } - - /** - * Make a form builder. - * @return Form - */ - protected function form($id = '') - { - $form = new Form(new Activity); - - $form->text('title', '活动名称')->required(); - $form->textarea('description', '活动说明')->required(); - - $form->select('activity_rule_id', '所属规则') - ->options(function ($option, $info) { - return ActivityRule::where('status', 1)->pluck('title', 'id'); - }) - ->required(); - - $form->radio('type', '类型') - ->options(Activity::TYPES) - ->when(Activity::TYPE_EXTEND, function (Form $form) { - $form->number('days', '延期天数')->default(60)->help('到期日期=发券日期+延期天数'); - }) - ->when(Activity::TYPE_SCOPE, function (Form $form) { - $form->dateRange('start_at', 'end_at', '有效时间'); - }) - ->required(); - - $form->switch('status', '状态')->default(1); - $form->switch('need_check', '多次校验') - ->default(1) - ->help('同一订单,多次核销时校验,订单每满100元可核销一笔。'); - - $grantdef = $verificationsdef = ''; - if ($id) { - $grantdef = Activity::find($id)->grants()->pluck('user_id')->toArray(); - $verificationsdef = Activity::find($id)->verifications()->pluck('user_id')->toArray(); - } - - $users = User::with('info')->whereHas('identity', function ($q) { - $q->where('identity_id', 1); - })->orderBy('id', 'desc')->get()->pluck('nickname', 'id'); - - $form->listbox('grants.user_id', '可发券渠道') - ->options($users) - ->default($grantdef) - ->required(); - - $form->listbox('verifications.user_id', '可核券渠道') - ->options($users) - ->default($verificationsdef) - ->required(); - - $form->saving(function (Form $form) { - $request = request(); - if ($request->type == Activity::TYPE_EXTEND && empty($request->days)) { - $error = new MessageBag([ - 'title' => '错误', - 'message' => '必须添加延期天数', - ]); - - return back()->withInput()->with(compact('error')); - } - - if ($request->type == Activity::TYPE_SCOPE && (empty($request->start_at) || empty($request->end_at))) { - $error = new MessageBag([ - 'title' => '错误', - 'message' => '必须添加延期天数', - ]); - - return back()->withInput()->with(compact('error')); - } - if (request()->start) { - $form->start_at = $form->start_at . ' 00:00:01'; - } - - if (request()->end_at) { - $form->end_at = $form->end_at . ' 23:59:59'; - } - }); - - $form->saved(function (Form $form) { - $users = []; - foreach ($form->grants['user_id'] as $key => $user_id) { - if ($user_id) { - $form->model()->grants()->updateOrCreate([ - 'user_id' => $user_id, - ]); - $users[] = $user_id; - } - } - $form->model()->grants()->whereNotIn('user_id', $users)->delete(); - $users = []; - foreach ($form->verifications['user_id'] as $key => $user_id) { - if ($user_id) { - $form->model()->verifications()->updateOrCreate([ - 'user_id' => $user_id, - ]); - $users[] = $user_id; - } - } - $form->model()->verifications()->whereNotIn('user_id', $users)->delete(); - }); - - return $form; - } - -} +title; + } + + /** + * Index interface. + * @param Content $content + * @return Content + */ + public function index(Content $content) + { + return $content + ->title($this->title()) + ->description($this->description['index'] ?? trans('admin.list')) + ->body($this->grid()); + } + + /** + * Edit interface. + * @param mixed $id + * @param Content $content + * @return Content + */ + public function edit($id, Content $content) + { + return $content + ->title($this->title()) + ->description($this->description['edit'] ?? trans('admin.edit')) + ->body($this->form($id)->edit($id)); + } + + /** + * Create interface. + * @param Content $content + * @return Content + */ + public function create(Content $content) + { + return $content + ->title($this->title()) + ->description($this->description['create'] ?? trans('admin.create')) + ->body($this->form()); + } + + protected function grid() + { + $grid = new Grid(new Activity); + $grid->model()->withCount('coupons'); + + $grid->actions(function ($actions) { + $actions->disableView(); + }); + + $grid->filter(function ($filter) { + $filter->column(1 / 2, function ($filter) { + $filter->equal('status', '状态')->select(Activity::STATUS); + $filter->equal('type', '类型')->select(Activity::TYPES); + + $users = User::whereHas('identity', function ($query) { + $query->where('identity_id', 1); + })->get()->pluck('nickname', 'id'); + + }); + + $filter->column(1 / 2, function ($filter) { + $filter->between('start_at', '开始时间')->datetime(); + $filter->between('end_at', '结束时间')->datetime(); + }); + + }); + + $grid->column('id', '#ID#'); + $grid->column('title', '活动名称'); + $grid->column('code', '活动编号'); + $grid->column('total', '可发券总数'); + $grid->column('coupons_count', '可发券总数'); + $grid->column('rule.code', '卡券规则'); + $grid->column('类型')->display(function () { + return $this->type_text; + }); + + $grid->column('days', '延期(天)'); + $grid->column('rule.full', '满足金额'); + $grid->column('rule.take', '扣除金额'); + $grid->column('发券') + ->display(function () { + return $this->grants->pluck('user_nickname'); + }) + ->label() + ->hide(); + + $grid->column('核券') + ->display(function () { + return $this->verifications->pluck('user_nickname'); + }) + ->label() + ->hide(); + + $grid->column('开始时间')->display(function () { + return $this->type == Activity::TYPE_SCOPE ? $this->start_at->format('Y-m-d') : '---'; + }); + $grid->column('结束时间')->display(function () { + return $this->type == Activity::TYPE_SCOPE ? $this->end_at->format('Y-m-d') : '---'; + }); + + $grid->status('状态')->switch([ + 'on' => ['value' => 1, 'text' => '正常', 'color' => 'primary'], + 'off' => ['value' => 0, 'text' => '关闭', 'color' => 'danger'], + ]); + + $grid->column('created_at', '创建时间'); + + return $grid; + } + + /** + * Make a form builder. + * @return Form + */ + protected function form($id = '') + { + $form = new Form(new Activity); + + $form->text('title', '活动名称')->required(); + $form->textarea('description', '活动说明')->required(); + + $form->select('activity_rule_id', '所属规则') + ->options(function ($option, $info) { + return ActivityRule::where('status', 1)->pluck('title', 'id'); + }) + ->required(); + + $form->number('total', '总数') + ->help('可发券总数') + ->default(10000) + ->required(); + + $form->radio('type', '类型') + ->options(Activity::TYPES) + ->when(Activity::TYPE_EXTEND, function (Form $form) { + $form->number('days', '延期天数')->default(60)->help('到期日期=发券日期+延期天数'); + }) + ->when(Activity::TYPE_SCOPE, function (Form $form) { + $form->dateRange('start_at', 'end_at', '有效时间'); + }) + ->required(); + + $form->switch('status', '状态')->default(1); + $form->switch('need_check', '多次校验') + ->default(1) + ->help('同一订单,多次核销时校验,订单每满100元可核销一笔。'); + + $grantdef = $verificationsdef = ''; + if ($id) { + $grantdef = Activity::find($id)->grants()->pluck('user_id')->toArray(); + $verificationsdef = Activity::find($id)->verifications()->pluck('user_id')->toArray(); + } + + $users = User::with('info')->whereHas('identity', function ($q) { + $q->where('identity_id', 1); + })->orderBy('id', 'desc')->get()->pluck('nickname', 'id'); + + $form->listbox('grants.user_id', '可发券渠道') + ->options($users) + ->default($grantdef) + ->required(); + + $form->listbox('verifications.user_id', '可核券渠道') + ->options($users) + ->default($verificationsdef) + ->required(); + + $form->saving(function (Form $form) { + $request = request(); + + if ($request->total < 0) { + $error = new MessageBag([ + 'title' => '错误', + 'message' => '可发券总数必须大于0', + ]); + + return back()->withInput()->with(compact('error')); + } + + if ($request->type == Activity::TYPE_EXTEND && empty($request->days)) { + $error = new MessageBag([ + 'title' => '错误', + 'message' => '必须添加延期天数', + ]); + + return back()->withInput()->with(compact('error')); + } + + if ($request->type == Activity::TYPE_SCOPE && (empty($request->start_at) || empty($request->end_at))) { + $error = new MessageBag([ + 'title' => '错误', + 'message' => '必须添加延期天数', + ]); + + return back()->withInput()->with(compact('error')); + } + + if (request()->start) { + $form->start_at = $form->start_at . ' 00:00:01'; + } + + if (request()->end_at) { + $form->end_at = $form->end_at . ' 23:59:59'; + } + + }); + + $form->saved(function (Form $form) { + $users = []; + foreach ($form->grants['user_id'] as $key => $user_id) { + if ($user_id) { + $form->model()->grants()->updateOrCreate([ + 'user_id' => $user_id, + ]); + $users[] = $user_id; + } + } + $form->model()->grants()->whereNotIn('user_id', $users)->delete(); + $users = []; + foreach ($form->verifications['user_id'] as $key => $user_id) { + if ($user_id) { + $form->model()->verifications()->updateOrCreate([ + 'user_id' => $user_id, + ]); + $users[] = $user_id; + } + } + $form->model()->verifications()->whereNotIn('user_id', $users)->delete(); + }); + + return $form; + } + +} diff --git a/app/Models/Activity.php b/app/Models/Activity.php index e68d96e..426dd5a 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -98,8 +98,9 @@ class Activity extends Model //发券 public function grant($mobile, $outletId = null) { + try { - $code = '66406' . date('ymdH') . mt_rand(1000000, 9999999); + $code = 'YSD' . date('ymd') . mt_rand(100000, 999999); if ($this->type == SELF::TYPE_EXTEND) { $start_at = now(); diff --git a/packages/coupon/src/Action/ysd/YsdGrant.php b/packages/coupon/src/Action/ysd/YsdGrant.php index 1c3b452..c414d2d 100644 --- a/packages/coupon/src/Action/ysd/YsdGrant.php +++ b/packages/coupon/src/Action/ysd/YsdGrant.php @@ -4,6 +4,7 @@ namespace XuanChen\Coupon\Action\ysd; use App\Models\Activity; use App\Models\User; +use Carbon\Carbon; use XuanChen\Coupon\Action\Init; class YsdGrant extends Init @@ -13,7 +14,7 @@ class YsdGrant extends Init { try { - $activity = Activity::where('code', $this->activityId)->first(); + $activity = Activity::withCount('coupons')->where('code', $this->activityId)->first(); if (!$activity) { return '发券失败,没有找到这个活动。'; } @@ -21,6 +22,14 @@ class YsdGrant extends Init if (!$activity->status) { return '发券失败,活动已经关闭。'; } + + if ($activity->type == Activity::TYPE_SCOPE && Carbon::now()->gt($activity->end_at)) { + return '发券失败,此活动已经结束。'; + } + + if ($activity->total > 0 && $activity->coupons_count >= $activity->total) { + return '发券失败,已达到可发券总数。'; + } $outlet = User::where('outlet_id', $this->outletId)->first(); if (!$outlet) {