6
0
Fork 0

更改迁移

release
vine_liutk 2021-12-09 13:56:34 +08:00
parent eaddca989d
commit c6e4e5a639
15 changed files with 481 additions and 13 deletions

View File

@ -0,0 +1,68 @@
<?php
namespace App\Admin\Actions\Grid;
use App\Services\AdminSendCouponService;
use Dcat\Admin\Actions\Response;
use Dcat\Admin\Grid\RowAction;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Throwable;
class CouponTaskStart extends RowAction
{
/**
* @return string
*/
protected $title = '<i class="feather grid-action-icon icon-play-circle"></i>';
public function title()
{
if ($this->title) {
return $this->title.'&nbsp;开始任务';
}
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 ['确认开始执行当前任务?'];
}
}

View File

@ -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());
}
/**
* 使用范围列表
*

View File

@ -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());
}
}

View File

@ -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);
});
});
}

View File

@ -0,0 +1,21 @@
<?php
namespace App\Admin\Renderable;
use App\Models\User;
use Dcat\Admin\Grid;
use Dcat\Admin\Grid\LazyRenderable;
class UserSimpleTable extends LazyRenderable
{
public function grid(): Grid
{
$builder = User::query();
return Grid::make($builder, function (Grid $grid) {
$grid->disableRowSelector(false);
$grid->column('phone');
$grid->quickSearch(['phone']);
$grid->disableActions();
});
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

@ -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');
});

View File

@ -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');
}
}

View File

@ -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');
}
}

View File

@ -0,0 +1,43 @@
<?php
namespace App\Services;
use App\Models\CouponSendTask;
use App\Models\CouponTaskLog;
class AdminSendCouponService
{
public function startTaskById(int $id)
{
$task = CouponSendTask::findOrFail($id);
$this->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();
}
}

View File

@ -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('使用结束时间');

View File

@ -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();
});

View File

@ -12,6 +12,13 @@ return [
'administrator_id' => '操作人',
'type' => '任务类型',
'status' => '任务状态',
'value1' => '指定用户',
'coupon'=>[
'name' => '优惠券',
],
'administrator' =>[
'name' =>'操作人',
],
],
'options' => [
],

View File

@ -11,6 +11,15 @@ return [
'user_id' => '用户',
'num' => '张数',
'status' => '状态',
'task'=>[
'name' => '任务名称',
],
'user'=>[
'phone'=>'手机号',
],
'coupon'=>[
'name' => '优惠券',
],
],
'options' => [
],