处理冲突
parent
2d057fac9c
commit
647b74eb8d
|
|
@ -0,0 +1,166 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Controllers;
|
||||||
|
|
||||||
|
use App\Admin\Repositories\Activity;
|
||||||
|
use App\Models\Coupon;
|
||||||
|
use App\Models\ProductPart;
|
||||||
|
use App\Models\ProductSku;
|
||||||
|
use Carbon\Carbon;
|
||||||
|
use Dcat\Admin\Admin;
|
||||||
|
use Dcat\Admin\Form;
|
||||||
|
use Dcat\Admin\Grid;
|
||||||
|
use Dcat\Admin\Grid\Column;
|
||||||
|
use Dcat\Admin\Http\Controllers\AdminController;
|
||||||
|
use Dcat\Admin\Show;
|
||||||
|
|
||||||
|
class ActivityController extends AdminController
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Make a grid builder.
|
||||||
|
*
|
||||||
|
* @return Grid
|
||||||
|
*/
|
||||||
|
protected function grid()
|
||||||
|
{
|
||||||
|
return Grid::make(new Activity(), function (Grid $grid) {
|
||||||
|
$grid->column('id')->sortable();
|
||||||
|
$grid->column('title');
|
||||||
|
$grid->column('cover')->image(100);
|
||||||
|
$grid->column('content');
|
||||||
|
$grid->column('is_use')
|
||||||
|
->if(function () {
|
||||||
|
return Admin::user()->can('dcat.admin.activities.edit');
|
||||||
|
})
|
||||||
|
->then(function (Column $column) {
|
||||||
|
$column->switch();
|
||||||
|
})
|
||||||
|
->else(function (Column $column) {
|
||||||
|
$column->bool();
|
||||||
|
});
|
||||||
|
$grid->column('started_at');
|
||||||
|
$grid->column('ended_at');
|
||||||
|
$grid->column('created_at');
|
||||||
|
$grid->column('updated_at')->sortable();
|
||||||
|
//新增
|
||||||
|
if (Admin::user()->can('dcat.admin.activities.create')) {
|
||||||
|
$grid->disableCreateButton(false);
|
||||||
|
// $grid->enableDialogCreate();
|
||||||
|
}
|
||||||
|
//删除以及自定义操作
|
||||||
|
$grid->actions(function (Grid\Displayers\Actions $actions) {
|
||||||
|
$actions->disableDelete(Admin::user()->cannot('dcat.admin.activities.destroy'));
|
||||||
|
//修改
|
||||||
|
$actions->disableEdit(Admin::user()->cannot('dcat.admin.activities.edit'));
|
||||||
|
});
|
||||||
|
$grid->filter(function (Grid\Filter $filter) {
|
||||||
|
$filter->panel();
|
||||||
|
$filter->like('title')->width(3);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a show builder.
|
||||||
|
*
|
||||||
|
* @param mixed $id
|
||||||
|
*
|
||||||
|
* @return Show
|
||||||
|
*/
|
||||||
|
protected function detail($id)
|
||||||
|
{
|
||||||
|
return Show::make($id, new Activity(), function (Show $show) {
|
||||||
|
$show->field('id');
|
||||||
|
$show->field('title');
|
||||||
|
$show->field('cover');
|
||||||
|
$show->field('content');
|
||||||
|
$show->field('is_use');
|
||||||
|
$show->field('started_at');
|
||||||
|
$show->field('ended_at');
|
||||||
|
$show->field('coupons_rule');
|
||||||
|
$show->field('gifts_rule');
|
||||||
|
$show->field('created_at');
|
||||||
|
$show->field('updated_at');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make a form builder.
|
||||||
|
*
|
||||||
|
* @return Form
|
||||||
|
*/
|
||||||
|
protected function form()
|
||||||
|
{
|
||||||
|
$builder = Activity::with(['parts', 'couponSet', 'giftSet']);
|
||||||
|
return Form::make($builder, function (Form $form) {
|
||||||
|
$form->display('id');
|
||||||
|
$form->display('created_at');
|
||||||
|
$form->display('updated_at');
|
||||||
|
$form->block(6, function (Form\BlockForm $form) {
|
||||||
|
$form->text('title')->required();
|
||||||
|
$form->image('cover')
|
||||||
|
->move('activities/'.Carbon::now()->toDateString())
|
||||||
|
->saveFullUrl()
|
||||||
|
->removable(false)
|
||||||
|
->autoUpload()->retainable();
|
||||||
|
$form->switch('is_use');
|
||||||
|
$form->dateRange('started_at', 'ended_at', '活动时间');
|
||||||
|
$form->multipleSelect('parts', '商品分区关联')->options(ProductPart::all()->pluck('name', 'id'))->customFormat(function ($v) {
|
||||||
|
if (! $v) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
// 从数据库中查出的二维数组中转化成ID
|
||||||
|
return array_column($v, 'id');
|
||||||
|
});
|
||||||
|
$form->hasMany('couponSet', '优惠券关联', function ($form) {
|
||||||
|
$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('qty', '数量');
|
||||||
|
})->useTable();
|
||||||
|
$form->hasMany('giftSet', '赠品关联', function ($form) {
|
||||||
|
$form->select('sku_id', '赠品')->options(function ($id) {
|
||||||
|
$sku = ProductSku::find($id);
|
||||||
|
if ($sku) {
|
||||||
|
return [$sku->id => $sku->name];
|
||||||
|
}
|
||||||
|
})->ajax(admin_route('api.product_skus'));
|
||||||
|
$form->number('qty', '数量');
|
||||||
|
})->useTable();
|
||||||
|
|
||||||
|
$form->showFooter();
|
||||||
|
});
|
||||||
|
$form->block(6, function (Form\BlockForm $form) {
|
||||||
|
$form->title('活动内容');
|
||||||
|
//优惠券规则
|
||||||
|
$form->embeds('coupons_rule', function ($form) {
|
||||||
|
$form->radio('type')->options([
|
||||||
|
0=>'按订单赠送',
|
||||||
|
1=>'其他活动来源',
|
||||||
|
])->default(0);
|
||||||
|
$form->number('value', '门槛')->help('每N元赠送一份');
|
||||||
|
$form->radio('times', '可领次数')->options([
|
||||||
|
'0'=>'仅首单',
|
||||||
|
'1'=>'不限',
|
||||||
|
])->default(0);
|
||||||
|
});
|
||||||
|
//赠品规则
|
||||||
|
$form->embeds('gifts_rule', function ($form) {
|
||||||
|
$form->radio('type')->options([
|
||||||
|
0=>'按订单赠送',
|
||||||
|
1=>'其他活动来源',
|
||||||
|
])->default(0);
|
||||||
|
$form->number('value', '门槛')->help('每N元赠送一份');
|
||||||
|
$form->radio('times', '可领次数')->options([
|
||||||
|
'0'=>'仅首单',
|
||||||
|
'1'=>'不限',
|
||||||
|
])->default(0);
|
||||||
|
});
|
||||||
|
$form->editor('content')->height('600');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -6,6 +6,7 @@ use App\Admin\Actions\Grid\PartCoupon;
|
||||||
use App\Admin\Renderable\ProductPartSkuTable;
|
use App\Admin\Renderable\ProductPartSkuTable;
|
||||||
use App\Admin\Renderable\ProductSkuSimpleTable;
|
use App\Admin\Renderable\ProductSkuSimpleTable;
|
||||||
use App\Admin\Repositories\ProductPart;
|
use App\Admin\Repositories\ProductPart;
|
||||||
|
use App\Models\ProductPart as ProductPartModel;
|
||||||
use App\Models\ProductSku;
|
use App\Models\ProductSku;
|
||||||
use Dcat\Admin\Admin;
|
use Dcat\Admin\Admin;
|
||||||
use Dcat\Admin\Form;
|
use Dcat\Admin\Form;
|
||||||
|
|
@ -13,6 +14,7 @@ use Dcat\Admin\Grid;
|
||||||
use Dcat\Admin\Grid\Column;
|
use Dcat\Admin\Grid\Column;
|
||||||
use Dcat\Admin\Http\Controllers\AdminController;
|
use Dcat\Admin\Http\Controllers\AdminController;
|
||||||
use Dcat\Admin\Show;
|
use Dcat\Admin\Show;
|
||||||
|
use Illuminate\Http\Request;
|
||||||
|
|
||||||
class ProductPartController extends AdminController
|
class ProductPartController extends AdminController
|
||||||
{
|
{
|
||||||
|
|
@ -141,4 +143,18 @@ class ProductPartController extends AdminController
|
||||||
$form->display('updated_at');
|
$form->display('updated_at');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function parts(Request $request)
|
||||||
|
{
|
||||||
|
$name = $request->input('q');
|
||||||
|
|
||||||
|
$query = ProductPartModel::select('id', 'name as text');
|
||||||
|
|
||||||
|
if ($name) {
|
||||||
|
$query->where('name', 'like', "%$name%");
|
||||||
|
return $query->paginate(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($query->get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Admin\Repositories;
|
||||||
|
|
||||||
|
use App\Models\Activity as Model;
|
||||||
|
use Dcat\Admin\Repositories\EloquentRepository;
|
||||||
|
|
||||||
|
class Activity extends EloquentRepository
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Model.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $eloquentClass = Model::class;
|
||||||
|
}
|
||||||
|
|
@ -160,6 +160,8 @@ Route::group([
|
||||||
'index',
|
'index',
|
||||||
])->names('order_refunds');
|
])->names('order_refunds');
|
||||||
|
|
||||||
|
$router->resource('activities', 'ActivityController')->names('activities');
|
||||||
|
|
||||||
$router->get('import-job-logs', 'ImportJobLogController@index')->name('import_job_logs.index');
|
$router->get('import-job-logs', 'ImportJobLogController@index')->name('import_job_logs.index');
|
||||||
|
|
||||||
$router->resource('sales-value-logs', 'SalesValueLogController')->only(
|
$router->resource('sales-value-logs', 'SalesValueLogController')->only(
|
||||||
|
|
@ -215,6 +217,7 @@ Route::group([
|
||||||
$router->get('api/product-categories', 'ProductCategoryController@categories')->name('api.product_categories');
|
$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-group-details', 'ProductGroupController@details')->name('api.product_group_details');
|
||||||
$router->get('api/product-skus', 'ProductSkuController@skus')->name('api.product_skus');
|
$router->get('api/product-skus', 'ProductSkuController@skus')->name('api.product_skus');
|
||||||
|
$router->get('api/product-parts', 'ProductPartController@parts')->name('api.product_parts');
|
||||||
$router->get('api/coupons', 'CouponController@coupons')->name('api.coupons');
|
$router->get('api/coupons', 'CouponController@coupons')->name('api.coupons');
|
||||||
$router->get('api/coupone-send-tasks', 'CouponSendTaskController@tasks')->name('api.coupon_send_tasks');
|
$router->get('api/coupone-send-tasks', 'CouponSendTaskController@tasks')->name('api.coupon_send_tasks');
|
||||||
$router->get('api/orders', 'OrderController@orders')->name('api.orders');
|
$router->get('api/orders', 'OrderController@orders')->name('api.orders');
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use App\Casts\JsonArray;
|
||||||
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class Activity extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
use HasDateTimeFormatter;
|
||||||
|
|
||||||
|
protected $casts = [
|
||||||
|
'is_use' => 'bool',
|
||||||
|
'coupons_rule'=> JsonArray::class,
|
||||||
|
'gifts_rule'=> JsonArray::class,
|
||||||
|
];
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'title', 'cover', 'content', 'is_use', 'coupons_rule', 'gifts_rule',
|
||||||
|
];
|
||||||
|
|
||||||
|
public function couponSet()
|
||||||
|
{
|
||||||
|
return $this->hasMany(ActivityCoupon::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function giftSet()
|
||||||
|
{
|
||||||
|
return $this->hasMany(ActivityGift::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function parts()
|
||||||
|
{
|
||||||
|
return $this->belongsToMany(ProductPart::class, 'activity_product_parts', 'activity_id', 'part_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function coupons()
|
||||||
|
{
|
||||||
|
return $this->belongsToMany(Coupon::class, 'activity_coupons', 'activity_id', 'coupon_id');
|
||||||
|
}
|
||||||
|
|
||||||
|
public function gifts()
|
||||||
|
{
|
||||||
|
return $this->belongsToMany(ProductSku::class, 'activity_gifts', 'activity_id', 'sku_id');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ActivityCoupon extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
public $timestamps = false;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'activity_id', 'coupon_id', 'qty',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ActivityGift extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
public $timestamps = false;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'activity_id', 'sku_id', 'qty',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
|
||||||
|
class ActivityProductPart extends Model
|
||||||
|
{
|
||||||
|
use HasFactory;
|
||||||
|
|
||||||
|
protected $fillable = [
|
||||||
|
'activity_id', 'part_id',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,39 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateActivitiesTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('activities', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->string('title')->comment('标题');
|
||||||
|
$table->string('cover')->nullable()->comment('封面图');
|
||||||
|
$table->text('content')->nullable()->comment('内容');
|
||||||
|
$table->unsignedTinyInteger('is_use')->default(0)->comment('是否上架');
|
||||||
|
$table->timestamp('started_at')->nullable()->comment('开始时间');
|
||||||
|
$table->timestamp('ended_at')->nullable()->comment('结束时间');
|
||||||
|
$table->json('coupons_rule')->nullable()->comment('优惠券规则');
|
||||||
|
$table->json('gifts_rule')->nullable()->comment('赠品规则');
|
||||||
|
$table->timestamps();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('activities');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,34 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateActivityProductPartsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('activity_product_parts', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('activity_id')->comment('活动ID');
|
||||||
|
$table->unsignedBigInteger('part_id')->comment('商品分区ID');
|
||||||
|
|
||||||
|
$table->index(['activity_id', 'part_id']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('activity_product_parts');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateActivityCouponsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('activity_coupons', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('activity_id')->comment('活动ID');
|
||||||
|
$table->unsignedBigInteger('coupon_id')->comment('优惠券ID');
|
||||||
|
$table->unsignedInteger('qty')->comment('数量');
|
||||||
|
|
||||||
|
$table->index(['activity_id', 'coupon_id']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('activity_coupons');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,35 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateActivityGiftsTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('activity_gifts', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedBigInteger('activity_id')->comment('活动ID');
|
||||||
|
$table->unsignedBigInteger('sku_id')->comment('赠品ID');
|
||||||
|
$table->unsignedInteger('qty')->comment('数量');
|
||||||
|
|
||||||
|
$table->index(['activity_id', 'sku_id']);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('activity_gifts');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -119,6 +119,11 @@ class AdminMenuSeeder extends Seeder
|
||||||
'icon' => 'fa fa-paw',
|
'icon' => 'fa fa-paw',
|
||||||
'uri'=>'',
|
'uri'=>'',
|
||||||
'children'=>[
|
'children'=>[
|
||||||
|
[
|
||||||
|
'title' => '活动管理',
|
||||||
|
'icon'=>'',
|
||||||
|
'uri' =>'activities',
|
||||||
|
],
|
||||||
[
|
[
|
||||||
'title' =>'商品分区',
|
'title' =>'商品分区',
|
||||||
'icon' => '',
|
'icon' => '',
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'labels' => [
|
||||||
|
'Activity' => '活动管理',
|
||||||
|
'activity' => '活动管理',
|
||||||
|
],
|
||||||
|
'fields' => [
|
||||||
|
'title' => '标题',
|
||||||
|
'cover' => '封面图',
|
||||||
|
'content' => '内容',
|
||||||
|
'is_use' => '是否上架',
|
||||||
|
'started_at' => '开始时间',
|
||||||
|
'ended_at' => '结束时间',
|
||||||
|
'coupons_rule' => '优惠券规则',
|
||||||
|
'gifts_rule' => '赠品规则',
|
||||||
|
],
|
||||||
|
'options' => [
|
||||||
|
],
|
||||||
|
];
|
||||||
Loading…
Reference in New Issue