Browse Source

feat:产品导入等

igb 5 months ago
parent
commit
f8ea6e158a

+ 35 - 0
app/Distributor/Actions/Extensions/DistProductImport.php

@@ -0,0 +1,35 @@
+<?php
+namespace App\Distributor\Actions\Extensions;
+
+use Dcat\Admin\Grid\Tools\AbstractTool;
+
+class DistProductImport extends AbstractTool
+{
+    protected $style = 'btn btn-success';
+
+    public function title()
+    {
+        return '<i class="feather icon-shopping-cart"></i> &nbsp;'.admin_trans('admin.dist_product_import');
+    }
+
+    public function html()
+    {
+        return parent::html().'&nbsp;';
+    }
+
+    public function render()
+    {
+        $prefix = config('admin.route.prefix');
+        // 定义你要跳转的 URL
+        $url = "/{$prefix}/import-product";
+
+        // 生成按钮的 HTML
+        $html = <<<HTML
+<a href="{$url}" class="{$this->style}" target="_blank">
+    {$this->title()}
+</a>
+HTML;
+
+        return $html;
+    }
+}

+ 1 - 0
app/Distributor/Controllers/AuthController.php

@@ -38,6 +38,7 @@ class AuthController extends BaseAuthController
         }
 
         if ($this->guard()->attempt($credentials, $remember)) {
+
             //登录成功后从dist_admin_distributor表中取出当前登录用户的公司信息
             $distributor = DistAdminDistributor::where('id', Admin::user()->dist_id)->first();
             if (!$distributor) {

+ 7 - 1
app/Distributor/Controllers/DistProductCategoryController.php

@@ -16,6 +16,7 @@ class DistProductCategoryController extends AdminController
 {
 
 
+
     /**
      * page index
      */
@@ -72,7 +73,7 @@ class DistProductCategoryController extends AdminController
 
         return Grid::make(new DistProductCategory(), function (Grid $grid) {
 
-            //$grid->model()->where('dist_user_id', 1);
+            //$grid->model()->where('dist_user_id', 1);//这里限不了,改为仓库限制
 
             $grid->column('id','ID')->bold();//->sortable();
             $grid->column('name')->display(function ($name) {
@@ -122,6 +123,11 @@ class DistProductCategoryController extends AdminController
                 ->rules('numeric')
                 ->help(admin_trans_label('order_tips')); // 添加备注
             $form->switch('enabled')->default(1);
+            $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            // 在保存时进行验证
+            $form->saving(function (Form $form) {
+                $form->dist_id =getDistributorId();
+            });
           //  $form->select('parameter_id', 'parameter')->options(DistProductParameter::selectOptions())->required();// DIST不需要绑定 parameter
           //  $form->display('created_at');
           //  $form->display('updated_at');

+ 58 - 14
app/Distributor/Controllers/DistProductController.php

@@ -2,19 +2,19 @@
 
 namespace App\Distributor\Controllers;
 
+use App\Admin\Repositories\BaseProductImage;
+use App\Distributor\Actions\Extensions\DistProductImport;
+use App\Distributor\Repositories\DistProduct;
+use App\Distributor\Repositories\DistProductCategory;
+use App\Libraries\CommonHelper;
 use Dcat\Admin\Admin;
-use Dcat\Admin\Layout\Content;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
-use Dcat\Admin\Show;
 use Dcat\Admin\Http\Controllers\AdminController;
-
-use App\Distributor\Repositories\DistProduct;
-use App\Distributor\Repositories\DistProductCategory;
-use App\Distributor\Repositories\DistProductImage;
-
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Show;
 use Illuminate\Http\Request;
-use App\Libraries\CommonHelper;
+
 class DistProductController extends AdminController
 {
     /**
@@ -26,8 +26,10 @@ class DistProductController extends AdminController
             ->header(admin_trans( 'admin.products_list'))
             ->description(admin_trans('admin.all'))
             ->description('all')
-            ->breadcrumb(['text'=>'Product Management','url'=>''])
+            //->breadcrumb(['text'=>'Product Management','url'=>''])
+
             ->body($this->grid());
+
     }
 
     /**
@@ -55,8 +57,8 @@ class DistProductController extends AdminController
      */
     public function create(Content $content)
     {
-
         return $content
+            ->header('Product')
             ->translation($this->translation())
             ->title(admin_trans('admin.product'))
             ->description($this->description()['create'] ?? trans('admin.create'))
@@ -70,17 +72,26 @@ class DistProductController extends AdminController
     protected function grid()
     {
         return Grid::make(DistProduct::with(['distProductCategory','images']), function (Grid $grid) {
+            $grid->model()->where('dist_id', getDistributorId());
             $grid->column('id','ID')->sortable();
             $grid->column('title');
             $grid->column('sku');
             $grid->column('dist_product_category.name',admin_trans_label('category_name'));
             $grid->column('issuance_date');
             $grid->column('images')->display(function ($images) {
+
                 $images = $images->toArray();
                 $dataImages = array_column($images, 'image_url');
-                return CommonHelper::displayImage($dataImages,150);
+
+                // 限制最多显示2个缩略图
+                $dataImages = array_slice($dataImages, 0, 2);
+
+                return CommonHelper::displayImage($dataImages,60);
+
+
+
             });
-            $grid->column('order')->orderable();
+            //$grid->column('order')->orderable();
             $grid->column('is_pinned')->switch();
             $grid->column('enabled')->switch();
             $grid->column('created_at');
@@ -89,11 +100,16 @@ class DistProductController extends AdminController
             $grid->filter(function (Grid\Filter $filter) {
                 $filter->equal('sku');
                 $filter->like('title');
-                $filter->equal('category_id','Category')->select(DistProductCategory::selectOptions());
-                $filter->equal('enabled', 'enabled')->select(config('dictionary.enabled'));
+                $filter->equal('category_id',admin_trans_label('category'))->select(DistProductCategory::selectOptions());
+                $filter->equal('enabled', admin_trans_label('enabled'))->select(array_map('admin_trans_label', config('dictionary.enabled')));
             });
             //排序
             $grid->model()->orderBy("is_pinned",'desc')->orderBy("order",'desc');
+            // 传入数组
+            $grid->tools([
+                new DistProductImport(),
+            ]);
+
         });
 
     }
@@ -108,6 +124,10 @@ class DistProductController extends AdminController
     protected function detail($id)
     {
         return Show::make($id, DistProduct::with(['distProductCategory','images']), function (Show $show) {
+            // 比较 dist_id 和 getDistributorId(),如果不相同则返回 404
+            if ($show->model()->dist_id !== getDistributorId()) {
+                abort(404);
+            }
             $show->field('id');
             $show->field('title');
             $show->field('keywords');
@@ -187,8 +207,32 @@ class DistProductController extends AdminController
             $form->editor('content');
             $form->switch('is_pinned')->default(0);
             $form->switch('enabled')->default(1);
+            $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+
             //插入JS
             $this->addParametersJs();
+            // 在保存时进行验证
+            $form->saving(function (Form $form) {
+                $form->dist_id =getDistributorId();//保存时直接写死dist_id
+
+                if (!$form->isCreating()) {
+                    // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
+                    $currentDistProduct = DistProduct::findById($form->getKey());
+                    if ($currentDistProduct && $currentDistProduct->dist_id !== $form->dist_id) {
+                        throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                    }
+                }
+
+                //保存前回调删除图片
+                if (!$form->isCreating()) {
+                    //清空图片
+                    $id = $form->getKey();
+                    $baseProductImage = new BaseProductImage();
+                    $baseProductImage->model()->where('product_id', $id)->delete();
+                }
+
+
+            });
         });
     }
 

+ 85 - 0
app/Distributor/Controllers/DistProductImageController.php

@@ -0,0 +1,85 @@
+<?php
+
+namespace App\Distributor\Controllers;
+
+use App\Distributor\Repositories\DistProductImage;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Http\Controllers\AdminController;
+use Dcat\Admin\Layout\Content;
+use Dcat\Admin\Admin;
+
+class DistProductImageController extends AdminController
+{
+    /**
+     * page index
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header('列表')
+            ->description('全部')
+            ->breadcrumb(['text'=>'列表','url'=>''])
+            ->body($this->grid());
+    }
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(new DistProductImage(), function (Grid $grid) {
+            $grid->column('id')->sortable();
+            $grid->column('image_url');
+            $grid->column('product_id');
+            $grid->column('order');
+            $grid->column('created_at');
+            $grid->column('updated_at')->sortable();
+        
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('id');
+        
+            });
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new DistProductImage(), function (Show $show) {
+            $show->field('id');
+            $show->field('image_url');
+            $show->field('product_id');
+            $show->field('order');
+            $show->field('created_at');
+            $show->field('updated_at');
+        });
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        return Form::make(new DistProductImage(), function (Form $form) {
+            $form->display('id');
+            $form->text('image_url');
+            $form->text('product_id');
+            $form->text('order');
+        
+            $form->display('created_at');
+            $form->display('updated_at');
+        });
+    }
+}

+ 19 - 3
app/Distributor/Controllers/DistVideoCategoryController.php

@@ -2,6 +2,7 @@
 
 namespace App\Distributor\Controllers;
 
+use App\Distributor\Repositories\DistVideo;
 use App\distributor\Repositories\DistVideoCategory;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
@@ -33,6 +34,8 @@ class DistVideoCategoryController extends AdminController
     {
 
         return Grid::make(new DistVideoCategory(), function (Grid $grid) {
+
+            $grid->model()->where('dist_id', getDistributorId());//这里限不了,改为仓库限制
             $grid->column('id')->sortable();
             $grid->column('name')->tree(true,true);
             $grid->column('parent_id');
@@ -40,7 +43,7 @@ class DistVideoCategoryController extends AdminController
             $grid->column('enabled')->switch();
             $grid->column('created_at');
             $grid->column('updated_at')->sortable();
-            $grid->quickSearch('name');
+            //$grid->quickSearch('name');
             //按钮
             $grid->disableViewButton();
             $grid->showQuickEditButton();
@@ -58,13 +61,26 @@ class DistVideoCategoryController extends AdminController
     {
         return Form::make(new DistVideoCategory(), function (Form $form) {
             $form->display('id');
-            $form->text('name');
+            $form->text('name')->required();
             $form->select('parent_id', admin_trans_field('parent'))
-                ->options(DistVideoCategory::selectOptions())
+                ->options([0 =>admin_trans_label('root')]) // 只显示 0 => root
                 ->saving(function ($v) {
                     return (int) $v;
                 });
             $form->switch('enabled')->default(1);
+            $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            $form->saving(function (Form $form) {
+                $form->dist_id =getDistributorId();//保存时直接写死dist_id
+
+                if (!$form->isCreating()) {
+                    // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
+                    $current = DistVideoCategory::findById($form->getKey());
+                    if ($current && $current->dist_id !== $form->dist_id) {
+                        throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                    }
+                }
+            });
+
         });
     }
 }

+ 38 - 8
app/Distributor/Controllers/DistVideoController.php

@@ -27,6 +27,15 @@ class DistVideoController extends AdminController
             ->body($this->grid());
     }
 
+    public function create(Content $content)
+    {
+        return $content
+            ->translation($this->translation())
+            ->title(admin_trans('admin.video'))
+            ->description($this->description()['create'] ?? trans('admin.create'))
+            ->body($this->form());
+    }
+
     /**
      * Make a grid builder.
      *
@@ -35,9 +44,11 @@ class DistVideoController extends AdminController
     protected function grid()
     {
         return Grid::make(DistVideo::with(['distVideoCategory']), function (Grid $grid) {
+            $grid->model()->where('dist_id', getDistributorId());
+
             $grid->column('id')->sortable();
             $grid->column('title');
-            $grid->column('dist_video_category.name','Category Name');
+            $grid->column('dist_video_category.name',admin_trans_label('category_name'));
             $grid->column('cover_image')->display(function ($image) {
                 // 开始生成 HTML
                 $dataImages = [$image];
@@ -52,8 +63,10 @@ class DistVideoController extends AdminController
             $grid->filter(function (Grid\Filter $filter) {
                 $filter->equal('sku');
                 $filter->like('title');
-                $filter->equal('category_id','Category')->select(DistVideoCategory::selectOptions());
-                $filter->equal('enabled', 'enabled')->select(config('dictionary.enabled'));
+                $filter->equal('category_id',admin_trans_label('category'))->select(DistVideoCategory::selectOptions());
+                $filter->equal('enabled', admin_trans_label('enabled'))->select(array_map('admin_trans_label', config('dictionary.enabled')));
+
+
             });
             //排序
             $grid->model()->orderBy("is_pinned",'desc')->orderBy("order",'desc');
@@ -70,10 +83,15 @@ class DistVideoController extends AdminController
      */
     protected function detail($id)
     {
-        return Show::make($id, DistVideo::with(['baseVideoCategory']), function (Show $show) {
+        return Show::make($id, DistVideo::with(['distVideoCategory']), function (Show $show) {
+
+            // 比较 dist_id 和 getDistributorId(),如果不相同则返回 404
+            if ($show->model()->dist_id !== getDistributorId()) {
+                abort(404);
+            }
             $show->field('id');
             $show->field('title');
-            $show->field('base_video_category.name','Category Name');
+            $show->field('dist_video_category.name',admin_trans_label('category_name'));
             $show->field('cover_image')->as(function ($image) {
                 // 开始生成 HTML
                 $dataImages = [$image];
@@ -116,19 +134,31 @@ class DistVideoController extends AdminController
         return Form::make(new DistVideo(), function (Form $form) {
             $form->display('id');
             $form->text('title')->required();
-            $form->select('category_id', 'Category Name')
+            $form->select('category_id', admin_trans_label('category_name'))
                 ->options(DistVideoCategory::selectOptions())
                 ->required();
-            $form->image("cover_image")
+            $form->image("cover_image", admin_trans_label('cover_image'))
                 ->autoUpload()
                 ->uniqueName()
                 ->accept(config('admin.upload.oss_image.accept'))
                 ->maxSize(config('admin.upload.oss_image.max_size'))
                 ->dir('images/video/'.date("Ymd"));//
-            $form->url("video_url")->required();
+            $form->url("video_url", admin_trans_label('video_url'))->required();
             $form->editor('remark');
             $form->switch('is_pinned')->default(0);
             $form->switch('enabled')->default(1);
+            $form->hidden('dist_id'); // 隐藏dist_id字段,用于保存
+            $form->saving(function (Form $form) {
+                $form->dist_id =getDistributorId();//保存时直接写死dist_id
+
+                if (!$form->isCreating()) {
+                    // 验证主键 ID 的 dist_id 是否与 session 的 dist_id 一致
+                    $currentDistProduct = DistVideo::findById($form->getKey());
+                    if ($currentDistProduct && $currentDistProduct->dist_id !== $form->dist_id) {
+                        throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                    }
+                }
+            });
         });
     }
 }

+ 157 - 0
app/Distributor/Controllers/ImportProductController.php

@@ -0,0 +1,157 @@
+<?php
+
+namespace App\Distributor\Controllers;
+
+use App\Distributor\Repositories\BaseProduct;
+use App\Admin\Repositories\BaseProductCategory;
+use App\Distributor\Actions\BatchCopy;
+use App\Distributor\Repositories\DistProductCategory;
+use Dcat\Admin\Form;
+use Dcat\Admin\Grid;
+use Dcat\Admin\Show;
+use Dcat\Admin\Http\Controllers\AdminController;
+use Dcat\Admin\Layout\Content;
+
+use Dcat\Admin\Admin;
+
+class ImportProductController extends AdminController
+{
+    /**
+     * page index
+     */
+    public function index(Content $content)
+    {
+        return $content
+            ->header('倒入产品')
+            ->description('<span style="color: red; font-weight: bold;">After select,click "Selected" to import products.</span>')
+            ->breadcrumb(['text'=>'列表','url'=>''])
+            ->body($this->grid());
+    }
+
+
+
+    //屏蔽删除
+    public function destroy($id)
+    {
+        abort(404);
+    }
+
+    //屏蔽创建
+    public function create(Content $content)
+    {
+        abort(404);
+    }
+
+    //屏蔽编辑
+    public function edit($id, Content $content)
+    {
+        abort(404);
+    }
+
+
+    /**
+     * Make a grid builder.
+     *
+     * @return Grid
+     */
+    protected function grid()
+    {
+        return Grid::make(new BaseProduct(), function (Grid $grid) {
+            $grid->column('id')->sortable();
+            $grid->column('title');
+            $grid->column('keywords');
+            $grid->column('description');
+            $grid->column('sku');
+            $grid->column('category_id');
+            $grid->column('issuance_date');
+
+            // 筛选
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->equal('sku');
+                $filter->like('title');
+                $filter->equal('category_id',admin_trans_label('category'))->select(BaseProductCategory::selectOptions());
+                $filter->equal('enabled', admin_trans_label('enabled'))->select(array_map('admin_trans_label', config('dictionary.enabled')));
+            });
+            //$grid->column('order');
+           //$grid->column('enabled');
+            ///$grid->column('content');
+            //$grid->column('parameters');
+            //$grid->column('is_pinned');
+            // 删除新增按钮
+            $grid->disableCreateButton();
+//            $grid->column('created_at');
+//            $grid->column('updated_at')->sortable();
+
+
+//            $grid->filter(function (Grid\Filter $filter) {
+//                $filter->equal('id');
+//
+//            });
+
+            //$grid->disableViewButton();
+            $grid->disableEditButton();
+            $grid->disableDeleteButton();
+            $grid->disableBatchDelete();
+            // 添加批量复制操作
+            $grid->batchActions(function ($batch) {
+                $batch->add(new BatchCopy());
+            });
+
+
+        });
+    }
+
+    /**
+     * Make a show builder.
+     *
+     * @param mixed $id
+     *
+     * @return Show
+     */
+    protected function detail($id)
+    {
+        return Show::make($id, new BaseProduct(), function (Show $show) {
+            $show->field('id');
+            $show->field('title');
+            $show->field('keywords');
+            $show->field('description');
+            $show->field('sku');
+            $show->field('category_id');
+            $show->field('issuance_date');
+            $show->field('order');
+            $show->field('enabled');
+            $show->field('content');
+            $show->field('parameters');
+            $show->field('is_pinned');
+            $show->field('created_at');
+            $show->field('updated_at');
+        });
+    }
+
+    /**
+     * Make a form builder.
+     *
+     * @return Form
+     */
+    protected function form()
+    {
+        return Form::make(new BaseProduct(), function (Form $form) {
+            $form->display('id');
+            $form->text('title');
+            $form->text('keywords');
+            $form->text('description');
+            $form->text('sku');
+            $form->text('category_id');
+            $form->text('issuance_date');
+            $form->text('order');
+            $form->text('enabled');
+            $form->text('content');
+            $form->text('parameters');
+            $form->text('is_pinned');
+
+            $form->display('created_at');
+            $form->display('updated_at');
+
+        });
+    }
+}

+ 116 - 0
app/Distributor/Forms/ImportProduct.php

@@ -0,0 +1,116 @@
+<?php
+
+namespace App\Distributor\Forms;
+use App\Distributor\Repositories\DistProductCategory;
+use App\Models\DistProduct;
+use App\Models\BaseProductImage;
+use App\Models\DistProductImage;
+use App\Distributor\Repositories\BaseProduct;
+use Dcat\Admin\Widgets\Form;
+
+class ImportProduct extends Form
+{
+    /**
+     * Handle the form request.
+     *
+     * @param array $input
+     *
+     * @return mixed
+     */
+    public function handle(array $input)
+    {
+        // dump($input);
+
+        // return $this->response()->error('Your error message.');
+
+
+        // 获取输入的 product_ids 和 category_id
+        $productIds = explode(',', $input['product_ids']);
+        $categoryId = $input['category_id'];
+
+        try {
+            foreach ($productIds as $productId) {
+                // 从 BaseProduct 获取产品数据
+                $baseProduct = BaseProduct::findById($productId);
+
+                if (!$baseProduct) {
+                    throw new \Exception("Product with ID $productId not found in BaseProduct.");
+                }
+// 获取 base_product_image 表中与当前 base_product 相关的图片记录
+                $baseProductImages = BaseProductImage::where('product_id', $baseProduct->id)->get();
+
+                // 创建新的 DistProduct 记录
+                $distProduct = DistProduct::create([
+                    'category_id' => $categoryId,
+                    'title' => $baseProduct->title,
+                    'keywords' => $baseProduct->keyword, // 注意这里是 'keywords' 而不是 'keyword'
+                    'description' => $baseProduct->description,
+                    'sku' => $baseProduct->sku, // 假设 $baseProduct 也有 sku 字段
+                    'issuance_date' => $baseProduct->issuance_date, // 假设 $baseProduct 也有 issuance_date 字段
+                    'order' => $baseProduct->order, // 假设 $baseProduct 也有 order 字段
+                    'enabled' => $baseProduct->enabled, // 假设 $baseProduct 也有 enabled 字段
+                    'content' => $baseProduct->content, // 假设 $baseProduct 也有 content 字段
+                    'parameters' => $baseProduct->parameters, // 假设 $baseProduct 也有 parameters 字段
+                    'is_pinned' => 0, // 假设 $baseProduct 也有 is_pinned 字段
+                    'dist_id' => getDistributorId(),
+                    'created_at' => now(), // 自动填充创建时间
+                    'updated_at' => now(), // 自动填充更新时间
+                ]);
+
+                // 遍历 base_product_image 表中的记录,并插入到 dist_product_image 表中
+                foreach ($baseProductImages as $baseImage) {
+                    DistProductImage::create([
+                        'image_url' => $baseImage->image_url,
+                        'product_id' => $distProduct->id, // 使用新创建的 DistProduct 的 ID
+                        'order' => $baseImage->order,
+                        'created_at' => now(), // 自动填充创建时间
+                        'updated_at' => now(), // 自动填充更新时间
+                    ]);
+                }
+
+            }
+
+            return $this
+                ->response()
+                ->success('导入成功')
+                ->refresh();
+        } catch (\Exception $e) {
+
+            return $this
+                ->response()
+                ->error('导入失败: ' . $e->getMessage());
+        }
+//
+//        return $this
+//				->response()
+//				->success('导入成功')
+//				->refresh();
+    }
+
+    /**
+     * Build a form here.
+     */
+    public function form()
+    {
+//        $this->text('name')->required();
+//        $this->email('email')->rules('email');
+        // 设置隐藏表单,传递用户id
+        $this->select('category_id', admin_trans_label('category_name'))
+            ->options(DistProductCategory::selectOptions())
+            ->required();
+        $this->hidden('product_ids')->attribute('id', 'product_ids');
+    }
+
+    /**
+     * The data of the form.
+     *
+     * @return array
+     */
+    public function default()
+    {
+        return [
+//            'name'  => 'John Doe',
+//            'email' => 'John.Doe@gmail.com',
+        ];
+    }
+}

+ 14 - 0
app/Distributor/Models/BaseProduct.php

@@ -0,0 +1,14 @@
+<?php
+
+namespace App\Distributor\Models;
+
+use Dcat\Admin\Traits\HasDateTimeFormatter;
+
+use Illuminate\Database\Eloquent\Model;
+
+class BaseProduct extends Model
+{
+	use HasDateTimeFormatter;
+    protected $table = 'base_product';
+    
+}

+ 21 - 0
app/Distributor/Repositories/BaseProduct.php

@@ -0,0 +1,21 @@
+<?php
+
+namespace App\Distributor\Repositories;
+
+use App\Distributor\Models\BaseProduct as Model;
+use Dcat\Admin\Repositories\EloquentRepository;
+
+class BaseProduct extends EloquentRepository
+{
+    /**
+     * Model.
+     *
+     * @var string
+     */
+    protected $eloquentClass = Model::class;
+
+    public static function findById($id)
+    {
+        return Model::find($id); // 查找并返回相应的记录
+    }
+}

+ 17 - 2
app/Distributor/Repositories/DistProduct.php

@@ -18,9 +18,24 @@ class DistProduct extends EloquentRepository
     public function delete(Form $form, array $originalData)
     {
         collect(explode(',', $form->getKey()))->filter()->each(function ($id) {
-            Model::find($id)->images()->delete();
-            Model::find($id)->delete();
+
+            $product = Model::find($id);
+            if ($product) {
+                // 验证 dist_id
+                if ($product->dist_id !== getDistributorId()) {
+                    throw new \Exception('Unable to modify the product because the distributor ID does not match.');
+                    return;
+                }
+                Model::find($id)->images()->delete();
+                Model::find($id)->delete();
+            }
         });
         return true;
     }
+
+    public static function findById($id)
+    {
+        return Model::find($id); // 查找并返回相应的记录
+    }
+
 }

+ 19 - 6
app/Distributor/Repositories/DistProductCategory.php

@@ -17,13 +17,26 @@ class DistProductCategory extends EloquentRepository
      */
     protected $eloquentClass = Model::class;
 
+    public function __construct()
+    {
+
+    }
 
     // 调用模型方法
     public static function selectMainOptions(\Closure $closure = null)
     {
+        // 获取当前登录的分销商/经销商
+        $distributor=Session::get('distributor');
+
+        // 过滤分销商
+        if (!$distributor)
+        {
+            return false;
+        }
 
         $query = Model::query();
 
+        //通过传入条件限制
         if ($closure) {
             $closure($query);
         }
@@ -33,6 +46,9 @@ class DistProductCategory extends EloquentRepository
             return [];
         }
 
+        // 过滤分销商
+        $query->where('dist_id', getDistributorId());
+
         // 返回键值对数组,并按 'name' 和 'order' 字段排序
         $results = $query->orderBy('name')->orderBy('order')->pluck('name', 'id');
 
@@ -49,6 +65,7 @@ class DistProductCategory extends EloquentRepository
     public static function selectOptions(\Closure $closure = null)
     {
         $selectOptions = Model::class::selectOptions($closure);
+
         return $selectOptions;
     }
 
@@ -69,16 +86,12 @@ class DistProductCategory extends EloquentRepository
      */
     public function get(Grid\Model|\Dcat\Admin\Grid\Model $model)
     {
-        // 获取当前登录的分销商/经销商
-        $distributor=Session::get('distributor');
 
         // 获取模型对象
         $obj = $this->model();
 
-        // 过滤分销商
-        if ($distributor) {
-            $obj = $obj->where('dist_id', $distributor->id);
-        }
+        $obj = $obj->where('dist_id', getDistributorId());
+
         // 获取数据
         $tree = $obj->get();
 

+ 6 - 0
app/Distributor/Repositories/DistVideo.php

@@ -13,4 +13,10 @@ class DistVideo extends EloquentRepository
      * @var string
      */
     protected $eloquentClass = Model::class;
+
+
+    public static function findById($id)
+    {
+        return Model::find($id); // 查找并返回相应的记录
+    }
 }

+ 5 - 0
app/Distributor/Repositories/DistVideoCategory.php

@@ -20,4 +20,9 @@ class DistVideoCategory extends EloquentRepository
         $selectOptions =  Model::class::selectOptions($closure);
         return $selectOptions;
     }
+
+    public static function findById($id)
+    {
+        return Model::find($id); // 查找并返回相应的记录
+    }
 }

+ 3 - 0
app/Distributor/routes.php

@@ -31,6 +31,9 @@ Route::group([
     $router->resource('video-category', 'DistVideoCategoryController');
     //视频管理
     $router->resource('dist-video', 'DistVideoController');
+
+    //产品导入
+    $router->resource('import-product', 'importProductController');
 });
 
 

+ 19 - 0
app/Models/DistProduct.php

@@ -24,6 +24,25 @@ class DistProduct extends Model
         'parameters' => 'json', // 将 attributes 字段转换为数组
     ];
 
+    protected $fillable = [
+        'id',
+        'title',
+        'keywords',
+        'description',
+        'sku',
+        'category_id',
+        'issuance_date',
+        'order',
+        'enabled',
+        'content',
+        'parameters',
+        'created_at',
+        'updated_at',
+        'is_pinned',
+        'dist_id',
+    ];
+
+
     public function distProductCategory()
     {
         return $this->hasOne(DistProductCategory::class,'id','category_id');

+ 49 - 1
app/Models/DistProductCategory.php

@@ -6,8 +6,11 @@ use Dcat\Admin\Traits\HasDateTimeFormatter;
 
 use Dcat\Admin\Traits\ModelTree;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\Session;
 use Spatie\EloquentSortable\Sortable;
+use Illuminate\Database\Eloquent\Scope;
 
+use App\Distributor\Scopes;
 class DistProductCategory extends Model implements Sortable
 {
     use HasDateTimeFormatter,
@@ -31,9 +34,54 @@ class DistProductCategory extends Model implements Sortable
     ];
 
     protected $fillable = [
-        'name', 'parent_id', 'order','enabled','dist_user_id', // 假设已有的可填充字段
+        'name', 'parent_id', 'order','enabled','dist_id', // 假设已有的可填充字段
     ];
 
+
+    protected $distributor = null;
+
+
+    public function __construct()
+    {
+
+//        // 获取当前登录的分销商/经销商
+//        $distributor=Session::get('distributor');
+//
+//
+//
+//            // 过滤分销商
+//        if ($distributor) {
+//
+//                $this->dist_id =$distributor->id;
+//        }
+//
+
+
+    }
+
+    protected static function boot()
+    {
+        var_dump('ufoxguo');
+        parent::boot();
+
+        static::addGlobalScope(new VerifiedDistId());
+    }
+
+//    protected static function booted()
+//    {
+//
+//        static::addGlobalScope('dist_id', function (Builder $builder) {
+//            // 获取当前登录的分销商/经销商
+//            $distributor=Session::get('distributor');
+//
+//            // 过滤分销商
+//            if (!$distributor) {
+//                $builder->where('dist_id', $distributor->id); // 替换为你的条件
+//            }
+//        });
+//
+//    }
+
     /*
      * 关联产品参数
      */

+ 5 - 1
app/Models/DistProductImage.php

@@ -17,7 +17,11 @@ class DistProductImage extends Model
     ];
     protected $fillable = [
         'image_url',
-        'product_id'];
+        'product_id',
+        'order',
+        'created_at',
+        'updated_at'
+        ];
 
     // 反向关联,属于某个产品
     public function product()

+ 25 - 0
app/helpers.php

@@ -1,6 +1,7 @@
 <?php
 
 use Illuminate\Support\Arr;
+use Illuminate\Support\Facades\Session;
 
 if (! function_exists('user_admin_config')) {
     function user_admin_config($key = null, $value = null)
@@ -34,6 +35,30 @@ if (! function_exists('user_admin_config')) {
     }
 }
 
+if (!function_exists('getDistributor')) {
+    /**
+     * 获取会话中的 distributor 值
+     *
+     * @return mixed
+     */
+    function getDistributor() {
+        return  Session::get('distributor');
+    }
+}
+
+if (!function_exists('getDistributorId')) {
+    /**
+     * 获取会话中的 distributor 的 ID
+     *
+     * @return mixed
+     */
+    function getDistributorId() {
+        $distributor = Session::get('distributor');
+        return $distributor ? $distributor['id'] : null; // 假设 distributor 是一个数组,包含 id
+    }
+}
+
+
 
 //通过parent_id构建树形结构
 if (!function_exists('buildTree')) {

+ 1 - 1
config/distributor.php

@@ -270,7 +270,7 @@ return [
 
         'oss_image' => [
             'accept' => 'jpg,png,gif,jpeg,webp',//允许上传的文件类型
-            'max_size' => 1024, // 上传文件大小限制,单位B
+            'max_size' => 10240, // 上传文件大小限制,单位B
         ],
     ],
 

+ 2 - 1
lang/en/admin.php

@@ -219,7 +219,7 @@ return [
     'install_succeeded'         => 'Install succeeded !',
     'invalid_extension_package' => 'Invalid extension package !',
     'copied'                    => 'Copied',
-    'auth_failed'               => 'These credentials do not match our records.',
+    'auth_failed'               => 'Incorrect username or password. ',
     'validation'               => [
         'match'     => 'The :attribute and :other must match.',
         'minlength' => 'The :attribute must be at least :min characters.',
@@ -231,4 +231,5 @@ return [
     'product_parameter'=>'Product Parameter',
     'video_category'=>'Video Category',
     'video_list'=>'Video List',
+    'dist_product_import'
 ];

+ 2 - 0
lang/en/global.php

@@ -6,6 +6,8 @@ return [
         'category_name' => 'Category Name',
         'parameter_name'=> 'Parameter Name',
         'order_tips' => 'Enter a number. The higher the number, the higher the ranking.',
+        'cover_image' => 'Cover Image',
+        'video_url' => 'Video Url',
     ],
     'options' => [
         //

+ 5 - 1
lang/zh_CN/admin.php

@@ -232,5 +232,9 @@ return [
     'proudct_category'=>'产品分类',
     'product_parameter'=>'产品参数',
     'video_category'=>'视频分类',
-    'video_list'=>'视频列表'
+    'video_list'=>'视频列表',
+    'product'  => '产品',
+    'video'  => '视频',
+    'dist_product_import'=>'产品导入',
+
 ];

+ 9 - 1
lang/zh_CN/global.php

@@ -28,7 +28,7 @@ return [
         'description'           => '描述',
         'sku'                   => '商品sku',
         'category_id'           => '分类ID',
-        'issuance_date'         => '发日期',
+        'issuance_date'         => '发日期',
         'enabled'               => '启用-1',
         'content'               => '内容',
         'parameters'            => '产品参数',
@@ -41,6 +41,8 @@ return [
         'parent'                => '上级',
         'key'                   => '参数名',
         'value'                 => '参数值',
+        'cover_image'           => '封面图片',
+
 
     ],
     'labels' => [
@@ -53,6 +55,12 @@ return [
         'category_name'    => '分类名称',
         'parameter_name'        => '参数名称',
         'order_tips'       => '请输入数字,数字越大前台展示排名越靠前',
+        'category'              => '分类',
+        'enabled'               => '是否启用',
+        "Yes" => "是",
+        "No" => "否",
+        'cover_image' => '封面图片',
+        'video_url' => '视频URL地址',
     ],
     'options' => [
         //

+ 1 - 1
lang/zh_CN/menu.php

@@ -20,6 +20,6 @@ return [
         'product_parameter'    => '产品参数',
         'video_category'       => '视频分类',
         'video_management'     => '视频管理',
-
+        'import_product'     => '倒入产品',
     ],
 ];

+ 27 - 26
resources/views/distributor/partials/breadcrumb.blade.php

@@ -1,39 +1,40 @@
+
 @if ($breadcrumb)
     <div class="breadcrumb-wrapper col-12">
     <ol class="breadcrumb float-right text-capitalize">
         <li class="breadcrumb-item"><a href="{{ admin_url('/') }}"><i class="fa fa-dashboard"></i> {{admin_trans('admin.home')}}</a></li>
-        @foreach($breadcrumb as $item)
-            @if($loop->last)
-                <li class="active breadcrumb-item">
-                    @if (\Illuminate\Support\Arr::has($item, 'icon'))
-                        <i class="fa {{ $item['icon'] }}"></i>
-                    @endif
-                    {{ $item['text'] }}
-                </li>
-            @else
-                <li class="breadcrumb-item">
-                    <a href="{{ admin_url(\Illuminate\Support\Arr::get($item, 'url')) }}">
-                        @if (\Illuminate\Support\Arr::has($item, 'icon'))
-                            <i class="fa {{ $item['icon'] }}"></i>
-                        @endif
-                        {{ $item['text'] }}
-                    </a>
-                </li>
-            @endif
-        @endforeach
+{{--        @foreach($breadcrumb as $item)--}}
+{{--            @if($loop->last)--}}
+{{--                <li class="active breadcrumb-item">--}}
+{{--                    @if (\Illuminate\Support\Arr::has($item, 'icon'))--}}
+{{--                        <i class="fa {{ $item['icon'] }}"></i>--}}
+{{--                    @endif--}}
+{{--                    {{ $item['text'] }}--}}
+{{--                </li>--}}
+{{--            @else--}}
+{{--                <li class="breadcrumb-item">--}}
+{{--                    <a href="{{ admin_url(\Illuminate\Support\Arr::get($item, 'url')) }}">--}}
+{{--                        @if (\Illuminate\Support\Arr::has($item, 'icon'))--}}
+{{--                            <i class="fa {{ $item['icon'] }}"></i>--}}
+{{--                        @endif--}}
+{{--                        {{ $item['text'] }}--}}
+{{--                    </a>--}}
+{{--                </li>--}}
+{{--            @endif--}}
+{{--        @endforeach--}}
     </ol>
     </div>
 @elseif(config('admin.enable_default_breadcrumb'))
     <div class="breadcrumb-wrapper col-12">
     <ol class="breadcrumb float-right text-capitalize">
         <li class="breadcrumb-item"><a href="{{ admin_url('/') }}"><i class="fa fa-dashboard"></i> {{admin_trans('admin.home')}}</a></li>
-        @for($i = 2; $i <= ($len = count(Request::segments())); $i++)
-            <li class="breadcrumb-item">
-                @if($i == $len) <a href=""> @endif
-                {{admin_trans_label(Request::segment($i))}}
-                @if($i == $len) </a> @endif
-            </li>
-        @endfor
+{{--        @for($i = 2; $i <= ($len = count(Request::segments())); $i++)--}}
+{{--            <li class="breadcrumb-item">--}}
+{{--                @if($i == $len) <a href=""> @endif--}}
+{{--                {{admin_trans_label(Request::segment($i))}}--}}
+{{--                @if($i == $len) </a> @endif--}}
+{{--            </li>--}}
+{{--        @endfor--}}
     </ol>
     </div>
 @endif