UseScopeBaseNewModel.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  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 UseScopeBaseNewModel 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. $range_function = "";
  20. if (defined($className . '::range_function')) $range_function = $className::range_function;
  21. $function_range_bool = $this->hasMethod(new RangeService(), $range_function);
  22. $is_check_function = "";
  23. if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
  24. $is_check_function_bool = $this->hasMethod(new RangeService(), $is_check_function);
  25. $search_depart_id = $search['top_depart_id'] ?? 0;
  26. $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
  27. $top_depart_id = ($is_all_depart && !empty($search_depart_id)) ? $search_depart_id : $my_top_depart_id;
  28. // --- 核心修改:处理临时表 ---
  29. $id = [];
  30. $tmpTable = null;
  31. if ($function_range_bool) {
  32. $id = RangeService::$range_function($user, $search);
  33. if (!empty($id)) {
  34. // 调用你已经实现的创建临时表方法
  35. $tmpTable = RangeService::createTemporaryIdTable($id, $user['id']);
  36. }
  37. }
  38. $check_search = "";
  39. if ($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user, $search);
  40. if ($is_see) {
  41. // 如果是“我可见的”,直接关联临时表或 whereIn
  42. if ($tmpTable) {
  43. $query->whereExists(function ($q) use ($tmpTable) {
  44. $q->select(DB::raw(1))->from($tmpTable)->whereRaw("{$tmpTable}.range_allowed_id = id");
  45. });
  46. } else {
  47. $query->whereIn('id', $id);
  48. }
  49. } elseif ($is_all_depart) {
  50. // 传递 $tmpTable 代替 $id
  51. $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search);
  52. } else {
  53. $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search);
  54. }
  55. if (!empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
  56. }
  57. private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search)
  58. {
  59. if (empty($search_depart_id)) {
  60. if ($is_check) {
  61. if (! $auth_type) {
  62. //全部
  63. $query->when(! empty($check_search), function ($query) use ($check_search) {
  64. return $query->whereRaw($check_search);
  65. });
  66. } elseif ($auth_type == 1) {
  67. //我创建的 且加上可见
  68. $query->where('crt_id', $user['id'])
  69. ->when(! empty($check_search), function ($query) use ($check_search) {
  70. return $query->whereRaw($check_search);
  71. })
  72. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  73. return $query->orWhereExists(function ($q) use ($tmpTable) {
  74. $q->select(DB::raw(1))
  75. ->from($tmpTable)
  76. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  77. });
  78. });
  79. } elseif ($auth_type == 2 || $auth_type == 3) {
  80. //自己权限范围内的部门 或 所有
  81. $query->whereIn('depart_id', $depart_range)
  82. ->when(! empty($check_search), function ($query) use ($check_search) {
  83. return $query->whereRaw($check_search);
  84. });
  85. }
  86. } else {
  87. if ($auth_type == 1) { //我创建的 且加上可见
  88. $query->where('crt_id', $user['id'])
  89. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  90. return $query->orWhereExists(function ($q) use ($tmpTable) {
  91. $q->select(DB::raw(1))
  92. ->from($tmpTable)
  93. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  94. });
  95. });
  96. } elseif ($auth_type == 2 || $auth_type == 3) {
  97. //自己权限范围内的部门 或 所有
  98. $query->whereIn('depart_id', $depart_range);
  99. }
  100. }
  101. } else {
  102. if ($is_check) {
  103. if (! $auth_type) {
  104. //查看指定公司
  105. $query->where('top_depart_id', $top_depart_id)
  106. ->when(! empty($check_search), function ($query) use ($check_search) {
  107. return $query->whereRaw($check_search);
  108. });
  109. } elseif ($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  110. $query->where('top_depart_id', $top_depart_id)
  111. ->where('crt_id', $user['id'])
  112. ->when(! empty($check_search), function ($query) use ($check_search) {
  113. return $query->whereRaw($check_search);
  114. })
  115. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  116. return $query->orWhereExists(function ($q) use ($tmpTable) {
  117. $q->select(DB::raw(1))
  118. ->from($tmpTable)
  119. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  120. });
  121. });
  122. } elseif ($auth_type == 2 || $auth_type == 3) {
  123. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  124. $query->where('top_depart_id', $top_depart_id)
  125. ->whereIn('depart_id', $depart_range)
  126. ->when(! empty($check_search), function ($query) use ($check_search) {
  127. return $query->whereRaw($check_search);
  128. })
  129. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  130. return $query->orWhereExists(function ($q) use ($tmpTable) {
  131. $q->select(DB::raw(1))
  132. ->from($tmpTable)
  133. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  134. });
  135. });
  136. }
  137. } else {
  138. if (! $auth_type) {
  139. //查看指定公司
  140. $query->where('top_depart_id', $top_depart_id);
  141. } elseif ($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  142. $query->where('top_depart_id', $top_depart_id)
  143. ->where('crt_id', $user['id'])
  144. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  145. return $query->orWhereExists(function ($q) use ($tmpTable) {
  146. $q->select(DB::raw(1))
  147. ->from($tmpTable)
  148. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  149. });
  150. });
  151. } elseif ($auth_type == 2 || $auth_type == 3) {
  152. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  153. $query->where('top_depart_id', $top_depart_id)
  154. ->whereIn('depart_id', $depart_range)
  155. ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
  156. return $query->orWhereExists(function ($q) use ($tmpTable) {
  157. $q->select(DB::raw(1))
  158. ->from($tmpTable)
  159. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  160. });
  161. });
  162. }
  163. }
  164. }
  165. }
  166. //非所有权限
  167. private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search){
  168. if ($is_check){
  169. if(! $auth_type || $auth_type == 3){
  170. //指定公司下全部 且加上可见
  171. $query->where('top_depart_id', $top_depart_id)
  172. ->when(! empty($check_search), function ($query) use ($check_search) {
  173. return $query->whereRaw($check_search);
  174. })
  175. ->when($tmpTable, function ($query) use ($tmpTable) {
  176. return $query->orWhereExists(function ($q) use ($tmpTable) {
  177. $q->select(DB::raw(1))
  178. ->from($tmpTable)
  179. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  180. });
  181. });
  182. }else if($auth_type == 1) {
  183. //指定公司下 且 我创建的 且加上可见
  184. $query->where('top_depart_id', $top_depart_id)
  185. ->where('crt_id',$user['id'])
  186. ->when(! empty($check_search), function ($query) use ($check_search) {
  187. return $query->whereRaw($check_search);
  188. })
  189. ->when($tmpTable, function ($query) use ($tmpTable) {
  190. return $query->orWhereExists(function ($q) use ($tmpTable) {
  191. $q->select(DB::raw(1))
  192. ->from($tmpTable)
  193. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  194. });
  195. });
  196. }elseif ($auth_type == 2) {
  197. //指定公司下 且 自己权限范围内的部门 且加上可见
  198. $query->where('top_depart_id', $top_depart_id)
  199. ->whereIn('depart_id', $depart_range)
  200. ->when(! empty($check_search), function ($query) use ($check_search) {
  201. return $query->whereRaw($check_search);
  202. })
  203. ->when($tmpTable, function ($query) use ($tmpTable) {
  204. return $query->orWhereExists(function ($q) use ($tmpTable) {
  205. $q->select(DB::raw(1))
  206. ->from($tmpTable)
  207. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  208. });
  209. });
  210. }
  211. }else{
  212. if(! $auth_type || $auth_type == 3){
  213. //指定公司下全部|所有 且加上可见
  214. $query->where('top_depart_id', $top_depart_id)
  215. ->when($tmpTable, function ($query) use ($tmpTable) {
  216. return $query->orWhereExists(function ($q) use ($tmpTable) {
  217. $q->select(DB::raw(1))
  218. ->from($tmpTable)
  219. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  220. });
  221. });
  222. }elseif($auth_type == 1) {
  223. //指定公司下 且 我创建的 且加上可见
  224. $query->where('top_depart_id', $top_depart_id)
  225. ->where('crt_id',$user['id'])
  226. ->when($tmpTable, function ($query) use ($tmpTable) {
  227. return $query->orWhereExists(function ($q) use ($tmpTable) {
  228. $q->select(DB::raw(1))
  229. ->from($tmpTable)
  230. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  231. });
  232. });
  233. }elseif ($auth_type == 2) {
  234. //指定公司下 且 自己权限范围内的部门 且加上可见
  235. $query->where('top_depart_id', $top_depart_id)
  236. ->whereIn('depart_id', $depart_range)
  237. ->when($tmpTable, function ($query) use ($tmpTable) {
  238. return $query->orWhereExists(function ($q) use ($tmpTable) {
  239. $q->select(DB::raw(1))
  240. ->from($tmpTable)
  241. ->whereRaw("{$tmpTable}.range_allowed_id = id");
  242. });
  243. });
  244. }
  245. }
  246. }
  247. public function getQx($data, $user)
  248. {
  249. if (empty($data['menu_id'])) return 0;
  250. // 假设 Employee 常量在此可用,若不可用请自行调整
  251. if ($user['id'] == 1) return 0; // 这里的1代表超级管理员ID
  252. return $user['role_authority'][$data['menu_id']] ?? 0;
  253. }
  254. function hasMethod($class, $methodName)
  255. {
  256. if (empty($methodName)) return false;
  257. return method_exists($class, $methodName);
  258. }
  259. }