You've already forked qlg.tsgz.moe
							
							Init Repo
This commit is contained in:
		
							
								
								
									
										263
									
								
								hyhproject/common/model/Shopping.php
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										263
									
								
								hyhproject/common/model/Shopping.php
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,263 @@ | ||||
| <?php | ||||
| namespace wstmart\common\model; | ||||
| use think\Db; | ||||
| /** | ||||
|  * 标签业务处理类 | ||||
|  */ | ||||
| class Shopping extends Base{ | ||||
| 	/** | ||||
| 	 * 获取助微吧商铺列表 | ||||
| 	 * @return [type] [description] | ||||
| 	 */ | ||||
| 	public function getHelpShops(){ | ||||
| 		$page = (int)input('page',1); | ||||
| 		$rs = cache('QLG_HELP_SHOPS_'.$page); | ||||
| 		if(!$rs){ | ||||
| 			$pageSize = input("post.pageSize/d",10); | ||||
| 			$goodsSize = input("post.goodsSize/d",3); | ||||
| 			$lat = input("post.lat",0); | ||||
| 			$lng = input("post.lng",0); | ||||
| 			$where['s.dataFlag'] = 1; | ||||
| 			$where['s.shopStatus'] = 1; | ||||
|             $where['s.status'] = 1; | ||||
|             $field = 's.shopId,s.shopImg,s.shopName,s.shopLevel,ROUND(12756.276*ASIN(SQRT(POW(SIN(('.$lat.'*0.0174532925-lat*0.0174532925)/2),2)+ | ||||
|                         COS('.$lat.'*0.0174532925)*COS(lat*0.0174532925)*POW(SIN(('.$lng.'*0.0174532925-lng*0.0174532925)/2),2)))*1000) AS distance'; | ||||
| 			$order = 's.shopLevel ASC'; | ||||
| 			$rs = Db::name('shops s') | ||||
| 							->where($where) | ||||
| 							->field($field) | ||||
| 							->order($order) | ||||
| 							//->cache(true,86400) | ||||
| 							->paginate($pageSize) | ||||
| 							->toArray(); | ||||
|             //dump($this->getLastSql()); | ||||
| 			if(count($rs['Rows']) == 0){ | ||||
| 				return WSTReturn('',1,$rs); | ||||
| 			} | ||||
| 			$goods_field = 'g.goodsImg,g.shopPrice,g.goodsId,g.saleTime,g.discountRate'; | ||||
| 			foreach ($rs['Rows'] as &$v) { | ||||
| 				$v['goods'] = $this->getShopGoods($v['shopId'],$goodsSize,$goods_field,2); | ||||
| 				foreach ($v['goods'] as &$val) { | ||||
| 					$val['goodsImg'] = WSTImg($val['goodsImg'],3); | ||||
| 				} | ||||
| 			} | ||||
| 			cache('QLG_HELP_SHOPS_'.$page,$rs,60); | ||||
| 		} | ||||
| 		return WSTReturn('',1,$rs); | ||||
| 	} | ||||
| 		/** | ||||
| 	 * 获取列表 | ||||
| 	 */ | ||||
| 	public function searchHelpGoods($goodsCatIds = []){ | ||||
| 		//查询条件 | ||||
| 		$keyword = input('keyword'); | ||||
| 		$brandId = input('brandId/d'); | ||||
| 		$where = $where2 = []; | ||||
| 		$where['goodsStatus'] = 1; | ||||
| 		$where['g.dataFlag'] = 1; | ||||
| 		$where['isSale'] = 1; | ||||
| 		$where['discountRate'] = ['>=',dataConf('discountRateGtToHelp')]; | ||||
| 		if($keyword!='')$where['goodsName'] = ['like','%'.$keyword.'%']; | ||||
| 		if($brandId>0)$where['g.brandId'] = $brandId; | ||||
| 		//排序条件 | ||||
| 		$orderBy = input('condition/d',0); | ||||
| 		$orderBy = ($orderBy>=0 && $orderBy<=4)?$orderBy:0; | ||||
| 		$order = (input('desc/d',0)==1)?1:0; | ||||
| 		$pageBy = ['discountRate','saleNum','shopPrice','visitNum','saleTime']; | ||||
| 		$pageOrder = ['desc','asc']; | ||||
| 		if(!empty($goodsCatIds))$where['goodsCatIdPath'] = ['like',implode('_',$goodsCatIds).'_%']; | ||||
| 		$list = Db::name('goods')->alias('g')->join("__SHOPS__ s","g.shopId = s.shopId") | ||||
| 			->where($where) | ||||
| 			->field('goodsId,goodsName,saleNum,shopPrice,marketPrice,isSpec,goodsImg,appraiseNum,visitNum,s.shopId,shopName,isSelf,isFreeShipping,gallery') | ||||
| 			->order($pageBy[$orderBy]." ".$pageOrder[$order].",goodsId asc") | ||||
| 			->paginate(input('pageSize/d'))->toArray(); | ||||
| 		return $list; | ||||
| 	} | ||||
| 	/** | ||||
| 	 * 获取逛商铺轮播 | ||||
| 	 * @return [type] [description] | ||||
| 	 */ | ||||
| 	public function getCarousel(){ | ||||
|         return WSTReturn('',1,listAds('ads-qlgshopping',6,86400)); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * 获取助微吧轮播 | ||||
| 	 * @return [type] [description] | ||||
| 	 */ | ||||
| 	public function getHelpCarousel(){ | ||||
|         return WSTReturn('',1,listAds('ads-qlghelp',6,86400)); | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	 * 获取逛商铺商铺列表 | ||||
| 	 * @return [type] [description] | ||||
| 	 */ | ||||
| 	public function getShops(){ | ||||
| 		$page = (int)input('page',1); | ||||
| 		$rs = cache('QLG_SHOPPING_SHOPS_'.$page); | ||||
| 		if(!$rs){ | ||||
| 			$pageSize = input("post.pageSize/d",10); | ||||
| 			$goodsSize = input("post.goodsSize/d",3); | ||||
| 			$lat = input("post.lat",0); | ||||
| 			$lng = input("post.lng",0); | ||||
| 			//通过获取4个点,从而获取到经度的最大值与最小值已经纬度的最大最小值,通过数据库查询获取到在此范围内的数据 | ||||
|  | ||||
| 			//获取该用户所在的地区附近的4个点 | ||||
| 			$start = $this->returnSquarePoint($lng,$lat,500); | ||||
| 			$where['s.dataFlag'] = 1; | ||||
| 			$where['s.shopStatus'] = 1; | ||||
| 			//$where['s.shopType'] = input("post.shopType/d",1);; | ||||
|             $where['s.status'] = 1; | ||||
|             $field = 's.shopId,s.shopImg,s.shopName, | ||||
|                         ROUND(12756.276*ASIN(SQRT(POW(SIN(('.$lat.'*0.0174532925-lat*0.0174532925)/2),2)+ | ||||
|                         COS('.$lat.'*0.0174532925)*COS(lat*0.0174532925)*POW(SIN(('.$lng.'*0.0174532925-lng*0.0174532925)/2),2)))*1000) AS distance'; | ||||
| //                      ROUND(6378.138*2*ASIN(SQRT(POW(SIN(('.$lat.'*PI()/180-lat*PI()/180)/2),2)+ | ||||
| //                      COS('.$lat.'*PI()/180)*COS(lat*PI()/180)*POW(SIN(('.$lng.'*PI()/180-lng*PI()/180)/2),2)))*1000) AS distance'; | ||||
| 			$order = 'distance ASC'; | ||||
|             //纬度 | ||||
| 			$where['s.lat']=array('between',array($start['left-bottom']['lat'],$start['left-top']['lat'])); | ||||
| 			//经度 | ||||
| 			$where['s.lng']=array('between',array($start['left-bottom']['lng'],$start['right-bottom']['lng'])); | ||||
| 			$rs = Db::name('shops s') | ||||
| 							->where($where) | ||||
| 							->field($field) | ||||
| 							->order($order) | ||||
| 							//->cache(true,86400) | ||||
| 							->paginate($pageSize) | ||||
| 							->toArray(); | ||||
|             //dump($this->getLastSql()); | ||||
| 			if(count($rs['Rows']) == 0){ | ||||
| 				return WSTReturn('',1,$rs); | ||||
| 			} | ||||
| //			foreach ($rs['Rows'] as &$v){ | ||||
| //                $v['distance'] = $this->getDistance($lat, $lng, $v['lat'], $v['lng']); | ||||
| //            } | ||||
| 			$goods_field = 'g.goodsImg,g.shopPrice,g.goodsId,g.saleTime,g.discountRate'; | ||||
| 			foreach ($rs['Rows'] as &$v) { | ||||
| 				$v['goods'] = $this->getShopGoods($v['shopId'],$goodsSize,$goods_field,1); | ||||
| 				foreach ($v['goods'] as &$val) { | ||||
| 					$val['goodsImg'] = WSTImg($val['goodsImg'],3); | ||||
| 				} | ||||
| 				// if($v['goods']){ | ||||
| 				// 	$v['newTime'] = $v['goods']['0']['saleTime']; | ||||
| 				// }else{ | ||||
| 				// 	$v['goods'] = []; | ||||
| 				// 	$v['newTime'] = date('Y-m-d'); | ||||
| 				// } | ||||
| 			} | ||||
| 			cache('QLG_SHOPPING_SHOPS_'.$page,$rs,10); | ||||
| 		} | ||||
| 		return WSTReturn('',1,$rs); | ||||
| 	} | ||||
| 	/** | ||||
| 	 * 获取逛商都推荐商品 | ||||
| 	 */ | ||||
| 	public function getGoods(){ | ||||
| 		$page = (int)input('page',1); | ||||
| 		$type = (int)input('type',1);//1逛商都2助微吧 | ||||
| 		$scale = 0; | ||||
| 		if(1 == $type){ | ||||
| 			$scale = dataConf('discountRateGtToShopping'); | ||||
| 		}else{ | ||||
| 			$scale = dataConf('discountRateGtToHelp'); | ||||
| 		} | ||||
| 		$cacheData = cache('QLG_SHOPPING_GOODS_'.$type.'_'.$page); | ||||
| 		if($cacheData)return $cacheData; | ||||
| 		$rs = Db::name('goods') | ||||
| 			->where(['isSale'=>1,'dataFlag'=>1,'goodsStatus'=>1,'discountRate'=>['>=',$scale]]) | ||||
| 			->field('goodsId,goodsName,goodsImg,shopPrice,saleNum,discountRate') | ||||
| 			->order('discountRate DESC,goodsId DESC') | ||||
| 			->paginate(input('pageSize/d',10))->toArray(); | ||||
| 		cache('QLG_SHOPPING_GOODS_'.$type.'_'.$page,$rs,3600); | ||||
| 		return $rs; | ||||
| 	} | ||||
| 	/** | ||||
|      * 获取店铺商品 | ||||
|      */ | ||||
|     public function getShopGoods($shopId,$num,$field,$type){ | ||||
|     	$order='saleNum DESC'; | ||||
|     	$where['g.shopId'] = $shopId; | ||||
|     	$where['g.dataFlag'] = 1; | ||||
|     	$where['g.goodsStatus'] = 1; | ||||
|         $where['g.isSale'] = 1; | ||||
|         $scale = 0; | ||||
| 		if(1 == $type){ | ||||
| 			$scale = dataConf('discountRateGtToShopping'); | ||||
| 		}else{ | ||||
| 			$scale = dataConf('discountRateGtToHelp'); | ||||
| 		} | ||||
|     	$rs = Db::name('shops')->alias('s') | ||||
| 	    	->join('__GOODS__ g','s.shopId=g.shopId','inner') | ||||
| 	    	->field($field) | ||||
| 	    	->where($where) | ||||
| 	    	->where(['discountRate'=>['>=',$scale]]) | ||||
| 	    	->limit($num) | ||||
| 	    	->order($order) | ||||
| 	    	//->cache(true,600) | ||||
| 	    	->select(); | ||||
|     	return $rs; | ||||
|     } | ||||
| 	/** | ||||
|  * 计算某个经纬度的周围某段距离的正方形的四个点 | ||||
|  * | ||||
|  * @param | ||||
|  *            radius 地球半径 平均6371km | ||||
|  * @param | ||||
|  *            lng float 经度 | ||||
|  * @param | ||||
|  *            lat float 纬度 | ||||
|  * @param | ||||
|  *            distance float 该点所在圆的半径,该圆与此正方形内切,默认值为50千米 | ||||
|  * @return array 正方形的四个点的经纬度坐标 | ||||
|  */ | ||||
| public function returnSquarePoint($lng, $lat, $distance = 50, $radius = 6371) | ||||
| { | ||||
|     $dlng = 2 * asin(sin($distance / (2 * $radius)) / cos(deg2rad($lat))); | ||||
|     $dlng = rad2deg($dlng); | ||||
|  | ||||
|     $dlat = $distance / $radius; | ||||
|     $dlat = rad2deg($dlat); | ||||
|  | ||||
|     return array( | ||||
|         'left-top' => array( | ||||
|             'lat' => $lat + $dlat, | ||||
|             'lng' => $lng - $dlng | ||||
|         ), | ||||
|         'right-top' => array( | ||||
|             'lat' => $lat + $dlat, | ||||
|             'lng' => $lng + $dlng | ||||
|         ), | ||||
|         'left-bottom' => array( | ||||
|             'lat' => $lat - $dlat, | ||||
|             'lng' => $lng - $dlng | ||||
|         ), | ||||
|         'right-bottom' => array( | ||||
|             'lat' => $lat - $dlat, | ||||
|             'lng' => $lng + $dlng | ||||
|         ) | ||||
|     ); | ||||
| } | ||||
|  | ||||
|  | ||||
| /** | ||||
|  *  @desc 根据两点间的经纬度计算距离 | ||||
|  *  @param float $lat 纬度值 | ||||
|  *  @param float $lng 经度值 | ||||
|  */ | ||||
| function getDistance($lat1, $lng1, $lat2, $lng2) | ||||
| { | ||||
|     $earthRadius = 6371000; | ||||
|     $lat1 = ($lat1 * pi() ) / 180; | ||||
|     $lng1 = ($lng1 * pi() ) / 180; | ||||
|  | ||||
|     $lat2 = ($lat2 * pi() ) / 180; | ||||
|     $lng2 = ($lng2 * pi() ) / 180; | ||||
|  | ||||
|     $calcLongitude = $lng2 - $lng1; | ||||
|     $calcLatitude = $lat2 - $lat1; | ||||
|     $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);  $stepTwo = 2 * asin(min(1, sqrt($stepOne))); | ||||
|     $calculatedDistance = $earthRadius * $stepTwo; | ||||
|     return round($calculatedDistance); | ||||
| } | ||||
|  | ||||
| } | ||||
		Reference in New Issue
	
	Block a user