303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
			
		
		
	
	
			303 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			PHP
		
	
	
| <?php
 | |
| namespace app\controller\api;
 | |
| 
 | |
| use app\model\CouponMain;
 | |
| use app\model\Member;
 | |
| use app\model\Slide;
 | |
| use app\model\Business;
 | |
| use app\repository\AccountRepository;
 | |
| use app\repository\BusinessRepository;
 | |
| use app\repository\CouponRepository;
 | |
| use app\repository\OperationRepository;
 | |
| use think\Collection;
 | |
| use think\Exception;
 | |
| use think\exception\ValidateException;
 | |
| use think\response\Json;
 | |
| 
 | |
| /**
 | |
|  * 消费者端:游客、普通用户
 | |
|  *
 | |
|  * Class Consumer
 | |
|  * @package app\controller\api
 | |
|  */
 | |
| class Consumer extends Base
 | |
| {
 | |
|     protected $noNeedLogin = [
 | |
|         'home',
 | |
|         'bannerList',
 | |
|     ];
 | |
| 
 | |
|     /**
 | |
|      * 获取附近商家发布的优惠卷
 | |
|      * @return Json
 | |
|      */
 | |
|     public function home()
 | |
|     {
 | |
|         $params = [
 | |
|             'businessType'          => $this->request->param('businessType/d', 0), // 商家类型
 | |
|             'couponType'            => $this->request->param('couponType/d', 0), // 优惠卷类型
 | |
|             'businessCode'          => $this->request->param('businessCode/s'), // 商家code
 | |
|             'businessCircleId'      => $this->request->param('businessCircle/d',0), // 商圈id
 | |
|             'dis'                   => $this->request->param('dis/d', -1), // 距离,单位为km
 | |
|             'lng'                   => $this->request->param('lng/f', 0), // 经度 104.752890
 | |
|             'lat'                   => $this->request->param('lat/f', 0), // 纬度 31.465040
 | |
|             'keyword'               => $this->request->param('key/s', ''), // 关键词查询
 | |
|             'page'                  => $this->request->param('page/d', 1),
 | |
|             'size'                  => $this->request->param('size/d', 10),
 | |
|         ];
 | |
| 
 | |
| 
 | |
|         try {
 | |
|             $repo   = CouponRepository::getInstance();
 | |
|             $nowDate    = date('Y-m-d H:i:s');
 | |
| 
 | |
| 
 | |
|             $lngRange   = [];
 | |
|             $latRange   = [];
 | |
|             $whereMap   = [];
 | |
|             $sortOrder  = ['square'=> 'asc', 'id'=>'desc'];
 | |
| 
 | |
|             $whereMap[] = ['status', '=', CouponMain::status_on];
 | |
|             $whereMap[] = ['on_shelf', '=', CouponMain::on_shelf_on];
 | |
|             //$whereMap[] = ['start_time', '< TIME', $nowDate];
 | |
|             $whereMap[] = ['end_time', '> TIME', $nowDate];
 | |
|             $whereMap[] = ['using_count', '>', 0];
 | |
| 
 | |
|             if (!empty($params['keyword'])) {
 | |
|                 $whereMap[] = ['name|business_name', 'like', "%".$params['keyword']."%"];
 | |
|             }
 | |
|             if ($params['businessType'] > 0) {
 | |
|                 $whereMap[] = ['business_type', '=', $params['businessType']];
 | |
|             }
 | |
|             if ($params['couponType'] > 0) {
 | |
|                 $whereMap[] = ['type', '=', $params['couponType']];
 | |
|             }
 | |
|             if (!empty($params['businessCode'])) {
 | |
|                 $whereMap[] =  ['business_code', '=', $params['businessCode']];
 | |
|             }
 | |
|             if (($params['businessCircleId']) > 0 ) {
 | |
|                 $whereMap[] =  ['business_circle_id', '=', $params['businessCircleId']];
 | |
|             }
 | |
| 
 | |
|             if ($params['dis'] > 0) {
 | |
|                 $pointList = getEarthSquareRangePoint($params['lat'],$params['lng'], $params['dis']);
 | |
|                 $latRange[]   = ['lat', 'BETWEEN', [$pointList['lat_min'], $pointList['lat_max']]];
 | |
|                 if (abs($pointList['cur_lng'] - $pointList['lng_min']) != $pointList['dis_lng'] && $pointList['lng_min'] < 0) {
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [-180, $pointList['lng_min']]];
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [($pointList['cur_lng'] - $pointList['dis_lng']), 180]];
 | |
|                 } else {
 | |
|                     $lngRange[] = ['lng', 'BETWEEN' , [$pointList['lng_min'], $pointList['lng_max']]];
 | |
|                 }
 | |
|             }
 | |
| 
 | |
| 
 | |
| 
 | |
|             $res    = $repo->findCouponMainList($whereMap,[], $params['page'], $params['size'], function ($q) use($lngRange, $latRange, $params) {
 | |
|                     return $q->with(["business"=>function($q){
 | |
|                         return $q->field("business_subtitle,code");
 | |
|                     }])->when(!empty($lngRange) && !empty($latRange), function($query) use($lngRange, $latRange){
 | |
|                         $query->where(function ($queryB) use($lngRange) {
 | |
|                             $queryB->whereOr($lngRange);
 | |
|                         })->where($latRange);
 | |
|                     })
 | |
|                     ->field("*, abs( (IFNULL(lat,0) - {$params['lat']})  *  (IFNULL(lng,0) - {$params['lng']})  ) as square");
 | |
|             }, $sortOrder);
 | |
| 
 | |
|             $accountRepo= AccountRepository::getInstance();
 | |
| 
 | |
|             $accountId = $this->request->user['user_id'] ?? 0;
 | |
|             $flowArray = [];
 | |
|             if ($accountId) {
 | |
|                 $account = $accountRepo->findById($accountId, [], function ($q) {
 | |
|                     return $q->with(['business', 'parent']);
 | |
|                 });
 | |
|                 if (!empty($account)) {
 | |
|                     $flowArray = $accountRepo->getBusinessFlowCodeArray($account->user_code);
 | |
|                 }
 | |
|             }
 | |
|             $time = time();
 | |
|             $res['list']->each(function ($item) use ($params, $flowArray, $time) {
 | |
|                 unset($item->square);
 | |
|                 $distance = (get_distance($params["lat"], $params["lng"], $item["lat"],$item["lng"]));
 | |
|                 if ($distance >= 1000) {
 | |
|                     $item->distance_text = round($distance / 1000, 2) . "km";
 | |
|                 } else {
 | |
|                     $item->distance_text = $distance . "m";
 | |
|                 }
 | |
| 
 | |
|                 //是否收藏了该签到券的商家
 | |
|                 $item->isFlow = in_array($item->business_code,$flowArray);
 | |
| 
 | |
|                  $item->couponId            = $item->id;
 | |
|                  $item->businessCode        = $item->business_code;
 | |
|                  $item->businessName        =  $item->business_name;
 | |
|                  $item->cover               =  $this->request->domain().$item->image_url;
 | |
|                  $item->couponName          =  $item->name;
 | |
| 
 | |
|                 //到期状态  到期前7天!!!!!!!!没做完
 | |
|                 $weekTime = 7 * 86400;
 | |
|                 $endTime = strtotime($item->end_time);
 | |
|                 if (($endTime - $time) < $weekTime) {
 | |
|                     $ExpirationTime = ($endTime - $time) / 86400;
 | |
|                     $item->expirationTimeStr = "还有" . ceil($ExpirationTime) . "到期";
 | |
|                 } else {
 | |
|                     $item->expirationTimeStr = '';
 | |
|                 }
 | |
|             });
 | |
| 
 | |
|             return $this->json(0, 'success', $res);
 | |
|         } catch (\Exception $e) {
 | |
|             return $this->json(0, 'success', [
 | |
|                 "total" => 0,
 | |
|                 "current" => $params['page'],
 | |
|                 "size" => $params['size'],
 | |
|                 "list" => new Collection()
 | |
|             ]);
 | |
|         }
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * banner列表
 | |
