Files

255 lines
7.8 KiB
PHP

<?php
namespace app\api\controller\app\physical;
use app\common\controller\Api;
use app\common\service\app\physical\GoodsService;
use app\admin\model\app\physical\Goods as GoodsModel;
use app\admin\model\app\physical\Category as CategoryModel;
use app\admin\model\app\physical\SkuPrice as SkuPriceModel;
/**
* 商品接口
*/
class Goods extends Api
{
protected $noNeedLogin = ['*'];
protected $noNeedRight = ['*'];
protected $model = null;
protected $categoryModel = null;
protected $skuPriceModel = null;
public function _initialize()
{
parent::_initialize();
$this->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);
}
}