UseScopeBaseNewModel.php 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. <?php
  2. namespace App\Model;
  3. use App\Service\RangeService;
  4. use Illuminate\Database\Eloquent\Model;
  5. class UseScopeBaseNewModel 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. // 1. 获取可见范围子查询 (不再是数组)
  19. $range_function = "";
  20. if (defined($className . '::range_function')) $range_function = $className::range_function;
  21. $idSubQuery = null;
  22. if ($range_function && $this->hasMethod(new RangeService(), $range_function)) {
  23. $idSubQuery = RangeService::$range_function($user, $search);
  24. }
  25. // 2. 确定顶级部门 ID
  26. $search_depart_id = $search['top_depart_id'] ?? 0;
  27. $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
  28. $top_depart_id = ($is_all_depart && !empty($search_depart_id)) ? $search_depart_id : $my_top_depart_id;
  29. // 3. 审核状态过滤 (whereRaw)
  30. $check_search = "";
  31. $is_check_function = defined($className . '::is_check_function') ? $className::is_check_function : "";
  32. if ($is_check && $is_check_function && $this->hasMethod(new RangeService(), $is_check_function)) {
  33. $check_search = RangeService::$is_check_function($user, $search);
  34. }
  35. // 4. 执行路由过滤
  36. if ($is_see) {
  37. $query->whereIn('id', $idSubQuery);
  38. } elseif ($is_all_depart) {
  39. $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search);
  40. } else {
  41. $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idSubQuery, $check_search);
  42. }
  43. if (!empty($search['get_my_top_depart_data'])) {
  44. $query->where('top_depart_id', $my_top_depart_id);
  45. }
  46. }
  47. private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search)
  48. {
  49. $query->where(function ($q) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery) {
  50. $q->where(function ($inner) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id) {
  51. // 如果指定了 top_depart_id,则必须满足该条件
  52. if (!empty($search_depart_id)) {
  53. $inner->where('top_depart_id', $top_depart_id);
  54. }
  55. // 基础权限过滤
  56. if ($auth_type == 1) {
  57. $inner->where('crt_id', $user['id']);
  58. } elseif ($auth_type == 2 || $auth_type == 3) {
  59. $inner->whereIn('depart_id', $depart_range);
  60. }
  61. });
  62. // 加上可见范围 (OR 关系)
  63. if ($idSubQuery) {
  64. $q->orWhereIn('id', $idSubQuery);
  65. }
  66. });
  67. if ($is_check && !empty($check_search)) {
  68. $query->whereRaw($check_search);
  69. }
  70. }
  71. private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idSubQuery, $check_search)
  72. {
  73. $query->where(function ($q) use ($auth_type, $user, $depart_range, $top_depart_id, $idSubQuery) {
  74. $q->where(function ($inner) use ($auth_type, $user, $depart_range, $top_depart_id) {
  75. // 非全权限模式下,top_depart_id 是强制的
  76. $inner->where('top_depart_id', $top_depart_id);
  77. if ($auth_type == 1) {
  78. $inner->where('crt_id', $user['id']);
  79. } elseif ($auth_type == 2) {
  80. $inner->whereIn('depart_id', $depart_range);
  81. }
  82. // auth_type 为 0 或 3 时,仅保留 top_depart_id 过滤
  83. });
  84. if ($idSubQuery) {
  85. $q->orWhereIn('id', $idSubQuery);
  86. }
  87. });
  88. if ($is_check && !empty($check_search)) {
  89. $query->whereRaw($check_search);
  90. }
  91. }
  92. public function getQx($data, $user)
  93. {
  94. if (empty($data['menu_id'])) return 0;
  95. // 假设 Employee 常量在此可用,若不可用请自行调整
  96. if ($user['id'] == 1) return 0; // 这里的1代表超级管理员ID
  97. return $user['role_authority'][$data['menu_id']] ?? 0;
  98. }
  99. function hasMethod($class, $methodName)
  100. {
  101. if (empty($methodName)) return false;
  102. return method_exists($class, $methodName);
  103. }
  104. }