Exemplo n.º 1
0
 /**
  * @return array
  */
 public function handle_request_internal()
 {
     $brokerId = $this->_params['broker_id'];
     $deviceId = $this->_params['device_id'];
     // 升级提示
     $rushStartTime = APF::get_instance()->get_config('v2_rush_customer_consume_coupon_time', 'customer');
     if (time() >= strtotime($rushStartTime)) {
         return array('status' => 'error', 'message' => "抢客户功能大升级!快去最新版中体验吧!");
     }
     // 判断经纪人和客户之间关系是否存在(当日内)
     $relation = Model_Mobile_BrokerUserRelation::getBrokerCustomerTodayRelation($brokerId, $deviceId);
     if (!$relation) {
         throw new Exception_CustomerRush_RelationNotFound("BrokerId: {$brokerId}, CustomerId: {$deviceId}");
     }
     /** 判断经纪人和用户是否已经是有效的临时绑定关系 */
     if (Bll_Customer_BrokerUserRelation::checkBrokerUserRelationStatusIsBind($deviceId, $brokerId)) {
         return array('status' => 'ok', 'data' => array('success' => 1, 'description' => '经纪人和用户已经是锁定关系'));
     }
     if (false === Bll_Customer_Lock::checkBrokerCanBind($brokerId)) {
         return array('status' => 'ok', 'data' => array('success' => 0, 'description' => '经纪人锁定次数已经满3次了'));
     }
     if (false == Bll_Customer_Lock::checkUserCanBind($deviceId)) {
         return array('status' => 'ok', 'data' => array('success' => 0, 'description' => '用户锁定次数已经满3次了'));
     }
     /** 防并发 开始 */
     if (false === Bll_Customer_Parallel::lockBroker($brokerId)) {
         return array('status' => 'ok', 'data' => array('success' => 0, 'description' => '经纪人并发锁失败'));
     }
     if (false === Bll_Customer_Parallel::lockUser($deviceId)) {
         Bll_Customer_Parallel::unlockBroker($brokerId);
         return array('status' => 'ok', 'data' => array('success' => 0, 'description' => '用户并发锁失败'));
     }
     // 临时锁定,更新关系
     $relation->tempLock();
     // 临时锁定,更新锁定
     Model_Mobile_CustomerLock::tempLock($relation->id, $relation->uploadDt, $relation->brokerId, $relation->userDeviceId);
     Bll_Customer_Parallel::unlockBroker($brokerId);
     Bll_Customer_Parallel::unlockUser($deviceId);
     /** 防并发 结束 */
     $result = array('status' => 'ok', 'data' => array('success' => 1));
     return $result;
 }
Exemplo n.º 2
0
 public function handle_request_internal()
 {
     $brokerId = $this->_params['broker_id'];
     $deviceId = $this->_params['device_id'];
     $houseBody = $this->_params['house_body'];
     $modelBody = $this->_params['model_body'];
     $authToken = $this->_params['auth_token'];
     $sendPropMsgFault = array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('status' => self::SEND_PROP_MESSAGE_FAULT, 'house' => array('status' => 'error', 'msg_id' => 0, 'error_code' => 0, 'error_message' => '发送消息失败'), 'model' => array('status' => 'error', 'msg_id' => 0, 'error_code' => 0, 'error_message' => '发送消息失败')));
     if (false === Bll_Customer_Parallel::lockBroker($brokerId)) {
         $sendPropMsgFault['data']['description'] = '经纪人并发锁失败';
         return $sendPropMsgFault;
     }
     if (false == Bll_Customer_Parallel::lockUser($deviceId)) {
         Bll_Customer_Parallel::unlockBroker($deviceId);
         $sendPropMsgFault['data']['description'] = '用户并发锁失败';
         return $sendPropMsgFault;
     }
     $this->needReleaseLock = true;
     $brokerUserRelationInfo = Bll_Customer_BrokerUserRelation::getBrokerUserRelationInfo($deviceId, $brokerId);
     if ($brokerUserRelationInfo['status'] != Model_Mobile_BrokerUserRelation::STATUS_TMP_LOCKED) {
         $sendPropMsgFault['data']['description'] = '经纪人和用户不是锁定关系';
         return $sendPropMsgFault;
     }
     $brokerCanSendMsg = false;
     $tempLockTime = strtotime($brokerUserRelationInfo['tempLockTime']);
     if ($tempLockTime >= time() - Bll_Customer_Lock::BROKER_LOCK_EXPIRE) {
         $brokerCanSendMsg = true;
     } else {
         /** 这一段走不到这个状态 */
         $sendPropMsgFault['data']['status'] = self::SEND_PROP_MESSAGE_USER_EXPIRE;
         $sendPropMsgFault['data']['description'] = '用户锁定已过期';
     }
     /** TODO 判断用户是否设置了不可以打招呼 */
     $oRobUser = new Bll_Customer_RobUser();
     if (false == $oRobUser->checkIfUserChat($brokerUserRelationInfo['appName'], $brokerUserRelationInfo['userDeviceId2'], $brokerUserRelationInfo['guid'], $brokerUserRelationInfo['macId'])) {
         $sendPropMsgFault['data']['status'] = self::SEND_PROP_MESSAGE_USER_HAS_MAX_LOCK;
         $sendPropMsgFault['data']['description'] = '用户已被抢完';
         return $sendPropMsgFault;
     }
     /** 临时锁定过期以后,如果用户还没有被抢走且经纪人还可以抢 则发布房源成功 */
     if ($brokerCanSendMsg == false) {
         if (false == Bll_Customer_Lock::checkUserCanBind($deviceId)) {
             $sendPropMsgFault['data']['status'] = self::SEND_PROP_MESSAGE_USER_HAS_MAX_LOCK;
             $sendPropMsgFault['data']['description'] = '用户已被抢完';
             return $sendPropMsgFault;
         }
         if (false == Bll_Customer_Lock::checkBrokerCanBind($brokerId)) {
             $sendPropMsgFault['data']['status'] = self::SEND_PROP_MESSAGE_BROKER_HAS_MAX_LOCK;
             $sendPropMsgFault['data']['description'] = '今天您已抢满3次';
             return $sendPropMsgFault;
         }
         $brokerCanSendMsg = true;
     }
     /** 更新经纪人用户关系状态成功,对经纪人和用户的永久绑定次数做+1成功则 发送房源 */
     if ($brokerCanSendMsg && $this->lockCustomer($deviceId, $brokerId)) {
         /** TODO 发布房源 只要房源发送成功就OK 不管系统消息发送是否成功 */
         $sendPropMsgResult = $this->sendHouseMsg($authToken, $houseBody);
         if (strcasecmp($sendPropMsgResult['data']['status'], 'error') == 0) {
             $this->unlockCustomer($deviceId, $brokerId);
             $sendPropMsgFault['data']['description'] = '发送房源失败';
             $sendPropMsgFault['data']['status'] = self::SEND_PROP_MESSAGE_FAULT;
             $sendPropMsgFault['data']['house']['message_id'] = $sendPropMsgResult['data']['result']['msg_id'];
             $sendPropMsgFault['data']['house']['error_code'] = $sendPropMsgResult['data']['errorCode'];
             $sendPropMsgFault['data']['house']['error_message'] = $sendPropMsgResult['data']['errorMessage'];
             return $sendPropMsgFault;
         }
         $sendModelMsgResult = $this->sendHouseMsg($authToken, $modelBody);
         return array('status' => Const_APIStatus::RETURN_CODE_OK, 'data' => array('status' => self::SEND_PROP_MESSAGE_SUCCESS, 'house' => array('status' => 'ok', 'message_id' => $sendPropMsgResult['data']['result']['msg_id'], 'error_code' => $sendPropMsgResult['data']['errorCode'], 'error_message' => $sendPropMsgResult['data']['errorMessage']), 'model' => array('status' => strtolower($sendModelMsgResult['data']['status']), 'message_id' => $sendModelMsgResult['data']['result']['msg_id'], 'error_code' => $sendModelMsgResult['data']['errorCode'], 'error_message' => $sendModelMsgResult['data']['errorMessage'])));
     }
     return $sendPropMsgFault;
 }
