Example #1
0
 /**
  * 二手房精选推广设置页面
  *
  * @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('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_Choice::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'];
     /** 获取点击单价 最低预算不能小于点击单价 */
     try {
         /**
          * @var Bll_Service_Client_HttpResponse $clickPrice
          */
         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 (!$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_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 {
             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_EsfBidBucket::increment_used_num($houseInfo->commId, $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_EsfBidBucket::increment_used_num($houseInfo->commId, $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::COMM_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;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", $houseId, $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, $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_Choice::getEsfOnQueueNum($planId, $houseInfo->commId, $minPrice, $maxPrice);
         return array('err_no' => self::BID_WAIT_SUCCESS, 'rank' => $rank);
     }
 }
 /**
  * 获取房源精选概况
  *
  * @param $brokerId
  * @param array $houseId
  */
 public function getPropChoiceSummary($brokerId, $houseId)
 {
     //初始化返回数组
     $data = array('totalClicks' => 0, 'balance' => 0, 'balanceUnit' => '元', 'todayClicks' => 0, 'todayConsume' => 0, 'todayConsumeUnit' => '元', 'clickPrice' => 0, 'clickPriceUnit' => '元', 'maxBucketNum' => 0, 'usedBucketNum' => 0, 'bucketId' => '', 'status' => self::PROP_ACTIONTYPE_CHOICE_NOTFIT, 'statusMsg' => self::PROP_ACTIONTYPE_CHOICE_NOTFIT_MSG, 'remindStatus' => -1, 'remindStatusMsg' => '不符合精选订阅条件', 'minChoicePrice' => Bll_Plan_Bid_Choice::ESF_CHOICE_MIN_BUDGET, 'minChoicePriceUnit' => '元', 'maxChoicePrice' => Bll_Plan_Bid_Choice::ESF_CHOICE_MAX_BUDGET, 'maxChoicePriceUnit' => '元');
     try {
         //获取经纪人基本信息
         $brokerBaseInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId);
         if (empty($brokerBaseInfo)) {
             $this->error(self::EMPTY_BROKER_ERROR, self::EMPTY_BROKER_ERROR_MSG);
         }
         $cityId = $brokerBaseInfo->cityId;
         //判断经纪人城市是否开通精选
         if (!$this->checkChoiceOpen($brokerBaseInfo->cityId)) {
             $this->error(self::CHOICE_CLOSE_ERROR, self::CHOICE_CLOSE_ERROR_MSG);
         }
         //根据房源id获取精选计划信息
         $choicePlanInfo = Model_Plan_EsfAjkPropSpread::getChoicePlanInfoByHouseid($houseId);
         if ($choicePlanInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE || $choicePlanInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) {
             $data['balance'] = $choicePlanInfo->balance / 100;
             $data['clickPrice'] = $choicePlanInfo->offer / 100;
             if ($choicePlanInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE) {
                 $data['status'] = self::PROP_ACTIONTYPE_CHOIED_ONLINE;
                 $data['statusMsg'] = self::PROP_ACTIONTYPE_CHOIED_ONLINE_MSG;
             } elseif ($choicePlanInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) {
                 $rankNum = Bll_Plan_Bid_Choice::getEsfOnQueueNum($choicePlanInfo->id, $choicePlanInfo->commId, $choicePlanInfo->smallprice, $choicePlanInfo->bigprice);
                 $data['status'] = self::PROP_ACTIONTYPE_CHOIED_ONQUEUE;
                 $data['statusMsg'] = sprintf(self::PROP_ACTIONTYPE_CHOIED_ONQUEUE_MSG, $rankNum);
             }
             //获取所有点击和话费相关信息
             $clickAndCostInfo = Model_Plan_HpProStatsDay::getPropClickAndCost($houseId, $cityId);
             if ($clickAndCostInfo->datei == date('Ymd')) {
                 $data['todayClicks'] += $clickAndCostInfo->cnum;
                 $data['todayConsume'] += $clickAndCostInfo->amount / 100;
             }
             $data['totalClicks'] += $clickAndCostInfo->cnum;
         } else {
             //获取房源信息
             $houseInfo = Bll_House_EsfHouse::getHouseBaseInfo($houseId, $cityId);
             if (empty($houseInfo)) {
                 $this->error(self::PROP_NOT_EXIST_ERROR, self::PROP_NOT_EXIST_ERROR_MSG);
             }
             $houseInfo = $houseInfo[0];
             //房源是否可以精选验证
             if ($houseInfo->isVisible != 1) {
                 //违规验证
                 return $data;
             }
             if ($houseInfo->isHighQulity == 0) {
                 //多图验证
                 return $data;
             }
             if (date('Ymd', strtotime('-16 days')) > date('Ymd', $houseInfo->postDate)) {
                 //发布时间验证
                 return $data;
             }
             $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'];
             //查询坑情况
             $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);
                 }
             }
             $data['bucketId'] = $bucketInfo['id'];
             $data['maxBucketNum'] = $bucketInfo['totalNum'];
             $data['usedBucketNum'] = $bucketInfo['usedNum'];
             $data['maxOnlineNum'] = $bucketInfo['maxOnlineNum'];
             if ($data['usedBucketNum'] < $data['maxOnlineNum']) {
                 $data['status'] = self::PROP_ACTIONTYPE_CHOICE_FIT_ONLINE;
                 $data['statusMsg'] = self::PROP_ACTIONTYPE_CHOICE_FIT_ONLINE_MSG;
             } elseif ($data['usedBucketNum'] < $data['maxBucketNum']) {
                 $data['status'] = self::PROP_ACTIONTYPE_CHOICE_FIT_ONQUEUE;
                 $data['statusMsg'] = self::PROP_ACTIONTYPE_CHOICE_FIT_ONQUEUE_MSG;
             } else {
                 $data['status'] = self::PROP_ACTIONTYPE_CHOICE_BUCKET_FULL;
                 $data['statusMsg'] = self::PROP_ACTIONTYPE_CHOICE_BUCKET_FULL_MSG;
                 $subscriptionInfo = Model_Choice_Subscription::selectData(array(Model_Choice_Subscription::SITE => Model_Choice_Subscription::SITE_AJK, Model_Choice_Subscription::BROKER_ID => $brokerId, Model_Choice_Subscription::PROP_ID => $houseId, Model_Choice_Subscription::BUCKET_ID => $data['bucketId'], Model_Choice_Subscription::STATUS => Model_Choice_Subscription::SUBSCRIPTION_START), array(), 'get_row');
                 if (empty($subscriptionInfo)) {
                     $data['remindStatus'] = self::PROP_ACTIONTYPE_CHOICE_SUBSCRIPTION_NO;
                     $data['remindStatusMsg'] = self::PROP_ACTIONTYPE_CHOICE_SUBSCRIPTION_NO_MSG;
                 } else {
                     $data['remindStatus'] = self::PROP_ACTIONTYPE_CHOICE_SUBSCRIPTION_YES;
                     $data['remindStatusMsg'] = self::PROP_ACTIONTYPE_CHOICE_SUBSCRIPTION_YES_MSG;
                 }
                 return $data;
             }
             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);
             }
             $data['clickPrice'] = round($clickPrice['realTradeAmount'] / 100, 2);
         }
         return $data;
     } catch (Exception $e) {
         if ($e instanceof Exception_BllErrorException) {
             $this->errorCode = $e->getCode();
         } else {
             $this->errorCode = self::UNKNOW_ERROR;
         }
         $this->errorMsg = $e->getMessage();
         return false;
     }
 }