/** * 修复b_bj_prop_search,b_sh_prop_search,b_four_prop_search,b_other_prop_search 4张表中的ajk_brokerid 为0的数据 * * @param int $hzBrokerId * @param int $ajkBrokerId * @param int $cityId */ private function repairPropSearch($hzBrokerId, $ajkBrokerId, $cityId) { $condition = array(array('userid', '=', $hzBrokerId), array('ajkBrokerId', '=', 0), array('created', '>', strtotime('-91 day'))); $propList = Model_House_HzPropSearch::getPropLists($cityId, $condition); if (empty($propList)) { $this->setLog('没有获取到房源'); return; } foreach ($propList as $propInfo) { $this->setLog(json_encode($propInfo)); if ($propInfo['ajkBrokerId'] == 0) { $data = array('ajkBrokerId' => $ajkBrokerId); if (!Model_House_HzPropSearch::updateProp($cityId, $propInfo['proid'], $data)) { $this->setLog(sprintf('更新房源[%d]的 ajkBrokerId=%d 失败', $propInfo['proid'], $ajkBrokerId)); } else { $this->setLog(sprintf('更新房源[%d]的 ajkBrokerId=%d 成功', $propInfo['proid'], $ajkBrokerId)); } continue; } if ($propInfo['ajkBrokerId'] != $ajkBrokerId) { $this->setLog(sprintf('房源[%d]的ajkBrokerId[%d],不一致[%d]', $propInfo['proid'], $propInfo['ajkBrokerId'], $ajkBrokerId)); } else { $this->setLog(sprintf('房源[%d]的ajkBrokerId[%d],无需修复', $propInfo['proid'], $propInfo['ajkBrokerId'])); } } }
/** * Job执行逻辑 */ public function handle_request() { printf('[%s] lastLogId: %s' . PHP_EOL, date('Y-m-d H:i:s'), $this->lastLogId); // 获取任务 获取状态为4的房子 // 2014-09-01上的新套餐。 从这个时间往后取即可 $params = array(array('proid', '>', $this->lastLogId), array('updated', '>=', strtotime('2014-09-01 00:00:00')), array('status', 'in', array(Const_HzStatus::OFFLINE))); $tasks = Model_House_HzPropSearch::getPropLists($this->getCityIdByTable(), $params, $this->limit); if ($tasks === false) { printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '获取数据失败'); exit; } if (empty($tasks)) { // 任务完成 printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '任务执行完成'); $this->setStop(); $this->setShStopFlag(); $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => $this->lastLogId))); exit; } // 循环任务处理 foreach ($tasks as $task) { $this->dealTask($task); $this->lastLogId = $task['proid']; } //记录游标 $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => $this->lastLogId))); }
/** * Job执行逻辑 */ public function handle_request() { printf('[%s] lastLogId: %s' . PHP_EOL, date('Y-m-d H:i:s'), $this->lastLogId); $expriedTime = strtotime(date("Ymd")) - Const_HzStatus::PROP_EXPIRED * 86400; // 获取任务 获取过期没有处理的房源 $params = array(array('proid', '>', $this->lastLogId), array('created', '<=', $expriedTime), array('status', '<>', Const_HzStatus::REMOVE), array('status', '<>', Const_HzStatus::EXPIRED)); $tasks = Model_House_HzPropSearch::getPropLists($this->getCityIdByTable(), $params, $this->limit); if ($tasks === false) { printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '获取数据失败'); exit; } if (empty($tasks)) { // 任务完成 printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '任务执行完成'); $this->setStop(); $this->setShStopFlag(); $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => $this->lastLogId))); exit; } // 循环任务处理 foreach ($tasks as $task) { $this->dealTask($task); $this->lastLogId = $task['proid']; } //记录游标 $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => $this->lastLogId))); }
public function handle_request() { $dealStatus = array(Const_HzStatus::VERIFY, Const_HzStatus::REMOVE, Const_HzStatus::EXPIRED); $condition = array(array('proid', '>', $this->_startId), array('updated', '>=', strtotime($this->_startTime)), array('updated', '<=', strtotime($this->_endTime))); $houseList = Model_House_HzPropSearch::getPropLists($this->_cityId, $condition, self::BATCH_LIMIT); foreach ($houseList as $houseInfo) { $houseId = $houseInfo['proid']; $this->setFlag(array('id' => $houseId, 'time' => date('Y-m-d H:i:s'))); if (!in_array($houseInfo['status'], $dealStatus)) { $this->setLog(sprintf('房源[%d]房源状态[%d]不在[%s]不处理', $houseId, $houseInfo['status'], implode(',', $dealStatus))); continue; } $houseRelation = Bll_Combo_HouseRelation::getRelationByHouseId($houseId, Bll_Combo_HouseRelation::SITE_TYPE_HZ); if (empty($houseRelation)) { $this->setLog(sprintf('房源[%d - %d],没有获取到套餐关系', $houseId, $houseInfo['status'])); continue; } /** 如果房源关系已经不是在线的,就不修复 */ if (false == Bll_Combo_HouseRelation::isRelationOnline($houseRelation['state'])) { $this->setLog(sprintf('房源[%d - %d],已经不在线,不处理', $houseId, $houseRelation['state'])); continue; } switch ($houseInfo['status']) { case Const_HzStatus::VERIFY: $relationState = Model_Combo_HouseRelation::ENUM_HOUSE_ILLEGAL; break; case Const_HzStatus::REMOVE: $relationState = Model_Combo_HouseRelation::ENUM_HOUSE_DELETE; break; case Const_HzStatus::EXPIRED: $relationState = Model_Combo_HouseRelation::ENUM_HOUSE_EXPIRE; break; default: $relationState = Model_Combo_HouseRelation::ENUM_HOUSE_DELETE; continue; } /** 修正房源套餐推广关系 */ if (1 == Bll_Combo_HouseRelation::updateComboStatusById($houseRelation['id'], $relationState, Bll_Combo_HouseRelation::SITE_TYPE_HZ)) { $this->setLog(sprintf('房源[%d - %d],套餐推广关系[%d-%d]修复成功', $houseId, $houseInfo['status'], $houseRelation['id'], $houseRelation['state'])); } else { $this->setLog(sprintf('房源[%d - %d],套餐推广关系[%d-%d]修复失败', $houseId, $houseInfo['status'], $houseRelation['id'], $houseRelation['state'])); } $this->noticeComboSolr($houseInfo['cityid'], $houseInfo['userid'], $houseId); } if (count($houseList) < self::BATCH_LIMIT) { $this->setLog(sprintf('[%d - %d]已经处理完成...', $this->_cityId, $this->_startId)); $this->setShStopFlag(); $this->removeFlag(); } else { $this->setShCommonSleepTime(1); } }
/** * Job执行逻辑 */ public function handle_request() { printf('[%s] lastLogId: %s' . PHP_EOL, date('Y-m-d H:i:s'), $this->lastLogId); // 获取任务 获取在线房源 $params = array(array('status', '=', Const_HzStatus::ONLINE), array('proid', '>', $this->lastLogId)); $tasks = Model_House_HzPropSearch::getPropLists($this->getCityIdByTable(), $params, $this->limit); if ($tasks === false) { printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '获取数据失败'); exit; } if (empty($tasks)) { // 任务完成 printf('[%s] remark: %s' . PHP_EOL, date('Y-m-d H:i:s'), '任务执行完成'); $this->setStop(); $this->setShStopFlag(); $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => 0))); exit; } $cityIdProIds = array(); $solrProIdsTmp = array(); $solrProIds = array(); foreach ($tasks as $task) { $cityIdProIds[$task['cityid']][] = $task['proid']; } foreach ($cityIdProIds as $cityId => $proIds) { // 获取solr $solrs = Util_SearchUtil::getHzPropsFromSolr($cityId, $proIds, $this->limit); if (!empty($solrs)) { $solrProIdsTmp[] = array_merge($solrProIdsTmp, $solrs); } } // 扁平处理 if (!empty($solrProIdsTmp)) { foreach ($solrProIdsTmp as $items) { foreach ($items as $item) { $solrProIds[] = $item['id']; } } } // 循环处理任务 foreach ($tasks as $task) { $this->dealTask($task, $solrProIds); $this->lastLogId = $task['proid']; } //记录游标 $this->setFlag(array_merge($this->getFlag(), array('lastLogId' . $this->table => $this->lastLogId))); /* if (!empty($this->errorPropIds)) Bll_House_UpDown_Worker_MailBll::getInstance()->setSubject('检查房源在线 solr却不在线')->send(array('message' => json_encode(array('error proids' => $this->errorPropIds)))); */ }
public function handle_request() { $condition = array(array('proid', '>', $this->_startId), array('cityid', '=', $this->_cityId), array('created', '<', $this->_expireTime), array('status', '<>', Const_HzStatus::EXPIRED), array('status', '<>', Const_HzStatus::REMOVE)); $houseList = Model_House_HzPropSearch::getPropLists($this->_cityId, $condition, self::BATCH_LIMIT); if (empty($houseList)) { $this->setShStopFlag(); $this->setLog('处理完成'); return; } foreach ($houseList as $house) { $houseId = $house['proid']; $this->setLog(sprintf('开始处理房源[%d], 房源发布时间[%s]: %s', $houseId, date('Y-m-d H:i:s', $house['created']), json_encode($house))); $this->setFlag(array('id' => $houseId), $this->_cursorFile); if (1 != Model_House_HzPropSearch::updatePropStatus($this->_cityId, $houseId, Const_HzStatus::EXPIRED)) { $this->setLog(sprintf('房源[%d]更新房源状态失败', $houseId)); continue; } $comboHouseRelation = Bll_Combo_HouseRelation::getRelationByHouseId($houseId, Bll_Combo_HouseRelation::SITE_TYPE_HZ, false); if (empty($comboHouseRelation)) { $this->setLog(sprintf('房源[%d]没有获取到套餐推广关系', $houseId)); continue; } $this->setLog(sprintf('房源[%d]套餐推广关系: %s', $houseId, json_encode($comboHouseRelation))); if (!Bll_Combo_HouseRelation::isRelationOnline($comboHouseRelation['state'])) { $this->setLog(sprintf('房源[%d]套餐推广状态不在线[%d]', $houseId, $comboHouseRelation['state'])); continue; } $this->setLog(sprintf('房源[%d]套餐推广状态在线[%d]', $houseId, $comboHouseRelation['state'])); if (1 != Bll_Combo_HouseRelation::updateComboStatusById($comboHouseRelation['id'], Model_Combo_HouseRelation::ENUM_COMBO_EXPIRE, Bll_Combo_HouseRelation::SITE_TYPE_HZ)) { $this->setLog(sprintf('更新房源[%d]套餐关系[%d : %d -> %d]失败', $houseId, $comboHouseRelation['id'], $comboHouseRelation['state'], Model_Combo_HouseRelation::ENUM_COMBO_EXPIRE)); continue; } $this->setLog(sprintf('更新房源[%d]套餐关系[%d : %d -> %d]成功', $houseId, $comboHouseRelation['id'], $comboHouseRelation['state'], Model_Combo_HouseRelation::ENUM_COMBO_EXPIRE)); $this->noticeComboSolr($this->_cityId, $house['userid'], $houseId, $comboHouseRelation['brokerId']); } if (count($houseList) < self::BATCH_LIMIT) { $this->setShStopFlag(); } }
/** * 好租小区信息变更写房源日志(批量) * * @param array $queueInfo * @return array */ public static function hzCommunityInfoChangeEx($queueInfo) { if (!isset($queueInfo) || empty($queueInfo)) { return static::buildReturn(self::PROCESS_STATUS_ERROR, '小区信息变更,remark的值为空'); } $communityChangeInfo = json_decode($queueInfo['remark'], true); if (!is_array($communityChangeInfo)) { return static::buildReturn(self::PROCESS_STATUS_ERROR, '小区信息变更,remark的值不是JSON'); } $startHouseId = 0; $houseLogWriteError = array(); do { $condition = array(array('proid', '>', $startHouseId), array('cityid', '=', $communityChangeInfo['cityId']), array('commid', '=', $communityChangeInfo['commId']), array('status', '<>', Const_HzStatus::EXPIRED), array('status', '<>', Const_HzStatus::REMOVE)); $houseList = Model_House_HzPropSearch::getPropLists($communityChangeInfo['cityId'], $condition, 100); if (empty($houseList)) { break; } foreach ($houseList as $houseInfo) { $startHouseId = $houseInfo['proid']; $data = array(); $data['houseId'] = $houseInfo['proid']; $data['planId'] = 0; $data['brokerId'] = $houseInfo['ajkBrokerId']; $data['cityId'] = $queueInfo['city_id']; $data['type'] = Model_Log_HouseLogNew::TYPE_COMMUNITY_INFO_CHANGE; $data['changeType'] = $queueInfo['type']; $data['remark'] = '小区信息变更'; $data['addDate'] = date('Y-m-d H:i:s'); $data['operatorId'] = 0; $data['siteType'] = 2; if (!Model_Log_HouseLogNew::create($data, date('Ymd'))->save()) { $houseLogWriteError[] = $houseInfo['proid']; } } if (count($houseList) < 100) { break; } } while (true); return static::buildReturn(self::PROCESS_STATUS_SUCCESS, sprintf('小区信息变更,房源日志写入失败的房源Id[%s]', implode(',', $houseLogWriteError))); }
/** * 获取套餐房源的累计点击量 * @param int $ajkBrokerId * @param array|int $houseIds * @param int $cityId * @return array */ public static function getComboHouseAccumulateClick($ajkBrokerId, $houseIds, $cityId) { $noCacheHouseIds = is_array($houseIds) ? $houseIds : array($houseIds); $cache = APF_Cache_Factory::get_instance()->get_memcache(); $cacheKey = sprintf('combo_accumulate_house_click_hz_1_%d', $ajkBrokerId); $cacheHouseAccumulateClickList = $cache->get($cacheKey); if (is_array($cacheHouseAccumulateClickList) && !empty($cacheHouseAccumulateClickList)) { $houseAccumulateClickList = $cacheHouseAccumulateClickList; $cacheHouseIds = array_keys($cacheHouseAccumulateClickList); $noCacheHouseIds = array_diff($noCacheHouseIds, $cacheHouseIds); } else { $houseAccumulateClickList = array_fill_keys($noCacheHouseIds, 0); } if (count($noCacheHouseIds) == 0) { return $houseAccumulateClickList; } foreach ($noCacheHouseIds as $noCacheHouseId) { $houseAccumulateClickList[$noCacheHouseId] = 0; } $houseIds = $noCacheHouseIds; // 获取房源的发布时间 $houseBaseInfoList = Model_House_HzPropSearch::getPropLists($cityId, array(array('proid', 'in', $houseIds))); if (empty($houseBaseInfoList)) { return $houseAccumulateClickList; } // 根据房源的发布时间获取房源累计点击量的分表后缀 $splitSuffixes = array(); foreach ($houseBaseInfoList as $houseBaseInfo) { $splitSuffix = date('Ym', $houseBaseInfo['created']); if (!isset($splitSuffixes[$splitSuffix])) { $splitSuffixes[$splitSuffix] = array(); } $splitSuffixes[$splitSuffix][] = $houseBaseInfo['proid']; } if (empty($splitSuffixes)) { return $houseAccumulateClickList; } /** * 获取房源的累计点击量 */ $result = array(); foreach ($splitSuffixes as $splitSuffix => $houseIdList) { $houseClickInfoList = Model_Broker_ComboPropClickAccumulate::getHouseClickInfo($houseIdList, Model_Broker_ComboPropClickAccumulate::SITE_TYPE_HZ, $splitSuffix); $result = array_merge($result, $houseClickInfoList); } if (empty($result)) { return $houseAccumulateClickList; } /** * 生成房源累计点击量信息 */ foreach ($result as $houseAccumulateClickInfo) { $houseId = $houseAccumulateClickInfo['propId']; $houseAccumulateClickList[$houseId] = $houseAccumulateClickInfo['vppvAccumulate']; } $cache->set($cacheKey, $houseAccumulateClickList, 0, 7200); return $houseAccumulateClickList; }
/** * 组装未推广列表 取出所有-有效定价房源 * @param $out * @return array */ private static function prepareOutList(&$out) { $outList = array(); $outPropIds = array(); $fixProIds = array_keys($out['props']); // 取出经纪人所有非删除房源 (分表) $allSearchProps = Model_House_HzPropSearch::getPropLists($out['cityId'], array(array('ajkBrokerId', '=', $out['ajkBrokerId']), array('status', '<>', Const_HzStatus::DELETE), array('status', '<>', Const_HzStatus::OFFLINE), array('status', '<>', Const_HzStatus::OUTPORT), array('status', '<>', Const_HzStatus::HIBERNATE), array('status', '<>', Const_HzStatus::REMOVE), array('status', '<>', Const_HzStatus::EXPIRED)), 1000, array('created', 'desc')); if (empty($allSearchProps)) { return array(); } // 获取城市价格段 $allPrices = Model_House_HzPriceChoice::getAllPriceByCityId($out['cityId']); $out['getQualityProIds'] = array(); foreach ($allSearchProps as $allSearchProp) { $proId = $allSearchProp['proid']; $out['getQualityProIds'][] = $proId; // 过滤非删除状态定价 if (in_array($proId, $fixProIds)) { continue; } $outList[$proId] = $allSearchProp; // 获取剩余时间 $outList[$proId]['leftDays'] = Bll_House_HzHouse::getLeftDays($allSearchProp['created']); $outPropIds[] = $proId; } // 获取改经纪人所有房源质量 $out['propsQuality'] = Model_Stats_HzPropQuality::getPropsquality($out['getQualityProIds']); // 获取如是违规房源 拼接违规原因 $outList = Bll_HzProp::checkAndGetPropsIllegalInfos($outList); // 批量获取主表信息 if (empty($outPropIds)) { return array(); } $props = Model_House_HzProp::getPropsByPropIds($outPropIds); if (!$props) { return array(); } // 房源主分表信息合并 foreach ($outList as $proId => $outProp) { $outList[$proId] = array_merge($outList[$proId], $props[$proId]); // 计算点击价格 if (!empty($allPrices)) { foreach ($allPrices as $priceInfo) { if ($priceInfo['lower'] < $outList[$proId]['pricenum'] && $priceInfo['upper'] >= $outList[$proId]['pricenum']) { $outList[$proId]['unitPrice'] = $priceInfo['price']; break; } } } } return $outList; }