cqp 3 周之前
父節點
當前提交
9dca5e6455
共有 3 個文件被更改,包括 308 次插入52 次删除
  1. 1 1
      app/Model/Customer.php
  2. 287 51
      app/Model/UseScopeBaseNewModel.php
  3. 20 0
      app/Service/RangeService.php

+ 1 - 1
app/Model/Customer.php

@@ -2,7 +2,7 @@
 
 namespace App\Model;
 
-class Customer extends UseScopeBaseModel
+class Customer extends UseScopeBaseNewModel
 {
     protected $table = "customer"; //指定表
     const CREATED_AT = 'crt_time';

+ 287 - 51
app/Model/UseScopeBaseNewModel.php

@@ -4,12 +4,228 @@ namespace App\Model;
 
 use App\Service\RangeService;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Support\Facades\DB;
 
 class UseScopeBaseNewModel extends Model
 {
     const range_function = '';
     const is_check_function = '';
 
+    //部门和顶级部门(公司)过滤
+    public function scopeClear1($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] ?? [];
+        $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;
+            }
+        }
+
+        $id = [];
+        //可见范围 以及单据里面填写人员 (状态类 是全部时检索)
+        if($function_range_bool) $id = RangeService::$range_function($user,$search);
+        $tmpTable = null;
+        if(! empty($id)){
+            $tmpTable = RangeService::createTemporaryIdTable($id);
+        }
+
+        //全部0 待审1 已审2 (状态类 是全部时检索)
+        $check_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(! 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){
+                    //全部
+                    $query->when(! empty($check_search), function ($query) use ($check_search) {
+                        return $query->whereRaw($check_search);
+                    });
+                }elseif($auth_type == 1){
+                    //我创建的 且加上可见
+                    $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);
+                        });
+                }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);
+                        });
+                }elseif ($auth_type == 2 || $auth_type == 3){
+                    //自己权限范围内的部门 或 所有
+                    $query->whereIn('depart_id', $depart_range);
+                }
+            }
+        }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) { //指定公司下 且 我创建的  且加上可见
+                    $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 || $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);
+                        });
+                }
+            }else{
+                if(! $auth_type){
+                    //查看指定公司
+                    $query->where('top_depart_id', $top_depart_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 || $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);
+                        });
+                }
+            }
+        }
+    }
+
+    //非所有权限
+    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;
@@ -21,91 +237,111 @@ class UseScopeBaseNewModel extends Model
         $model = $query->getModel();
         $className = get_class($model);
 
-        // 1. 获取可见范围子查询 (不再是数组)
         $range_function = "";
         if (defined($className . '::range_function')) $range_function = $className::range_function;
-        $idSubQuery = null;
-        if ($range_function && $this->hasMethod(new RangeService(), $range_function)) {
-            $idSubQuery = RangeService::$range_function($user, $search);
-        }
+        $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);
 
-        // 2. 确定顶级部门 ID
         $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;
 
