TaskProgressDto.php 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <?php
  2. namespace App\Module\Task\Dtos;
  3. use App\Module\Task\Models\TaskUserProgress;
  4. use App\Module\Task\Models\TaskUserTask;
  5. use UCore\Dto\BaseDto;
  6. /**
  7. * 任务进度数据传输对象
  8. *
  9. * 用于在不同层之间传递任务进度数据,特别是在服务层和控制器层之间。
  10. */
  11. class TaskProgressDto extends BaseDto
  12. {
  13. /**
  14. * 用户ID
  15. *
  16. * @var int
  17. */
  18. public int $userId;
  19. /**
  20. * 任务ID
  21. *
  22. * @var int
  23. */
  24. public int $taskId;
  25. /**
  26. * 用户任务ID
  27. *
  28. * @var int|null
  29. */
  30. public ?int $userTaskId = null;
  31. /**
  32. * 任务状态
  33. *
  34. * @var int
  35. */
  36. public int $status;
  37. /**
  38. * 总进度(0-100)
  39. *
  40. * @var int
  41. */
  42. public int $progress = 0;
  43. /**
  44. * 接取时间
  45. *
  46. * @var string|null
  47. */
  48. public ?string $acceptedAt = null;
  49. /**
  50. * 完成时间
  51. *
  52. * @var string|null
  53. */
  54. public ?string $completedAt = null;
  55. /**
  56. * 奖励领取时间
  57. *
  58. * @var string|null
  59. */
  60. public ?string $rewardedAt = null;
  61. /**
  62. * 上次重置时间
  63. *
  64. * @var string|null
  65. */
  66. public ?string $lastResetTime = null;
  67. /**
  68. * 下次重置时间
  69. *
  70. * @var string|null
  71. */
  72. public ?string $nextResetTime = null;
  73. /**
  74. * 重置次数
  75. *
  76. * @var int
  77. */
  78. public int $resetCount = 0;
  79. /**
  80. * 条件进度列表
  81. *
  82. * @var TaskConditionDto[]
  83. */
  84. public array $conditionProgress = [];
  85. /**
  86. * 任务信息
  87. *
  88. * @var TaskDto|null
  89. */
  90. public ?TaskDto $task = null;
  91. /**
  92. * 从TaskUserTask模型创建DTO
  93. *
  94. * @param TaskUserTask $userTask 用户任务模型
  95. * @return static
  96. */
  97. public static function fromModel(TaskUserTask $userTask): self
  98. {
  99. $dto = new self();
  100. $dto->userId = $userTask->user_id;
  101. $dto->taskId = $userTask->task_id;
  102. $dto->userTaskId = $userTask->id;
  103. $dto->status = $userTask->status;
  104. $dto->progress = $userTask->progress;
  105. $dto->acceptedAt = $userTask->accepted_at ? $userTask->accepted_at->format('Y-m-d H:i:s') : null;
  106. $dto->completedAt = $userTask->completed_at ? $userTask->completed_at->format('Y-m-d H:i:s') : null;
  107. $dto->rewardedAt = $userTask->rewarded_at ? $userTask->rewarded_at->format('Y-m-d H:i:s') : null;
  108. $dto->lastResetTime = $userTask->last_reset_time ? $userTask->last_reset_time->format('Y-m-d H:i:s') : null;
  109. $dto->nextResetTime = $userTask->next_reset_time ? $userTask->next_reset_time->format('Y-m-d H:i:s') : null;
  110. $dto->resetCount = $userTask->reset_count ?? 0;
  111. // 加载任务信息
  112. if ($userTask->relationLoaded('task')) {
  113. $dto->task = TaskDto::fromModel($userTask->task);
  114. }
  115. return $dto;
  116. }
  117. /**
  118. * 添加条件进度
  119. *
  120. * @param TaskConditionDto $conditionDto 条件DTO
  121. * @param int $currentValue 当前值
  122. * @return self
  123. */
  124. public function addConditionProgress(TaskConditionDto $conditionDto, int $currentValue): self
  125. {
  126. $conditionDto->setProgress($currentValue);
  127. $this->conditionProgress[] = $conditionDto;
  128. return $this;
  129. }
  130. /**
  131. * 从用户任务进度列表添加条件进度
  132. *
  133. * @param array $userProgressList 用户任务进度列表
  134. * @param array $conditionList 条件列表
  135. * @return self
  136. */
  137. public function addConditionProgressFromList(array $userProgressList, array $conditionList): self
  138. {
  139. foreach ($conditionList as $condition) {
  140. $conditionDto = TaskConditionDto::fromModel($condition);
  141. // 查找对应的进度记录
  142. $progress = null;
  143. foreach ($userProgressList as $userProgress) {
  144. if ($userProgress->achievement_condition_id === $condition->id) {
  145. $progress = $userProgress;
  146. break;
  147. }
  148. }
  149. // 添加条件进度
  150. $currentValue = $progress ? $progress->current_value : 0;
  151. $this->addConditionProgress($conditionDto, $currentValue);
  152. }
  153. return $this;
  154. }
  155. }