Пример #1
0
 /**
  * 初始化 坑位信息
  *
  * @param $blockId
  * @param $priceId
  * @return array
  */
 public static function init_bucket_info($blockId, $priceId)
 {
     $defaultBucketData = array('blockId' => $blockId, 'priceId' => $priceId, 'totalNum' => self::TOTAL_BUCKET_AMOUNT, 'usedNum' => 0, 'maxOnlineNum' => self::MAX_ONLINE_BUCKET_AMOUNT, 'createTime' => time());
     $id = Model_Choice_HzBidBucket::addBucket($defaultBucketData);
     if ($id == 0) {
         return array();
     }
     $defaultBucketData['id'] = $id;
     return $defaultBucketData;
 }
 public function dealTask($task)
 {
     $currentUsedNum = $task['usedNum'];
     $trueUsedNum = Bll_HzBidPlan::countBucketChoicePlan($task['blockId'], $task['priceId']);
     printf('正在处理 队列id %s, blockId %s, priceId %s 结果是: userNum: %s, 实际: %s, 状态:%s' . PHP_EOL, $task['id'], $task['blockId'], $task['priceId'], $currentUsedNum, $trueUsedNum, $currentUsedNum == $trueUsedNum ? 'success' : 'error');
     if ($currentUsedNum == $trueUsedNum) {
         return true;
     }
     $result = Model_Choice_HzBidBucket::updateBucket(array('id' => $task['id']), array('usedNum' => $trueUsedNum));
     printf('更新usedNum结果: %s' . PHP_EOL, $result ? '更新成功' : '更新失败');
     return true;
 }
