TaskConsumeGroupService.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. <?php
  2. namespace App\Module\Task\Services;
  3. use App\Module\Game\Services\ConsumeGroupService;
  4. use App\Module\Game\Services\ConsumeService;
  5. use App\Module\Game\Enums\REWARD_SOURCE_TYPE;
  6. use App\Module\Task\Models\Task;
  7. use App\Module\Task\Models\TaskCost;
  8. /**
  9. * 任务消耗组服务
  10. *
  11. * 处理任务的消耗组逻辑,优先使用消耗组,如果没有消耗组则回退到旧版消耗
  12. */
  13. class TaskConsumeGroupService
  14. {
  15. /**
  16. * 获取任务的消耗项列表
  17. *
  18. * @param Task $task 任务模型
  19. * @return array 消耗项列表
  20. */
  21. public static function getTaskConsumes(Task $task): array
  22. {
  23. // 优先使用消耗组
  24. if ($task->consume_group_id) {
  25. $consumeGroup = ConsumeGroupService::getConsumeGroup($task->consume_group_id);
  26. if ($consumeGroup && $consumeGroup->consumeItems) {
  27. return $consumeGroup->consumeItems->toArray();
  28. }
  29. }
  30. // 回退到旧版消耗
  31. return self::getLegacyTaskCosts($task);
  32. }
  33. /**
  34. * 检查用户是否有足够的资源接取任务
  35. *
  36. * @param int $userId 用户ID
  37. * @param Task $task 任务模型
  38. * @return bool 是否有足够资源
  39. */
  40. public static function canAffordTask(int $userId, Task $task): bool
  41. {
  42. // 优先使用消耗组
  43. if ($task->consume_group_id) {
  44. $result = ConsumeService::checkConsume($userId, $task->consume_group_id);
  45. return $result->success;
  46. }
  47. // 回退到旧版消耗检查
  48. $consumes = self::getLegacyTaskCosts($task);
  49. if (empty($consumes)) {
  50. return true; // 没有消耗要求
  51. }
  52. // TODO: 实现旧版消耗检查逻辑
  53. return true;
  54. }
  55. /**
  56. * 执行任务接取消耗
  57. *
  58. * @param int $userId 用户ID
  59. * @param Task $task 任务模型
  60. * @param string $reason 消耗原因
  61. * @return bool 是否成功
  62. */
  63. public static function consumeForTask(int $userId, Task $task, string $reason = '接取任务'): bool
  64. {
  65. // 优先使用消耗组
  66. if ($task->consume_group_id) {
  67. $result = ConsumeService::executeConsume(
  68. $userId,
  69. $task->consume_group_id,
  70. REWARD_SOURCE_TYPE::TASK,
  71. $task->id,
  72. true, // 先检查消耗条件
  73. 1.0 // 倍数
  74. );
  75. return $result->success;
  76. }
  77. // 回退到旧版消耗执行
  78. $consumes = self::getLegacyTaskCosts($task);
  79. if (empty($consumes)) {
  80. return true; // 没有消耗要求
  81. }
  82. // TODO: 实现旧版消耗执行逻辑
  83. return true;
  84. }
  85. /**
  86. * 获取旧版任务消耗
  87. *
  88. * @param Task $task 任务模型
  89. * @return array 消耗项列表
  90. */
  91. private static function getLegacyTaskCosts(Task $task): array
  92. {
  93. $taskCosts = TaskCost::where('task_id', $task->id)->get();
  94. $consumes = [];
  95. foreach ($taskCosts as $cost) {
  96. $consumes[] = [
  97. 'consume_type' => $cost->cost_type,
  98. 'consume_param1' => $cost->cost_param1,
  99. 'consume_param2' => $cost->cost_param2,
  100. 'consume_amount' => $cost->cost_amount,
  101. 'extra_data' => $cost->extra_data ? json_decode($cost->extra_data, true) : null,
  102. ];
  103. }
  104. return $consumes;
  105. }
  106. /**
  107. * 检查任务是否使用消耗组
  108. *
  109. * @param Task $task 任务模型
  110. * @return bool 是否使用消耗组
  111. */
  112. public static function isUsingConsumeGroup(Task $task): bool
  113. {
  114. return !empty($task->consume_group_id);
  115. }
  116. /**
  117. * 获取任务消耗的显示信息
  118. *
  119. * @param Task $task 任务模型
  120. * @return array 消耗显示信息
  121. */
  122. public static function getTaskConsumeDisplay(Task $task): array
  123. {
  124. $consumes = self::getTaskConsumes($task);
  125. $display = [];
  126. foreach ($consumes as $consume) {
  127. $display[] = [
  128. 'type' => $consume['consume_type'],
  129. 'param1' => $consume['consume_param1'],
  130. 'param2' => $consume['consume_param2'],
  131. 'amount' => $consume['consume_amount'],
  132. 'display_name' => self::getConsumeDisplayName($consume),
  133. ];
  134. }
  135. return $display;
  136. }
  137. /**
  138. * 获取消耗项的显示名称
  139. *
  140. * @param array $consume 消耗项数据
  141. * @return string 显示名称
  142. */
  143. private static function getConsumeDisplayName(array $consume): string
  144. {
  145. // 这里可以根据消耗类型返回不同的显示名称
  146. // 具体实现需要根据游戏的消耗类型来定义
  147. return "消耗类型{$consume['consume_type']} x{$consume['consume_amount']}";
  148. }
  149. }