DataRange.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. declare(strict_types=1);
  3. namespace Modules\Permissions\Models\Traits;
  4. use Illuminate\Support\Collection;
  5. use Illuminate\Support\Facades\Auth;
  6. use Modules\Permissions\Enums\DataRange as DataRangeEnum;
  7. use Modules\Permissions\Models\Departments;
  8. use Modules\Permissions\Models\Roles;
  9. trait DataRange
  10. {
  11. /**
  12. *
  13. * @param $query
  14. * @param array|Collection $roles
  15. * @return mixed
  16. */
  17. public function scopeDataRange($query, array|Collection $roles = []): mixed
  18. {
  19. $currenUser = Auth::guard(getGuardName())->user();
  20. if ($currenUser->isSuperAdmin()) {
  21. return $query;
  22. }
  23. $userIds = $this->getDepartmentUserIdsBy($roles, $currenUser);
  24. if (empty($userIds)) {
  25. return $query;
  26. }
  27. return $query->whereIn($this->aliasField('creator_id'), $userIds);
  28. }
  29. /**
  30. * get department ids
  31. *
  32. * @param array $roles
  33. * @param $currentUser
  34. * @return Collection
  35. */
  36. public function getDepartmentUserIdsBy(array $roles, $currentUser): Collection
  37. {
  38. $userIds = Collection::make();
  39. if (empty($roles)) {
  40. $roles = $currentUser->roles()->get();
  41. }
  42. /* @var Roles $role */
  43. foreach ($roles as $role) {
  44. if (DataRangeEnum::All_Data->assert($role->data_range)) {
  45. return Collection::make();
  46. }
  47. if (DataRangeEnum::Personal_Choose->assert($role->data_range)) {
  48. $userIds = $userIds->merge($this->getUserIdsByDepartmentId($role->departments()->pluck('id')));
  49. }
  50. if (DataRangeEnum::Personal_Data->assert($role->data_range)) {
  51. $userIds = $userIds->push($currentUser->id);
  52. }
  53. if (DataRangeEnum::Department_Data->assert($role->data_range)) {
  54. $userIds = $userIds->merge(
  55. $this->getUserIdsByDepartmentId([$currentUser->department_id])
  56. );
  57. }
  58. if (DataRangeEnum::Department_DOWN_Data->assert($role->data_range)) {
  59. $departmentsId = [$currentUser->department_id];
  60. $departmentModel = new Departments();
  61. $departmentIds = $departmentModel->findFollowDepartments($departmentsId);
  62. $userIds = $userIds->merge($this->getUserIdsByDepartmentId($departmentIds))->push($currentUser->id);
  63. }
  64. }
  65. return $userIds->unique();
  66. }
  67. /**
  68. * get user ids by department is
  69. *
  70. * @param array|Collection $departmentIds
  71. * @return Collection
  72. */
  73. protected function getUserIdsByDepartmentId(array|Collection $departmentIds): Collection
  74. {
  75. $userModel = app(getAuthUserModel());
  76. return $userModel->whereIn('department_id', $departmentIds)->pluck('id');
  77. }
  78. }