/** * 初始化 坑位信息 * @param $blockId * @param $newBlockId * @param $houseType * @param $priceId * @param $cityId * @return array */ public static function initBucketInfo($blockId, $newBlockId, $houseType, $priceId, $cityId) { Model_Choice_JPBidBucket::initBucketInfo($blockId, $newBlockId, $houseType, $priceId, $cityId); $bucketInfo = array(); $bucketInfo['totalNum'] = Model_Choice_JPBidBucket::TOTALNUM; $bucketInfo['usedNum'] = Model_Choice_JPBidBucket::INIT_USENUM; $bucketInfo['maxOnlineNum'] = Model_Choice_JPBidBucket::MAXONLINENUM; return $bucketInfo; }
public function dealTask($task) { $currentUsedNum = $task['usedNum']; $trueUsedNum = Bll_Choice_JpBidBucket::countBucketChoicePlan($task['blockId'], $task['newBlockId'], $task['houseType'], $task['priceId']); printf('正在处理 队列id %s, blockId %s, newBlockId %s, houseType %s, priceId %s 结果是: userNum: %s, 实际: %s, 状态:%s' . PHP_EOL, $task['id'], $task['blockId'], $task['newBlockId'], $task['houseType'], $task['priceId'], $currentUsedNum, $trueUsedNum, $currentUsedNum == $trueUsedNum ? 'success' : 'error'); if ($currentUsedNum == $trueUsedNum) { return true; } $result = Model_Choice_JPBidBucket::data_access()->filter('id', $task['id'])->find_only(); $result->usedNum = $trueUsedNum; $result->save(); printf('更新usedNum结果: %s' . PHP_EOL, $result ? '更新成功' : '更新失败'); return true; }
/** * 金铺-精选房源设置 * * @param $ajkBrokerId * @param $cityId * @param $propId * @param array $params * @return array */ public static function jp_setting_post($ajkBrokerId, $cityId, $propId, $params = array()) { $jpBrokerInfo = Model_Broker_JpBroker::getJpBrokerInfoByAjkBrokerId($ajkBrokerId); //check房源是否已经加入精选推广 $bidObj = Model_Plan_Jp::getBidPlanByHouseIdEx($ajkBrokerId, $propId, true); if (!empty($bidObj)) { if ($bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_ONLINE || $bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD) { return array('err_no' => self::BID_HOUSE_ALREADY_IN_BID, 'err_msg' => '房源已经加入精选推广'); } elseif ($bidObj['status'] == Model_Plan_Jp::ENUM_STATUS_HOLD) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源正在结算中,请稍后...'); } } $bidChoiceCount = Model_Plan_Jp::getBidChoiceInfoEx($cityId, $ajkBrokerId); //获取精选推广预算 $brokerInfo = Bll_BrokerBaseBll::get_instance()->get_broker_info($ajkBrokerId); $brokerCompanyId = $brokerInfo['BaseInfo']['COMPANYID']; $choiceSet = APF::get_instance()->get_config('choice_set'); if (isset($choiceSet[$brokerCompanyId]) && !empty($choiceSet[$brokerCompanyId])) { $min_budget = $choiceSet[$brokerCompanyId]['jp']['JP_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet[$brokerCompanyId]['jp']['JP_CHOICE_MAX_BUDGET']; } else { $min_budget = $choiceSet['default']['jp']['JP_CHOICE_MIN_BUDGET']; $max_budget = $choiceSet['default']['jp']['JP_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 . '安币'); } $status = isset($bidObj['status']) ? $bidObj['status'] : 0; if (count($bidChoiceCount) >= self::ALL_JP_PLAN_NUM && $status != 4) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '精选推广房源已经超过' . self::ALL_JP_PLAN_NUM . '套'); } if (0 == $jpBrokerInfo) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '您不是金铺经纪人'); } /** 获取房源基本信息 */ $propInfo = Bll_House_JpHouseInfo::getHouseInfoById($propId); if (empty($propInfo)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不存在'); } if ($propInfo['base']['memberId'] != $jpBrokerInfo['id']) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源不属于该经纪人'); } /** 判断是否是精选开放城市 */ if (!Bll_City::isChoiceIndependentCity($cityId, Const_Site::JINPU)) { /** 判断房源是否在套餐推广 */ $propCombos = Bll_Combo_HouseRelation::getOnlineRelationByHouseId($propId, Bll_Combo_HouseRelation::SITE_TYPE_JP); if (empty($propCombos)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '房源必须在套餐推广才能参与精选'); } } if (false == $propInfo['info']['isExquisite']) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '精品、新发15天房源才能参与精选推广', 'params' => array('site' => 'jp')); } $limitDay = intval(date('Ymd', strtotime('-15 days'))); $postDay = intval(date('Ymd', strtotime($propInfo['base']['createTime']))); if ($limitDay > $postDay) { return array('err_no' => self::BID_FAIL_QUALITY_OR_NEW, 'err_msg' => '精品、新发15天房源才能参与精选推广', 'params' => array('site' => 'jp')); } /** 获取板块信息 **/ $blockArr = Bll_House_JpHouseInfo::getBlock($propInfo['base']['houseType'], $propInfo['info']); if (!$blockArr['blockId'] && !$blockArr['newBlockId']) { return array('err_no' => self::BID_HOUSE_ALREADY_IN_BID, 'err_msg' => '房源缺少板块信息'); } /** 获取价格信息 **/ $arrPrice = Bll_House_JpHouseInfo::getPrice($cityId, $propInfo['base']['houseType'], $propInfo['info']); if (empty($arrPrice['price_id'])) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '缺少价格段信息'); } /** 获取点击单价开始 */ try { $apiParams = array('brokerId' => $ajkBrokerId, 'cityId' => $cityId, 'price' => $arrPrice['price'] ?: 0, 'blockId' => $blockArr['blockId'] ?: 0, 'newBlockId' => $blockArr['newBlockId'] ?: 0, 'houseType' => $propInfo['base']['houseType']); /** * @var Bll_Service_Client_HttpResponse $clickPrice */ for ($i = 0; $i < 3; $i++) { $clickPrice = Bll_Service_Choice::jpClickPrice($apiParams); if ($clickPrice->isSucceeded()) { break; } } if (!$clickPrice->isSucceeded() || $clickPrice['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-1000)'); } 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:-2000)'); } /** 防并发 */ if (false === self::rejectSameRequest(Bll_Plan_Bid_Choice::SITE_JP, $ajkBrokerId, $propId)) { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '系统繁忙(code:-906)'); } /** 往冻结队列里添加记录,获取request id*/ $bidFreezeOrder = new Bll_Plan_BidFreezeOrderNum(date('Y')); $ajk_user_id = Bll_Broker_MainBusiness::getDataByEsfId($ajkBrokerId)->memberId; $requestId = $bidFreezeOrder->getRequestId(Bll_Plan_BidFreezeOrderNum::JP, $ajk_user_id, date('Y'), 0, $propId); /** 冻结金额 **/ $freezeResult = self::bid_freeze($ajkBrokerId, $params['budget'] * 100, $requestId, sprintf('金铺精选房源冻结,房源ID是: %d', $propId), Const_PaymentApp::JP_CHOICE); /** 判断是否冻结成功 **/ $freezeResponse = $freezeResult->getResponse(); if (!$freezeResult->isSucceeded() || $freezeResponse['status'] == 'error') { return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => isset($freezeResult['info']) ? $freezeResult['info'] . "code:" . $freezeResult['code'] : '冻结金额失败'); } //检查是否有坑位 坑位+1 $bucketStatus = Model_Choice_JPBidBucket::incrementUsedNum($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); if (!$bucketStatus) { return array('err_no' => self::BID_WAIT_FAIL, 'err_msg' => '精选推广已满,请稍后再试'); } /** 获取最小竞价单元的精选信息 **/ $bucketInfo = Model_Choice_JPBidBucket::getBucketInfo($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); /** 根据最小竞价单位里面的房源数判断当前的房源应该是排队还是推广中 **/ /* if ($bucketInfo['usedNum'] > $bucketInfo['maxOnlineNum']) { $planStatus = Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD; } else { $planStatus = Model_Plan_Jp::ENUM_STATUS_ONLINE; } */ $planStatus = Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD; /** 如果计划已经存在删除该计划**/ if (isset($bidObj['status']) && $bidObj['status'] == 4) { Model_Plan_Jp::data_access()->set_field('isDelete', 1)->filter('id', $bidObj['id'])->update(); } /** 构造计划数据 创建计划**/ $planData = self::buildJpPlanData($cityId, $jpBrokerInfo['id'], $params['budget'], $freezeResult['data']['sn'], $propId, $blockArr['blockId'], $blockArr['newBlockId'], $arrPrice['price_id'], $propInfo['base']['houseType'], $planStatus); $planData['ajkBrokerId'] = $ajkBrokerId; $PlanObj = Model_Plan_Jp::create($planData); $PlanObj->save(); if (empty($PlanObj->id)) { /** 坑位-1 **/ Model_Choice_JPBidBucket::decrementUsedNum($blockArr['blockId'], $blockArr['newBlockId'], $propInfo['base']['houseType'], $arrPrice['price_id']); Model_Plan_Jp::data_access()->set_field('isDelete', 0)->filter('id', $bidObj['id'])->update(); return array('err_no' => self::BID_FAIL_OTHER, 'err_msg' => '创建计划失败'); } /** 更新房源里面的竞价计划id **/ $propInfo['base']->bidSpreadId = $PlanObj->id; $propInfo['base']->save(); /** 更新房源分表信息 **/ //$propInfo['info']->isList = 1; $propInfo['info']->spreadOffer = $clickPrice['realTradeAmount']; $propInfo['info']->spreadOfferTime = time(); $propInfo['info']->save(); /** 构建精选动作处理数据 **/ $choiceData = self::buildJpChoiceData($ajkBrokerId, Model_Choice_ActionQueue::ENUM_BEGIN_BY_HAND, $PlanObj->id, '经纪人手动推广', $propId); /** 插入到精选动作处理队列表 **/ Model_Choice_ActionQueue::create($choiceData, date('m'))->save(); $bidFreezeOrder->updateRequestComplete($requestId, $freezeResult['data']['sn'], $PlanObj->id); if ($bucketInfo['usedNum'] > $bucketInfo['maxOnlineNum']) { $rank = $bucketInfo['usedNum'] - $bucketInfo['maxOnlineNum']; return array('err_no' => self::BID_WAIT_SUCCESS, 'err_msg' => '精选排队成功', 'rank' => $rank); } else { return array('err_no' => self::BID_SHOW_SUCCESS, 'err_msg' => '精选推广成功'); } }
/** * 金铺精选推广 放弃排队 删除推广 放弃推广 动作 * 2-推广中 4-结束 6排队中 */ public static function spreadOperation($act, $id) { $result = array('status' => 'error'); $request = APF::get_instance()->get_request(); $ajkBlockId = $request->getBrokerId(); $jpBrokerInfo = Model_Broker_JpBroker::getJpBrokerInfoByAjkBrokerId($ajkBlockId); if (isset($act) && intval($id)) { $spreadInfo = Model_Plan_Jp::data_access()->filter('isDelete', 0)->filter('id', $id)->get_row(); if (!empty($spreadInfo) && $spreadInfo['memberId'] == $jpBrokerInfo->id) { switch ($act) { case 'delete': if ($spreadInfo['status'] == 4) { //删除计划ID Model_Plan_Jp::data_access()->set_field('isDelete', 1)->set_field('updateTime', date('Y-m-d H:i:s'))->filter('id', $id)->update(); //设置房源bidSpreadId为0 Model_House_JpHouseIdx::data_access()->set_field('bidSpreadId', 0)->filter('id', $spreadInfo['houseId'])->update(); $result = array('status' => 'ok'); } elseif ($spreadInfo['status'] == 3) { $result = array('status' => '该房源正在结算中,请稍后'); } else { $result = array('status' => '该房源正在推广或排队中'); } break; case 'stopQueue': case 'stopPlan': if ($spreadInfo['status'] == 3) { $result = array('status' => '该房源正在结算中,请稍后'); } elseif ($spreadInfo['status'] == 2 || $spreadInfo['status'] == 6) { $choiceData = Bll_Plan_Bid_Choice::buildJpChoiceData($ajkBlockId, Model_Choice_ActionQueue::ENUM_STOP_BY_HAND, $id, '停止精品推广', $spreadInfo['houseId']); if (1 != Model_Choice_ActionQueue::create($choiceData, date('m'))->save()) { $result = array('status' => '系统繁忙'); break; } //更新计划状态为计算中 $updatePlanStatus = Model_Plan_Jp::data_access()->set_field('status', Model_Plan_Jp::ENUM_STATUS_HOLD)->set_field('updateTime', date('Y-m-d H:i:s'))->filter('id', $id)->update(); if ($updatePlanStatus == 0) { $result = array('status' => '暂停计划失败'); break; } //设置房源bidSpreadId为0 $updateBidSpreadId = Model_House_JpHouseIdx::data_access()->set_field('bidSpreadId', 0)->filter('id', $spreadInfo['houseId'])->update(); if (1 != $updateBidSpreadId) { $result = array('status' => '暂停计划失败'); break; } //坑位表减一 Model_Choice_JPBidBucket::decrementUsedNum($spreadInfo['blockId'], $spreadInfo['newBlockId'], $spreadInfo['houseType'], $spreadInfo['priceId']); $result = array('status' => 'ok'); break; } default: break; } } } return $result; }
/** * 精选计划板块变更 * * @param array $queueInfo * @return array */ public static function houseBlockChange($queueInfo) { $choicePlanInfo = Model_Plan_Jp::getPlanInfoById($queueInfo['planId'], true); if (empty($choicePlanInfo)) { return self::buildReturn(0, '没有获取到计划'); } if ($choicePlanInfo['status'] != Model_Plan_Jp::ENUM_STATUS_ONLINE && $choicePlanInfo['status'] != Model_Plan_Jp::ENUM_STATUS_CHOICE_HOLD) { return self::buildReturn(1, sprintf('计划状态[%d]不处理', $choicePlanInfo['status'])); } /** 获取房源信息 */ $houseInfo = Model_House_JpHouseIdx::getHouseInfoById($choicePlanInfo['houseId']); if (empty($houseInfo)) { return self::buildReturn(0, sprintf('没有获取到房源[%d]信息', $choicePlanInfo['houseId'])); } if ($houseInfo['isDelete'] == Model_House_JpHouseIdx::ENUM_IS_DELETE_YES) { return self::buildReturn(0, sprintf('房源[%d]已经删除[%d]', $choicePlanInfo['houseId'], $houseInfo['isDelete'])); } /** 获取房源的板块id */ if (in_array($houseInfo['houseType'], array(Model_House_JpHouseIdx::ENUM_HOUSE_TYPE_OFFICE_RENT, Model_House_JpHouseIdx::ENUM_HOUSE_TYPE_OFFICE_SALE))) { $propertyInfo = Model_House_JpBuilding::getBuildingById($houseInfo['propertyId'], array('blockId')); } else { $propertyInfo = Model_House_JpProperty::getPropertyById($houseInfo['propertyId'], array('blockId', 'isRoad')); } $blockId = $propertyInfo['blockId']; /** 商铺自选房源精选板块ID从房源信息表里取 */ if (in_array($houseInfo['houseType'], array(Model_House_JpHouseIdx::ENUM_HOUSE_TYPE_SHOP_RENT, Model_House_JpHouseIdx::ENUM_HOUSE_TYPE_SHOP_SALE)) && $propertyInfo['isRoad'] == 1) { $houseTypeClass = Model_House_JpHouseIdx::getHouseTypeModelClass($houseInfo['houseType']); $extendHouseInfo = $houseTypeClass::getPropInfoById($houseInfo['id']); $blockId = $extendHouseInfo['blockId']; } /** 获取商圈ID */ $businessCycleId = Bll_House_JpHouseInfo::getBusinessCycleId($houseInfo['cityId'], $blockId, $houseInfo['houseType']); /** 更新计划的板块和商圈ID */ if (!Model_Plan_Jp::updatePlanBlockIdAndNewBlockIdById($choicePlanInfo['id'], $blockId, $businessCycleId)) { return self::buildReturn(0, sprintf('更新计划[%d]的板块[%d -> %d]和商圈[%d -> %d]id失败', $choicePlanInfo['id'], $choicePlanInfo['blockId'], $blockId, $choicePlanInfo['newBlockId'], $businessCycleId)); } if (!Model_Choice_JPBidBucket::getBucketInfo($blockId, $businessCycleId, $choicePlanInfo['houseType'], $choicePlanInfo['priceId'])) { Model_Choice_JPBidBucket::initBucketInfo($blockId, $businessCycleId, $choicePlanInfo['houseType'], $choicePlanInfo['priceId'], $choicePlanInfo['cityId']); } Model_Choice_JPBidBucket::incrementUsedNumEx($blockId, $businessCycleId, $choicePlanInfo['houseType'], $choicePlanInfo['priceId']); return self::buildReturn(1, sprintf('更新计划[%d]的板块[%d -> %d]和商圈[%d -> %d]id成功', $choicePlanInfo['id'], $choicePlanInfo['blockId'], $blockId, $choicePlanInfo['newBlockId'], $businessCycleId)); }
private static function extendChoiceMsg($out, $houseIds) { $result = array(); foreach ($houseIds as $houseId) { $houseInfo = $out['houses'][$houseId]; $choiceMsg = ''; if (empty($out['choiceHouseIds'][$houseId])) { //需要计算精选tip(可推广,可排队,已排满) /** 获取板块信息 **/ $blockArr = Bll_House_JpHouseInfo::getBlock($houseInfo['houseType'], (object) $houseInfo['info']); /** 获取价格信息 **/ $arrPrice = Bll_House_JpHouseInfo::getPrice($out['cityId'], $houseInfo['houseType'], (object) $houseInfo['info']); /** 获取最小竞价单元的精选信息 **/ $bidBucket = Model_Choice_JPBidBucket::getBucketInfo($blockArr['blockId'], $blockArr['newBlockId'], $houseInfo['houseType'], $arrPrice['price_id']); if ($bidBucket) { if ($bidBucket['usedNum'] < $bidBucket['maxOnlineNum']) { $choiceMsg = '可推广'; } elseif ($bidBucket['usedNum'] < $bidBucket['totalNum']) { $choiceMsg = '可排队'; } else { $choiceMsg = '已排满'; } } else { $choiceMsg = '可推广'; } } else { if ($out['choicePlans'][$houseId]['status'] == 2) { $choiceMsg = '推广中'; } elseif ($out['choicePlans'][$houseId]['status'] == 6) { $choiceMsg = '排队中'; } } $result[$houseId] = $choiceMsg; } return $result; }
/** * 初始化 坑位信息 * @param $blockId * @param $newBlockId * @param $houseType * @param $priceId * @param $cityId * @return array */ public static function initBucketInfo($blockId, $newBlockId, $houseType, $priceId, $cityId) { $bucketInfo['blockId'] = $blockId; $bucketInfo['newBlockId'] = $newBlockId; $bucketInfo['houseType'] = $houseType; $bucketInfo['priceId'] = $priceId; $bucketInfo['totalNum'] = Model_Choice_JPBidBucket::TOTALNUM; $bucketInfo['usedNum'] = Model_Choice_JPBidBucket::INIT_USENUM; $bucketInfo['maxOnlineNum'] = Model_Choice_JPBidBucket::MAXONLINENUM; $bucketInfo['cityId'] = $cityId; $bucketInfo['createTime'] = time(); $PlanObj = Model_Choice_JPBidBucket::create($bucketInfo); $PlanObj->save(); return $PlanObj; }
public static function updateBucketStatusAndHouseToSolr($spreadInfo, $brokerId = 0, $func = '', $reason = '') { $bidBucket = Model_Choice_JPBidBucket::getBucketInfo($spreadInfo->blockId, $spreadInfo->newBlockId, $spreadInfo->houseType, $spreadInfo->priceId); $limit = $bidBucket['totalNum']; $bidChoicePlan = Model_Plan_Jp::getBidChoicePlan($spreadInfo->blockId, $spreadInfo->newBlockId, $spreadInfo->priceId, $spreadInfo->houseType, $limit, $spreadInfo->memberId, $spreadInfo->cityId); $upHouse = $downHouse = array(); if ($bidChoicePlan && $bidBucket) { foreach ($bidChoicePlan as $i => $planInfo) { if ($i < $bidBucket['maxOnlineNum']) { if (6 == $planInfo->status) { //将计划状态改成 2 $planInfo->status = 2; $planInfo->save(); $params = array(); $params['houseId'] = $planInfo->houseId; $params['plan_id'] = $planInfo->id; $params['ajk_broker_id'] = $brokerId; $params['city_id'] = $spreadInfo->cityId; $params['type'] = 14; //13-精选排队中,14-精选推广,15-取消精选推广,16-取消精选排队 $params['changeType'] = self::$propLog[$func]['changeType']; $_remark = '由于' . $reason . ',导致房源:' . $planInfo->houseId . '上架'; self::writeHouseLogV2($params, $_remark); //房源上架tosolr Bll_House_JpHouseInfo::updateHouseToSolr(1, $planInfo->houseId, 1); //通知更新q_spread_bid_update表 计算竞价系数 Model_Plan_JpSpreadBidUpdate::setBidUpdateQ($planInfo->id); $upHouse[] = $planInfo->houseId; } } else { if (2 == $planInfo->status) { //将计划状态改成 6 $planInfo->status = 6; $planInfo->save(); $params = array(); $params['houseId'] = $planInfo->houseId; $params['plan_id'] = $planInfo->id; $params['ajk_broker_id'] = $brokerId; $params['city_id'] = $spreadInfo->cityId; $params['type'] = 15; //13-精选排队中,14-精选推广,15-取消精选推广,16-取消精选排队 $params['changeType'] = self::$propLog[$func]['changeType']; $_remark = '由于' . $reason . ',导致房源:' . $planInfo->houseId . '下架'; self::writeHouseLogV2($params, $_remark); //房源下架tosolr Bll_House_JpHouseInfo::updateHouseToSolr(1, $planInfo->houseId, 1); //通知更新q_spread_bid_update表 计算竞价系数 Model_Plan_JpSpreadBidUpdate::setBidUpdateQ($planInfo->id); $downHouse[] = $planInfo->houseId; } } } $remark = '由于' . $reason . ',导致商业地产精选推广'; if ($upHouse || $downHouse) { if ($upHouse) { $remark .= '上架房源:' . implode(',', $upHouse); } if ($downHouse) { $remark .= '下架房源:' . implode(',', $downHouse); } } else { $remark .= '暂无上下架房源'; } return $remark; } return $reason; }