Goods.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <?php
  2. namespace app\api\controller\mall;
  3. use app\admin\model\GoodsViewFavCart;
  4. use app\common\controller\Api;
  5. use app\common\model\Category;
  6. use app\common\model\GoodsSku;
  7. use app\common\model\UserCategoryView;
  8. use app\common\validate\KillService;
  9. /**
  10. * 商城商品接口
  11. * @inheritdoc
  12. */
  13. class Goods extends Api
  14. {
  15. protected $noNeedLogin = '*';
  16. protected $noNeedRight = '*';
  17. /**
  18. * 商品列表
  19. * @ApiParams (name=name,description=商品名称)
  20. * @ApiParams (name=page,description=分页)
  21. * @ApiParams (name=limit,description=分页)
  22. * @ApiParams (name=sort,description="排序,推荐recommend,价格amount,销量sell")
  23. * @ApiParams (name=sort_dir,description="desc倒序asc正序")
  24. */
  25. public function index(){
  26. $data=input();
  27. $map=[];
  28. if(!empty($data['name'])){
  29. $map['name']=['like',"%{$data['name']}%"];
  30. }
  31. $this->_validate([
  32. 'sort'=>['in:recommend,amount,sell'],
  33. 'sort_dir'=>['in:asc,desc'],
  34. ]);
  35. if(empty($data['sort'])){
  36. $data['sort']='recommend';
  37. }
  38. if(empty($data['sort_dir'])){
  39. $data['sort_dir']='asc';
  40. }
  41. $order=['id',$data['sort_dir']];
  42. if($data['sort']=='amount'){
  43. $order[0]='amount';
  44. }elseif ($data['sort']=='sell'){
  45. $order[0]='num_sell';
  46. }
  47. $query=\app\common\model\Goods::show()
  48. ->where($map)
  49. ->field('content',true)
  50. ->order(...$order)
  51. ->paginate($data['limit']??20);
  52. $this->success('',$query);
  53. }
  54. /**
  55. * 商品详情
  56. * @ApiParams (name=id,description=商品ID)
  57. */
  58. public function show(){
  59. $data=$this->_validate([
  60. 'id'=>['require','gt:0'],
  61. ]);
  62. $user=$this->auth->getUser();
  63. $killConfig=KillService::getConfig();
  64. $goods=\app\common\model\Goods::with(['sku','detail','service'])->findOrFail($data['id']);
  65. if($goods['is_kill']==1 && !$killConfig['open']){
  66. $goods['is_kill']=0;
  67. }
  68. $goods['kill_endtime']=$killConfig['endtime'];
  69. $fav=[];
  70. if($user){
  71. foreach ($goods['sku'] as $sku){
  72. $fav[$sku['id']]=$user->favourite()->where('fav_id',$goods['id'])->where('goods_sku_id',$sku['id'])->value('id')?true:false;
  73. }
  74. }
  75. $goods['favourite']=$fav;
  76. GoodsViewFavCart::increment($goods,'view');
  77. $this->success('',$goods);
  78. }
  79. /**
  80. * 推荐商品
  81. * @ApiParams (name=id,description=商品ID)
  82. * @ApiParams (name=limit,description=获取几个)
  83. */
  84. public function recommend(){
  85. $data=$this->_validate([
  86. 'id'=>['require','gt:0'],
  87. ]);
  88. $limit=$data['limit']??10;
  89. $goods=\app\common\model\Goods::findOrFail($data['id']);
  90. $recommend=\app\common\model\Goods::where('category_id',$goods['category_id'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
  91. $this->success('',$recommend);
  92. }
  93. /**
  94. * 配件推荐
  95. * @ApiParams (name=id,description=商品ID)
  96. * @ApiParams (name=limit,description=获取几个)
  97. */
  98. public function pz_goods(){
  99. $data=$this->_validate([
  100. 'id'=>['require','gt:0'],
  101. ]);
  102. $limit=$data['limit']??10;
  103. $goods=\app\common\model\Goods::findOrFail($data['id']);
  104. $recommend=\app\common\model\Goods::where('category_id',$goods['category_id'])->with(['sku'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
  105. $this->success('',$recommend);
  106. }
  107. /**
  108. * 获取组合搭配
  109. * @ApiParams (name=sku_id,description=商品规格ID)
  110. */
  111. public function bind_goods(){
  112. $data=$this->_validate([
  113. 'sku_id'=>['require','gt:0'],
  114. ]);
  115. $sku=GoodsSku::findOrFail($data['sku_id']);
  116. $binds=$sku->binds()->column('bind_goods_id','bind_goods_sku_id');
  117. $info=[
  118. 'goods'=>[],
  119. 'amount_total'=>$sku['amount']
  120. ];
  121. if($binds){
  122. $info['goods']=\app\common\model\Goods::join('goods_sku','goods_sku.goods_id=goods.id')
  123. ->whereIn('goods_sku.id',array_keys($binds))
  124. ->field(['goods.*','goods_sku.id as sku_id'])
  125. ->select()->toArray();
  126. $info['amount_total']=array_sum(array_column($info['goods'],'amount'));
  127. }
  128. $this->success('',$info);
  129. }
  130. /**
  131. * 获取支架商品
  132. * @ApiParams (name=sku_id,description=规格ID)
  133. * @ApiReturnParams (name=sku_id,description=规格ID,如果直接下单需要)
  134. */
  135. public function zj_goods(){
  136. $data=$this->_validate([
  137. 'sku_id'=>['require','gt:0'],
  138. ]);
  139. $sku=GoodsSku::findOrFail($data['sku_id']);
  140. $info=[
  141. 'goods'=>[],
  142. 'amount_total'=>$sku->getRealAmount(),
  143. ];
  144. $category=Category::where('name','支架')->value('id',0);
  145. $info['goods']=\app\common\model\Goods::where('category_id',$category)
  146. ->order('id','desc')
  147. ->select();
  148. foreach ($info['goods'] as $good){
  149. $good['sku_id']=$good->sku()->value('id');
  150. }
  151. if($info['goods']) {
  152. $info['amount_total'] = bcadd(array_sum(array_column($info['goods']->toArray(), 'amount')), $info['amount_total']);
  153. }
  154. $this->success('',$info);
  155. }
  156. /**
  157. * 记录用户浏览产品时长
  158. * @ApiParams (name=goods_id,description=商品ID)
  159. * @ApiParams (name=sec,description=时长S)
  160. */
  161. public function ls(){
  162. $user=$this->auth->getUser();
  163. if(!$user){
  164. $this->success();
  165. }
  166. $data=input();
  167. if(empty($data['goods_id'])){
  168. $this->success('i');
  169. }
  170. $goods=\app\common\model\Goods::where('id',$data['goods_id'])->find();
  171. if(!$goods){
  172. $this->success('g');
  173. }
  174. $category=$goods->category;
  175. if(!$category){
  176. $this->success('c');
  177. }
  178. UserCategoryView::addSecond($user,$category,$data['sec']??0);
  179. $this->success();
  180. }
  181. }