123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- <?php namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Api\Api;
- use App\Http\Requests\Api\Product as Request;
- use App\Models\Business;
- use App\Models\Custom;
- use App\Models\Product as Model;
- use App\Models\Product\Attr as ProductAttr;
- use App\Models\Product\Spec as ProductSpec;
- use App\Models\Product\Skus as ProductSkus;
- use App\Models\ProductPhoto;
- use App\Models\PromoProduct;
- use App\Models\PromoRebate;
- use App\Models\RegimentActive;
- use App\Models\Regiment;
- use App\Models\WeiBan\Tags as WeiBanTags;
- /**
- * 产品接口
- *
- * @author 刘相欣
- *
- * */
- class Product extends Api{
- /**
- * 获取产品列表 /api/product/get_list
- *
- * @param string $name 产品名称
- * @param int $page 页码,默认1
- * @param int $limit 每页条数,默认10条
- *
- * */
- public function get_list(Request $request,Model $Model,Custom $Custom,RegimentActive $RegimentActive,WeiBanTags $WeiBanTags){
- // 接口验签
- // $this->verify_sign();
- // 验证参数
- $request->scene('get_list')->validate();
- // 检查登录
- $uid = $this->getUid();
- // 获取客户信息
- $custom = $uid ? $Custom->getOne($uid) : [];
- // 接收参数
- $name = request('name','');
- $limit = request('limit',10);
- $cityId = empty($custom['city_id']) ? 0 : $custom['city_id'];
- // 显示
- $map = [['status','=','0'],['stock','>',0]];
- // 分类ID
- if( $name ) $map[] = ['name','like','%'.$name.'%'];
- // 是否有城市
- $wherIn = empty($custom['city_id']) ? [1] : [1,$custom['city_id']];
- // 获取分页信息
- $Paginator = $Model->query()
- ->join('product_city','product_city.product_id','=','product.id')
- ->where($map)
- ->whereIn('product_city.city_id',$wherIn)
- ->groupBy('product_id')
- ->orderBy('product.sort')
- ->orderBy('product.id')
- ->paginate($limit,['product.id','product.sort','product.name','product.tag_scope','product.tag_exclude','product.thumb','product.spec','product.price','product.market_price','product.stock']);
- // 获取数据
- $data['total'] = $Paginator->total();
- $data['current_page'] = $Paginator->currentPage();
- $data['per_page'] = $Paginator->perPage();
- $data['last_page'] = $Paginator->lastPage();
- $data['data'] = $Paginator->items();
- //产品促销活动
- $productIds = array_column($Paginator->items(),'id');
- $time = time();
- $where = [
- ['promo.status','=','0'],
- ['promo.start_time','<=',$time],
- ['promo.end_time','>=',$time],
- ['promo_product.status','=',0],
- ];
- // 查询促销活动
- $promoList = PromoProduct::query()
- ->join('promo','promo.id','=','promo_product.promo_id')
- ->where($where)
- ->whereIn('promo_product.product_id',$productIds)
- ->select('promo.*','promo_product.product_id','promo_product.id as promo_product_id')
- ->get()
- ->toArray();
- // 查询促销活动
- if ($promoList) $promoList = array_column($promoList,NULL,'product_id');
- // 查询用户标签
- $tags = $custom ? $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']) : [];
- $tagsList = array_column($tags,'name');
- // 处理请求
- foreach ( $data['data'] as $key => $value ) {
- // 判断是不是可以参与
- if( $value['tag_scope'] ) {
- // 解析数组
- $value['tag_scope'] = explode(',',$value['tag_scope']);
- // 如果没有交集,不在参与范围内
- if( !array_intersect($value['tag_scope'],$tagsList) ) {
- unset($data['data'][$key]);
- continue;
- }
- }
- // 判断是不是可以参与
- if( $value['tag_exclude'] ) {
- // 解析数组
- $value['tag_exclude'] = explode(',',$value['tag_exclude']);
- // 如果有交集,在排除范围内
- if( array_intersect($value['tag_exclude'],$tagsList) ) {
- unset($data['data'][$key]);
- continue;
- }
- }
- // 处理数据
- $value['thumb'] = path_compat($value['thumb']);
- $value['regiment_active_id'] = null;
- $value['regiment_title'] = '';
- // 查询产品拼团信息
- $regiment = $RegimentActive::query()->where([['status','=',1],['start_time','<=',$time],['end_time','>=',$time],['product_id','=',$value['id']]])->first(['id as active_id','number','automatic']);
- // 如果有拼团信息
- if ( $regiment ) {
- $value['regiment_active_id']= $regiment['id'];
- $value['regiment_title'] = $regiment['automatic'] == 1 ? '多人团' : $regiment['number'].'人团';
- }
- if ($promoList && $cityId){
- if (isset($promoList[$value['id']])){
- $promoInfo = $promoList[$value['id']];
- $promoTitle = '';
- if ($promoInfo['rebate_type'] == 1){
- $promoTitle = "满减";
- }elseif ($promoInfo['rebate_type'] == 2){
- $promoTitle .= "满折";
- }elseif ($promoInfo['rebate_type'] == 3){
- $promoTitle .= "满赠";
- }
- $promoInfoCity = [];
- if ($promoInfo['city_ids']){
- $promoInfoCity = explode(',',$promoInfo['city_ids']);
- }
- // 判断是不是可以参与
- if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){
- if( $promoInfo['tag_scope']) {
- // 解析数组
- $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']);
- // 标签范围限定时,默认不能参与
- $allowJoin = 0;
- // 判断标签是不是存在
- if ($tags){
- foreach ($tags as $v) {
- // 标签范围内,允许参加
- if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1;
- }
- // 在范围
- if( $allowJoin ) {
- $value['promo_title'] = $promoTitle;
- }
- }
- }else{
- $value['promo_title'] = $promoTitle;
- }
- }
- }
- }
- // 重组数据
- $data['data'][$key] = $value;
- }
- // 数据重组
- $data['data'] = array_values($data['data']);
- // 返回结果
- return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
- }
- /**
- * 获取产品列表 /api/product/get_detail
- *
- * @param int $id 产品id
- *
- * */
- public function get_detail(Request $request, Model $Model, ProductPhoto $ProductPhoto, Business $Business, ProductAttr $ProductAttr, ProductSpec $ProductSpec, ProductSkus $ProductSkus, RegimentActive $RegimentActive, Regiment $Regiment, Custom $Custom, WeiBanTags $WeiBanTags, PromoProduct $PromoProduct){
- // 接口验签
- // $this->verify_sign();
- // 验证参数
- $request->scene('get_detail')->validate();
- // 检查登录
- $uid = $this->checkLogin();
- // 获取客户信息
- $custom = $uid ? $Custom->getOne($uid) : [];
- // 接收参数
- $id = request('id',0);
- // 显示
- $map[] = ['status','=','0'];
- // 查询
- $data = $Model->query()->where($map)->find($id,['id','name','thumb','stock','spec','poster','price','business_id','market_price']);
- // 如果没有数据
- if( !$data ) return json_send(['code'=>'error','msg'=>'产品已下架','data'=>['error'=>'产品已下架或不存在']]);
- // 转数组
- $data = $data->toArray();
- // 处理数据
- $data['thumb'] = path_compat($data['thumb']);
- $data['poster'] = $data['poster'] ? path_compat($data['poster']) : '';
- $data['description'] = $Model->getDesc($id);
- $data['business_info'] = $Business->getOne($data['business_id']);
- $data['photo_list'] = $ProductPhoto->getListByProductId($id);
- // 缩略图处理
- foreach ($data['photo_list'] as $key => $value) {
- $value['thumb'] = path_compat($value['thumb']);
- $data['photo_list'][$key] = $value;
- }
- // 主图追加进去
- if( $data['photo_list'] ) array_unshift($data['photo_list'],['id'=>0,'sort'=>0,'thumb'=>$data['thumb']]);
- // 获取产品属性
- $attr = $ProductAttr->getListByProductId($id);
- // 规格属性
- $specAttr = [];
- // 获取数据
- foreach ($attr as $value) {
- // 默认未选中
- $value['active'] = 0;
- $specAttr[$value['spec_id']]['spec_id'] = $value['spec_id'];
- $specAttr[$value['spec_id']]['spec_name'] = $ProductSpec->getOne($value['spec_id'],'name');
- $specAttr[$value['spec_id']]['attr_list'][] = $value;
- }
- // 获取规格详情数据
- $data['product_attr'] = array_values($specAttr);
- // 获取SKU数据
- $data['product_sku'] = $ProductSkus->getListByProductId($id);
- // 获取数据
- foreach ($data['product_sku'] as $key=>$value) {
- // 默认未选中
- $value['sku_thumb'] = $value['sku_thumb'] ? path_compat($value['sku_thumb']) : '';
- $data['product_sku'][$key]= $value;
- }
- // 手机号
- if( isset($data['business_info']['phone']) ) unset($data['business_info']['phone']);
- if( isset($data['business_info']['logopic']) ) $data['business_info']['logopic'] = path_compat($data['business_info']['logopic']);
- //拼团数据
- $time = time();
- $regimentWhere = [
- ['status','=',1],
- ['start_time','<=',$time],
- ['end_time','>=',$time],
- ['product_id','=',$data['id']]
- ];
- $regimentActive = $RegimentActive::query()
- ->where($regimentWhere)
- ->first();
- $data['regiment_list'] = [];
- $data['automatic_info'] = [];
- if ( $regimentActive ){
- $data['regiment_number'] = $regimentActive['number'];
- $data['regiment_active_id'] = $regimentActive['id'];
- $data['regiment_price'] = $regimentActive['regiment_price'];
- $data['regiment_quota'] = $regimentActive['quota'];
- $data['regiment_active'] = $regimentActive;
- $data['automatic_info'] = [];
- if ($regimentActive['automatic'] == 1){
- $automaticInfo = $Regiment::query()->where([['status','=',0],['active_id','=',$regimentActive['id']],['start_time','<=',$time],['end_time','>=',$time]])->first();
- if ($automaticInfo){
- $data['automatic_info'] = $automaticInfo;
- $data['regiment_type'] = 1;
- }else{
- $data['regiment_type'] = 2;
- }
- $data['regiment_title'] = '多人团';
- }else{
- $data['regiment_title'] = $regimentActive['number'].'人团';
- $data['regiment_type'] = 2;
- $regiment = $Regiment::query()
- ->join('custom','custom.uid','=','regiment.custom_uid')
- ->where([['regiment.active_id','=',$data['regiment_active_id']],['regiment.product_id','=',$data['id']],['regiment.status','=',0],['regiment.start_time','<=',$time],['regiment.end_time','>=',$time]])
- ->select(['regiment.*','custom.username','custom.userpic'])
- ->get();
- if ($regiment){
- foreach ($regiment as &$value) {
- $value['userpic'] = $value['userpic'] ? path_compat($value['userpic']) : '';
- $surplusNumber = $data['regiment_number'] - $value['people_number'];
- if ($surplusNumber > 0){
- $value['surplus_number'] = $surplusNumber;
- }else{
- $value['surplus_number'] = 0;
- }
- }
- $data['regiment_list'] = $regiment;
- }
- }
- }else{
- $data['regiment_active_id'] = null;
- $data['regiment_type'] = 0;
- }
- // 查询用户标签
- $tags = [];
- $cityId = '';
- if ($custom){
- $tags = $WeiBanTags->getListByWeibanExtid($custom['weiban_extid']);
- $cityId = $custom['city_id'];
- }
- //促销活动信息
- $promoInfo = $PromoProduct->getListById($data['id']);
- if ($promoInfo && $cityId){
- $promoTitle = "满". $promoInfo['std_pay']. "元";
- if ($promoInfo['rebate_type'] == 1){
- $promoTitle .= "减". $promoInfo['rebate']. "元";
- }elseif ($promoInfo['rebate_type'] == 2){
- $promoTitle .= "打". $promoInfo['rebate']. "折";
- }elseif ($promoInfo['rebate_type'] == 3){
- $rebate = (string) PromoRebate::query()->join('product','promo_rebate.product_id','=','product.id')->where([['promo_id','=',$promoInfo['id']]])->value('product.name');
- $promoTitle .= "赠送". $rebate;
- }
- $promoInfoCity = [];
- if ($promoInfo['city_ids']){
- $promoInfoCity = explode(',',$promoInfo['city_ids']);
- }
- // 判断是不是可以参与
- if (!$promoInfoCity || in_array($cityId,$promoInfoCity)){
- if( $promoInfo['tag_scope']) {
- // 解析数组
- $promoInfo['tag_scope'] = explode(',',$promoInfo['tag_scope']);
- // 标签范围限定时,默认不能参与
- $allowJoin = 0;
- // 判断标签是不是存在
- if ($tags){
- foreach ($tags as $v) {
- // 标签范围内,允许参加
- if( in_array($v['name'],$promoInfo['tag_scope']) ) $allowJoin = 1;
- }
- // 在范围
- if( $allowJoin ) {
- $data['promo_title'] = $promoTitle;
- }
- }
- }else{
- $data['promo_title'] = $promoTitle;
- }
- }
- }
- // 返回结果
- return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
- }
- /**
- * 获取产品列表 /api/product/get_sku
- *
- * @param int $id 产品id
- *
- * */
- public function get_sku(Request $request,ProductAttr $ProductAttr,ProductSpec $ProductSpec,ProductSkus $ProductSkus ){
- // 接口验签
- // $this->verify_sign();
- // 验证参数
- $request->scene('get_sku')->validate();
- // 检查登录
- $uid = $this->checkLogin();
- // 接收参数
- $id = request('id',0);
- // 获取产品属性
- $attr = $ProductAttr->getListByProductId($id);
- // 规格属性
- $specAttr = [];
- // 获取数据
- foreach ($attr as $value) {
- // 默认未选中
- $value['active'] = 0;
- $specAttr[$value['spec_id']]['spec_id'] = $value['spec_id'];
- $specAttr[$value['spec_id']]['spec_name'] = $ProductSpec->getOne($value['spec_id'],'name');
- $specAttr[$value['spec_id']]['attr_list'][] = $value;
- }
- // 获取规格详情数据
- $data['product_attr'] = $specAttr;
- // 获取SKU数据
- $data['product_sku'] = $ProductSkus->getListByProductId($id);
- // 返回结果
- return json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
- }
- }
|