hy-farm/muchang/common/services/UserService.php
2026-05-29 19:54:56 +08:00

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);
}
}