UseScopeBaseModel.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace App\Model;
  3. use App\Scopes\TopDepartmentScope;
  4. use App\Service\RangeService;
  5. use Illuminate\Database\Eloquent\Model;
  6. class UseScopeBaseModel extends Model
  7. {
  8. //可见范围
  9. const range_function = '';
  10. public function __construct(array $attributes = [])
  11. {
  12. parent::__construct($attributes);
  13. }
  14. //顶级部门过滤
  15. public function scopeTopClear($query, $user, $search)
  16. {
  17. //是否所有部门
  18. $is_all_depart = $user['is_all_depart'] ?? 0;
  19. //权限范围内的部门
  20. $depart_range = $user['depart_range'] ?? [];
  21. //顶级部门
  22. $search_depart_id = $search['top_depart_id'] ?? 0;
  23. if(empty($search_depart_id)){
  24. //默认进来 自身顶级公司
  25. $top_depart_id = $user['depart_top'][0] ?? [];
  26. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  27. }else{
  28. //查询 顶级公司
  29. $top_depart_id = $search_depart_id;
  30. }
  31. if($is_all_depart){
  32. //所有部门
  33. if(empty($search_depart_id)){
  34. //全部
  35. $query->whereIn('top_depart_id', $depart_range);
  36. }else{
  37. //查看某个分社
  38. $query->where('top_depart_id', $top_depart_id);
  39. }
  40. }else{
  41. //某个分社全部
  42. $query->where('top_depart_id', $top_depart_id);
  43. }
  44. return $query;
  45. }
  46. //部门和顶级部门(公司)过滤
  47. public function scopeClear($query, $user, $search)
  48. {
  49. //是否所有部门
  50. $is_all_depart = $user['is_all_depart'] ?? 0;
  51. //权限范围内的部门
  52. $depart_range = $user['depart_range'] ?? [];
  53. //我可见的
  54. $is_see = $search['is_see'] ?? 0;
  55. //可见范围方法
  56. $model = $query->getModel(); // 获取模型的实例
  57. $range_function = $model::range_function ?? ""; // 访问静态属性
  58. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  59. //顶级部门
  60. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  61. if(empty($search_depart_id)){
  62. //默认进来 自身顶级公司
  63. $top_depart_id = $user['depart_top'][0] ?? [];
  64. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  65. }else{
  66. //查询 顶级公司
  67. $top_depart_id = $search_depart_id;
  68. }
  69. $id = [];
  70. //可见范围 以及单据里面填写人员
  71. if($is_function_range) $id = RangeService::$range_function($user,$search);
  72. if($is_all_depart){
  73. //所有部门
  74. if(empty($search_depart_id)){
  75. if(! $is_see){
  76. //全部
  77. $query->whereIn('depart_id', $depart_range);
  78. }else{
  79. //可见
  80. $query->whereIn('id', $id);
  81. }
  82. }else{
  83. if(! $is_see){
  84. //查看某个分社
  85. $query->where('top_depart_id', $top_depart_id);
  86. }else{
  87. //查看某个分社可见
  88. $query->whereIn('id', $id);
  89. }
  90. }
  91. }else{
  92. //分社
  93. if(! $is_see){
  94. //某个分社全部
  95. $query->where('top_depart_id', $top_depart_id)
  96. ->whereIn('depart_id', $depart_range)
  97. ->orWhereIn('id', $id);
  98. }else{
  99. //某个分社可见
  100. $query->whereIn('id', $id);
  101. }
  102. }
  103. }
  104. function hasMethod($class, $methodName)
  105. {
  106. $reflection = new \ReflectionClass($class);
  107. return $reflection->hasMethod($methodName);
  108. }
  109. //顶级部门过滤 取别名a
  110. public function scopeATopClear($query, $user, $search)
  111. {
  112. //是否所有部门
  113. $is_all_depart = $user['is_all_depart'] ?? 0;
  114. //权限范围内的部门
  115. $depart_range = $user['depart_range'] ?? [];
  116. //顶级部门
  117. $search_depart_id = $search['top_depart_id'] ?? 0;
  118. if(empty($search_depart_id)){
  119. //默认进来 自身顶级公司
  120. $top_depart_id = $user['depart_top'][0] ?? [];
  121. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  122. }else{
  123. //查询 顶级公司
  124. $top_depart_id = $search_depart_id;
  125. }
  126. if($is_all_depart){
  127. //所有部门
  128. if(empty($search_depart_id)){
  129. //全部
  130. $query->whereIn('a.top_depart_id', $depart_range);
  131. }else{
  132. //查看某个分社
  133. $query->where('a.top_depart_id', $top_depart_id);
  134. }
  135. }else{
  136. //某个分社全部
  137. $query->where('a.top_depart_id', $top_depart_id);
  138. }
  139. return $query;
  140. }
  141. }