From c6e4e5a639305c5674dad23c5df4f385e3c38689 Mon Sep 17 00:00:00 2001 From: vine_liutk <961510893@qq.com> Date: Thu, 9 Dec 2021 13:56:34 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Admin/Actions/Grid/CouponTaskStart.php | 68 ++++++++++++++ app/Admin/Controllers/CouponController.php | 21 +++++ .../Controllers/CouponSendTaskController.php | 71 ++++++++++++-- .../Controllers/CouponTaskLogController.php | 26 +++-- app/Admin/Renderable/UserSimpleTable.php | 21 +++++ app/Admin/Repositories/Coupon.php | 94 +++++++++++++++++++ app/Admin/Repositories/CouponSendTask.php | 79 ++++++++++++++++ app/Admin/routes.php | 3 + app/Models/CouponSendTask.php | 18 ++++ app/Models/CouponTaskLog.php | 32 +++++++ app/Services/AdminSendCouponService.php | 43 +++++++++ ...2021_12_07_102419_create_coupons_table.php | 1 + ..._164534_create_coupon_send_tasks_table.php | 1 + resources/lang/zh_CN/coupon-send-task.php | 7 ++ resources/lang/zh_CN/coupon-task-log.php | 9 ++ 15 files changed, 481 insertions(+), 13 deletions(-) create mode 100644 app/Admin/Actions/Grid/CouponTaskStart.php create mode 100644 app/Admin/Renderable/UserSimpleTable.php create mode 100644 app/Services/AdminSendCouponService.php diff --git a/app/Admin/Actions/Grid/CouponTaskStart.php b/app/Admin/Actions/Grid/CouponTaskStart.php new file mode 100644 index 00000000..fca64809 --- /dev/null +++ b/app/Admin/Actions/Grid/CouponTaskStart.php @@ -0,0 +1,68 @@ +'; + + public function title() + { + if ($this->title) { + return $this->title.' 开始任务'; + } + + return '开始任务'; + } + + /** + * @param Model|Authenticatable|HasPermissions|null $user + * + * @return bool + */ + protected function authorize($user): bool + { + return $user->can('dcat.admin.coupon_send_tasks.start'); + } + + /** + * Handle the action request. + * + * @param Request $request + * + * @return Response + */ + public function handle(Request $request) + { + try { + DB::beginTransaction(); + $adminSendCouponService = new AdminSendCouponService(); + $adminSendCouponService->startTaskById($this->getKey()); + DB::commit(); + } catch (Throwable $th) { + DB::rollBack(); + report($th); + return $this->response()->error('开始失败,'.$th->getMessage())->refresh(); + } + + return $this->response()->success('操作成功')->refresh(); + } + + /** + * @return string|array|void + */ + public function confirm() + { + return ['确认开始执行当前任务?']; + } +} diff --git a/app/Admin/Controllers/CouponController.php b/app/Admin/Controllers/CouponController.php index 532b361a..bdd52a35 100644 --- a/app/Admin/Controllers/CouponController.php +++ b/app/Admin/Controllers/CouponController.php @@ -11,6 +11,7 @@ use Dcat\Admin\Grid; use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Layout\Content; use Dcat\Admin\Show; +use Illuminate\Http\Request; class CouponController extends AdminController { @@ -134,6 +135,26 @@ class CouponController extends AdminController }); } + /** + * 获取优惠券接口 + * + * @param Request $request + * @return void + */ + public function coupons(Request $request) + { + $name = $request->input('q'); + + $query = CouponModel::select('id', 'name as text'); + + if ($name) { + $query->where('name', 'like', "%$name%"); + return $query->paginate(null); + } + + return response()->json($query->get()); + } + /** * 使用范围列表 * diff --git a/app/Admin/Controllers/CouponSendTaskController.php b/app/Admin/Controllers/CouponSendTaskController.php index 6e843c7f..1dc49760 100644 --- a/app/Admin/Controllers/CouponSendTaskController.php +++ b/app/Admin/Controllers/CouponSendTaskController.php @@ -2,12 +2,18 @@ namespace App\Admin\Controllers; +use App\Admin\Actions\Grid\CouponTaskStart; +use App\Admin\Renderable\UserSimpleTable; use App\Admin\Repositories\CouponSendTask; +use App\Models\Coupon; +use App\Models\CouponSendTask as CouponSendTaskModel; +use App\Models\User; use Dcat\Admin\Admin; use Dcat\Admin\Form; use Dcat\Admin\Grid; use Dcat\Admin\Http\Controllers\AdminController; use Dcat\Admin\Show; +use Illuminate\Http\Request; class CouponSendTaskController extends AdminController { @@ -22,7 +28,7 @@ class CouponSendTaskController extends AdminController return Grid::make($builder, function (Grid $grid) { $grid->column('id')->sortable(); $grid->column('name'); - $grid->column('coupon.name'); + $grid->column('coupon.name')->label(); $grid->column('num'); $grid->column('administrator.name'); $grid->column('type')->using([ @@ -56,6 +62,9 @@ class CouponSendTaskController extends AdminController $grid->actions(function (Grid\Displayers\Actions $actions) { if ($actions->row->status == 0) { $actions->disableDelete(Admin::user()->cannot('dcat.admin.coupon_send_tasks.destroy')); + if (Admin::user()->can('dcat.admin.coupon_send_tasks.start')) { + $actions->append(new CouponTaskStart()); + } } }); @@ -98,15 +107,63 @@ class CouponSendTaskController extends AdminController { return Form::make(new CouponSendTask(), function (Form $form) { $form->display('id'); - $form->text('name'); - $form->text('coupon_id'); - $form->text('num'); - $form->text('administrator_id'); - $form->text('type'); - $form->text('status'); + $form->text('name')->required(); + $form->select('coupon_id')->options(function ($id) { + $coupon = Coupon::find($id); + if ($coupon) { + return [$coupon->id => $coupon->name]; + } + })->ajax(admin_route('api.coupons')); + $form->number('num')->default(1); + $form->radio('type')->options([ + 1=>'指定用户', + ])->when(1, function (Form $form) { + $form->multipleSelectTable('value1') + ->from(UserSimpleTable::make()) + ->model(User::class, 'id', 'phone') + ->customFormat(function ($v) { + $v = []; + if ($this->model()->type == 1) { + $value = json_decode($this->model()->value, true); + $v = $value['user_ids']; + } + return $v; + })->rules('required_if:type,1')->max(100)->help('单次最多选择100名用户'); + })->default(1); + + $form->hidden('value'); + + $form->saving(function (Form $form) { + switch ($form->type) { + case 1: + $form->value = json_encode(['user_ids'=>$form->value1]); + break; + } + $form->deleteInput('value1'); + }); $form->display('created_at'); $form->display('updated_at'); }); } + + /** + * 优惠券任务接口 + * + * @param Request $request + * @return void + */ + public function tasks(Request $request) + { + $name = $request->input('q'); + + $query = CouponSendTaskModel::select('id', 'name as text'); + + if ($name) { + $query->where('name', 'like', "%$name%"); + return $query->paginate(null); + } + + return response()->json($query->get()); + } } diff --git a/app/Admin/Controllers/CouponTaskLogController.php b/app/Admin/Controllers/CouponTaskLogController.php index 73283a76..22ba1a99 100644 --- a/app/Admin/Controllers/CouponTaskLogController.php +++ b/app/Admin/Controllers/CouponTaskLogController.php @@ -17,18 +17,32 @@ class CouponTaskLogController extends AdminController */ protected function grid() { - return Grid::make(new CouponTaskLog(), function (Grid $grid) { + $builder = CouponTaskLog::with(['coupon', 'task', 'user']); + return Grid::make($builder, function (Grid $grid) { $grid->column('id')->sortable(); - $grid->column('task_id'); - $grid->column('coupon_id'); - $grid->column('user_id'); + $grid->column('task.name'); + $grid->column('coupon.name'); + $grid->column('user.phone'); $grid->column('num'); - $grid->column('status'); + $grid->column('status')->using([ + 0=>'未发放', + 1=>'发放中', + 2=>'成功', + 3=>'失败', + ])->dot([ + 0=>'#b3b9bf', + 1=>'primary', + 2=>'success', + 3=>'danger', + ]); $grid->column('created_at'); $grid->column('updated_at')->sortable(); $grid->filter(function (Grid\Filter $filter) { - $filter->equal('id'); + $filter->panel(false); + $filter->equal('task_id')->select()->ajax(admin_route('api.coupon_send_tasks'))->width(3); + $filter->equal('coupon_id')->select()->ajax(admin_route('api.coupons'))->width(3); + $filter->like('user.phone')->width(3); }); }); } diff --git a/app/Admin/Renderable/UserSimpleTable.php b/app/Admin/Renderable/UserSimpleTable.php new file mode 100644 index 00000000..af0414df --- /dev/null +++ b/app/Admin/Renderable/UserSimpleTable.php @@ -0,0 +1,21 @@ +disableRowSelector(false); + $grid->column('phone'); + $grid->quickSearch(['phone']); + $grid->disableActions(); + }); + } +} diff --git a/app/Admin/Repositories/Coupon.php b/app/Admin/Repositories/Coupon.php index db42d1fb..0daf3e0a 100644 --- a/app/Admin/Repositories/Coupon.php +++ b/app/Admin/Repositories/Coupon.php @@ -3,7 +3,10 @@ namespace App\Admin\Repositories; use App\Models\Coupon as Model; +use Dcat\Admin\Form; use Dcat\Admin\Repositories\EloquentRepository; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\DB; class Coupon extends EloquentRepository { @@ -13,4 +16,95 @@ class Coupon extends EloquentRepository * @var string */ protected $eloquentClass = Model::class; + + /** + * 新增记录. + * + * @param Form $form + * @return mixed + */ + public function store(Form $form) + { + $result = null; + + DB::transaction(function () use ($form, &$result) { + $model = $this->model(); + + $updates = $form->updates(); + + [$relations, $relationKeyMap] = $this->getRelationInputs($model, $updates); + + if ($relations) { + $updates = Arr::except($updates, array_keys($relationKeyMap)); + } + + foreach ($updates as $column => $value) { + $model->setAttribute($column, $value); + } + //处理剩余量字段 + $model = $this->createStock($model); + + $result = $model->save(); + + $this->updateRelation($form, $model, $relations, $relationKeyMap); + }); + + return $this->model()->getKey(); + } + + /** + * 更新数据. + * + * @param Form $form + * @return bool + */ + public function update(Form $form) + { + /* @var EloquentModel $builder */ + $model = $this->model(); + + if (! $model->getKey()) { + $model->exists = true; + + $model->setAttribute($model->getKeyName(), $form->getKey()); + } + + $result = null; + + DB::transaction(function () use ($form, $model, &$result) { + $updates = $form->updates(); + + [$relations, $relationKeyMap] = $this->getRelationInputs($model, $updates); + + if ($relations) { + $updates = Arr::except($updates, array_keys($relationKeyMap)); + } + + foreach ($updates as $column => $value) { + /* @var EloquentModel $model */ + $model->setAttribute($column, $value); + } + $model = $this->createStock($model); + $result = $model->update(); + + $this->updateRelation($form, $model, $relations, $relationKeyMap); + }); + + return $result; + } + + /** + * Undocumented function + * + * @return void + */ + public function createStock($model) + { + if ($model->limit == 0) { + $model->setAttribute('stock', 0); + } else { + $model->setAttribute('stock', $model->limit - $model->sent); + } + return $model; + } } diff --git a/app/Admin/Repositories/CouponSendTask.php b/app/Admin/Repositories/CouponSendTask.php index b41002a7..1debdb36 100644 --- a/app/Admin/Repositories/CouponSendTask.php +++ b/app/Admin/Repositories/CouponSendTask.php @@ -3,7 +3,11 @@ namespace App\Admin\Repositories; use App\Models\CouponSendTask as Model; +use Dcat\Admin\Admin; +use Dcat\Admin\Form; use Dcat\Admin\Repositories\EloquentRepository; +use Illuminate\Support\Arr; +use Illuminate\Support\Facades\DB; class CouponSendTask extends EloquentRepository { @@ -13,4 +17,79 @@ class CouponSendTask extends EloquentRepository * @var string */ protected $eloquentClass = Model::class; + + /** + * 新增记录. + * + * @param Form $form + * @return mixed + */ + public function store(Form $form) + { + $result = null; + + DB::transaction(function () use ($form, &$result) { + $model = $this->model(); + + $updates = $form->updates(); + + [$relations, $relationKeyMap] = $this->getRelationInputs($model, $updates); + + if ($relations) { + $updates = Arr::except($updates, array_keys($relationKeyMap)); + } + + foreach ($updates as $column => $value) { + $model->setAttribute($column, $value); + } + $model->setAttribute('administrator_id', Admin::user()->id); + + $result = $model->save(); + + $this->updateRelation($form, $model, $relations, $relationKeyMap); + }); + + return $this->model()->getKey(); + } + + /** + * 更新数据. + * + * @param Form $form + * @return bool + */ + public function update(Form $form) + { + /* @var EloquentModel $builder */ + $model = $this->model(); + + if (! $model->getKey()) { + $model->exists = true; + + $model->setAttribute($model->getKeyName(), $form->getKey()); + } + + $result = null; + + DB::transaction(function () use ($form, $model, &$result) { + $updates = $form->updates(); + + [$relations, $relationKeyMap] = $this->getRelationInputs($model, $updates); + + if ($relations) { + $updates = Arr::except($updates, array_keys($relationKeyMap)); + } + + foreach ($updates as $column => $value) { + /* @var EloquentModel $model */ + $model->setAttribute($column, $value); + } + $model->setAttribute('administrator_id', Admin::user()->id); + $result = $model->update(); + + $this->updateRelation($form, $model, $relations, $relationKeyMap); + }); + + return $result; + } } diff --git a/app/Admin/routes.php b/app/Admin/routes.php index 50cdd2a2..67f3769e 100644 --- a/app/Admin/routes.php +++ b/app/Admin/routes.php @@ -75,6 +75,7 @@ Route::group([ ])->names('coupon_ranges'); $router->resource('coupon-send-tasks', 'CouponSendTaskController')->names('coupon_send_tasks'); + $router->resource('coupon-task-logs', 'CouponTaskLogController')->only([ 'index', ])->names('coupon_task_logs'); @@ -87,4 +88,6 @@ Route::group([ $router->get('api/product-categories', 'ProductCategoryController@categories')->name('api.product_categories'); $router->get('api/product-group-details', 'ProductGroupController@details')->name('api.product_group_details'); $router->get('api/product-skus', 'ProductSkuController@skus')->name('api.product_skus'); + $router->get('api/coupons', 'CouponController@coupons')->name('api.coupons'); + $router->get('api/coupone-send-tasks', 'CouponSendTaskController@tasks')->name('api.coupon_send_tasks'); }); diff --git a/app/Models/CouponSendTask.php b/app/Models/CouponSendTask.php index 20fa35e2..08d8fee7 100644 --- a/app/Models/CouponSendTask.php +++ b/app/Models/CouponSendTask.php @@ -2,10 +2,28 @@ namespace App\Models; +use App\Casts\JsonArray; +use App\Models\Admin\Administrator; +use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class CouponSendTask extends Model { use HasFactory; + use HasDateTimeFormatter; + + // protected $casts = [ + // 'value'=>JsonArray::class, + // ]; + + public function coupon() + { + return $this->belongsTo(Coupon::class, 'coupon_id'); + } + + public function administrator() + { + return $this->belongsTo(Administrator::class, 'administrator_id'); + } } diff --git a/app/Models/CouponTaskLog.php b/app/Models/CouponTaskLog.php index 0aad24b5..cc95ad51 100644 --- a/app/Models/CouponTaskLog.php +++ b/app/Models/CouponTaskLog.php @@ -2,10 +2,42 @@ namespace App\Models; +use Dcat\Admin\Traits\HasDateTimeFormatter; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class CouponTaskLog extends Model { use HasFactory; + use HasDateTimeFormatter; + + /** + * 此记录发放的券 + * + * @return void + */ + public function coupon() + { + return $this->belongsTo(Coupon::class, 'coupon_id'); + } + + /** + * 此记录对应的任务 + * + * @return void + */ + public function task() + { + return $this->belongsTo(CouponSendTask::class, 'task_id'); + } + + /** + * 此记录对应的人 + * + * @return void + */ + public function user() + { + return $this->belongsTo(User::class, 'user_id'); + } } diff --git a/app/Services/AdminSendCouponService.php b/app/Services/AdminSendCouponService.php new file mode 100644 index 00000000..48ae9b9e --- /dev/null +++ b/app/Services/AdminSendCouponService.php @@ -0,0 +1,43 @@ +startTask($task); + } + + public function startTask(CouponSendTask $task) + { + $nowTime = now(); + $task->status = 1; + switch ($task->type) { + case 1://指定用户 + $insertLogs = []; + $userIds = explode(',', json_decode($task->value, true)['user_ids']); + foreach ($userIds as $userId) { + $insertLogs[] = [ + 'task_id'=>$task->id, + 'coupon_id'=>$task->coupon_id, + 'user_id'=>$userId, + 'num'=>$task->num, + 'created_at'=>$nowTime, + 'updated_at'=>$nowTime, + ]; + } + $res = CouponTaskLog::insert($insertLogs); + if ($res) { + $task->status = 2; + } + break; + } + + $task->save(); + } +} diff --git a/database/migrations/2021_12_07_102419_create_coupons_table.php b/database/migrations/2021_12_07_102419_create_coupons_table.php index ea0a6a58..f7502efd 100644 --- a/database/migrations/2021_12_07_102419_create_coupons_table.php +++ b/database/migrations/2021_12_07_102419_create_coupons_table.php @@ -22,6 +22,7 @@ class CreateCouponsTable extends Migration $table->unsignedBigInteger('threshold')->default(0)->comment('使用门槛金额:分'); $table->unsignedInteger('limit')->default(0)->comment('限量'); $table->unsignedInteger('sent')->default(0)->comment('已送数量'); + $table->unsignedInteger('stock')->default(0)->comment('剩余量'); $table->unsignedInteger('use_day')->default(0)->comment('使用期限'); $table->timestamp('use_start_at')->nullable()->comment('使用开始时间'); $table->timestamp('use_end_at')->nullable()->comment('使用结束时间'); diff --git a/database/migrations/2021_12_08_164534_create_coupon_send_tasks_table.php b/database/migrations/2021_12_08_164534_create_coupon_send_tasks_table.php index cd793812..21df9c86 100644 --- a/database/migrations/2021_12_08_164534_create_coupon_send_tasks_table.php +++ b/database/migrations/2021_12_08_164534_create_coupon_send_tasks_table.php @@ -20,6 +20,7 @@ class CreateCouponSendTasksTable extends Migration $table->unsignedBigInteger('num')->default(1)->comment('张数'); $table->unsignedBigInteger('administrator_id')->comment('操作管理员ID'); $table->unsignedTinyInteger('type')->comment('任务类型:1指定用户,2用户vip等级,3所有用户,4用户excel导入'); + $table->json('value')->comment('任务内容'); $table->unsignedTinyInteger('status')->default(0)->comment('任务状态:0未开始,1初始化中,2执行中,3已完成'); $table->timestamps(); }); diff --git a/resources/lang/zh_CN/coupon-send-task.php b/resources/lang/zh_CN/coupon-send-task.php index 7b403d49..83553509 100644 --- a/resources/lang/zh_CN/coupon-send-task.php +++ b/resources/lang/zh_CN/coupon-send-task.php @@ -12,6 +12,13 @@ return [ 'administrator_id' => '操作人', 'type' => '任务类型', 'status' => '任务状态', + 'value1' => '指定用户', + 'coupon'=>[ + 'name' => '优惠券', + ], + 'administrator' =>[ + 'name' =>'操作人', + ], ], 'options' => [ ], diff --git a/resources/lang/zh_CN/coupon-task-log.php b/resources/lang/zh_CN/coupon-task-log.php index 86a4b29a..9926b01c 100644 --- a/resources/lang/zh_CN/coupon-task-log.php +++ b/resources/lang/zh_CN/coupon-task-log.php @@ -11,6 +11,15 @@ return [ 'user_id' => '用户', 'num' => '张数', 'status' => '状态', + 'task'=>[ + 'name' => '任务名称', + ], + 'user'=>[ + 'phone'=>'手机号', + ], + 'coupon'=>[ + 'name' => '优惠券', + ], ], 'options' => [ ],