DataScopeBaseModel.php 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace App\Model;
  3. use Illuminate\Database\Eloquent\Model;
  4. class DataScopeBaseModel extends Model
  5. {
  6. //人员id字段 创建人
  7. const employee_column = '';
  8. //有权限的人的表
  9. const table_column = '';
  10. //有权限的人的表关联id
  11. const table_id_column = '';
  12. public function __construct(array $attributes = [])
  13. {
  14. parent::__construct($attributes);
  15. }
  16. //根据公司过滤
  17. public function scopeTopClear($query, $user, $search)
  18. {
  19. $top_depart_id = "top_depart_id";
  20. // 获取当前查询的表名或别名(这样无论你起什么别名 i 还是 item_details 都能自适应)
  21. $table = $query->getQuery()->from;
  22. // 如果 $table 里包含 " as ",说明有别名,截取别名部分
  23. if (strpos($table, ' as ') !== false) {
  24. $segments = explode(' as ', $table);
  25. $table = trim(end($segments));
  26. $top_depart_id = $table . '.top_depart_id';
  27. }
  28. $query->where($top_depart_id, $user['top_depart_id']);
  29. return $query;
  30. $query->where('top_depart_id', $user['top_depart_id']);
  31. return $query;
  32. }
  33. //数据权限中 人员 部门 所有 (在公司的基础上)
  34. public function scopeClear($query, $user, $search)
  35. {
  36. //权限范围内的部门
  37. $depart_range = $user['depart_id'] ?? [];
  38. //个人 部门 所有
  39. $auth_type = $this->getQx($search,$user);
  40. // 获取模型的实例
  41. $model = $query->getModel();
  42. // 获取模型类名
  43. $className = get_class($model);
  44. // 人员字段
  45. $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : '';
  46. $this->makeModel($query, $auth_type, $user, $depart_range,$column);
  47. }
  48. private function makeModel(&$query, $auth_type, $user, $depart_range, $column){
  49. $query->where('top_depart_id', $user['top_depart_id']);
  50. if(empty($column)) return;
  51. if($auth_type == Employee::AUTH_ONE){
  52. //我创建的
  53. $query->where($column,$user['id']);
  54. }elseif ($auth_type == Employee::AUTH_TWO){
  55. if (empty($depart_range)) {
  56. $query->whereRaw('1 = 0');
  57. } else {
  58. $query->whereExists(function ($q) use ($column, $depart_range) {
  59. $q->from('employee_depart_permission')
  60. ->whereColumn('employee_depart_permission.employee_id', $column)
  61. ->whereIn('employee_depart_permission.depart_id', $depart_range);
  62. });
  63. }
  64. }elseif ($auth_type == Employee::AUTH_THREE){
  65. //所有
  66. }
  67. }
  68. //根据公司过滤 加人员
  69. public function scopeTopAndEmployeeClear($query, $user, $search)
  70. {
  71. $top_depart_id = "top_depart_id";
  72. $table = $query->getQuery()->from;
  73. $alias = $table; // 默认为原表名
  74. // 如果 $table 里包含 " as ",说明有别名,截取别名部分
  75. if (strpos($table, ' as ') !== false) {
  76. $segments = explode(' as ', $table);
  77. $table = trim(end($segments));
  78. $top_depart_id = $table . '.top_depart_id';
  79. }
  80. $query->where($top_depart_id, $user['top_depart_id']);
  81. // 获取模型的实例
  82. $model = $query->getModel();
  83. // 获取模型类名
  84. $className = get_class($model);
  85. $relationTable = defined($className . '::table_column') ? constant($className . '::table_column') : '';
  86. $relationTableId = defined($className . '::table_id_column') ? constant($className . '::table_id_column') : '';
  87. if($user['is_admin'] != Employee::IS_ADMIN_TWO){
  88. if (! empty($relationTable) && ! empty($relationTableId)) {
  89. $query->whereExists(function ($subQuery) use ($relationTable, $user, $alias, $relationTableId) {
  90. $subQuery->from($relationTable)
  91. ->whereColumn($relationTable . ".{$relationTableId}", $alias . '.id') // 关联主表的 ID
  92. ->where($relationTable . '.data_id', $user['id']) // 过滤当前操作人
  93. ->where($relationTable . '.del_time', 0) // 排除已删除的关联记录
  94. ->where($relationTable . '.top_depart_id', 0);
  95. });
  96. }
  97. }
  98. return $query;
  99. }
  100. public function getQx($data, $user){
  101. if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
  102. if($user['is_admin'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部
  103. if(! empty($user['menu_permissions'][$data['menu_id']])) {
  104. //指定菜单 显示对应权限
  105. return $user['menu_permissions'][$data['menu_id']];
  106. }else{
  107. return Employee::AUTH_ONE; // 我的
  108. }
  109. }
  110. function hasMethod($class, $methodName)
  111. {
  112. $reflection = new \ReflectionClass($class);
  113. return $reflection->hasMethod($methodName);
  114. }
  115. }