user_id = $userID; $ach->config_id = $configID; $ach->name = $config['name']; $ach->content = $config['content']; return $ach; } /** * 更新徽章成就 */ private static function updateAchCount($userID) { $allList = Achievement::findAllByUserID($userID); $count = 0; $ach = null; foreach ($allList as $item) { if ($item->config_id == self::ID_ACHIEVEMENT_COUNT) { $ach = $item; continue; } list($maxCount, $temp1, $temp2, $temp3) = self::parseConfig($item->config_id, $item->level); if ($item->count == $maxCount) $count++; } if (empty($ach)) $ach = self::createAch($userID, self::ID_ACHIEVEMENT_COUNT); $ach->count = $count; list($maxCount, $temp1, $temp2, $temp3) = self::parseConfig($ach->config_id, $ach->level); if ($ach->count > $maxCount) $ach->count = $maxCount; if (!$ach->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR); } public static function getList($userID) { $dbList = Achievement::findAllByUserID($userID); $list = []; foreach ($dbList as $item) { array_push($list, $item->toArray()); } return $list; } /** * 计数 * @param $userID * @param $configID * @param $addCount */ public static function addCount($userID, $configID, $addCount, $isSet = false) { SafeUtil::redisLockOperate(function ($userID, $configID, $addCount, $isSet) { $addCount = (int)$addCount; if ($addCount <= 0) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR); $config = GameConfigServices::getParamByPath('achievement_list.' . $configID); if (empty($config)) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR); $ach = Achievement::findByUserIDAndConfigID($userID, $configID); if (empty($ach)) $ach = self::createAch($userID, $configID); list($maxCount, $temp1, $temp2, $temp3) = self::parseConfig($ach->config_id, $ach->level); if ($ach->count == $maxCount) return; $needUpdateAch = false; if ($isSet) $ach->count = $addCount; else $ach->count += $addCount; if ($ach->count > $maxCount) { $ach->count = $maxCount; $needUpdateAch = true; } if (!$ach->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR); if ($needUpdateAch) self::updateAchCount($userID); }, [$userID, $configID, $addCount, $isSet], RedisKeyUtil::lockAchievement($userID, $configID)); } /** * 获取奖励 * @param $userID * @param $achID */ public static function getGift($userID, $achID) { SafeUtil::dbOperate(function ($userID, $achID) { $ach = Achievement::findByID($achID); if (empty($ach) || $ach->user_id != $userID) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR); SafeUtil::redisLockOperate(function ($userID, $achID) { $ach = Achievement::findByID($achID); if (empty($ach) || $ach->user_id != $userID || $ach->receive == 1) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR); $config = GameConfigServices::getParamByPath('achievement_list.' . $ach->config_id); if (empty($config)) throw new StatusException(ResultStatusServices::RS_PARAM_ERROR); list($maxCount, $awardItemID, $awardItemNum, $exp) = self::parseConfig($ach->config_id, $ach->level); $str = sprintf('%s:%d', $awardItemID, $awardItemNum); MoneyUtil::parseItem($str, 1, true, $userID, SystemLogUtil::FROM_TYPE_GET_ACH_GIFT, ['config' => $config]); MoneyUtil::addUserExp($userID, $exp); $needUpdateAch = false; if (self::hasNextLevel($ach->config_id, $ach->level + 1)) { //计算下一级 $ach->level++; if ($ach->config_id == AchievementUtil::ID_FARM_UPGRADE) { $farmDbData = Farm::findOne(['user_id' => $userID]); $ach->count = $farmDbData->level; } else { $ach->count = 0; } $needUpdateAch = true; } else { $ach->receive = 1; } if (!$ach->save()) throw new StatusException(ResultStatusServices::RS_SAVE_DB_ERROR); if ($needUpdateAch) self::updateAchCount($userID); }, [$userID, $achID], RedisKeyUtil::lockAchievement($userID, $ach->config_id)); }, [$userID, $achID]); } }