-        // 3. 审核状态过滤 (whereRaw)
-        $check_search = "";
-        $is_check_function = defined($className . '::is_check_function') ? $className::is_check_function : "";
-        if ($is_check && $is_check_function && $this->hasMethod(new RangeService(), $is_check_function)) {
-            $check_search = RangeService::$is_check_function($user, $search);
+        // --- 核心修改:处理临时表 ---
+        $id = [];
+        $tmpTable = null;
+        if ($function_range_bool) {
+            $id = RangeService::$range_function($user, $search);
+            if (!empty($id)) {
+                // 调用你已经实现的创建临时表方法
+                $tmpTable = RangeService::createTemporaryIdTable($id, $user['id']);
+            }
         }
 
-        // 4. 执行路由过滤
+        $check_search = "";
+        if ($is_check_function_bool && $is_check) $check_search = RangeService::$is_check_function($user, $search);
+
         if ($is_see) {
-            $query->whereIn('id', $idSubQuery);
+            // 如果是“我可见的”,直接关联临时表或 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) {
-            $this->allDepart($query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search);
+            // 传递 $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, $idSubQuery, $check_search);
+            $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 allDepart(&$query, $is_check, $auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery, $check_search)
-    {
-        $query->where(function ($q) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id, $idSubQuery) {
-            $q->where(function ($inner) use ($auth_type, $user, $depart_range, $search_depart_id, $top_depart_id) {
-                // 如果指定了 top_depart_id,则必须满足该条件
-                if (!empty($search_depart_id)) {
-                    $inner->where('top_depart_id', $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) {
-                    $inner->where('crt_id', $user['id']);
+                    $sub->where('crt_id', $user['id']);
                 } elseif ($auth_type == 2 || $auth_type == 3) {
-                    $inner->whereIn('depart_id', $depart_range);
+                    $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");
+                    });
                 }
             });
 
-            // 加上可见范围 (OR 关系)
-            if ($idSubQuery) {
-                $q->orWhereIn('id', $idSubQuery);
+            // 3. 审核过滤
+            if ($is_check && !empty($check_search)) {
+                $q->whereRaw($check_search);
             }
         });
-
-        if ($is_check && !empty($check_search)) {
-            $query->whereRaw($check_search);
-        }
     }
 
-    private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $idSubQuery, $check_search)
-    {
-        $query->where(function ($q) use ($auth_type, $user, $depart_range, $top_depart_id, $idSubQuery) {
-            $q->where(function ($inner) use ($auth_type, $user, $depart_range, $top_depart_id) {
-                // 非全权限模式下,top_depart_id 是强制的
-                $inner->where('top_depart_id', $top_depart_id);
+    private function notAllDepart(&$query, $is_check, $auth_type, $user, $depart_range, $top_depart_id, $tmpTable, $check_search) {
+        $query->where(function ($q) use ($top_depart_id, $auth_type, $user, $depart_range, $is_check, $check_search, $tmpTable) {
 
+            $q->where('top_depart_id', $top_depart_id);
+
+            $q->where(function ($sub) use ($auth_type, $user, $depart_range, $tmpTable) {
                 if ($auth_type == 1) {
-                    $inner->where('crt_id', $user['id']);
+                    $sub->where('crt_id', $user['id']);
                 } elseif ($auth_type == 2) {
-                    $inner->whereIn('depart_id', $depart_range);
+                    $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");
+                    });
                 }
-                // auth_type 为 0 或 3 时,仅保留 top_depart_id 过滤
             });
 
-            if ($idSubQuery) {
-                $q->orWhereIn('id', $idSubQuery);
+            if ($is_check && !empty($check_search)) {
+                $q->whereRaw($check_search);
             }
         });
-
-        if ($is_check && !empty($check_search)) {
-            $query->whereRaw($check_search);
-        }
     }
 
     public function getQx($data, $user)

+ 20 - 0
app/Service/RangeService.php

@@ -130,6 +130,26 @@ class RangeService extends Service
         return [$depart, $employee, $depart2];
     }
 
+    // 在 RangeService 或相关工具类中添加
+    public static function createTemporaryIdTable($ids, $userId) {
+        // 加上简单的后缀,防止同个请求内多次查询冲突
+        $tableName = 'tmp_c_range_' . $userId . '_' . mt_rand(100, 999);
+
+        // 1. 创建表,字段名唯一化
+        DB::statement("CREATE TEMPORARY TABLE {$tableName} (range_allowed_id INT PRIMARY KEY) ENGINE=InnoDB");
+
+        // 2. 批量插入
+        if (!empty($ids)) {
+            $chunks = array_chunk($ids, 1000);
+            foreach ($chunks as $chunk) {
+                $data = array_map(function($id) { return ['range_allowed_id' => $id]; }, $chunk);
+                DB::table($tableName)->insert($data);
+            }
+        }
+
+        return $tableName;
+    }
+
     //获取可见范围数据id
     public static function getRangeDataId($user,$data_type){
         $user_id = $user['id'];