/** * 二手房精选推广设置页面 * * @param $brokerId * @param $cityId * @param $houseId * @param $userId * @param array $params * @return array */ public static function esf_setting_post($brokerId, $cityId, $houseId, $userId, $params = array()) { $result = 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])) { $min_budget = $choiceSet[$brokerCompanyId]['ajk']['ESF_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet[$brokerCompanyId]['ajk']['ESF_CHOICE_MAX_BUDGET']; } else { $min_budget = $choiceSet['default']['ajk']['ESF_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet['default']['ajk']['ESF_CHOICE_MAX_BUDGET']; } //判断预算的合法性 if ($params['budget'] < $min_budget || $params['budget'] > $max_budget) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '预算价格范围非法'); } //获取房源信息 $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天内发布的房源'); } 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 (!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['rebid'])) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源已经精选'); } /** 防并发 */ if (false === self::rejectSameRequest(Bll_Plan_Bid_BlockChoice::SITE_AJK, $brokerId, $houseId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-906)'); } //重新推广,判断结算状态 if (isset($params['act']) && isset($params['rebid'])) { //获取计划信息 if (!isset($planInfo)) { $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' => '房源已经精选'); } if ($planInfo->tradestatus != Model_Plan_EsfAjkPropSpread::COMPLETETTRADESTATU) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源还未结算完成'); } } $housePrice = intval($houseInfo->proPrice * 10000); $priceIntervalInfo = Model_House_EsfPrice::get_price($cityId, $housePrice); if (empty($priceIntervalInfo)) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '房源价格未知'); } $priceId = $priceIntervalInfo['id']; $minPrice = $priceIntervalInfo['minPrice']; $maxPrice = $priceIntervalInfo['maxPrice']; $block = Bll_Commtype_Api::getInfoByTypeCode($houseInfo->areaCode); /** 获取点击单价 最低预算不能小于点击单价 */ try { /** * @var Bll_Service_Client_HttpResponse $clickPrice */ for ($i = 0; $i < 3; $i++) { $clickPrice = Bll_Service_BlockChoice::ajkBlockClickPrice(array('brokerId' => $brokerId, 'cityId' => $cityId, 'price' => $housePrice, 'blockId' => $block['typeId'])); if ($clickPrice->isSucceeded()) { break; } } if (!$clickPrice->isSucceeded() || $clickPrice['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } if ($params['budget'] * 100 < $clickPrice['realTradeAmount']) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '推广预算不能小于点击单价'); } if (isset($params['fromApi']) && $params['fromApi']) { /** 来自API 的精选创建计划 */ $params['price'] = $clickPrice['realTradeAmount'] / 100; } else { /** 点击单价不能小于当前系统内的单价 防止恶意操作 */ 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: -' . __LINE__ . ')'); } //查询坑情况 $bucketInfo = Model_Choice_EsfBlockBidBucket::get_bucket_info($houseInfo->areaCode, $priceId); if (empty($bucketInfo)) { if (Model_Choice_EsfBlockBidBucket::init_bucket_info($houseInfo->areaCode, $priceId, $cityId)) { $bucketInfo = array('typeCode' => $houseInfo->areaCode, 'priceId' => $priceId, 'totalNum' => Model_Choice_EsfBidBucket::TOTALNUM, 'usedNum' => 0, 'maxOnlineNum' => Model_Choice_EsfBidBucket::MAXONLINENUM); } else { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } } //坑位表维护 if ($params['show'] == 1) { //预判断坑位 if ($bucketInfo['usedNum'] >= $bucketInfo['maxOnlineNum']) { return array('err_no' => self::BID_SHOW_FAIL, 'err_msg' => '推广位置已满,请重新推广!'); } //按照最大在线数目更新坑位表 if (!Model_Choice_EsfBlockBidBucket::increment_used_num($houseInfo->areaCode, $priceId, 1)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } } else { //预判断坑位 if ($bucketInfo['usedNum'] >= $bucketInfo['totalNum']) { return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '排队位置已满,请重新推广!'); } //按照最大坑位数目更新 if (!Model_Choice_EsfBlockBidBucket::increment_used_num($houseInfo->areaCode, $priceId, 0)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } } //获取reuqestid $year = date('Y'); $bll = new Bll_Plan_BidFreezeOrderNum($year); $requestId = $bll->getRequestId(Bll_Plan_BidFreezeOrderNum::ESF, $userId, $year, 0, $houseId); //冻结金额 $amount = $params['budget'] * 100; $note = sprintf("二手房精选房源冻结,propId: %d", $houseId); if (($freezeResult = self::bid_freeze($brokerId, $amount, $requestId, $note, Const_PaymentApp::AJK_CHOICE)) === false) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } if (!$freezeResult->isSucceeded()) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } if ($freezeResult['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '冻结失败!'); } $snNum = $freezeResult['data']['sn']; //重新推广,将原来的推广计划置为删除状态 if (isset($params['act']) && $params['rebid']) { $planInfo->status = Model_Plan_EsfAjkPropSpread::DELETE; if (!$planInfo->save()) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } } //新建计划 $time = time(); $offer = $params['price'] * 100; $stopTime = $time + self::ESF_AUTO_STOP_TIME; $endTime = time() + Model_Plan_EsfAjkPropSpread::CHOICELASTINGTIME; $arrAddInfo['serialnumber'] = $snNum; $arrAddInfo['propId'] = $houseId; $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; $arrAddInfo['model'] = Model_Plan_EsfAjkPropSpread::BLOCK_CHOICE; //排名系数,请直接绕过 +_+ $hpratioABll = new Bll_Plan_Bid_EsfHpratioA(); $arrAddInfo['qulityScore'] = $hpratioABll->getHouseMass($houseId, $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($houseId, $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) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } //新精选队列插入记录 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(), $houseId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } //插入自动停止队列 $stopType = Model_Plan_EsfAjkPropspreadQueue::AUTOSTOP; Model_Plan_EsfAjkPropspreadQueue::insertOne($planId, $stopTime, $stopType); //记录log表 $remark = sprintf("PROP_ID:null=>%d;CITY_ID:null=>%d;AREA_CODE: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", $houseId, $cityId, $houseInfo->areaCode, $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, $snNum, $planId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '服务器繁忙,请重试(code: -' . __LINE__ . ')'); } if ($params['show'] == 1) { return array('err_no' => self::BID_SHOW_SUCCESS); } else { $rank = Bll_Plan_Bid_BlockChoice::getEsfOnQueueNum($planId, $houseInfo->areaCode, $minPrice, $maxPrice); return array('err_no' => self::BID_WAIT_SUCCESS, 'rank' => $rank); } }
/** * @param $ajkPropSpread * @param int $doBucket 0-不处理,1-坑位数加一,-1-坑位数减一 * @return bool * 精选计算排名 */ public function choiceComputeRank($ajkPropSpread, $doBucket = 0) { //查询价格段id $priceInfo = Model_House_EsfPrice::get_price($ajkPropSpread['cityId'], $ajkPropSpread['proPriceInt']); if (empty($priceInfo)) { $this->setMsg('未知的价格段;cityId:' . $ajkPropSpread['cityId'] . ';proPriceInt:' . $ajkPropSpread['proPriceInt']); return false; } //获取坑位表信息 $BucketInfo = Model_Choice_EsfBlockBidBucket::get_bucket_info($ajkPropSpread['areacode'], $priceInfo['id']); if (empty($BucketInfo)) { $this->setMsg('未知的坑位表信息;'); return false; } //更新坑的位数 if ($doBucket == 1) { //坑位剩余数加一 if (false == Model_Choice_EsfBlockBidBucket::decrement_used_num($ajkPropSpread['areacode'], $priceInfo['id'])) { $this->setMsg('坑位剩余数加一失败;'); return false; } } elseif ($doBucket == -1) { //坑位剩余数减一 if (Model_Choice_EsfBlockBidBucket::increment_used_num($ajkPropSpread['areacode'], $priceInfo['id']) == false) { $this->setMsg('坑位剩余数减一失败;'); return false; } } //根据板块typeCode,价格段获取 $ajkPropspreadList = Model_Plan_AjkPropspread::getAjkPropspreadByBlockBucket($ajkPropSpread['areacode'], $ajkPropSpread['smallprice'], $ajkPropSpread['bigprice'], 2); if (empty($ajkPropspreadList)) { $this->setMsg('未获取到同区域板块、价格段的房源。typeCode:' . $ajkPropSpread['areacode'] . ';smallprice:' . $ajkPropSpread['smallprice'] . ';bigprice:' . $ajkPropSpread['bigprice']); return true; } $PropSpread = new DAO_Property_PropSpread(); //遍历坑里面的数据,计算排名 foreach ($ajkPropspreadList as $key => $list) { if ($key < $BucketInfo['maxOnlineNum']) { //预期推广中的数据 if ($list['status'] == 11) { //更新排队中的数据位推广中 Model_Plan_AjkPropspread::setAjkPropspreadById($list['id'], 1); //记录竞价第一次推广的日志 $PropSpread->getFirstSpreadLogDao($list['propId'], 2); if (empty($PropSpread)) { $PropSpread->addFirstSpreadLogDao($list['propId'], 2); } //通知solr队列 $this->choiceUpDownSendSolr(array('city_id' => $list['cityId'], 'broker_id' => $list['brokerId'], 'pro_id' => $list['propId'], 'flag' => 1, 'hpratio' => $list['offer'], 'comms_hpratio_a' => $list['commsHpratioA'], 'comms_hpratio' => $list['commsHpratio'], 'hpstarttime' => $list['spreadstartdate'], 'hpendtime' => $list['spreadenddate'], 'hpplanid' => $list['id'], 'update_time' => time(), 'from_type' => 151)); //记录房源日志 Model_Log_HouseLogNew::create(array('houseId' => $list['propId'], 'planId' => $list['id'], 'brokerId' => $list['brokerId'], 'cityId' => $list['cityId'], 'type' => Const_ProLogType::LOG_BLOCK_CHOICE_SPREAD, 'changeType' => '40' . $this->qInfo['actionId'], 'remark' => '计划' . $ajkPropSpread['id'] . $this->actionStr[$this->qInfo['actionId']] . ';重新计算价格段内排名,精选推广', 'operatorId' => $this->qInfo['operationId'], 'siteType' => 1), date('Ymd'))->save(); $this->setMsg('planId:' . $list['id'] . '变更为推广'); } } else { //预期排队的数据 continue; /** * if($list['status'] == 1){ * //更新推广中的数据位为排队中 * Model_Plan_AjkPropspread::setAjkPropspreadById($list['id'],11); * //通知solr队列 * $this->choiceUpDownSendSolr(array( * 'city_id'=>$list['cityId'],//城市ID * 'broker_id'=>$list['brokerId'],//经纪人ID * 'pro_id'=>$list['propId'],//房源ID * 'flag'=>2,//操作类型 * 'hpratio'=>$list['offer'],//好盘系数 * 'comms_hpratio_a'=>$list['commsHpratioA'],//小区好盘系数a * 'comms_hpratio'=>$list['commsHpratio'],//小区好盘系数 * 'hpstarttime'=>$list['spreadstartdate'],//开始展示时间 * 'hpendtime'=>$list['spreadenddate'],//结束展示时间 * 'hpplanid'=>$list['id'],//推广计划ID * 'update_time'=>time(),//更新时间 * 'from_type'=>152,//标记类型 * )); * //记录房源日志 * Model_Log_HouseLogNew::create(array( * 'houseId' => $list['propId'], * 'planId' => $list['id'], * 'brokerId' => $list['brokerId'], * 'cityId' => $list['cityId'], * 'type' => 15,//13-精选排队中,14-精选推广,15-取消精选推广,16-取消精选排队 * 'changeType' => '40'.$this->qInfo['actionId'], * 'remark' => '计划'.$ajkPropSpread['id'].$this->actionStr[$this->qInfo['actionId']].';重新计算价格段内排名,精选排队中', * 'operatorId' => $this->qInfo['operationId'], * 'siteType' => 1, * ),date('Ymd'))->save(); * * $this->setMsg('planId:'.$list['id'].'变更为排队中'); * } */ } } return true; }