UseScopeBaseNewVSonSearchModel.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. <?php
  2. namespace App\Model;
  3. use App\Service\RangeService;
  4. use Illuminate\Database\Eloquent\Model;
  5. class UseScopeBaseNewVSonSearchModel extends Model
  6. {
  7. const range_function = '';
  8. const is_check_function = '';
  9. public function scopeClear($query, $user, $search)
  10. {
  11. $is_all_depart = $user['is_all_depart'] ?? 0;
  12. $depart_range = $user['depart_range'] ?? [];
  13. $is_see = ! empty($search['is_see']);
  14. $is_check = ! empty($search['is_check']);
  15. $auth_type = $this->getQx($search, $user);
  16. $model = $query->getModel();
  17. $className = get_class($model);
  18. // 可见范围方法判断
  19. $range_function = "";
  20. if (defined($className . '::range_function')) $range_function = $className::range_function;
  21. $function_range_bool = $this->hasMethod(new RangeService(), $range_function);
  22. // 状态过滤方法判断
  23. $is_check_function = "";
  24. if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
  25. $is_check_function_bool = $this->hasMethod(new RangeService(), $is_check_function);
  26. $search_depart_id = $search['top_depart_id'] ?? 0;
  27. $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
  28. if(empty($search_depart_id)){
  29. $top_depart_id = $my_top_depart_id;
  30. }else{
  31. $top_depart_id = $is_all_depart ? $search_depart_id : $my_top_depart_id;
  32. }
  33. // 注入 EXISTS 条件闭包 (EXISTS 不需要外层 distinct)
  34. $idCondition = null;
  35. if($function_range_bool) {
  36. $idCondition = RangeService::attachRangeJoin($query, $user, $search);
  37. }
  38. $check_search = "";
  39. if($is_check_function_bool && $is_check) {
  40. $check_search = RangeService::$is_check_function($user, $search);
  41. }
  42. if($is_see){
  43. $query->where($idCondition);
  44. }elseif($is_all_depart){
  45. $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idCondition, $check_search);
  46. }else{
  47. $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idCondition, $check_search);
  48. }
  49. if(! empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
  50. }
  51. private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idCondition, $check_search)
  52. {
  53. if(empty($search_depart_id)){
  54. if ($is_check){
  55. if(! $auth_type){
  56. $query->when(! empty($check_search), function ($query) use ($check_search) {
  57. return $query->whereRaw($check_search);
  58. });
  59. }elseif($auth_type == 1){
  60. $query->where('crt_id', $user['id'])
  61. ->when(! empty($check_search), function ($query) use ($check_search) {
  62. return $query->whereRaw($check_search);
  63. })
  64. ->when($idCondition, function ($query) use ($idCondition) {
  65. return $query->orWhere($idCondition);
  66. });
  67. }elseif ($auth_type == 2 || $auth_type == 3){
  68. $query->whereIn('depart_id', $depart_range)
  69. ->when(! empty($check_search), function ($query) use ($check_search) {
  70. return $query->whereRaw($check_search);
  71. });
  72. }
  73. }else{
  74. if($auth_type == 1) {
  75. $query->where('crt_id', $user['id'])
  76. ->when($idCondition, function ($query) use ($idCondition) {
  77. return $query->orWhere($idCondition);
  78. });
  79. }elseif ($auth_type == 2 || $auth_type == 3){
  80. $query->whereIn('depart_id', $depart_range);
  81. }
  82. }
  83. }else{
  84. // 指定公司逻辑
  85. $query->where('top_depart_id', $top_depart_id);
  86. if ($is_check){
  87. $query->when(! empty($check_search), function ($query) use ($check_search) {
  88. return $query->whereRaw($check_search);
  89. });
  90. }
  91. if($auth_type == 1) {
  92. $query->where('crt_id', $user['id'])
  93. ->when($idCondition, function ($query) use ($idCondition) {
  94. return $query->orWhere($idCondition);
  95. });
  96. }elseif ($auth_type == 2 || $auth_type == 3){
  97. $query->whereIn('depart_id', $depart_range)
  98. ->when($idCondition, function ($query) use ($idCondition) {
  99. return $query->orWhere($idCondition);
  100. });
  101. }
  102. }
  103. }
  104. private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idCondition, $check_search)
  105. {
  106. $query->where('top_depart_id', $top_depart_id);
  107. if ($is_check){
  108. $query->when(! empty($check_search), function ($query) use ($check_search) {
  109. return $query->whereRaw($check_search);
  110. });
  111. }
  112. if(! $auth_type || $auth_type == 3){
  113. $query->when($idCondition, function ($query) use ($idCondition) {
  114. return $query->orWhere($idCondition);
  115. });
  116. }else if($auth_type == 1) {
  117. $query->where('crt_id', $user['id'])
  118. ->when($idCondition, function ($query) use ($idCondition) {
  119. return $query->orWhere($idCondition);
  120. });
  121. }elseif ($auth_type == 2) {
  122. $query->whereIn('depart_id', $depart_range)
  123. ->when($idCondition, function ($query) use ($idCondition) {
  124. return $query->orWhere($idCondition);
  125. });
  126. }
  127. }
  128. public function getQx($data, $user)
  129. {
  130. if (empty($data['menu_id'])) return 0;
  131. // 假设 Employee 常量在此可用,若不可用请自行调整
  132. if ($user['id'] == 1) return 0; // 这里的1代表超级管理员ID
  133. return $user['role_authority'][$data['menu_id']] ?? 0;
  134. }
  135. function hasMethod($class, $methodName)
  136. {
  137. if (empty($methodName)) return false;
  138. return method_exists($class, $methodName);
  139. }
  140. }