|      * */
 | |
|     public function bannerList()
 | |
|     {
 | |
|         $repo       = OperationRepository::getInstance();
 | |
|         $whereMap   = [];
 | |
|         $orders     = ['sort'=>'asc'];
 | |
|         $page       = input("page/d",1);
 | |
|         $size       = input("size/d",1000);
 | |
|         $whereMap[] = ['position', '=', Slide::homePosition];
 | |
|         $list = $repo->slideList($whereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
 | |
|             return $q->withAttr("image",function ($value){
 | |
|                 return $this->request->domain() . $value;
 | |
|             });
 | |
|         }, $orders);
 | |
|         return $this->json(1,"ok",$list["list"]);
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * 广告列表
 | |
|      * */
 | |
|     public function advertisement()
 | |
|     {
 | |
|         $repo       = OperationRepository::getInstance();
 | |
| 
 | |
|         $orders     = ['sort'=>'asc'];
 | |
|         $page       = input("page/d",1);
 | |
|         $size       = input("size/d",1000);
 | |
| 
 | |
|         $couponId   = input("coupon_id/d",0);
 | |
|         $coupon = CouponRepository::getInstance()->findById($couponId, [], function ($q) {
 | |
|             return $q->with([
 | |
|                 "business" => function ($q) {
 | |
|                     $q->field("code,id,business_name,business_subtitle,is_assign,agency_code");
 | |
|                 }
 | |
|             ]);
 | |
|         });
 | |
|         if(empty($coupon)){
 | |
|             return $this->json(4001,"优惠券不存在");
 | |
|         }
 | |
|         if(!isset($coupon->business)||empty($coupon->business)){
 | |
|             return $this->json(4001,"优惠券商家不存在");
 | |
|         }
 | |
| 
 | |
|         //如果优惠券所属商家指派了渠道商
 | |
|         if ($coupon->business->is_assign == Business::COMMON_ON && !empty($coupon->business->agency_code)) {
 | |
|             $agency = Member::findOne([["business_code","=",$coupon->business->agency_code]]);
 | |
|             if(empty($agency)){
 | |
|                 $awhereMap   = [];
 | |
|                 $awhereMap[] = ['position', '=', Slide::advertisement];
 | |
|                 $awhereMap[] = ['agency_id', '=', $agency["id"]];
 | |
|                 $list = $repo->slideList($awhereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
 | |
|                     return $q->withAttr("image",function ($value){
 | |
|                         return $this->request->domain() . $value;
 | |
|                     });
 | |
|                 }, $orders);
 | |
| 
 | |
|                 return $this->json(1,"ok",$list["list"]);
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         $whereMap   = [];
 | |
|         $whereMap[] = ['position', '=', Slide::advertisement];
 | |
|         $list = $repo->slideList($whereMap, ["id","title","src as image","url","url_type as type"], $page, $size, function ($q){
 | |
|             return $q->withAttr("image",function ($value){
 | |
|                 return $this->request->domain() . $value;
 | |
|             });
 | |
|         }, $orders);
 | |
|         return $this->json(1,"ok",$list["list"]);
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 关注/取消关注一个商家
 | |
|      * */
 | |
|     public function flowBusiness()
 | |
|     {
 | |
|         $accountId = $this->request->user['user_id'] ?? 0;
 | |
|         $accountRepo = AccountRepository::getInstance();
 | |
|         try {
 | |
|             $account = $accountRepo->findById($accountId, [], function ($q) {
 | |
|                 return $q->with(['business', 'parent']);
 | |
|             });
 | |
|             if (empty($account)) {
 | |
|                 throw new ValidateException('用户无效!');
 | |
|             }
 | |
| 
 | |
|             $businessCode = input("businessCode/s");
 | |
|             $business = BusinessRepository::getInstance()->findOneByWhere(["code"=>$businessCode]);
 | |
|             if(empty($business)){
 | |
|                 throw new ValidateException('商家无效!');
 | |
|             }
 | |
|             $businessFlow = $accountRepo->hasBusinessFlow($account->user_code,$businessCode);
 | |
| 
 | |
|             //如果关注了 就删除
 | |
|             if($businessFlow){
 | |
|                 $businessFlow->delete();
 | |
|             }else{
 | |
|                 //没有关注就添加
 | |
|                 $accountRepo->createBusinessFlow($account->user_code,$businessCode,$business->business_name);
 | |
|             }
 | |
|             return $this->json();
 | |
| 
 | |
|         } catch (ValidateException $e) {
 | |
|             return $this->json(4001, $e->getError());
 | |
|         } catch (Exception $e) {
 | |
|             return $this->json(5001, '服务器繁忙!');
 | |
|         }
 | |
|     }
 | |
| 
 | |
| 
 | |
|     /**
 | |
|      * 关注商家的列表
 | |
|      * */
 | |
|     public function getFlowBusiness()
 | |
|     {
 | |
|         $accountId      = $this->request->user['user_id'] ?? 0;
 | |
|         $page           = $this->request->param('page/d', 1);
 | |
|         $size           = $this->request->param('size/d', 10);
 | |
|         $keyword        = input("keyWord/s");
 | |
|         $accountRepo = AccountRepository::getInstance();
 | |
|         try {
 | |
|             $account = $accountRepo->findById($accountId, [], function ($q) {
 | |
|                 return $q->with(['business', 'parent']);
 | |
|             });
 | |
|             if (empty($account)) {
 | |
|                 throw new ValidateException('用户无效!');
 | |
|             }
 | |
|             $data = AccountRepository::getInstance()->getBusinessFlowList($account->user_code,$page,$size,$keyword);
 | |
|             $data["list"]->each(function ($item){
 | |
|                 $item->businessCover = $this->request->domain() . $item->background;
 | |
|             });
 | |
|             return $this->json(0,"success",$data);
 | |
|         }catch (ValidateException $e) {
 | |
|             return $this->json(4001, $e->getError());
 | |
|         } catch (Exception $e) {
 | |
|             echo $e->getMessage();
 | |
|             return $this->json(5001, '服务器繁忙!获取用户个人信息失败');
 | |
|         }
 | |
| 
 | |
|     }
 | |
| } |