cqp 4 недель назад
Родитель
Сommit
6e8c083ae6
1 измененных файлов с 90 добавлено и 228 удалено
  1. 90 228
      app/Model/UseScopeBaseNewModel.php

+ 90 - 228
app/Model/UseScopeBaseNewModel.php

@@ -11,311 +11,173 @@ class UseScopeBaseNewModel extends Model
     const range_function = '';
     const is_check_function = '';
 
-    //部门和顶级部门(公司)过滤
-    public function scopeClear1($query, $user, $search)
+    public function scopeClear($query, $user, $search)
     {
-        //是否所有部门
         $is_all_depart = $user['is_all_depart'] ?? 0;
-        //权限范围内的部门
         $depart_range = $user['depart_range'] ?? [];
-        //我可见的
         $is_see = ! empty($search['is_see']);
-        //全部 待审 待我审核
         $is_check = ! empty($search['is_check']);
-        //个人 部门 所有
-        $auth_type = $this->getQx($search,$user);
-        // 获取模型的实例
+        $auth_type = $this->getQx($search, $user);
+
         $model = $query->getModel();
-        // 获取模型类名
         $className = get_class($model);
 
-        //可见范围方法
         $range_function = "";
         if (defined($className . '::range_function')) $range_function = $className::range_function;
-        $function_range_bool = $this->hasMethod(new RangeService(),$range_function);
+        $function_range_bool = $this->hasMethod(new RangeService(), $range_function);
 
-        //全部 待审 已审
         $is_check_function = "";
         if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
-        $is_check_function_bool = $this->hasMethod(new RangeService(),$is_check_function);
+        $is_check_function_bool = $this->hasMethod(new RangeService(), $is_check_function);
 
-        //外部传入的
         $search_depart_id = $search['top_depart_id'] ?? 0;
-        //自身的
-        $my_top_depart_id = $user['depart_top'][0] ?? [];
-        $my_top_depart_id = $my_top_depart_id['depart_id'] ?? 0;
-        if(empty($search_depart_id)){
-            $top_depart_id = $my_top_depart_id;
-        }else{
-            if($is_all_depart){
-                //顶级公司
-                $top_depart_id = $search_depart_id;
-            }else{
-                $top_depart_id = $my_top_depart_id;
-            }
-        }
+        $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
+
+        $top_depart_id = ($is_all_depart && !empty($search_depart_id)) ? $search_depart_id : $my_top_depart_id;
 
+        // --- 核心修改:处理临时表 ---
         $id = [];
-        //可见范围 以及单据里面填写人员 (状态类 是全部时检索)
-        if($function_range_bool) $id = RangeService::$range_function($user,$search);
         $tmpTable = null;
-        if(! empty($id)){
-            $tmpTable = RangeService::createTemporaryIdTable($id);
+        if ($function_range_bool) {
+            $id = RangeService::$range_function($user, $search);
+            if (!empty($id)) {
+                // 调用你已经实现的创建临时表方法
+                $tmpTable = RangeService::createTemporaryIdTable($id, $user['id']);
+            }
         }
 
-        //全部0 待审1 已审2 (状态类 是全部时检索)
         $check_search = "";
-        if($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user,$search);
+        if ($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user, $search);
 
-        if($is_see){
-            //我可见的
-            $query->whereIn('id', $id);
-        }elseif($is_all_depart){
-            //所有权限
-            $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search);
-        }else{
-            //非所有权限
-            $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search);
+        if ($is_see) {
+            // 如果是“我可见的”,直接关联临时表或 whereIn
+            if ($tmpTable) {
+                $query->whereExists(function ($q) use ($tmpTable) {
+                    $q->select(DB::raw(1))->from($tmpTable)->whereRaw("{$tmpTable}.range_allowed_id = id");
+                });
+            } else {
+                $query->whereIn('id', $id);
+            }
+        } elseif ($is_all_depart) {
+            // 传递 $tmpTable 代替 $id
+            $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search);
+        } else {
+            $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search);
         }
 
