diff --git a/README.md b/README.md index f93375a..24a0b05 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,9 @@ 6. `php artisan key:generate` 7. `php artisan update:super_admin_permissions` 更新超级管理员角色权限 +#### 更新权限 +`php artisan db:seed --class=PermissionsTableSeeder` + #### 使用说明 1. 阅读并遵守<<[Laravel项目开发规范](https://learnku.com/docs/laravel-specification/9.x/whats-the-use-of-standards/12720)>> diff --git a/app/Console/Commands/BusinessGoodsSkuToLocal.php b/app/Console/Commands/BusinessGoodsSkuToLocal.php index c6efea9..550bdcb 100644 --- a/app/Console/Commands/BusinessGoodsSkuToLocal.php +++ b/app/Console/Commands/BusinessGoodsSkuToLocal.php @@ -38,12 +38,12 @@ class BusinessGoodsSkuToLocal extends Command /** * Execute the console command. * - * @return mixed + * @return void */ public function handle() { $num = 0; - BusinessGoodsSku::chunk(100, function ($businessGoodsSkus) use ($num) { + BusinessGoodsSku::chunk(100, function ($businessGoodsSkus) use (&$num) { foreach ($businessGoodsSkus as $businessGoodsSku) { if (empty($businessGoodsSku['goods_name']) || empty($businessGoodsSku['external_sku_id'])) { continue; diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index d0c1f13..30feaf5 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -27,8 +27,8 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { - // 服务器添加cron入口 - // * * * * * cd /home/wwwroot/erp.staging.chutang66.com && php artisan schedule:run >> /dev/null 2>&1 + // 服务器/etc/crontab添加cron入口 + // * * * * * cd /mnt/wwwroot/erp.chutang66.com && php artisan schedule:run >> /dev/null 2>&1 $schedule->command(Inventory::class)->dailyAt('07:00'); $schedule->command(KttOrderQuery::class)->everyMinute(); $schedule->command(DeleteKttQuery::class)->daily(); diff --git a/app/Filters/GoodsFilter.php b/app/Filters/GoodsFilter.php index 43f7f00..bc0e79f 100644 --- a/app/Filters/GoodsFilter.php +++ b/app/Filters/GoodsFilter.php @@ -11,11 +11,15 @@ class GoodsFilter extends Filters protected function typeId($value) { - return $this->builder->where('type_id', '=', $value); + if($value){ + return $this->builder->where('type_id', '=', $value); + } } protected function brandId($value) { - return $this->builder->where('brand_id', '=', $value); + if($value){ + return $this->builder->where('brand_id', '=', $value); + } } } diff --git a/app/Filters/GoodsSkuFilter.php b/app/Filters/GoodsSkuFilter.php index d4d1c97..9524260 100644 --- a/app/Filters/GoodsSkuFilter.php +++ b/app/Filters/GoodsSkuFilter.php @@ -13,4 +13,9 @@ class GoodsSkuFilter extends Filters { return $this->builder->where('status', '=', $value); } + + protected function excludeIds($value) + { + return $this->builder->whereNotIn('id', $value); + } } diff --git a/app/Filters/GroupGoodsFilter.php b/app/Filters/GroupGoodsFilter.php new file mode 100644 index 0000000..3c9c9eb --- /dev/null +++ b/app/Filters/GroupGoodsFilter.php @@ -0,0 +1,21 @@ +builder->where('goods_name', 'like', "%$value%"); + } + + protected function groupId($value) + { + return $this->builder->where('group_id', '=', $value); + } + + protected function externalSkuId($value) + { + return $this->builder->where('external_sku_id', '=', $value); + } +} diff --git a/app/Filters/GroupsFilter.php b/app/Filters/GroupsFilter.php new file mode 100644 index 0000000..56e76f4 --- /dev/null +++ b/app/Filters/GroupsFilter.php @@ -0,0 +1,23 @@ +builder->where('title', 'like', "%$value%"); + } + + protected function shopId($value) + { + if ($value) { + return $this->builder->where('shop_id', '=', $value); + } + } + + protected function status($value) + { + return $this->builder->where('status', '=', $value); + } +} diff --git a/app/Filters/ShopFilter.php b/app/Filters/ShopFilter.php new file mode 100644 index 0000000..813a52c --- /dev/null +++ b/app/Filters/ShopFilter.php @@ -0,0 +1,11 @@ +builder->where('plat_id', '=', $value)->where('expires_at', '>', time()); + } +} diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index 73b3f02..2e96169 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -72,7 +72,7 @@ class GoodsSkusController extends Controller $query->where('day', $day); }]) ->orderBy('updated_at', 'desc') - ->paginate($request->get('per_page')); + ->paginate(5); foreach ($goodsSkus as &$sku) { $externalSkuId = $sku['goods']['goods_code'] . '_' . $sku['sku_code']; $lastInventoryTime = $sku['daily']['inventory_time']; @@ -480,7 +480,6 @@ class GoodsSkusController extends Controller 'errorMessage' => 'not found inventory file', ]; } - try { $import = new InventoryImport(); $path = $request->file('inventoryFile'); diff --git a/app/Http/Controllers/Group/GroupsController.php b/app/Http/Controllers/Group/GroupsController.php new file mode 100644 index 0000000..2becf78 --- /dev/null +++ b/app/Http/Controllers/Group/GroupsController.php @@ -0,0 +1,146 @@ +filter() + ->paginate($request->get('per_page')); + + return GroupsResource::collection($groups); + } + + public function store(Request $request) + { + $rules = (new GroupsRequest())->rules(); + $validator = Validator::make($request->all(), $rules); + if ($validator->fails()) { + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + + return response($this->res, $this->res['httpCode']); + } + var_dump($request->get('data')); + } + + public function show($id) + { + return new GroupsResource(Groups::query() + ->find($id)); + } + + public function update(Request $request, $id) + { + $rules = (new GroupsRequest())->rules(); + $validator = Validator::make($request->all(), $rules); + if ($validator->fails()) { + $this->setValidatorFailResponse($validator->getMessageBag()->getMessages()); + + return response($this->res, $this->res['httpCode']); + } + var_dump($request->get('data')); + } + + public function destroy() + { + } + + public function getGoods(Request $request) + { + if ($request->get('group_id')) { + $goodsNameLike = ''; + $externalSkuId = $request->get('external_sku_id'); + if (false === strpos($externalSkuId, '_')) { + $goodsNameLike = $externalSkuId; + } + $goods = GroupGoods::query() + ->when($goodsNameLike, function ($query, $goodsNameLike) { + return $query->where('goods_name', 'like', "%$goodsNameLike%"); + }) + ->with(['goodsSku:id,stock']) + ->filter() + ->paginate($request->get('per_page')); + + return GroupGoodsResource::collection($goods); + } + $goodsSkus = GoodsSku::query() + ->whereIn('id', $request->get('ids')) + ->with(['goods' => function ($query) { + $query->with(['type:id,name', 'brand:id,name']); + }]) + ->orderBy('updated_at', 'desc') + ->paginate($request->get('per_page')); + + return GoodsSkuResource::collection($goodsSkus); + } + + public function addGoods(Request $request) + { + var_dump($request->get('ids')); + var_dump($request->get('shop_id')); + var_dump($request->get('group_id')); + } + + public function goodsList(Request $request) + { + $goodsCode = $skuCode = ''; + $goodsKeyword = $request->get('goods_keyword'); + if (false !== strpos($goodsKeyword, '_')) { + [$goodsCode, $skuCode] = explode('_', $goodsKeyword); + $goodsKeyword = ''; + } + $goodsIds = Goods::query() + ->when($goodsKeyword, function ($query, $goodsKeyword) { + return $query->where('title', 'like', "%$goodsKeyword%"); + }) + ->filter() + ->when($goodsCode, function ($query, $goodsCode) { + return $query->where('goods_code', $goodsCode); + }) + ->pluck('id'); + $ids = []; + $goodsSkus = GoodsSku::query() + ->whereIn('goods_id', $goodsIds) + ->whereNotIn('id', $ids) + ->when($skuCode, function ($query, $skuCode) { + return $query->where('sku_code', $skuCode); + }) + ->when($request->get('has_stock'), function ($query) { + return $query->where('stock', '>', 0); + }) + ->filter() + ->with(['goods' => function ($query) { + $query->with(['type:id,name', 'brand:id,name']); + }]) + ->orderBy('updated_at', 'desc') + ->paginate($request->get('per_page')); + + return GoodsSkuResource::collection($goodsSkus); + } +} diff --git a/app/Http/Controllers/Menu/MenusController.php b/app/Http/Controllers/Menu/MenusController.php index 4ee8538..79ca3e4 100644 --- a/app/Http/Controllers/Menu/MenusController.php +++ b/app/Http/Controllers/Menu/MenusController.php @@ -26,7 +26,7 @@ class MenusController extends Controller { $permissions = $request->user()->getPermissionsViaRoles()->toArray(); $permissions = array_column($permissions, 'name'); - $menus = Menu::query()->get()->toArray(); + $menus = Menu::query()->orderBy('parent_id')->orderBy('seq')->get()->toArray(); $hasPermissionMenus = []; foreach ($menus as $menu) { if (in_array($menu['code'], $permissions, true)) { diff --git a/app/Http/Controllers/Shop/ShopsController.php b/app/Http/Controllers/Shop/ShopsController.php index 281cc2f..ade2a69 100644 --- a/app/Http/Controllers/Shop/ShopsController.php +++ b/app/Http/Controllers/Shop/ShopsController.php @@ -17,7 +17,7 @@ class ShopsController extends Controller { public function index(Request $request) { - $shops = Shop::query()->paginate($request->get('per_page')); + $shops = Shop::query()->filter()->paginate($request->get('per_page')); foreach ($shops as $shop) { $shop->authUrl = ''; if ('妙选' !== $shop->plat_id && ('未授权' === $shop->status || '重新授权' === $shop->status)) { diff --git a/app/Http/Requests/GroupsRequest.php b/app/Http/Requests/GroupsRequest.php new file mode 100644 index 0000000..9a5bc7d --- /dev/null +++ b/app/Http/Requests/GroupsRequest.php @@ -0,0 +1,45 @@ + ['required', 'integer', 'exists:shops,id'], + 'title' => ['required', 'string'], + 'start_time' => ['required', 'string'], + 'end_time' => ['required', 'string'], + 'data' => ['required', 'array'], + 'data.*.category_name' => ['required', 'string'], + 'data.*.type_id' => ['required', 'integer'], + 'data.*.goods_name' => ['required', 'string'], + 'data.*.goods_id' => ['required', 'integer'], + 'data.*.limit_buy' => ['integer'], + 'data.*.sku_id' => ['required', 'integer'], + 'data.*.external_sku_id' => ['required', 'string'], + 'data.*.price_in_fen' => ['required', 'number'], + 'data.*.sort' => ['required', 'integer'], + 'is_save_preview' => ['required', 'integer'] + ]; + } +} diff --git a/app/Http/Resources/GroupGoodsResource.php b/app/Http/Resources/GroupGoodsResource.php new file mode 100644 index 0000000..10aedff --- /dev/null +++ b/app/Http/Resources/GroupGoodsResource.php @@ -0,0 +1,19 @@ +hasOne(Goods::class, 'id', 'goods_id'); + } + + public function goodsSku() + { + return $this->hasOne(GoodsSku::class, 'id', 'sku_id'); + } +} diff --git a/app/Models/Groups.php b/app/Models/Groups.php new file mode 100644 index 0000000..8f366d7 --- /dev/null +++ b/app/Models/Groups.php @@ -0,0 +1,17 @@ +bigIncrements('id'); + $table->unsignedInteger('shop_id'); + $table->unsignedBigInteger('end_time'); + $table->unsignedTinyInteger('is_save_preview')->comment('是否保存为预览团0-不为预览团,1-预览团'); + $table->unsignedBigInteger('start_time'); + $table->text('title'); + $table->string('activity_no')->nullable()->comment('团号'); + $table->unsignedTinyInteger('create_status')->default(3)->comment('1-创建成功,2-创建失败,3-创建中'); + $table->string('error_msg')->nullable()->comment('create_status为2时有,创建团失败原因'); + $table->text('qr_code_url')->nullable()->comment('create_status为1时有,团小程序二维码图片地址'); + $table->unsignedBigInteger('create_time')->nullable(); + $table->unsignedTinyInteger('is_help_sell')->nullable()->comment('是否帮卖0-我发布的,1-我帮卖的'); + $table->tinyInteger('status')->comment('团状态(-10:待发布/预览中,-5:未开始,1:跟团中,20:已结束,30:已删除'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('groups'); + } +} diff --git a/database/migrations/2022_10_20_095419_create_group_goods_table.php b/database/migrations/2022_10_20_095419_create_group_goods_table.php new file mode 100644 index 0000000..ab2e362 --- /dev/null +++ b/database/migrations/2022_10_20_095419_create_group_goods_table.php @@ -0,0 +1,51 @@ +bigIncrements('id'); + $table->unsignedBigInteger('group_id'); + $table->string('category_name'); + $table->unsignedBigInteger('type_id'); + $table->string('goods_desc')->nullable(); + $table->string('goods_name'); + $table->unsignedBigInteger('goods_id'); + $table->unsignedInteger('ktt_goods_id'); + $table->unsignedInteger('limit_buy')->default(0); + $table->unsignedBigInteger('market_price')->default(0); + $table->text('pic_url_list')->nullable(); + $table->unsignedBigInteger('sku_id'); + $table->unsignedInteger('ktt_sku_id'); + $table->string('external_sku_id'); + $table->unsignedBigInteger('price_in_fen'); + $table->unsignedTinyInteger('quantity_type')->default(0)->comment('库存类型,0-普通 1-无限,无限库存时会无视total_quantity字段'); + $table->text('spec_id_list')->nullable()->comment('规格id列表,无规格为空list,如果想规格为红色,M,调用生成规格的id,红色为1,M为3,则应传入[1,3]'); + $table->text('thumb_url')->nullable()->comment('sku图url,注意sku图格式必须是jpg、jpeg、png中的一个,且尺寸不得大于1200*1200,大小不大于1MB,可以不填'); + $table->unsignedInteger('total_quantity')->default(0)->comment('总库存,最多100w'); + $table->integer('sort')->default(0); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('group_goods'); + } +} diff --git a/database/seeds/MenusTableSeeder.php b/database/seeds/MenusTableSeeder.php index 5ba89b9..38d75f8 100644 --- a/database/seeds/MenusTableSeeder.php +++ b/database/seeds/MenusTableSeeder.php @@ -20,20 +20,22 @@ class MenusTableSeeder extends Seeder ['parent_id' => $id, 'code' => 'GOODS_BRAND', 'name' => '商品品牌', 'seq' => 2], ]); // 店铺管理 - DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'SHOP_MANAGE', 'name' => '店铺管理', 'seq' => 1]); + DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'SHOP_MANAGE', 'name' => '店铺管理', 'seq' => 10]); // 用户管理 - DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'USER_MANAGE', 'name' => '用户管理', 'seq' => 2]); + DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'USER_MANAGE', 'name' => '用户管理', 'seq' => 20]); // 系统管理-(角色管理,权限管理,系统日志) - $id = DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'SYSTEM_MANAGE', 'name' => '系统管理', 'seq' => 3]); + $id = DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'SYSTEM_MANAGE', 'name' => '系统管理', 'seq' => 30]); DB::table('menus')->insert([ ['parent_id' => $id, 'code' => 'ROLE_MANAGE', 'name' => '角色管理', 'seq' => 0], // ['parent_id' => $id,'code' => 'PERMISSION_MANAGE', 'name' => '权限管理', 'seq' => 1], ['parent_id' => $id, 'code' => 'SYSTEM_LOG', 'name' => '系统日志', 'seq' => 2], ]); // 平台 - $id = DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'PLAT', 'name' => '平台', 'seq' => 4]); + $id = DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'PLAT', 'name' => '平台', 'seq' => 40]); DB::table('menus')->insert([ ['parent_id' => $id, 'code' => 'PLAT_GOODS_LIST', 'name' => '货品列表', 'seq' => 0], ]); + // 团购 + DB::table('menus')->insertGetId(['parent_id' => 0, 'code' => 'GROUP_MANAGEMENT', 'name' => '团购管理', 'seq' => 1]); } } diff --git a/resources/frontend/src/api/goods.js b/resources/frontend/src/api/goods.js index e3b1ba3..328ed45 100644 --- a/resources/frontend/src/api/goods.js +++ b/resources/frontend/src/api/goods.js @@ -2,86 +2,95 @@ import http from "@/util/http.js"; //店铺订单 export function shops(params) { - return http({ - url: "/api/count/orders/num", - method: "get", - params, - }); + return http({ + url: "/api/count/orders/num", + method: "get", + params, + }); } // 商品管理列表 export function goods(params) { - return http({ - url: "/api/goods_skus", - method: "get", - params, - }); + return http({ + url: "/api/goods_skus", + method: "get", + params, + }); } // 新建商品 export function addGoods(data) { - return http({ - url: "/api/goods", - method: "post", - data, - }); + return http({ + url: "/api/goods", + method: "post", + data, + }); } // 查看商品 export function checkGoods(id) { - return http({ - url: `/api/goods_skus/${id}`, - method: "get", - }); + return http({ + url: `/api/goods_skus/${id}`, + method: "get", + }); } // 商品列表 export function goodsList(params) { - return http({ - url: "/api/goods", - method: "get", - params, - }); + return http({ + url: "/api/goods", + method: "get", + params, + }); } // 更新商品 export function updateGoods(id, data) { - return http({ - url: `/api/goods_skus/${id}`, - method: "patch", - data, - }); + return http({ + url: `/api/goods_skus/${id}`, + method: "patch", + data, + }); } // 上新/库存盘点/库存 export function update(data) { - return http({ - url: "/api/batch/goods_skus", - method: "patch", - data, - }); + return http({ + url: "/api/batch/goods_skus", + method: "patch", + data, + }); } // 单个字段更新 export function singleUpdate(id, data) { - return http({ - url: `/api/single/goods_skus/${id}`, - method: "patch", - data, - }); + return http({ + url: `/api/single/goods_skus/${id}`, + method: "patch", + data, + }); } // 图片上传 export function imgUpload(data, item) { - return http({ - url: "/api/upload", - Headers: item, - method: "post", - data, - }); + return http({ + url: "/api/upload", + Headers: item, + method: "post", + data, + }); } // 表格导出 export function tableExport(params) { - return http({ - url: "/goods_skus/export", - method: "get", - params, - }); + return http({ + url: "/goods_skus/export", + method: "get", + params, + }); +} + +// 商品列表(添加) +export function getGoodsList(params) { + return http({ + url: "/api/goodsList", + method: "get", + params, + }); } diff --git a/resources/frontend/src/api/group.js b/resources/frontend/src/api/group.js index a67d39d..927c4d6 100644 --- a/resources/frontend/src/api/group.js +++ b/resources/frontend/src/api/group.js @@ -43,3 +43,12 @@ export function getGroupGoods(params) { params, }); } + +// 增加团购商品 +export function addGroupGoods(params) { + return http({ + url: `/api/groupGoods`, + method: "post", + params, + }); +} diff --git a/resources/frontend/src/views/group/addGroup.vue b/resources/frontend/src/views/group/addGroup.vue index b35daca..ba4afca 100644 --- a/resources/frontend/src/views/group/addGroup.vue +++ b/resources/frontend/src/views/group/addGroup.vue @@ -1,33 +1,38 @@