/** * 新加竞价 * * @param $hz_broker_id * @param $prop_id * @param $price * @param $amount * @param $block_id * @param $city_id * @param $sn * @param $ajk_broker_id * @return array */ public static function add_plan($hz_broker_id, $prop_id, $price, $amount, $block_id, $city_id, $sn, $ajk_broker_id = 0) { $propSearchInfo = Model_House_HzPropSearch::get_prop_by_prop_id($city_id, $prop_id); if (empty($propSearchInfo)) { return array('error_code' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'error_message' => '房源不存在。'); } $prop_status = $propSearchInfo['status']; /** 检查 经纪人是不是 已经满足10套 */ $onlinePlanCount = Model_Plan_HzPlanBasic::count_online_bid_plan_ex($ajk_broker_id); if ($onlinePlanCount >= Bll_Plan_Bid_Choice::ALL_ZF_PLAN_NUM) { return array('error_code' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'error_message' => '您最多可以对' . Bll_Plan_Bid_Choice::ALL_ZF_PLAN_NUM . '套房源做竞价推广,请确认数量是否已经达到上限'); } /** 判断房源是否已经在竞价计划中了 */ $propBidInfo = Model_Plan_HzPlanning::getPropBidPlan($prop_id); if (!empty($propBidInfo)) { $planBasic = Model_Plan_HzPlanBasic::get_plan_by_id($propBidInfo['plan_id']); if ($planBasic['bid_version'] == Const_HzPlan::BID_VERSION_CHOICE && $planBasic['flag'] != 0 && $planBasic['status'] != Const_HzPlan::DELETE) { return array('error_code' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'error_message' => '该房源已经处于精选状态,请先删除'); } } /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($city_id, Const_Site::ANJUKE)) { /** 判断房源是否在套餐推广中 */ if (!Bll_Combo_HouseRelation::getOnlineRelationByHouseId($prop_id, Bll_Combo_HouseRelation::SITE_TYPE_HZ)) { return array('err_no' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'err_msg' => '房源必须套餐推广才能参与精选推广'); } } /** 更新房源状态 */ $propPlanStatus = Bll_Ppc_HzProp::updatePropStatus($city_id, $prop_id, 2, 1); self::updateSpreadType($city_id, $prop_id, 4); $planId = self::insertBidPlan($hz_broker_id, $prop_id, $price, $amount, $block_id, $city_id, $sn, $ajk_broker_id); if ($planId == 0) { return array('error_code' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'error_message' => '创建计划失败'); } // Bll_Ppc_HzProp::luceneUpdate($city_id, $prop_id, $propPlanStatus, 4); Bll_Log_EffectPropLog::addEffectPropLog($prop_id, Const_HaoPanLog::BIDPLANSTART, $hz_broker_id, 0, $prop_status, 1, 0, $planId); return array("error_code" => 0, "error_message" => '', 'planId' => $planId); }
/** * 判断房源是否可以参加精选房源推广 * * @param $ajkBrokerId * @param $cityId * @param $propId * @return array */ public static function checkPropCanChoice($ajkBrokerId, $cityId, $propId) { $propSearch = Model_House_HzPropSearch::get_prop_by_prop_id($cityId, $propId); if (empty($propSearch)) { return self::buildReturn(Bll_Plan_Bid_Choice::BID_FAIL_OTHER, '房源不存在'); } /** 判断房源是否是当前经纪人的房源 */ if ($propSearch['ajkBrokerId'] != $ajkBrokerId) { return self::buildReturn(Bll_Plan_Bid_Choice::BID_FAIL_OTHER, '房源不存在(code:-10086)'); } /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($cityId, Const_Site::HAOZU)) { /** 判断房源是否在套餐推广中 */ if (!Bll_Combo_HouseRelation::getOnlineRelationByHouseId($propId, Bll_Combo_HouseRelation::SITE_TYPE_HZ)) { return array('err_no' => Bll_Plan_Bid_Choice::BID_FAIL_OTHER, 'err_msg' => '房源必须套餐推广才能参与精选推广'); } } /** 判断房源是否多图 */ if ($propSearch['islabel'] == 0) { return self::buildReturn(Bll_Plan_Bid_Choice::BID_FAIL_QUALITY_OR_NEW, '多图、新发15天房源才能参与精选推广'); } /** 判断房源是否是在15天内发布的 */ if (date('ymd', strtotime('-16 days')) > date('Ymd', $propSearch['created'])) { return self::buildReturn(Bll_Plan_Bid_Choice::BID_FAIL_QUALITY_OR_NEW, '多图、新发15天房源才能参与精选推广'); } /** 判断房源是否已经在竞价计划中了 取master */ $propBidInfo = Model_Plan_HzPlanning::getPropBidPlan($propId, true); if (!empty($propBidInfo)) { $planBasic = Model_Plan_HzPlanBasic::get_plan_by_id($propBidInfo['plan_id'], true); if ($planBasic['bid_version'] == Const_HzPlan::BID_VERSION_CHOICE && in_array($planBasic['status'], array(Const_HzPlan::SPREAD, Const_HzPlan::WAITING))) { return self::buildReturn(Bll_Plan_Bid_Choice::BID_FAIL_OTHER, '该房源已经处于精选状态,请先删除'); } } return array('err_no' => 0, 'err_msg' => ''); }
/** * 金铺-精选房源设置 * * @param $ajkBrokerId * @param $cityId * @param $propId * @param array $params * @return array */ public static function jp_setting_post($ajkBrokerId, $cityId, $propId, $params = array()) { $jpBrokerInfo = Model_Broker_JpBroker::getJpBrokerInfoByAjkBrokerId($ajkBrokerId); //check房源是否已经加入精选推广 $bidObj = Model_Plan_Jp::getBidPlanByHouseIdEx($ajkBrokerId, $propId, true); if (!empty($bidObj)) { if ($bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_ONLINE || $bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD) { return array('err_no' => self::BID_HOUSE_ALREADY_IN_BID, 'err_msg' => '房源已经加入精选推广'); } elseif ($bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_HOLD) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源正在结算中,请稍后...'); } } $bidChoiceCount = Model_Plan_Jp::getBidChoiceInfoEx($cityId, $ajkBrokerId); //获取精选推广预算 $brokerInfo = Bll_BrokerBaseBll::get_instance()->get_broker_info($ajkBrokerId); $brokerCompanyId = $brokerInfo['BaseInfo']['COMPANYID']; $choiceSet = APF::get_instance()->get_config('choice_set'); if (isset($choiceSet[$brokerCompanyId]) && !empty($choiceSet[$brokerCompanyId])) { $min_budget = $choiceSet[$brokerCompanyId]['jp']['JP_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet[$brokerCompanyId]['jp']['JP_CHOICE_MAX_BUDGET']; } else { $min_budget = $choiceSet['default']['jp']['JP_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet['default']['jp']['JP_CHOICE_MAX_BUDGET']; } if ($params['budget'] < $min_budget || $params['budget'] > $max_budget) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '推广预算最低' . $min_budget . '安币,最高' . $max_budget . '安币'); } $status = isset($bidObj['status']) ? $bidObj['status'] : 0; if (count($bidChoiceCount) >= self::ALL_JP_PLAN_NUM && $status != 4) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '精选推广房源已经超过' . self::ALL_JP_PLAN_NUM . '套'); } if (0 == $jpBrokerInfo) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '您不是金铺经纪人'); } /** 获取房源基本信息 */ $propInfo = Bll_House_JpHouseInfo::getHouseInfoById($propId); if (empty($propInfo)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不存在'); } if ($propInfo['base']['memberId'] != $jpBrokerInfo['id']) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不属于该经纪人'); } /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($cityId, Const_Site::JINPU)) { /** 判断房源是否在套餐推广 */ $propCombos = Bll_Combo_HouseRelation::getOnlineRelationByHouseId($propId, Bll_Combo_HouseRelation::SITE_TYPE_JP); if (empty($propCombos)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源必须在套餐推广才能参与精选'); } } if (false == $propInfo['info']['isExquisite']) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '精品、新发15天房源才能参与精选推广', 'params' => array('site' => 'jp')); } $limitDay = intval(date('Ymd', strtotime('-15 days'))); $postDay = intval(date('Ymd', strtotime($propInfo['base']['createTime']))); if ($limitDay > $postDay) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '精品、新发15天房源才能参与精选推广', 'params' => array('site' => 'jp')); } /** 获取板块信息 **/ $blockArr = Bll_House_JpHouseInfo::getBlock($propInfo['base']['houseType'], $propInfo['info']); if (!$blockArr['blockId'] && !$blockArr['newBlockId']) { return array('err_no' => self::BID_HOUSE_ALREADY_IN_BID, 'err_msg' => '房源缺少板块信息'); } /** 获取价格信息 **/ $arrPrice = Bll_House_JpHouseInfo::getPrice($cityId, $propInfo['base']['houseType'], $propInfo['info']); if (empty($arrPrice['price_id'])) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '缺少价格段信息'); } /** 获取点击单价开始 */ try { $apiParams = array('brokerId' => $ajkBrokerId, 'cityId' => $cityId, 'price' => $arrPrice['price'] ?: 0, 'blockId' => $blockArr['blockId'] ?: 0, 'newBlockId' => $blockArr['newBlockId'] ?: 0, 'houseType' => $propInfo['base']['houseType']); /** * @var Bll_Service_Client_HttpResponse $clickPrice */ for ($i = 0; $i < 3; $i++) { $clickPrice = Bll_Service_Choice::jpClickPrice($apiParams); if ($clickPrice->isSucceeded()) { break; } } if (!$clickPrice->isSucceeded() || $clickPrice['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-1000)'); } if ($params['budget'] * 100 < $clickPrice['realTradeAmount']) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '推广预算不能小于点击单价'); } /** 点击单价不能小于当前系统内的单价 防止恶意操作 */ if ($params['price'] < $clickPrice['realTradeAmount'] / 100) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '点击单价错误'); } } catch (Exception $e) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-2000)'); } /** 防并发 */ if (false === self::rejectSameRequest(Bll_Plan_Bid_Choice::SITE_JP, $ajkBrokerId, $propId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-906)'); } /** 往冻结队列里添加记录,获取request id*/ $bidFreezeOrder = new Bll_Plan_BidFreezeOrderNum(date('Y')); $ajk_user_id = Bll_Broker_MainBusiness::getDataByEsfId($ajkBrokerId)->memberId; $requestId = $bidFreezeOrder->getRequestId(Bll_Plan_BidFreezeOrderNum::JP, $ajk_user_id, date('Y'), 0, $propId); /** 冻结金额 **/ $freezeResult = self::bid_freeze($ajkBrokerId, $params['budget'] * 100, $requestId, sprintf('金铺精选房源冻结,房源ID是: %d', $propId), Const_PaymentApp::JP_CHOICE); /** 判断是否冻结成功 **/ $freezeResponse = $freezeResult->getResponse(); if (!$freezeResult->isSucceeded() || $freezeResponse['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => isset($freezeResult['info']) ? $freezeResult['info'] . "code:" . $freezeResult['code'] : '冻结金额失败'); } //检查是否有坑位 坑位+1 $bucketStatus = Model_Choice_JPBidBucket::incrementUsedNum($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); if (!$bucketStatus) { return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '精选推广已满,请稍后再试'); } /** 获取最小竞价单元的精选信息 **/ $bucketInfo = Model_Choice_JPBidBucket::getBucketInfo($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); /** 根据最小竞价单位里面的房源数判断当前的房源应该是排队还是推广中 **/ /* if ($bucketInfo['usedNum'] > $bucketInfo['maxOnlineNum']) { $planStatus = Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD; } else { $planStatus = Model_Plan_Jp::ENUM_STATUS_ONLINE; } */ $planStatus = Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD; /** 如果计划已经存在删除该计划**/ if (isset($bidObj['status']) && $bidObj['status'] == 4) { Model_Plan_Jp::data_access()->set_field('isDelete', 1)->filter('id', $bidObj['id'])->update(); } /** 构造计划数据 创建计划**/ $planData = self::buildJpPlanData($cityId, $jpBrokerInfo['id'], $params['budget'], $freezeResult['data']['sn'], $propId, $blockArr['blockId'], $blockArr['newBlockId'], $arrPrice['price_id'], $propInfo['base']['houseType'], $planStatus); $planData['ajkBrokerId'] = $ajkBrokerId; $PlanObj = Model_Plan_Jp::create($planData); $PlanObj->save(); if (empty($PlanObj->id)) { /** 坑位-1 **/ Model_Choice_JPBidBucket::decrementUsedNum($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); Model_Plan_Jp::data_access()->set_field('isDelete', 0)->filter('id', $bidObj['id'])->update(); return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '创建计划失败'); } /** 更新房源里面的竞价计划id **/ $propInfo['base']->bidSpreadId = $PlanObj->id; $propInfo['base']->save(); /** 更新房源分表信息 **/ //$propInfo['info']->isList = 1; $propInfo['info']->spreadOffer = $clickPrice['realTradeAmount']; $propInfo['info']->spreadOfferTime = time(); $propInfo['info']->save(); /** 构建精选动作处理数据 **/ $choiceData = self::buildJpChoiceData($ajkBrokerId, Model_Choice_ActionQueue::ENUM_BEGIN_BY_HAND, $PlanObj->id, '经纪人手动推广', $propId); /** 插入到精选动作处理队列表 **/ Model_Choice_ActionQueue::create($choiceData, date('m'))->save(); $bidFreezeOrder->updateRequestComplete($requestId, $freezeResult['data']['sn'], $PlanObj->id); if ($bucketInfo['usedNum'] > $bucketInfo['maxOnlineNum']) { $rank = $bucketInfo['usedNum'] - $bucketInfo['maxOnlineNum']; return array('err_no' => self::BID_WAIT_SUCCESS, 'err_msg' => '精选排队成功', 'rank' => $rank); } else { return array('err_no' => self::BID_SHOW_SUCCESS, 'err_msg' => '精选推广成功'); } }
public function handle_request_internal() { if (!$this->isBrokerLogin()) { $this->redirect_to_login(); } /** * @var $request AJKRequest */ $request = APF::get_instance()->get_request(); $response = APF::get_instance()->get_response(); $params = $this->getParameters(); $routeMatches = $request->get_router_matches(); $business = $routeMatches[1]; $cityId = $request->getBrokerCityId(); /** 判断是否是精选开放城市 */ $siteType = $business == 'ajk' ? Const_Site::ANJUKE : ($business == 'hz' ? Const_Site::HAOZU : Const_Site::JINPU); if (!Bll_City::isChoiceIndependentCity($cityId, $siteType)) { $this->redirect('/ajkbroker/combo/broker/manage/' . $business . '/?from=V2'); } $brokerId = $request->getBrokerId(); $response->set_content_type('text/html', 'utf-8'); if (!Bll_Broker_HzBroker::isComboBroker($brokerId)) { if ($business == 'jp') { $this->redirect('/jinpu/house/managementv3'); } else { $this->redirect('/ajkbroker/user/manage/proplist/' . $business . '/'); } } /** * 三网统一Controller入口,但是业务实现层使用各自的。 */ $businessCallback = array('ajk' => array('Bll_Broker_Combo_ManageAjk', 'getComboInfo'), 'hz' => array('Bll_Broker_Combo_ManageHz', 'getComboInfo'), 'jp' => array('Bll_Broker_Combo_ManageJp', 'getComboInfo')); if (!isset($businessCallback[$business])) { $this->redirect(sprintf('/ajkbroker/user/manage/proplist/ajk/?%s', http_build_query(array('err' => '地址错误')))); } /** * 调用三网业务回调函数 * @link http://php.net/manual/zh/function.call-user-func.php */ $pageParams = call_user_func($businessCallback[$business], $this, $request, $response); //echo "<pre>";print_r($pageParams);exit; if (false === $pageParams) { $this->redirect(sprintf('/ajkbroker/user/manage/proplist/ajk/?%s', http_build_query(array('err' => '系统繁忙')))); } $this->setAttributes($pageParams); $this->setAttribute('pageType', $business); $this->setAttribute('business', $business); $this->setAttribute('broker', self::$BrokerInfo); /** * 添加委托房源信息栏 * add by xiongjianxu */ $areaCode = $this->getBrokerAreaCode(self::$BrokerInfo['BaseInfo']); $this->getCommissionInfo($brokerId, $cityId, $areaCode, 1); //echo '<!--- ', PHP_EOL, print_r($pageParams, true), PHP_EOL, ' --->'; //获取一元精选的配置 $isUnitaryChoice = Bll_Stats_DaUploadUnitarySiteCommPriceDaily::getUnitaryChoiceConfig($cityId); $this->setAttribute('isUnitaryChoice', $isUnitaryChoice); //判断房源季活动是否开始 $activityStatus = Bll_City_BizType::isOnActivity($cityId, 4, Const_CityBizType::TYPE_ACTIVITY_RES); $this->setAttribute('activityStatus', $activityStatus); if ($business == 'ajk') { return 'Combo_Broker_HouseManageAjkV2'; } else { return 'Combo_Broker_HouseManageV2'; } }
/** * 开启精选计划 * * @param $brokerId int 经纪人id * @param $propId int 房源id * @param $budget int 预算,单位元 */ public function startChoice($brokerId, $propId, $budget) { try { //获取经纪人基本信息 $brokerBaseInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); if (empty($brokerBaseInfo)) { $this->error(self::EMPTY_BROKER_ERROR, self::EMPTY_BROKER_ERROR_MSG); } $cityId = $brokerBaseInfo->cityId; $userId = $brokerBaseInfo->userId; //判断经纪人城市是否开通精选 if (!$this->checkChoiceOpen($brokerBaseInfo->cityId)) { $this->error(self::CHOICE_CLOSE_ERROR, self::CHOICE_CLOSE_ERROR_MSG); } //判断预算的合法性 if ($budget < Bll_Plan_Bid_Choice::ESF_CHOICE_MIN_BUDGET || $budget > Bll_Plan_Bid_Choice::ESF_CHOICE_MAX_BUDGET) { $this->error(self::BUDGET_INVALID_ERROR, self::BUDGET_INVALID_ERROR_MSG); } //判断余额是否足够 $balanceResponse = Bll_Service_Payment::balance(Bll_Service_Payment::SITE_ANJUKE, array('userId' => $brokerBaseInfo->userId)); if ($balanceResponse['status'] == 'error') { throw new Exception(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } $balance = $balanceResponse['data']['balance']; if ($balance / 100 < $budget) { $this->error(self::BANANCE_LESS_BUDGET, self::BANANCE_LESS_BUDGET_MSG); } //获取房源信息 $houseInfo = Bll_House_EsfHouse::getHouseBaseInfo($propId, $cityId); if (empty($houseInfo)) { $this->error(self::PROP_NOT_EXIST_ERROR, self::PROP_NOT_EXIST_ERROR_MSG); } $houseInfo = $houseInfo[0]; //操作人验证 if ($houseInfo->userId != $userId) { $this->error(self::PROP_OPREATE_ACCESS_INVALID_ERROR, self::PROP_OPREATE_ACCESS_INVALID_ERROR_MSG); } //房源是否可以精选验证 if ($houseInfo->isVisible != 1) { //违规验证 $this->error(self::PROP_CHOICE_NOT_FIT_ISVISIBLE_ERROR, self::PROP_CHOICE_NOT_FIT_ISVISIBLE_ERROR_MSG); } if ($houseInfo->isHighQulity == 0) { //多图验证 $this->error(self::PROP_CHOICE_NOT_FIT_ISHIGHQULITY_ERROR, self::PROP_CHOICE_NOT_FIT_ISHIGHQULITY_ERROR_MSG); } if (date('Ymd', strtotime('-16 days')) > date('Ymd', $houseInfo->postDate)) { //发布时间验证 $this->error(self::PROP_CHOICE_NOT_FIT_POSTDATE_ERROR, self::PROP_CHOICE_NOT_FIT_POSTDATE_ERROR_MSG); } $planInfo = Model_Plan_EsfAjkPropSpread::getChoicePlanInfoByHouseid($propId); if (!empty($planInfo)) { $reBid = 1; } //判断当前经纪人已经精选推广的房源数 if ($reBid) { if (Bll_Plan_Bid_Choice::checkEsfBidChoiceFull($brokerId, $cityId, 1)) { $this->error(self::MAX_CHOICE_NUM_ERROR, sprintf(self::MAX_CHOICE_NUM_ERROR_MSG, Bll_Plan_Bid_Choice::$all_esf_plan_num)); } } else { if (Bll_Plan_Bid_Choice::checkEsfBidChoiceFull($brokerId, $cityId)) { $this->error(self::MAX_CHOICE_NUM_ERROR, sprintf(self::MAX_CHOICE_NUM_ERROR_MSG, Bll_Plan_Bid_Choice::$all_esf_plan_num)); } } //套餐经纪人 还是ppc经纪人 /*$IsComboCity = Bll_Broker_HzBroker::isComboBroker($brokerId); if ($IsComboCity) { //是否套餐推广 $comboHouseRelation = Model_Combo_HouseRelation::getOnlineHousebyHouseId($brokerId, $propId, $cityId, Model_Combo_HouseRelation::SITE_TYPE_AJK); if(empty($comboHouseRelation)) { $this->error(self::PROP_NO_COMBO, self::PROP_NO_COMBO_MSG); } } else { //判断房源的定价计划状态 $fixPlanBll = new Bll_FixedSpread_PropFixedPlanRelation(); $fixPlanRelationStatus = $fixPlanBll->getProSpreadRelationByProId($propId, $cityId); if ($fixPlanRelationStatus['Status'] != 1) { $this->error(self::PROP_CHOICE_NOT_FIT_FIXED_ERROR, self::PROP_CHOICE_NOT_FIT_FIXED_ERROR_MSG); } }*/ /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($cityId, Const_Site::ANJUKE)) { /** 判断是在套餐推广中 */ $houseState = Bll_Combo_HouseRelation::getOnlineRelationByHouseId($propId, Bll_Combo_HouseRelation::SITE_TYPE_AJK); if (empty($houseState)) { $this->error(self::PROP_NO_COMBO, self::PROP_NO_COMBO_MSG); } } /** 防并发 */ if (false === Bll_Plan_Bid_Choice::rejectSameRequest(Bll_Plan_Bid_Choice::SITE_AJK, $brokerId, $propId)) { $this->error(self::OPERATION_TIME_ERROR, self::OPERATION_TIME_ERROR_MSG); } //判断是否已在竞价计划中 if ($reBid) { if ($planInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE || $planInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) { $this->error(self::PROP_CHOICE_NOT_FIT_CHOICED_ERROR, self::PROP_CHOICE_NOT_FIT_CHOICED_ERROR_MSG); } } else { if (!empty($planInfo) || $planInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE || $planInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) { $this->error(self::PROP_CHOICE_NOT_FIT_CHOICED_ERROR, self::PROP_CHOICE_NOT_FIT_CHOICED_ERROR_MSG); } } //重新推广,判断结算状态 if ($reBid) { if ($planInfo->tradestatus != Model_Plan_EsfAjkPropSpread::COMPLETETTRADESTATU) { $this->error(self::PROP_CHOICE_NOT_SETTLE_ERROR, self::PROP_CHOICE_NOT_SETTLE_ERROR_MSG); } } $housePrice = intval($houseInfo->proPrice * 10000); $priceIntervalInfo = Model_House_EsfPrice::get_price($cityId, $housePrice); if (empty($priceIntervalInfo)) { $this->error(self::PROP_PRICE_UNKNOW_ERROR, self::PROP_PRICE_UNKNOW_ERROR_MSG); } $priceId = $priceIntervalInfo['id']; $minPrice = $priceIntervalInfo['minPrice']; $maxPrice = $priceIntervalInfo['maxPrice']; //查询坑情况 $bucketInfo = Model_Choice_EsfBidBucket::get_bucket_info($houseInfo->commId, $priceId); if (empty($bucketInfo)) { if (Model_Choice_EsfBidBucket::init_bucket_info($houseInfo->commId, $priceId, $cityId)) { $bucketInfo = array('communityId' => $houseInfo->commId, 'priceId' => $priceId, 'totalNum' => Model_Choice_EsfBidBucket::TOTALNUM, 'usedNum' => 0, 'maxOnlineNum' => Model_Choice_EsfBidBucket::MAXONLINENUM); } else { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } } //预判断坑位 if ($bucketInfo['usedNum'] >= $bucketInfo['totalNum']) { $this->error(self::CHOICE_QUEUE_FULL, self::CHOICE_QUEUE_FULL_MSG); } //按照最大坑位数目更新 if (!Model_Choice_EsfBidBucket::increment_used_num($houseInfo->commId, $priceId, 0)) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } //获取reuqestid $year = date('Y'); $bll = new Bll_Plan_BidFreezeOrderNum($year); $requestId = $bll->getRequestId(Bll_Plan_BidFreezeOrderNum::ESF, $userId, $year, 0, $propId); //冻结金额 $amount = $budget * 100; $note = sprintf("二手房精选房源冻结,propId: %d", $propId); if (($freezeResult = Bll_Plan_Bid_Choice::bid_freeze($brokerId, $amount, $requestId, $note, Const_PaymentApp::AJK_CHOICE)) === false) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } if (!$freezeResult->isSucceeded()) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } if ($freezeResult['status'] == 'error') { $this->error(self::CHOICE_FREEZE_ERROR, self::CHOICE_FREEZE_ERROR_MSG); } $snNum = $freezeResult['data']['sn']; //重新推广,将原来的推广计划置为删除状态 if ($reBid) { $planInfo->status = Model_Plan_EsfAjkPropSpread::DELETE; if (!$planInfo->save()) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } } for ($i = 0; $i < 3; $i++) { //价格 $clickPrice = Bll_Service_Choice::ajkClickPrice(array('brokerId' => $brokerId, 'cityId' => $cityId, 'price' => $housePrice, 'commId' => $houseInfo->commId)); if ($clickPrice->isSucceeded()) { break; } } if (empty($clickPrice) || $clickPrice['status'] != 'ok') { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } $priceUnit = round($clickPrice['realTradeAmount'] / 100, 2); //新建计划 $time = time(); $offer = $priceUnit * 100; $stopTime = $time + Bll_Plan_Bid_Choice::ESF_AUTO_STOP_TIME; $endTime = time() + Model_Plan_EsfAjkPropSpread::CHOICELASTINGTIME; $arrAddInfo['serialnumber'] = $snNum; $arrAddInfo['propId'] = $propId; $arrAddInfo['cityId'] = $cityId; $arrAddInfo['commId'] = $houseInfo->commId; $arrAddInfo['brokerId'] = $brokerId; $arrAddInfo['userId'] = $userId; $arrAddInfo['budget'] = $amount; $arrAddInfo['balance'] = $amount; $arrAddInfo['spreadstartdate'] = $time; $arrAddInfo['spreadenddate'] = $endTime; $arrAddInfo['bigprice'] = $maxPrice; $arrAddInfo['smallprice'] = $minPrice; $arrAddInfo['propriceint'] = $housePrice; $arrAddInfo['status'] = Model_Plan_EsfAjkPropSpread::ONQUEUE; $arrAddInfo['isreserve'] = Model_Plan_EsfAjkPropSpread::RESERVE; $arrAddInfo['bidVersion'] = Model_Plan_EsfAjkPropSpread::CHOICEVERSION; $arrAddInfo['areacode'] = $houseInfo->areaCode; $arrAddInfo['stoptime'] = $stopTime; $arrAddInfo['createtime'] = $time; $arrAddInfo['offer'] = $offer; //排名系数,请直接绕过 +_+ $hpratioABll = new Bll_Plan_Bid_EsfHpratioA(); $arrAddInfo['qulityScore'] = $hpratioABll->getHouseMass($propId, $brokerId, $cityId, $houseInfo->commId, $houseInfo->hasRoomPic, $houseInfo->isHighQulity, $houseInfo->postDate, $houseInfo->unitPrice); $commScore = round($hpratioABll->getCommScore($houseInfo->commId), 5); $arrAddInfo['commScore'] = $commScore; $userActionScore = $hpratioABll->getUserActionScore($propId, $cityId); $arrAddInfo['behaviorScore'] = $userActionScore; $arrAddInfo['hpratioA'] = $hpratioABll->getHpraio($offer, $arrAddInfo['qulityScore'], $userActionScore); $hpratioNorm = $hpratioABll->getPpcNormHpratio($arrAddInfo['hpratioA'], $houseInfo->commId, false, $minPrice, $maxPrice, $houseInfo->areaCode); $arrAddInfo['commsHpratioA'] = round($commScore * $hpratioNorm, 5); if (($planId = Model_Plan_EsfAjkPropSpread::insertLayer($arrAddInfo)) === false) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } //新精选队列插入记录 if (!Bll_Plan_Bid_EsfChoiceQueue::insert($brokerId, $planId, Model_Choice_ActionQueue::ENUM_BEGIN_BY_HAND, date('m'), $brokerId, '经纪人手动开始推广', APF::get_instance()->get_request()->get_client_ip())) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } //插入自动停止队列 $stopType = Model_Plan_EsfAjkPropspreadQueue::AUTOSTOP; Model_Plan_EsfAjkPropspreadQueue::insertOne($planId, $stopTime, $stopType); //记录log表 $remark = sprintf("PROP_ID:null=>%d;CITY_ID:null=>%d;COMM_ID:null=>%d;BROKER_ID:null=>%d;USER_ID:null=>%d;BUDGET:null=>%d;SPREADSTARTDATE:null=>%d;SPREADENDDATE:null=>%d;STATUS:null=>%d;ISRESERVE:null=>%d;SERIALNUMBER:null=>%d;TRADETYPE:0=>1;BALANCE:0=>%d;PROPRICEINT:0=>%d;BIGPRICE:0=>%d;SMALLPRICE:0=>%d", $propId, $cityId, $houseInfo->commId, $brokerId, $userId, $amount, $time, $endTime, Model_Plan_EsfAjkPropSpread::ONQUEUE, Model_Plan_EsfAjkPropSpread::RESERVE, $snNum, $amount, $housePrice, $maxPrice, $minPrice); Model_Plan_LogAjkPropspread::addNewLog($planId, $brokerId, Model_Plan_LogAjkPropspread::ADD, $remark); //更新reuqest id完成 if (!$bll->updateRequestComplete($requestId)) { $this->error(self::SYSTEM_BUSY_ERROR, self::SYSTEM_BUSY_ERROR_MSG); } $rankNum = Bll_Plan_Bid_Choice::getEsfOnlineAndOnQueueNum($planId, $houseInfo->commId, $minPrice, $maxPrice); if ($rankNum <= $bucketInfo['maxOnlineNum']) { return array('status' => self::START_CHOICE_TO_ONLINE, 'statusMsg' => self::START_CHOICE_TO_ONLINE_MSG); } else { return array('status' => self::START_CHOICE_TO_ONQUEUE, 'statusMsg' => self::START_CHOICE_TO_ONQUEUE_MSG); } } catch (Exception $e) { if ($e instanceof Exception_BllErrorException) { $this->errorCode = $e->getCode(); } else { $this->errorCode = self::UNKNOW_ERROR; } $this->errorMsg = $e->getMessage(); return false; } }
public function handle_request() { //分表 $date = date('Ymd'); $id = 0; //获取游标 $dateFlag = $this->getFlag(); if (!empty($dateFlag)) { $date = $dateFlag['date']; $id = $dateFlag['id']; } //竞价队列数据获取 $ProLogList = Model_Log_HouseLogNew::getProLogList($date, $id, $this->limit); //判断当前队列是否处理完成 if (empty($ProLogList)) { //判断是否切换表 if ($date < date('Ymd')) { $date = date('Ymd', strtotime($date) + 24 * 3600); $id = 0; //记录表游标 $this->setFlag(array('date' => $date, 'id' => $id)); } //休息1秒钟 $this->setShCommonSleepTime(1); $this->setLog('处理完成'); exit; } //队列数据处理 foreach ($ProLogList as $list) { $id = $list['id']; $this->setFlag(array('date' => $date, 'id' => $id)); $this->setLog(json_encode($list)); $this->setLogPrefix(sprintf('[brokerId=%d, houseId=%d, type=%d]', $list['brokerId'], $list['houseId'], $list['type'])); //1-新发,2-编辑,3-删除,4-房源更新,5-推广,6-取消推广,7-第二天推广,8 -违规, 9-到期, 10-加入计划, 11-移出计划,12-取消第二天推广,13-精选排队中,14-精选推广,15-取消精选推广或排队 //20-套餐房源推广,21-套餐房源取消推广 $notifyBidQueueType = array(2, 3, 8, 9, 11, Const_ProLogType::LOG_REMOVE_FROM_COMBO, Model_Log_HouseLogNew::TYPE_COMMUNITY_AREA_CHANGE_EX, Const_ProLogType::LOG_PRICE_INTERVAL_CHANGE, Const_ProLogType::LOG_COMMUNITY_MERGE); if (!in_array($list['type'], $notifyBidQueueType)) { $this->setLog(sprintf('不需处理[notifyBidQueueType: %s]', implode(',', $notifyBidQueueType))); continue; } //房源移出定价计划 if ($list['type'] == 11) { $this->proRemoveFromPlan($list); continue; } //房源修改,价格变更 if ($list['type'] == 2) { if ($list['changeType'] == Const_ProPlanChangeType::PRO_PRICE_CHANGE) { $this->proEdit($list); } else { $this->setLog(sprintf('brokerId=%d, houseId=%d, type=%d, 非价格变更', $list['brokerId'], $list['houseId'], $list['type'])); } continue; } //房源取消套餐推广(非解绑状态) if ($list['type'] == Const_ProLogType::LOG_REMOVE_FROM_COMBO) { //获取该城市精选套餐解绑配置 $isChoiceIndependentCity = Bll_City::isChoiceIndependentCity($list['cityId'], $list['siteType']); if (!$isChoiceIndependentCity) { $this->proRemoveFromCombo($list); } else { $this->setLog(sprintf('精选解绑城市[%d]', $list['cityId'])); } continue; } /** 房源区域板块变更,判断是否要通知精选 */ if ($list['type'] == Model_Log_HouseLogNew::TYPE_COMMUNITY_AREA_CHANGE_EX && $list['siteType'] == 2) { $this->hzHouseBlockIdChange($list); continue; } /** 二手房小区合并,判断是否要通知精选 */ if ($list['type'] == Const_ProLogType::LOG_COMMUNITY_MERGE && $list['siteType'] == 1) { $this->ajkCommunityMerge($list); continue; } if (($list['type'] == Const_ProLogType::LOG_PROPERTY_AREA_CHANGE || $list['type'] == Const_ProLogType::LOG_BUILDING_AREA_CHANGE) && $list['siteType'] == 3) { $this->jpHouseBlockIdChange($list); continue; } if (in_array($list['type'], array(3, 8, 9))) { $this->proDelete($list); continue; } if ($list['type'] == Const_ProLogType::LOG_PRICE_INTERVAL_CHANGE && $list['siteType'] == 1) { $this->housePriceIntervalChange($list); continue; } } //休息10毫秒 $this->setShCommonSleepTime(0.01); }
public function handle_request_internal() { $brokerId = $this->_params['brokerId']; //经纪人信息 $brokerInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); if (!$brokerInfo) { throw new Exception_BrokerNotFoundException('经纪人不存在', Const_APIStatus::E_BROKER_NOT_EXISTS); } if (!Bll_Broker_HzBroker::isComboBroker($brokerId)) { throw new Exception_ISNotComboBrokerException('不是套餐经纪人。'); } // 套餐信息 $comboInfoList = Bll_Combo_Broker_BrokerComboInfo::getBrokerComboList($brokerId); $currentDate = time(); foreach ($comboInfoList as $comboInfo) { $startDate = strtotime($comboInfo['startTime']); $endDate = strtotime($comboInfo['endTime']); // 获取当前使用的套餐 if ($currentDate >= $startDate && $currentDate < $endDate && $comboInfo['salePropNum'] + $comboInfo['rentPropNum'] > 0) { $currentCombo = $comboInfo; $comboPropNum = $currentCombo['salePropNum']; if (Bll_Combo_Broker_BrokerComboInfo::isOpenUp($currentCombo)) { $comboPropNum = $currentCombo['rentPropNum'] + $currentCombo['salePropNum']; } break; } } $hasCombo = 0; //没有二手房套餐 if (!isset($currentCombo)) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('list' => array(), 'surplus' => 0, 'hasCombo' => $hasCombo)); } else { $hasCombo = 1; } $cityId = $brokerInfo->cityId; //获取套餐推广信息 $comboSpreadHouseList = Bll_Broker_Combo_ManageAjk::getComboSpreadHouseList($brokerId, $cityId); if (Bll_Combo_Broker_BrokerComboInfo::isOpenUp($currentCombo)) { $currentSpreadHouseCount = Bll_Combo_HouseRelation::getHouseCount($brokerId, Bll_Combo_Broker_BrokerComboInfo::SITE_TYPE_AJK, true); } else { $currentSpreadHouseCount = Bll_Combo_HouseRelation::getHouseCountEx($brokerId, $cityId, Bll_Combo_Broker_BrokerComboInfo::SITE_TYPE_AJK); } //套餐还可以推的房源数量 $surplus = $comboPropNum - $currentSpreadHouseCount; if (empty($comboSpreadHouseList)) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('list' => array(), 'surplus' => $surplus, 'hasCombo' => $hasCombo)); } //获取房源信息 $propIds = array_keys($comboSpreadHouseList); $propsInfo = Bll_House_EsfHouse::getHouseBaseInfo($propIds, $cityId); //批量获取默认图片 $propDefImages = Model_House_AjkPropertyData::getDafImages($propIds); //批量获取房源总点 $houseTodayClickInfo = Bll_House_EsfHouse::getHouseTodayComboClick($propIds); $houseClickInfo = Bll_House_EsfHouse::getComboHouseAccumulateClickByPropIds($brokerId, $propIds, $cityId); //房源竞价&精选计划 $propSpreadInfo = Model_Plan_EsfAjkPropSpread::getPlanByPropIds($propIds); // 获取城市价格段信息 $priceSegmentList = Model_House_EsfPrice::getAllPriceInterval($cityId, Model_House_EsfPrice::TRADE_TYPE_SALE); //是否是精选城市,是否精选分离 $cityIsChoice = Bll_City::isChoiceCity($cityId, Const_Site::ANJUKE); $cityIsChoiceIndependent = Bll_City::isChoiceIndependentCity($cityId, Const_Site::ANJUKE); //拼接房源列表中房源数据 $list = array(); foreach ($propsInfo as $prop) { $row = array(); $row['propId'] = $prop->proId; $row['title'] = $prop->proName; $row['commId'] = $prop->commId; $row['commName'] = $prop->commName; $row['roomNum'] = $prop->roomNum; $row['hallNum'] = $prop->hallNum; $row['area'] = round($prop->areaNum); $row['toiletNum'] = $prop->toiletNum; $row['price'] = intval($prop->proPrice); $row['priceUnit'] = '万'; $row['isBid'] = 0; $row['isChoice'] = 0; $row['isMoreImg'] = $prop->isHighQulity; $row['isPhonePub'] = $prop->uriCode == 'mobile.asyn' || $prop->uriCode == 'mobile-ajk-broker.asyn' ? 1 : 0; $row['isVisible'] = isset($houseInfo['isVisible']) ? $houseInfo['isVisible'] : 1; //0-违规房源 1-非违规房源 $row['createTime'] = $prop->postDate; //房源发布时间 $row['imgUrl'] = Model_House_AjkPropertyData::imageUrl($propDefImages[$prop->proId]); if ($prop->commitionType == 2) { $row['isEntrust'] = 1; } else { $row['isEntrust'] = 0; } $row['totalClicks'] = $houseTodayClickInfo[$prop->proId] + $houseClickInfo[$prop->proId]; if (isset($propSpreadInfo[$prop->proId])) { if ($propSpreadInfo[$prop->proId]->bidVersion == 1 && ($propSpreadInfo[$prop->proId]->status == 1 || $propSpreadInfo[$prop->proId]->status == 11)) { $row['isBid'] = 1; } elseif ($propSpreadInfo[$prop->proId]->bidVersion == 2 && ($propSpreadInfo[$prop->proId]->status == 1 || $propSpreadInfo[$prop->proId]->status == 11)) { $row['isChoice'] = 1; } } $choiceStatusRecommend = Bll_House_EsfHouse::getEsfChoiceStatusAndRecommend($priceSegmentList, $propSpreadInfo, $prop, $cityIsChoice, $cityIsChoiceIndependent); $row['choiceStatus'] = $choiceStatusRecommend['choiceStatus']; $row['choiceStatusName'] = $choiceStatusRecommend['choiceStatusName']; $row['choiceRecommend'] = $choiceStatusRecommend['choiceRecommend']; $list[] = $row; } // 排序 usort($list, function ($a, $b) { if ($a['createTime'] == $b['createTime']) { return 0; } return $a['createTime'] > $b['createTime'] ? -1 : 1; }); return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('list' => $list, 'surplus' => $surplus > 0 ? $surplus : 0, 'hasCombo' => $hasCombo)); }
public function handle_request_internal() { $brokerId = $this->_params['brokerId']; $brokerInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); if (!$brokerInfo) { throw new Exception_BrokerNotFoundException('经纪人不存在', Const_APIStatus::E_BROKER_NOT_EXISTS); } if (!Bll_Broker_HzBroker::isComboBroker($brokerId)) { throw new Exception_ISNotComboBrokerException('不是套餐经纪人。'); } //获取套餐推广信息 $cityId = $brokerInfo->cityId; $comboSpreadHouseList = Bll_Broker_Combo_ManageAjk::getComboSpreadHouseList($brokerId, $cityId); $comboSpreadHouseIds = array_keys($comboSpreadHouseList); //获取精选推广信息 $bll = new BLL_Choice_EsfAPPAPIChoice(); $choiceHouseList = $bll->getBrokerPropChoiceInfo($brokerId); $choiceHouseIds = array(); foreach ($choiceHouseList as $list) { foreach ($list as $v) { $choiceHouseIds[] = $v['propId']; } } //获取经纪人所有房源信息 $tempHouseInfoList = Bll_House_EsfHouse::getBrokerAllPropInfoList($brokerId, $cityId); if (empty($tempHouseInfoList)) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('propertyList' => array())); } //未推广房源列表 $tempNoSpreadHouseList = array(); $noSpreadHouseIds = array(); foreach ($tempHouseInfoList as $houseInfo) { if (!in_array($houseInfo['proId'], $comboSpreadHouseIds) && !in_array($houseInfo['proId'], $choiceHouseIds)) { $houseInfo['illegal'] = isset($houseInfo['isVisible']) ? $houseInfo['isVisible'] : 1; //0-违规房源 1-非违规房源 $tempNoSpreadHouseList[$houseInfo['proId']] = $houseInfo; $noSpreadHouseIds[] = $houseInfo['proId']; } } // 获取城市价格段信息 $priceSegmentList = Model_House_EsfPrice::getAllPriceInterval($cityId, Model_House_EsfPrice::TRADE_TYPE_SALE); /** 过滤违规房源 */ $tmpIllegalList = array(); if (!$noSpreadHouseIds) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('propertyList' => array())); } foreach ($tempNoSpreadHouseList as $propId => $houseInfo) { if ($houseInfo['illegal'] == 0 && $houseInfo['expireWorker'] != 'propertyReport') { $tmpIllegalList[$propId] = $houseInfo; unset($tempNoSpreadHouseList[$propId]); } } //是否是精选城市,是否精选分离 $cityIsChoice = Bll_City::isChoiceCity($cityId, Const_Site::ANJUKE); $cityIsChoiceIndependent = Bll_City::isChoiceIndependentCity($cityId, Const_Site::ANJUKE); //违规房源排在前面 $noSpreadHouseList = array_merge($tmpIllegalList, $tempNoSpreadHouseList); $propDefImages = Model_House_AjkPropertyData::getDafImages($noSpreadHouseIds); $propertyList = array(); foreach ($noSpreadHouseList as $houseInfo) { $row = array(); $row['propId'] = $houseInfo['proId']; $row['title'] = $houseInfo['proName']; $row['commId'] = $houseInfo['commId']; $row['commName'] = $houseInfo['commName']; $row['roomNum'] = $houseInfo['roomNum']; $row['hallNum'] = $houseInfo['hallNum']; $row['area'] = round($houseInfo['areaNum']); $row['toiletNum'] = $houseInfo['toiletNum']; $row['price'] = intval($houseInfo['proPrice']); $row['priceUnit'] = '万'; $row['isBid'] = 0; $row['isChoice'] = 0; $row['isMoreImg'] = $houseInfo['isHighQulity']; $row['isPhonePub'] = $houseInfo['uriCode'] == 'mobile.asyn' || $houseInfo['uriCode'] == 'mobile-ajk-broker.asyn' ? 1 : 0; $row['isVisible'] = $houseInfo['illegal']; //0-违规房源 1-非违规房源 $row['createTime'] = $houseInfo['postDate']; //房源发布时间 $row['imgUrl'] = $row['imgUrl'] = Model_House_AjkPropertyData::imageUrl($propDefImages[$houseInfo['proId']]); if ($houseInfo['commitionType'] == 2) { $row['isEntrust'] = 1; } else { $row['isEntrust'] = 0; } //精选状态: 可精选;可排队;精选中;排队中 $choiceStatusRecommend = Bll_House_EsfHouse::getEsfChoiceStatusAndRecommend($priceSegmentList, array(), $houseInfo, $cityIsChoice, $cityIsChoiceIndependent); $row['choiceStatus'] = $choiceStatusRecommend['choiceStatus']; $row['choiceStatusName'] = $choiceStatusRecommend['choiceStatusName']; $row['choiceRecommend'] = $choiceStatusRecommend['choiceRecommend']; $propertyList[] = $row; } //排序 usort($propertyList, function ($a, $b) { if ($a['createTime'] == $b['createTime']) { return 0; } return $a['createTime'] > $b['createTime'] ? -1 : 1; }); return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('propertyList' => $propertyList)); }
/** * 判断经纪人是否可以添加房源精选订阅 * * 1. 是否已精选房源 * 2. 是否已设提醒房源 * 3. 是否具有精选资格房源:定价,多图,新发15天 * 4. 是否推广位已满 */ protected function hasAddChoiceRemindPermission() { // 是否已精选 $bllChoice = new Bll_Zufang_Choice(); $planInfo = $bllChoice->get_plan_by_proid($this->propId); if (!empty($planInfo)) { $planId = $planInfo->plan_id; $basicPlanInfo = $bllChoice->get_plan($planId); if ($basicPlanInfo[0]->status == 1 || $basicPlanInfo[0]->status == 13) { return array('code' => '', 'msg' => '房源已精选'); } } // 是否已订阅 $subscription = Model_Choice_Subscription::data_access()->filter('site', Model_Choice_Subscription::SITE_RENT)->filter('propId', $this->propId)->filter('bucketId', $this->bucket['id'])->find_only(); if ($subscription && $subscription['status'] == Model_Choice_Subscription::SUBSCRIPTION_START) { return array('code' => '', 'msg' => '推广位已订阅'); } // 是否可精选 // - 是否已定价/套餐 // - 是否多图 // - 是否新发15天 //套餐经纪人 还是ppc经纪人 /*$IsComboBroker = Bll_Broker_HzBroker::isComboBroker($this->brokerId); if ($IsComboBroker) { //是否套餐推广 $comboHouseRelation = Model_Combo_HouseRelation::getOnlineHousebyHouseId($this->brokerId, $this->propId, $this->broker['cityId'], Model_Combo_HouseRelation::SITE_TYPE_HZ); if(empty($comboHouseRelation)) { return array( 'code' => '', // TODO 'msg' => '不满足精选推广添加:套餐推广', ); } } else { //PPC经纪人 判定定价计划 $fixPlan = $this->prop->getFixPlan(); if(empty($fixPlan)) { return array( 'code' => '', // TODO 'msg' => '不满足精选推广添加:定价推广', ); } }*/ if (!Bll_City::isChoiceIndependentCity($this->broker['cityId'], Const_Site::ANJUKE)) { //是否套餐推广 $comboHouseRelation = Model_Combo_HouseRelation::getOnlineHousebyHouseId($this->brokerId, $this->propId, $this->broker['cityId'], Model_Combo_HouseRelation::SITE_TYPE_HZ); if (empty($comboHouseRelation)) { return array('code' => '', 'msg' => '不满足精选推广添加:套餐推广'); } } if (!($this->prop->isMultiImages() && $this->prop->getPublishedDays() <= 15)) { return array('code' => '', 'msg' => '不满足精选推广添加:多图,新发15天'); } // 是否推广位已满 if (!($this->bucket['usedNum'] >= $this->bucket['totalNum'])) { return array('code' => '', 'msg' => '推广位未满'); } return true; }
public function handle_request_combo() { $brokerId = $this->brokerId; $cityId = $this->cityId; $hzBrokerId = Bll_HzBroker::get_brokerid_by_ajk_brokerid($brokerId); //获取所有有效房源 $props = Bll_House_HzHouse::getValidPropsByBrokerId($hzBrokerId, $cityId); $propertyList = array(); if (!empty($props)) { //获取套餐推广房源列表 $comboList = Bll_Combo_HouseRelation::getHouseRelations($brokerId, Bll_Combo_HouseRelation::SITE_TYPE_HZ, 1); //获取精选房源列表 $bllChoice = new Bll_Zufang_Choice(); $choices = $bllChoice->get_active_choice_plans($hzBrokerId, array(1, 13, 2, 3, 7, 8)); $choicePropIds = array(); if (!empty($choices)) { $keyedPlans = array(); foreach ($choices as $choice) { $keyedPlans[$choice->id] = $choice; } // 获取所有的房源和精选的关系 $choiceRelations = $bllChoice->get_prop(array_keys($keyedPlans)); foreach ($choiceRelations as $choiceRelation) { $choicePropIds[] = $choiceRelation->proid; } } //所有有效房源-套餐推广房源-精选推广房源 = 待推广房源 if (!empty($comboList)) { foreach ($comboList as $row) { unset($props[$row['houseId']]); } } if (!empty($choicePropIds)) { foreach ($choicePropIds as $k => $v) { unset($props[$v]); } } if (!empty($props)) { // 批量获取房源的默认图片 $defaultImages = Model_Image_HzImage::getDefaultImagesByHouseIds(array_keys($props)); if (!empty($defaultImages)) { foreach ($defaultImages as $defaultImage) { $props[$defaultImage['proid']]['imgUrl'] = $defaultImage->imageUrl(); } } //是否是精选城市,城市是否精选分离 $cityIsChoice = Bll_City::isChoiceCity($cityId, Const_Site::HAOZU); $cityIsChoiceIndependent = Bll_City::isChoiceIndependentCity($cityId, Const_Site::HAOZU); foreach ($props as $list) { $row = array(); $row['id'] = $row['propId'] = $list['propId']; $row['title'] = $list['title']; $row['imgUrl'] = $list['imgUrl'] ?: ''; $row['commId'] = $list['commid']; $row['commName'] = $list['commname']; $row['roomNum'] = $list['roomnum']; $row['hallNum'] = $list['hallnum']; $row['toiletNum'] = $list['toilnetnum']; $row['area'] = round($list['areanum']); $row['price'] = round($list['pricenum']); $row['priceUnit'] = '元/月'; $row['todayClicks'] = $row['totalClicks'] = $row['isBid'] = $row['isChoice'] = 0; $row['isVisible'] = (int) ($list['status'] != 6); $row['isMoreImg'] = (int) $list['quality']; $row['isPhonePub'] = (int) (isset($list['from']) && $list['from'] == 'mobile-ajk-broker'); $isEntrust = Bll_Zufang_Choice::isCommissionHouse($list['propId'], $brokerId, Model_House_Commission::TYPE_RENT); $row['isEntrust'] = $isEntrust ? 1 : 0; $row['createTime'] = date('Y-m-d H:i:s', $list['created']); //精选状态 $choiceStatus = Bll_HzProp::getZuFangChoiceStatus($list, $cityId, $cityIsChoice); if (!$cityIsChoiceIndependent && $choiceStatus['choiceStatus']) { //城市未精选分离 $choiceStatus['choiceStatus'] = 0; $choiceStatus['choiceStatusName'] = ''; } $row['choiceStatus'] = $choiceStatus['choiceStatus']; $row['choiceStatusName'] = $choiceStatus['choiceStatusName']; $propertyList[] = $row; } } } return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('propertyList' => $propertyList)); }
/** * @param Manage_ProplistController $controller * @param AJKRequest $request * @param AJKResponse $response * * @return array */ public static function getComboInfo($controller, $request, $response) { $cityId = $request->getBrokerCityId(); $brokerId = $request->getBrokerId(); $query = $request->get_parameter('q'); $pageParams = array('query' => $query); if (!empty($query)) { $pageParams['searchByCommunity'] = !is_numeric($query); } /** 套餐信息 */ $comboInfoList = Bll_Combo_Broker_BrokerComboInfo::getBrokerComboList($brokerId); //echo "<pre>";print_r($comboInfoList);exit; $currentCombo = array(); $nextCombo = array(); $currentDate = time(); foreach ($comboInfoList as $comboInfo) { $startDate = strtotime($comboInfo['startTime']); $endDate = strtotime($comboInfo['endTime']); /** 获取当前使用的套餐 */ if ($currentDate >= $startDate && $currentDate < $endDate && $comboInfo['salePropNum'] > 0) { $currentCombo = $comboInfo; } /** 获取续买套餐 */ if ($comboInfo['salePropNum'] > 0 && $startDate > $currentDate) { if (!empty($nextCombo)) { $nextComboEffectTime = strtotime($nextCombo['startTime']); if ($nextComboEffectTime > $startDate) { $nextCombo = $comboInfo; } } else { $nextCombo = $comboInfo; } } } $pageParams['currentCombo'] = $currentCombo; $pageParams['nextCombo'] = $nextCombo; $pageParams['comboCanSpreadHouseCount'] = 0; if (!empty($currentCombo)) { if (Bll_Combo_Broker_BrokerComboInfo::isOpenUp($currentCombo)) { $hzSpreadHouseCount = Bll_Combo_HouseRelation::getHouseCountEx($brokerId, $cityId, Bll_Combo_HouseRelation::SITE_TYPE_HZ); $pageParams['comboCanSpreadHouseCount'] = max(0, $currentCombo['salePropNum'] + $currentCombo['rentPropNum'] - $hzSpreadHouseCount); } else { $pageParams['comboCanSpreadHouseCount'] = $currentCombo['salePropNum']; } } $pageParams['comboClick'] = Bll_Ppc_NewPackageStatsBrokerDay::getComboClickInfo($brokerId, date('Ymd'), Model_Ppc_NewPackageStatsBrokerDay::SITE_TYPE_AJK); $isChoiceCity = Bll_City::isChoiceCity($cityId, Const_Site::ANJUKE); $isBlockChoiceCity = Bll_City::isBlockChoice($cityId, Const_Site::ANJUKE); /** 精选城市 */ if ($isChoiceCity) { $pageParams['bidTip'] = '精选'; } $pageParams['isChoiceCity'] = $isChoiceCity; $pageParams['isBlockChoiceCity'] = $isBlockChoiceCity; $pageParams['isBidCity'] = false; $pageParams['isShowCaseCity'] = Bll_City::isShowCaseCity($cityId, Const_Site::ANJUKE); /** 获取竞价计划信息 */ if ($isChoiceCity) { $bidPropIds = array(); $pageParams['bidPlanList'] = static::getBrokerBidPlanList($brokerId, $cityId, $bidPropIds, true); $pageParams['bidPropIds'] = $bidPropIds; $pageParams['bidClickCount'] = Bll_Plan_Bid_AjkPlan::getBrokerBidClick($brokerId, date('Ymd'), $cityId); $pageParams['bidCost'] = Bll_Plan_Bid_AjkPlan::getBrokerBidCost($brokerId, date('Ymd'), $cityId); } /** 获取套餐推广信息 */ $comboSpreadHouseList = static::getComboSpreadHouseList($brokerId, $cityId); $pageParams['comboSpreadHouseList'] = $comboSpreadHouseList; $pageParams['comboHouseIds'] = array_keys($comboSpreadHouseList); /** 速度优化:effectURL 没有在房源管理页使用,所以这个是可以删除的 */ // if (!empty($comboSpreadHouseList)) { // TODO 获取效果时时看链接 // $pageParams['effectURL'] = Bll_Plan_Fix_AjkPlan::GetPlanFixedPriceDetailUri($pageParams['fixPlanPropList'][0]['planInfo']['id'], 0, 1); // } $houseInfoList = static::getBrokerAllPropInfoList($brokerId, $cityId, $pageParams['comboHouseIds'], $bidPropIds, $pageParams['isChoiceCity'], $query); //echo "<pre>";print_r($houseInfoList);exit; /** 房源质量信息 */ //$pageParams['houseSolly'] = static::getHouseSollyResult($houseInfoList['houseIdList']); $pageParams['houseSolly'] = static::getHouseSollyResultEx($houseInfoList); $pageParams['comboHouseIds'] = array_values(array_intersect($pageParams['comboHouseIds'], array_keys($houseInfoList['comboSpreadHouseList']))); if ($isChoiceCity) { $houseBidInfoList = array(); $houseBidStatus = array(); foreach ($pageParams['bidPlanList'] as $bidInfo) { $houseBidInfoList[$bidInfo['propId']] = $bidInfo; $houseBidStatus[$bidInfo['propId']] = $bidInfo['status']; if ($bidInfo['model'] == Model_Plan_EsfAjkPropSpread::BLOCK_CHOICE) { $pageParams['planInfoUrl'][$bidInfo['propId']]['urlChoice'] = "/ajkbroker/user/ajax/blockchoice"; } else { $pageParams['planInfoUrl'][$bidInfo['propId']]['urlChoice'] = "/ajkbroker/user/ajax/choice"; } } $pageParams['houseBidStatus'] = $houseBidStatus; $houseInfoList['comboSpreadHouseList'] = static::extendChoiceInfo($houseInfoList['comboSpreadHouseList'], $houseBidInfoList, $cityId); if (Bll_City::isChoiceIndependentCity($cityId, Const_Site::ANJUKE)) { $houseInfoList['noSpreadHouseList'] = static::extendChoiceInfo($houseInfoList['noSpreadHouseList'], $houseBidInfoList, $cityId); } // print_r($houseInfoList['noSpreadHouseList']); } /** 精选引导优化 (精选城市 && 已经购买了套餐 && 推广房源数>0) */ $choiceFunctionOptimizationGuide = false; /* if ($isChoiceCity && (!empty($currentCombo) || !empty($nextCombo)) && (count($comboSpreadHouseList) > 0)) { if (Bll_Broker_AjkBrokerGuideNew::getGuideStatus($brokerId, 'Choice_Function_Optimization') == 0) { $choiceFunctionOptimizationGuide = true; } } */ $pageParams['choiceFunctionOptimizationGuide'] = $choiceFunctionOptimizationGuide; //echo "<pre>";print_r(array_keys($houseInfoList));exit; return array_merge($pageParams, $houseInfoList); }
/** * 二手房-板块精选房源设置页面 * * @param int $brokerId * @param int $cityId * @param int $houseId * @param array $params * * @return array */ public static function esf_setting($brokerId, $cityId, $houseId, $userId, $params = array()) { $pageAttribute = array(); //获取精选推广预算 $brokerInfo = Bll_BrokerBaseBll::get_instance()->get_broker_info($brokerId); $brokerCompanyId = $brokerInfo['BaseInfo']['COMPANYID']; $choiceSet = APF::get_instance()->get_config('block_choice_set'); //根据经纪人公司不同有不同的预算 if (isset($choiceSet[$brokerCompanyId]) && !empty($choiceSet[$brokerCompanyId])) { $pageAttribute['min_budget'] = $choiceSet[$brokerCompanyId]['ajk']['ESF_CHOICE_MIN_BUDGET']; $pageAttribute['max_budget'] = $choiceSet[$brokerCompanyId]['ajk']['ESF_CHOICE_MAX_BUDGET']; } else { $pageAttribute['min_budget'] = $choiceSet['default']['ajk']['ESF_CHOICE_MIN_BUDGET']; $pageAttribute['max_budget'] = $choiceSet['default']['ajk']['ESF_CHOICE_MAX_BUDGET']; } self::setChoiceNum($cityId); //判断当前经纪人已经精选推广的房源数 if (isset($params['act']) && isset($params['rebid'])) { if (self::checkEsfBidChoiceFull($brokerId, $cityId, 1)) { //检查二手房精选是否达到最大 return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '最多精选推广' . self::$all_esf_plan_num . '套房源'); } } else { if (self::checkEsfBidChoiceFull($brokerId, $cityId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '最多精选推广' . self::$all_esf_plan_num . '套房源'); } } /** 经纪人重新推广房源 */ if (isset($params['act']) && isset($params['rebid'])) { //在精选管理页就已经设置时候是重新推广 $planInfo = Model_Plan_EsfAjkPropSpread::getChoicePlanInfoByHouseid($houseId); if ($planInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE || $planInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源已经精选'); } $pageAttribute['plan_id'] = $params['plan_id']; $pageAttribute['rebid'] = true; } $balance = self::get_broker_balance_by_broker_id($brokerId); //获取经纪人账户余额 $pageAttribute['balance'] = $balance; if ($balance > 0) { $balance = sprintf('%.2f', $balance / 100); } $pageAttribute['balance_fmt'] = $balance; //获取房源信息 $pageAttribute['housesInfo'] = Bll_House_EsfHouse::getHouseBaseInfo($houseId, $cityId); if (empty($pageAttribute['housesInfo'])) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不存在!'); } $houseInfo = $pageAttribute['housesInfo'][0]; if ($houseInfo->userId != $userId) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '房源不属于当前操作人'); } if ($houseInfo->isVisible != 1) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '房源是违规房源,不可以参加精选房源推广'); } if ($houseInfo->isHighQulity == 0) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '多图、新发15天房源才能参与精选推广'); } if (date('Ymd', strtotime('-15 days')) > date('Ymd', $houseInfo->postDate)) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '多图、新发15天房源才能参与精选推广'); } /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($cityId, Const_Site::ANJUKE)) { /** 判断是在套餐推广中 */ $houseState = Bll_Combo_HouseRelation::getOnlineRelationByHouseId($houseId, Bll_Combo_HouseRelation::SITE_TYPE_AJK); if (empty($houseState)) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '该房源不在推广中'); } } //判断是否已在竞价计划中 $planInfo = Model_Plan_EsfAjkPropSpread::getChoicePlanInfoByHouseid($houseId); if (!empty($planInfo) && !isset($params['act']) && !isset($params['rebid'])) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源已经精选'); } $block = Bll_Commtype_Api::getInfoByTypeCode($houseInfo->areaCode); $area = Bll_Commtype_Api::getInfoByTypeId($block['parentId']); $pageAttribute['areaBlock'] = $area['typeName'] . " " . $block['typeName']; $pageAttribute['title'] = sprintf("%s,%s,%d室%d厅%d卫,%d平,%.2f万", $pageAttribute['areaBlock'], $houseInfo->commName, $houseInfo->roomNum, $houseInfo->hallNum, $houseInfo->toiletNum, intval($houseInfo->areaNum), $houseInfo->proPrice); $pageAttribute['community_name'] = $houseInfo->commName; $housePrice = intval($houseInfo->proPrice * 10000); if (strlen($houseInfo->areaCode) < 12) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不能精选'); } //获取坑位信息 $bucketInfo = Bll_Choice_EsfBlockBidBucket::get_bucket_info($houseInfo->areaCode, $cityId, $housePrice); //获取坑位信息 if (empty($bucketInfo)) { Bll_Choice_EsfBlockBidBucket::init_bucket_info($houseInfo->areaCode, $cityId, $housePrice); $bucketInfo = Bll_Choice_EsfBlockBidBucket::get_bucket_info($houseInfo->areaCode, $cityId, $housePrice); } if ($bucketInfo['usedNum'] < $bucketInfo['maxOnlineNum']) { $pageAttribute['hidden']['show'] = 1; } $pageAttribute['bucket_total'] = $bucketInfo['totalNum']; $pageAttribute['bucket_used'] = $bucketInfo['usedNum']; $pageAttribute['bucket_used_num'] = $bucketInfo['usedNum']; $pageAttribute['bucket_total_num'] = $bucketInfo['totalNum']; $pageAttribute['bucket_max_online_num'] = $bucketInfo['maxOnlineNum']; $priceInfo = Model_House_EsfPrice::get_price_by_id($bucketInfo['priceId']); $pageAttribute['price_title'] = sprintf("%d-%d万", intval($priceInfo['minPrice'] / 10000), intval($priceInfo['maxPrice'] / 10000)); //价格 $clickPrice = Bll_Service_BlockChoice::ajkBlockClickPrice(array('brokerId' => $brokerId, 'cityId' => $cityId, 'price' => $housePrice, 'blockId' => $block['typeId'])); if ($clickPrice['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } if ($clickPrice['realTradeAmount'] != $clickPrice['shouldTradeAmount']) { $pageAttribute['favorable'] = true; $pageAttribute['price'] = round($clickPrice['realTradeAmount'] / 100, 2); $pageAttribute['origin_price'] = round($clickPrice['shouldTradeAmount'] / 100, 2); $pageAttribute['favorable_end_time'] = date('Y-m-d', strtotime($clickPrice['rebateEndTime'])); } else { $pageAttribute['favorable'] = false; $pageAttribute['price'] = round($clickPrice['realTradeAmount'] / 100, 2); } // $clickAndBudget = Bll_Choice_EsfBlockBidBucket::getBucketAverageClickBudget($houseInfo->areaCode, $cityId, $housePrice); //获取坑位的平均点击的预算 // if (!empty($clickAndBudget)) { // $pageAttribute['averageClick'] = $clickAndBudget['averageClick']; // $pageAttribute['averageBudget'] = $clickAndBudget['averageBudget'] / 100; // } /**重组区域精选url**/ $bidPlanList = Bll_Plan_Bid_AjkPlan::getBrokerValidPlanListByhouseId($houseId, $brokerId, $cityId, true); $bidPlanList = $bidPlanList[0]; if (isset($bidPlanList)) { $blockInfo['bidStatus'] = $bidPlanList['status']; if ($bidPlanList['status'] == 1) { $bidUrl = '/ajkbroker/user/choice/manage/ajk/#' . $houseId; } elseif ($bidPlanList['status'] == 11) { $bidUrl = '/ajkbroker/user/choice/manage/ajk/#' . $houseId; } else { if ($bidPlanList['status'] != 2) { $bidUrl = "/ajkbroker/user/choice/set/ajk/" . $houseInfo['proId'] . '/?act=1&rebid=1&plan_id=' . $bidPlanList['id']; } } } else { $bidUrl = "/ajkbroker/user/choice/set/ajk/" . $houseInfo['proId']; } $pageAttribute['bidUrl'] = $bidUrl; return $pageAttribute; }