更改迁移
parent
eaddca989d
commit
c6e4e5a639
|
|
@ -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.' 开始任务';
|
||||
}
|
||||
|
||||
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 ['确认开始执行当前任务?'];
|
||||
}
|
||||
}
|
||||
|
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
* 使用范围列表
|
||||
*
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
});
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
@ -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('使用结束时间');
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
});
|
||||
|
|
|
|||
|
|
@ -12,6 +12,13 @@ return [
|
|||
'administrator_id' => '操作人',
|
||||
'type' => '任务类型',
|
||||
'status' => '任务状态',
|
||||
'value1' => '指定用户',
|
||||
'coupon'=>[
|
||||
'name' => '优惠券',
|
||||
],
|
||||
'administrator' =>[
|
||||
'name' =>'操作人',
|
||||
],
|
||||
],
|
||||
'options' => [
|
||||
],
|
||||
|
|
|
|||
|
|
@ -11,6 +11,15 @@ return [
|
|||
'user_id' => '用户',
|
||||
'num' => '张数',
|
||||
'status' => '状态',
|
||||
'task'=>[
|
||||
'name' => '任务名称',
|
||||
],
|
||||
'user'=>[
|
||||
'phone'=>'手机号',
|
||||
],
|
||||
'coupon'=>[
|
||||
'name' => '优惠券',
|
||||
],
|
||||
],
|
||||
'options' => [
|
||||
],
|
||||
|
|
|
|||
Loading…
Reference in New Issue