浏览代码

查看权限

cqpCow 1 年之前
父节点
当前提交
50e35d8d95

+ 9 - 10
app/Http/Middleware/CheckLogin.php

@@ -2,6 +2,7 @@
 
 namespace App\Http\Middleware;
 
+use App\Model\Depart;
 use App\Service\EmployeeService;
 use Closure;
 use App\Service\TokenService;
@@ -35,17 +36,15 @@ class CheckLogin
 
         //人员角色
         $data['role'] = EmployeeService::getPersonRole($result);
-        //部门 是否有总社权限
-        list($depart, $is_main) = EmployeeService::getLoginDepart($result);
+        list($depart, $top, $map, $rule) = EmployeeService::getLoginDepart($result);
+        //所属部门
         $data['rule_depart'] = $depart;
-        $data['is_main'] = $is_main;
-        $depart_b = [];
-        if(is_array($depart)){
-            foreach ($depart as $value){
-                $depart_b[] = $value['depart_id'];
-            }
-        }
-        $data['depart_has'] = $depart_b;
+        //顶级部门
+        $data['depart_top'] = $top;
+        //部门对应的顶级部门
+        $data['depart_map'] = $map;
+        //权限范围内的部门
+        $data['depart_range'] = $rule;
 
         //写入user信息
         $request->userData = $data;

+ 1 - 4
app/Model/Construction.php

@@ -38,10 +38,7 @@ class Construction extends Model
     protected static function boot(){
         parent::boot();
         if(self::$is_search){
-            $depart = self::$user['depart_has'] ?? [];
-            $is_main = self::$user['is_main'] ?? 0;
-            $user_id = self::$user['id'] ?? 0;
-            static::addGlobalScope(new DepartmentScope($depart,$is_main,$user_id));
+            static::addGlobalScope(new DepartmentScope(self::$user));
         }
     }
 }

+ 1 - 4
app/Model/SalesOrder.php

@@ -41,10 +41,7 @@ class SalesOrder extends Model
     protected static function boot(){
         parent::boot();
         if(self::$is_search){
-            $depart = self::$user['depart_has'] ?? [];
-            $is_main = self::$user['is_main'] ?? 0;
-            $user_id = self::$user['id'] ?? 0;
-            static::addGlobalScope(new DepartmentScope($depart,$is_main,$user_id));
+            static::addGlobalScope(new DepartmentScope(self::$user));
         }
     }
 }

+ 8 - 11
app/Scopes/DepartmentScope.php

@@ -1,31 +1,28 @@
 <?php
 namespace App\Scopes;
 
