ProjectKanbanService.php 2.5 KB

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