313 lines
11 KiB
PHP
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 getHelpSaleShops(){
$page = (int)input('page',1);
$rs = cache('QLG_HELP_SALE_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 $k=>&$v) {
$v['goods'] = $this->getShopGoods($v['shopId'],$goodsSize,$goods_field,3);
if(sizeof($v['goods'])==0){
unset($rs['Rows'][$k]);
}
foreach ($v['goods'] as &$val) {
$val['goodsImg'] = WSTImg($val['goodsImg'],3);
}
}
cache('QLG_HELP_SALE_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 getHelpShopCarousel(){
return WSTReturn('',1,listAds('ads-qlghelpshop',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助微吧
if(1 == $type){
$scale = dataConf('discountRateGtToShopping');
}elseif(2 == $type){
$scale = dataConf('discountRateGtToHelp');
}else{
$scale = dataConf('discountRateGtToHelpShopping');
}
$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');
}elseif(2 == $type){
$scale = dataConf('discountRateGtToHelp');
}else{
$scale = dataConf('discountRateGtToHelpShopping');
}
$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);
}
}