Browse Source

完善功能

gorden 10 months ago
parent
commit
f0546c7ec1

+ 17 - 4
app/admin/controller/goods/PackageGoodsController.php

@@ -19,7 +19,20 @@ class PackageGoodsController
      */
     public function select(Request $request)
     {
-        return GoodsService::select($request, 'PACKAGE');
+        return GoodsService::selectPackage($request, 'PACKAGE');
+    }
+
+    /**
+     * @Desc 下拉选择商品
+     * @Author Gorden
+     * @Date 2024/4/24 13:32
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public function selectList(Request $request)
+    {
+        return GoodsService::selectList($request);
     }
 
     /**
@@ -37,7 +50,7 @@ class PackageGoodsController
             return json_fail($validate->getError());
         }
 
-        return GoodsService::info($request->get('goods_id'));
+        return GoodsService::infoPackage($request->get('goods_id'));
     }
 
     /**
@@ -56,7 +69,7 @@ class PackageGoodsController
             return json_fail($validate->getError());
         }
 
-        return GoodsService::insert($params);
+        return GoodsService::insertPackage($params);
     }
 
     /**
@@ -74,7 +87,7 @@ class PackageGoodsController
             return json_fail($validate->getError());
         }
 
-        return GoodsService::update($request->post());
+        return GoodsService::updatePackage($request->post());
     }
 
     /**

+ 284 - 2
app/admin/service/goods/GoodsService.php

@@ -3,6 +3,7 @@
 namespace app\admin\service\goods;
 
 use app\model\Goods;
+use app\model\GoodsComponent;
 use app\model\GoodsDetail;
 use app\model\GoodsLabel;
 use app\model\GoodsRunning;
@@ -31,9 +32,9 @@ class GoodsService
                 $query->select('join_running_goods_id', 'goods_running_storage');
             },
             'supplier' => function ($query) {
-                $query->select('supplier_id','supplier_name');
+                $query->select('supplier_id', 'supplier_name');
             }
-        ])->select('goods_id', 'join_goods_category_id','join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
+        ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
             ->when($goodsName != '', function ($query) use ($goodsName) {
                 $query->where(function ($q) use ($goodsName) {
                     $q->where('goods_name', 'like', '%' . $goodsName . '%')
@@ -63,6 +64,97 @@ class GoodsService
         return json_success('', compact('rows', 'page', 'pageSize', 'total'));
     }
 
+    public static function selectPackage(Request $request)
+    {
+        $page = $request->get('page');
+        $pageSize = $request->get('pageSize');
+        $goodsName = $request->get('goods_name', '');
+        $categoryId = $request->get('join_goods_category_id', null);
+
+        $rows = Goods::with([
+            'category' => function ($query) {
+                $query->select('category_id', 'category_name');
+            },
+            'running' => function ($query) {
+                $query->select('join_running_goods_id', 'goods_running_storage');
+            },
+            'supplier' => function ($query) {
+                $query->select('supplier_id', 'supplier_name');
+            },
+//            'component' => function ($query) {
+//                $query->select('join_component_master_goods_id', 'join_component_goods_id', 'goods_component_price', 'goods_component_config_json');
+//            }
+        ])->select('goods_id', 'join_goods_category_id', 'join_goods_supplier_id', 'goods_status', 'goods_sales_price', 'goods_category', 'goods_name', 'goods_title', 'goods_cover', 'goods_sort', 'goods_addtimes')
+            ->when($goodsName != '', function ($query) use ($goodsName) {
+                $query->where(function ($q) use ($goodsName) {
+                    $q->where('goods_name', 'like', '%' . $goodsName . '%')
+                        ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
+                });
+            })->when($categoryId != null, function ($query) use ($categoryId) {
+                $query->where('join_goods_category_id', $categoryId);
+            })
+            ->where('goods_classify', 'PACKAGE')
+            ->orderBy('goods_addtimes', 'DESC')
+            ->forPage($page, $pageSize)
+            ->get()
+            ->toArray();
+        $total = Goods::when($goodsName != '', function ($query) use ($goodsName) {
+            $query->where(function ($q) use ($goodsName) {
+                $q->where('goods_name', 'like', '%' . $goodsName . '%')
+                    ->OrWhere('goods_title', 'like', '%' . $goodsName . '%');
+            });
+        })->when($categoryId != null, function ($query) use ($categoryId) {
+            $query->where('join_goods_category_id', $categoryId);
+        })->where('goods_classify', 'PACKAGE')->count();
+
+        foreach ($rows as &$row) {
+            $row['goods_cover'] = getenv('STORAGE_DOMAIN') . $row['goods_cover'];
+//            if (!empty($row['component'])) {
+//                $ids = [];
+//                $contentList = [];
+//                foreach ($row['component'] as $component) {
+//                    $ids[] = $component['join_component_goods_id'];
+//                    $configJson = json_decode($component['goods_component_config_json'], true);
+//                    $contentList[] = [
+//                        'goods_name' => $configJson['goods_name'] ?? '',
+//                        'goods_sales_price' => $component['goods_component_price'],
+//                        'nbr' => $configJson['nbr'] ?? 0
+//                    ];
+//                }
+//
+//                $row['join_component_goods_id'] = $ids;
+//                $row['goodsContentList'] = $contentList;
+//            }
+        }
+
+        return json_success('', compact('rows', 'page', 'pageSize', 'total'));
+    }
+
+    /**
+     * @Desc 下拉选择服务商品
+     * @Author Gorden
+     * @Date 2024/4/24 13:32
+     *
+     * @param Request $request
+     * @return Response
+     */
+    public static function selectList(Request $request)
+    {
+//        $keywords = $request->get('keywords', '');
+//        if (!$keywords){
+//            return json_success('暂无数据');
+//        }
+
+        $goods = Goods::where('goods_classify', 'PACKAGE')
+//            ->where('goods_name','like',"%".$keywords."%")
+            ->select('goods_id', 'goods_name', 'goods_sales_price')
+            ->get()
+            ->toArray();
+
+        return json_success('', $goods);
+
+    }
+
     /**
      * @Desc 商品详情
      * @Author Gorden
@@ -168,6 +260,91 @@ class GoodsService
         }
     }
 
+    public static function infoPackage($goodsId)
+    {
+        try {
+            // 商品主表
+            $main = Goods::where('goods_id', $goodsId)->first();
+            if (!empty($main)) {
+                $main = $main->toArray();
+                $main['goods_sku_json'] = json_decode($main['goods_sku_json'], true);
+                $main['specList'] = [];
+                foreach ($main['goods_sku_json'] as $key => $sku) {
+                    $main['specList'][] = [
+                        'label' => $key,
+                        'tags' => $sku
+                    ];
+                }
+
+            } else {
+                $main = [];
+            }
+            // 详情表
+            $detail = GoodsDetail::where('join_detail_goods_id', $goodsId)->first();
+            if (!empty($detail)) {
+                $detail = $detail->toArray();
+            } else {
+                $detail = [];
+            }
+            // 标签表
+            $label = GoodsLabel::where('join_label_goods_id', $goodsId)->first();
+            if (!empty($label)) {
+                $label = $label->toArray();
+            } else {
+                $label = [];
+            }
+            // Running表
+            $running = GoodsRunning::where('join_running_goods_id', $goodsId)->first();
+            if (!empty($running)) {
+                $running = $running->toArray();
+            } else {
+                $running = [];
+            }
+            // 组件表
+            $component = GoodsComponent::where('join_component_master_goods_id', $goodsId)->get()->toArray();
+            $componentArr['join_component_goods_id'] = [];
+            $componentArr['goodsContentList'] = [];
+            if ($component) {
+                $ids = [];
+                $contentList = [];
+                foreach ($component as $item) {
+                    $ids[] = $item['join_component_goods_id'];
+                    $configJson = json_decode($item['goods_component_config_json'], true);
+                    $contentList[] = [
+                        'goods_name' => $configJson['goods_name'] ?? '',
+                        'goods_sales_price' => $item['goods_component_price'],
+                        'nbr' => $configJson['nbr'] ?? 0
+                    ];
+                }
+
+                $componentArr['join_component_goods_id'] = $ids;
+                $componentArr['goodsContentList'] = $contentList;
+            }
+
+            // 合并数据
+            $data = array_merge($main, $detail, $label, $running, $componentArr);
+            $data['goods_sku_json_label'] = [];
+
+            $data['goods_label'] = !empty($data['goods_label']) ? explode(',', $data['goods_label']) : [];
+            $data['goods_cover'] = getenv('STORAGE_DOMAIN') . $data['goods_cover'];
+            if (!empty($data['goods_detail_slider_json'])) {
+                $data['goods_detail_slider_json'] = json_decode($data['goods_detail_slider_json'], true);
+                $slider = '';
+                foreach ($data['goods_detail_slider_json'] as $item) {
+                    $slider .= getenv('STORAGE_DOMAIN') . $item . ',';
+                }
+                $data['goods_detail_slider_json'] = rtrim($slider, ',');
+            }
+
+            $data['goods_on_addtimes'] = date('Y-m-d\TH:i:s.u\Z', $data['goods_on_addtimes'] - 60 * 60 * 8);
+
+            return json_success('', $data);
+        } catch (\Exception $e) {
+            dump($e->getTrace());
+            return json_fail("查询错误~");
+        }
+    }
+
 
     /**
      * @Desc 添加商品
@@ -216,6 +393,47 @@ class GoodsService
         return json_success('success');
     }
 
+    public static function insertPackage($params): Response
+    {
+        Db::beginTransaction();
+        try {
+            $params['goods_id'] = "GD" . sprintf('%016d', SysSerial::getSerial()) . random_string(6, 'up');
+            // 主表
+            self::mainInsert($params);
+            // 商品详情表
+            self::detailInsert($params);
+            // 套包组件表
+            self::componentUpdate($params, 'insert');
+            // 商品标签表
+            self::labelInsert($params);
+            // 产品运行控制信息表
+            self::goodsRunningInsert($params);
+            // sku表
+            self::goodsSkuSet($params, 'insert');
+            // 待上架状态,上架时间大于当前时间
+            if ($params['goods_status'] == 'PENDING' && strtotime($params['goods_on_addtimes']) > time()) {
+                $redis = Redis::connection();
+                $key = date('YmdHi', strtotime($params['goods_on_addtimes']));
+                $redis->sAdd(Goods::LISTING_KEY_PREFIX . $key, $params['goods_id']);
+            }
+            Db::commit();
+        } catch (\PDOException $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail('数据写入失败~');
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            dump($e->getMessage());
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getTrace());
+            return json_fail('数据写入失败~');
+        }
+
+        return json_success('success');
+    }
+
     public static function update($params)
     {
         Db::beginTransaction();
@@ -242,6 +460,34 @@ class GoodsService
         return json_success('success');
     }
 
+
+    public static function updatePackage($params)
+    {
+        Db::beginTransaction();
+        try {
+            // 主表
+            self::mainUpdate($params);
+            // 商品详情表
+            self::detailUpdate($params);
+            // 套包组件表
+            self::componentUpdate($params, 'update');
+            // 商品标签表
+            self::labelUpdate($params);
+            // 产品运行控制信息表
+            self::goodsRunningUpdate($params);
+
+            Db::commit();
+        } catch (BusinessException $e) {
+            Db::rollBack();
+            return json_fail($e->getMessage());
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getTrace());
+            return json_fail('数据更新失败~');
+        }
+        return json_success('success');
+    }
+
     /**
      * @Desc 删除商品
      * @Author Gorden
@@ -361,6 +607,42 @@ class GoodsService
         }
     }
 
+    public static function componentUpdate($params, $type = 'insert')
+    {
+        Db::beginTransaction();
+        try {
+            // 有先删除
+            if ($type == 'update') {
+                GoodsComponent::where('join_component_master_goods_id', $params['goods_id'])->delete();
+            }
+            $data = [];
+            foreach ($params['goods_content_list'] as $item) {
+                $goods = Goods::where('goods_id', $params['goods_id'])->first();
+                if (!$goods) {
+                    continue;
+                }
+
+                $data[] = [
+                    'join_component_master_goods_id' => $params['goods_id'],
+                    'join_component_goods_id' => $item['goods_id'] ?? '',
+                    'goods_component_price' => $item['goods_sales_price'] ?? '',
+                    'goods_component_cover' => $goods->goods_cover,
+                    'goods_component_config_json' => json_encode(['goods_name' => $item['goods_name'], 'nbr' => $item['nbr']]),
+                    'goods_component_addtimes' => time()
+                ];
+            }
+
+            if ($data) {
+                GoodsComponent::insert($data);
+            }
+            Db::commit();
+        } catch (\Exception $e) {
+            Db::rollBack();
+            dump($e->getTrace());
+            throw new BusinessException("数据写入失败~");
+        }
+    }
+
     /**
      * @Desc 标签表
      * @Author Gorden

+ 6 - 1
app/model/Goods.php

@@ -53,6 +53,11 @@ class Goods extends Model
 
     public function supplier()
     {
-        return $this->hasOne(Supplier::class,'supplier_id','join_goods_supplier_id');
+        return $this->hasOne(Supplier::class, 'supplier_id', 'join_goods_supplier_id');
+    }
+
+    public function component()
+    {
+        return $this->hasMany(GoodsComponent::class,'join_component_master_goods_id','goods_id');
     }
 }

+ 18 - 0
app/model/GoodsComponent.php

@@ -0,0 +1,18 @@
+<?php
+
+namespace app\model;
+
+use support\Model;
+
+class GoodsComponent extends Model
+{
+    protected $table = 'goods_component';
+
+    protected $primaryKey = 'goods_component_id';
+
+    protected $dateFormat = 'U';
+
+    const CREATED_AT = 'goods_component_addtimes';
+
+    const UPDATED_AT = null;
+}

+ 2 - 1
route/admin.php

@@ -50,9 +50,10 @@ Route::group('/admin', function () {
         })->middleware([
             \app\middleware\AdminAuthCheck::class
         ]);
-        /* 实物商品管理 */
+        /*套包商品管理 */
         Route::group('/package', function () {
             Route::get('/list', [\app\admin\controller\goods\PackageGoodsController::class, 'select']);
+            Route::get('/selectList', [\app\admin\controller\goods\PackageGoodsController::class, 'selectList']);
             Route::get('/info', [\app\admin\controller\goods\PackageGoodsController::class, 'info']);
             Route::post('/add', [\app\admin\controller\goods\PackageGoodsController::class, 'insert']);
             Route::post('/update', [\app\admin\controller\goods\PackageGoodsController::class, 'update']);