public function handle_request_internal() { $brokerId = $this->_params['brokerId']; //检查经纪人是否存在 $brokerInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); if (!$brokerInfo) { throw new Exception_Broker_NotFound('BrokerId: ' . $brokerId); } // 判断城市是否开通竞价业务 $cityId = $brokerInfo->cityId; if (!Bll_City::isBidCity($cityId)) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('todayClicks' => 0, 'todayConsume' => 0, 'todayConsumeUnit' => '元', 'totalProps' => 0)); } $data = array('todayClicks' => 0, 'todayConsume' => 0, 'todayConsumeUnit' => '元'); $datei = date('Ymd'); //获取经纪人竞价推广某天的点击和花费信息 $allClickAndCostInfo = Model_Plan_HpProStatsDay::getBrokerClickAndCostDay($brokerId, $cityId, $datei); foreach ($allClickAndCostInfo as $row) { $data['todayClicks'] += $row->cnum; $data['todayConsume'] += $row->amount / 100; } $data['todayConsume'] = Util_Formatter::formatTodayConsume($data['todayConsume']); //获取计划数 $data['totalProps'] = Model_Plan_EsfAjkPropSpread::getPlanCountByBroker($brokerId, Model_Plan_EsfAjkPropSpread::DEFAULTVERSION); return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => $data); }
/** * 获取二手房 精选状态发生变更的房源 * * @param int $startTime * @param int $endTime * @param int $startId * @return array */ private function getHouseSpreadStateChangeResultAjk($startTime, $endTime, $startId) { $result = array('spread_house' => array(), 'not_spread_house' => array(), 'last_id' => 0); try { $dataAccess = Model_Plan_EsfAjkPropSpread::data_access(''); $dataAccess->filter_by_op('updatedDatetime', '>=', date('Y-m-d H:i:s', $startTime)); $dataAccess->filter_by_op('updatedDatetime', '<=', date('Y-m-d H:i:s', $endTime)); if ($startId > 0) { $dataAccess->filter_by_op('id', '>', $startId); } $dataAccess->load_field(array('id', 'status', 'propId', 'brokerId')); $dataAccess->sort('id', 'asc'); $dataAccess->limit(1000); $stateChangePlanList = $dataAccess->get_all(); } catch (Exception $e) { return $result; } if (empty($stateChangePlanList)) { return $result; } foreach ($stateChangePlanList as $stateChangePlan) { $result['last_id'] = $stateChangePlan['id']; if ($stateChangePlan['status'] == Model_Plan_EsfAjkPropSpread::ONLINE) { $result['spread_house'][] = $stateChangePlan['propId']; } else { $result['not_spread_house'][] = $stateChangePlan['propId']; } } return $result; }
/** * 获取二手房房源的推广状态 * * @param int|array $houseId * @return array */ private function getHouseSpreadStateAjk($houseId) { $result = array('spread_house' => array(), 'not_spread_house' => array()); try { $dataAccess = Model_Plan_EsfAjkPropSpread::data_access(); $dataAccess->filter('propId', $houseId); $dataAccess->filter_by_op('status', '<>', Model_Plan_EsfAjkPropSpread::DELETE); $dataAccess->filter_by_op('tradetype', '=', Model_Plan_EsfAjkPropSpread::SALE_TYPE); $planList = $dataAccess->get_all(); } catch (Exception $e) { return $result; } if (empty($planList)) { $result['not_spread_house'] = is_array($houseId) ? $houseId : array($houseId); return $result; } foreach ($planList as $planInfo) { if ($planInfo['status'] == Model_Plan_EsfAjkPropSpread::ONLINE) { $result['spread_house'][] = $planInfo['propId']; } } if (is_array($houseId)) { $result['not_spread_house'] = array_values(array_diff($houseId, $result['spread_house'])); } elseif (empty($result['spread_house'])) { $result['not_spread_house'][] = $houseId; } return $result; }
/** * 上下架队列,二手房价格段变写房源日志 * * @param array $queue * @return array */ public static function upDownDeal($queue) { $priceInterval = json_decode($queue['remark'], true); if (!is_array($priceInterval) || empty($priceInterval)) { return array('status' => 0, 'msg' => 'remark解析JSON错误'); } if (!isset($priceInterval['id'])) { return array('status' => 0, 'msg' => '没有获取到价格段Id'); } $priceId = intval($priceInterval['id']); $priceIntervalInfo = Model_House_EsfPrice::get_price_by_id($priceId); if (empty($priceIntervalInfo)) { return array('status' => 0, 'msg' => '没有获取到价格段信息[' . $priceId . ']'); } $choicePlanList = Model_Plan_EsfAjkPropSpread::getChoicePlanByPrice($priceIntervalInfo['cityId'], $priceIntervalInfo['minPrice'], $priceIntervalInfo['maxPrice']); if (empty($choicePlanList)) { return array('status' => 1, 'msg' => sprintf('没有获取到推广、排队的精选计划[%d - %d -%d]', $priceIntervalInfo['cityId'], $priceIntervalInfo['minPrice'], $priceIntervalInfo['maxPrice'])); } $dealMark = array(); $remark = sprintf('价格段变更[queue_id: %d]', $queue['id']); foreach ($choicePlanList as $choicePlan) { $houseLog = static::buildHouseLog($choicePlan['propId'], $choicePlan['brokerId'], $choicePlan['cityId'], Const_ProPlanChangeType::PRICE_INTERVAL_CHANGE, Const_ProLogType::LOG_PRICE_INTERVAL_CHANGE, $remark); if (!Model_Log_HouseLogNew::create($houseLog, date('Ymd'))->save()) { $dealMark[] = sprintf('精选[%d]房源[%d]价格段变更写房源日志失败', $choicePlan['id'], $choicePlan['propId']); } else { $dealMark[] = sprintf('精选[%d]房源[%d]价格段变更写房源日志成功', $choicePlan['id'], $choicePlan['propId']); } } return array('status' => 1, 'msg' => sprintf('价格段变更房源日志写入完成,%s', implode(',', $dealMark))); }
public static function createEsfOrder($planId) { $planInfo = Model_Plan_EsfAjkPropSpread::getPlanInfoByIdEx($planId); if (empty($planInfo)) { throw new Exception(sprintf('二手房竞价计划[%d]不存在', $planId)); } $data = array('requestId' => static::getRequestId($planId), 'status' => 0, 'userId' => $planInfo['userId'], 'siteType' => 1, 'failNum' => 0, 'addTime' => time(), 'addDate' => date('Ymd'), 'updateTime' => date('Ymd H:i:s'), 'remark' => '二手房精选结算', 'proId' => $planInfo['propId'], 'serialNumber' => $planInfo['serialnumber'], 'planId' => $planId, 'amount' => ($planInfo['budget'] - $planInfo['balance']) / 100, 'appName' => Const_PaymentApp::AJK_CHOICE); $order = Model_Payment_ABidUnfreeze::create($data, date('Y')); $order->save(); return new Bll_Ppc_BidUnfreeze($order->id); }
public function handle_request() { $zeroOfferPlanList = Model_Plan_EsfAjkPropSpread::scanPlan0Offer($this->_startId, self::BATCH_LIMIT); if (empty($zeroOfferPlanList)) { $this->logMsg(sprintf('startId: %d 没有获取到计划。', $this->_startId)); file_put_contents($this->_doneFile, 'DONE'); } foreach ($zeroOfferPlanList as $planInfo) { $cityId = $planInfo['cityId']; $houseId = $planInfo['propId']; $planId = $planInfo['id']; $brokerId = $planInfo['brokerId']; $houseInfo = Bll_House_EsfHouse::getHouseBaseInfoEx($houseId, $planInfo['cityId']); if (empty($houseInfo)) { $this->logMsg(sprintf('经纪人[%d] 城市[%d] 房源[%d]没有找到,计划[%d]', $brokerId, $cityId, $houseId, $planId)); continue; } $housePrice = $houseInfo['proPrice'] * 10000; /** * 获取小区价格段出价 */ $clickPrice = Bll_Service_Choice::ajkClickPrice(array('brokerId' => $planInfo['brokerId'], 'cityId' => $cityId, 'price' => $housePrice, 'commId' => $houseInfo['commId'])); if ($clickPrice['status'] == 'error') { $this->logMsg(sprintf('经纪人[%d] 城市[%d] 房源[%d] 计划[%d] 小区[%d] 价格[%d] 获取点击价格失败', $brokerId, $cityId, $houseId, $planId, $houseInfo['commId'], $housePrice)); continue; } if ($clickPrice['realTradeAmount'] != $clickPrice['shouldTradeAmount']) { $offer = $clickPrice['realTradeAmount']; } else { $offer = $clickPrice['realTradeAmount']; } file_put_contents($this->_doneFile, 'DONE'); $this->logMsg(sprintf('经纪人[%d] 城市[%d] 房源[%d] 计划[%d] 小区[%d] 价格[%d] 出价[%d]', $brokerId, $cityId, $houseId, $planId, $houseInfo['commId'], $housePrice, $offer)); continue; if (!Model_Plan_EsfAjkPropSpread::updateOffer($planId, $offer)) { $this->logMsg(sprintf('经纪人[%d] 城市[%d] 房源[%d] 计划[%d] 小区[%d] 价格[%d] 更新出价失败', $brokerId, $cityId, $houseId, $planId, $houseInfo['commId'], $housePrice)); continue; } $this->logMsg(sprintf('经纪人[%d] 城市[%d] 房源[%d] 计划[%d] 小区[%d] 价格[%d] 更新出价成功', $brokerId, $cityId, $houseId, $planId, $houseInfo['commId'], $housePrice)); } if (count($zeroOfferPlanList) < self::BATCH_LIMIT) { file_put_contents($this->_doneFile, 'DONE'); } }
public function dealTask($task) { $currentUsedNum = $task['usedNum']; //获取价格信息 $priceIntervalInfo = Model_House_EsfPrice::data_access()->filter('id', $task['priceId'])->find_only(); if (empty($priceIntervalInfo)) { printf("价格段priceId:" . $task['priceId'] . "获取失败" . PHP_EOL); return false; } //获取实际计划数目 $trueUsedNum = Model_Plan_EsfAjkPropSpread::data_access()->filter("areacode", $task['typeCode'])->filter("smallprice", $priceIntervalInfo->minPrice)->filter("bigprice", $priceIntervalInfo->maxPrice)->filter("bidVersion", Model_Plan_EsfAjkPropSpread::CHOICEVERSION)->filter("model", Model_Plan_EsfAjkPropSpread::BLOCK_CHOICE)->filter_by_op('status', 'in', array(Model_Plan_EsfAjkPropSpread::ONLINE, Model_Plan_EsfAjkPropSpread::ONQUEUE))->count(); printf('正在处理 队列id %s, areaCode %s, priceId %s 结果是: userNum: %s, 实际: %s, 状态:%s' . PHP_EOL, $task['id'], $task['typeCode'], $task['priceId'], $currentUsedNum, $trueUsedNum, $currentUsedNum == $trueUsedNum ? 'success' : 'error'); if ($currentUsedNum == $trueUsedNum) { return true; } $result = Model_Choice_EsfBlockBidBucket::updateUsedNum($task['id'], $trueUsedNum, $task['usedNum']); printf('更新usedNum结果: %s' . PHP_EOL, $result ? '更新成功' : '更新失败'); return true; }
/** * 获取经纪人精选推广的房源Id * * @param int $brokerId * @return array */ private function getBrokerHouseSpreadStateResultAjk($brokerId) { $result = array('spread_house' => array(), 'not_spread_house' => array()); try { $dataAccess = Model_Plan_EsfAjkPropSpread::data_access(''); $dataAccess->filter('brokerId', $brokerId); $dataAccess->filter('status', Model_Plan_EsfAjkPropSpread::ONLINE); $dataAccess->load_field(array('id', 'status', 'propId', 'brokerId')); $choicePlanList = $dataAccess->get_all(); } catch (Exception $e) { return $result; } if (empty($choicePlanList)) { return $result; } foreach ($choicePlanList as $planInfo) { $result['spread_house'][] = $planInfo['propId']; } return $result; }
/** * @param $spreadId * @param int $commId * @param int $smallPrice * @param int $bigPrice * @return int|string */ public function getPpcSaleRankBll($propId = 0, $commId = 0, $smallPrice = 0, $bigPrice = 0, $hpratio = 0, $limit = 10) { $rstRank = Model_Plan_EsfAjkPropSpread::getPpcSaleRankDao($commId, $smallPrice, $bigPrice, $hpratio, $limit); $rank = 0; if (isset($rstRank) && !empty($rstRank)) { foreach ($rstRank as $key => $val) { $rank = $key + 1; if ($val->propId == $propId) { return $rank; } } $total = count($rstRank); if ($total > $limit) { return $limit + 1; //10名以外的 } else { return $total + 1; } } else { return 1; } }
/** * 精选计划停止推广 */ public function do_stop() { $planInfo = Model_Plan_EsfAjkPropSpread::getPlanInfoByIdEx($this->params['planId']); if (empty($planInfo)) { $this->outPut(0, '没有获取到计划信息'); } if ($this->params['brokerId'] != $planInfo['brokerId']) { $this->outPut(0, '没有获取到计划信息(code:-2)'); } if (Model_Plan_EsfAjkPropSpread::ONQUEUE == $planInfo['status']) { $result = Bll_Plan_Bid_EsfWebChoiceOperation::stop_queue($this->params['planId'], $planInfo['brokerId']); } elseif (Model_Plan_EsfAjkPropSpread::ONLINE == $planInfo['status']) { $result = Bll_Plan_Bid_EsfWebChoiceOperation::stop_plan($this->params['planId'], $planInfo['brokerId']); } else { $this->outPut(0, '无效的计划'); return; } if ($result['status'] == 'ok') { $this->outPut(1, '计划取消推广成功'); } $this->outPut(0, '计划取消推广失败'); }
public function run() { //todo 临时编写job,没有利用游标 $nativeSql = sprintf("SELECT prop_id FROM `ajk_propspread` WHERE STATUS != 2 AND bidversion = 2 GROUP BY prop_id HAVING COUNT(*)>1"); $allRecords = Model_Plan_EsfAjkPropSpread::data_access()->native_sql($nativeSql, array(), true); foreach ($allRecords as $row) { $costMoney = 0; //获取所有计划 $propRecords = Model_Plan_EsfAjkPropSpread::data_access()->filter_by_op('status', '<>', 2)->filter_by_op('bidVersion', '=', 2)->filter_by_op('propId', '=', $row['prop_id'])->find_all(); foreach ($propRecords as $subRow) { if ($subRow->budget != $subRow->balance) { $costMoney++; } } if ($costMoney == 0) { //都没有消费,保留最后一个 foreach ($propRecords as $key => $subRow) { if ($key == count($propRecords) - 1) { $this->addLogger(sprintf("保留计划%d,该计划为最后计划", $subRow->id)); continue; } //塞入自动停止队列 Model_Plan_EsfAjkPropspreadQueue::insertOne($subRow->id, time(), 1); $this->addLogger(sprintf("计划%d塞入自动停止队列", $subRow->id)); } } else { foreach ($propRecords as $key => $subRow) { if ($subRow->budget != $subRow->balance) { $this->addLogger(sprintf("保留计划%d,该计划有消费", $subRow->id)); } else { //塞入自动停止队列 Model_Plan_EsfAjkPropspreadQueue::insertOne($subRow->id, time(), 1); $this->addLogger(sprintf("计划%d塞入自动停止队列", $subRow->id)); } } } } }
/** * 获取房源精选排名 * * @param int $brokerId * @param array $houseIds * @return array */ public static function getHouseQueueLocation($brokerId, $houseIds) { $result = array_fill_keys($houseIds, 1); $brokerChoicePlanList = Model_Plan_EsfAjkPropSpread::getBrokerChoicePlanInfoByHouseId($brokerId, $houseIds); $_cache = array(); foreach ($brokerChoicePlanList as $choicePlan) { if ($choicePlan['status'] != Model_Plan_EsfAjkPropSpread::ONQUEUE) { continue; } if ($choicePlan['model'] == Model_Plan_EsfAjkPropSpread::BLOCK_CHOICE) { /** 获取坑位中的计划信息 */ $cacheKey = sprintf('%s_%d_%d_%d', 'block', $choicePlan['areacode'], $choicePlan['smallprice'], $choicePlan['bigprice']); if (!isset($_cache[$cacheKey])) { $_cache[$cacheKey] = Model_Plan_EsfAjkPropSpread::getPropQueueSpreadByBlockBucket($choicePlan['areacode'], $choicePlan['smallprice'], $choicePlan['bigprice']); } } else { /** 获取坑位中的计划信息 */ $cacheKey = sprintf('%d_%d_%d', $choicePlan['commId'], $choicePlan['smallprice'], $choicePlan['bigprice']); if (!isset($_cache[$cacheKey])) { $_cache[$cacheKey] = Model_Plan_EsfAjkPropSpread::getPropQueueSpreadByBucket($choicePlan['commId'], $choicePlan['smallprice'], $choicePlan['bigprice']); } } $bucketQueueList = $_cache[$cacheKey]; if (empty($bucketQueueList)) { continue; } /** 精选计划的排名 */ foreach ($bucketQueueList as $index => $planInfo) { $result[$choicePlan['propId']] = $index + 1; if ($planInfo['propId'] == $choicePlan['propId']) { break; } } } return $result; }
/** * 获取经纪人的竞价概况 */ public function getBrokerBidSummary($brokerId) { try { $data = array('todayClicks' => 0, 'todayConsume' => 0, 'todayConsumeUnit' => '元', 'totalProps' => 0); //竞价今日点击 话费 if (($clickAndCostInfo = $this->getBrokerClickAndCostDay($brokerId, date('Ymd'))) === false) { $this->error($this->errorCode, $this->errorMsg); } foreach ($clickAndCostInfo as $key => $row) { $data[$key] = $row; } //获取计划数 $data['totalProps'] = Model_Plan_EsfAjkPropSpread::getPlanCountByBroker($brokerId, Model_Plan_EsfAjkPropSpread::DEFAULTVERSION); return $data; } catch (Exception $e) { if ($e instanceof Exception_BllErrorException) { $this->errorCode = $e->getCode(); } else { $this->errorCode = bll_choice_EsfAPPAPIChoice::UNKNOW_ERROR; } $this->errorMsg = $e->getMessage(); return false; } }
/** * * 获取经纪人的竞价房源数 * * @param $brokerId * @param $cityId * @param $siteType * @return int */ public static function getBrokerBidNum($brokerId, $cityId, $siteType) { $num = 0; switch ($siteType) { case 'ajk': $bidList = Model_Plan_EsfAjkPropSpread::getValidPlan($brokerId, $cityId, true); foreach ($bidList as $bid) { if ($bid['status'] == 1) { $num += 1; } } break; case 'hz': $brokerMapping = Bll_Broker_MainBusiness::getDataByEsfId($brokerId); //根据 $bidList = Model_Plan_HzPlanBasic::get_online_bid_plan_ex($brokerId, 2); $num = count($bidList); break; case 'jp': $brokerMapping = Bll_Broker_MainBusiness::getDataByEsfId($brokerId); //根据经纪人查询商铺相应 $bidList = Model_Plan_Jp::getPlanByMemberId($brokerMapping['jpBrokerid'], 2, array(2)); $num = count($bidList); break; default: break; } return $num; }
/** * 金铺-精选房源设置页面 * * @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('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' => '房源已经精选'); } $pageAttribute['title'] = sprintf("%s,%d室%d厅%d卫,%d平,%.2f万", $houseInfo->commName, $houseInfo->roomNum, $houseInfo->hallNum, $houseInfo->toiletNum, intval($houseInfo->areaNum), $houseInfo->proPrice); $pageAttribute['community_name'] = $houseInfo->commName; $housePrice = intval($houseInfo->proPrice * 10000); //获取坑位信息 $bucketInfo = Bll_Choice_EsfBidBucket::get_bucket_info($houseInfo->commId, $cityId, $housePrice); //获取坑位信息 if (empty($bucketInfo)) { Bll_Choice_EsfBidBucket::init_bucket_info($houseInfo->commId, $cityId, $housePrice); $bucketInfo = Bll_Choice_EsfBidBucket::get_bucket_info($houseInfo->commId, $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_Choice::ajkClickPrice(array('brokerId' => $brokerId, 'cityId' => $cityId, 'price' => $housePrice, 'commId' => $houseInfo->commId)); 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_EsfBidBucket::getBucketAverageClickBudget($houseInfo->commId, $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/blockset/ajk/" . $houseInfo['proId'] . '/?act=1&rebid=1&plan_id=' . $bidPlanList['id']; } } } else { $bidUrl = "/ajkbroker/user/choice/blockset/ajk/" . $houseInfo['proId']; } $pageAttribute['bidUrl'] = $bidUrl; return $pageAttribute; }
/** * 获取房源的精选类型 0:未精选;1:小区;2:板块 * @param $propIds * @return array */ public function getChoiceTypeByPropIds($propIds) { if (!is_array($propIds)) { $propIds = array($propIds); } $choiceInfos = Model_Plan_EsfAjkPropSpread::getChoiceByPropIds($propIds); $choiceArray = array(); foreach ($choiceInfos as $v) { $choiceArray[$v['propId']] = $v; } $rs = array(); foreach ($propIds as $propId) { $rs[$propId] = !isset($choiceArray[$propId]) ? 0 : $choiceArray[$propId]['model']; } return $rs; }
/** * 二手房板块精选 * @param $record * @return bool|mixed */ private function noticeBlockChoiceSolrAjkAPI($record) { //41-板块精选推广,42-取消板块精选推广,43-取消板块精选排队 if ($record['type'] == 41) { $flag = 1; } elseif ($record['type'] == 42 || $record['type'] == 43) { $flag = 2; } else { $this->setLog('不需要做solr处理' . __METHOD__); return false; } //根据计划id查询计划信息 $PlanInfo = Model_Plan_EsfAjkPropSpread::getPlanInfoByIdEx($record['planId']); if ($PlanInfo) { $offer = $PlanInfo['offer']; $commsHpratioA = $PlanInfo['commsHpratioA']; $commsHpratio = $PlanInfo['commsHpratio']; $spreadstartdate = $PlanInfo['spreadstartdate']; $spreadenddate = $PlanInfo['spreadenddate']; $planid = $PlanInfo['id']; } else { $offer = 0; $commsHpratioA = 0; $commsHpratio = 0; $spreadstartdate = 0; $spreadenddate = 0; $planid = $record['planId']; } $res = Bll_Combo_NoticeSolrUpDown::noticeBlockChoiceSolrAjkAPI($record['cityId'], $record['brokerId'], $record['houseId'], $flag, $offer, $commsHpratioA, $commsHpratio, $spreadstartdate, $spreadenddate, $planid, Bll_Combo_NoticeSolrUpDown::HLSFromChoiceUpDown, strtotime($record['addDate']), date('Ymd', strtotime($record['addDate'])) . $record['id']); $this->setLog('通知solr res: ' . json_encode($res)); return $res; }
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'] > 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('newList' => array(), 'oldList' => 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('newList' => array(), 'oldList' => 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); //拼接房源列表中房源数据 $newList = array(); $oldList = 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; } } //计算出房源发布天数 $timeFixStr = strtotime(date("Ymd", $row['createTime'])); $leftDay = floor((time() - $timeFixStr) / 86400); if ($leftDay >= 30) { $oldList[] = $row; } else { $newList[] = $row; } } // 排序 usort($oldList, function ($a, $b) { if ($a['createTime'] == $b['createTime']) { return 0; } return $a['createTime'] > $b['createTime'] ? -1 : 1; }); usort($newList, 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('newList' => $newList, 'oldList' => $oldList, 'surplus' => $surplus > 0 ? $surplus : 0, 'hasCombo' => $hasCombo)); }
/** * 获取竞价推广的排名 * * @param $propId * @param $commId * @param $smallPrice * @param $bigPrice * @param $hpratio * @param int $limit * @return int */ public static function getHouseBidRank($propId, $commId, $smallPrice, $bigPrice, $hpratio, $limit = 10) { $bidList = Model_Plan_EsfAjkPropSpread::getSpreadPlanForRank($commId, $smallPrice, $bigPrice, $hpratio, $limit); if (empty($bidList)) { return 1; } $rank = 0; foreach ($bidList as $bid) { $rank++; if ($bid['propId'] == $propId) { return $rank; } } $total = count($bidList); if ($total > $limit) { return $limit + 1; //10名以外的 } return $total + 1; }
/** * 初始化房源精选推广状态 * * @param array $houseIds * @return array */ private function initHouseChoiceState($houseIds) { $houseChoiceStateList = array_fill_keys($houseIds, 0); $choiceHousePlanList = Model_Plan_EsfAjkPropSpread::getChoicePlanInfoByHouseid(array_keys($houseChoiceStateList)); if (!empty($choiceHousePlanList)) { foreach ($choiceHousePlanList as $choiceHousePlan) { $houseId = $choiceHousePlan->propId; if ($choiceHousePlan->status == 1 || $choiceHousePlan->status == 11) { $houseChoiceStateList[$houseId] = -1; } else { $houseChoiceStateList[$houseId] = $choiceHousePlan->id; } } } return $houseChoiceStateList; }
/** * 小区合并修改计划信息 * * @param $queue * @return bool */ public function communityMerge($queue) { if ($queue['planId'] == 0 || $queue['proId'] == 0) { $this->setMsg('房源Id、计划Id不能为空'); return false; } /** 判断计划状态 */ $planInfo = Model_Plan_EsfAjkPropSpread::getPlanInfoByIdEx($queue['planId']); if ($planInfo['tradetype'] != 1 || $planInfo['bidVersion'] != 2) { $this->setMsg(sprintf('计划[%d]信息错误[%d - %d]', $queue['planId'], $planInfo['tradetype'], $planInfo['bidVersion'])); return false; } if ($planInfo['status'] != Model_Plan_EsfAjkPropSpread::ONLINE && $planInfo['status'] != Model_Plan_EsfAjkPropSpread::ONQUEUE) { $this->setMsg(sprintf('计划[%d]不在推广、排队中[%d]', $queue['planId'], $planInfo['status'])); return true; } if ($planInfo['propId'] != $queue['proId']) { $this->setMsg(sprintf('房源Id[%d - %d]不一致', $queue['proId'], $planInfo['propId'])); return true; } $houseInfo = Bll_House_EsfHouse::getHouseBaseInfoEx($queue['proId'], $planInfo['cityId']); if (empty($houseInfo)) { $this->setMsg(sprintf('房源[%d]信息没有获取到', $queue['proId'])); return true; } $housePrice = intval($houseInfo['proPrice'] * 10000); $priceIntervalInfo = Model_House_EsfPrice::get_price($planInfo['cityId'], $housePrice); if (empty($priceIntervalInfo)) { $this->setMsg(sprintf('房源[%d]没有获取到价格段信息[%d]', $queue['proId'], $housePrice)); return true; } $priceId = $priceIntervalInfo['id']; $communityId = $houseInfo['commId']; $data = array('commId' => $communityId); if (!Model_Plan_EsfAjkPropSpread::updatePlan($queue['planId'], $data)) { $this->setMsg(sprintf('更新计划[%d]信息[%s]失败', $queue['planId'], json_encode($data))); return false; } $bucketInfo = Model_Choice_EsfBidBucket::get_bucket_info($communityId, $priceId); if (empty($bucketInfo)) { Model_Choice_EsfBidBucket::init_bucket_info($communityId, $priceId, $planInfo['cityId']); } Model_Choice_EsfBidBucket::increment_used_num_ex($communityId, $priceId); $this->setMsg(sprintf('更新计划[%d]信息[%s]成功', $queue['planId'], json_encode($data))); $planInfo['proPriceInt'] = $planInfo['propriceint']; //todo 添加房源日志 type 小区合并,区域板块变更 Model_Log_HouseLogNew::create(array('houseId' => $queue['propId'], 'planId' => $queue['planId'], 'brokerId' => $queue['brokerId'], 'cityId' => $planInfo['cityId'], 'type' => Const_ProLogType::LOG_COMMUNITY_MERGE_PROP_CHANGE, 'changeType' => Const_ProPlanChangeType::COMM_MERGE_PROP_CHANGE, 'remark' => '小区合并,精选房源信息变更', 'operatorId' => $this->qInfo['operationId'], 'siteType' => 1), date('Ymd'))->save(); return $this->choiceComputeRank(array_merge($planInfo, $data)); }
/** * 二手房小区合并 * * @param array $queueInfo * @return array */ public static function ajkCommunityMerge($queueInfo) { if (!isset($queueInfo) || empty($queueInfo)) { return static::buildReturn(self::PROCESS_STATUS_ERROR, '小区合并,remark的值为空'); } $communityMergeInfo = json_decode($queueInfo['remark'], true); if (!is_array($communityMergeInfo)) { return static::buildReturn(self::PROCESS_STATUS_ERROR, '小区合并,remark的值不是JSON'); } /** 获取推广中的小区的精选计划 */ $choicePlanList = Model_Plan_EsfAjkPropSpread::getSpreadChoicePlanByCommunityId($communityMergeInfo['cityId'], $communityMergeInfo['commId']); if (empty($choicePlanList)) { return static::buildReturn(self::PROCESS_STATUS_SUCCESS, sprintf('小区小区合并,没有获取到小区[%d]的精选计划信息', $communityMergeInfo['commId'])); } $houseLogWriteError = array(); $houseLogWriteSuccess = array(); foreach ($choicePlanList as $choicePlan) { $data = array(); $data['houseId'] = $choicePlan['propId']; $data['planId'] = $choicePlan['id']; $data['brokerId'] = $choicePlan['brokerId']; $data['cityId'] = $queueInfo['city_id']; $data['type'] = Const_ProLogType::LOG_COMMUNITY_MERGE; $data['changeType'] = $queueInfo['type']; $data['remark'] = '小区合并'; $data['addDate'] = date('Y-m-d H:i:s'); $data['operatorId'] = 0; $data['siteType'] = 1; if (!Model_Log_HouseLogNew::create($data, date('Ymd'))->save()) { $houseLogWriteError[] = $choicePlan['propId']; } else { $houseLogWriteSuccess[] = $choicePlan['propId']; } } return static::buildReturn(self::PROCESS_STATUS_SUCCESS, sprintf('小区小区合并,房源日志写入成功[%s],房源日志写入失败[%s]', implode(',', $houseLogWriteSuccess), implode(',', $houseLogWriteError))); }
/** * app 获取竞价列表 */ public static function gitBidProps($broker_id) { //竞价房源列表 $bidPlans = Model_Plan_EsfAjkPropSpread::getOnlinePlanByBroker($broker_id, Model_Plan_EsfAjkPropSpread::DEFAULTVERSION); $bidProps = array(); foreach ($bidPlans as $plan) { $bidProps[$plan->propId] = $plan; } return $bidProps; }
/** * 页面删除推广操作封装 * * @param $planId * @return array */ public static function delete_plan($planId, $brokerId) { $rstArr = array('status' => 'ok'); //获取计划信息 $planInfo = Model_Plan_EsfAjkPropSpread::data_access()->filter('id', $planId)->find_only(); if (empty($planInfo)) { return array('status' => 'fail', 'info' => 'empty plan'); } if ($planInfo->status == Model_Plan_EsfAjkPropSpread::ONLINE) { return array('status' => 'fail', 'info' => '计划正在推广中'); } if ($planInfo->status == Model_Plan_EsfAjkPropSpread::ONQUEUE) { return array('status' => 'fail', 'info' => '计划正在排队中'); } if ($planInfo->tradestatus != Model_Plan_EsfAjkPropSpread::COMPLETETTRADESTATU) { return array('status' => 'fail', 'info' => '计划正在结算中'); } if ($planInfo->status == Model_Plan_EsfAjkPropSpread::DELETE) { return array('status' => 'ok', 'info' => '计划已经被删除'); } if ($brokerId != $planInfo->brokerId) { return array('status' => 'fail', 'info' => 'invalid broker'); } if (Model_Plan_EsfAjkPropSpread::COMM_CHOICE != $planInfo->model) { return array('status' => 'fail', 'info' => 'invalid house'); } //验证choice城市 $cityId = $planInfo->cityId; if (!Bll_City::isChoiceCity($cityId)) { return array('status' => 'fail', 'info' => 'starttime not achieved '); } //更新状态 $oldStatus = $planInfo->status; $planInfo->status = Model_Plan_EsfAjkPropSpread::DELETE; if (!$planInfo->save()) { return array('status' => 'fail', 'info' => 'update plan status fail'); } //记录日志 $remark = sprintf("STATUS:%d=>%d", $oldStatus, Model_Plan_EsfAjkPropSpread::DELETE); Model_Plan_LogAjkPropspread::addNewLog($planId, $brokerId, Model_Plan_LogAjkPropspread::DEL, $remark); return $rstArr; }
public function handle_request_internal() { $brokerId = $this->_params['brokerId']; //检查经纪人是否存在 $brokerInfo = Model_Broker_AjkBrokerExtend::findWithBrokerId($brokerId); if (!$brokerInfo) { throw new Exception_Broker_NotFound('BrokerId: ' . $brokerId); } // 判断城市是否开通竞价业务 $cityId = $brokerInfo->cityId; if (!Bll_City::isBidCity($cityId)) { throw new Exception_City_NotBidCity('CityId: ' . $cityId); } //从 竞价计划表 找出该经纪人的所有计划 1:推广中 11: 排队中 2:删除 $bidPlans = Model_Plan_EsfAjkPropSpread::getPlanByBroker($brokerId, Model_Plan_EsfAjkPropSpread::DEFAULTVERSION); $data = array('OnlinePropertyList' => array(), 'QueuedPropertyList' => array(), 'OfflinePropertyList' => array()); if (empty($bidPlans)) { return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => $data); } $keyedPlans = array(); foreach ($bidPlans as $plan) { $keyedPlans[$plan->propId] = $plan; //key:propId 保存时间 状态 } //房源信息 $propIds = array_keys($keyedPlans); $props = Bll_House_EsfHouse::getHouseBaseInfo($propIds, $brokerInfo->cityId); //批量获取竞价总点击 $bidClickInfo = Model_plan_HpProStatsDay::getPropClicks($propIds, $brokerInfo->cityId); //批量获取图片 $propDefImages = Model_House_AjkPropertyData::getDafImages($propIds); //拼接房源列表中房源数据 $propertyList = array(); foreach ($props 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['isVisible'] = $prop->isHighQulity; $row['isBid'] = 1; $row['isChoice'] = 0; $row['isMoreImg'] = $prop->isHighQulity; $row['isPhonePub'] = $prop->uriCode == 'mobile.asyn' || $prop->uriCode == 'mobile-ajk-broker.asyn' ? 1 : 0; $row['isVisible'] = $prop->isVisible; $row['createTime'] = $keyedPlans[$prop->proId]->createtime; $row['imgUrl'] = $propDefImages[$prop->proId]; if ($prop->commitionType > 1) { $row['isEntrust'] = 1; } else { $row['isEntrust'] = 0; } $row['totalClicks'] = $bidClickInfo[$prop->proId]['totalClicks']; //房源竞价总点击 $propertyList[] = $row; } // 排序 usort($propertyList, function ($a, $b) { if ($a['createTime'] == $b['createTime']) { return 0; } return $a['createTime'] > $b['createTime'] ? -1 : 1; }); // 分组 $onlinePropertyList = array(); //推广中列表 $waitPropertyList = array(); //排队中列表 $offlinePropertyList = array(); //推广结束列表 foreach ($propertyList as $val) { switch ($keyedPlans[$val['propId']]->status) { case '1': $onlinePropertyList[] = $val; break; case '11': $waitPropertyList[] = $val; break; default: $val['isBid'] = 0; $offlinePropertyList[] = $val; } } return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('OnlinePropertyList' => $onlinePropertyList, 'QueuedPropertyList' => $waitPropertyList, 'OfflinePropertyList' => $offlinePropertyList)); }
/** * 根据房源id获取可以删除的计划 * * @param $houseId */ public static function fitDeletePlan($houseId) { return Model_Plan_EsfAjkPropSpread::data_access()->filter_by_op('propId', '=', $houseId)->filter_by_op('status', '<>', Model_Plan_EsfAjkPropSpread::ONLINE)->filter_by_op('status', '<>', Model_Plan_EsfAjkPropSpread::ONQUEUE)->filter_by_op('status', '<>', Model_Plan_EsfAjkPropSpread::DELETE)->filter_by_op('tradetype', '=', 1)->filter_by_op('tradestatus', '=', Model_Plan_EsfAjkPropSpread::COMPLETETTRADESTATU)->sort('stoptime', 'asc')->find_only(); }
public function run() { //根据游标获取一定数量的坑位信息 $bucketInfos = Model_Choice_EsfBidBucket::getBucketInfoById($this->cursor, 0, $this->limit); //无需要处理的数据 if (empty($bucketInfos)) { $this->setShStopFlag(); $this->setCursor(0); $this->logQuit("无需要处理的数据."); } //检验具体的坑位信息 foreach ($bucketInfos as $bucketInfo) { //获取价格信息 $priceIntervalInfo = Model_House_EsfPrice::data_access()->filter('id', $bucketInfo->priceId)->find_only(); if (empty($priceIntervalInfo)) { $this->addLogger(sprintf("坑位信息%d,价格段id:%d获取失败", $bucketInfo->id, $bucketInfo->priceId)); continue; } //获取实际计划数目 $planNum = Model_Plan_EsfAjkPropSpread::data_access()->filter("commId", $bucketInfo->communityId)->filter("smallprice", $priceIntervalInfo->minPrice)->filter("bigprice", $priceIntervalInfo->maxPrice)->filter("bidVersion", Model_Plan_EsfAjkPropSpread::CHOICEVERSION)->filter("model", Model_Plan_EsfAjkPropSpread::COMM_CHOICE)->filter_by_op('status', 'in', array(Model_Plan_EsfAjkPropSpread::ONLINE, Model_Plan_EsfAjkPropSpread::ONQUEUE))->count(); if ($planNum == $bucketInfo->usedNum) { if (isset($this->exceptionBucket[$bucketInfo->id])) { //移除已经正常的坑位标记 unset($this->exceptionBucket[$bucketInfo->id]); $this->addLogger(sprintf("坑位信息%d,坑位恢复到正常%d", $bucketInfo->id, $planNum)); } else { $this->addLogger(sprintf("坑位信息%d正常", $bucketInfo->id)); } //更新游标 $this->setCursor($bucketInfo->id); //更新异常文件 $this->exceptionBucketFile->coverLog(json_encode($this->exceptionBucket)); continue; } //坑位异常处理 if (isset($this->exceptionBucket[$bucketInfo->id])) { //坑位已异常 if ($this->exceptionBucket[$bucketInfo->id]["occur"] <= $this->repairOccurNum) { //达到警告线,需要修复数据 //已实际计划数为依据更新 if (Model_Choice_EsfBidBucket::updateUsedNum($bucketInfo->id, $planNum, $bucketInfo->usedNum)) { unset($this->exceptionBucket[$bucketInfo->id]); $this->addLogger(sprintf("坑位信息%d,更新坑位信息成功, SQL:%s", $bucketInfo->id, Model_Choice_EsfBidBucket::$lastSql)); } else { $this->addLogger(sprintf("坑位信息%d,更新坑位信息失败, SQL:%s", $bucketInfo->id, Model_Choice_EsfBidBucket::$lastSql)); continue; } } else { //未达到警告线,继续标记 //记录历史信息 if (isset($this->exceptionBucket[$bucketInfo->id]['history'])) { $history = $this->exceptionBucket[$bucketInfo->id]['history']; } else { $history = array(); } $history[] = $this->exceptionBucket[$bucketInfo->id]; //继续标记 $this->exceptionBucket[$bucketInfo->id] = array('planNum' => $planNum, 'usedNum' => $bucketInfo->usedNum, 'occur' => $this->exceptionBucket[$bucketInfo->id]["occur"] + 1); $this->exceptionBucket[$bucketInfo->id]['history'] = $history; //记录日志 $this->addLogger(sprintf("坑位信息%d,出现异常%s", $bucketInfo->id, json_encode($this->exceptionBucket[$bucketInfo->id]))); } } else { $this->exceptionBucket[$bucketInfo->id] = array('planNum' => $planNum, 'usedNum' => $bucketInfo->usedNum, 'occur' => 1); $this->addLogger(sprintf("坑位信息%d,出现异常%s", $bucketInfo->id, json_encode($this->exceptionBucket[$bucketInfo->id]))); } //更新异常文件 $this->exceptionBucketFile->coverLog(json_encode($this->exceptionBucket)); //更新游标 $this->setCursor($bucketInfo->id); } }
/** * 更新房源推广计划的数据 * * $planId 是ajk_propspread的主键 * $params array() 变更的参数 */ public function updatePropSpread($planId, $params = array(), $version = -1) { $params = array_change_key_case($params); //转化为小写 if ($version === -1) { return Model_Plan_EsfAjkPropSpread::updateLayer(array(), $params, $planId); } else { //乐观锁 $filter = array(array('id', '=', $planId)); $queue = Model_Plan_EsfAjkPropSpread::fetchOneLayer($filter); if (empty($queue)) { return false; } $field1 = $queue->field1; array_push($filter, array('field1', '=', $field1 + 1)); $rs = Model_Plan_EsfAjkPropSpread::updateLayer($filter, $params, $planId); if (isset($rs) && $rs > 0) { return $rs; } else { //todo log method $date = date("Ymd"); $path = "/data1/logs/haopan.log" . $date; $ErrorInfo = "计划id:" . $planId . '更新失败,更新的数据为' . json_encode($params) . 'where 数据为' . json_encode($filter); file_put_contents($path, $ErrorInfo, FILE_APPEND); return 0; } } }