123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595 |
- <?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\common\dao\store\product;
- use app\common\dao\BaseDao;
- use app\common\model\store\product\Product as model;
- use app\common\repositories\store\product\SpuRepository;
- use app\common\repositories\store\StoreCategoryRepository;
- use think\db\BaseQuery;
- use think\db\exception\DbException;
- use think\facade\Db;
- class ProductDao extends BaseDao
- {
- protected function getModel(): string
- {
- return model::class;
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/9
- * @param int $id
- * @param array $data
- */
- public function createAttr(int $id, array $data)
- {
- ($this->getModel()::withTrashed()->find($id))->attr()->saveAll($data);
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/9
- * @param int $id
- * @param array $data
- */
- public function createAttrValue(int $id, array $data)
- {
- ($this->getModel()::withTrashed()->find($id))->attrValue()->saveAll($data);
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/9
- * @param int $id
- * @param array $data
- */
- public function createContent(int $id, array $data)
- {
- ($this->getModel()::withTrashed()->find($id))->content()->save($data);
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/9
- * @param int $merId
- * @param $field
- * @param $value
- * @param null $except
- * @return bool
- */
- public function merFieldExists(?int $merId, $field, $value, $except = null)
- {
- return model::withTrashed()->when($except, function ($query, $except) use ($field) {
- $query->where($field, '<>', $except);
- })->when($merId, function ($query, $merId) {
- $query->where('mer_id', $merId);
- })->where($field, $value)->count() > 0;
- }
- public function apiFieldExists(int $merId, $field, $value, $except = null)
- {
- return ($this->getModel())::getDB()->when($except, function ($query, $except) use ($field) {
- $query->where($field, '<>', $except);
- })->when($merId, function ($query, $merId) {
- $query->where('mer_id', $merId);
- })->where(['status' => 1])->where($field, $value)->count() > 0;
- }
- /**
- * @param int $merId
- * @param int $productId
- * @return bool
- * @author Qinii
- */
- public function getDeleteExists(int $merId, int $productId)
- {
- return ($this->getModel())::onlyTrashed()->where('mer_id', $merId)->where($this->getPk(), $productId)->count() > 0;
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/11
- * @param int $merId
- * @param array $where
- * @return mixed
- */
- public function search(?int $merId, array $where)
- {
- $keyArray = $whereArr = [];
- unset($where['type'],$where['us_status']);
- foreach ($where as $key => $item) {
- if ($item !== '' && $key != 'soft') {
- $keyArray[] = $key;
- $whereArr[$key] = $item;
- }
- }
- $query = isset($where['soft']) ? model::onlyTrashed()->alias('Product') : model::alias('Product');
- if (isset($where['is_trader']) && $where['is_trader'] !== '') {
- $query->hasWhere('merchant', function ($query) use ($where) {
- $query->where('is_trader', $where['is_trader']);
- });
- }
- $query->withSearch($keyArray, $whereArr)
- ->when(($merId !== null), function ($query) use ($merId) {
- $query->where('Product.mer_id', $merId);
- })
- ->when(isset($where['hot_type']) && $where['hot_type'] !== '', function ($query) use ($where) {
- if ($where['hot_type'] == 'new')
- $query->where('is_new', 1);
- else if ($where['hot_type'] == 'hot')
- $query->where('is_hot', 1);
- else if ($where['hot_type'] == 'best')
- $query->where('is_best', 1);
- else if ($where['hot_type'] == 'good')
- $query->where('is_benefit', 1);
- })
- ->when(isset($where['pid']) && $where['pid'] !== '', function ($query) use ($where) {
- $storeCategoryRepository = app()->make(StoreCategoryRepository::class);
- $ids = array_merge($storeCategoryRepository->findChildrenId((int)$where['pid']), [(int)$where['pid']]);
- if (count($ids)) $query->whereIn('cate_id', $ids);
- })
- ->when(isset($where['us_status']) && $where['us_status'] !== '', function ($query) use ($where) {
- if ($where['us_status'] == 0) {
- $query->where('Product.is_show', 0)->where('Product.is_used', 1)->where('Product.status',1);
- }
- if ($where['us_status'] == 1) {
- $query->where('Product.is_show', 1)->where('Product.is_used', 1)->where('Product.status',1);
- }
- if ($where['us_status'] == -1) {
- $query->where(function($query){
- $query->where('Product.is_used',0)->whereOr('Product.status','<>',1);
- });
- }
- })
- ->when(isset($where['order']), function ($query) use ($where, $merId) {
- $query->when(
- in_array($where['order'], ['is_new', 'price_asc', 'price_desc', 'rate', 'sales']),
- function ($query) use ($where) {
- if ($where['order'] == 'price_asc') {
- $where['order'] = 'price ASC';
- } else if ($where['order'] == 'price_desc') {
- $where['order'] = 'price DESC';
- } else {
- $where['order'] = $where['order'] . ' DESC';
- }
- $query->order($where['order'] . ',rank DESC ,create_time DESC ');
- },
- function ($query) use ($merId) {
- if ($merId) $query->order('Product.sort DESC ,Product.create_time DESC');
- }
- );
- })
- ->when(isset($where['star']),function($query)use($where){
- $query->Join('StoreSpu U', 'Product.product_id = U.product_id')->where('U.product_type', $where['product_type'] ?? 0);
- $query->when($where['star'] !== '', function ($query) use ($where) {
- $query->where('U.star', $where['star']);
- });
- $query->order('U.star DESC,U.rank DESC,Product.create_time DESC');
- });
- return $query;
- }
- /**
- * TODO
- * @param array $where
- * @return BaseQuery
- * @author Qinii
- * @day 2020-08-04
- */
- public function seckillSearch(array $where)
- {
- $query = model::hasWhere('seckillActive', function ($query) use ($where) {
- $query->where('status', 1);
- $query->whereTime('start_day', '<=', $where['day'])->whereTime('end_day', '>=', $where['day']);
- $query->where('start_time', '<=', $where['start_time'])
- ->where('end_time', '>', $where['start_time'])
- ->where('end_time', '<=', $where['end_time']);
- });
- $query->where([
- 'Product.is_show' => 1,
- 'Product.status' => 1,
- 'Product.is_used' => 1,
- 'Product.mer_status' => 1,
- 'Product.product_type' => 1,
- 'Product.is_gift_bag' => 0,
- ])
- ->when(isset($where['star']),function($query)use($where){
- $query->Join('StoreSpu U', 'Product.product_id = U.product_id')->where('U.product_type', 1);
- $query->when($where['star'] !== '', function ($query) use ($where) {
- $query->where('U.star', $where['star']);
- });
- $query->order('U.star DESC,U.rank DESC');
- });
- return $query;
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/18
- * @param int $id
- * @param bool $soft
- * @return int|mixed
- */
- public function delete(int $id, $soft = false)
- {
- if ($soft) {
- return (($this->getModel())::onlyTrashed()->find($id))->force()->delete();
- } else {
- return $this->getModel()::where($this->getPk(), $id)->update(['is_del' => 1]);
- }
- app()->make(SpuRepository::class)->where('product_id', $id)->where('product_type', 1)->update(['is_del' => 1, 'status' => 0]);
- }
- /**
- * TODO
- * @param $id
- * @return mixed
- * @author Qinii
- * @day 2020-07-03
- */
- public function restore($id)
- {
- $res = ($this->getModel())::onlyTrashed()->find($id);
- app()->make(SpuRepository::class)->delProduct($id, 0);
- return $res->restore();
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/18
- * @param int $id
- * @param array $status
- * @return mixed
- */
- public function switchStatus(int $id, array $status)
- {
- return ($this->getModel()::getDB())->where($this->getPk(), $id)->update($status);
- }
- /**
- * @param int $merId
- * @param array $productIds
- * @return array
- * @author xaboy
- * @day 2020/5/26
- */
- public function productIdByImage(int $merId, array $productIds)
- {
- return model::getDB()->where('mer_id', $merId)->whereIn('product_id', $productIds)->column('product_id,image');
- }
- /**
- * @param array $ids
- * @return array
- * @author xaboy
- * @day 2020/5/30
- */
- public function intersectionKey(array $ids): array
- {
- return model::getDB()->whereIn('product_id', $ids)->column('product_id');
- }
- /**
- * @Author:Qinii
- * @Date: 2020/5/30
- * @param $id
- * @return mixed
- */
- public function productIdByMerId($id)
- {
- return model::getDB()->where('product_id', $id)->value('mer_id');
- }
- /**
- * @param int $productId
- * @param int $desc
- * @return int
- * @throws DbException
- * @author xaboy
- * @day 2020/6/8
- */
- public function descStock(int $productId, int $desc)
- {
- return model::getDB()->where('product_id', $productId)->update([
- 'stock' => Db::raw('stock-' . $desc),
- 'sales' => Db::raw('sales+' . $desc)
- ]);
- }
- /**
- * @param int $productId
- * @param int $inc
- * @return int
- * @throws DbException
- * @author xaboy
- * @day 2020/6/8
- */
- public function incStock(int $productId, int $inc)
- {
- model::getDB()->where('product_id', $productId)->inc('stock', $inc)->update();
- model::getDB()->where('product_id', $productId)->where('sales', '>=', $inc)->dec('sales', $inc)->update();
- }
- public function visitProductGroup($date, $merId = null, $limit = 7)
- {
- return model::getDB()->alias('A')->leftJoin('UserRelation B', 'A.product_id = B.type_id')
- ->field(Db::raw('count(B.type_id) as total,A.product_id,A.store_name,A.image'))
- ->when($date, function ($query, $date) {
- getModelTime($query, $date, 'B.create_time');
- })->when($merId, function ($query, $merId) {
- $query->where('A.mer_id', $merId);
- })->where('B.type', 1)->group('A.product_id')->limit($limit)->order('total DESC')->select();
- }
- public function cartProductGroup($date, $merId = null, $limit = 7)
- {
- return model::getDB()->alias('A')->leftJoin('StoreCart B', 'A.product_id = B.product_id')
- ->field(Db::raw('sum(B.cart_num) as total,A.product_id,A.store_name,A.image'))
- ->when($date, function ($query, $date) {
- getModelTime($query, $date, 'B.create_time');
- })->when($merId, function ($query, $merId) {
- $query->where('A.mer_id', $merId);
- })->where('B.product_type', 0)->where('B.is_pay', 0)->where('B.is_del', 0)
- ->where('B.is_new', 0)->where('B.is_fail', 0)->group('A.product_id')->limit($limit)->order('total DESC')->select();
- }
- public function changeMerchantProduct($merId, $data)
- {
- ($this->getModel()::getDB())->where('mer_id', $merId)->update($data);
- }
- /**
- * TODO
- * @param int $productId
- * @author Qinii
- * @day 2020-07-09
- */
- public function incCareCount(int $productId)
- {
- ($this->getModel()::getDB())->where($this->getPk(), $productId)->inc('care_count', 1)->update();
- }
- /**
- * TODO
- * @param int $productId
- * @author Qinii
- * @day 2020-07-09
- */
- public function decCareCount(int $productId)
- {
- ($this->getModel()::getDB())->where($this->getPk(), $productId)->where('care_count', '>', 0)->dec('care_count', 1)->update();
- }
- /**
- * TODO api展示的商品条件
- * @return array
- * @author Qinii
- * @day 2020-08-18
- */
- public function productShow()
- {
- return [
- 'is_show' => 1,
- 'status' => 1,
- 'is_used' => 1,
- 'product_type' => 0,
- 'mer_status' => 1,
- 'is_gift_bag' => 0,
- ];
- }
- /**
- * TODO api展示的礼包商品条件
- * @return array
- * @author Qinii
- * @day 2020-08-18
- */
- public function bagShow()
- {
- return [
- 'is_show' => 1,
- 'status' => 1,
- 'is_used' => 1,
- 'mer_status' => 1,
- 'product_type' => 0,
- 'is_gift_bag' => 1,
- ];
- }
- /**
- * TODO api展示的秒杀商品条件
- * @return array
- * @author Qinii
- * @day 2020-08-18
- */
- public function seckillShow()
- {
- return [
- 'is_show' => 1,
- 'status' => 1,
- 'is_used' => 1,
- 'mer_status' => 1,
- 'product_type' => 1,
- 'is_gift_bag' => 0,
- ];
- }
- public function getProductTypeById(int $productId, ?int $exsistType)
- {
- $product_type = $this->getModel()::getDB()
- ->when($exsistType, function ($query) use ($exsistType) {
- $query->where('product_type', $exsistType);
- })
- ->where($this->getPk(), $productId)->where('is_del', 0)->value('product_type');
- return $product_type == 0 ? true : false;
- }
- public function getFailProduct(int $productId)
- {
- return $this->getModel()::withTrashed()->field('product_id,image,store_name,is_show,status,is_del,unit_name,price,mer_status,is_used')->find($productId);
- }
- public function geTrashedtProduct(int $id)
- {
- return model::withTrashed()->where($this->getPk(),$id);
- }
- /**
- * TODO 获取各种有效时间内的活动
- * @param int $productType
- * @return array
- * @author Qinii
- * @day 2/1/21
- */
- public function activitSearch(int $productType)
- {
- $query = model::getDB()->alias('P')
- ->where('P.is_del', 0)
- ->where('P.mer_status', 1)
- ->where('P.product_type', $productType);
- switch ($productType) {
- case 0:
- // $query->where('P.is_show',1)
- // ->where('P.is_used',1)
- // ->field('product_id,product_type,mer_id,store_name,keyword,price,rank,sort,image,status,temp_id');
- break;
- case 1:
- $query->join('StoreSeckillActive S', 'S.product_id = P.product_id')
- ->field('P.*,S.status,S.seckill_active_id,S.end_time');
- break;
- case 2:
- $query->join('StoreProductPresell R', 'R.product_id = P.product_id')
- ->where('R.is_del',0)
- ->field('P.*,R.product_presell_id,R.store_name,R.price,R.status,R.is_show,R.product_status,R.action_status');
- break;
- case 3:
- $query->join('StoreProductAssist A', 'A.product_id = P.product_id')
- ->where('A.is_del',0)
- ->field('P.*,A.product_assist_id,A.store_name,A.status,A.is_show,A.product_status,A.action_status');
- break;
- case 4:
- $query->join('StoreProductGroup G', 'G.product_id = P.product_id')
- ->where('G.is_del',0)
- ->field('P.*,G.product_group_id,G.price,G.status,G.is_show,G.product_status,G.action_status');
- break;
- default:
- break;
- }
- $data = $query->select()->toArray();
- $ret = $this->commandChangeProductStatus($data);
- return $ret;
- }
- public function commandChangeProductStatus($data)
- {
- $ret = [];
- foreach ($data as $item) {
- $status = 0;
- switch ($item['product_type']) {
- case 0:
- if ($item['is_show'] && $item['is_used']) $status = 1;
- $ret[] = [
- 'activity_id' => 0,
- 'product_id' => $item['product_id'],
- 'mer_id' => $item['mer_id'],
- 'keyword' => $item['keyword'],
- 'price' => $item['price'],
- 'rank' => $item['rank'],
- 'sort' => $item['sort'],
- 'image' => $item['image'],
- 'status' => $status,
- 'temp_id' => $item['temp_id'],
- 'store_name' => $item['store_name'],
- 'product_type' => $item['product_type'],
- ];
- break;
- case 1:
- if ($item['is_show'] && $item['is_used'] && $item['status'] && ($item['end_time'] > time())) $status = 1;
- $ret[] = [
- 'activity_id' => $item['seckill_active_id'],
- 'product_id' => $item['product_id'],
- 'mer_id' => $item['mer_id'],
- 'keyword' => $item['keyword'],
- 'price' => $item['price'],
- 'rank' => $item['rank'],
- 'sort' => $item['sort'],
- 'image' => $item['image'],
- 'status' => $status,
- 'temp_id' => $item['temp_id'],
- 'store_name' => $item['store_name'],
- 'product_type' => $item['product_type'],
- ];
- break;
- case 2:
- if ($item['is_show'] && $item['action_status'] && $item['status'] && $item['product_status']) $status = 1;
- $ret[] = [
- 'activity_id' => $item['product_presell_id'],
- 'product_id' => $item['product_id'],
- 'mer_id' => $item['mer_id'],
- 'keyword' => $item['keyword'],
- 'price' => $item['price'],
- 'rank' => $item['rank'],
- 'sort' => $item['sort'],
- 'image' => $item['image'],
- 'status' => $status,
- 'temp_id' => $item['temp_id'],
- 'store_name' => $item['store_name'],
- 'product_type' => $item['product_type'],
- ];
- break;
- case 3:
- if ($item['is_show'] && $item['action_status'] && $item['status'] && $item['product_status']) $status = 1;
- $ret[] = [
- 'activity_id' => $item['product_assist_id'],
- 'product_id' => $item['product_id'],
- 'mer_id' => $item['mer_id'],
- 'keyword' => $item['keyword'],
- 'price' => $item['price'],
- 'rank' => $item['rank'],
- 'sort' => $item['sort'],
- 'image' => $item['image'],
- 'status' => $status,
- 'temp_id' => $item['temp_id'],
- 'store_name' => $item['store_name'],
- 'product_type' => $item['product_type'],
- ];
- break;
- case 4:
- if ($item['is_show'] && $item['action_status'] && $item['status'] && $item['product_status']) $status = 1;
- $ret[] = [
- 'activity_id' => $item['product_group_id'],
- 'product_id' => $item['product_id'],
- 'mer_id' => $item['mer_id'],
- 'keyword' => $item['keyword'],
- 'price' => $item['price'],
- 'rank' => $item['rank'],
- 'sort' => $item['sort'],
- 'image' => $item['image'],
- 'status' => $status,
- 'temp_id' => $item['temp_id'],
- 'store_name' => $item['store_name'],
- 'product_type' => $item['product_type'],
- ];
- break;
- }
- }
- return $ret;
- }
- }
|