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