TaskRepository.php 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. <?php
  2. namespace App\Module\Task\Repositorys;
  3. use App\Module\Task\Models\Task;
  4. use Dcat\Admin\Repositories\EloquentRepository;
  5. /**
  6. * 任务数据仓库类
  7. *
  8. * 提供任务数据的访问和操作功能。
  9. * 该类是任务模块与后台管理系统的桥梁,用于处理任务数据的CRUD操作。
  10. */
  11. class TaskRepository extends EloquentRepository
  12. {
  13. /**
  14. * 关联的Eloquent模型类
  15. *
  16. * @var string
  17. */
  18. protected $eloquentClass = Task::class;
  19. /**
  20. * 复制任务
  21. *
  22. * @param int $id 任务ID
  23. * @return Task 复制后的新任务
  24. */
  25. public function duplicate(int $id): Task
  26. {
  27. $task = $this->eloquentClass::findOrFail($id);
  28. $newTask = $task->replicate();
  29. $newTask->name = $task->name . ' (复制)';
  30. $newTask->save();
  31. // 复制任务奖励
  32. foreach ($task->rewards as $reward) {
  33. $newReward = $reward->replicate();
  34. $newReward->task_id = $newTask->id;
  35. $newReward->save();
  36. }
  37. // 复制任务消耗
  38. foreach ($task->costs as $cost) {
  39. $newCost = $cost->replicate();
  40. $newCost->task_id = $newTask->id;
  41. $newCost->save();
  42. }
  43. // 复制任务达成条件
  44. foreach ($task->achievementConditions as $condition) {
  45. $newCondition = $condition->replicate();
  46. $newCondition->task_id = $newTask->id;
  47. $newCondition->save();
  48. }
  49. return $newTask;
  50. }
  51. /**
  52. * 获取可用任务列表
  53. *
  54. * @param int $userId 用户ID
  55. * @param string|null $type 任务类型
  56. * @param int $userLevel 用户等级
  57. * @return array 可用任务列表
  58. */
  59. public function getAvailableTasks(int $userId, ?string $type = null, int $userLevel = 0): array
  60. {
  61. $query = $this->eloquentClass::query()
  62. ->where('is_active', true)
  63. ->where('level_required', '<=', $userLevel)
  64. ->where(function ($query) {
  65. $query->whereNull('start_time')
  66. ->orWhere('start_time', '<=', now());
  67. })
  68. ->where(function ($query) {
  69. $query->whereNull('end_time')
  70. ->orWhere('end_time', '>=', now());
  71. });
  72. if ($type) {
  73. $query->where('type', $type);
  74. }
  75. return $query->get()->toArray();
  76. }
  77. }