Просмотр исходного кода

任务模块的奖励配置废弃,使用奖励组来组织奖励信息

notfff 8 месяцев назад
Родитель
Сommit
822af8f736

+ 80 - 0
app/Module/Game/AdminControllers/LazyRenderable/GameRewardGroupLazyRenderable.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Module\Game\AdminControllers\LazyRenderable;
+
+use App\Module\Game\Models\GameRewardGroup;
+use App\Module\Game\Repositorys\GameRewardGroupRepository;
+use Dcat\Admin\Grid;
+use UCore\DcatAdmin\Grid\LazyRenderable;
+use UCore\DcatAdmin\Grid\SelectTable;
+
+/**
+ * 奖励组懒加载渲染类
+ *
+ * 用于在表单中选择奖励组时的数据表格渲染
+ */
+class GameRewardGroupLazyRenderable extends LazyRenderable implements SelectTable
+{
+    /**
+     * 获取模型
+     *
+     * @return string
+     */
+    public function getModel(): string
+    {
+        return GameRewardGroup::class;
+    }
+
+    /**
+     * 获取模型选择ID字段
+     *
+     * @return string
+     */
+    public function getModelSelectId(): string
+    {
+        return 'id';
+    }
+
+    /**
+     * 获取模型显示名称字段
+     *
+     * @return string
+     */
+    public function getModelViewName(): string
+    {
+        return 'name';
+    }
+
+    /**
+     * 构建表格
+     *
+     * @return Grid
+     */
+    public function grid(): Grid
+    {
+        return Grid::make(new GameRewardGroupRepository(), function (Grid $grid) {
+            $grid->column('id', 'ID')->sortable();
+            $grid->column('name', '名称');
+            $grid->column('code', '编码');
+            $grid->column('description', '描述')->limit(30);
+            $grid->column('is_random', '随机发放')->switch();
+            $grid->column('random_count', '随机数量');
+            $grid->column('created_at', '创建时间');
+
+            $grid->quickSearch(['id', 'name', 'code']);
+
+            $grid->filter(function (Grid\Filter $filter) {
+                $filter->panel();
+                $filter->equal('id', 'ID');
+                $filter->like('name', '名称');
+                $filter->like('code', '编码');
+                $filter->equal('is_random', '随机发放')->select([0 => '否', 1 => '是']);
+            });
+
+            $grid->paginate(10);
+            $grid->disableActions();
+            $grid->disableBatchActions();
+            $grid->disableCreateButton();
+        });
+    }
+}

+ 25 - 1
app/Module/Task/AdminControllers/TaskController.php

@@ -8,6 +8,8 @@ use App\Module\Task\AdminControllers\Helper\GridHelper;
 use App\Module\Task\AdminControllers\Helper\ShowHelper;
 use App\Module\Task\Models\Task;
 use App\Module\Task\Repositorys\TaskRepository;
+use App\Module\Game\Models\GameRewardGroup;
+use App\Module\Game\AdminControllers\LazyRenderable\GameRewardGroupLazyRenderable;
 use Dcat\Admin\Form;
 use Dcat\Admin\Grid;
 use Dcat\Admin\Show;
@@ -49,11 +51,18 @@ class TaskController extends AdminController
             $grid->column('is_active', '是否激活')->switch();
             $grid->column('start_time', '开始时间');
             $grid->column('end_time', '结束时间');
