Goods.php 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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\GoodsInstallLink;
  7. use app\common\model\GoodsSize;
  8. use app\common\model\GoodsSku;
  9. use app\common\model\UserCategoryView;
  10. use app\common\service\OrderService;
  11. use app\common\validate\KillService;
  12. use think\Db;
  13. use think\db\Query;
  14. /**
  15. * 商城商品接口
  16. * @inheritdoc
  17. */
  18. class Goods extends Api
  19. {
  20. protected $noNeedLogin = '*';
  21. protected $noNeedRight = '*';
  22. /**
  23. * 商品列表
  24. * @ApiParams (name=name,description=商品名称)
  25. * @ApiParams (name=page,description=分页)
  26. * @ApiParams (name=limit,description=分页)
  27. * @ApiParams (name=sort,description="排序,推荐recommend,价格amount,销量sell")
  28. * @ApiParams (name=sort_dir,description="desc倒序asc正序")
  29. * @ApiParams (name=category_id,description="分类ID")
  30. */
  31. public function index(){
  32. $data=input();
  33. $map=[];
  34. if(!empty($data['name'])){
  35. $map['name']=['like',"%{$data['name']}%"];
  36. }
  37. if(!empty($data['category_id'])){
  38. $map['category_id']=$data['category_id'];
  39. }
  40. $this->_validate([
  41. 'sort'=>['in:recommend,amount,sell'],
  42. 'sort_dir'=>['in:asc,desc'],
  43. ]);
  44. if(empty($data['sort'])){
  45. $data['sort']='recommend';
  46. }
  47. if(empty($data['sort_dir'])){
  48. $data['sort_dir']='asc';
  49. }
  50. $order=['id',$data['sort_dir']];
  51. if($data['sort']=='amount'){
  52. $order[0]='amount';
  53. }elseif ($data['sort']=='sell'){
  54. $order[0]='num_sell';
  55. }
  56. $query=\app\common\model\Goods::show()
  57. ->filterNormal()
  58. ->where($map)
  59. ->field('content',true)
  60. ->order(...$order)
  61. ->paginate($data['limit']??20);
  62. $this->success('',$query);
  63. }
  64. /**
  65. * 商品详情
  66. * @ApiParams (name=id,description=商品ID)
  67. * @ApiParams (name=num_install,description=安装量)
  68. * @ApiParams (name=skuid,description=规格ID)
  69. * @ApiReturnParams (name=send_day,description=发货时间)
  70. * @ApiReturnParams (name=amount_install_single,description=安装费单价)
  71. */
  72. public function show(){
  73. $data=$this->_validate([
  74. 'id'=>['require','gt:0'],
  75. ]);
  76. $num_install=input('num_install',0);
  77. $skuid=input('skuid',0);
  78. $user=$this->auth->getUser();
  79. $killConfig=KillService::getConfig();
  80. $goods=\app\common\model\Goods::with(['sku','detail','service','size'])->findOrFail($data['id']);
  81. if($goods['is_kill']==1 && !$killConfig['open']){
  82. $goods['is_kill']=0;
  83. }
  84. $goods['kill_endtime']=$killConfig['endtime'];
  85. $fav=[];
  86. if($user){
  87. foreach ($goods['sku'] as $sku){
  88. $fav[$sku['id']]=$user->favourite()->where('fav_id',$goods['id'])->where('goods_sku_id',$sku['id'])->value('id')?true:false;
  89. }
  90. }
  91. $goods['favourite']=$fav;
  92. GoodsViewFavCart::increment($goods,'view');
  93. $day=config('site.send_delay_day')?:2;
  94. $goods['send_day']=date('m月d日',strtotime("+{$day}days"));
  95. $goods['amount_install_single']=0;
  96. if($skuid && $num_install) {
  97. $goods['amount_install_single']= GoodsInstallLink::getFee($skuid,$num_install,true);
  98. }
  99. $this->success('',$goods);
  100. }
  101. /**
  102. * 推荐商品
  103. * @ApiParams (name=id,description=商品ID)
  104. * @ApiParams (name=limit,description=获取几个)
  105. */
  106. public function recommend(){
  107. $data=$this->_validate([
  108. 'id'=>['require','gt:0'],
  109. ]);
  110. $limit=$data['limit']??10;
  111. $goods=\app\common\model\Goods::findOrFail($data['id']);
  112. $recommend=\app\common\model\Goods::where('category_id',$goods['category_id'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
  113. $this->success('',$recommend);
  114. }
  115. /**
  116. * 配件推荐
  117. * @ApiParams (name=id,description=商品ID)
  118. * @ApiParams (name=limit,description=获取几个)
  119. */
  120. public function pz_goods(){
  121. $data=$this->_validate([
  122. 'id'=>['require','gt:0'],
  123. ]);
  124. $limit=$data['limit']??3;
  125. $recommend=\app\common\model\Goods::where('category_id',Category::C_PEIJIAN)
  126. ->with(['sku','size'])->where('id','<>',$data['id'])->limit($limit)->orderRaw('rand()')->select();
  127. $this->success('',$recommend);
  128. }
  129. /**
  130. * 获取组合搭配
  131. * @ApiParams (name=sku_id,description=商品规格ID)
  132. */
  133. public function bind_goods(){
  134. $data=$this->_validate([
  135. 'sku_id'=>['require','gt:0'],
  136. ]);
  137. $sku=GoodsSku::findOrFail($data['sku_id']);
  138. $binds=$sku->binds()->column('bind_goods_sku_id');
  139. $info=[
  140. 'goods'=>[],
  141. 'amount_total'=>$sku['amount']
  142. ];
  143. $goods=[];
  144. if($binds){
  145. foreach ($binds as $sku_id){
  146. $goods[]=\app\common\model\Goods::with(['sku'=>function(Query $query) use ($sku_id) {
  147. $query->where('id',$sku_id);
  148. },'size'])->whereExists(
  149. GoodsSku::where('id',$sku_id)->where('goods_id',Db::raw('goods.id'))->buildSql()
  150. )
  151. ->find();
  152. }
  153. $info['amount_total']=array_sum(array_column($goods,'amount'));
  154. }
  155. $info['goods']=$goods;
  156. $this->success('',$info);
  157. }
  158. /**
  159. * 获取支架商品
  160. * @ApiParams (name=sku_id,description=规格ID)
  161. * @ApiReturnParams (name=sku_id,description=规格ID,如果直接下单需要)
  162. */
  163. public function zj_goods(){
  164. $data=$this->_validate([
  165. 'sku_id'=>['require','gt:0'],
  166. ]);
  167. $sku=GoodsSku::findOrFail($data['sku_id']);
  168. $info=[
  169. 'goods'=>[],
  170. 'amount_total'=>$sku->getRealAmount(),
  171. ];
  172. $category=Category::where('name','支架')->value('id',0);
  173. $info['goods']=\app\common\model\Goods::where('category_id',$category)
  174. ->order('id','desc')
  175. ->select();
  176. foreach ($info['goods'] as $good){
  177. $good['sku_id']=$good->sku()->value('id');
  178. $info['amount_total']=bcadd($info['amount_total'],$good->sku()->find()->getRealAmount());
  179. }
  180. if($info['goods']) {
  181. }
  182. $this->success('',$info);
  183. }
  184. /**
  185. * 记录用户浏览产品时长
  186. * @ApiParams (name=goods_id,description=商品ID)
  187. * @ApiParams (name=sec,description=时长S)
  188. */
  189. public function ls(){
  190. $user=$this->auth->getUser();
  191. if(!$user){
  192. $this->success();
  193. }
  194. $data=input();
  195. if(empty($data['goods_id'])){
  196. $this->success('i');
  197. }
  198. $goods=\app\common\model\Goods::where('id',$data['goods_id'])->find();
  199. if(!$goods){
  200. $this->success('g');
  201. }
  202. $category=$goods->category;
  203. if(!$category){
  204. $this->success('c');
  205. }
  206. UserCategoryView::addSecond($user,$category,$data['sec']??0);
  207. $this->success();
  208. }
  209. /**
  210. * 计算商品价格
  211. * @ApiParams (name=sku,description=sku)
  212. * @ApiParams (name=num,description=num)
  213. * @ApiParams (name=num_install,description=num_install)
  214. * @ApiReturnParams (name=amount,description=商品价格)
  215. * @ApiReturnParams (name=amount_install,description=安装价)
  216. */
  217. public function amount(){
  218. $data=$this->_validate([
  219. 'sku'=>['require','integer'],
  220. 'num'=>['require','integer','gt:0'],
  221. 'num_install'=>['require','integer','egt:0'],
  222. ]);
  223. $sku=GoodsSku::findOrFail($data['sku']);
  224. list($_,$__,$amount)=OrderService::getAmount($sku,$sku->goods,$data['num']);
  225. $amount_install=GoodsInstallLink::getFee($sku,$data['num_install'],true);
  226. $this->success('',[
  227. 'amount'=>$amount,
  228. 'amount_install'=>$amount_install,
  229. ]);
  230. }
  231. /**
  232. * 获取sku
  233. * @ApiParams (name=size_id,description=size_id)
  234. */
  235. public function sku(){
  236. $data=$this->_validate([
  237. 'size_id'=>['require','integer',],
  238. ]);
  239. $size=GoodsSize::findOrFail($data['size_id']);
  240. $tempIds=array_column($size['names'],'temp_id');
  241. $skus=GoodsSku::show()->where('goods_id',$size['goods_id'])->select();
  242. $arr=[];
  243. foreach ($skus as $sku){
  244. if(array_intersect($sku['temp_ids'],$tempIds)){
  245. $arr[]=$sku;
  246. }
  247. }
  248. $this->success($arr);
  249. }
  250. }