Beispiel #1
0
 /**
  * 逻辑
  * 插入前,判断 排名 < 1000,执行插入。
  * 插入后,判断 排名 < 1000,更新总数;否则,删除。
  */
 public function handle_request()
 {
     $apf = APF::get_instance();
     $request = $apf->get_request();
     $response = $apf->get_response();
     $cache = APF_Cache_Factory::get_instance()->get_memcache();
     // CurrentRoundTime & NextRoundTime
     $currentRoundTime = null;
     $nextRoundTime = null;
     $startDate = Util_Christmas::hammerRushStartDate();
     $endDate = Util_Christmas::hammerRushEndDate();
     if (!Util_Christmas::hammerRushStarted()) {
         $currentRoundTime = null;
         $nextRoundTime = date("{$startDate} 10:00:00");
     } elseif (!Util_Christmas::hammerRushEnded()) {
         $currentHour = date('H');
         if ($currentHour < 10) {
             if (date('Y-m-d') != $startDate) {
                 $currentRoundTime = date('Y-m-d 18:00:00', strtotime('-1 day'));
             }
             $nextRoundTime = date('Y-m-d 10:00:00');
         } elseif ($currentHour >= 10 && $currentHour < 14) {
             $currentRoundTime = date('Y-m-d 10:00:00');
             $nextRoundTime = date('Y-m-d 14:00:00');
         } elseif ($currentHour >= 14 && $currentHour < 18) {
             $currentRoundTime = date('Y-m-d 14:00:00');
             $nextRoundTime = date('Y-m-d 18:00:00');
         } elseif ($currentHour >= 18) {
             $currentRoundTime = date('Y-m-d 18:00:00');
             if (date('Y-m-d') != $endDate) {
                 $nextRoundTime = date('Y-m-d 10:00:00', strtotime('+1 day'));
             }
         }
     }
     // IsRushable
     $isRushable = false;
     // 当前在可抢时间范围内
     if ($currentRoundTime && time() < strtotime($currentRoundTime) + 30 * 60) {
         $isRushable = true;
     }
     // 当前可抢开关
     $result = $cache->get(Util_Christmas::hammerIsRushableCacheKey($currentRoundTime));
     if ($result !== FALSE) {
         $isRushable = (bool) $result;
     }
     try {
         // Not Rushable
         if (!$isRushable) {
             throw new Exception_ChristmasException('Not rushable.', self::CODE_FAILED);
         }
         // 判断活动是否已开始
         if (!Util_Christmas::hammerRushStarted()) {
             throw new Exception_ChristmasException('Hammer rush is not started.', self::CODE_NOT_START);
         }
         // 判断活动是否已结束
         if (Util_Christmas::hammerRushEnded()) {
             throw new Exception_ChristmasException('Hammer rush is ended.', self::CODE_ENDED);
         }
         // 判断经纪人是否已经登陆
         if (!$this->isBrokerLogin()) {
             throw new Exception_ChristmasException('Login first.', self::CODE_NOT_LOGIN);
         }
         // 获取经纪人详情
         self::$BrokerInfo = Bll_BrokerBaseBll::get_instance()->get_broker_info(self::$intBrokerID);
         $brokerId = self::$BrokerInfo['BaseInfo'][strtoupper('brokerid')];
         $userId = self::$BrokerInfo['BaseInfo'][strtoupper('userId')];
         // 判断经纪人是否通过双证验证
         if (self::$BrokerInfo['BaseInfo'][strtoupper('checkstate')] == 0) {
             throw new Exception_ChristmasException('Check state first.', self::CODE_NOT_CHECK_STATE);
         }
         // 插入前,判断是否本轮是否已经抢过
         try {
             $hammerLog = Model_Christmas_HammerLog::data_access()->force_master()->filter_by_op('brokerId', '=', $brokerId)->filter_by_op('type', '=', Model_Christmas_HammerLog::TYPE_HAMMER_RUSH)->filter_by_op('createdAt', '>=', $currentRoundTime)->find_one();
         } catch (Exception $e) {
             $hammerLog = false;
         }
         if ($hammerLog) {
             throw new Exception_ChristmasException('Already rushed.', self::CODE_RUSHED);
         }
         // 经纪人添加1把锤子
         $hammerLog = new Model_Christmas_HammerLog();
         $hammerLog->brokerId = $brokerId;
         $hammerLog->type = Model_Christmas_HammerLog::TYPE_HAMMER_RUSH;
         $hammerLog->number = 1;
         $hammerLog->memo = '整点抢锤子';
         $hammerLog->createdAt = date('Y-m-d H:i:s');
         $hammerLog->updatedAt = $hammerLog->createdAt;
         $hammerLog->save();
         // 本轮有效锤子数
         $hammerRoundNumber = 1000;
         // 插入后,判断 排名 < 1000,更新总数;否则,删除。
         $rank = $this->current_round_rank($hammerLog->id, $currentRoundTime);
         if ($rank >= $hammerRoundNumber) {
             $hammerLog->delete();
             $isRushable = false;
             $cache->set(Util_Christmas::hammerIsRushableCacheKey($currentRoundTime), false);
             throw new Exception_ChristmasException('Not rushed.', self::CODE_FAILED);
         }
         // 更新经纪人总锤子
         $brokerHammer = Model_Christmas_BrokerHammer::incrBrokerHammerNumber($brokerId, 1);
         // 发送系统消息
         $messages = Util_Christmas::messages();
         if (isset($messages[Model_Christmas_HammerLog::TYPE_HAMMER_RUSH])) {
             Bll_Service_Message::sendSystem(array('receiverIds' => $userId, 'message' => $messages[Model_Christmas_HammerLog::TYPE_HAMMER_RUSH]));
         }
         $result = array('code' => self::CODE_SUCCESS, 'message' => 'Success.', 'number' => $brokerHammer->number, 'currentTime' => strtotime($currentRoundTime) * 1000, 'nextTime' => $isRushable ? strtotime($currentRoundTime) * 1000 : strtotime($nextRoundTime) * 1000, 'isRushable' => intval($isRushable));
     } catch (Exception_ChristmasException $e) {
         $result = array('code' => $e->getCode(), 'message' => $e->getMessage(), 'nextTime' => $isRushable ? strtotime($currentRoundTime) * 1000 : strtotime($nextRoundTime) * 1000, 'isRushable' => intval($isRushable), 'isLogin' => intval($this->isBrokerLogin()), 'loginUrl' => Uri_ChristmasUrl::login_url(Uri_ChristmasUrl::hammer_url()));
     } catch (Exception $e) {
         // 500 Error
         // http_response_code('500');
         $result = array('code' => '500', 'message' => 'Server Error.');
     }
     $response->set_content_type('application/json', 'UTF-8');
     $response->add_header('Cache-Control', 'no-cache, no-store, must-revalidate');
     $response->add_header('Pragma', 'no-cache');
     $response->add_header('Expires', 0);
     echo json_encode($result);
     die;
 }
