DataScopeBaseModel.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  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. public function __construct(array $attributes = [])
  9. {
  10. parent::__construct($attributes);
  11. }
  12. //根据公司过滤
  13. public function scopeTopClear($query, $user, $search)
  14. {
  15. $query->where('top_depart_id', $user['top_depart_id']);
  16. return $query;
  17. }
  18. //数据权限中 人员 部门 所有 (在公司的基础上)
  19. public function scopeClear($query, $user, $search)
  20. {
  21. //权限范围内的部门
  22. $depart_range = $user['depart_id'] ?? [];
  23. //个人 部门 所有
  24. $auth_type = $this->getQx($search,$user);
  25. // 获取模型的实例
  26. $model = $query->getModel();
  27. // 获取模型类名
  28. $className = get_class($model);
  29. // 人员字段
  30. $column = defined($className . '::employee_column') ? constant($className . '::employee_column') : '';
  31. $this->makeModel($query, $auth_type, $user, $depart_range,$column);
  32. }
  33. //最高权限
  34. private function makeModel(&$query, $auth_type, $user, $depart_range, $column){
  35. $query->where('top_depart_id', $user['top_depart_id']);
  36. if(empty($column)) return;
  37. if($auth_type == Employee::AUTH_ONE){
  38. //我创建的
  39. $query->where($column,$user['id']);
  40. }elseif ($auth_type == Employee::AUTH_TWO){
  41. if (empty($depart_range)) {
  42. $query->whereRaw('1 = 0');
  43. } else {
  44. $query->whereExists(function ($q) use ($column, $depart_range) {
  45. $q->from('employee_depart_permission')
  46. ->whereColumn('employee_depart_permission.employee_id', $column)
  47. ->whereIn('employee_depart_permission.depart_id', $depart_range);
  48. });
  49. }
  50. }elseif ($auth_type == Employee::AUTH_THREE){
  51. //所有
  52. }
  53. }
  54. public function getQx($data, $user){
  55. if(empty($data['menu_id'])) return Employee::AUTH_ONE; // 我的
  56. if($user['top_depart_id'] == Employee::IS_ADMIN_TWO) return Employee::AUTH_THREE; // 全部
  57. if(! empty($user['menu_permissions'][$data['menu_id']])) {
  58. //指定菜单 显示对应权限
  59. return $user['menu_permissions'][$data['menu_id']];
  60. }else{
  61. return Employee::AUTH_ONE; // 我的
  62. }
  63. }
  64. function hasMethod($class, $methodName)
  65. {
  66. $reflection = new \ReflectionClass($class);
  67. return $reflection->hasMethod($methodName);
  68. }
  69. }