|
|
@@ -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)
|