Beispiel #2
0
 /**
  * 执行获奖
  * @param $prize_type
  * return
  */
 function do_win_prize($prize_type)
 {
     //先插入获奖日志
     $prize_log_obj = $this->write_prize_log($prize_type, self::$intBrokerID, self::$BrokerInfo['TRUENAME'], self::$BrokerInfo['USERMOBILE'], self::$BrokerInfo['CITYID']);
     //获取获奖总数量
     $cur_prize_num = Model_Christmas_PrizeLog::get_win_prize_num($prize_type, '', $prize_log_obj->id);
     //获取当前能够得到的奖品上限
     $provide_prize_num = $this->get_provide_prize_num($prize_type);
     //再取出判断是否超过奖品数量上限
     if ($cur_prize_num <= $provide_prize_num) {
         //发送获奖信息
         $this->send_msg($prize_type);
         //如果中奖的是再来一把锤子则给经纪人加锤子
         if ($prize_type == 8) {
             //加锤子
             Model_Christmas_BrokerHammer::incrBrokerHammerNumber(self::$intBrokerID, 1);
             //写使用锤子日志
             $this->write_hammer_log(self::$intBrokerID, 1, '砸蛋奖锤子');
         }
         $PRIZE_N_STATUS = "PRIZE_{$prize_type}_STATUS";
         $PRIZE_N_INFO = "PRIZE_{$prize_type}_INFO";
         echo json_encode(array("success" => true, "status" => self::${$PRIZE_N_STATUS}, "info" => self::${$PRIZE_N_INFO}));
         exit;
     } else {
         //如果超出上限,则删除
         $prize_log_obj->delete();
         echo json_encode(array("success" => true, "status" => self::$NO_PRIZE_STATUS));
         exit;
     }
 }
 /**
  * 积分换锤子
  *
  * @param $brokerId
  * @param $number
  *
  * @return Model_Christmas_BrokerHammer
  */
 public static function incrBrokerHammerForGrade($brokerId, $number = 1)
 {
     // 创建锤子日志
     $hammerLog = new Model_Christmas_HammerLog();
     $hammerLog->brokerId = $brokerId;
     $hammerLog->type = Model_Christmas_HammerLog::TYPE_GRADE_EXCHANGE;
     $hammerLog->number = $number;
     $hammerLog->memo = '积分换锤子';
     $hammerLog->createdAt = date('Y-m-d H:i:s');
     $hammerLog->updatedAt = $hammerLog->createdAt;
     $hammerLog->save();
     // 更新锤子总数
     $brokerHammer = Model_Christmas_BrokerHammer::incrBrokerHammerNumber($brokerId, $number);
     return $brokerHammer;
 }