new-admin-api/app/dao/product/product/StoreProductDao.php

477 lines
21 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
// +----------------------------------------------------------------------
// | CRMEB [ CRMEB赋能开发者助力企业发展 ]
// +----------------------------------------------------------------------
// | Copyright (c) 2016~2020 https://www.crmeb.com All rights reserved.
// +----------------------------------------------------------------------
// | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
// +----------------------------------------------------------------------
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
namespace app\dao\product\product;
use app\dao\BaseDao;
use app\common\model\store\product\Product as StoreProduct;
use think\facade\Config;
/**
* Class StoreProductDao
* @package app\dao\product\product
*/
class StoreProductDao extends BaseDao
{
/**
* 设置模型
* @return string
*/
protected function setModel(): string
{
return StoreProduct::class;
}
/**
* @param array $where
* @return \crmeb\basic\BaseModel|mixed|\think\Model
*/
public function search(array $where = [])
{
return parent::search($where)
->when(isset($where['collate_code_id']) && $where['collate_code_id'], function ($query) use ($where) {
$query->where('product_type', 0)->where('is_presale_product', 0)->where('system_form_id', 0);
})->when(isset($where['is_integral']) && $where['is_integral'], function ($query) use ($where) {
$query->where('product_type', 'in', [0, 1, 2, 3]);
})
->when(isset($where['store_name']) && $where['store_name'], function ($query) use ($where) {
if (isset($where['field_key']) && $where['field_key'] && in_array($where['field_key'], ['product_id', 'bar_code'])) {
if ($where['field_key'] == 'product_id') {
$query->where('id', trim($where['store_name']));
} else {
$query->where(function ($query) use ($where) {
$query->where('bar_code', trim($where['store_name']))->whereOr('id', 'IN', function ($q) use ($where) {
$q->name('store_product_attr_value')->field('product_id')->where('bar_code', trim($where['store_name']))->select();
});
});
}
} else {
$query->where(function ($q) use ($where) {
$q->where('id|store_name|bar_code|keyword', 'LIKE', '%' . trim($where['store_name']) . '%')->whereOr('id', 'IN', function ($q) use ($where) {
$q->name('store_product_attr_value')->field('product_id')->where('bar_code', trim($where['store_name']))->select();
});
});
}
})->when(isset($where['sid']) && $where['sid'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 1)->where('relation_id', $where['sid'])->field('product_id')->select();
});
})->when(isset($where['cid']) && $where['cid'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 1)->whereIn('relation_id', function ($query) use ($where) {
$query->name('store_product_category')->where('id|pid', $where['cid'])->field('id')->select();
})->field('product_id')->select();
});
})->when(isset($where['brand_id']) && $where['brand_id'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 2)->whereIn('relation_id', $where['brand_id'])->field('product_id')->select();
});
})->when(isset($where['store_label_id']) && $where['store_label_id'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 3)->whereIn('relation_id', $where['store_label_id'])->field('product_id')->select();
});
})->when(isset($where['is_live']) && $where['is_live'] == 1, function ($query) use ($where) {
$query->whereNotIn('id', function ($query) {
$query->name('live_goods')->where('is_del', 0)->where('audit_status', '<>', 3)->field('product_id')->select();
});
})->when(isset($where['is_supplier']) && in_array((int)$where['is_supplier'], [0, 1]), function ($query) use ($where) {
if ($where['is_supplier'] == 1) {//查询供应商商品
$query->where('type', 2);
} else {
$query->where('type', '<>', 2);
}
});
}
/**
* 条件获取数量
* @param array $where
* @return int
*/
public function getCount(array $where)
{
return $this->search($where)
->when(isset($where['unit_name']) && $where['unit_name'] !== '', function ($query) use ($where) {
$query->where('unit_name', $where['unit_name']);
})->when(isset($where['ids']) && $where['ids'], function ($query) use ($where) {
if (!isset($where['type'])) $query->where('id', 'in', $where['ids']);
})->when(isset($where['not_ids']) && $where['not_ids'], function ($query) use ($where) {
$query->whereNotIn('id', $where['not_ids']);
})->when(isset($where['pids']) && $where['pids'], function ($query) use ($where) {
if ((isset($where['priceOrder']) && $where['priceOrder'] != '') || (isset($where['salesOrder']) && $where['salesOrder'] != '')) {
$query->whereIn('pid', $where['pids']);
} else {
$query->whereIn('pid', $where['pids'])->orderField('pid', $where['pids'], 'asc');
}
})->when(isset($where['not_pids']) && $where['not_pids'], function ($query) use ($where) {
$query->whereNotIn('pid', $where['not_pids']);
})->count();
}
/**
* 获取商品列表
* @param array $where
* @param int $page
* @param int $limit
* @param string $order
* @param array $with
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getList(array $where, int $page = 0, int $limit = 0, string $order = '', array $with = [])
{
$prefix = Config::get('database.connections.' . Config::get('database.default') . '.prefix');
return $this->search($where)->order(($order ? $order . ' ,' : '') . 'sort desc,id desc')
->when(count($with), function ($query) use ($with) {
$query->with($with);
})->when($page != 0 && $limit != 0, function ($query) use ($page, $limit) {
$query->page($page, $limit);
})->when(isset($where['store_id']) && $where['store_id'], function ($query) use ($where) {
$query->with(['storeBranchProduct' => function ($querys) use ($where) {
$querys->where('store_id', $where['store_id'])->bind([
'branch_sales' => 'sales',
'branch_stock' => 'stock',
'branch_is_show' => 'is_show'
]);
}]);
})->when(isset($where['ids']), function ($query) use ($where) {
$query->where('id', 'in', $where['ids']);
})->field([
'*',
'(SELECT count(*) FROM `' . $prefix . 'user_relation` WHERE `relation_id` = `' . $prefix . 'store_product`.`id` AND `category` = \'product\' AND `type` = \'collect\') as collect',
'(SELECT count(*) FROM `' . $prefix . 'user_relation` WHERE `relation_id` = `' . $prefix . 'store_product`.`id` AND `category` = \'product\' AND `type` = \'like\') as likes',
'(SELECT SUM(stock) FROM `' . $prefix . 'store_product_attr_value` WHERE `product_id` = `' . $prefix . 'store_product`.`id` AND `type` = 0) as stock',
// '(SELECT SUM(sales) FROM `' . $prefix . 'store_product_attr_value` WHERE `product_id` = `' . $prefix . 'store_product`.`id` AND `type` = 0) as sales',
'(SELECT count(*) FROM `' . $prefix . 'store_visit` WHERE `product_id` = `' . $prefix . 'store_product`.`id` AND `product_type` = \'product\') as visitor',
])->select()->toArray();
}
/**
* 获取商品详情
* @param int $id
* @return array|\think\Model|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getInfo(int $id)
{
return $this->search()->with('coupons')->find($id);
}
/**
* 获取门店商品
* @param $where
* @return array|\think\Model|null
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getBranchProduct($where)
{
return $this->search($where)->find();
}
/**
* 条件获取商品列表
* @param array $where
* @param int $page
* @param int $limit
* @param array $field
* @param string $order
* @param array $with
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getSearchList(array $where, int $page = 0, int $limit = 0, array $field = ['*'], string $order = '', array $with = ['couponId', 'descriptions'])
{
if (isset($where['star'])) $with[] = 'star';
return $this->search($where)->with($with)->when($page != 0 && $limit != 0, function ($query) use ($page, $limit) {
$query->page($page, $limit);
})->when(isset($where['ids']) && $where['ids'], function ($query) use ($where) {
if ((isset($where['priceOrder']) && $where['priceOrder'] != '') || (isset($where['salesOrder']) && $where['salesOrder'] != '')) {
$query->whereIn('id', $where['ids']);
} else {
$query->whereIn('id', $where['ids'])->orderField('id', $where['ids'], 'asc');
}
})->when(isset($where['not_ids']) && $where['not_ids'], function ($query) use ($where) {
$query->whereNotIn('id', $where['not_ids']);
})->when(isset($where['pids']) && $where['pids'], function ($query) use ($where) {
if ((isset($where['priceOrder']) && $where['priceOrder'] != '') || (isset($where['salesOrder']) && $where['salesOrder'] != '')) {
$query->whereIn('pid', $where['pids']);
} else {
$query->whereIn('pid', $where['pids'])->orderField('pid', $where['pids'], 'asc');
}
})->when(isset($where['not_pids']) && $where['not_pids'], function ($query) use ($where) {
$query->whereNotIn('pid', $where['not_pids']);
})->when(isset($where['priceOrder']) && $where['priceOrder'] != '', function ($query) use ($where) {
if ($where['priceOrder'] === 'desc') {
$query->order("price desc");
} else {
$query->order("price asc");
}
})->when(isset($where['salesOrder']) && $where['salesOrder'] != '', function ($query) use ($where) {
if ($where['salesOrder'] === 'desc') {
$query->order("sales desc");
} else {
$query->order("sales asc");
}
})->when(!isset($where['ids']), function ($query) use ($where, $order) {
if (isset($where['timeOrder']) && $where['timeOrder'] == 1) {
$query->order('id desc');
} else if ($order == 'rand') {
$query->orderRand();
} else if ($order) {
$query->orderRaw($order);
} else {
$query->order('sort desc,id desc');
}
})->when(isset($where['use_min_price']) && $where['use_min_price'], function ($query) use ($where) {
if (is_array($where['use_min_price']) && count($where['use_min_price']) == 2) {
$query->where('price', $where['use_min_price'][0] ?? '=', $where['use_min_price'][1] ?? 0);
}
})->when(!$page && $limit, function ($query) use ($limit) {
$query->limit($limit);
})->field($field)->select()->toArray();
}
/**商品列表
* @param array $where
* @param $limit
* @param $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getProductLimit(array $where, $limit, $field)
{
return $this->search($where)->field($field)->order('val', 'desc')->limit($limit)->select()->toArray();
}
/**
* 根据id获取商品数据
* @param array $ids
* @param string $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function idByProductList(array $ids, string $field)
{
return $this->getModel()->whereIn('id', $ids)->field($field)->select()->toArray();
}
/**
* 获取推荐商品
* @param array $where
* @param array $field
* @param int $num
* @param int $page
* @param int $limit
* @param array $with
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getRecommendProduct(array $where, array $field = ['*'], int $num = 0, int $page = 0, int $limit = 0, array $with = ['couponId', 'star'])
{
return $this->search($where)->field($field)
->when(count($with), function ($query) use ($with) {
$query->with($with);
})->when($num, function ($query) use ($num) {
$query->limit($num);
})->when($page, function ($query) use ($page, $limit) {
$query->page($page, $limit);
})->when($limit, function ($query) use ($limit) {
$query->limit($limit);
})->order('sort DESC, id DESC')->select()->toArray();
}
/**
* 获取加入购物车的商品
* @param array $where
* @param int $page
* @param int $limit
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getProductCartList(array $where, int $page, int $limit, array $field = ['*'])
{
$where['is_verify'] = 1;
$where['is_show'] = 1;
$where['is_del'] = 0;
return $this->search($where)->when($page, function ($query) use ($page, $limit) {
$query->page($page, $limit);
})->field($field)->order('sort DESC,id DESC')->select()->toArray();
}
/**
* 获取用户购买热销榜单
* @param array $where
* @param int $limit
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getUserProductHotSale(array $where, int $limit = 20)
{
return $this->search($where)->field(['IFNULL(sales,0) + IFNULL(ficti,0) as sales', 'store_name', 'image', 'id', 'price', 'ot_price', 'stock'])->limit($limit)->order('sales desc')->select()->toArray();
}
/**
* 通过商品id获取商品分类
* @param array $productIds
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function productIdByCateId(array $productIds)
{
return $this->search(['id' => $productIds])->with('cateName')->field('id')->select()->toArray();
}
/**
* @param array $where
* @param $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getProductListByWhere(array $where, $field)
{
return $this->search($where)->field($field)->select()->toArray();
}
/**
* 搜索条件获取字段column
* @param array $where
* @param string $field
* @param string $key
* @return array
*/
public function getColumnList(array $where, string $field = 'brand_id', string $key = 'id')
{
return $this->search($where)
->when(isset($where['sid']) && $where['sid'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 1)->where('relation_id', $where['sid'])->field('product_id')->select();
});
})->when(isset($where['cid']) && $where['cid'], function ($query) use ($where) {
$query->whereIn('id', function ($query) use ($where) {
$query->name('store_product_relation')->where('type', 1)->whereIn('relation_id', function ($query) use ($where) {
$query->name('store_product_category')->where('id|pid', $where['cid'])->field('id')->select();
})->field('product_id')->select();
});
})->when(isset($where['ids']) && $where['ids'], function ($query) use ($where) {
$query->whereIn('id', $where['ids']);
})->field($field)->column($field, $key);
}
/**
* 自动上下架
* @param int $is_show
* @return \crmeb\basic\BaseModel
*/
public function overUpperShelves($is_show = 0)
{
return $this->getModel()->where(['is_del' => 0])->where('is_verify', 1)
->when(in_array($is_show, [0, 1]), function ($query) use ($is_show) {
if ($is_show == 1) {
$query->where('is_show', 0)->where('auto_on_time', '<>', 0)->where('auto_on_time', '<=', time());
} else {
$query->where('is_show', 1)->where('auto_off_time', '<>', 0)->where('auto_off_time', '<', time());
}
})->update(['is_show' => $is_show]);
}
/**
* 获取预售列表
* @param array $where
* @param int $page
* @param int $limit
* @param string $field
* @return array
* @throws \think\db\exception\DataNotFoundException
* @throws \think\db\exception\DbException
* @throws \think\db\exception\ModelNotFoundException
*/
public function getPresaleList(array $where, int $page, int $limit, string $field = '*')
{
$model = $this->getModel()->field($field)
->where('is_presale_product', 1)->where('is_del', 0)->where('is_show', 1)
->where(function ($query) use ($where) {
switch ($where['time_type']) {
case 1:
$query->where('presale_start_time', '>', time());
break;
case 2:
$query->where('presale_start_time', '<=', time())->where('presale_end_time', '>=', time());
break;
case 3:
$query->where('presale_end_time', '<', time());
break;
}
if ($where['type']) $query->whereIn('type', $where['type']);
});
$count = $model->count();
$list = $model->when($page && $limit, function ($query) use ($page, $limit) {
$query->page($page, $limit);
})->order('add_time desc')->select()->toArray();
return compact('list', 'count');
}
/**
* 获取使用某服务保障商品数量
* @param int $ensure_id
* @return int
*/
public function getUseEnsureCount(int $ensure_id)
{
return $this->getModel()->whereFindInSet('ensure_id', $ensure_id)->count();
}
/**
* 保存数据
* @param array $data
* @return mixed|\think\Collection
* @throws \Exception
*/
public function saveAll(array $data)
{
return $this->getModel()->saveAll($data);
}
/**
* 同步商品保存获取id
* @param $data
* @return int|string
*/
public function ErpProductSave($data)
{
return $this->getModel()->insertGetId($data);
}
}