| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- <?php
- namespace App\Module\Task\Services;
- use App\Module\Game\Services\ConsumeGroupService;
- use App\Module\Game\Services\ConsumeService;
- use App\Module\Game\Enums\REWARD_SOURCE_TYPE;
- use App\Module\Task\Models\Task;
- use App\Module\Task\Models\TaskCost;
- /**
- * 任务消耗组服务
- *
- * 处理任务的消耗组逻辑,优先使用消耗组,如果没有消耗组则回退到旧版消耗
- */
- class TaskConsumeGroupService
- {
- /**
- * 获取任务的消耗项列表
- *
- * @param Task $task 任务模型
- * @return array 消耗项列表
- */
- public static function getTaskConsumes(Task $task): array
- {
- // 优先使用消耗组
- if ($task->consume_group_id) {
- $consumeGroup = ConsumeGroupService::getConsumeGroup($task->consume_group_id);
- if ($consumeGroup && $consumeGroup->consumeItems) {
- return $consumeGroup->consumeItems->toArray();
- }
- }
- // 回退到旧版消耗
- return self::getLegacyTaskCosts($task);
- }
-
- /**
- * 检查用户是否有足够的资源接取任务
- *
- * @param int $userId 用户ID
- * @param Task $task 任务模型
- * @return bool 是否有足够资源
- */
- public static function canAffordTask(int $userId, Task $task): bool
- {
- // 优先使用消耗组
- if ($task->consume_group_id) {
- $result = ConsumeService::checkConsume($userId, $task->consume_group_id);
- return $result->success;
- }
- // 回退到旧版消耗检查
- $consumes = self::getLegacyTaskCosts($task);
- if (empty($consumes)) {
- return true; // 没有消耗要求
- }
- // TODO: 实现旧版消耗检查逻辑
- return true;
- }
-
- /**
- * 执行任务接取消耗
- *
- * @param int $userId 用户ID
- * @param Task $task 任务模型
- * @param string $reason 消耗原因
- * @return bool 是否成功
- */
- public static function consumeForTask(int $userId, Task $task, string $reason = '接取任务'): bool
- {
- // 优先使用消耗组
- if ($task->consume_group_id) {
- $result = ConsumeService::executeConsume(
- $userId,
- $task->consume_group_id,
- REWARD_SOURCE_TYPE::TASK,
- $task->id,
- true, // 先检查消耗条件
- 1.0 // 倍数
- );
- return $result->success;
- }
- // 回退到旧版消耗执行
- $consumes = self::getLegacyTaskCosts($task);
- if (empty($consumes)) {
- return true; // 没有消耗要求
- }
- // TODO: 实现旧版消耗执行逻辑
- return true;
- }
-
- /**
- * 获取旧版任务消耗
- *
- * @param Task $task 任务模型
- * @return array 消耗项列表
- */
- private static function getLegacyTaskCosts(Task $task): array
- {
- $taskCosts = TaskCost::where('task_id', $task->id)->get();
-
- $consumes = [];
- foreach ($taskCosts as $cost) {
- $consumes[] = [
- 'consume_type' => $cost->cost_type,
- 'consume_param1' => $cost->cost_param1,
- 'consume_param2' => $cost->cost_param2,
- 'consume_amount' => $cost->cost_amount,
- 'extra_data' => $cost->extra_data ? json_decode($cost->extra_data, true) : null,
- ];
- }
-
- return $consumes;
- }
-
- /**
- * 检查任务是否使用消耗组
- *
- * @param Task $task 任务模型
- * @return bool 是否使用消耗组
- */
- public static function isUsingConsumeGroup(Task $task): bool
- {
- return !empty($task->consume_group_id);
- }
-
- /**
- * 获取任务消耗的显示信息
- *
- * @param Task $task 任务模型
- * @return array 消耗显示信息
- */
- public static function getTaskConsumeDisplay(Task $task): array
- {
- $consumes = self::getTaskConsumes($task);
-
- $display = [];
- foreach ($consumes as $consume) {
- $display[] = [
- 'type' => $consume['consume_type'],
- 'param1' => $consume['consume_param1'],
- 'param2' => $consume['consume_param2'],
- 'amount' => $consume['consume_amount'],
- 'display_name' => self::getConsumeDisplayName($consume),
- ];
- }
-
- return $display;
- }
-
- /**
- * 获取消耗项的显示名称
- *
- * @param array $consume 消耗项数据
- * @return string 显示名称
- */
- private static function getConsumeDisplayName(array $consume): string
- {
- // 这里可以根据消耗类型返回不同的显示名称
- // 具体实现需要根据游戏的消耗类型来定义
- return "消耗类型{$consume['consume_type']} x{$consume['consume_amount']}";
- }
- }
|