Commit 9b028fd8 authored by liuyuzhen's avatar liuyuzhen

店铺经纬度地址修改

parent c644aa8f
...@@ -115,4 +115,8 @@ class StoreController extends \Our\Controller_AbstractIndex { ...@@ -115,4 +115,8 @@ class StoreController extends \Our\Controller_AbstractIndex {
$this->success($couponTitles); $this->success($couponTitles);
} }
public function editQmStoreClassAction(){
$this->storeService->editQmStoreClass();
}
} }
\ No newline at end of file
...@@ -74,6 +74,26 @@ class CommonExtension { ...@@ -74,6 +74,26 @@ class CommonExtension {
return $c; return $c;
} }
/**
* 判断地址是否在多边形内
* @param $lat 地址纬度
* @param $lng 地址经度
* @param $coordStr 多边形区域字符串
* @return bool
*/
public static function locationInArea($lat,$lng,$coordStr){
if(!($lat&&$lng)){
return false;
}
$str = str_replace('\"','"',$coordStr);
$coordArray = json_decode($str,true);
if(is_array($coordArray)&&count($coordArray)>0){
$location = array('lat'=>$lat,'lng'=>$lng);
$in_store_service_flag = self::isPointInPolygon($coordArray,$location);
return $in_store_service_flag;
}
return false;
}
/** /**
......
<?php
namespace Store;
/**
* User: liuyuzhen
* Date: 2018/10/18
* Time: 17:34
* Description:
*/
class StoreUtil {
public function checkAddressInServiceArea($address,$storeId){
$storeDao = \DAO\StoreModel::getInstance();
$store = $storeDao->get($storeId,false);
$inAreaFlag = false ;
$qmStoreClassDao = \DAO\QmStoreClassModel::getInstance();
$qmClassCon['store_id'] = $storeId;
$qmClassCon['is_charged'] = 1;
$qmClassCon['class_style'] = 2;
$qmSignScopeList = \Our\RedisHelper::cachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(),array(&$qmStoreClassDao, 'selectByWhere'),array($qmClassCon,'sign_scope'),\Our\ApiConst::oneHour,array($storeId));
if($qmSignScopeList){
foreach($qmSignScopeList as $qmSignScope){
if($qmSignScope['sign_scope']){
$inAreaFlag = \Our\CommonExtension::locationInArea($address['lat'],$address['lng'],$qmSignScope['sign_scope']);
if($inAreaFlag){
return true;
}
}
}
}
if(!$store['store_sales_scope']){
return false;
}
$inAreaFlag = \Our\CommonExtension::locationInArea($address['lat'],$address['lng'],$store['store_sales_scope']);
return $inAreaFlag;
}
/**
* 经纬度是否在店铺地址范围内
* @param $lat
* @param $lng
* @param $storeId
* @return bool
*/
public function checkLocationInServiceArea($lat,$lng,$storeId){
return self::checkAddressInServiceArea(array('lat'=>$lat,'lng'=>$lng),$storeId);
}
/**
* 类实例
*
*/
private static $_instance = null;
/**
* 单例模式获取类实例
*
*/
public static function getInstance()
{
if (!(self::$_instance instanceof self)) {
self::$_instance = new self();
}
return self::$_instance;
}
}
\ No newline at end of file
...@@ -623,7 +623,7 @@ class CartServiceModel extends \Business\AbstractModel{ ...@@ -623,7 +623,7 @@ class CartServiceModel extends \Business\AbstractModel{
} }
$str = str_replace('\"','"',$store['store_sales_scope']); $str = str_replace('\"','"',$store['store_sales_scope']);
$store_sales_scope = json_decode($str,true); $store_sales_scope = json_decode($str,true);
$result = \Our\CommonExtension::isPointInPolygon($store_sales_scope, array('lng'=>$address['lng'],'lat'=>$address['lat'])); $result = \Store\StoreUtil::getInstance()->checkAddressInServiceArea(array('lng'=>$address['lng'],'lat'=>$address['lat']),$storeId);
$storeDistance = \Our\CommonExtension::getDistance($address['lat'],$address['lng'],$store['store_latitude'],$store['store_longitude'],\Our\ApiConst::one); $storeDistance = \Our\CommonExtension::getDistance($address['lat'],$address['lng'],$store['store_latitude'],$store['store_longitude'],\Our\ApiConst::one);
if($result){ if($result){
......
...@@ -32,7 +32,7 @@ class GoodsClassServiceModel extends \Business\AbstractModel{ ...@@ -32,7 +32,7 @@ class GoodsClassServiceModel extends \Business\AbstractModel{
$qmStoreClassCon['city_code'] = $cityCode; $qmStoreClassCon['city_code'] = $cityCode;
$qmStoreClassCon['is_charged'] = \Our\ApiConst::one; $qmStoreClassCon['is_charged'] = \Our\ApiConst::one;
$qmStoreClassCon['class_style'] = \Our\ApiConst::signClassStyle; $qmStoreClassCon['class_style'] = \Our\ApiConst::signClassStyle;
$storeField = 'gc_id,longitude,latitude,sign_rang,gc_parent_id,store_id'; $storeField = 'gc_id,sign_scope,gc_parent_id,store_id';
$qmStoreClassDao = \DAO\QmStoreClassModel::getInstance(); $qmStoreClassDao = \DAO\QmStoreClassModel::getInstance();
$signStoreClasses = \Our\RedisHelper::cachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(),array(&$qmStoreClassDao, 'getStoreClasses'),array($qmStoreClassCon,$storeField),\Our\ApiConst::oneHour,array($cityCode)); $signStoreClasses = \Our\RedisHelper::cachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(),array(&$qmStoreClassDao, 'getStoreClasses'),array($qmStoreClassCon,$storeField),\Our\ApiConst::oneHour,array($cityCode));
...@@ -159,18 +159,13 @@ class GoodsClassServiceModel extends \Business\AbstractModel{ ...@@ -159,18 +159,13 @@ class GoodsClassServiceModel extends \Business\AbstractModel{
$serviceStoreIds = array(); $serviceStoreIds = array();
if($storeList){ if($storeList){
foreach ($storeList as $key=>$store){ foreach ($storeList as $key=>$store){
if($store['store_sales_scope']){ $result =\Store\StoreUtil::getInstance()->checkAddressInServiceArea(array('lng'=>$where['lng'],'lat'=>$where['lat']),$store['store_id']);
$str = str_replace('\"','"',$store['store_sales_scope']); if($result){
$store_sales_scope = json_decode($str,true); $serviceStoreIds[] = $store['store_id'];
$result = \Our\CommonExtension::isPointInPolygon($store_sales_scope, array('lng'=>$where['lng'],'lat'=>$where['lat']));
if($result){
$serviceStoreIds[] = $store['store_id'];
}
} }
} }
} }
if($serviceStoreIds){ if($serviceStoreIds){
$position['lat'] = $where['lat']; $position['lat'] = $where['lat'];
$position['lng'] = $where['lng']; $position['lng'] = $where['lng'];
$position['cityCode'] = $where['cityCode']; $position['cityCode'] = $where['cityCode'];
...@@ -188,18 +183,20 @@ class GoodsClassServiceModel extends \Business\AbstractModel{ ...@@ -188,18 +183,20 @@ class GoodsClassServiceModel extends \Business\AbstractModel{
$lng = $where['lng']; $lng = $where['lng'];
$cityCode = $where['cityCode']; $cityCode = $where['cityCode'];
$storeDao = \DAO\StoreModel::getInstance();
$signStoreClasses = $this->getSignClassesByCityCode($cityCode); $signStoreClasses = $this->getSignClassesByCityCode($cityCode);
if($signStoreClasses){ if($signStoreClasses){
$returnClass = array(); $returnClass = array();
$newStoreIds = array(); $newStoreIds = array();
foreach($signStoreClasses as $signClass){ foreach($signStoreClasses as $signClass){
$class_distance = \Our\CommonExtension::getDistance($lat,$lng,$signClass['latitude'],$signClass['longitude'],1); $inAreaFlag = \Our\CommonExtension::locationInArea($lat,$lng,$signClass['sign_scope']);
//判断签约分类是否可以为当前用户提供服务,并且记录这些店铺对应的store_id //判断签约分类是否可以为当前用户提供服务,并且记录这些店铺对应的store_id
if($class_distance<=$signClass['sign_rang']){ if($inAreaFlag){
$store =$storeDao->get($signClass['store_id'],false);
$class_distance = \Our\CommonExtension::getDistance($lat,$lng,$store['store_latitude'],$signClass['store_latitude'],1);
$class = $signClass; $class = $signClass;
$class['class_distance'] = $class_distance; $class['class_distance'] = $class_distance;
$returnClass[$class_distance] = $class; $returnClass[$class_distance] = $class;
if(!($newStoreIds&&in_array($signClass['store_id'],$newStoreIds))){ if(!($newStoreIds&&in_array($signClass['store_id'],$newStoreIds))){
$newStoreIds[] = $signClass['store_id']; $newStoreIds[] = $signClass['store_id'];
......
...@@ -94,32 +94,24 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -94,32 +94,24 @@ class StoreServiceModel extends \Business\AbstractModel{
$defaultDeliveryTime = 0; $defaultDeliveryTime = 0;
if($distince>0){ if($distince>0){
if(!empty($storeInfo['store_sales_scope'])){ $location = array('lat'=>$lat,'lng'=>$lng);
$str = str_replace('\"','"',$storeInfo['store_sales_scope']); $in_store_service_flag = \Store\StoreUtil::getInstance()->checkAddressInServiceArea($location,$storeId);
$store_sales_scope = json_decode($str,true); if($in_store_service_flag){
if(is_array($store_sales_scope)&&count($store_sales_scope)>0){ $in_store_service_flag=1;
//\Our\ValidationMap::setCoordArray($store_sales_scope); $DeliveryFormulaInstance = \DAO\DeliveryFormulaModel::getInstance();
$location = array('lat'=>$lat,'lng'=>$lng); $deliveryFormula = \Our\RedisHelper::cachedFunction(\Redis\Db6\DeliveryFormulaRedisModel::getInstance(),array(&$DeliveryFormulaInstance, 'getOne'),array('*',array('store_id'=>$storeId)),\Our\ApiConst::sevenDaySecond,array($storeId));
//$in_store_service_flag = \Our\ValidationMap::isCityCenter($location); $formula = $DeliveryFormulaInstance->getDeliveryFormulaByDistince($storeId,$distince,$deliveryFormula);
$in_store_service_flag = \Our\CommonExtension::isPointInPolygon($store_sales_scope,$location); //如果采用精简版公式,获取常速送达的时间作为默认送达时间
if($in_store_service_flag){ if($formula){
$in_store_service_flag=1; $defaultDeliveryTime = (empty($formula['default_time'])?$formula[2]['time']:$formula['default_time']);
$DeliveryFormulaInstance = \DAO\DeliveryFormulaModel::getInstance();
$deliveryFormula = \Our\RedisHelper::cachedFunction(\Redis\Db6\DeliveryFormulaRedisModel::getInstance(),array(&$DeliveryFormulaInstance, 'getOne'),array('*',array('store_id'=>$storeId)),\Our\ApiConst::sevenDaySecond,array($storeId));
$formula = $DeliveryFormulaInstance->getDeliveryFormulaByDistince($storeId,$distince,$deliveryFormula);
//如果采用精简版公式,获取常速送达的时间作为默认送达时间
if($formula){
$defaultDeliveryTime = (empty($formula['default_time'])?$formula[2]['time']:$formula['default_time']);
}
if(!$defaultDeliveryTime){
//$in_store_service_flag = 0;
$defaultDeliveryTime = 0;
}
}else{
$in_store_service_flag=0;
$defaultDeliveryTime = 0;
}
} }
if(!$defaultDeliveryTime){
//$in_store_service_flag = 0;
$defaultDeliveryTime = 0;
}
}else{
$in_store_service_flag=0;
$defaultDeliveryTime = 0;
} }
} }
//关注 //关注
...@@ -546,6 +538,7 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -546,6 +538,7 @@ class StoreServiceModel extends \Business\AbstractModel{
foreach($allStores as &$store){ foreach($allStores as &$store){
$store['isPurchased'] = \Our\ApiConst::zero; $store['isPurchased'] = \Our\ApiConst::zero;
} }
$memberStores = null; $memberStores = null;
if($memberId){ if($memberId){
$favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance(); $favoritesStoreDao = \DAO\FavoritesStoreModel::getInstance();
...@@ -556,7 +549,6 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -556,7 +549,6 @@ class StoreServiceModel extends \Business\AbstractModel{
} }
} }
$goodsClassDao = \DAO\GoodsClassModel::getInstance(); $goodsClassDao = \DAO\GoodsClassModel::getInstance();
//获取当前分类对应所有店铺信息 //获取当前分类对应所有店铺信息
...@@ -566,11 +558,11 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -566,11 +558,11 @@ class StoreServiceModel extends \Business\AbstractModel{
//服务分类对应店铺 //服务分类对应店铺
$serviceStores = $this->getServiceClassStores($gcId,$condition); $serviceStores = $this->getServiceClassStores($gcId,$condition);
//获取签约分类对应店铺 //获取签约分类对应店铺
$expressStores = $this->getExpressStores($gcId,$condition); $expressStores = $this->getExpressStores($gcId,$condition);
$goodsClassList = $goodsClassDao->getOnlineSecondClassList($gcId); $goodsClassList = $goodsClassDao->getOnlineSecondClassList($gcId);
if($goodsClassList){ if($goodsClassList){
foreach($goodsClassList as $goodsClass){ foreach($goodsClassList as $goodsClass){
$returnStores = array(); $returnStores = array();
...@@ -680,6 +672,7 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -680,6 +672,7 @@ class StoreServiceModel extends \Business\AbstractModel{
/*if($signStoreIds&&$serviceStoreIds){ /*if($signStoreIds&&$serviceStoreIds){
$serviceStoreIds = array_diff($serviceStoreIds,$signStoreIds); $serviceStoreIds = array_diff($serviceStoreIds,$signStoreIds);
}*/ }*/
//签约店铺存在 //签约店铺存在
if($serviceStoreIds){ if($serviceStoreIds){
$return = $this->getStoreClassesByStoreIds($serviceStoreIds,$gcId); $return = $this->getStoreClassesByStoreIds($serviceStoreIds,$gcId);
...@@ -689,6 +682,7 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -689,6 +682,7 @@ class StoreServiceModel extends \Business\AbstractModel{
} }
public function getExpressStores($gcId,$position){ public function getExpressStores($gcId,$position){
ksort($position); ksort($position);
$storeDao = \DAO\StoreModel::getInstance(); $storeDao = \DAO\StoreModel::getInstance();
/*$storeRedis = \Redis\Db6\StoreRedisModel::getInstance(); /*$storeRedis = \Redis\Db6\StoreRedisModel::getInstance();
...@@ -723,13 +717,13 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -723,13 +717,13 @@ class StoreServiceModel extends \Business\AbstractModel{
public function getSignStoreClassesByStoreIds($signStoreIds,$gcId,$position){ public function getSignStoreClassesByStoreIds($signStoreIds,$gcId,$position){
$signStoreClassSql = ' store_id in ('.implode(',',$signStoreIds).') and is_charged=1 and class_style = 2 and gc_parent_id ='.$gcId; $signStoreClassSql = ' store_id in ('.implode(',',$signStoreIds).') and is_charged=1 and class_style = 2 and gc_parent_id ='.$gcId;
$qmStoreClassDao = \DAO\QmStoreClassModel::getInstance(); $qmStoreClassDao = \DAO\QmStoreClassModel::getInstance();
$signClassStores = $qmStoreClassDao->selectByWhere($signStoreClassSql,'store_id,gc_id,sign_rang,longitude,latitude'); $signClassStores = $qmStoreClassDao->selectByWhere($signStoreClassSql,'store_id,gc_id,sign_scope');
//$signClassStores = $storeGoodsClassDao->selectByWhere($signStoreClassSql,'store_id,gc_id'); //$signClassStores = $storeGoodsClassDao->selectByWhere($signStoreClassSql,'store_id,gc_id');
if($signClassStores){ if($signClassStores){
$return = array(); $return = array();
foreach($signClassStores as $signClass){ foreach($signClassStores as $signClass){
$storeDistance = \Our\CommonExtension::getDistance($position['lat'],$position['lng'],$signClass['latitude'],$signClass['longitude']); $inAreaFlag = \Our\CommonExtension::locationInArea($position['lat'],$position['lng'],$signClass['sign_scope']);
if($storeDistance <= $signClass['sign_rang']){ if($inAreaFlag){
if($return[$signClass['gc_id']]){ if($return[$signClass['gc_id']]){
continue; continue;
} }
...@@ -752,19 +746,18 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -752,19 +746,18 @@ class StoreServiceModel extends \Business\AbstractModel{
shuffle($signClassStores); shuffle($signClassStores);
$gcIds = array_unique(array_column($signClassStores,'gc_id')); $gcIds = array_unique(array_column($signClassStores,'gc_id'));
foreach($gcIds as $tempGcId){ foreach($gcIds as $tempGcId){
if($return[$tempGcId]){ if(isset($return[$tempGcId])&&$return[$tempGcId]){
break; break;
} }
foreach($signClassStores as $signClass){ foreach($signClassStores as $signClass){
if($tempGcId==$signClass['gc_id']){ if($tempGcId==$signClass['gc_id']){
if($return[$signClass['gc_id']]){ if(isset($return[$signClass['gc_id']])&&$return[$signClass['gc_id']]){
break; break;
} }
$return[$signClass['gc_id']] = $signClass['store_id']; $return[$signClass['gc_id']] = $signClass['store_id'];
} }
} }
} }
return $return; return $return;
} }
return false; return false;
...@@ -898,6 +891,19 @@ class StoreServiceModel extends \Business\AbstractModel{ ...@@ -898,6 +891,19 @@ class StoreServiceModel extends \Business\AbstractModel{
$storeDao->delStoresCacheByCityCode($cityCode); $storeDao->delStoresCacheByCityCode($cityCode);
} }
public function editQmStoreClass(){
$qmStoreClassDao = \DAO\QmStoreClassModel::getInstance();
$qmStoreClassList = $qmStoreClassDao->selectByWhere(array('sign_rang'=>array('gt',0)));
if($qmStoreClassList){
foreach($qmStoreClassList as $qmObj){
$qmStoreClassStr = '[';
$qmStoreClassStr .= '{"lng":'.($qmObj['longitude']+0.001).',"lat":'.($qmObj['latitude']-0.001).'},{"lng":'.($qmObj['longitude']+0.001).',"lat":'.($qmObj['latitude']+0.001).'},{"lng":'.($qmObj['longitude']-0.001).',"lat":'.($qmObj['latitude']+0.001).'},{"lng":'.($qmObj['longitude']-0.001).',"lat":'.($qmObj['latitude']-0.001).'}';
$qmStoreClassStr .= ']';
$result = $qmStoreClassDao->update(array('sign_scope'=>$qmStoreClassStr),array('id'=>$qmObj['id']));
}
}
}
/** /**
*/ */
private static $_instance = null; private static $_instance = null;
......
...@@ -28,6 +28,9 @@ class QmStoreClassModel extends \DAO\AbstractModel{ ...@@ -28,6 +28,9 @@ class QmStoreClassModel extends \DAO\AbstractModel{
public function selectByWhere($where = null,$field = '*',$limit=false){ public function selectByWhere($where = null,$field = '*',$limit=false){
$this->setDb(); $this->setDb();
if(is_array($where)){
$where = $this->db->getSqlWhereByArray($where);
}
if($limit){ if($limit){
$result = $this->db->select($field)->from($this->_tableName)->where($where)->limit($limit[0],$limit[1])->fetchAll(); $result = $this->db->select($field)->from($this->_tableName)->where($where)->limit($limit[0],$limit[1])->fetchAll();
}else{ }else{
...@@ -36,6 +39,11 @@ class QmStoreClassModel extends \DAO\AbstractModel{ ...@@ -36,6 +39,11 @@ class QmStoreClassModel extends \DAO\AbstractModel{
return $result; return $result;
} }
public function delSignScopeCache($storeId){
$result = \Our\RedisHelper::delCachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(),array(&$this, 'selectByWhere'),array(),array($storeId));
return $result;
}
/** /**
* 一级分类对应有效的店铺 * 一级分类对应有效的店铺
...@@ -100,4 +108,11 @@ class QmStoreClassModel extends \DAO\AbstractModel{ ...@@ -100,4 +108,11 @@ class QmStoreClassModel extends \DAO\AbstractModel{
\Our\RedisHelper::delCachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(), array(&$this, 'getStoreClasses'),array(),array($cityCode)); \Our\RedisHelper::delCachedFunction(\Redis\Db6\QmStoreClassRedisModel::getInstance(), array(&$this, 'getStoreClasses'),array(),array($cityCode));
} }
public function update($data,$where){
$this->setDb(\Our\DbNameConst::masterDBConnectName);
$result=$this->db->update($this->_tableName)->rows($data)->where($where)->execute();
return $result;
}
} }
\ No newline at end of file
...@@ -334,9 +334,7 @@ class StoreModel extends \DAO\AbstractModel ...@@ -334,9 +334,7 @@ class StoreModel extends \DAO\AbstractModel
return $inAreaFlag; return $inAreaFlag;
} }
if($store['seller_distribution']&&$address){ if($store['seller_distribution']&&$address){
$str = str_replace('\"','"',$store['store_sales_scope']); $result = \Store\StoreUtil::getInstance()->checkAddressInServiceArea(array('lng'=>$address['lng'],'lat'=>$address['lat']),$store['store_id']);
$store_sales_scope = json_decode($str,true);
$result = \Our\CommonExtension::isPointInPolygon($store_sales_scope, array('lng'=>$address['lng'],'lat'=>$address['lat']));
if($result){ if($result){
$inAreaFlag = \Our\ApiConst::one; $inAreaFlag = \Our\ApiConst::one;
} }
...@@ -345,6 +343,7 @@ class StoreModel extends \DAO\AbstractModel ...@@ -345,6 +343,7 @@ class StoreModel extends \DAO\AbstractModel
} }
/** /**
* 类实例 * 类实例
* *
......
...@@ -318,7 +318,7 @@ elastic.master.host="192.168.1.201" ...@@ -318,7 +318,7 @@ elastic.master.host="192.168.1.201"
elastic.master.port="9200" elastic.master.port="9200"
elastic.master.scheme="http"; elastic.master.scheme="http";
[lyztest : common] [lyz : common]
; 数据库配置 ; 数据库配置
resources.database.params.driver = "pdo_mysql" resources.database.params.driver = "pdo_mysql"
resources.database.params.hostname = "127.0.0.1" resources.database.params.hostname = "127.0.0.1"
...@@ -363,7 +363,7 @@ elastic.master.host="192.168.1.201" ...@@ -363,7 +363,7 @@ elastic.master.host="192.168.1.201"
elastic.master.port="9200" elastic.master.port="9200"
elastic.master.scheme="http"; elastic.master.scheme="http";
[lyz : common] [lyztest : common]
; 数据库配置 ; 数据库配置
resources.database.params.driver = "pdo_mysql" resources.database.params.driver = "pdo_mysql"
resources.database.params.hostname = "127.0.0.1" resources.database.params.hostname = "127.0.0.1"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment