/** * @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; }
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; }
/** * 获取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; } }