SkinLogic.php 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. <?php
  2. namespace App\Module\Game\Logics;
  3. use App\Module\Game\Models\GameUserSkin;
  4. use App\Module\Game\Dto\UserSkinDto;
  5. use UCore\Dto\Res;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Log;
  8. /**
  9. * 皮肤逻辑类
  10. *
  11. * 处理皮肤相关的内部业务逻辑
  12. */
  13. class SkinLogic
  14. {
  15. /**
  16. * 获取用户皮肤信息
  17. *
  18. * @param int $userId 用户ID
  19. * @return UserSkinDto|null
  20. */
  21. public function getUserSkinInfo(int $userId): ?UserSkinDto
  22. {
  23. try {
  24. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  25. if (!$userSkin) {
  26. // 如果用户没有皮肤记录,自动初始化
  27. $initResult = $this->initUserSkin($userId);
  28. if (!$initResult->success) {
  29. return null;
  30. }
  31. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  32. }
  33. return UserSkinDto::fromModel($userSkin);
  34. } catch (\Exception $e) {
  35. Log::error('获取用户皮肤信息失败', [
  36. 'user_id' => $userId,
  37. 'error' => $e->getMessage()
  38. ]);
  39. return null;
  40. }
  41. }
  42. /**
  43. * 切换用户皮肤
  44. *
  45. * @param int $userId 用户ID
  46. * @param int $skinId 皮肤ID
  47. * @return Res
  48. */
  49. public function changeSkin(int $userId, int $skinId): Res
  50. {
  51. try {
  52. // 验证皮肤ID
  53. if (!GameUserSkin::isValidSkinId($skinId)) {
  54. return Res::error('无效的皮肤ID');
  55. }
  56. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  57. if (!$userSkin) {
  58. // 如果用户没有皮肤记录,先初始化
  59. $initResult = $this->initUserSkin($userId);
  60. if (!$initResult->success) {
  61. return $initResult;
  62. }
  63. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  64. }
  65. // 检查是否拥有该皮肤
  66. if (!$userSkin->hasSkin($skinId)) {
  67. return Res::error('您还没有拥有该皮肤');
  68. }
  69. // 切换皮肤
  70. $userSkin->current_skin_id = $skinId;
  71. $userSkin->save();
  72. return Res::success('皮肤切换成功');
  73. } catch (\Exception $e) {
  74. Log::error('切换皮肤失败', [
  75. 'user_id' => $userId,
  76. 'skin_id' => $skinId,
  77. 'error' => $e->getMessage()
  78. ]);
  79. return Res::error('切换皮肤失败');
  80. }
  81. }
  82. /**
  83. * 为用户添加皮肤
  84. *
  85. * @param int $userId 用户ID
  86. * @param int $skinId 皮肤ID
  87. * @return Res
  88. */
  89. public function addSkin(int $userId, int $skinId): Res
  90. {
  91. try {
  92. // 验证皮肤ID
  93. if (!GameUserSkin::isValidSkinId($skinId)) {
  94. return Res::error('无效的皮肤ID');
  95. }
  96. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  97. if (!$userSkin) {
  98. // 如果用户没有皮肤记录,先初始化
  99. $initResult = $this->initUserSkin($userId);
  100. if (!$initResult->success) {
  101. return $initResult;
  102. }
  103. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  104. }
  105. // 添加皮肤
  106. if (!$userSkin->addSkin($skinId)) {
  107. return Res::error('您已经拥有该皮肤');
  108. }
  109. $userSkin->save();
  110. return Res::success('皮肤获得成功');
  111. } catch (\Exception $e) {
  112. Log::error('添加皮肤失败', [
  113. 'user_id' => $userId,
  114. 'skin_id' => $skinId,
  115. 'error' => $e->getMessage()
  116. ]);
  117. return Res::error('添加皮肤失败');
  118. }
  119. }
  120. /**
  121. * 检查用户是否拥有指定皮肤
  122. *
  123. * @param int $userId 用户ID
  124. * @param int $skinId 皮肤ID
  125. * @return bool
  126. */
  127. public function hasSkin(int $userId, int $skinId): bool
  128. {
  129. try {
  130. $userSkin = GameUserSkin::where('user_id', $userId)->first();
  131. if (!$userSkin) {
  132. return $skinId === 1; // 默认拥有1号皮肤
  133. }
  134. return $userSkin->hasSkin($skinId);
  135. } catch (\Exception $e) {
  136. Log::error('检查皮肤拥有状态失败', [
  137. 'user_id' => $userId,
  138. 'skin_id' => $skinId,
  139. 'error' => $e->getMessage()
  140. ]);
  141. return false;
  142. }
  143. }
  144. /**
  145. * 初始化用户皮肤数据
  146. *
  147. * @param int $userId 用户ID
  148. * @return Res
  149. */
  150. public function initUserSkin(int $userId): Res
  151. {
  152. try {
  153. // 检查是否已存在
  154. $existing = GameUserSkin::where('user_id', $userId)->first();
  155. if ($existing) {
  156. return Res::success('用户皮肤数据已存在');
  157. }
  158. // 创建默认皮肤数据
  159. GameUserSkin::create([
  160. 'user_id' => $userId,
  161. 'current_skin_id' => 1,
  162. 'owned_skins' => '1',
  163. ]);
  164. return Res::success('用户皮肤数据初始化成功');
  165. } catch (\Exception $e) {
  166. Log::error('初始化用户皮肤数据失败', [
  167. 'user_id' => $userId,
  168. 'error' => $e->getMessage()
  169. ]);
  170. return Res::error('初始化用户皮肤数据失败');
  171. }
  172. }
  173. }