public function handle_request_internal() { header("Access-Control-Allow-Origin: *"); $lng = $this->_params['lng']; $lat = $this->_params['lat']; $brokerId = $this->_params['brokerId']; $radius = isset($this->_params['radius']) ? $this->_params['radius'] : 3000; // 搜索半径,默认3000米 $total = isset($this->_params['total']) ? $this->_params['total'] : 100; // 最大总数,默认500 $days = isset($this->_params['days']) ? $this->_params['days'] : 3; // 查询天数,默认3天 //获取附近经纪人Id $brokerLocations = Bll_Broker_Location::getRoundBrokerLocationsInThePastFewDays($lng, $lat, $radius, $total, $days); $brokerIds = array_keys($brokerLocations); //根据经纪人Id数组查询多个经纪人信息 $brokerInfosTmp = Model_Broker_AjkBrokerExtend::findMultiBrokers($brokerIds); //提取经纪人ID $brokerIds = $brokerInfos = array(); foreach ($brokerInfosTmp as $value) { if ($value->brokerId != $brokerId) { $brokerIds[] = $value->brokerId; $brokerInfos[$value->brokerId] = $value; } } //批量查询微聊信息 $chatInfos = Bll_Mobile_ChatInfoBll::getInstance()->GetChatInfoByIds($brokerIds); //根据微聊信息筛选经纪人,去除微聊信息为空的经纪人 $brokers = array(); foreach ($chatInfos as $chatInfo) { $re = array(); $distance = Util_Map::distance($lng, $lat, $brokerLocations[$chatInfo['brokerId']]['lng'], $brokerLocations[$chatInfo['brokerId']]['lat']); $distance = round($distance / 1000, 2); if ($distance > 3 || $brokerInfos[$chatInfo['brokerId']]->checkState != 1) { continue; } $re['brokerId'] = $chatInfo['brokerId']; $re['companyInfo'] = $brokerInfos[$chatInfo['brokerId']]->company; $re['trueName'] = $brokerInfos[$chatInfo['brokerId']]->trueName; $re['userMobile'] = $brokerInfos[$chatInfo['brokerId']]->userMobile; $disarr[] = $distance; $re['distance'] = $distance; $re['userPhoto'] = Util_ImageUtils::get_broker_photo_url($brokerInfos[$chatInfo['brokerId']]->userPhoto, '200x200'); $re['chatId'] = $chatInfo['chatId']; $re['twoCodeIcon'] = $chatInfo['twoCodeIcon']; $brokers[] = $re; } //按距离排序 array_multisort($disarr, $brokers); return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('brokerList' => $brokers)); }
private function getCommList($brokerId, $lat, $lng) { // 从缓存中读取数据 $communities = Bll_Commsign::getCommList($brokerId); if (empty($communities)) { // 根据lat和lng获取1.5km内的小区列表 $latLngRound = Util_Map::round($lat, $lng, 1500); $communities = Model_Community_AjkCommunity::data_access()->load_field(array('commId', 'commName', 'sosolng', 'sosolat'))->filter('typeFlag', 0)->filter_by_op_multi(array(array('sosolat', '>=', $latLngRound['minLat']), array('sosolat', '<=', $latLngRound['maxLat']), array('sosolng', '>=', $latLngRound['minLng']), array('sosolng', '<=', $latLngRound['maxLng'])))->limit(1000)->get_all(); if (empty($communities)) { return array(); } // 实现按距离排序 • 升序 uasort($communities, function (&$a, &$b) use($lat, $lng) { // 计算坐标的距离 $a['distance'] = Util_Map::distance($lat, $lng, $a['sosolat'], $a['sosolng']); $b['distance'] = Util_Map::distance($lat, $lng, $b['sosolat'], $b['sosolng']); // 比较两小区坐标 if ($a['distance'] == $b['distance']) { return 0; } return $a['distance'] < $b['distance'] ? -1 : 1; }); $i = 0; $data = array(); foreach ($communities as $community) { if (++$i > 300) { break; } $row = array(); $row['commId'] = $community['commId']; $row['commName'] = $community['commName']; $row['lng'] = $community['sosolng']; $row['lat'] = $community['sosolat']; $row['distance'] = $community['distance']; $data[] = $row; } // 缓存数据 Bll_Commsign::setCommList($brokerId, $data); return $data; } else { if (is_array($communities)) { return $communities; } else { return array(); } } }
public function handle_request_internal() { /** * 签到小区详情 * * - 验证参数 * * * - 获取经纪人 * * - 获取小区(AjkCommunity) * - * * - 获取小区签到人数 * * - 判断经纪人是否可签到(经纪人是否已签到、当前是否在签到时间段) * - 校验小区坐标和lat、lng的距离5公里,超出不可签到(如小区无坐标,不可签到) * * - 计算距离下一时间点的签到倒计时(单位:s) * * - 获取小区各个时间段签到前3名 * * - 返回数据 */ // 获取参数 $brokerId = $this->_params['brokerId']; $commId = $this->_params['commId']; $lat = $this->_params['lat']; $lng = $this->_params['lng']; // 根据ID获取经纪人 $broker = Bll_Commsign::getBrokerInfo($brokerId); if (!$broker) { $broker = Model_Broker_AjkBrokerExtend::data_access()->filter('brokerId', $brokerId)->find_only(); if (!$broker) { throw new Exception('经纪人不存在', Const_APIStatus::E_BROKER_NOT_EXISTS); } $broker_photo = Util_ImageUtils::get_broker_photo_url($broker['userPhoto'], '200x200'); $brokerInfo = array('brokerId' => $broker['brokerId'], 'username' => $broker['trueName'], 'userPhoto' => $broker_photo, 'cityId' => $broker['cityId']); Bll_Commsign::redisBrokerInfo($brokerId, $brokerInfo); } // 根据ID获取小区 $community = Bll_Commsign::getCommInfo($commId); if (empty($community)) { $community = Bll_Community_APIComm::getInstance()->getInfoByIdMapping($commId, 2); $commInfo = array(); $commInfo['commId'] = $community['commId']; $commInfo['commName'] = $community['commName']; $commInfo['sosolng'] = $community['sosolng']; $commInfo['sosolat'] = $community['sosolat']; Bll_Commsign::setCommInfo($commId, $commInfo); } if (!$community || !$community['sosolat'] || !$community['sosolng']) { throw new Exception('小区不存在', Const_APIStatus::E_COMMUNITY_NOT_EXISTS); } // 获取小区签到人数 $communitySignCount = Bll_Commsign::getCommCount($commId); // 判断经纪人是否可签到 $signAble = true; $currentSignRange = Bll_Broker_CommunitySign::getCurrentSignRange(); if (!$currentSignRange) { $signAble = false; } else { // 经纪人是否已经签过到 if (Bll_Commsign::isSignedAlready($brokerId, $commId, $currentSignRange[0])) { $signAble = false; } } // 对比小区坐标和参数坐标两点的距离(5km) $distance = Util_Map::distance($lat, $lng, $community['sosolat'], $community['sosolng']); if ($distance > 5000) { $signAble = false; } $data = array(); $data['signAble'] = intval($signAble); $data['signCount'] = $communitySignCount; $data['countDown'] = $signAble ? 0 : Bll_Broker_CommunitySign::nextSignCountDown(); $data['signList'] = array(); // 获取各时间段签到前三名 if (Bll_Broker_CommunitySign::isTopSignerActivityOngoing()) { $data['signList'] = array(array('hour' => '10:00', 'brokers' => array()), array('hour' => '15:00', 'brokers' => array()), array('hour' => '20:00', 'brokers' => array())); foreach ($data['signList'] as &$theSignList) { $theHour = intval($theSignList['hour']); $hour = intval(date('H')); if ($hour >= 0 && $hour < 10) { break; } elseif ($hour >= 10 && $hour < 20) { if ($theHour > $hour) { continue; } } $theSignRange = array(); switch ($theHour) { case 10: $theSignRange = array(date('Y-m-d 10:00:00'), date('Y-m-d 14:59:59')); break; case 15: $theSignRange = array(date('Y-m-d 15:00:00'), date('Y-m-d 19:59:59')); break; case 20: $theSignRange = array(date('Y-m-d 20:00:00'), date('Y-m-d 23:59:59')); break; } $theSignList['brokers'] = Bll_Commsign::getFirstThr($commId, $theSignRange[0]); if (empty($theSignList['brokers'])) { $theSignList['brokers'] = Model_Broker_CommunitySign::data_access(date('Ym', strtotime($currentSignRange[0])))->filter('communityId', $commId)->filter_by_op_multi(array(array('signTime', '>=', $theSignRange[0]), array('signTime', '<=', $theSignRange[1])))->sort('signTime', 'asc')->limit(3)->get_all(); } $tmp = array(); if (!empty($theSignList['brokers'])) { foreach ($theSignList['brokers'] as $k => $v) { $brokerTmp = Bll_Commsign::getBrokerInfo($v['brokerId']); if (!$brokerTmp) { $broker = Model_Broker_AjkBrokerExtend::data_access()->filter('brokerId', $v['brokerId'])->find_only(); $broker_photo = Util_ImageUtils::get_broker_photo_url($broker['userPhoto'], '200x200'); $brokerTmp = array('brokerId' => $broker['brokerId'], 'username' => $broker['trueName'], 'userPhoto' => $broker_photo, 'cityId' => $broker['cityId']); Bll_Commsign::redisBrokerInfo($v['brokerId'], $brokerTmp); } if (empty($brokerTmp['userPhoto'])) { $brokerTmp['userPhoto'] = PageHelper::pure_static_url('/img/bknoimg.gif'); } $dataTmp = array('brokerId' => $brokerTmp['brokerId'], 'brokerTrueName' => $brokerTmp['username'], 'brokerPhoto' => $brokerTmp['userPhoto']); $tmp[] = $dataTmp; } $theSignList['brokers'] = $tmp; } } } return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => $data); }
public function handle_request_internal() { /** * 小区签到逻辑 * * - 验证参数 * * - 获取经纪人 * * - 获取小区(AjkCommunity) * - 校验小区坐标和lat、lng的距离5公里(如小区无坐标,直接拒绝) * * - 添加签到记录 * - 添加签到记录 * - 更新签到按日统计信息(incr) * * - 更新经纪人坐标 * - 添加经纪人坐标日志 * - 更新经纪人坐标 * * - 返回数据 */ $result = array('status' => 'error', 'errcode' => '', 'message' => ''); // 获取参数 $brokerId = $this->_params['brokerId']; $commId = $this->_params['commId']; $lat = $this->_params['lat']; $lng = $this->_params['lng']; if (empty($lat) || empty($lng)) { $result['message'] = '获取定位数据失败,请重新定位'; return $result; } // 根据ID获取经纪人 $broker = Bll_Commsign::getBrokerInfo($brokerId); if (!$broker) { $broker = Model_Broker_AjkBrokerExtend::data_access()->filter('brokerId', $brokerId)->find_only(); if (!$broker) { throw new Exception('经纪人不存在', Const_APIStatus::E_BROKER_NOT_EXISTS); } $broker_photo = Util_ImageUtils::get_broker_photo_url($broker['userPhoto'], '200x200'); $brokerInfo = array('brokerId' => $broker['brokerId'], 'username' => $broker['trueName'], 'userPhoto' => $broker_photo, 'cityId' => $broker['cityId']); Bll_Commsign::redisBrokerInfo($brokerId, $brokerInfo); } // 根据ID获取小区 $community = Bll_Commsign::getCommInfo($commId); if (empty($community)) { $community = Bll_Community_APIComm::getInstance()->getInfoByIdMapping($commId, 2); $commInfo = array(); $commInfo['commId'] = $community['commId']; $commInfo['commName'] = $community['commName']; $commInfo['sosolng'] = $community['sosolng']; $commInfo['sosolat'] = $community['sosolat']; Bll_Commsign::setCommInfo($commId, $commInfo); } // 小区不存在或小区经纬租表不存在时,返回小区不存在 if (!$community || !$community['sosolat'] || !$community['sosolng']) { $result['errcode'] = Const_APIStatus::E_COMMUNITY_NOT_EXISTS; $result['message'] = '小区暂未开通签到功能'; return $result; } // 对比小区坐标和参数坐标两点的距离(5km) $distance = Util_Map::distance($lat, $lng, $community['sosolat'], $community['sosolng']); if ($distance > 5000) { $result['errcode'] = Const_APIStatus::E_BROKER_COMMSIGN_FAR_AWAY; $result['message'] = '签到失败!你跑得太远了,请返回重新定位'; return $result; } // 获取当前所处签到时间(10:00 15:00 20:00) $currentSignRange = Bll_Broker_CommunitySign::getCurrentSignRange(); if (!$currentSignRange) { $result['errcode'] = Const_APIStatus::E_BROKER_COMMSIGN_NOT_IN_RANGE; $result['message'] = '不在签到时间范围'; return $result; } // 判断是否已经签到 if (Bll_Commsign::isSigned($brokerId, $commId, $currentSignRange[0])) { $result['errcode'] = Const_APIStatus::E_BROKER_COMMSIGN_ALREADY_SIGNED; $result['message'] = '已经签到!'; return $result; } try { // 新建签到, $sign = array('brokerId' => $brokerId, 'communityId' => $commId, 'lat' => $lat, 'lng' => $lng, 'signTime' => date('Y-m-d H:i:s'), 'currentSignRange' => $currentSignRange[0]); Bll_Commsign::Signed($brokerId, $commId, $currentSignRange[0], $sign); //缓存‘签到信息’到同步数据库的redis中 Bll_RedisToDb::writeBrokerCommunitySign($sign); // 缓存经纪人位置 $locationInfo = array('brokerId' => $brokerId, 'lng' => $lng, 'lat' => $lat, 'updateTime' => date('Y-m-d H:i:s')); Bll_Commsign::setLocationInfo($brokerId, $locationInfo); //缓存‘位置信息’到同步数据库的redis中 Bll_RedisToDb::writeBrokerLocation($locationInfo); //记录每日签到情况 Bll_Commsign::dailySignedRecord($brokerId); // 获取签到排名 $rank = Bll_Commsign::getSignRank($commId, $currentSignRange[0]); //连续签到统计 $SignStatistics = Bll_Commsign::getSignStatistics($brokerId); $sendFlag = false; if ($SignStatistics) { if (date('Y-m-d', strtotime($SignStatistics['updateTime'])) == date('Y-m-d', strtotime('yesterday'))) { $SignStatistics['signCount'] = $SignStatistics['signCount'] + 1; $sendFlag = true; } elseif (date('Y-m-d', strtotime($SignStatistics['updateTime'])) == date('Y-m-d', time())) { } else { $SignStatistics['signCount'] = 1; $sendFlag = true; } if ($SignStatistics['signCount'] > $SignStatistics['maxSignCount']) { $SignStatistics['maxSignCount'] = $SignStatistics['signCount']; } $SignStatistics['updateTime'] = date('Y-m-d H:i:s'); Bll_Commsign::setSignStatistics($brokerId, $SignStatistics); //缓存‘签到统计信息’到同步数据库的redis中 $SignStatistics = array_merge($SignStatistics, array('sendFlag' => $sendFlag)); Bll_RedisToDb::writeCommSignStatistics($SignStatistics); } else { $SignStatistics = array('brokerId' => $brokerId, 'signCount' => 1, 'maxSignCount' => 1, 'createTime' => date('Y-m-d H:i:s')); Bll_Commsign::setSignStatistics($brokerId, $SignStatistics); $sendFlag = true; //缓存‘签到统计信息’到同步数据库的redis中 $SignStatistics = array_merge($SignStatistics, array('sendFlag' => $sendFlag)); Bll_RedisToDb::writeCommSignStatistics($SignStatistics); } } catch (Exception $e) { $result['message'] = '签到人太多,系统繁忙,请稍后再试~'; return $result; } return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('signRank' => $rank, 'countDown' => Bll_Broker_CommunitySign::nextSignCountDown())); }
public function handle_request_internal() { $brokerId = isset($this->_params['brokerId']) ? $this->_params['brokerId'] : 0; $keyword = isset($this->_params['keyword']) ? $this->_params['keyword'] : ''; $commId = isset($this->_params['commId']) ? $this->_params['commId'] : 0; $cityId = isset($this->_params['cityId']) ? $this->_params['cityId'] : 0; $distance = isset($this->_params['distance']) ? $this->_params['distance'] : 0; $price = isset($this->_params['price']) ? $this->_params['price'] : 0; $rooms = isset($this->_params['rooms']) ? $this->_params['rooms'] : 0; $lat = isset($this->_params['lat']) ? floatval($this->_params['lat']) : 0; $lng = isset($this->_params['lng']) ? floatval($this->_params['lng']) : 0; $page = isset($this->_params['page']) ? $this->_params['page'] : 1; $per = isset($this->_params['per']) ? intval($this->_params['per']) : 20; $data = array(); $data['page'] = $page; $data['hasNextPage'] = 0; $filters = APF::get_instance()->get_config('prop_search_filters', 'fyk_search'); $props = array(); if ($cityId == 0) { $brokerInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); $cityId = $brokerInfo['cityId']; } // Solr 查询 $solr = APF_Search_SearchClient::instance('fyk-prop'); // 在售 $solr->addEqualFilter('status', Const_Fyk::PROPSTATUS_SELLING); if ($cityId) { $solr->addEqualFilter('city_id', $cityId); } // 过滤关键词或小区 if ($commId) { $solr->addEqualFilter('comm_id', $commId); } elseif ($keyword) { $solr->setKeywords($keyword)->addWeightedSearchField('comm_name', 4)->addWeightedSearchField('block_name', 1)->addWeightedSearchField('district_name', 1); } // 距离 if ($distance && isset($filters['distance']['options'][$distance]) && $lat && $lng) { $filters['distance']['options'][$distance]['lat'] = (double) $lat; $filters['distance']['options'][$distance]['lng'] = (double) $lng; $this->filterBuilder($solr, $distance, $filters['distance']); } // 价钱 if ($price && isset($filters['price']['options'][$price])) { $this->filterBuilder($solr, $price, $filters['price']); } // 户型 if ($rooms && isset($filters['rooms']['options'][$rooms])) { $this->filterBuilder($solr, $rooms, $filters['rooms']); } // 分页 if ($page) { $start = ($page - 1) * $per; $solr->setLimit($start, $per); } // 排序 $solr->addFieldSort('onsell_time', true); $response = $solr->fetchResult(); if (isset($response['response']['numFound']) && $response['response']['numFound']) { // 判定下一页 if ($response['response']['numFound'] > $page * $per) { $data['hasNextPage'] = 1; } // 取房源 foreach ($response['response']['docs'] as $doc) { $prop = array('fPropId' => $doc['id'], 'isOnly' => intval($doc['is_only']), 'isReal' => intval($doc['is_real']), 'certificate' => intval($doc['is_certificate']), 'commId' => $doc['comm_id'], 'commName' => $doc['comm_name'], 'districtId' => $doc['district_id'], 'districtName' => $doc['district_name'], 'blockId' => $doc['block_id'], 'blockName' => $doc['block_name'], 'roomNum' => $doc['room_num'], 'hallNum' => $doc['hall_num'], 'toiletNum' => $doc['toilet_num'], 'area' => $doc['area_num'], 'areaUnit' => '平米', 'price' => intval($doc['price'] / 10000), 'priceUnit' => '万', 'distance' => '', 'distanceUnit' => 'm', 'publishDays' => 0, 'publishDaysMsg' => ''); // 距离 if ($distance && isset($filters['distance']['options'][$distance]) && $lat && $lng) { list($propLat, $propLng) = explode(',', $doc['comm_location']); $prop['distance'] = intval(Util_Map::distance($lat, $lng, $propLat, $propLng)); if ($prop['distance'] > $distance) { $prop['distance'] = $distance; } } // 在售时间 if ($doc['onsell_time']) { $prop['publishDays'] = intval((strtotime(date('Y-m-d 00:00:00')) - strtotime(date('Y-m-d 00:00:00', $doc['onsell_time']))) / 86400); if ($prop['publishDays'] == 0) { $prop['publishDaysMsg'] = '今日发布'; } elseif ($prop['publishDays'] == 1) { $prop['publishDaysMsg'] = '昨日发布'; } else { $prop['publishDaysMsg'] = "{$prop['publishDays']}日前发布"; } } $props[] = $prop; } } $data['props'] = $props; return API_Result::create()->ok()->data($data)->toArray(); }