+            $grid->column('reward_group_id', '奖励组')->display(function ($rewardGroupId) {
+                if (!$rewardGroupId) {
+                    return '<span class="text-muted">使用旧版奖励</span>';
+                }
+                $rewardGroup = GameRewardGroup::find($rewardGroupId);
+                return $rewardGroup ? "{$rewardGroup->name} ({$rewardGroup->code})" : "未知 ({$rewardGroupId})";
+            });
             $grid->column('created_at', '创建时间')->sortable();
 
             $grid->filter(function (Grid\Filter $filter) {
                 $filterHelper = new FilterHelper($filter, $this);
-                $filterHelper->equal();
+                $filterHelper->equalId();
                 $filterHelper->likeName();
                 $filterHelper->equalTaskCategory();
                 $filterHelper->equalTaskType();
@@ -89,6 +98,13 @@ class TaskController extends AdminController
             $helper->fieldIsActive();
             $show->field('start_time', '开始时间');
             $show->field('end_time', '结束时间');
+            $show->field('reward_group_id', '奖励组')->as(function ($rewardGroupId) {
+                if (!$rewardGroupId) {
+                    return '使用旧版奖励';
+                }
+                $rewardGroup = GameRewardGroup::find($rewardGroupId);
+                return $rewardGroup ? "{$rewardGroup->name} ({$rewardGroup->code})" : "未知 ({$rewardGroupId})";
+            });
             $helper->fieldCreatedAt();
             $helper->fieldUpdatedAt();
 
@@ -122,6 +138,14 @@ class TaskController extends AdminController
             $helper->switchIsActive();
             $form->datetime('start_time', '开始时间')->help('任务可接取的开始时间,为空表示无限制');
             $form->datetime('end_time', '结束时间')->help('任务可接取的结束时间,为空表示无限制');
+
+            // 添加奖励组选择(使用表格选择器)
+            $rewardGroupTable = GameRewardGroupLazyRenderable::make();
+            $form->selectTable('reward_group_id', '奖励组')
+                ->from($rewardGroupTable)
+                ->title('选择奖励组')
+                ->model($rewardGroupTable->getModel(), $rewardGroupTable->getModelSelectId(), $rewardGroupTable->getModelViewName())
+                ->help('选择奖励组后,将使用奖励组中的奖励项作为任务奖励,而不使用旧版奖励');
             $form->display('created_at', '创建时间');
             $form->display('updated_at', '更新时间');
 

+ 122 - 0
app/Module/Task/Commands/MigrateTaskRewardsToRewardGroups.php

@@ -0,0 +1,122 @@
+<?php
+
+namespace App\Module\Task\Commands;
+
+use App\Module\Task\Models\Task;
+use App\Module\Task\Services\TaskRewardGroupService;
+use Illuminate\Console\Command;
+
+/**
+ * 迁移任务奖励到奖励组命令
+ */
+class MigrateTaskRewardsToRewardGroups extends Command
+{
+    /**
+     * 命令名称
+     *
+     * @var string
+     */
+    protected $signature = 'task:migrate-rewards {task_id?} {--all : 迁移所有任务}';
+
+    /**
+     * 命令描述
+     *
+     * @var string
+     */
+    protected $description = '将任务奖励迁移到奖励组';
+
+    /**
+     * 执行命令
+     *
+     * @return int
+     */
+    public function handle()
+    {
+        $taskId = $this->argument('task_id');
+        $migrateAll = $this->option('all');
+
+        if (!$taskId && !$migrateAll) {
+            $this->error('请指定任务ID或使用 --all 选项迁移所有任务');
+            return 1;
+        }
+
+        if ($taskId) {
+            // 迁移单个任务
+            $this->migrateTask($taskId);
+        } else {
+            // 迁移所有任务
+            $this->migrateAllTasks();
+        }
+
+        return 0;
+    }
+
+    /**
+     * 迁移单个任务
+     *
+     * @param int $taskId 任务ID
+     * @return void
+     */
+    private function migrateTask(int $taskId)
+    {
+        $task = Task::find($taskId);
+        if (!$task) {
+            $this->error("任务 {$taskId} 不存在");
+            return;
+        }
+
+        $this->info("开始迁移任务 {$taskId}: {$task->name}");
+        $result = TaskRewardGroupService::migrateTaskRewardsToRewardGroup($taskId);
+
+        if ($result['success']) {
+            $this->info("任务 {$taskId} 迁移成功: {$result['message']}");
+            if ($result['reward_group_id']) {
+                $this->info("关联的奖励组ID: {$result['reward_group_id']}");
+            }
+        } else {
+            $this->error("任务 {$taskId} 迁移失败: {$result['message']}");
+        }
+    }
+
+    /**
+     * 迁移所有任务
+     *
+     * @return void
+     */
+    private function migrateAllTasks()
+    {
+        $this->info('开始迁移所有任务奖励到奖励组');
+
+        // 获取所有有奖励但没有关联奖励组的任务
+        $tasks = Task::whereHas('rewards')
+            ->whereNull('reward_group_id')
+            ->get();
+
+        $total = $tasks->count();
+        $this->info("找到 {$total} 个需要迁移的任务");
+
+        $bar = $this->output->createProgressBar($total);
+        $bar->start();
+
+        $success = 0;
+        $failed = 0;
+
+        foreach ($tasks as $task) {
+            $result = TaskRewardGroupService::migrateTaskRewardsToRewardGroup($task->id);
+            
+            if ($result['success']) {
+                $success++;
+            } else {
+                $failed++;
+                $this->newLine();
+                $this->error("任务 {$task->id} 迁移失败: {$result['message']}");
+            }
+            
+            $bar->advance();
+        }
+
+        $bar->finish();
+        $this->newLine(2);
+        $this->info("迁移完成: 成功 {$success} 个, 失败 {$failed} 个");
+    }
+}

+ 14 - 0
app/Module/Task/Databases/Migrations/add_reward_group_id_to_tasks.sql

@@ -0,0 +1,14 @@
+-- ******************************************************************
+-- 添加奖励组关联字段到任务表
+-- 将任务模块的奖励配置废弃,改为使用奖励组来组织奖励信息
+-- 执行时间:2024年5月
+-- ******************************************************************
+
+-- 添加奖励组ID字段到任务表
+ALTER TABLE `kku_task_tasks` 
+ADD COLUMN `reward_group_id` int(10) unsigned DEFAULT NULL COMMENT '奖励组ID,关联game_reward_groups表' AFTER `reset_time_field`,
+ADD INDEX `idx_reward_group_id` (`reward_group_id`);
+
+-- 添加注释说明task_rewards表已废弃
+ALTER TABLE `kku_task_rewards` 
+COMMENT = '任务奖励定义表(已废弃,使用game_reward_groups替代)';

+ 163 - 0
app/Module/Task/Logics/TaskLogic.php

@@ -0,0 +1,163 @@
+<?php
+
+namespace App\Module\Task\Logics;
+
+use App\Module\Task\Enums\TASK_STATUS;
+use App\Module\Task\Events\TaskRewardClaimedEvent;
+use App\Module\Task\Models\Task;
+use App\Module\Task\Models\TaskRewardLog;
+use App\Module\Task\Models\TaskUserTask;
+use App\Module\Task\Services\TaskRewardGroupService;
+use Illuminate\Support\Carbon;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 任务逻辑类
+ * 
+ * 处理任务相关的业务逻辑,包括任务奖励的发放等
+ */
+class TaskLogic
+{
+    /**
+     * 领取任务奖励
+     *
+     * @param int $userId 用户ID
+     * @param int $taskId 任务ID
+     * @return array 领取结果
+     */
+    public function claimTaskReward(int $userId, int $taskId): array
+    {
+        try {
+            // 开始事务
+            DB::beginTransaction();
+            
+            // 获取用户任务
+            $userTask = TaskUserTask::where('user_id', $userId)
+                ->where('task_id', $taskId)
+                ->first();
+                
+            if (!$userTask) {
+                throw new \Exception('未接取该任务');
+            }
+            
+            // 检查任务状态
+            if ($userTask->status !== TASK_STATUS::COMPLETED->value) {
+                throw new \Exception('任务未完成,不能领取奖励');
+            }
+            
+            if ($userTask->status === TASK_STATUS::REWARDED->value) {
+                throw new \Exception('已领取过奖励');
+            }
+            
+            // 获取任务信息
+            $task = Task::find($taskId);
+            if (!$task) {
+                throw new \Exception('任务不存在');
+            }
+            
+            // 使用奖励组服务发放奖励
+            $result = TaskRewardGroupService::distributeRewards(
+                $userId, 
+                $taskId, 
+                $userTask->id
+            );
+            
+            if (!$result['success']) {
+                throw new \Exception($result['message'] ?? '奖励发放失败');
+            }
+            
+            // 更新任务状态
+            $userTask->status = TASK_STATUS::REWARDED->value;
+            $userTask->rewarded_at = Carbon::now();
+            $userTask->save();
+            
+            // 触发奖励领取事件
+            event(new TaskRewardClaimedEvent(
+                $userId,
+                $taskId,
+                $task->name,
+                $result['rewards'] ?? [],
+                $userTask->rewarded_at,
+                true
+            ));
+            
+            // 提交事务
+            DB::commit();
+            
+            return [
+                'success' => true,
+                'message' => '奖励领取成功',
+                'rewards' => $result['rewards'] ?? [],
+            ];
+        } catch (\Exception $e) {
+            // 回滚事务
+            DB::rollBack();
+            
+            Log::error('任务奖励领取失败', [
+                'user_id' => $userId,
+                'task_id' => $taskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+            
+            return [
+                'success' => false,
+                'message' => $e->getMessage(),
+            ];
+        }
+    }
+    
+    /**
+     * 获取任务奖励信息
+     *
+     * @param int $taskId 任务ID
+     * @return array 奖励信息
+     */
+    public function getTaskRewardInfo(int $taskId): array
+    {
+        try {
+            // 获取任务信息
+            $task = Task::find($taskId);
+            if (!$task) {
+                return [
+                    'success' => false,
+                    'message' => '任务不存在',
+                    'rewards' => []
+                ];
+            }
+            
+            // 使用奖励组服务获取奖励信息
+            $rewards = TaskRewardGroupService::getTaskRewards($taskId);
+            
+            return [
+                'success' => true,
+                'message' => '获取奖励信息成功',
+                'rewards' => $rewards
+            ];
+        } catch (\Exception $e) {
+            Log::error('获取任务奖励信息失败', [
+                'task_id' => $taskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+            
+            return [
+                'success' => false,
+                'message' => $e->getMessage(),
+                'rewards' => []
+            ];
+        }
+    }
+    
+    /**
+     * 迁移任务奖励到奖励组
+     *
+     * @param int $taskId 任务ID
+     * @return array 迁移结果
+     */
+    public function migrateTaskReward(int $taskId): array
+    {
+        return TaskRewardGroupService::migrateTaskRewardsToRewardGroup($taskId);
+    }
+}

+ 17 - 3
app/Module/Task/Models/Task.php

@@ -5,11 +5,12 @@ namespace App\Module\Task\Models;
 use UCore\ModelCore;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
 use Illuminate\Database\Eloquent\Relations\HasMany;
+use App\Module\Game\Models\GameRewardGroup;
 
 /**
  * 任务模型
  *
- * field start 
+ * field start
  * @property  int  $id  主键
  * @property  int  $category_id  任务分类ID,外键关联task_categories表
  * @property  string  $name  任务名称
@@ -29,6 +30,7 @@ use Illuminate\Database\Eloquent\Relations\HasMany;
  * @property  \Carbon\Carbon  $updated_at  更新时间
  * @property  int  $reset_interval  重置间隔(秒),根据重置类型自动计算
  * @property  string  $reset_time_field  重置时间字段,如"daily_reset_time",用于存储具体重置时间点
+ * @property  int  $reward_group_id  奖励组ID,关联game_reward_groups表
  * field end
  */
 class Task extends ModelCore
@@ -70,7 +72,7 @@ class Task extends ModelCore
         'updated_at',
     ];
 
-    // attrlist start 
+    // attrlist start
     protected $fillable = [
         'id',
         'category_id',
@@ -89,6 +91,7 @@ class Task extends ModelCore
         'end_time',
         'reset_interval',
         'reset_time_field',
+        'reward_group_id',
     ];
     // attrlist end
 
@@ -103,15 +106,26 @@ class Task extends ModelCore
     }
 
     /**
-     * 获取任务的奖励
+     * 获取任务的奖励(已废弃,使用rewardGroup替代)
      *
      * @return HasMany
+     * @deprecated
      */
     public function rewards(): HasMany
     {
         return $this->hasMany(TaskReward::class, 'task_id', 'id');
     }
 
+    /**
+     * 获取任务关联的奖励组
+     *
+     * @return BelongsTo
+     */
+    public function rewardGroup(): BelongsTo
+    {
+        return $this->belongsTo(GameRewardGroup::class, 'reward_group_id', 'id');
+    }
+
     /**
      * 获取任务的消耗
      *

+ 251 - 0
app/Module/Task/Services/TaskRewardGroupService.php

@@ -0,0 +1,251 @@
+<?php
+
+namespace App\Module\Task\Services;
+
+use App\Module\Game\Services\RewardGroupService;
+use App\Module\Game\Services\RewardService;
+use App\Module\Task\Models\Task;
+use App\Module\Task\Models\TaskRewardLog;
+use Illuminate\Support\Facades\DB;
+use Illuminate\Support\Facades\Log;
+
+/**
+ * 任务奖励组服务类
+ * 
+ * 提供任务奖励组相关的服务,包括获取任务奖励、发放任务奖励等功能
+ */
+class TaskRewardGroupService
+{
+    /**
+     * 获取任务奖励
+     *
+     * @param int $taskId 任务ID
+     * @return array 奖励列表
+     */
+    public static function getTaskRewards(int $taskId): array
+    {
+        try {
+            $task = Task::find($taskId);
+            if (!$task) {
+                return [];
+            }
+            
+            // 如果任务关联了奖励组,则使用奖励组服务获取奖励
+            if ($task->reward_group_id) {
+                return RewardGroupService::getRewardItems($task->reward_group_id);
+            }
+            
+            // 否则使用旧版本的奖励(已废弃)
+            $rewards = [];
+            foreach ($task->rewards as $reward) {
+                $rewards[] = [
+                    'id' => $reward->id,
+                    'type' => $reward->reward_type,
+                    'target_id' => $reward->reward_param2,
+                    'quantity' => $reward->quantity,
+                    'extra_data' => $reward->extra_data,
+                ];
+            }
+            
+            return $rewards;
+        } catch (\Exception $e) {
+            Log::error('获取任务奖励失败', [
+                'task_id' => $taskId,
+                'error' => $e->getMessage()
+            ]);
+            
+            return [];
+        }
+    }
+    
+    /**
+     * 发放任务奖励
+     *
+     * @param int $userId 用户ID
+     * @param int $taskId 任务ID
+     * @param int $userTaskId 用户任务ID
+     * @param string $ipAddress IP地址
+     * @param string $deviceInfo 设备信息
+     * @return array 发放结果
+     */
+    public static function distributeRewards(
+        int $userId, 
+        int $taskId, 
+        int $userTaskId, 
+        string $ipAddress = '', 
+        string $deviceInfo = ''
+    ): array {
+        try {
+            // 开始事务
+            DB::beginTransaction();
+            
+            $task = Task::find($taskId);
+            if (!$task) {
+                throw new \Exception('任务不存在');
+            }
+            
+            // 如果任务关联了奖励组,则使用奖励组服务发放奖励
+            if ($task->reward_group_id) {
+                $result = RewardService::grantReward($userId, $task->reward_group_id, 'task', $taskId);
+                
+                // 记录奖励发放日志
+                TaskRewardLog::create([
+                    'user_id' => $userId,
+                    'task_id' => $taskId,
+                    'user_task_id' => $userTaskId,
+                    'rewards' => $result->rewardItems,
+                    'rewarded_at' => now(),
+                    'ip_address' => $ipAddress,
+                    'device_info' => $deviceInfo,
+                ]);
+                
+                DB::commit();
+                
+                return [
+                    'success' => $result->success,
+                    'message' => $result->message,
+                    'rewards' => $result->rewardItems,
+                ];
+            }
+            
+            // 否则使用旧版本的奖励发放逻辑(已废弃)
+            $rewardService = new TaskRewardService();
+            $result = $rewardService->distributeRewards($userId, $taskId, $userTaskId);
+            
+            DB::commit();
+            
+            return $result;
+        } catch (\Exception $e) {
+            DB::rollBack();
+            
+            Log::error('发放任务奖励失败', [
+                'user_id' => $userId,
+                'task_id' => $taskId,
+                'user_task_id' => $userTaskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+            
+            return [
+                'success' => false,
+                'message' => '发放奖励失败: ' . $e->getMessage(),
+                'rewards' => [],
+            ];
+        }
+    }
+    
+    /**
+     * 迁移任务奖励到奖励组
+     * 
+     * 将旧版本的任务奖励迁移到奖励组
+     *
+     * @param int $taskId 任务ID
+     * @return array 迁移结果
+     */
+    public static function migrateTaskRewardsToRewardGroup(int $taskId): array
+    {
+        try {
+            // 开始事务
+            DB::beginTransaction();
+            
+            $task = Task::with('rewards')->find($taskId);
+            if (!$task) {
+                throw new \Exception('任务不存在');
+            }
+            
+            // 如果任务已经关联了奖励组,则跳过
+            if ($task->reward_group_id) {
+                return [
+                    'success' => true,
+                    'message' => '任务已关联奖励组,无需迁移',
+                    'reward_group_id' => $task->reward_group_id,
+                ];
+            }
+            
+            // 如果任务没有奖励,则跳过
+            if ($task->rewards->isEmpty()) {
+                return [
+                    'success' => true,
+                    'message' => '任务没有奖励,无需迁移',
+                    'reward_group_id' => null,
+                ];
+            }
+            
+            // 创建奖励组
+            $rewardGroup = \App\Module\Game\Models\GameRewardGroup::create([
+                'name' => "任务奖励: {$task->name}",
+                'code' => "task_reward_{$task->id}_" . time(),
+                'description' => "任务 {$task->name} 的奖励",
+                'is_random' => false,
+                'random_count' => 0,
+            ]);
+            
+            // 创建奖励项
+            foreach ($task->rewards as $reward) {
+                // 根据任务奖励类型映射到奖励组的奖励类型
+                $rewardType = self::mapRewardType($reward->reward_type);
+                $targetId = (int)$reward->reward_param2;
+                
+                \App\Module\Game\Models\GameRewardItem::create([
+                    'group_id' => $rewardGroup->id,
+                    'reward_type' => $rewardType,
+                    'target_id' => $targetId,
+                    'param1' => 0,
+                    'param2' => 0,
+                    'quantity' => $reward->quantity,
+                    'weight' => 1.0,
+                    'is_guaranteed' => true,
+                    'extra_data' => $reward->extra_data,
+                ]);
+            }
+            
+            // 更新任务,关联到新创建的奖励组
+            $task->reward_group_id = $rewardGroup->id;
+            $task->save();
+            
+            DB::commit();
+            
+            return [
+                'success' => true,
+                'message' => '任务奖励迁移成功',
+                'reward_group_id' => $rewardGroup->id,
+            ];
+        } catch (\Exception $e) {
+            DB::rollBack();
+            
+            Log::error('迁移任务奖励到奖励组失败', [
+                'task_id' => $taskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString()
+            ]);
+            
+            return [
+                'success' => false,
+                'message' => '迁移任务奖励失败: ' . $e->getMessage(),
+                'reward_group_id' => null,
+            ];
+        }
+    }
+    
+    /**
+     * 映射任务奖励类型到奖励组的奖励类型
+     *
+     * @param string $taskRewardType 任务奖励类型
+     * @return int 奖励组的奖励类型
+     */
+    private static function mapRewardType(string $taskRewardType): int
+    {
+        switch ($taskRewardType) {
+            case 'item':
+                return \App\Module\Game\Enums\REWARD_TYPE::ITEM->value;
+            case 'currency':
+                return \App\Module\Game\Enums\REWARD_TYPE::CURRENCY->value;
+            case 'pet':
+                return \App\Module\Game\Enums\REWARD_TYPE::PET_EXP->value;
+            case 'pet_item':
+                return \App\Module\Game\Enums\REWARD_TYPE::ITEM->value;
+            default:
+                return \App\Module\Game\Enums\REWARD_TYPE::OTHER->value;
+        }
+    }
+}

+ 90 - 278
app/Module/Task/Services/TaskService.php

@@ -3,14 +3,9 @@
 namespace App\Module\Task\Services;
 
 use App\Module\Task\Enums\TASK_STATUS;
-use App\Module\Task\Enums\TASK_TYPE;
 use App\Module\Task\Events\TaskCompletedEvent;
-use App\Module\Task\Events\TaskRewardClaimedEvent;
-use App\Module\Task\Models\Task;
-use App\Module\Task\Models\TaskReward;
-use App\Module\Task\Models\TaskUserTask;
+use App\Module\Task\Logics\TaskLogic;
 use App\Module\Task\Repositorys\TaskRepository;
-use App\Module\Task\Repositorys\TaskRewardRepository;
 use App\Module\Task\Repositorys\TaskUserTaskRepository;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\DB;
@@ -18,7 +13,7 @@ use Illuminate\Support\Facades\Log;
 
 /**
  * 任务服务类
- * 
+ *
  * 提供任务相关的核心服务,包括任务查询、接取、完成、奖励领取等功能。
  * 该类是任务模块对外提供服务的主要入口。
  */
@@ -30,38 +25,38 @@ class TaskService
      * @var TaskRepository
      */
     protected $taskRepository;
-    
+
     /**
      * 用户任务数据仓库
      *
      * @var TaskUserTaskRepository
      */
     protected $userTaskRepository;
-    
+
     /**
-     * 任务奖励数据仓库
+     * 任务逻辑类
      *
-     * @var TaskRewardRepository
+     * @var TaskLogic
      */
-    protected $rewardRepository;
-    
+    protected $taskLogic;
+
     /**
      * 构造函数
      *
      * @param TaskRepository $taskRepository
      * @param TaskUserTaskRepository $userTaskRepository
-     * @param TaskRewardRepository $rewardRepository
+     * @param TaskLogic $taskLogic
      */
     public function __construct(
         TaskRepository $taskRepository,
         TaskUserTaskRepository $userTaskRepository,
-        TaskRewardRepository $rewardRepository
+        TaskLogic $taskLogic
     ) {
         $this->taskRepository = $taskRepository;
         $this->userTaskRepository = $userTaskRepository;
-        $this->rewardRepository = $rewardRepository;
+        $this->taskLogic = $taskLogic;
     }
-    
+
     /**
      * 获取用户可用的任务列表
      *
@@ -75,42 +70,42 @@ class TaskService
     {
         // 获取用户信息(可以调用用户模块的服务)
         // $userInfo = UserService::getUserInfo($userId);
-        
+
         // 获取用户等级
         $userLevel = 1; // 默认等级,实际应从用户信息中获取
-        
+
         // 获取符合条件的任务
         $tasks = $this->taskRepository->getAvailableTasks($type, $categoryId, $userLevel);
-        
+
         // 获取用户任务状态
         $userTasks = $this->userTaskRepository->getUserTasks($userId);
-        
+
         // 将用户任务状态合并到任务数据中
         $result = [];
         foreach ($tasks as $task) {
-            $userTask = $userTasks->where('task_id', $task['id'])->first();
-            
+            $userTask = $userTasks->where('task_id', $task->id)->first();
+
             // 如果任务已完成且不包含已完成任务,则跳过
-            if ($userTask && $userTask['status'] >= TASK_STATUS::COMPLETED->value && !$includeCompleted) {
+            if ($userTask && $userTask->status >= TASK_STATUS::COMPLETED->value && !$includeCompleted) {
                 continue;
             }
-            
+
             // 合并任务数据和用户任务状态
             $taskData = $task;
             $taskData['user_status'] = $userTask ? $userTask['status'] : TASK_STATUS::NOT_ACCEPTED->value;
             $taskData['progress'] = $userTask ? $userTask['progress'] : 0;
             $taskData['completed_at'] = $userTask && $userTask['completed_at'] ? $userTask['completed_at'] : null;
             $taskData['rewarded_at'] = $userTask && $userTask['rewarded_at'] ? $userTask['rewarded_at'] : null;
-            
+
             // 获取任务奖励
-            $taskData['rewards'] = $this->rewardRepository->getRewardsByTaskId($task['id']);
-            
+            $taskData['rewards'] = $this->taskLogic->getTaskRewardInfo($task['id'])['rewards'];
+
             $result[] = $taskData;
         }
-        
+
         return $result;
     }
-    
+
     /**
      * 接取任务
      *
@@ -123,30 +118,30 @@ class TaskService
         try {
             // 开始事务
             DB::beginTransaction();
-            
+
             // 获取任务信息
             $task = $this->taskRepository->find($taskId);
             if (!$task || !$task->is_active) {
                 throw new \Exception('任务不存在或未激活');
             }
-            
+
             // 检查任务是否已过期
             if ($task->end_time && Carbon::now()->greaterThan($task->end_time)) {
                 throw new \Exception('任务已过期');
             }
-            
+
             // 检查用户是否已接取该任务
             $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
             if ($userTask) {
                 throw new \Exception('已接取该任务');
             }
-            
+
             // 检查任务前置条件
             // $this->checkTaskPrerequisites($userId, $task);
-            
+
             // 检查任务接取消耗
             // $this->checkAndConsumeTaskCosts($userId, $task);
-            
+
             // 创建用户任务记录
             $userTask = $this->userTaskRepository->createUserTask([
                 'user_id' => $userId,
@@ -155,10 +150,10 @@ class TaskService
                 'progress' => 0,
                 'accepted_at' => Carbon::now(),
             ]);
-            
+
             // 提交事务
             DB::commit();
-            
+
             return [
                 'success' => true,
                 'message' => '任务接取成功',
@@ -167,20 +162,20 @@ class TaskService
         } catch (\Exception $e) {
             // 回滚事务
             DB::rollBack();
-            
+
             Log::error('任务接取失败', [
                 'user_id' => $userId,
                 'task_id' => $taskId,
                 'error' => $e->getMessage(),
             ]);
-            
+
             return [
                 'success' => false,
                 'message' => $e->getMessage(),
             ];
         }
     }
-    
+
     /**
      * 完成任务
      *
@@ -193,42 +188,44 @@ class TaskService
         try {
             // 开始事务
             DB::beginTransaction();
-            
+
             // 获取用户任务
             $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
             if (!$userTask) {
                 throw new \Exception('未接取该任务');
             }
-            
+
             // 检查任务状态
             if ($userTask->status !== TASK_STATUS::IN_PROGRESS->value) {
                 throw new \Exception('任务状态不正确');
             }
-            
+
             // 检查任务进度
             if ($userTask->progress < 100) {
                 throw new \Exception('任务进度未达到100%');
             }
-            
+
             // 更新任务状态
             $userTask->status = TASK_STATUS::COMPLETED->value;
             $userTask->completed_at = Carbon::now();
             $userTask->save();
-            
+
             // 获取任务信息
             $task = $this->taskRepository->find($taskId);
-            
+
             // 触发任务完成事件
             event(new TaskCompletedEvent(
                 $userId,
                 $taskId,
                 $task->name,
-                $userTask->completed_at
+                $userTask->completed_at,
+                true,
+                []
             ));
-            
+
             // 提交事务
             DB::commit();
-            
+
             return [
                 'success' => true,
                 'message' => '任务完成成功',
@@ -237,20 +234,20 @@ class TaskService
         } catch (\Exception $e) {
             // 回滚事务
             DB::rollBack();
-            
+
             Log::error('任务完成失败', [
                 'user_id' => $userId,
                 'task_id' => $taskId,
                 'error' => $e->getMessage(),
             ]);
-            
+
             return [
                 'success' => false,
                 'message' => $e->getMessage(),
             ];
         }
     }
-    
+
     /**
      * 领取任务奖励
      *
@@ -260,216 +257,31 @@ class TaskService
      */
     public function claimTaskReward(int $userId, int $taskId): array
     {
-        try {
-            // 开始事务
-            DB::beginTransaction();
-            
-            // 获取用户任务
-            $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
-            if (!$userTask) {
-                throw new \Exception('未接取该任务');
-            }
-            
-            // 检查任务状态
-            if ($userTask->status !== TASK_STATUS::COMPLETED->value) {
-                throw new \Exception('任务未完成,无法领取奖励');
-            }
-            
-            // 获取任务信息
-            $task = $this->taskRepository->find($taskId);
-            
-            // 获取任务奖励
-            $rewards = $this->rewardRepository->getRewardsByTaskId($taskId);
-            
-            // 发放奖励
-            $rewardResults = $this->distributeRewards($userId, $rewards);
-            
-            // 更新任务状态
-            $userTask->status = TASK_STATUS::REWARDED->value;
-            $userTask->rewarded_at = Carbon::now();
-            $userTask->save();
-            
-            // 记录奖励领取日志
-            // $this->recordRewardLog($userId, $taskId, $userTask->id, $rewards);
-            
-            // 触发奖励领取事件
-            event(new TaskRewardClaimedEvent(
-                $userId,
-                $taskId,
-                $task->name,
-                $rewards,
-                $userTask->rewarded_at,
-                true
-            ));
-            
-            // 提交事务
-            DB::commit();
-            
-            return [
-                'success' => true,
-                'message' => '奖励领取成功',
-                'rewards' => $rewardResults,
-            ];
-        } catch (\Exception $e) {
-            // 回滚事务
-            DB::rollBack();
-            
-            Log::error('奖励领取失败', [
-                'user_id' => $userId,
-                'task_id' => $taskId,
-                'error' => $e->getMessage(),
-            ]);
-            
-            // 触发奖励领取失败事件
-            event(new TaskRewardClaimedEvent(
-                $userId,
-                $taskId,
-                $task->name ?? '未知任务',
-                [],
-                Carbon::now(),
-                false
-            ));
-            
-            return [
-                'success' => false,
-                'message' => $e->getMessage(),
-            ];
-        }
+        return $this->taskLogic->claimTaskReward($userId, $taskId);
     }
-    
+
     /**
-     * 发放奖励
+     * 获取任务奖励信息
      *
-     * @param int $userId 用户ID
-     * @param array $rewards 奖励列表
-     * @return array 发放结果
+     * @param int $taskId 任务ID
+     * @return array 奖励信息
      */
-    protected function distributeRewards(int $userId, array $rewards): array
+    public function getTaskRewardInfo(int $taskId): array
     {
-        $results = [];
-        
-        foreach ($rewards as $reward) {
-            try {
-                switch ($reward['reward_type']) {
-                    case 'item':
-                        // 调用物品模块服务添加物品
-                        // $itemResult = ItemService::addItem(
-                        //     $userId,
-                        //     $reward['reward_param2'],
-                        //     $reward['quantity'],
-                        //     [
-                        //         'source_type' => 'task_reward',
-                        //         'source_id' => $reward['task_id'],
-                        //     ]
-                        // );
-                        
-                        // 模拟物品发放结果
-                        $itemResult = [
-                            'success' => true,
-                            'message' => '物品发放成功',
-                        ];
-                        
-                        $results[] = [
-                            'type' => 'item',
-                            'param1' => $reward['reward_param1'],
-                            'param2' => $reward['reward_param2'],
-                            'quantity' => $reward['quantity'],
-                            'success' => $itemResult['success'],
-                            'message' => $itemResult['message'] ?? '',
-                        ];
-                        break;
-                        
-                    case 'currency':
-                        // 调用货币模块服务添加货币
-                        // $currencyResult = CurrencyService::addCurrency(
-                        //     $userId,
-                        //     $reward['reward_param1'],
-                        //     $reward['reward_param2'],
-                        //     $reward['quantity'],
-                        //     [
-                        //         'source_type' => 'task_reward',
-                        //         'source_id' => $reward['task_id'],
-                        //     ]
-                        // );
-                        
-                        // 模拟货币发放结果
-                        $currencyResult = [
-                            'success' => true,
-                            'message' => '货币发放成功',
-                        ];
-                        
-                        $results[] = [
-                            'type' => 'currency',
-                            'param1' => $reward['reward_param1'],
-                            'param2' => $reward['reward_param2'],
-                            'quantity' => $reward['quantity'],
-                            'success' => $currencyResult['success'],
-                            'message' => $currencyResult['message'] ?? '',
-                        ];
-                        break;
-                        
-                    case 'experience':
-                        // 调用经验模块服务添加经验
-                        // $expResult = ExperienceService::addExperience(
-                        //     $userId,
-                        //     $reward['reward_param1'],
-                        //     $reward['quantity'],
-                        //     [
-                        //         'source_type' => 'task_reward',
-                        //         'source_id' => $reward['task_id'],
-                        //     ]
-                        // );
-                        
-                        // 模拟经验发放结果
-                        $expResult = [
-                            'success' => true,
-                            'message' => '经验发放成功',
-                        ];
-                        
-                        $results[] = [
-                            'type' => 'experience',
-                            'param1' => $reward['reward_param1'],
-                            'param2' => $reward['reward_param2'],
-                            'quantity' => $reward['quantity'],
-                            'success' => $expResult['success'],
-                            'message' => $expResult['message'] ?? '',
-                        ];
-                        break;
-                        
-                    // 其他奖励类型...
-                    
-                    default:
-                        $results[] = [
-                            'type' => $reward['reward_type'],
-                            'param1' => $reward['reward_param1'],
-                            'param2' => $reward['reward_param2'],
-                            'quantity' => $reward['quantity'],
-                            'success' => false,
-                            'message' => '未知的奖励类型',
-                        ];
-                        break;
-                }
-            } catch (\Exception $e) {
-                Log::error('奖励发放失败', [
-                    'user_id' => $userId,
-                    'reward' => $reward,
-                    'error' => $e->getMessage(),
-                ]);
-                
-                $results[] = [
-                    'type' => $reward['reward_type'],
-                    'param1' => $reward['reward_param1'],
-                    'param2' => $reward['reward_param2'],
-                    'quantity' => $reward['quantity'],
-                    'success' => false,
-                    'message' => $e->getMessage(),
-                ];
-            }
-        }
-        
-        return $results;
+        return $this->taskLogic->getTaskRewardInfo($taskId);
+    }
+
+    /**
+     * 迁移任务奖励到奖励组
+     *
+     * @param int $taskId 任务ID
+     * @return array 迁移结果
+     */
+    public function migrateTaskReward(int $taskId): array
+    {
+        return $this->taskLogic->migrateTaskReward($taskId);
     }
-    
+
     /**
      * 获取任务详情
      *
@@ -487,13 +299,13 @@ class TaskService
                 'message' => '任务不存在',
             ];
         }
-        
+
         // 获取用户任务状态
         $userTask = $this->userTaskRepository->getUserTask($userId, $taskId);
-        
+
         // 获取任务奖励
-        $rewards = $this->rewardRepository->getRewardsByTaskId($taskId);
-        
+        $rewards = $this->taskLogic->getTaskRewardInfo($taskId)['rewards'];
+
         // 构建任务详情
         $taskDetail = $task->toArray();
         $taskDetail['user_status'] = $userTask ? $userTask->status : TASK_STATUS::NOT_ACCEPTED->value;
@@ -501,13 +313,13 @@ class TaskService
         $taskDetail['completed_at'] = $userTask && $userTask->completed_at ? $userTask->completed_at : null;
         $taskDetail['rewarded_at'] = $userTask && $userTask->rewarded_at ? $userTask->rewarded_at : null;
         $taskDetail['rewards'] = $rewards;
-        
+
         return [
             'success' => true,
             'task' => $taskDetail,
         ];
     }
-    
+
     /**
      * 放弃任务
      *
@@ -523,15 +335,15 @@ class TaskService
             if (!$userTask) {
                 throw new \Exception('未接取该任务');
             }
-            
+
             // 检查任务状态
             if ($userTask->status !== TASK_STATUS::IN_PROGRESS->value) {
                 throw new \Exception('只能放弃进行中的任务');
             }
-            
+
             // 删除用户任务记录
             $userTask->delete();
-            
+
             return [
                 'success' => true,
                 'message' => '任务放弃成功',
@@ -542,14 +354,14 @@ class TaskService
                 'task_id' => $taskId,
                 'error' => $e->getMessage(),
             ]);
-            
+
             return [
                 'success' => false,
                 'message' => $e->getMessage(),
             ];
         }
     }
-    
+
     /**
      * 更新任务进度
      *
@@ -566,26 +378,26 @@ class TaskService
             if (!$userTask) {
                 throw new \Exception('未接取该任务');
             }
-            
+
             // 检查任务状态
             if ($userTask->status !== TASK_STATUS::IN_PROGRESS->value) {
                 throw new \Exception('只能更新进行中的任务进度');
             }
-            
+
             // 验证进度值
             if ($progress < 0 || $progress > 100) {
                 throw new \Exception('进度值必须在0-100之间');
             }
-            
+
             // 更新任务进度
             $userTask->progress = $progress;
             $userTask->save();
-            
+
             // 如果进度达到100%,自动完成任务
             if ($progress === 100) {
                 return $this->completeTask($userId, $taskId);
             }
-            
+
             return [
                 'success' => true,
                 'message' => '任务进度更新成功',
@@ -598,14 +410,14 @@ class TaskService
                 'progress' => $progress,
                 'error' => $e->getMessage(),
             ]);
-            
+
             return [
                 'success' => false,
                 'message' => $e->getMessage(),
             ];
         }
     }
-    
+
     /**
      * 批量领取任务奖励
      *
@@ -618,18 +430,18 @@ class TaskService
         $results = [];
         $successCount = 0;
         $failCount = 0;
-        
+
         foreach ($taskIds as $taskId) {
             $result = $this->claimTaskReward($userId, $taskId);
             $results[$taskId] = $result;
-            
+
             if ($result['success']) {
                 $successCount++;
             } else {
                 $failCount++;
             }
         }
-        
+
         return [
             'success' => $failCount === 0,
             'message' => "成功领取{$successCount}个任务奖励,失败{$failCount}个",