cqp 2 dní pred
rodič
commit
d4e5c40a8b
2 zmenil súbory, kde vykonal 37 pridanie a 27 odobranie
  1. 12 16
      app/Model/DataScopeBaseModel.php
  2. 25 11
      app/Service/ItemService.php

+ 12 - 16
app/Model/DataScopeBaseModel.php

@@ -176,22 +176,19 @@ class DataScopeBaseModel extends Model
 
     public function scopeTopAndEmployeeClear($query, $user, $search)
     {
-        $top_depart_id = "top_depart_id";
-
         $table = $query->getQuery()->from;
-        $alias = $table; // 默认为原表名
+        $alias = $table; // 默认别名就是全表名
 
-        // 如果 $table 里包含 " as ",说明有别名,截取别名部分
+        // 如果包含 " as ",说明有别名,直接截取最后的别名部分即可
         if (strpos($table, ' as ') !== false) {
             $segments = explode(' as ', $table);
-            $table = trim(end($segments));
-
-            $top_depart_id = $table . '.top_depart_id';
+            $alias = trim(end($segments));   // 真正的别名:i
         }
 
-        $query->where($top_depart_id, $user['top_depart_id']);
+        // 统一使用别名进行公司隔离
+        $query->where($alias . '.top_depart_id', $user['top_depart_id']);
 
-        // 如果是超级管理员,直接返回,拥有最高权限
+        // 如果是超级管理员,直接放行
         if ($user['is_admin'] == Employee::IS_ADMIN_TWO) {
             return $query;
         }
@@ -204,13 +201,13 @@ class DataScopeBaseModel extends Model
         $relationTable = defined($className . '::table_column') ? constant($className . '::table_column') : '';
         $relationTableId = defined($className . '::table_id_column') ? constant($className . '::table_id_column') : '';
 
-        // 2. 新增:成员表配置
+        // 2. 成员表配置
         $detailTable = defined($className . '::detail_table_column') ? constant($className . '::detail_table_column') : '';
 
-        // 使用一个闭包将“负责人”或“成员”的权限求并集(OR 关系)
+        // 负责人 or 成员 权限并集
         $query->where(function ($groupQuery) use ($relationTable, $relationTableId, $detailTable, $user, $alias) {
 
-            // 逻辑 A:负责人层级判定(原逻辑:项目/节点/任务负责人及上级负责人穿透)
+            // 逻辑 A:负责人层级判定
             $groupQuery->whereExists(function ($subQuery) use ($relationTable, $relationTableId, $user, $alias) {
                 $subQuery->from($relationTable)
                     ->whereColumn($relationTable . ".{$relationTableId}", $alias . '.id')
@@ -219,14 +216,13 @@ class DataScopeBaseModel extends Model
                     ->where($relationTable . '.top_depart_id', $user['top_depart_id']);
             });
 
-            // 逻辑 B:成员判定(新逻辑:仅当前层级成员可见,无向下穿透性)
-            // 直接用 orWhereExists,只要定义了成员表就必然生效
+            // 逻辑 B:成员判定
             if (!empty($detailTable)) {
                 $groupQuery->orWhereExists(function ($subQuery) use ($detailTable, $relationTableId, $user, $alias) {
                     $subQuery->from($detailTable)
-                        ->whereColumn($detailTable . ".{$relationTableId}", $alias . '.id') // 同样关联主表 ID
+                        ->whereColumn($detailTable . ".{$relationTableId}", $alias . '.id')
                         ->where($detailTable . '.data_id', $user['id'])
-                        ->where($detailTable . '.type', 1)  // 严格限制:只看“1人”,排除“2设备”
+                        ->where($detailTable . '.type', 1)
                         ->where($detailTable . '.del_time', 0)
                         ->where($detailTable . '.top_depart_id', $user['top_depart_id']);
                 });

+ 25 - 11
app/Service/ItemService.php

@@ -2771,7 +2771,7 @@ class ItemService extends Service
         return [true, $customer];
     }
 
-    public function itemMissionProgressListCommon($data,$user, $field = []){
+    public function itemMissionProgressListCommon($data, $user, $field = []){
         $item_id = $data['item_id'] ?? 0;
         $item_node_id = $data['item_node_id'] ?? 0;
         $item_node_mission_id = $data['item_node_mission_id'] ?? 0;
@@ -2779,20 +2779,34 @@ class ItemService extends Service
 
         $model = ItemNodeMission::from('item_node_mission as i');
         $model = $model->TopAndEmployeeClear($user, $data)
-            ->leftJoin('item_node_mission_content as e', 'i.id', '=', 'e.item_node_mission_id')
-            ->where('i.del_time', 0)
+            // 2. 优化重点:把报告可见性逻辑直接作为 JOIN 条件绑定
+            ->leftJoin('item_node_mission_content as e', function($join) use ($user) {
+                $join->on('i.id', '=', 'e.item_node_mission_id')
+                    ->where('e.del_time', 0)
+                    ->where(function($q) use ($user) {
+                        // 或者是当前登录人自己写的报告
+                        $q->where('e.data_id', $user['id'])
+                            // 或者当前登录人是这笔任务的负责人(利用已铺平的负责人表,精准到任务 i.id)
+                            ->orWhereExists(function ($subQuery) use ($user) {
+                                $subQuery->from('item_node_mission_employee')
+                                    ->whereColumn('item_node_mission_employee.item_node_mission_id', 'i.id')
+                                    ->where('item_node_mission_employee.data_id', $user['id'])
+                                    ->where('item_node_mission_employee.del_time', 0);
+                            });
+                    });
+            })
             ->where('e.del_time', 0)
-            ->when(! empty($item_id),function ($query) use($item_id){
-                return $query->where('item_id', $item_id);
+            ->when(! empty($item_id), function ($query) use($item_id){
+                return $query->where('i.item_id', $item_id);
             })
-            ->when(! empty($item_node_id),function ($query) use($item_node_id){
-                return $query->where('item_node_id', $item_node_id);
+            ->when(! empty($item_node_id), function ($query) use($item_node_id){
+                return $query->where('i.item_node_id', $item_node_id);
             })
-            ->when(! empty($item_node_mission_id),function ($query) use($item_node_mission_id){
-                return $query->where('item_node_mission_id', $item_node_mission_id);
+            ->when(! empty($item_node_mission_id), function ($query) use($item_node_mission_id){
+                return $query->where('i.item_node_mission_id', $item_node_mission_id);
             })
-            ->when(! empty($employee_id),function ($query) use($employee_id){
-                return $query->where('data_id', $employee_id);
+            ->when(! empty($employee_id), function ($query) use($employee_id){
+                return $query->where('i.data_id', $employee_id);
             })
             ->select('e.*')
             ->orderby('e.id', 'desc');