From 856385d663cbbfce3fb63b0b33f62f53fd23a06b Mon Sep 17 00:00:00 2001 From: xuanchen <122383162@qq.com> Date: Fri, 17 Mar 2023 16:10:03 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E5=90=8E=E5=8F=B0=E5=8F=91?= =?UTF-8?q?=E8=B4=A7=E5=92=8C=E5=8A=A8=E6=80=81=E8=AE=B0=E5=BD=95=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1600_add_cost_to_mall_goods_skus_table.php | 35 ++++ .../Controllers/Admin/Action/Goods/Down.php | 26 +++ .../Admin/Action/Goods/SkuAction.php | 15 ++ .../Controllers/Admin/Action/Goods/Up.php | 25 +++ .../Admin/SkuMultipleController.php | 193 ++++++++++++++++++ modules/Mall/Traits/HasOrders.php | 5 +- ...08_093708_create_user_sign_texts_table.php | 35 ++++ ..._094001_create_user_sign_banners_table.php | 35 ++++ ...3_17_134736_create_user_dynamics_table.php | 37 ++++ modules/User/Facades/UserSign.php | 1 - .../Controllers/Admin/StockLogController.php | 1 - .../Resources/UserAndIdentityResource.php | 23 +++ modules/User/Models/User.php | 2 + modules/User/Models/UserDynamic.php | 27 +++ modules/User/Traits/WithUserDynamic.php | 66 ++++++ 15 files changed, 520 insertions(+), 6 deletions(-) create mode 100644 modules/Mall/Database/Migrations/2022_06_30_111600_add_cost_to_mall_goods_skus_table.php create mode 100644 modules/Mall/Http/Controllers/Admin/Action/Goods/Down.php create mode 100644 modules/Mall/Http/Controllers/Admin/Action/Goods/SkuAction.php create mode 100644 modules/Mall/Http/Controllers/Admin/Action/Goods/Up.php create mode 100644 modules/Mall/Http/Controllers/Admin/SkuMultipleController.php create mode 100644 modules/User/Database/Migrations/2023_03_08_093708_create_user_sign_texts_table.php create mode 100644 modules/User/Database/Migrations/2023_03_08_094001_create_user_sign_banners_table.php create mode 100644 modules/User/Database/Migrations/2023_03_17_134736_create_user_dynamics_table.php create mode 100644 modules/User/Http/Resources/UserAndIdentityResource.php create mode 100644 modules/User/Models/UserDynamic.php create mode 100644 modules/User/Traits/WithUserDynamic.php diff --git a/modules/Mall/Database/Migrations/2022_06_30_111600_add_cost_to_mall_goods_skus_table.php b/modules/Mall/Database/Migrations/2022_06_30_111600_add_cost_to_mall_goods_skus_table.php new file mode 100644 index 0000000..c47b76e --- /dev/null +++ b/modules/Mall/Database/Migrations/2022_06_30_111600_add_cost_to_mall_goods_skus_table.php @@ -0,0 +1,35 @@ +decimal('sku_cost', 20, 2) + ->comment('商品成本价') + ->after('price') + ->default(0); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('mall_goods_skus', function (Blueprint $table) { + + }); + } +} diff --git a/modules/Mall/Http/Controllers/Admin/Action/Goods/Down.php b/modules/Mall/Http/Controllers/Admin/Action/Goods/Down.php new file mode 100644 index 0000000..ba568aa --- /dev/null +++ b/modules/Mall/Http/Controllers/Admin/Action/Goods/Down.php @@ -0,0 +1,26 @@ +down()) { + return $this->response()->success('下架成功')->refresh(); + } else { + return $this->response()->error('下架失败')->refresh(); + } + } + + public function dialog() + { + $this->confirm('确定下架吗'); + } + +} \ No newline at end of file diff --git a/modules/Mall/Http/Controllers/Admin/Action/Goods/SkuAction.php b/modules/Mall/Http/Controllers/Admin/Action/Goods/SkuAction.php new file mode 100644 index 0000000..5ef02b8 --- /dev/null +++ b/modules/Mall/Http/Controllers/Admin/Action/Goods/SkuAction.php @@ -0,0 +1,15 @@ +getKey().'/multiple'); + } +} \ No newline at end of file diff --git a/modules/Mall/Http/Controllers/Admin/Action/Goods/Up.php b/modules/Mall/Http/Controllers/Admin/Action/Goods/Up.php new file mode 100644 index 0000000..9f54585 --- /dev/null +++ b/modules/Mall/Http/Controllers/Admin/Action/Goods/Up.php @@ -0,0 +1,25 @@ +up()) { + return $this->response()->success('上架成功')->refresh(); + } else { + return $this->response()->error('上架失败')->refresh(); + } + } + + public function dialog() + { + $this->confirm('确定上架吗'); + } +} \ No newline at end of file diff --git a/modules/Mall/Http/Controllers/Admin/SkuMultipleController.php b/modules/Mall/Http/Controllers/Admin/SkuMultipleController.php new file mode 100644 index 0000000..a03d3a4 --- /dev/null +++ b/modules/Mall/Http/Controllers/Admin/SkuMultipleController.php @@ -0,0 +1,193 @@ +header($goods->name) + ->description('价格条目') + ->body($this->form($goods)); + } + + protected function form($goods) + { + $form = new Form(new GoodsSku()); + $groups = $this->attrGroup($goods->specs); + if (! empty($groups)) { + foreach ($groups as $key => $group) { + if ($goods->skus()->count() > 0) { + $sku = $goods->skus()->where('unit', $group['id'])->first(); + } + $form->text('规格'.($key + 1))->disable()->value($group['value']); + $form->hidden("goods[$key][unit]")->value($group['id']); + $form->hidden("goods[$key][sku_cost]")->value(0); +// $form->currency("goods[$key][sku_cost]", '商品成本价') +// ->default(0) +// ->value($sku->sku_cost ?? 0) +// ->required(); + $form->currency("goods[$key][price]", '销售价格') + ->default(0) + ->value($sku->price ?? 0) + ->required(); + $form->image("goods[$key][cover]", '封面图片') + ->move('images/'.date('Y/m/d')) + ->value($sku->cover ?? '') + ->uniqueName() + ->removable() + ->retainable(); +// $form->currency("goods[$key][score]", '共力值') +// ->default(0) +// ->value($sku->score ?? 0) +// ->required(); + $form->hidden("goods[$key][assets]")->value($sku->assets ?? 0); + $form->number("goods[$key][stock]", '商品库存') + ->default(0) + ->value($sku->stock ?? 0) + ->min(1) + ->required(); + $form->text("goods[$key][weight]", '商品重量') + ->default(0) + ->setWidth(2) + ->value($sku->weight ?? 0) + ->required(); + $form->setAction(admin_url('mall/goods/'.$goods->id.'/multiple')); + $form->divider(); + } + } + return $form; + } + + public function store(Request $request, Goods $goods) + { + $data = []; + foreach ($request->goods as $key => $value) { +// if ($value['sku_cost'] <= 0) { +// $error = new MessageBag([ +// 'title' => '错误提示', +// 'message' => '规格'.($key + 1).'商品成本价格式不正确', +// ]); +// return back()->with(compact('error')); +// } + if ($value['price'] <= 0) { + $error = new MessageBag([ + 'title' => '错误提示', + 'message' => '规格'.($key + 1).'销售价格格式不正确', + ]); + return back()->with(compact('error')); + } + if ($value['stock'] <= 0) { + $error = new MessageBag([ + 'title' => '错误提示', + 'message' => '规格'.($key + 1).'库存必须大于0个', + ]); + return back()->with(compact('error')); + } + $verify = GoodsSku::verifyPrice($value['sku_cost'], $value['price']); + if ($verify > 0) { + $error = new MessageBag([ + 'title' => '错误提示', + 'message' => '规格'.($key + 1).'销售价格过低,建议销售价最低为'.$verify, + ]); + return back()->with(compact('error')); + } + $cover = $value['cover'] ?? ''; + if ($cover) { + $file = $cover; + $value['cover'] = $file->store('images/'.date('Y/m/d')); + } + $data[$value['unit']] = $value; + } + if ($goods->skus()->count() > 0) { + foreach ($data as $key => $val) { + $sku = $goods->skus()->where('unit', $key)->first(); + if ($sku) { + $sku->update($val); + unset($data[$key]); + } + } + if (count($data) > 0) { + $goods->skus()->createMany($data); + } + return redirect(admin_url('mall/goods')); + } else { + $result = $goods->skus()->createMany($data); + if ($result) { + return redirect(admin_url('mall/goods')); + } else { + $error = new MessageBag([ + 'title' => '错误提示', + 'message' => '操作失败', + ]); + return back()->with(compact('error')); + } + } + } + + private function attrGroup($specs): array + { + if (empty($specs)) { + return []; + } + $data = []; + foreach ($specs as $key => $spec) { + foreach ($spec->values as $k => $value) { + $data[$key][$k] = [ + 'id' => $value->id, + 'name' => $spec->name, + 'value' => $value->value, + ]; + } + } + $returnData = []; + if (count($data) > 1) { + for ($i = 0; $i < count($data) - 1; $i++) { + if ($i == 0) { + foreach ($data[$i] as $value) { + $returnData[] = [ + 'id' => $value['id'], + 'value' => $value['name'].':'.$value['value'], + ]; + } + } + $tempArray = []; + foreach ($returnData as $value) { + foreach ($data[$i + 1] as $val) { + $tempArray[] = [ + 'id' => $value['id'].'|'.$val['id'], + 'value' => $value['value'].'|'.$val['name'].':'.$val['value'], + ]; + } + } + $returnData = $tempArray; + } + } else { + foreach ($data[0] as $value) { + $returnData[] = [ + 'id' => $value['id'], + 'value' => $value['name'].':'.$value['value'], + ]; + } + $tempArray = []; + foreach ($returnData as $value) { + $tempArray[] = [ + 'id' => $value['id'], + 'value' => $value['value'], + ]; + } + $returnData = $tempArray; + } + return $returnData; + } + +} \ No newline at end of file diff --git a/modules/Mall/Traits/HasOrders.php b/modules/Mall/Traits/HasOrders.php index 9346f5b..859212d 100644 --- a/modules/Mall/Traits/HasOrders.php +++ b/modules/Mall/Traits/HasOrders.php @@ -3,10 +3,7 @@ namespace Modules\Mall\Traits; use Illuminate\Database\Eloquent\Relations\HasMany; -use Modules\Gout\Models\GoutCase; -use Modules\Mall\Models\GoodsSku; use Modules\Mall\Models\Order; -use Modules\Mall\Models\Order as OrderModel; trait HasOrders { @@ -32,7 +29,7 @@ trait HasOrders */ public function canPick(): bool { - return $this->case && $this->case->status == GoutCase::STATUS_PASS && + return $this->case && $this->identities()->where('order', '>', 1)->count() > 0 && $this->userStock->stock > $this->userStock->hold; } diff --git a/modules/User/Database/Migrations/2023_03_08_093708_create_user_sign_texts_table.php b/modules/User/Database/Migrations/2023_03_08_093708_create_user_sign_texts_table.php new file mode 100644 index 0000000..367fb51 --- /dev/null +++ b/modules/User/Database/Migrations/2023_03_08_093708_create_user_sign_texts_table.php @@ -0,0 +1,35 @@ +id(); + $table->text('title'); + $table->text('description')->nullable(); + $table->text('sub_description')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_sign_texts'); + } +} diff --git a/modules/User/Database/Migrations/2023_03_08_094001_create_user_sign_banners_table.php b/modules/User/Database/Migrations/2023_03_08_094001_create_user_sign_banners_table.php new file mode 100644 index 0000000..74f932d --- /dev/null +++ b/modules/User/Database/Migrations/2023_03_08_094001_create_user_sign_banners_table.php @@ -0,0 +1,35 @@ +id(); + $table->boolean('type')->default(1); + $table->text('title'); + $table->text('cover')->nullable(); + $table->boolean('status')->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_sign_banners'); + } +} diff --git a/modules/User/Database/Migrations/2023_03_17_134736_create_user_dynamics_table.php b/modules/User/Database/Migrations/2023_03_17_134736_create_user_dynamics_table.php new file mode 100644 index 0000000..675f7a3 --- /dev/null +++ b/modules/User/Database/Migrations/2023_03_17_134736_create_user_dynamics_table.php @@ -0,0 +1,37 @@ +id(); + $table->unsignedBigInteger('user_id')->index(); + $table->unsignedBigInteger('operator_id')->nullable()->index(); + $table->morphs('orderable'); + $table->string('remark')->nullable(); + $table->text('source')->nullable(); + $table->string('state')->nullable()->comment('状态'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('user_dynamics'); + } +} diff --git a/modules/User/Facades/UserSign.php b/modules/User/Facades/UserSign.php index ad7aea1..c179d81 100644 --- a/modules/User/Facades/UserSign.php +++ b/modules/User/Facades/UserSign.php @@ -6,7 +6,6 @@ use Carbon\Carbon; use DateTime; use Exception; use Illuminate\Support\HigherOrderCollectionProxy; -use Modules\Gout\Models\GoutCase; use Modules\User\Models\SignConfig; use Modules\User\Models\SignLog; use Modules\User\Models\User; diff --git a/modules/User/Http/Controllers/Admin/StockLogController.php b/modules/User/Http/Controllers/Admin/StockLogController.php index 2275369..1b672ef 100644 --- a/modules/User/Http/Controllers/Admin/StockLogController.php +++ b/modules/User/Http/Controllers/Admin/StockLogController.php @@ -5,7 +5,6 @@ namespace Modules\User\Http\Controllers\Admin; use App\Http\Controllers\Controller; use Encore\Admin\Grid; use Encore\Admin\Layout\Content; -use Modules\Gout\Models\GoutCase; use Modules\User\Models\UserStock; use Modules\User\Models\UserStockLog; diff --git a/modules/User/Http/Resources/UserAndIdentityResource.php b/modules/User/Http/Resources/UserAndIdentityResource.php new file mode 100644 index 0000000..0486008 --- /dev/null +++ b/modules/User/Http/Resources/UserAndIdentityResource.php @@ -0,0 +1,23 @@ + $this->id, + 'username' => $this->username, + 'nickname' => $this->info->nickname ?? '', + 'avatar' => $this->info->avatar ?? '', + 'identity' => [ + 'name' => $this->identityFirst()->name, + ], + ]; + } + +} diff --git a/modules/User/Models/User.php b/modules/User/Models/User.php index 5fc7187..4a92376 100644 --- a/modules/User/Models/User.php +++ b/modules/User/Models/User.php @@ -20,6 +20,7 @@ use Modules\User\Models\Traits\HasStock; use Modules\User\Models\Traits\HasVipOrders; use Modules\User\Models\Traits\HasWechat; use Modules\User\Models\Order as UserOrder; +use Modules\User\Traits\WithUserDynamic; use Overtrue\LaravelFavorite\Traits\Favoriter; use Overtrue\LaravelSubscribe\Traits\Subscriber; use SimpleSoftwareIO\QrCode\Facades\QrCode; @@ -46,6 +47,7 @@ class User extends Authenticate Traits\HasRelations, Traits\HasSign; + use WithUserDynamic; const STATUS_INIT = 1; const STATUS_REFUND = 2; diff --git a/modules/User/Models/UserDynamic.php b/modules/User/Models/UserDynamic.php new file mode 100644 index 0000000..8ba3eb6 --- /dev/null +++ b/modules/User/Models/UserDynamic.php @@ -0,0 +1,27 @@ +morphTo(); + } + +} diff --git a/modules/User/Traits/WithUserDynamic.php b/modules/User/Traits/WithUserDynamic.php new file mode 100644 index 0000000..397f09c --- /dev/null +++ b/modules/User/Traits/WithUserDynamic.php @@ -0,0 +1,66 @@ +morphMany(UserDynamic::class, 'orderable'); + } + + /** + * Notes: 我的动态 + * + * @Author: 玄尘 + * @Date: 2023/3/17 14:00 + * @return mixed + */ + public function dynamics() + { + return $this->hasMany(UserDynamic::class); + } + + /** + * Notes: 添加动态 + * + * @Author: 玄尘 + * @Date: 2023/3/17 14:01 + * @param Model $model + * @param int $user_id + * @param int $operator_id 操作人 + * @param string|null $remark + * @param array|null $source + * @return Builder|\Illuminate\Database\Eloquent\Model + */ + public function addDynamic( + Model $model, + int $user_id = 0, + int $operator_id = 0, + string $remark = null, + array $source = null + ) { + return UserDynamic::query() + ->create([ + 'user_id' => $user_id, + 'operator_id' => $operator_id, + 'orderable_type' => get_class($model), + 'orderable_id' => $model->getKey(), + 'remark' => $remark, + 'source' => $source, + ]); + } +} \ No newline at end of file