Пример #3
0
 /**
  * 精选房源设置
  *
  * @param $ajk_broker_id
  * @param $city_id
  * @param $prop_id
  * @param array $params
  *
  * @return array
  */
 public static function hz_setting_post($ajk_broker_id, $city_id, $prop_id, $params = array())
 {
     //获取精选推广预算
     $brokerInfo = Bll_BrokerBaseBll::get_instance()->get_broker_info($ajk_broker_id);
     $brokerCompanyId = $brokerInfo['BaseInfo']['COMPANYID'];
     $choiceSet = APF::get_instance()->get_config('choice_set');
     if (isset($choiceSet[$brokerCompanyId]) && !empty($choiceSet[$brokerCompanyId])) {
         $min_budget = $choiceSet[$brokerCompanyId]['hz']['HZ_CHOICE_MIN_BUDGET'];
         $max_budget = $choiceSet[$brokerCompanyId]['hz']['HZ_CHOICE_MAX_BUDGET'];
     } else {
         $min_budget = $choiceSet['default']['hz']['HZ_CHOICE_MIN_BUDGET'];
         $max_budget = $choiceSet['default']['hz']['HZ_CHOICE_MAX_BUDGET'];
     }
     if ($params['budget'] < $min_budget || $params['budget'] > $max_budget) {
         return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '推广预算,最低' . $min_budget . '安币,最高' . $max_budget . '安币');
     }
     $result = array();
     $hz_broker_id = Model_Broker_HzMapping::get_hz_broker_id($ajk_broker_id);
     if (0 == $hz_broker_id) {
         return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '您不是好租经纪人');
     }
     /** 判断房源是否可以精选 */
     $checkProp = Bll_HzBidPlan::checkPropCanChoice($ajk_broker_id, $city_id, $prop_id);
     if ($checkProp['err_no'] != 0) {
         return $checkProp;
     }
     /** 防并发 */
     if (false === self::rejectSameRequest(Bll_Plan_Bid_Choice::SITE_HAOZU, $ajk_broker_id, $prop_id)) {
         return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-906)');
     }
     /** 获取房源基本信息 */
     $propInfo = Model_House_HzProp::get_prop_info_by_prop_id($prop_id);
     /** 获取点击单价 */
     try {
         /**
          * @var Bll_Service_Client_HttpResponse $clickPrice
          */
         for ($i = 0; $i < 3; $i++) {
             $clickPrice = Bll_Service_Choice::hzClickPrice(array('brokerId' => $ajk_broker_id, 'cityId' => $city_id, 'price' => (int) $propInfo['contentBasic']['pricenum'], 'blockId' => $propInfo['contentBasic']['blockid']));
             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 ($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__ . ')');
     }
     $block_id = $propInfo['contentBasic']['blockid'];
     $priceIntervalInfo = Model_House_HzPriceChoice::get_price($city_id, $propInfo['contentBasic']['pricenum']);
     if (empty($priceIntervalInfo)) {
         $logContent = sprintf('%s ajkBrokerId=%d hzBrokerId=%d cityId=%d propId=%d blockId=%d priceNum=%s %s', date('Y-m-d H:i:s'), $ajk_broker_id, $hz_broker_id, $city_id, $prop_id, $block_id, $propInfo['contentBasic']['pricenum'], '好租城市的价格段获取失败');
         APF::get_instance()->get_nlogger()->log('好租城市的价格段', $logContent);
         return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统烦忙(code:-' . __LINE__ . ')');
     }
     /** 获取坑位信息 提前判断坑位状态 没有的话会自动初始化一个 */
     $bucketInfo = Bll_Choice_HzBidBucket::getBucketInfo($block_id, $priceIntervalInfo['id']);
     if (empty($bucketInfo)) {
         return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '精选房源推广失败');
     }
     /** 精选房源展示推广 */
     if (isset($params['show']) && $params['show'] == 1) {
         $result = array('err_no' => self::BID_SHOW_SUCCESS, 'err_msg' => '精选房源推广成功');
         if ($bucketInfo['usedNum'] >= $bucketInfo['maxOnlineNum']) {
             return array('err_no' => self::BID_SHOW_FAIL, 'err_msg' => '精选房源推广失败');
         }
         /** 展示位 坑位自增 */
         $lockBucket = Model_Choice_HzBidBucket::increment_used_num_online($block_id, $priceIntervalInfo['id']);
         if (!$lockBucket) {
             return array('err_no' => self::BID_SHOW_FAIL, 'err_msg' => '精选房源推广失败');
         }
     } else {
         $result = array('err_no' => self::BID_WAIT_SUCCESS, 'err_msg' => '精选房源推广成功');
         if ($bucketInfo['usedNum'] >= $bucketInfo['totalNum']) {
             return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '推广位已满!');
         }
         /** 排队位置 坑位自增 */
         $lockBucket = Model_Choice_HzBidBucket::increment_used_num($block_id, $priceIntervalInfo['id']);
         if (!$lockBucket) {
             return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '精选房源推广失败');
         }
     }
     /** 往冻结队列里添加记录,获取request id*/
     $bidFreezeOrder = new Bll_Plan_BidFreezeOrderNum(date('Y'));
     $ajk_user_id = Bll_Broker_MainBusiness::getDataByEsfId($ajk_broker_id)->memberId;
     $requestId = $bidFreezeOrder->getRequestId(Bll_Plan_BidFreezeOrderNum::HZ, $ajk_user_id, date('Y'), 0, $prop_id);
     /** 冻结金额 */
     $freezeResult = self::hz_bid_freeze($ajk_broker_id, $params['budget'] * 100, $requestId, sprintf('好租精选房源冻结,propId: %d', $prop_id));
     if (!$freezeResult->isSucceeded() || $freezeResult['status'] == 'error') {
         Model_Choice_HzBidBucket::decrement_used_num($block_id, $priceIntervalInfo['id']);
         return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => isset($freezeResult['info']) ? $freezeResult['info'] : '冻结金额失败');
     }
     $sn = $freezeResult['data']['sn'];
     if (!isset($params['plan_id']) || empty($params['plan_id'])) {
         $createdRemark = sprintf('经纪人开始精选房源推广 SN:%s', $sn);
         $resultPlan = Bll_Plan_Bid_HzBid::add_plan($hz_broker_id, $prop_id, $params['price'], $params['budget'], $block_id, $city_id, $sn, $ajk_broker_id);
         /** 添加计划失败 */
         if ($resultPlan['error_code'] != 0) {
             Model_Choice_HzBidBucket::decrement_used_num($block_id, $priceIntervalInfo['id']);
             return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => $resultPlan['error_message']);
         }
         $planId = $resultPlan['planId'];
     } else {
         $createdRemark = sprintf('经纪人重新推广精选房源 SN:%s', $sn);
         /** 更新精选房源计划预算 */
         $planId = $params['plan_id'];
         $resultPlan = Bll_Plan_Bid_HzBid::update_bid($hz_broker_id, $planId, $prop_id, $params['price'], $params['budget'], $city_id, $sn, $ajk_broker_id);
         if ($resultPlan['error_code'] != 0) {
             Model_Choice_HzBidBucket::decrement_used_num($block_id, $priceIntervalInfo['id']);
             return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => $resultPlan['error_message']);
         }
         $planId = $resultPlan['planId'];
     }
     $result['rank'] = Bll_Plan_Bid_HzBid::getChoiceWaitPosition($planId, $city_id, $block_id, $priceIntervalInfo['id']);
     /** 精选房源成功 */
     $actionQueueData = array('siteType' => Model_Choice_ActionQueue::ENUM_HAOZU, 'brokerId' => $ajk_broker_id, 'planId' => $planId, 'proId' => $prop_id, 'actionId' => Model_Choice_ActionQueue::ENUM_BEGIN_BY_HAND, 'createTime' => time(), 'createRemark' => $createdRemark, 'operationId' => $ajk_broker_id, 'ip' => $params['ip']);
     Model_Choice_ActionQueue::addBidQueen($actionQueueData);
     $bidFreezeOrder->updateRequestComplete($requestId, $sn, $planId);
     return $result;
 }
