ProjectKanbanService.php 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. <?php
  2. namespace App\Services\Project;
  3. use App\Http\Resources\API\KanbanTaskResource;
  4. use App\Http\Resources\API\UserProfileResource;
  5. use App\Models\Enums\TaskStatus;
  6. use App\Models\Project;
  7. use App\Models\Requirement;
  8. use App\Models\User;
  9. use function PHPUnit\Framework\MockObject\object;
  10. class ProjectKanbanService
  11. {
  12. public function kanban(Project $project, $group = "requirement_asc")
  13. {
  14. $groupKey = match ($group) {
  15. "assign" => "assign",
  16. "finished_by" => "finished_by",
  17. default => "requirement_id"
  18. };
  19. $groupTasks = $project->tasks()->with(['assignTo'])->get()->groupBy($groupKey);
  20. $statusItems = array_column(TaskStatus::cases(), 'value');
  21. $items = [];
  22. $groupIds = [];
  23. foreach ($groupTasks as $groupId => $tasks) {
  24. $groupItems = [];
  25. foreach ($statusItems as $status) {
  26. $groupItems[$status] = [];
  27. }
  28. foreach ($tasks as $task) {
  29. $groupItems[$task->status][] = new KanbanTaskResource($task);
  30. }
  31. $items[$groupId ?: "empty"] = $groupItems;
  32. $groupIds[] = $groupId;
  33. }
  34. $collection=$this->getKanbanGroupData($groupIds, $group);
  35. $collection->each(function ($item, $key)use ($collection,$items) {
  36. $collection[$key]=(object)array_merge($collection[$key]->toArray(),$items[$collection[$key]->id]);
  37. });
  38. if (isset($items['empty'])){//当存在empty时,单独在末尾添加改task
  39. $collection->push($items['empty']);
  40. }
  41. return [
  42. 'group_data' => $collection,
  43. // 'group' => $group,
  44. // 'tasks' => $items,
  45. 'status_items' => $statusItems,
  46. ];
  47. }
  48. protected function getKanbanGroupData(array $ids, string $group)
  49. {
  50. $orderBy = match ($group) {
  51. "requirement_asc" => ['id', 'asc'],
  52. "requirement_desc" => ['id', 'desc'],
  53. "requirement_priority_asc" => ['priority', 'asc'],
  54. "requirement_priority_desc" => ['priority', 'desc'],
  55. default => null
  56. };
  57. return match ($group) {
  58. "assign", "finished_by" => User::query()->whereIn("id", $ids)->get(['id','name','username']),
  59. default => Requirement::query()->whereIn("id", $ids)
  60. ->when($orderBy, fn($query) => $query->orderBy(...$orderBy))
  61. ->get([
  62. 'id', 'title', 'priority', 'status'
  63. ]),
  64. };
  65. }
  66. }