-        if(! empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
+        if (!empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
     }
 
-    //最高权限
-    private function allDepart1(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $id, $check_search){
-        if(empty($search_depart_id)){
-            if ($is_check){
-                if(! $auth_type){
+    private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search)
+    {
+        if (empty($search_depart_id)) {
+            if ($is_check) {
+                if (! $auth_type) {
                     //全部
                     $query->when(! empty($check_search), function ($query) use ($check_search) {
                         return $query->whereRaw($check_search);
                     });
-                }elseif($auth_type == 1){
+                } elseif ($auth_type == 1) {
                     //我创建的 且加上可见
-                    $query->where('crt_id',$user['id'])
+                    $query->where('crt_id', $user['id'])
                         ->when(! empty($check_search), function ($query) use ($check_search) {
                             return $query->whereRaw($check_search);
                         })
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
-                }elseif ($auth_type == 2 || $auth_type == 3){
+                } elseif ($auth_type == 2 || $auth_type == 3) {
                     //自己权限范围内的部门 或 所有
                     $query->whereIn('depart_id', $depart_range)
                         ->when(! empty($check_search), function ($query) use ($check_search) {
                             return $query->whereRaw($check_search);
                         });
                 }
-            }else{
-                if($auth_type == 1) { //我创建的 且加上可见
-                    $query->where('crt_id',$user['id'])
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+            } else {
+                if ($auth_type == 1) { //我创建的 且加上可见
+                    $query->where('crt_id', $user['id'])
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
-                }elseif ($auth_type == 2 || $auth_type == 3){
+                } elseif ($auth_type == 2 || $auth_type == 3) {
                     //自己权限范围内的部门 或 所有
                     $query->whereIn('depart_id', $depart_range);
                 }
             }
-        }else{
-            if ($is_check){
-                if(! $auth_type){
+        } else {
+            if ($is_check) {
+                if (! $auth_type) {
                     //查看指定公司
                     $query->where('top_depart_id', $top_depart_id)
                         ->when(! empty($check_search), function ($query) use ($check_search) {
                             return $query->whereRaw($check_search);
                         });
-                }elseif($auth_type == 1) { //指定公司下 且 我创建的  且加上可见
+                } elseif ($auth_type == 1) { //指定公司下 且 我创建的  且加上可见
                     $query->where('top_depart_id', $top_depart_id)
-                        ->where('crt_id',$user['id'])
+                        ->where('crt_id', $user['id'])
                         ->when(! empty($check_search), function ($query) use ($check_search) {
                             return $query->whereRaw($check_search);
                         })
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
-                }elseif ($auth_type == 2 || $auth_type == 3){
+                } elseif ($auth_type == 2 || $auth_type == 3) {
                     // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
                     $query->where('top_depart_id', $top_depart_id)
                         ->whereIn('depart_id', $depart_range)
                         ->when(! empty($check_search), function ($query) use ($check_search) {
                             return $query->whereRaw($check_search);
                         })
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
                 }
-            }else{
-                if(! $auth_type){
+            } else {
+                if (! $auth_type) {
                     //查看指定公司
                     $query->where('top_depart_id', $top_depart_id);
-                }elseif($auth_type == 1) { //指定公司下 且 我创建的  且加上可见
+                } elseif ($auth_type == 1) { //指定公司下 且 我创建的  且加上可见
                     $query->where('top_depart_id', $top_depart_id)
-                        ->where('crt_id',$user['id'])
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+                        ->where('crt_id', $user['id'])
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
-                }elseif ($auth_type == 2 || $auth_type == 3){
+                } elseif ($auth_type == 2 || $auth_type == 3) {
                     // (指定公司下的 且 自己权限范围内的部门 或 所有) 且加上可见
                     $query->where('top_depart_id', $top_depart_id)
                         ->whereIn('depart_id', $depart_range)
-                        ->when(! empty($id), function ($query) use ($id) {
-                            return $query->orWhereIn('id', $id);
+                        ->when(! empty($tmpTable), function ($query) use ($tmpTable) {
+                            return $query->orWhereExists(function ($q) use ($tmpTable) {
+                                $q->select(DB::raw(1))
+                                    ->from($tmpTable)
+                                    ->whereRaw("{$tmpTable}.range_allowed_id = id");
+                            });
                         });
                 }
             }
         }
     }
 
-    //非所有权限
-    private function notAllDepart1(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $id, $check_search){
-        if ($is_check){
-            if(! $auth_type || $auth_type == 3){
-                //指定公司下全部  且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->when(! empty($check_search), function ($query) use ($check_search) {
-                        return $query->whereRaw($check_search);
-                    })
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }else if($auth_type == 1) {
-                //指定公司下 且 我创建的 且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->where('crt_id',$user['id'])
-                    ->when(! empty($check_search), function ($query) use ($check_search) {
-                        return $query->whereRaw($check_search);
-                    })
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }elseif ($auth_type == 2) {
-                //指定公司下 且 自己权限范围内的部门 且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->whereIn('depart_id', $depart_range)
-                    ->when(! empty($check_search), function ($query) use ($check_search) {
-                        return $query->whereRaw($check_search);
-                    })
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }
-        }else{
-            if(! $auth_type || $auth_type == 3){
-                //指定公司下全部|所有  且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }elseif($auth_type == 1) {
-                //指定公司下 且 我创建的 且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->where('crt_id',$user['id'])
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }elseif ($auth_type == 2) {
-                //指定公司下 且 自己权限范围内的部门 且加上可见
-                $query->where('top_depart_id', $top_depart_id)
-                    ->whereIn('depart_id', $depart_range)
-                    ->when(! empty($id), function ($query) use ($id) {
-                        return $query->orWhereIn('id', $id);
-                    });
-            }
-        }
-    }
-
-
-    public function scopeClear($query, $user, $search)
-    {
-        $is_all_depart = $user['is_all_depart'] ?? 0;
-        $depart_range = $user['depart_range'] ?? [];
-        $is_see = ! empty($search['is_see']);
-        $is_check = ! empty($search['is_check']);
-        $auth_type = $this->getQx($search, $user);
-
-        $model = $query->getModel();
-        $className = get_class($model);
-
-        $range_function = "";
-        if (defined($className . '::range_function')) $range_function = $className::range_function;
-        $function_range_bool = $this->hasMethod(new RangeService(), $range_function);
-
-        $is_check_function = "";
-        if (defined($className . '::is_check_function')) $is_check_function = $className::is_check_function;
-        $is_check_function_bool = $this->hasMethod(new RangeService(), $is_check_function);
-
-        $search_depart_id = $search['top_depart_id'] ?? 0;
-        $my_top_depart_id = $user['depart_top'][0]['depart_id'] ?? 0;
-
-        $top_depart_id = ($is_all_depart && !empty($search_depart_id)) ? $search_depart_id : $my_top_depart_id;
-
-        // --- 核心修改:处理临时表 ---
-        $id = [];
-        $tmpTable = null;
-        if ($function_range_bool) {
-            $id = RangeService::$range_function($user, $search);
-            if (!empty($id)) {
-                // 调用你已经实现的创建临时表方法
-                $tmpTable = RangeService::createTemporaryIdTable($id, $user['id']);
-            }
-        }
-
-        $check_search = "";
-        if ($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user, $search);
-
-        if ($is_see) {
-            // 如果是“我可见的”,直接关联临时表或 whereIn
-            if ($tmpTable) {
-                $query->whereExists(function ($q) use ($tmpTable) {
-                    $q->select(DB::raw(1))->from($tmpTable)->whereRaw("{$tmpTable}.range_allowed_id = id");
-                });
-            } else {
-                $query->whereIn('id', $id);
-            }
-        } elseif ($is_all_depart) {
-            // 传递 $tmpTable 代替 $id
-            $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search);
-        } else {
-            $this->notAllDepart($query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search);
-        }
-
-        if (!empty($search['get_my_top_depart_data'])) $query->where('top_depart_id', $my_top_depart_id);
-    }
-
-    private function allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $tmpTable, $check_search) {
-        $query->where(function ($q) use ($search_depart_id, $top_depart_id, $is_check, $auth_type, $user, $depart_range, $check_search, $tmpTable) {
-
-            // 1. 设置顶级部门基础过滤
-            if (!empty($search_depart_id)) {
-                $q->where('top_depart_id', $top_depart_id);
-            }
-
-            // 2. 权限与可见范围(OR 关系)
-            $q->where(function ($sub) use ($auth_type, $user, $depart_range, $tmpTable) {
-                if ($auth_type == 1) {
-                    $sub->where('crt_id', $user['id']);
-                } elseif ($auth_type == 2 || $auth_type == 3) {
-                    $sub->whereIn('depart_id', $depart_range);
-                }
-
-                // 关键:合并可见范围临时表
-                if ($tmpTable) {
-                    $sub->orWhereExists(function ($exists) use ($tmpTable) {
-                        $exists->select(DB::raw(1))
-                            ->from($tmpTable)
-                            ->whereRaw("{$tmpTable}.range_allowed_id = id");
-                    });
-                }
-            });
-
-            // 3. 审核过滤
-            if ($is_check && !empty($check_search)) {
-                $q->whereRaw($check_search);
-            }
-        });
-    }
-
     //非所有权限
     private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search){
         if ($is_check){