Пример #4
0
 /**
  * 更新坑位信息,重新计算
  *
  * @param int $blockId
  * @param int $priceId
  * @return bool
  */
 private static function updateBucket($blockId, $priceId)
 {
     $bucketCount = Bll_HzBidPlan::countBucketChoicePlan($blockId, $priceId);
     $bucketInfo = Bll_Choice_HzBidBucket::getBucketInfo($blockId, $priceId);
     if (empty($bucketInfo)) {
         $bucketInfo = Bll_Choice_HzBidBucket::init_bucket_info($blockId, $priceId);
     }
     if ($bucketInfo['usedNum'] == $bucketCount) {
         return true;
     }
     $condition = array('blockId' => $blockId, 'priceId' => $priceId);
     return 1 == Model_Choice_HzBidBucket::updateBucket($condition, array('usedNum' => min($bucketCount, $bucketInfo['totalNum'])));
 }
Пример #5
0
 /**
  * 经纪人手动停止精选推广
  * 只将计划的状态状态设置为 Const_HzPlan::MENUOVER
  *
  * @param $ajkBrokerId
  * @param $planId
  * @param $ip
  * @return array
  */
 public static function stopChoicePlan($ajkBrokerId, $planId, $ip)
 {
     $result = array('status' => 'ok');
     $planInfo = Model_Plan_HzPlanBasic::get_plan_by_id($planId);
     if (empty($planInfo)) {
         return array('status' => 'error', 'msg' => '计划不存在。');
     }
     if ($planInfo['status'] != Const_HzPlan::SPREAD) {
         return array('status' => 'error', 'msg' => '计划不在推广中。');
     }
     $hzBrockId = Model_Broker_HzMapping::get_hz_broker_id($ajkBrokerId);
     if ($planInfo['user_id'] != $hzBrockId) {
         return array('status' => 'error', 'msg' => '计划不属于当前经纪人。');
     }
     $blockId = $planInfo['blockId'];
     $priceId = $planInfo['priceId'];
     // 根据plan_id查pro_id
     $planning = Dao_Broker_HzPlan::get_planning($planId, 2);
     $proId = $planning ? $planning[0]['proid'] : 0;
     $bidQueueData = array('siteType' => Model_Choice_ActionQueue::ENUM_HAOZU, 'brokerId' => $ajkBrokerId, 'planId' => $planId, 'proId' => $proId, 'actionId' => Model_Choice_ActionQueue::ENUM_STOP_BY_HAND, 'createTime' => time(), 'createRemark' => '经纪人手动停止推广', 'operationId' => $ajkBrokerId, 'ip' => $ip);
     Model_Choice_ActionQueue::addBidQueen($bidQueueData);
     /** 更新计划状态为手工结束状态 */
     //Bll_HzBidPlan::updatePlanStatus($planId, Const_HzPlan::MENUOVER);
     $updatePlanResult = Model_Plan_HzPlanBasic::updatePlan($planId, array('status' => Const_HzPlan::MENUOVER, 'stop_date' => time()));
     $updatePlanningResult = Model_Plan_HzPlanning::updatePropPlanStatusByPlanId($planId, Const_HzPlan::MENUOVER);
     // 计划和关系更新成功后坑才-1
     if ($updatePlanResult && $updatePlanningResult) {
         Model_Choice_HzBidBucket::decrement_used_num($blockId, $priceId);
     } else {
         return array('status' => 'error', 'msg' => '更新计划或者关系失败。');
     }
     return $result;
 }
