hy-farm/muchang/common/modules/dailytask/DailyTaskUtil.php
2026-05-29 19:54:56 +08:00

257 lines
8.6 KiB
PHP

<?php
/**
* Created by PhpStorm.
* User: zn
* Date: 2017/8/9
* Time: 11:51
*/
namespace common\modules\dailytask;
use common\modules\achievement\AchievementUtil;
use common\modules\dailytask\vo\DailyTask;
use common\modules\safe\SafeUtil;
use common\modules\systemlog\SystemLogUtil;
use common\services\GameConfigServices;
use common\services\ResultStatusServices;
use common\services\StatusException;
use common\utils\CommUtil;
use common\utils\MoneyUtil;
use common\utils\RedisKeyUtil;
use Yii;
/**
* 日常任务
* Class
*/
class DailyTaskUtil
{
const GIFT_NOT_GET = 0;//未领取奖励
const GIFT_GET = 1;//已领取奖励
const GIFT_GET_LIST = [
self::GIFT_NOT_GET,
self::GIFT_GET,
];
const TYPE_SIGN = 1;//每天签到?次
const TYPE_LOTTERY_DRAW = 2;//开启?次大转盘,进行抽奖
const TYPE_PLEASURE_GROUND = 3;//进入?次游乐场
const TYPE_GET_ONLINE_GIFT = 4;//领取?次在线礼包
const TYPE_ENTER_GYMKHANA = 5;//挑战?次竞技场玩家
const TYPE_SOW_SEEDS = 6;//勤劳播种,每天进行?次播种
const TYPE_GET_DAY_OR_WEEK_CARD_GIFT = 7;//领取?次周卡或月卡奖励
const TYPE_STEAL = 8;//掠夺?次玩家资源
const TYPE_FEED_PET = 9;//喂养?次宠物
const TYPE_EXPEND_GEM = 10;//消耗?钻石
const TYPE_BUY = 12;//购买?次?
const TYPE_COMPOSE = 13;//合成?物品
const TYPE_SELL_FRUIT = 14;//出售?次果实
const TYPE_UPGRADE_FACTORY = 15;//升级?次加工厂
const TYPE_PAY_GOLD = 18;//充值?次金币
const TYPE_MAKE = 19;//加工?次?
const TYPE_TRAIN_PET_ATTACK = 20;//提升?次战宠攻击力
const TYPE_TRAIN_PET_ANTI = 21;//提升?次战宠防御力
const TYPE_TRAIN_PET_BLOOD = 22;//提升?次战宠血量
const TYPE_TRAIN_PET_DODGE = 23;//提升?次战宠闪避
const TYPE_TRAIN_PET_CRIT = 24;//提升?次战宠暴击
const TYPE_LAND_WATER = 25;//勤劳农作,每天进行?次浇水
const TYPE_LAND_BUG = 26;//勤劳农作,每天进行?次杀虫
const TYPE_LAND_FER = 27;//勤劳农作,每天进行?次施肥
const TYPE_LAND_GRASS = 28;//勤劳农作,每天进行?次除草
const TYPE_LAND_GATHER = 29;//勤劳农作,每天进行?次收割
const TYPE_PAY_GEM = 30;//充值?次钻石
const TYPE_STEAL_SUCCESS = 31;//掠夺玩家并成功偷取?次果实。
const TYPE_ENTER_GYMKHANA_SUCCESS = 32;//战胜?次竞技场玩家
const TYPE_LIST = [
self::TYPE_SIGN,
self::TYPE_LOTTERY_DRAW,
self::TYPE_PLEASURE_GROUND,
self::TYPE_GET_ONLINE_GIFT,
self::TYPE_ENTER_GYMKHANA,
self::TYPE_SOW_SEEDS,
self::TYPE_GET_DAY_OR_WEEK_CARD_GIFT,
self::TYPE_STEAL,
self::TYPE_FEED_PET,
self::TYPE_EXPEND_GEM,
self::TYPE_BUY,
self::TYPE_COMPOSE,
self::TYPE_SELL_FRUIT,
self::TYPE_UPGRADE_FACTORY,
self::TYPE_PAY_GOLD,
self::TYPE_MAKE,
self::TYPE_TRAIN_PET_ATTACK,
self::TYPE_TRAIN_PET_ANTI,
self::TYPE_TRAIN_PET_BLOOD,
self::TYPE_TRAIN_PET_DODGE,
self::TYPE_TRAIN_PET_CRIT,
self::TYPE_LAND_WATER,
self::TYPE_LAND_BUG,
self::TYPE_LAND_FER,
self::TYPE_LAND_GRASS,
self::TYPE_LAND_GATHER,
self::TYPE_PAY_GEM,
self::TYPE_STEAL_SUCCESS
];
public static function createTask($userID, $config, $expireTime)
{
$task = new DailyTask();
$task->user_id = $userID;
$task->config_id = $config['id'];
$task->name = $config['content'];
$task->type = $config['type'];
if (isset($config['item_id'])) $task->item_id = $config['item_id'];
$task->max_item_num = (int)$config['item_num'];
$task->expire_time = $expireTime;
return $task;
}
public static function oddsTask($index)
{
$configList = GameConfigServices::getParamByPath('daily_list');
$list = [];
foreach ($configList as $config) {
if (intval($config['daily_type']) == $index) {
array_push($list, $config);
}
}
$config = CommUtil::oddsOne($list, 'odds');
return $config;
}
/**
* 重置每日任务
* @param $userID
* @throws StatusException
*/
private static function resetTask($userID)
{
$lastCreateTaskDay = Yii::$app->redis->get(RedisKeyUtil::lastCreateTaskDay($userID));
$dayStr = CommUtil::dayStr(time());
if ($lastCreateTaskDay == $dayStr) return;
//清理任务
$dayTime = CommUtil::getDayTime(time());
DailyTask::cleanExpireByUserID($userID, $dayTime);
$expireTime = CommUtil::getDayTime(time() + 3600 * 24);
//创建固定任务
$configList = GameConfigServices::getParamByPath('daily_list');
foreach ($configList as $config) {
if (intval($config['daily_type']) == 0) {
$task = self::createTask($userID, $config, $expireTime);
if (!$task->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
}
}
//创建随机任务
$index = 1;
while (true) {
$config = self::oddsTask($index);
if (empty($config)) break;
$task = self::createTask($userID, $config, $expireTime);
// \Yii::warning($task->geterrors());
// if (!$task->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
$index++;
}
Yii::$app->redis->set(RedisKeyUtil::lastCreateTaskDay($userID), $dayStr, 3600 * 24);
}
public static function getTaskList($userID)
{
return SafeUtil::dbOperate(function ($userID) {
return SafeUtil::redisLockOperate(function ($userID) {
self::resetTask($userID);
$dbList = DailyTask::findAllByUserID($userID);
$list = [];
foreach ($dbList as $item) {
array_push($list, $item->toArray());
}
return $list;
}, [$userID], RedisKeyUtil::lockDailyTask($userID));
}, [$userID]);
}
/**增加完成次数
* @param $userID
* @param $type
* @param $itemID
* @param $addCount
*/
public static function addTaskCount($userID, $type, $itemID, $addCount)
{
SafeUtil::dbOperate(function ($userID, $type, $itemID, $addCount) {
// SafeUtil::redisLockOperate(function ($userID, $type, $itemID, $addCount) {
self::resetTask($userID);
$addCount = (int)$addCount;
if ($addCount <= 0) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
$taskList = DailyTask::findAllByUserIDAndParam($userID, $type, $itemID);
foreach ($taskList as $task) {
$task->item_num += $addCount;
if ($task->item_num > $task->max_item_num) {
$task->item_num = $task->max_item_num;
//成就
if ($type == self::TYPE_SOW_SEEDS) AchievementUtil::addCount($userID, AchievementUtil::ID_SOW_SEEDS, 1);
}
if (!$task->save(true, ['item_num', 'updated_at'])) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
}
// }, [$userID, $type, $itemID, $addCount], RedisKeyUtil::lockDailyTask($userID));
}, [$userID, $type, $itemID, $addCount]);
}
/**
* 获取任务奖励
* @param $userID
* @param $taskID
*/
public static function getTaskGift($userID, $taskID)
{
SafeUtil::dbOperate(function ($userID, $taskID) {
SafeUtil::redisLockOperate(function ($userID, $taskID) {
self::resetTask($userID);
$task = DailyTask::findByID($taskID);
if (empty($task) || $task->is_get_gift == self::GIFT_GET || $task->user_id != $userID) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
$config = GameConfigServices::getParamByPath('daily_list.' . $task->config_id);
if (empty($config)) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR);
MoneyUtil::parseItem($config['goldcurrency_id'], 1, true, $userID, SystemLogUtil::FROM_TYPE_TASK_GIFT, ['config' => $config]);
MoneyUtil::addUserExp($userID, $config['experience']);
$task->is_get_gift = self::GIFT_GET;
if (!$task->save(true, ['is_get_gift', 'updated_at'])) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR);
}, [$userID, $taskID], RedisKeyUtil::lockDailyTask($userID));
}, [$userID, $taskID]);
}
}