123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191 |
- <?php
- namespace app\api\controller\mall;
- use app\admin\model\GoodsViewFavCart;
- use app\common\controller\Api;
- use app\common\model\Category;
- use app\common\model\GoodsSku;
- use app\common\model\UserCategoryView;
- use app\common\validate\KillService;
- /**
- * 商城商品接口
- * @inheritdoc
- */
- class Goods extends Api
- {
- protected $noNeedLogin = '*';
- protected $noNeedRight = '*';
- /**
- * 商品列表
- * @ApiParams (name=name,description=商品名称)
- * @ApiParams (name=page,description=分页)
- * @ApiParams (name=limit,description=分页)
- * @ApiParams (name=sort,description="排序,推荐recommend,价格amount,销量sell")
- * @ApiParams (name=sort_dir,description="desc倒序asc正序")
- */
- public function index(){
- $data=input();
- $map=[];
- if(!empty($data['name'])){
- $map['name']=['like',"%{$data['name']}%"];
- }
- $this->_validate([
- 'sort'=>['in:recommend,amount,sell'],
- 'sort_dir'=>['in:asc,desc'],
- ]);
- if(empty($data['sort'])){
- $data['sort']='recommend';
- }
- if(empty($data['sort_dir'])){
- $data['sort_dir']='asc';
- }
- $order=['id',$data['sort_dir']];
- if($data['sort']=='amount'){
- $order[0]='amount';
- }elseif ($data['sort']=='sell'){
- $order[0]='num_sell';
- }
- $query=\app\common\model\Goods::show()
- ->where($map)
- ->field('content',true)
- ->order(...$order)
- ->paginate($data['limit']??20);
- $this->success('',$query);
- }
- /**
- * 商品详情
- * @ApiParams (name=id,description=商品ID)
- */
- public function show(){
- $data=$this->_validate([
- 'id'=>['require','gt:0'],
- ]);
- $user=$this->auth->getUser();
- $killConfig=KillService::getConfig();
- $goods=\app\common\model\Goods::with(['sku','detail','service'])->findOrFail($data['id']);
- if($goods['is_kill']==1 && !$killConfig['open']){
- $goods['is_kill']=0;
- }
- $goods['kill_endtime']=$killConfig['endtime'];
- $fav=[];
- if($user){
- foreach ($goods['sku'] as $sku){
- $fav[$sku['id']]=$user->favourite()->where('fav_id',$goods['id'])->where('goods_sku_id',$sku['id'])->value('id')?true:false;
- }
- }
- $goods['favourite']=$fav;
- GoodsViewFavCart::increment($goods,'view');
- $this->success('',$goods);
- }
- /**
- * 推荐商品
- * @ApiParams (name=id,description=商品ID)
- * @ApiParams (name=limit,description=获取几个)
- */
- public function recommend(){
- $data=$this->_validate([
- 'id'=>['require','gt:0'],
- ]);
- $limit=$data['limit']??10;
- $goods=\app\common\model\Goods::findOrFail($data['id']);
- $recommend=\app\common\model\Goods::where('category_id',$goods['category_id'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
- $this->success('',$recommend);
- }
- /**
- * 配件推荐
- * @ApiParams (name=id,description=商品ID)
- * @ApiParams (name=limit,description=获取几个)
- */
- public function pz_goods(){
- $data=$this->_validate([
- 'id'=>['require','gt:0'],
- ]);
- $limit=$data['limit']??10;
- $goods=\app\common\model\Goods::findOrFail($data['id']);
- $recommend=\app\common\model\Goods::where('category_id',$goods['category_id'])->with(['sku'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
- $this->success('',$recommend);
- }
- /**
- * 获取组合搭配
- * @ApiParams (name=sku_id,description=商品规格ID)
- */
- public function bind_goods(){
- $data=$this->_validate([
- 'sku_id'=>['require','gt:0'],
- ]);
- $sku=GoodsSku::findOrFail($data['sku_id']);
- $binds=$sku->binds()->column('bind_goods_id','bind_goods_sku_id');
- $info=[
- 'goods'=>[],
- 'amount_total'=>$sku['amount']
- ];
- if($binds){
- $info['goods']=\app\common\model\Goods::join('goods_sku','goods_sku.goods_id=goods.id')
- ->whereIn('goods_sku.id',array_keys($binds))
- ->field(['goods.*','goods_sku.id as sku_id'])
- ->select()->toArray();
- $info['amount_total']=array_sum(array_column($info['goods'],'amount'));
- }
- $this->success('',$info);
- }
- /**
- * 获取支架商品
- * @ApiParams (name=sku_id,description=规格ID)
- * @ApiReturnParams (name=sku_id,description=规格ID,如果直接下单需要)
- */
- public function zj_goods(){
- $data=$this->_validate([
- 'sku_id'=>['require','gt:0'],
- ]);
- $sku=GoodsSku::findOrFail($data['sku_id']);
- $info=[
- 'goods'=>[],
- 'amount_total'=>$sku->getRealAmount(),
- ];
- $category=Category::where('name','支架')->value('id',0);
- $info['goods']=\app\common\model\Goods::where('category_id',$category)
- ->order('id','desc')
- ->select();
- foreach ($info['goods'] as $good){
- $good['sku_id']=$good->sku()->value('id');
- }
- if($info['goods']) {
- $info['amount_total'] = bcadd(array_sum(array_column($info['goods']->toArray(), 'amount')), $info['amount_total']);
- }
- $this->success('',$info);
- }
- /**
- * 记录用户浏览产品时长
- * @ApiParams (name=goods_id,description=商品ID)
- * @ApiParams (name=sec,description=时长S)
- */
- public function ls(){
- $user=$this->auth->getUser();
- if(!$user){
- $this->success();
- }
- $data=input();
- if(empty($data['goods_id'])){
- $this->success('i');
- }
- $goods=\app\common\model\Goods::where('id',$data['goods_id'])->find();
- if(!$goods){
- $this->success('g');
- }
- $category=$goods->category;
- if(!$category){
- $this->success('c');
- }
- UserCategoryView::addSecond($user,$category,$data['sec']??0);
- $this->success();
- }
- }
|