123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <?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\GoodsInstallLink;
- use app\common\model\GoodsSize;
- use app\common\model\GoodsSku;
- use app\common\model\UserCategoryView;
- use app\common\service\OrderService;
- use app\common\validate\KillService;
- use think\Db;
- use think\db\Query;
- /**
- * 商城商品接口
- * @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正序")
- * @ApiParams (name=category_id,description="分类ID")
- */
- public function index(){
- $data=input();
- $map=[];
- if(!empty($data['name'])){
- $map['name']=['like',"%{$data['name']}%"];
- }
- if(!empty($data['category_id'])){
- $map['category_id']=$data['category_id'];
- }
- $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()
- ->filterNormal()
- ->where($map)
- ->field('content',true)
- ->order(...$order)
- ->paginate($data['limit']??20);
- $this->success('',$query);
- }
- /**
- * 商品详情
- * @ApiParams (name=id,description=商品ID)
- * @ApiParams (name=num_install,description=安装量)
- * @ApiParams (name=skuid,description=规格ID)
- * @ApiReturnParams (name=send_day,description=发货时间)
- * @ApiReturnParams (name=amount_install_single,description=安装费单价)
- */
- public function show(){
- $data=$this->_validate([
- 'id'=>['require','gt:0'],
- ]);
- $num_install=input('num_install',0);
- $skuid=input('skuid',0);
- $user=$this->auth->getUser();
- $killConfig=KillService::getConfig();
- $goods=\app\common\model\Goods::with(['sku','detail','service','size'])->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');
- $day=config('site.send_delay_day')?:2;
- $goods['send_day']=date('m月d日',strtotime("+{$day}days"));
- $goods['amount_install_single']=0;
- if($skuid && $num_install) {
- $goods['amount_install_single']= GoodsInstallLink::getFee($skuid,$num_install,true);
- }
- $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']??3;
- $recommend=\app\common\model\Goods::where('category_id',Category::C_PEIJIAN)
- ->with(['sku','size'])->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_sku_id');
- $info=[
- 'goods'=>[],
- 'amount_total'=>$sku['amount']
- ];
- $goods=[];
- if($binds){
- foreach ($binds as $sku_id){
- $goods[]=\app\common\model\Goods::with(['sku'=>function(Query $query) use ($sku_id) {
- $query->where('id',$sku_id);
- },'size'])->whereExists(
- GoodsSku::where('id',$sku_id)->where('goods_id',Db::raw('goods.id'))->buildSql()
- )
- ->find();
- }
- $info['amount_total']=array_sum(array_column($goods,'amount'));
- }
- $info['goods']=$goods;
- $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');
- $info['amount_total']=bcadd($info['amount_total'],$good->sku()->find()->getRealAmount());
- }
- if($info['goods']) {
- }
- $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();
- }
- /**
- * 计算商品价格
- * @ApiParams (name=sku,description=sku)
- * @ApiParams (name=num,description=num)
- * @ApiParams (name=num_install,description=num_install)
- * @ApiReturnParams (name=amount,description=商品价格)
- * @ApiReturnParams (name=amount_install,description=安装价)
- */
- public function amount(){
- $data=$this->_validate([
- 'sku'=>['require','integer'],
- 'num'=>['require','integer','gt:0'],
- 'num_install'=>['require','integer','egt:0'],
- ]);
- $sku=GoodsSku::findOrFail($data['sku']);
- list($_,$__,$amount)=OrderService::getAmount($sku,$sku->goods,$data['num']);
- $amount_install=GoodsInstallLink::getFee($sku,$data['num_install'],true);
- $this->success('',[
- 'amount'=>$amount,
- 'amount_install'=>$amount_install,
- ]);
- }
- /**
- * 获取sku
- * @ApiParams (name=size_id,description=size_id)
- */
- public function sku(){
- $data=$this->_validate([
- 'size_id'=>['require','integer',],
- ]);
- $size=GoodsSize::findOrFail($data['size_id']);
- $tempIds=array_column($size['names'],'temp_id');
- $skus=GoodsSku::show()->where('goods_id',$size['goods_id'])->select();
- $arr=[];
- foreach ($skus as $sku){
- if(array_intersect($sku['temp_ids'],$tempIds)){
- $arr[]=$sku;
- }
- }
- $this->success($arr);
- }
- }
|