model = new GoodsModel; $this->categoryModel = new CategoryModel; $this->skuPriceModel = new SkuPriceModel; } /** * 商品列表 * * @return void */ public function index() { $params = $this->request->param(); $keyword = $params['keyword'] ?? ''; $category_id = $params['category_id'] ?? ''; $is_category_deep = $params['is_category_deep'] ?? true; $sort = $params['sort'] ?? 'weigh'; $order = $params['order'] ?? 'desc'; $physicalConfig = \app\common\model\app\Config::getConfig('physical'); $showSales = $physicalConfig['show_sales'] ?? 1; $service = new GoodsService(function ($goods) { return $goods; }, (new \app\admin\model\app\physical\Goods())->field(['id', 'name', 'cover', 'price', 'stock', 'total_sales', 'virtual_sales', 'weigh', 'createtime', 'spec_type'])); $service->up()->inStock(); if ($keyword) { $service->search($keyword); } if ($category_id) { $service->category($category_id, $is_category_deep); } if ($sort) { $service->order($sort, $order); } $list = $service->paginate(); $isVirtualPay = \app\common\library\pay\VirtualPayService::isUseVirtualPay('physical'); if ($isVirtualPay) { foreach ($list as &$item) { $item['is_virtual_pay'] = 1; $item = \app\common\library\pay\VirtualPayService::convertPriceFields($item, ['price']); } unset($item); } else { foreach ($list as &$item) { $item['is_virtual_pay'] = 0; } unset($item); } $this->success('获取成功', $list); } /** * 通过 ids 获取商品(不分页) * * @return void */ public function ids() { $params = $this->request->param(); $ids = $params['ids'] ?? ''; if (empty($ids)) { $this->error('参数错误'); } $physicalConfig = \app\common\model\app\Config::getConfig('physical'); $showSales = $physicalConfig['show_sales'] ?? 1; $ids = is_array($ids) ? $ids : explode(',', $ids); $list = $this->model ->where('id', 'in', $ids) ->where('status', 1) ->where('uniacid', UNIACID) ->order('weigh', 'desc') ->field(['id', 'name', 'title', 'cover', 'image', 'price']) ->select(); foreach ($list as &$item) { // 根据配置决定是否显示销量 if ($showSales != 1) { unset($item['total_sales']); } } $this->success('获取成功', $list); } /** * 商品详情 * * @return void */ public function detail() { $id = $this->request->param('id'); if (empty($id)) { $this->error('参数错误'); } $physicalConfig = \app\common\model\app\Config::getConfig('physical'); $showSales = $physicalConfig['show_sales'] ?? 1; $goods = $this->model ->where('id', $id) ->where('status', 1) ->where('uniacid', UNIACID) ->find(); if (!$goods) { $this->error('商品不存在'); } // 增加虚拟浏览量 $this->model->where('id', $id) ->where('uniacid', UNIACID) ->setInc('virtual_visit', 1); $goods = $goods->toArray(); // 只保留需要的字段 $allowedFields = ['id', 'name', 'title', 'image', 'cover', 'carousel', 'detail', 'price', 'min_price', 'stock', 'total_sales', 'service', 'single_limit', 'lifetime_limit', 'support_return', 'support_exchange', 'delivery_time', 'params', 'spec_type', 'sku_tree']; $goods = array_intersect_key($goods, array_flip($allowedFields)); if (isset($goods['params']) && is_string($goods['params'])) { $goods['params'] = json_decode($goods['params'], true); } // 处理图片字段 if (isset($goods['carousel']) && is_string($goods['carousel'])) { $goods['carousel'] = json_decode($goods['carousel'], true) ?: []; } // 根据配置决定是否显示销量 if ($showSales != 1) { unset($goods['total_sales']); } $specType = $goods['spec_type'] ?? 'single'; if ($specType == 'single') { $skuPrice = $this->skuPriceModel ->where('goods_id', $id) ->where('uniacid', UNIACID) ->where('status', 1) ->order('id', 'asc') ->find(); $goods['sku_prices'] = $skuPrice ? [$skuPrice->toArray()] : []; // 根据配置决定是否显示销量 if ($showSales != 1 && !empty($goods['sku_prices'])) { foreach ($goods['sku_prices'] as &$sku) { unset($sku['sales']); } } } else { $skuPrices = $this->skuPriceModel ->where('goods_id', $id) ->where('uniacid', UNIACID) ->where('status', 1) ->order('weigh', 'asc') ->select(); $goods['sku_prices'] = collection($skuPrices)->toArray(); // 根据配置决定是否显示销量 if ($showSales != 1 && !empty($goods['sku_prices'])) { foreach ($goods['sku_prices'] as &$sku) { unset($sku['sales']); } } } $skuPrice = $this->skuPriceModel ->where('goods_id', $id) ->where('uniacid', UNIACID) ->where('status', 1) ->order('price', 'asc') ->find(); $goods['price'] = $skuPrice ? $skuPrice['price'] : 0; // 计算总库存和总销量 $skuPrices = $this->skuPriceModel ->where('goods_id', $id) ->where('uniacid', UNIACID) ->where('status', 1) ->select(); if ($skuPrices) { if (is_array($skuPrices)) { $skuPricesArray = $skuPrices; } else { $skuPricesArray = $skuPrices->toArray(); } $goods['stock'] = array_sum(array_column($skuPricesArray, 'stock')); // 根据配置决定是否显示销量 if ($showSales == 1) { $goods['sales'] = array_sum(array_column($skuPricesArray, 'sales')); } } else { $goods['stock'] = 0; } $goods['is_virtual_pay'] = \app\common\library\pay\VirtualPayService::isUseVirtualPay('physical'); if ($goods['is_virtual_pay']) { $goods = \app\common\library\pay\VirtualPayService::convertPriceFields($goods, ['price', 'min_price']); if (!empty($goods['sku_prices'])) { foreach ($goods['sku_prices'] as &$sku) { $sku = \app\common\library\pay\VirtualPayService::convertPriceFields($sku, ['price', 'original_price']); } unset($sku); } } $this->success('获取成功', $goods); } }