UseScopeBaseNewVModel.php 6.2 KB

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