253 lines
7.6 KiB
PHP
253 lines
7.6 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: zn
|
|
* Date: 2017/6/2
|
|
* Time: 10:01
|
|
*/
|
|
|
|
namespace common\services;
|
|
|
|
use common\models\Farm;
|
|
use common\models\User;
|
|
use common\models\UserInfo;
|
|
use common\modules\achievement\AchievementUtil;
|
|
use common\modules\dailytask\DailyTaskUtil;
|
|
use common\modules\rebate\RebateUtil;
|
|
use common\modules\safe\SafeUtil;
|
|
use common\modules\systemlog\SystemLog;
|
|
use common\modules\systemlog\SystemLogUtil;
|
|
use common\utils\CommUtil;
|
|
use common\utils\MoneyUtil;
|
|
use common\utils\RedisKeyUtil;
|
|
use RedisLock\RedisLock;
|
|
use Yii;
|
|
use yii\base\Object;
|
|
|
|
/**用户模型帮助类
|
|
* Class UserService
|
|
* @package common\services
|
|
*/
|
|
class UserService extends Object
|
|
{
|
|
/**
|
|
* 保存用户登录信息
|
|
* @param User $userDbData
|
|
*/
|
|
public static function saveUserInfo(User $userDbData)
|
|
{
|
|
$userInfo = new UserInfo();
|
|
$userInfo->userID = $userDbData->id;
|
|
$userInfo->username = $userDbData->username;
|
|
$userInfo->token = $userDbData->token;
|
|
$userInfo->save();
|
|
}
|
|
|
|
/**
|
|
* 登出
|
|
* @param $userID
|
|
* @internal param $phone
|
|
*/
|
|
public static function loginOut($userID)
|
|
{
|
|
$userInfo = UserInfo::loadByUserID($userID);
|
|
if (empty($userInfo)) return;
|
|
|
|
$userInfo->delete();
|
|
}
|
|
|
|
/**
|
|
* 用户是否在线
|
|
* @param $userID
|
|
* @return bool
|
|
*/
|
|
public static function isOnline($userID)
|
|
{
|
|
$userInfo = UserInfo::loadByUserID($userID);
|
|
if (empty($userInfo)) return false;
|
|
|
|
if (empty($userInfo->fd)) return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 判断并修改更改金钱
|
|
* isAdd 是否为添加操作
|
|
* @param $userID
|
|
* @param $isAdd
|
|
* @param $gold
|
|
* @param $gem
|
|
* @param SystemLog $log
|
|
* @return bool|int
|
|
*/
|
|
public static function checkAndModifyMoney($userID, $isAdd, $gold, $gem, SystemLog $log)
|
|
{
|
|
|
|
//正负验证
|
|
if ($isAdd && ($gold < 0 || $gem < 0)) return ResultStatusServices::RS_PARAM_ERROR;
|
|
if (!$isAdd && ($gold > 0 || $gem > 0)) return ResultStatusServices::RS_PARAM_ERROR;
|
|
|
|
//加锁
|
|
$lock = new RedisLock(Yii::$app->redis, RedisKeyUtil::lockUser($userID), RedisLock::FLAG_CATCH_EXCEPTIONS);
|
|
if (!$lock->acquire(10)) return ResultStatusServices::RS_SAME_TIME_OPERATION;
|
|
|
|
try {
|
|
//获取用户信息
|
|
|
|
$userDbData = User::findById($userID, false);
|
|
if (!$userDbData) return ResultStatusServices::RS_NOT_FIND_USER;
|
|
|
|
//修改金钱
|
|
$userDbData->gold += $gold;
|
|
$userDbData->score += $gem;
|
|
|
|
if ($userDbData->gold < 0) return ResultStatusServices::RS_GOLD_NOT_ENOUGH;
|
|
if ($userDbData->score < 0) return ResultStatusServices::RS_GEM_NOT_ENOUGH;
|
|
|
|
//保存
|
|
if (!$userDbData->save(true, ['gold', 'score', 'updated_at'])) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
|
|
|
if (!$log->save()) return ResultStatusServices::RS_SAVE_DB_ERROR;
|
|
|
|
if ($gem != 0) {
|
|
//任务记录
|
|
DailyTaskUtil::addTaskCount($userID, DailyTaskUtil::TYPE_EXPEND_GEM, null, 1);
|
|
}
|
|
|
|
} finally {
|
|
//解锁
|
|
$lock->release();
|
|
}
|
|
|
|
return ResultStatusServices::RS_OPERATION_SUCCESS;
|
|
}
|
|
|
|
|
|
/**
|
|
* @param User $userDbData
|
|
* @return bool
|
|
*/
|
|
public static function initNewUserDataAndSave(User $userDbData, $introduceUserID)
|
|
{
|
|
return SafeUtil::dbOperate(function (User $userDbData, $introduceUserID) {
|
|
$userDbData->gold = GameConfigServices::getParamByPath('init.1.gold', 0);//金币
|
|
$userDbData->gem = GameConfigServices::getParamByPath('init.1.gem', 0);//钻石
|
|
|
|
// //使用默认小狗
|
|
// $dogItemID = GameConfigServices::getParamByPath('init.1.dog_item_id', 0);//默认小狗
|
|
// $dogItemConfig = GameConfigServices::getParamByPath('item_list.' . $dogItemID);
|
|
// if (!empty($dogItemConfig)) $userDbData->use_dog_item_id = $dogItemID;
|
|
|
|
//推荐码
|
|
$userDbData->introduce_code = substr(md5(uniqid('', false)), 8, 16);
|
|
|
|
//保存user
|
|
if (!$userDbData->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
|
|
$userDbData->introduce_code = $userDbData->id;
|
|
if (!$userDbData->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
|
|
|
|
if (!empty($introduceUserID)) RebateUtil::createUserRebates($userDbData->id, $introduceUserID);
|
|
|
|
//新建农场
|
|
$farm = new Farm();
|
|
FarmService::initNewFarmDataAndSave($farm, $userDbData->id);
|
|
|
|
// //向仓库添加默认小狗
|
|
// if (!empty($dogItemConfig)) {
|
|
// $item = new Item();
|
|
// $item->user_id = $userDbData->id;
|
|
// $item->item_id = $dogItemID;
|
|
// $item->name = $dogItemConfig['name'];
|
|
// $item->type = $dogItemConfig['type2'];
|
|
// if (!$item->save()) return 0;
|
|
// }
|
|
|
|
//初始送物品
|
|
$configItemList = GameConfigServices::getParamByPath('init.1.item_list');
|
|
|
|
if ($configItemList != null) {
|
|
foreach ($configItemList as $configItem) {
|
|
$itemID = $configItem['item_id'];
|
|
$num = (int)$configItem['num'];
|
|
if ($num == 0) continue;
|
|
|
|
$log = SystemLogUtil::get($userDbData->id, SystemLogUtil::TYPE_ITEM, $itemID, $num, SystemLogUtil::FROM_TYPE_INIT_USER, []);
|
|
MoneyUtil::checkAndModifyNum($userDbData->id, $itemID, true, $num, $log);
|
|
}
|
|
}
|
|
|
|
return $userDbData->id;
|
|
}, [$userDbData, $introduceUserID]);
|
|
}
|
|
|
|
/**
|
|
* 狗狗饥饿剩余时间
|
|
* @param User $userDbData
|
|
* @return int
|
|
*/
|
|
public static function getDogHungerRemainingTime(User $userDbData)
|
|
{
|
|
$remainingTime = $userDbData->dog_hunger_end_time - time();
|
|
return $remainingTime > 0 ? $remainingTime : 0;
|
|
}
|
|
|
|
public static function getUserNickName($userID)
|
|
{
|
|
$userDbData = User::findById($userID);
|
|
if (empty($userDbData)) return "";
|
|
|
|
return $userDbData->nickname;
|
|
}
|
|
|
|
public static function getOnlineInfo($userID)
|
|
{
|
|
$info = null;
|
|
$infoStr = Yii::$app->redis->get(RedisKeyUtil::onlineInfo($userID));
|
|
if (!empty($infoStr)) {
|
|
$info = json_decode($infoStr, true);
|
|
}
|
|
|
|
if (empty($info)) {
|
|
$info['start_time'] = 0;
|
|
$info['last_time'] = 0;
|
|
$info['total_time'] = 0;
|
|
$info['get_count'] = 0;
|
|
}
|
|
|
|
if (CommUtil::dayStr($info['start_time']) != CommUtil::dayStr(time())) {
|
|
$info['start_time'] = time();
|
|
$info['last_time'] = time();
|
|
$info['total_time'] = 0;
|
|
$info['get_count'] = 0;
|
|
}
|
|
|
|
return $info;
|
|
}
|
|
|
|
public static function updateOnlineInfo($userID)
|
|
{
|
|
$time = time();
|
|
|
|
$info = self::getOnlineInfo($userID);
|
|
$disTime = $time - intval($info['last_time']);
|
|
if ($disTime > 120) {
|
|
$info['last_time'] = $time;
|
|
} else {
|
|
$info['last_time'] = $time;
|
|
$info['total_time'] += $disTime;
|
|
}
|
|
|
|
self::saveOnlineInfo($userID, $info);
|
|
|
|
return $info;
|
|
}
|
|
|
|
public static function saveOnlineInfo($userID, $info)
|
|
{
|
|
$str = json_encode($info);
|
|
Yii::$app->redis->set(RedisKeyUtil::onlineInfo($userID), $str);
|
|
}
|
|
}
|