+use App\Model\Employee;
 use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Scope;
 
 class DepartmentScope implements Scope
 {
-    public $depart_id = [];
-    public $is_main = 0;
-    public $user_id = 0;
+    public $user = [];
 
-    public function __construct($depart_id = [], $is_main = 0, $user_id = 0)
+    public function __construct($user = [])
     {
-        if(! is_array($depart_id)) $depart_id = [$depart_id];
-        $this->depart_id = $depart_id;
-        $this->is_main = $is_main;
-        $this->user_id = $user_id;
+        $this->user = $user;
     }
 
     public function apply(Builder $builder, Model $model)
     {
-        if(! $this->is_main) {
-            $depart_id = $this->depart_id;
-            $user_id = $this->user_id;
+        if($this->user['id'] != Employee::SPECIAL_ADMIN) {
+            $depart_id = $this->user['depart_range'];
+            $user_id = $this->user['id'];
             $builder->where(function ($query) use ($depart_id,$user_id){
                 $query->whereIn('depart_id', $depart_id)
+                    ->orWhereIn('top_depart_id',$depart_id)
                     ->orWhere('crt_id', $user_id);
             });
         }

+ 2 - 0
app/Service/ConstructionService.php

@@ -311,7 +311,9 @@ class ConstructionService extends Service
         }else{
             if(empty($data['address1']) || empty($data['address2'])) return [false,'地址不能为空'];
         }
+        //所属部门 以及  顶级部门
         if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
+        $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
 
         if($is_add){
             $bool = Construction::where('del_time',0)->where('order_number',$data['order_number'])->exists();

+ 79 - 36
app/Service/EmployeeService.php

@@ -746,31 +746,6 @@ class EmployeeService extends Service
         return $object;
     }
 
-    //获取登录账号的权限部门 暂时不用了
-    public static function getPersonDepart($employee_id){
-        if(empty($employee_id)) return [];
-
-        //admin账号
-        if($employee_id == Employee::SPECIAL_ADMIN) return [Depart::RULE_DEPART];
-
-        //操作人员直接绑定部门
-        $employee_manager_depart = EmployeeManagerDepart::where('del_time',0)
-            ->where('employee_id',$employee_id)
-            ->select('depart_id')
-            ->get()->toArray();
-
-        //操作人员绑定角色
-        $employee_role = EmployeeRole::from('employee_role as a')
-            ->leftJoin('role_depart as b','b.role_id','a.role_id')
-            ->select('b.depart_id','b.role_id')
-            ->where('a.del_time',0)
-            ->where('b.del_time',0)
-            ->where('a.employee_id',$employee_id)
-            ->get()->toArray();
-
-        return array_filter(array_merge_recursive(array_column($employee_manager_depart,'depart_id'),array_column($employee_role,'depart_id')));
-    }
-
     //人员直接绑定部门
     public function employeeManagerDepart($data,$user){
         if($user['id'] != Employee::SPECIAL_ADMIN) return [false,'非ADMIN账号不能操作'];
@@ -816,32 +791,100 @@ class EmployeeService extends Service
 
     //获取登录账号的部门
     public static function getLoginDepart($employee_id){
-        $is_main = 0;//是否总社
-        if(empty($employee_id)) return ['', $is_main];
+        if(empty($employee_id)) return ['', '','',''];
 
         //admin账号
-        if($employee_id == Employee::SPECIAL_ADMIN) {
-            $is_main = 1;
-            return [Depart::RULE_DEPART, $is_main];
-        }
+        if($employee_id == Employee::SPECIAL_ADMIN) return [Depart::RULE_DEPART, '','',''];
 
         //自己绑定的部门 启用的部门
         $depart = EmployeeDepartPermission::from('employee_depart_permission as a')
             ->join('depart as b','b.id','a.depart_id')
             ->where('a.employee_id',$employee_id)
             ->where('b.is_use',Depart::IS_UES)
-            ->select('a.depart_id','b.is_main')
+            ->select('a.depart_id','b.is_main','b.parent_id')
             ->orderBy('a.depart_id','asc')
             ->get()->toArray();
+
+        $top = $map = $rule = [];
         if(! empty($depart)){
+            $list = Depart::where('del_time',0)->get()->toArray();
+            $depart_map = array_column($list,null,'id');
+            foreach ($depart as $value){
+                if($value['parent_id'] == 0){//顶级
+                    $tmp['depart_id'] = $value['depart_id'];
+                    $tmp['is_main'] = $value['is_main'];
+                    $top[] = $tmp;
+                    $map[$value['depart_id']] = $value['depart_id'];
+                }else{
+                    $t = self::getTopParentId($value['depart_id'],$list);
+                    if($t && isset($depart_map[$t])) {
+                        $tmp['depart_id'] = $depart_map[$t]['id'];
+                        $tmp['is_main'] = $depart_map[$t]['is_main'];
+                        $top[] = $tmp;
+                        $map[$value['depart_id']] = $t;
+                    }
+                }
+            }
             foreach ($depart as $value){
-                if($value['is_main'] > 0) {
-                    $is_main = 1;
-                    continue;
+                if(in_array($value['depart_id'],$rule)) continue;
+                if(! $value['parent_id']){ //顶级
+                    if($value['is_main']) {//是总公司
+                        //所有部门都有
+                        $rule = array_column($list,'id');
+                    }else{//不是总公司
+                        //自己以及子部门
+                        $depart_id = array_merge(self::getAllIds($list,$map[$value['depart_id']]),[$map[$value['depart_id']]]);
+                        $rule = array_merge_recursive($rule,$depart_id);
+                    }
+                }else{//非顶级
+                    if($value['is_main']) {//是总社
+                        $top_tmp = $map[$value['depart_id']];
+                        if(! empty($depart_map[$top_tmp]['is_main'])){
+                            //顶级部门是总社
+                            //所有部门都有
+                            $rule = array_column($list,'id');
+                        }else{
+                            $depart_id = array_merge(self::getAllIds($list,$map[$value['depart_id']]),[$map[$value['depart_id']]]);
+                            $rule = array_merge_recursive($rule,$depart_id);
+                        }
+                    }else{
+                        $rule = array_merge($rule,[$value['depart_id']]);
+                    }
                 }
             }
         }
 
-        return [$depart, $is_main];
+        return [$depart, $top, $map, array_unique($rule)];
+    }
+
+    public static function getTopParentId($id, $data) {
+        foreach ($data as $item) {
+            if ($item['id'] == $id) {
+                if ($item['parent_id'] == 0) {
+                    // 找到最顶级的id
+                    return $item['id'];
+                } else {
+                    // 继续递归查找父级
+                    return self::getTopParentId($item['parent_id'], $data);
+                }
+            }
+        }
+
+        // 如果没有找到匹配的id,则返回null或者其他你希望的默认值
+        return 0;
+    }
+
+    public static function getAllIds($data, $id) {
+        $result = array(); // 存储结果的数组
+
+        foreach ($data as $node) {
+            if ($node['parent_id'] == $id) { // 如果当前节点的父 ID 等于指定 ID,则将该节点添加到结果中
+                $result[] = $node['id'];
+                // 递归查询该节点的所有子孙节点,并将结果合并到结果数组中
+                $result = array_merge($result, self::getAllIds($data, $node['id']));
+            }
+        }
+
+        return $result;
     }
 }

+ 2 - 0
app/Service/SalesOrderService.php

@@ -407,7 +407,9 @@ class SalesOrderService extends Service
             $res = $this->checkNumber($data['discount_fee']);
             if(! $res) return [false, '优惠金额请输入不超过两位小数并且大于0的数值'];
         }
+        //所属部门 以及  顶级部门
         if(empty($data['depart_id'])) $data['depart_id'] = $this->getDepart($user);
+        $data['top_depart_id'] = $user['depart_map'][$data['depart_id']] ?? 0;
 
         if($data['model_type'] == SalesOrder::Model_type_one){
             if(empty($data['order_type'])) return [false,'订单类型不能为空'];

+ 4 - 3
app/Service/Service.php

@@ -4,6 +4,7 @@ namespace App\Service;
 
 
 use App\Jobs\OperationLog;
+use App\Model\Employee;
 use Illuminate\Support\Facades\Redis;
 
 /**
@@ -349,8 +350,8 @@ class Service
 
     public function getDepart($user){
         if(empty($user)) return 0;
-        if(! empty($user['is_main'])) return 0;
-        $depart = array_shift($user['depart_has']);
-        return $depart;
+        if($user['id'] == Employee::SPECIAL_ADMIN) return 0;
+        $depart = array_shift($user['rule_depart']);
+        return $depart['depart_id'];
     }
 }