Пример #6
0
 /**
  * 添加 坑位
  *
  * @param array $data
  * @return int
  */
 public static function addBucket($data)
 {
     try {
         $oBucket = Model_Choice_HzBidBucket::data_access();
         foreach ($data as $field => $value) {
             $oBucket->set_field($field, $value);
         }
         if ($oBucket->insert()) {
             return $oBucket->connection->lastInsertId();
         }
     } catch (Exception $e) {
         return 0;
     }
     return 0;
 }
Пример #7
0
 /**
  * 精选房子计算:默认(0)/可推广(1)/可排队(2)/已排满(3)
  * @param $proInfos
  * @param $cityId
  * @return array
  */
 public static function getPropChoiceStatus($proInfos, $cityId)
 {
     if (empty($proInfos)) {
         return array();
     }
     $priceIds = Model_House_HzPriceChoice::getAllPriceByCityId($cityId);
     if (empty($priceIds)) {
         return array();
     }
     $result = array();
     $choiceStatus = array();
     foreach ($proInfos as $propInfo) {
         // 取价格段id
         $priceNum = isset($propInfo['priceNum']) ? $propInfo['priceNum'] : $propInfo['pricenum'];
         $propInfo['priceId'] = 0;
         foreach ($priceIds as $priceInfo) {
             if ($priceInfo['lower'] < $priceNum && $priceInfo['upper'] >= $priceNum) {
                 $propInfo['priceId'] = $priceInfo['id'];
                 break;
             }
         }
         $propInfo['blockId'] = isset($propInfo['blockId']) ? $propInfo['blockId'] : $propInfo['blockid'];
         // 获取精选状态
         if ($bidBucket = Model_Choice_HzBidBucket::get_bucket_info($propInfo['blockId'], $propInfo['priceId'])) {
             if ($bidBucket['usedNum'] < $bidBucket['maxOnlineNum']) {
                 $choiceStatus['choiceStatus'] = 1;
                 $choiceStatus['choiceMsg'] = '可推广';
             } elseif ($bidBucket['usedNum'] < $bidBucket['totalNum']) {
                 $choiceStatus['choiceStatus'] = 2;
                 $choiceStatus['choiceMsg'] = '可排队';
             } else {
                 $choiceStatus['choiceStatus'] = 3;
                 $choiceStatus['choiceMsg'] = '已排满';
             }
         } else {
             $choiceStatus['choiceStatus'] = 1;
             $choiceStatus['choiceMsg'] = '可推广';
         }
         $result[$propInfo['proId']] = $choiceStatus;
     }
     return $result;
 }