Exemplo n.º 3
0
 /**
  * 获取app用户状态
  *
  * @param $deviceId
  * @param $brokerId
  * @return
  */
 public function getAppUserStatus($deviceId, $brokerId, $relationRecord = false, $ignoreBrokerFull = false)
 {
     if (empty($deviceId) || empty($brokerId)) {
         $this->errorMsg = "参数错误";
         return self::PARAMS_ERROR;
     }
     try {
         if ($relationRecord === false) {
             $relationRecord = $this->getUserBrokerTodayRelation($deviceId, $brokerId);
         }
         if (empty($relationRecord)) {
             $this->errorMsg = "关系不存在";
             return self::NO_RELATION_ERROR;
         }
         //判断用户是否可以打招呼
         if (!$this->checkIfUserChat($relationRecord->appName, $relationRecord->userDeviceId2, $relationRecord->guid, $relationRecord->macId)) {
             return Const_RobUser::USER_STATUS_OTHER_ROBED;
         }
         //判断是否被对应经纪人抢到
         if ($this->ifRelationRealRobed($relationRecord->status)) {
             return Const_RobUser::USER_STATUS_SELF_ROBED;
         }
         //判断是否被对应经纪人锁定
         if ($this->ifRelationTmpLocked($relationRecord->status, $relationRecord->tempLockTime)) {
             return Const_RobUser::USER_STATUS_LOCKED;
         }
         //判断经纪人是否可以抢用户
         if (!$ignoreBrokerFull) {
             if (!Bll_Customer_Lock::checkBrokerCanBind($brokerId)) {
                 return Const_RobUser::BROKER_STATUS_FULL;
             }
         }
         //获取用户是否已被抢三次(抢或者临时锁定)
         if (!Bll_Customer_Lock::checkUserCanBind($deviceId)) {
             return Const_RobUser::USER_STATUS_OTHER_ROBED;
         }
         return Const_RobUser::USER_STATUS_NO_ROBED;
     } catch (Exception $e) {
         $this->errorMsg = $e->getMessage();
         return self::UNKNOW_ERROR;
     }
 }
Exemplo n.º 4
0
 /**
  * 获取api状态
  * 0-可以被抢 1-已被对应经纪人抢走 2-被其他经纪人抢走 3-用户不允许打招呼  4-被对应经纪人锁定
  * @param $customer
  * @return int
  */
 public static function getApiStatusFrom($customer)
 {
     $apiStatus = Const_RobUser::USER_STATUS_NO_ROBED;
     $status = $customer['status'];
     $updateTime = $customer['updateTime'];
     $recommendSwitch = isset($customer['recommendSwitch']) ? $customer['recommendSwitch'] : 1;
     $userDeviceId = $customer['userDeviceId'];
     if ($recommendSwitch) {
         // 用户可否打招呼
         $apiStatus = Const_RobUser::USER_STATUS_OTHER_ROBED;
     } elseif (self::isSelfRobed($status)) {
         // 是否被自己抢到
         $apiStatus = Const_RobUser::USER_STATUS_SELF_ROBED;
     } elseif (self::isSelfTmpLocked($status, $updateTime)) {
         // 是否被自己锁定
         $apiStatus = Const_RobUser::USER_STATUS_LOCKED;
     } else {
         if (Bll_Customer_Lock::checkUserCanBind($userDeviceId)) {
             // 是否可抢
             $apiStatus = Const_RobUser::USER_STATUS_NO_ROBED;
         } else {
             // 是否被他人抢完
             $apiStatus = Const_RobUser::USER_STATUS_OTHER_ROBED;
         }
     }
     return $apiStatus;
 }