UseScopeBaseModel.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  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. //个人部门所有
  73. $auth_type = $this->getQx($search,$user);
  74. if($is_all_depart){
  75. //所有权限
  76. if(empty($search_depart_id)){
  77. if(! $is_see){
  78. if(! $auth_type){
  79. //全部
  80. $query->whereIn('depart_id', $depart_range);
  81. }else{
  82. if($auth_type == 1) { //我创建的 且加上可见
  83. $query->where('crt_id',$user['id'])
  84. ->orWhereIn('id', $id);
  85. }elseif ($auth_type == 2 || $auth_type == 3){
  86. //自己权限范围内的部门 或 所有
  87. $query->whereIn('depart_id', $depart_range);
  88. }
  89. }
  90. }else{
  91. //可见
  92. $query->whereIn('id', $id);
  93. }
  94. }else{
  95. if(! $is_see){
  96. if(! $auth_type){
  97. //查看指定公司
  98. $query->where('top_depart_id', $top_depart_id);
  99. }else{
  100. if($auth_type == 1) { //指定公司下 且 我创建的 且加上可见
  101. $query->where('top_depart_id', $top_depart_id)
  102. ->where('crt_id',$user['id'])
  103. ->orWhereIn('id', $id);
  104. }elseif ($auth_type == 2 || $auth_type == 3){
  105. // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
  106. $query->where('top_depart_id', $top_depart_id)
  107. ->whereIn('depart_id', $depart_range)
  108. ->orWhereIn('id', $id);
  109. }
  110. }
  111. }else{
  112. //查看指定公司 且 我可见
  113. $query->whereIn('id', $id);
  114. }
  115. }
  116. }else{
  117. //非所有权限
  118. if(! $is_see){
  119. if(! $auth_type){
  120. //指定公司下全部 且加上可见
  121. $query->where('top_depart_id', $top_depart_id)
  122. ->whereIn('depart_id', $depart_range)
  123. ->orWhereIn('id', $id);
  124. }else{
  125. if($auth_type == 1) {
  126. //指定公司下 且 我创建的 且加上可见
  127. $query->where('top_depart_id', $top_depart_id)
  128. ->where('crt_id',$user['id'])
  129. ->orWhereIn('id', $id);
  130. }elseif ($auth_type == 2) {
  131. //指定公司下 且 自己权限范围内的部门 且加上可见
  132. $query->where('top_depart_id', $top_depart_id)
  133. ->whereIn('depart_id', $depart_range)
  134. ->orWhereIn('id', $id);
  135. }elseif ($auth_type == 3) {
  136. // 指定公司下所有 且加上可见
  137. $query->where('top_depart_id', $top_depart_id)
  138. ->orWhereIn('id', $id);
  139. }
  140. }
  141. }else{
  142. //某个分社可见
  143. $query->whereIn('id', $id);
  144. }
  145. }
  146. }
  147. //部门和顶级部门(公司)过滤 Old
  148. public function scopeClear1($query, $user, $search)
  149. {
  150. //是否所有部门
  151. $is_all_depart = $user['is_all_depart'] ?? 0;
  152. //权限范围内的部门
  153. $depart_range = $user['depart_range'] ?? [];
  154. //我可见的
  155. $is_see = $search['is_see'] ?? 0;
  156. //可见范围方法
  157. $model = $query->getModel(); // 获取模型的实例
  158. $range_function = $model::range_function ?? ""; // 访问静态属性
  159. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  160. //顶级部门
  161. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  162. if(empty($search_depart_id)){
  163. //默认进来 自身顶级公司
  164. $top_depart_id = $user['depart_top'][0] ?? [];
  165. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  166. }else{
  167. //查询 顶级公司
  168. $top_depart_id = $search_depart_id;
  169. }
  170. $id = [];
  171. //可见范围 以及单据里面填写人员
  172. if($is_function_range) $id = RangeService::$range_function($user,$search);
  173. if($is_all_depart){
  174. //所有部门
  175. if(empty($search_depart_id)){
  176. if(! $is_see){
  177. //全部
  178. $query->whereIn('depart_id', $depart_range);
  179. }else{
  180. //可见
  181. $query->whereIn('id', $id);
  182. }
  183. }else{
  184. if(! $is_see){
  185. //查看某个分社
  186. $query->where('top_depart_id', $top_depart_id);
  187. }else{
  188. //查看某个分社可见
  189. $query->whereIn('id', $id);
  190. }
  191. }
  192. }else{
  193. //某个分社
  194. if(! $is_see){
  195. //某个分社全部
  196. $query->where('top_depart_id', $top_depart_id)
  197. ->whereIn('depart_id', $depart_range)
  198. ->orWhereIn('id', $id);
  199. }else{
  200. //某个分社可见
  201. $query->whereIn('id', $id);
  202. }
  203. }
  204. }
  205. //顶级部门过滤 取别名a
  206. public function scopeATopClear($query, $user, $search)
  207. {
  208. //是否所有部门
  209. $is_all_depart = $user['is_all_depart'] ?? 0;
  210. //权限范围内的部门
  211. $depart_range = $user['depart_range'] ?? [];
  212. //顶级部门
  213. $search_depart_id = $search['top_depart_id'] ?? 0;
  214. if(empty($search_depart_id)){
  215. //默认进来 自身顶级公司
  216. $top_depart_id = $user['depart_top'][0] ?? [];
  217. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  218. }else{
  219. //查询 顶级公司
  220. $top_depart_id = $search_depart_id;
  221. }
  222. if($is_all_depart){
  223. //所有部门
  224. if(empty($search_depart_id)){
  225. //全部
  226. $query->whereIn('a.top_depart_id', $depart_range);
  227. }else{
  228. //查看某个分社
  229. $query->where('a.top_depart_id', $top_depart_id);
  230. }
  231. }else{
  232. //某个分社全部
  233. $query->where('a.top_depart_id', $top_depart_id);
  234. }
  235. return $query;
  236. }
  237. //产品不可见 部门和顶级部门(公司)过滤
  238. public function scopeProductClear($query, $user, $search)
  239. {
  240. //是否所有部门
  241. $is_all_depart = $user['is_all_depart'] ?? 0;
  242. //权限范围内的部门
  243. $depart_range = $user['depart_range'] ?? [];
  244. //总社id
  245. $top_depart_id = $user['head'] ?? [];
  246. $top_depart = $top_depart_id['id'] ?? 0;
  247. //可见范围方法
  248. $model = $query->getModel(); // 获取模型的实例
  249. $range_function = $model::range_function ?? ""; // 访问静态属性
  250. $is_function_range = $this->hasMethod(new RangeService(),$range_function);
  251. //顶级部门
  252. $search_depart_id = $search['top_depart_id'] ?? 0; //顶级公司
  253. if(empty($search_depart_id)){
  254. //默认进来 自身顶级公司
  255. $top_depart_id = $user['depart_top'][0] ?? [];
  256. $top_depart_id = $top_depart_id['depart_id'] ?? 0;
  257. }else{
  258. //查询 顶级公司
  259. $top_depart_id = $search_depart_id;
  260. }
  261. $id = [];
  262. //产品 不可见范围
  263. if($is_function_range) $id = RangeService::$range_function($user,$search);
  264. if($is_all_depart){
  265. //所有部门
  266. if(empty($search_depart_id)){
  267. //全部
  268. $query->whereIn('depart_id', $depart_range);
  269. }else{
  270. //查看某个分社
  271. $query->where('top_depart_id', $top_depart_id);
  272. }
  273. }else{
  274. //某个分社全部 去掉不可见数
  275. $query->where('top_depart_id', $top_depart_id)
  276. ->whereIn('depart_id', $depart_range)
  277. ->orWhere('top_depart_id',$top_depart)
  278. ->whereNotIn('id', $id);
  279. }
  280. }
  281. public function getQx($data, $user){
  282. if(empty($data['menu_id'])) return 0;
  283. if($user['id'] == Employee::SPECIAL_ADMIN) return 0;
  284. if(! empty($user['role_authority'][$data['menu_id']])) {
  285. //指定菜单 显示对应权限
  286. return $user['role_authority'][$data['menu_id']];
  287. }else{
  288. return 0;
  289. }
  290. }
  291. function hasMethod($class, $methodName)
  292. {
  293. $reflection = new \ReflectionClass($class);
  294. return $reflection->hasMethod($methodName);
  295. }
  296. }